import { CacheMetrics } from "@open-swe/shared/open-swe/types"; import { calculateCostSavings } from "@open-swe/shared/caching"; import { Badge } from "../ui/badge"; import { Separator } from "../ui/separator"; import { HoverCard, HoverCardContent, HoverCardTrigger, } from "../ui/hover-card"; import { ChartNoAxesColumnIncreasing, Coins, TrendingUp, Zap, } from "lucide-react"; interface TokenUsageProps { tokenData?: CacheMetrics[]; } function mergeTokenData(tokenDataArray: CacheMetrics[]): CacheMetrics { return tokenDataArray.reduce( (merged, current) => ({ cacheCreationInputTokens: merged.cacheCreationInputTokens + current.cacheCreationInputTokens, cacheReadInputTokens: merged.cacheReadInputTokens + current.cacheReadInputTokens, inputTokens: merged.inputTokens + current.inputTokens, outputTokens: merged.outputTokens + current.outputTokens, }), { cacheCreationInputTokens: 0, cacheReadInputTokens: 0, inputTokens: 0, outputTokens: 0, }, ); } export function TokenUsage({ tokenData }: TokenUsageProps) { if (!tokenData || tokenData.length === 0) return null; const mergedTokenData = mergeTokenData(tokenData); const totalCachedInputTokens = mergedTokenData.cacheCreationInputTokens + mergedTokenData.cacheReadInputTokens; const totalUncachedInputTokens = mergedTokenData.inputTokens; const cachePercentage = ( (totalCachedInputTokens / (totalCachedInputTokens + totalUncachedInputTokens)) * 100 ).toFixed(2); const metrics = calculateCostSavings(mergedTokenData); return (

Token Usage

Input

{metrics.totalInputTokens.toLocaleString()}

Output

{metrics.totalOutputTokens.toLocaleString()}

Total Tokens {metrics.totalTokens.toLocaleString()}
Cost
${metrics.totalCost.toFixed(2)}
{metrics.totalSavings > 0 && ( <>
Cache Percentage {cachePercentage}%
Cache Savings -${metrics.totalSavings.toFixed(2)}
)}
); }