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
);
}