diff --git a/ui/package-lock.json b/ui/package-lock.json index 428137d..878cec7 100644 --- a/ui/package-lock.json +++ b/ui/package-lock.json @@ -3975,9 +3975,9 @@ } }, "node_modules/vite": { - "version": "6.3.5", - "resolved": "https://registry.npmjs.org/vite/-/vite-6.3.5.tgz", - "integrity": "sha512-cZn6NDFE7wdTpINgs++ZJ4N49W2vRp8LCKrn3Ob1kYNtOo21vfDoaV5GzBfLU4MovSAB8uNRm4jgzVQZ+mBzPQ==", + "version": "6.4.1", + "resolved": "https://registry.npmjs.org/vite/-/vite-6.4.1.tgz", + "integrity": "sha512-+Oxm7q9hDoLMyJOYfUYBuHQo+dkAloi33apOPP56pzj+vsdJDzr+j1NISE5pyaAuKL4A3UD34qd0lx5+kfKp2g==", "dev": true, "license": "MIT", "dependencies": { diff --git a/ui/src/pages/Models.tsx b/ui/src/pages/Models.tsx index 7a14390..c9793bd 100644 --- a/ui/src/pages/Models.tsx +++ b/ui/src/pages/Models.tsx @@ -191,42 +191,300 @@ function ModelsPanel() { ); } +interface HistogramData { + bins: number[]; + min: number; + max: number; + binSize: number; + p99: number; + p95: number; + p50: number; +} + +function TokenHistogram({ data }: { data: HistogramData }) { + const { bins, min, max, p50, p95, p99 } = data; + const maxCount = Math.max(...bins); + + const height = 120; + const padding = { top: 10, right: 15, bottom: 25, left: 45 }; + + // Use viewBox for responsive sizing + const viewBoxWidth = 600; + const chartWidth = viewBoxWidth - padding.left - padding.right; + const chartHeight = height - padding.top - padding.bottom; + + const barWidth = chartWidth / bins.length; + const range = max - min; + + // Calculate x position for a given value + const getXPosition = (value: number) => { + return padding.left + ((value - min) / range) * chartWidth; + }; + + return ( +
| Requests | -Processed | -Generated | -Tokens/Sec | +
|---|
| + Requests + | ++ Processed + | ++ Generated + | ++ Token Stats (tokens/sec) + | ||
|---|---|---|---|---|---|
| {totalRequests} | -- {new Intl.NumberFormat().format(totalInputTokens)} + + | ||||
| {totalRequests} | + +
+
+ {nf.format(totalInputTokens)}
+ tokens
+
|
- - {new Intl.NumberFormat().format(totalOutputTokens)} + + |
+
+ {nf.format(totalOutputTokens)}
+ tokens
+
+ |
+
+
+
+
+
+ {histogramData &&
+
+
+ P50
+
+ {tokenStats.p50}
+
+
+
+
+ P95
+
+ {tokenStats.p95}
+
+
+
+ P99
+
+ {tokenStats.p99}
+
+ |
- {avgTokensPerSecond} |