import * as React from "react"; import { Table, TableHeader, TableBody, TableRow, TableHead, TableCell, } from "@/components/ui/table"; import { MultiSelect } from "@/components/ui/multi-select"; import { Switch } from "@/components/ui/switch"; import { Provider, FlattenedModel } from "@/App"; interface BenchmarkTableProps { data: FlattenedModel[]; comparisonMetrics?: string[]; requestSort: (key: string) => void; sortConfig: { key: string; direction: "ascending" | "descending"; } | null; allProviders: Provider[]; selectedProviders: string[]; selectedModels: string[]; onProviderChange: (values: string[]) => void; onModelChange: (values: string[]) => void; linkProviderModel: boolean; onLinkToggle: (checked: boolean) => void; } export const BenchmarkTable: React.FC = ({ data, comparisonMetrics, requestSort, sortConfig, allProviders, selectedProviders, selectedModels, onProviderChange, onModelChange, linkProviderModel, onLinkToggle, }) => { const benchmarkMetrics = React.useMemo(() => { if (!comparisonMetrics || comparisonMetrics.length === 0) return []; return comparisonMetrics; }, [comparisonMetrics]); const getCellStyle = (value?: number) => { if (value === undefined) return ""; if (value >= 85) return "bg-green-100"; if (value >= 60) return "bg-yellow-100"; return "bg-red-100"; }; const renderSortIndicator = (key: string) => { if (sortConfig?.key !== key) return null; return sortConfig.direction === "ascending" ? " ▲" : " ▼"; }; const modelOptions = React.useMemo(() => { const flat = allProviders.flatMap((provider) => provider.models.map((model) => ({ label: model.name, value: model.name, provider: provider.provider, })) ); const filtered = linkProviderModel ? flat.filter((m) => selectedProviders.includes(m.provider)) : flat; return Array.from(new Map(filtered.map((m) => [m.value, m])).values()); }, [allProviders, selectedProviders, linkProviderModel]); return ( <>
({ label: p.provider, value: p.provider }))} defaultValue={selectedProviders} onValueChange={onProviderChange} />
({ label, value }))} defaultValue={selectedModels} onValueChange={onModelChange} />
{benchmarkMetrics.map((metric) => ( ))} {data.map((model) => ( {model.provider} {model.name} ${model.inputPrice.toFixed(2)} ${model.outputPrice.toFixed(2)} {benchmarkMetrics.map((metric) => { const score = model.benchmark?.[metric]; return ( {score !== undefined ? `${score.toFixed(1)}%` : "-"} ); })} ))}
); };