import type { CostDashboardModelStats } from '../../hooks/useCostDashboard'; import { useT } from '../../lib/i18n/I18nContext'; import { formatCurrency, formatTokens } from './formatCurrency'; export interface ModelCostTableProps { models: CostDashboardModelStats[]; currency: string; } const PROVIDER_PALETTE: Record = { anthropic: 'bg-[#D97757]/15 text-[#D97757] dark:bg-[#D97757]/20 dark:text-[#F5A584] ring-[#D97757]/30', openai: 'bg-sage-500/15 text-sage-700 dark:bg-sage-500/20 dark:text-sage-300 ring-sage-500/30', google: 'bg-ocean-500/15 text-ocean-700 dark:bg-ocean-500/20 dark:text-ocean-300 ring-ocean-500/30', fireworks: 'bg-coral-500/15 text-coral-700 dark:bg-coral-500/20 dark:text-coral-300 ring-coral-500/30', groq: 'bg-amber-500/15 text-amber-700 dark:bg-amber-500/20 dark:text-amber-300 ring-amber-500/30', }; const PROVIDER_FALLBACK = 'bg-stone-200 text-stone-700 dark:bg-neutral-800 dark:text-neutral-300 ring-stone-300 dark:ring-neutral-700'; function providerChipClass(provider: string | null): string { if (!provider) return PROVIDER_FALLBACK; return PROVIDER_PALETTE[provider.toLowerCase()] ?? PROVIDER_FALLBACK; } const ModelCostTable = ({ models, currency }: ModelCostTableProps) => { const { t } = useT(); if (models.length === 0) { return (
{t('settings.costDashboard.noModels')}
); } return (
{models.map(row => { const modelName = row.model.includes('/') ? row.model.split('/').slice(1).join('/') : row.model; const sharePct = Math.max(0, Math.min(100, row.percent_of_total)); return ( ); })}
{t('settings.costDashboard.model')} {t('settings.costDashboard.provider')} {t('settings.costDashboard.tokens')} {t('settings.costDashboard.requests')} {t('settings.costDashboard.cost')} {t('settings.costDashboard.percentOfTotal')}
{modelName}
{row.provider ?? t('settings.costDashboard.unknownProvider')} {formatTokens(row.total_tokens)} {row.request_count} {formatCurrency(row.cost_usd, currency)}
{`${sharePct.toFixed(1)}%`}
); }; interface CellProps { children: React.ReactNode; align?: 'left' | 'right'; } const Th = ({ children, align = 'left' }: CellProps) => ( {children} ); const Td = ({ children, align = 'left' }: CellProps) => ( {children} ); export default ModelCostTable;