import { useEffect, useState } from 'react'; import { useAgentStore } from '../../store/agentStore'; import { useConnectionStore } from '../../store/connectionStore'; import { BarChart3, TrendingUp, Clock, Zap } from 'lucide-react'; export function UsageStats() { const usageStats = useAgentStore((s) => s.usageStats); const loadUsageStats = useAgentStore((s) => s.loadUsageStats); const connectionState = useConnectionStore((s) => s.connectionState); const [timeRange, setTimeRange] = useState<'7d' | '30d' | 'all'>('7d'); useEffect(() => { if (connectionState === 'connected') { loadUsageStats(); } }, [connectionState]); const stats = usageStats || { totalSessions: 0, totalMessages: 0, totalTokens: 0, byModel: {} }; const models = Object.entries(stats.byModel || {}); const formatTokens = (n: number) => { if (n >= 1_000_000) return `~${(n / 1_000_000).toFixed(1)} M`; if (n >= 1_000) return `~${(n / 1_000).toFixed(1)} k`; return `${n}`; }; // 计算总输入和输出 Token const totalInputTokens = models.reduce((sum, [_, data]) => sum + data.inputTokens, 0); const totalOutputTokens = models.reduce((sum, [_, data]) => sum + data.outputTokens, 0); return (

用量统计

{(['7d', '30d', 'all'] as const).map((range) => ( ))}
本设备所有已保存对话的 Token 用量汇总。
{/* 主要统计卡片 */}
{/* 总 Token 使用量概览 */}

Token 使用概览

输入 输出
{formatTokens(stats.totalTokens)}
总计
{/* 按模型分组 */}

按模型

{models.length === 0 ? (

暂无使用数据

开始对话后将自动记录用量统计

) : ( models.map(([model, data]) => { const total = data.inputTokens + data.outputTokens; const inputPct = (data.inputTokens / Math.max(total, 1)) * 100; const outputPct = (data.outputTokens / Math.max(total, 1)) * 100; return (
{model} {data.messages} 条消息
输入: {formatTokens(data.inputTokens)} 输出: {formatTokens(data.outputTokens)} 总计: {formatTokens(total)}
); }) )}
); } function StatCard({ icon: Icon, label, value, color, }: { icon: typeof BarChart3; label: string; value: string | number; color: string; }) { return (
{label}
{value}
); }