1
0
mirror of https://github.com/coalaura/whiskr.git synced 2025-09-08 17:06:42 +00:00
Files
whiskr/stats.go
2025-08-11 15:43:00 +02:00

68 lines
1.5 KiB
Go

package main
import (
"net/http"
"strings"
"github.com/go-chi/chi/v5"
)
type Statistics struct {
Provider *string `json:"provider,omitempty"`
Model string `json:"model"`
Cost float64 `json:"cost"`
TTFT int `json:"ttft"`
Time int `json:"time"`
InputTokens int `json:"input"`
OutputTokens int `json:"output"`
}
func HandleStats(w http.ResponseWriter, r *http.Request) {
id := chi.URLParam(r, "id")
if id == "" || !strings.HasPrefix(id, "gen-") {
RespondJson(w, http.StatusBadRequest, map[string]any{
"error": "invalid id",
})
return
}
generation, err := OpenRouterGetGeneration(r.Context(), id)
if err != nil {
RespondJson(w, http.StatusInternalServerError, map[string]any{
"error": err.Error(),
})
return
}
statistics := Statistics{
Provider: generation.ProviderName,
Model: generation.Model,
Cost: generation.TotalCost,
TTFT: Nullable(generation.Latency, 0),
Time: Nullable(generation.GenerationTime, 0),
}
nativeIn := Nullable(generation.NativeTokensPrompt, 0)
normalIn := Nullable(generation.TokensPrompt, 0)
statistics.InputTokens = max(nativeIn, normalIn)
nativeOut := Nullable(generation.NativeTokensCompletion, 0) + Nullable(generation.NativeTokensReasoning, 0)
normalOut := Nullable(generation.TokensCompletion, 0)
statistics.OutputTokens = max(nativeOut, normalOut)
RespondJson(w, http.StatusOK, statistics)
}
func Nullable[T any](ptr *T, def T) T {
if ptr == nil {
return def
}
return *ptr
}