mirror of
https://github.com/coalaura/whiskr.git
synced 2025-09-08 17:06:42 +00:00
68 lines
1.5 KiB
Go
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
|
|
}
|