import { useChatStore } from "@/stores"; import { cn } from "@/lib/utils"; import { IconArrowUp, IconArrowDown, IconBrandSpeedtest, IconRefresh } from "@tabler/icons-react"; import { Tooltip, TooltipContent, TooltipTrigger } from "./ui/tooltip"; export function TokenInfo() { const { lastStatus, tokenUsage, activeTokenUsage } = useChatStore(); const inputTotal = tokenUsage.input_other + tokenUsage.input_cache_read + tokenUsage.input_cache_creation + activeTokenUsage.input_other + activeTokenUsage.input_cache_read + activeTokenUsage.input_cache_creation; const outputTotal = tokenUsage.output + activeTokenUsage.output; const contextPercent = lastStatus?.context_usage ? Math.round(lastStatus.context_usage * 1000) / 10 : 0; return (
Token Usage
Context 80 && "text-amber-500", contextPercent > 95 && "text-destructive")}>{contextPercent}%
Input {inputTotal.toLocaleString()}
Output {outputTotal.toLocaleString()}
); } export function ChatStatus() { const { lastStatus, tokenUsage, activeTokenUsage } = useChatStore(); if (!lastStatus) { return null; } const { context_usage } = lastStatus; const retrying = lastStatus.retrying; const inputTotal = tokenUsage.input_other + tokenUsage.input_cache_read + tokenUsage.input_cache_creation + activeTokenUsage.input_other + activeTokenUsage.input_cache_read + activeTokenUsage.input_cache_creation; const outputTotal = tokenUsage.output + activeTokenUsage.output; const contextPercent = context_usage ? Math.round(context_usage * 1000) / 10 : 0; return (
{retrying && ( Retry {retrying.next_attempt}/{retrying.max_attempts} Retrying in {Math.ceil(retrying.delay_ms / 1000)}s: {retrying.message} )} {retrying &&
}
80 && "text-amber-500", contextPercent > 95 && "text-destructive")}>{contextPercent}% Context Window Usage
{inputTotal.toLocaleString()} Total Input Tokens
{outputTotal.toLocaleString()} Total Output Tokens
); }