diff --git a/src/shared/components/UsageStats.js b/src/shared/components/UsageStats.js index 25c4dfa..4a692d1 100644 --- a/src/shared/components/UsageStats.js +++ b/src/shared/components/UsageStats.js @@ -54,7 +54,7 @@ export default function UsageStats() { .map(([key, data]) => ({ ...data, key, - totalTokens: (data.promptTokens || 0) + (data.completionTokens || 0) + totalTokens: (data.promptTokens || 0) + (data.completionTokens || 0), })) .sort((a, b) => { let valA = a[sortBy]; @@ -70,8 +70,14 @@ export default function UsageStats() { }); }; - const sortedModels = useMemo(() => sortData(stats?.byModel), [stats?.byModel, sortBy, sortOrder]); - const sortedAccounts = useMemo(() => sortData(stats?.byAccount), [stats?.byAccount, sortBy, sortOrder]); + const sortedModels = useMemo( + () => sortData(stats?.byModel), + [stats?.byModel, sortBy, sortOrder] + ); + const sortedAccounts = useMemo( + () => sortData(stats?.byAccount), + [stats?.byAccount, sortBy, sortOrder] + ); useEffect(() => { fetchStats(); @@ -82,7 +88,7 @@ export default function UsageStats() { if (autoRefresh) { interval = setInterval(() => { fetchStats(false); // fetch without loading skeleton - }, 5000); + }, 1000); } return () => clearInterval(interval); }, [autoRefresh]); @@ -104,7 +110,10 @@ export default function UsageStats() { if (loading) return ; - if (!stats) return
Failed to load usage statistics.
; + if (!stats) + return ( +
Failed to load usage statistics.
+ ); // Format number with commas const fmt = (n) => new Intl.NumberFormat().format(n || 0); @@ -116,13 +125,17 @@ export default function UsageStats() {

Usage Overview

@@ -134,11 +147,15 @@ export default function UsageStats() {
- Total Requests - {fmt(stats.totalRequests)} + + Total Requests + + + {fmt(stats.totalRequests)} +
m.requests)} + data={(stats.last10Minutes || []).map((m) => m.requests)} colorClass="bg-text-muted/30" />
@@ -146,11 +163,15 @@ export default function UsageStats() {
- Total Input Tokens - {fmt(stats.totalPromptTokens)} + + Total Input Tokens + + + {fmt(stats.totalPromptTokens)} +
m.promptTokens)} + data={(stats.last10Minutes || []).map((m) => m.promptTokens)} colorClass="bg-primary/50" />
@@ -158,11 +179,15 @@ export default function UsageStats() {
- Total Output Tokens - {fmt(stats.totalCompletionTokens)} + + Total Output Tokens + + + {fmt(stats.totalCompletionTokens)} +
m.completionTokens)} + data={(stats.last10Minutes || []).map((m) => m.completionTokens)} colorClass="bg-success/50" />
@@ -178,23 +203,71 @@ export default function UsageStats() { - - - - - - @@ -203,17 +276,28 @@ export default function UsageStats() { - - - + + + ))} {sortedModels.length === 0 && ( - @@ -232,26 +316,82 @@ export default function UsageStats() {
toggleSort("rawModel")}> - Model + toggleSort("rawModel")} + > + Model{" "} + toggleSort("provider")}> - Provider + toggleSort("provider")} + > + Provider{" "} + toggleSort("requests")}> - Requests + toggleSort("requests")} + > + Requests{" "} + toggleSort("promptTokens")}> - Input Tokens + toggleSort("promptTokens")} + > + Input Tokens{" "} + toggleSort("completionTokens")}> - Output Tokens + toggleSort("completionTokens")} + > + Output Tokens{" "} + toggleSort("totalTokens")}> - Total Tokens + toggleSort("totalTokens")} + > + Total Tokens{" "} +
{data.rawModel} - {data.provider} + + {data.provider} + {fmt(data.requests)}{fmt(data.promptTokens)}{fmt(data.completionTokens)}{fmt(data.totalTokens)} + {fmt(data.promptTokens)} + + {fmt(data.completionTokens)} + + {fmt(data.totalTokens)} +
+ No usage recorded yet. Make some requests to see data here.
- - - - - - - @@ -260,21 +400,36 @@ export default function UsageStats() { - - - + + + ))} {sortedAccounts.length === 0 && ( - )}
toggleSort("rawModel")}> - Model + toggleSort("rawModel")} + > + Model{" "} + toggleSort("provider")}> - Provider + toggleSort("provider")} + > + Provider{" "} + toggleSort("accountName")}> - Account + toggleSort("accountName")} + > + Account{" "} + toggleSort("requests")}> - Requests + toggleSort("requests")} + > + Requests{" "} + toggleSort("promptTokens")}> - Input Tokens + toggleSort("promptTokens")} + > + Input Tokens{" "} + toggleSort("completionTokens")}> - Output Tokens + toggleSort("completionTokens")} + > + Output Tokens{" "} + toggleSort("totalTokens")}> - Total Tokens + toggleSort("totalTokens")} + > + Total Tokens{" "} +
{data.rawModel} - {data.provider} + + {data.provider} + - {data.accountName || `Account ${data.connectionId?.slice(0, 8)}...`} + + {data.accountName || + `Account ${data.connectionId?.slice(0, 8)}...`} + {fmt(data.requests)}{fmt(data.promptTokens)}{fmt(data.completionTokens)}{fmt(data.totalTokens)} + {fmt(data.promptTokens)} + + {fmt(data.completionTokens)} + + {fmt(data.totalTokens)} +
- No account-specific usage recorded yet. Make requests using OAuth accounts to see data here. + + No account-specific usage recorded yet. Make requests using + OAuth accounts to see data here.