import type { Message } from "@langchain/langgraph-sdk"; import { CoinsIcon } from "lucide-react"; import { Badge } from "@/components/ui/badge"; import { useI18n } from "@/core/i18n/hooks"; import { accumulateUsage, formatTokenCount } from "@/core/messages/usage"; import type { TokenDebugStep } from "@/core/messages/usage-model"; import { cn } from "@/lib/utils"; function TokenUsageSummary({ className, inputTokens, outputTokens, totalTokens, }: { className?: string; inputTokens?: number; outputTokens?: number; totalTokens?: number; }) { const { t } = useI18n(); return (
{t.tokenUsage.label} {t.tokenUsage.input}: {formatTokenCount(inputTokens ?? 0)} {t.tokenUsage.output}: {formatTokenCount(outputTokens ?? 0)} {t.tokenUsage.total}: {formatTokenCount(totalTokens ?? 0)}
); } export function MessageTokenUsageList({ className, enabled = false, isLoading: _isLoading = false, messages, }: { className?: string; enabled?: boolean; isLoading?: boolean; messages: Message[]; }) { if (!enabled) { return null; } const aiMessages = messages.filter((message) => message.type === "ai"); if (aiMessages.length === 0) { return null; } const usage = accumulateUsage(aiMessages); if (!usage) { return null; } return ( ); } export function MessageTokenUsageDebugList({ className, enabled = false, isLoading = false, steps, }: { className?: string; enabled?: boolean; isLoading?: boolean; steps: TokenDebugStep[]; }) { const { t } = useI18n(); if (!enabled || isLoading) { return null; } if (steps.length === 0) { return null; } return (
{steps.map((step) => (
{step.label}
{step.secondaryLabels.length > 0 && (
{step.secondaryLabels.map((label, index) => ( {label} ))}
)} {step.sharedAttribution && (
{t.tokenUsage.sharedAttribution}
)}
{step.usage ? ( <> {t.tokenUsage.input}:{" "} {formatTokenCount(step.usage.inputTokens)} {" ยท "} {t.tokenUsage.output}:{" "} {formatTokenCount(step.usage.outputTokens)} ) : ( t.tokenUsage.unavailableShort )}
{step.usage ? `${formatTokenCount(step.usage.totalTokens)} ${t.tokenUsage.label}` : t.tokenUsage.unavailableShort}
))}
); }