feat: add usage stats parsing and fetching from /api/metrics/stats

This commit is contained in:
c4ch3c4d3
2026-08-14 12:47:53 -06:00
parent 93d1006356
commit aac7416cd6
2 changed files with 85 additions and 0 deletions
+33
View File
@@ -0,0 +1,33 @@
import { type LlamaSwapConfig } from "./util";
export interface UsageStats {
totalRequests: number;
totalInputTokens: number;
totalOutputTokens: number;
genP95: number;
}
export function parseStats(json: unknown): UsageStats | null {
if (!json || typeof json !== "object") return null;
const obj = json as Record<string, unknown>;
const genHist = (obj.gen_histogram ?? {}) as Record<string, unknown>;
const num = (v: unknown): number => (typeof v === "number" && Number.isFinite(v) ? v : 0);
return {
totalRequests: num(obj.total_requests),
totalInputTokens: num(obj.total_input_tokens),
totalOutputTokens: num(obj.total_output_tokens),
genP95: num(genHist.p95),
};
}
export async function fetchStats(cfg: LlamaSwapConfig, modelId: string): Promise<UsageStats | null> {
const query = modelId === "all" ? "" : `?model=${encodeURIComponent(modelId)}`;
const headers: Record<string, string> = {};
if (cfg.apiKey) headers["Authorization"] = `Bearer ${cfg.apiKey}`;
const res = await fetch(`${cfg.baseUrl}/api/metrics/stats${query}`, {
headers,
signal: AbortSignal.timeout(5000),
});
if (!res.ok) return null;
return parseStats(await res.json());
}