import { memo } from 'react'; import { TooltipAnchor } from '@librechat/client'; import { useTokenUsage } from '~/hooks'; import { cn } from '~/utils'; function formatTokens(n: number): string { if (n >= 1000000) { return `${(n / 1000000).toFixed(1)}M`; } if (n >= 1000) { return `${(n / 1000).toFixed(1)}K`; } return n.toString(); } const TokenUsageIndicator = memo(function TokenUsageIndicator() { const { inputTokens, outputTokens, maxContext } = useTokenUsage(); const totalUsed = inputTokens + outputTokens; const hasMaxContext = maxContext !== null && maxContext > 0; const percentage = hasMaxContext ? Math.min((totalUsed / maxContext) * 100, 100) : 0; // Ring calculations const size = 28; const strokeWidth = 2.5; const radius = (size - strokeWidth) / 2; const circumference = 2 * Math.PI * radius; const offset = circumference - (percentage / 100) * circumference; const tooltipText = hasMaxContext ? `Input: ${formatTokens(inputTokens)} | Output: ${formatTokens(outputTokens)} | Max: ${formatTokens(maxContext)}` : `Input: ${formatTokens(inputTokens)} | Output: ${formatTokens(outputTokens)} | Max: N/A`; // Color based on percentage const getProgressColor = () => { if (!hasMaxContext) { return 'stroke-text-secondary'; } if (percentage > 90) { return 'stroke-red-500'; } if (percentage > 75) { return 'stroke-yellow-500'; } return 'stroke-green-500'; }; return ( {/* Background ring */} {/* Progress ring */} } /> ); }); export default TokenUsageIndicator;