"use client"; import { useState, useEffect } from "react"; import Card from "./Card"; import Badge from "./Badge"; import { CardSkeleton } from "./Loading"; function MiniBarGraph({ data, colorClass = "bg-primary" }) { const max = Math.max(...data, 1); return (
{data.slice(-9).map((val, i) => (
))}
); } export default function UsageStats() { const [stats, setStats] = useState(null); const [loading, setLoading] = useState(true); const [autoRefresh, setAutoRefresh] = useState(false); useEffect(() => { fetchStats(); }, []); useEffect(() => { let interval; if (autoRefresh) { interval = setInterval(() => { fetchStats(false); // fetch without loading skeleton }, 5000); } return () => clearInterval(interval); }, [autoRefresh]); const fetchStats = async (showLoading = true) => { if (showLoading) setLoading(true); try { const res = await fetch("/api/usage/history"); if (res.ok) { const data = await res.json(); setStats(data); } } catch (error) { console.error("Failed to fetch usage stats:", error); } finally { if (showLoading) setLoading(false); } }; if (loading) return ; if (!stats) return
Failed to load usage statistics.
; // Format number with commas const fmt = (n) => new Intl.NumberFormat().format(n || 0); return (
{/* Header with Auto Refresh Toggle */}

Usage Overview

{/* Overview Cards */}
Total Requests {fmt(stats.totalRequests)}
m.requests)} colorClass="bg-text-muted/30" />
Total Input Tokens {fmt(stats.totalPromptTokens)}
m.promptTokens)} colorClass="bg-primary/50" />
Total Output Tokens {fmt(stats.totalCompletionTokens)}
m.completionTokens)} colorClass="bg-success/50" />
{/* Usage by Model Table */}

Usage by Model

{Object.entries(stats.byModel || {}).map(([key, data]) => ( ))} {Object.keys(stats.byModel || {}).length === 0 && ( )}
Model Provider Requests Input Tokens Output Tokens Total Tokens
{data.rawModel} {data.provider} {fmt(data.requests)} {fmt(data.promptTokens)} {fmt(data.completionTokens)} {fmt(data.promptTokens + data.completionTokens)}
No usage recorded yet. Make some requests to see data here.
{/* Usage by Account Table */}

Usage by Account

{Object.entries(stats.byAccount || {}).map(([key, data]) => ( ))} {Object.keys(stats.byAccount || {}).length === 0 && ( )}
Model Provider Account Requests Input Tokens Output Tokens Total Tokens
{data.rawModel} {data.provider} {data.accountName || `Account ${data.connectionId?.slice(0, 8)}...`} {fmt(data.requests)} {fmt(data.promptTokens)} {fmt(data.completionTokens)} {fmt(data.promptTokens + data.completionTokens)}
No account-specific usage recorded yet. Make requests using OAuth accounts to see data here.
); }