"use client" import type { CSSProperties } from "react" import { useMemo } from "react" import { useAudienceMode } from "@/components/audience-mode-provider" import { useRouter } from "next/navigation" import { Award, ChevronDown, CheckCircle2, ExternalLink, Eye, FlaskConical, LibraryBig, MoreHorizontal, ShieldCheck, TriangleAlert, } from "lucide-react" import type { CategoryType } from "@/lib/benchmark-schema" import { getCategoryColor } from "@/lib/benchmark-schema" import type { BenchmarkCard } from "@/lib/benchmark-schema" import { lookupBenchmarkCard } from "@/lib/benchmark-metadata-utils" import { Badge } from "@/components/ui/badge" import { Button } from "@/components/ui/button" import { Card, CardContent, CardHeader, CardTitle } from "@/components/ui/card" import { Collapsible, CollapsibleContent, CollapsibleTrigger } from "@/components/ui/collapsible" import { DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuTrigger } from "@/components/ui/dropdown-menu" export type BenchmarkEvaluationCardData = { id: string route_id: string model_name: string model_id: string canonical_model_name: string developer: string evaluations_count: number benchmarks_count: number variant_count: number categories: CategoryType[] category_stats: Record latest_timestamp: string evaluator_count: number evaluator_names: string[] source_type_count: number source_types: string[] evidence_count: number missing_generation_config_count: number third_party_eval_count: number independent_verification_ratio: number reproducibility_status: "complete" | "partial" | "missing" eval_libraries: Array<{ name: string version?: string fork?: string }> latest_source_name?: string params_billions?: number | null top_scores: Array<{ benchmark: string score: number metric: string unit?: string }> source_urls: string[] detail_urls: string[] model_url?: string release_date?: string input_modalities?: string[] output_modalities?: string[] architecture?: string params?: string inference_engine?: string inference_platform?: string } interface BenchmarkEvaluationCardProps { data: BenchmarkEvaluationCardData benchmarkCards?: Record onDelete?: (id: string) => void delayMs?: number selectedForCompare?: boolean onToggleCompare?: (id: string) => void } function formatDate(isoString: string) { const numeric = Number(isoString) const parsedDate = !Number.isNaN(numeric) && !isoString.includes("-") ? new Date(numeric * 1000) : new Date(isoString) try { return parsedDate.toLocaleDateString("en-US", { year: "numeric", month: "short", day: "numeric", }) } catch { return isoString } } function formatParamsBillions(value: number | null | undefined) { if (value == null || Number.isNaN(value)) return null if (value >= 100) return `${Math.round(value)}B` return `${value.toFixed(1)}B` } function getReportingSummaryLabel(data: BenchmarkEvaluationCardData) { if (data.evaluator_count > 0) { return `${data.evaluator_count} reporting org${data.evaluator_count !== 1 ? "s" : ""}` } if (data.latest_source_name) { return data.latest_source_name } return "Aggregated reporting view" } function getReproducibilitySummary(data: BenchmarkEvaluationCardData) { switch (data.reproducibility_status) { case "complete": return { label: "Full config coverage", tone: "secondary" as const, icon: CheckCircle2, } case "partial": return { label: "Partial config coverage", tone: "outline" as const, icon: FlaskConical, } default: return { label: "Config mostly missing", tone: "destructive" as const, icon: TriangleAlert, } } } function getIndependentSummary(data: BenchmarkEvaluationCardData) { const percent = Math.round(data.independent_verification_ratio * 100) if (data.independent_verification_ratio >= 0.75) { return `${percent}% independent` } if (data.independent_verification_ratio > 0) { return `${percent}% independent` } return "Self-reported only" } const CATEGORY_PLOT_COLORS: Record = { "Core Performance": "#2563eb", "Core Quality Dimensions": "#7c3aed", "Robustness": "#0f766e", "Calibration": "#0891b2", "Adversarial": "#dc2626", "Memorization": "#9333ea", "Fairness": "#ea580c", "Safety": "#16a34a", "Leakage/Contamination": "#be123c", "Privacy": "#0d9488", "Interpretability": "#6366f1", "Efficiency": "#ca8a04", "Retrainability": "#1d4ed8", "Meta-Learning": "#9333ea", } function getCategoryPlotColor(category: string) { return CATEGORY_PLOT_COLORS[category] ?? "#64748b" } function CategoryCoveragePlot({ coverage, }: { coverage: Array<{ category: CategoryType; count: number }> }) { if (coverage.length === 0) { return (
No category coverage recorded.
) } const totalCount = coverage.reduce((sum, item) => sum + item.count, 0) return (
{coverage.map((item) => (
))}
{coverage.slice(0, 4).map((item) => ( {item.category} {item.count} ))}
) } export function BenchmarkEvaluationCard({ data, benchmarkCards, onDelete, delayMs = 0, selectedForCompare = false, onToggleCompare, }: BenchmarkEvaluationCardProps) { const router = useRouter() const { mode } = useAudienceMode() const isResearchView = mode === "research" // Collect unique domains from this model's benchmarks using metadata cards const modelDomains = useMemo(() => { if (!benchmarkCards) return [] const domainCounts = new Map() for (const { benchmark } of data.top_scores) { const card = lookupBenchmarkCard(benchmarkCards, benchmark) for (const domain of card?.benchmark_details?.domains ?? []) { domainCounts.set(domain, (domainCounts.get(domain) ?? 0) + 1) } } return Array.from(domainCounts.entries()) .sort((a, b) => b[1] - a[1] || a[0].localeCompare(b[0])) .map(([domain]) => domain) }, [benchmarkCards, data.top_scores]) const categoryCoverage = useMemo( () => Object.entries(data.category_stats) .filter(([, count]) => count > 0) .sort((a, b) => b[1] - a[1] || a[0].localeCompare(b[0])) .map(([category, count]) => ({ category: category as CategoryType, count, })), [data.category_stats] ) const library = data.eval_libraries[0] const paramsBillions = formatParamsBillions(data.params_billions) const reportingSummaryLabel = getReportingSummaryLabel(data) const reproducibility = getReproducibilitySummary(data) const independentSummary = getIndependentSummary(data) return ( router.push(`/models/${data.route_id}`)} >
Model Summary
{reportingSummaryLabel} / {formatDate(data.latest_timestamp)}
{data.model_name}
{data.developer || "Unknown developer"}
{data.variant_count > 1 && ( {data.variant_count} versions )} {paramsBillions && {paramsBillions} parameters} {reproducibility.label} 0 ? "secondary" : "outline"}> {independentSummary}
{onToggleCompare ? ( ) : null} router.push(`/models/${data.route_id}`)}> View Details {data.source_urls.length > 0 && ( window.open(data.source_urls[0], "_blank")}> View Source )} {onDelete && ( onDelete(data.id)} className="text-destructive"> Remove )}
Category coverage
{categoryCoverage.length} {categoryCoverage.length === 1 ? "category" : "categories"}
{data.evaluator_count}
reporting orgs
{modelDomains.length > 0 && (
Top domain coverage
{modelDomains.slice(0, 5).map((domain) => ( {domain} ))} {modelDomains.length > 5 && ( +{modelDomains.length - 5} more )}
)} event.stopPropagation()} className="border-t border-border/60 px-4 py-4">
{isResearchView ? ( <> {library && ( )} {data.latest_source_name && ( )} {data.source_types.length > 0 && ( s.replace(/_/g, " ")).join(", ")} /> )} {data.architecture && } {data.missing_generation_config_count > 0 && ( )} {library?.fork && (
Non-standard eval library fork
)} ) : ( <> {data.latest_source_name && ( )} {data.source_types.length > 0 && ( s.replace(/_/g, " ")).join(", ")} /> )} {data.missing_generation_config_count > 0 && (
{data.missing_generation_config_count} result{data.missing_generation_config_count !== 1 ? "s" : ""} lack documented generation settings — comparisons should be read with care.
)} )}
) } function KeyValueRow({ label, value }: { label: string; value: string }) { return (
{label} {value}
) }