"use client" import { useAudienceMode } from "@/components/audience-mode-provider" import { Fragment, useMemo, useState } from "react" import { Badge } from "@/components/ui/badge" import { Button } from "@/components/ui/button" import { Card, CardContent, CardDescription, CardHeader, CardTitle } from "@/components/ui/card" import { Progress } from "@/components/ui/progress" import { Table, TableBody, TableCell, TableHead, TableHeader, TableRow } from "@/components/ui/table" import { cn } from "@/lib/utils" import { BarChart3, ChevronDown, ChevronUp, Database, ExternalLink, Globe, Medal, } from "lucide-react" import type { BenchmarkEvalSummary, ModelResultForBenchmark } from "@/lib/eval-processing" interface EvalDetailProps { summary: BenchmarkEvalSummary } interface LeaderboardRow { key: string rank: number modelResult: ModelResultForBenchmark normalizedScore: number } function formatMetadataValue(value: unknown): string { if (value == null) { return "N/A" } if (typeof value === "string") { return value } if (typeof value === "number") { return Number.isFinite(value) ? value.toLocaleString() : String(value) } if (typeof value === "boolean") { return value ? "true" : "false" } if (Array.isArray(value)) { return value.map((item) => formatMetadataValue(item)).join(", ") } try { return JSON.stringify(value) } catch { return String(value) } } function formatDate(ts: string) { const numeric = Number(ts) const parsedDate = !Number.isNaN(numeric) && !ts.includes("-") ? new Date(numeric * 1000) : new Date(ts) try { return parsedDate.toLocaleDateString("en-US", { year: "numeric", month: "short", day: "numeric", }) } catch { return ts } } function formatRawScore(score: number, unit?: string) { const suffix = unit ? ` ${unit}` : "" return `${score.toFixed(2)}${suffix}` } function getRankBadgeClass(rank: number) { if (rank === 1) { return "border-amber-300 bg-amber-100 text-amber-800" } if (rank === 2) { return "border-slate-300 bg-slate-100 text-slate-700" } if (rank === 3) { return "border-orange-300 bg-orange-100 text-orange-800" } return "border-border bg-background text-foreground" } export function EvalDetail({ summary }: EvalDetailProps) { const { mode } = useAudienceMode() const isResearchView = mode === "research" const [expandedRows, setExpandedRows] = useState>({}) const maxScore = summary.metric_config.max_score ?? 1 const minScore = summary.metric_config.min_score ?? 0 const range = maxScore - minScore const normalizeScore = (raw: number) => (range > 0 ? (raw - minScore) / range : raw) const formatPercent = (normalized: number) => `${(normalized * 100).toFixed(1)}%` const sortedResults = useMemo( () => [...summary.model_results].sort((a, b) => summary.metric_config.lower_is_better ? a.score - b.score : b.score - a.score ), [summary.model_results, summary.metric_config.lower_is_better] ) const leaderboardRows = useMemo(() => { let currentRank = 0 let previousScore: number | null = null return sortedResults.map((modelResult, index) => { if (previousScore === null || Math.abs(modelResult.score - previousScore) > 1e-9) { currentRank = index + 1 previousScore = modelResult.score } return { key: `${modelResult.model_info.id}-${index}`, rank: currentRank, modelResult, normalizedScore: normalizeScore(modelResult.score), } }) }, [sortedResults]) const avgNorm = formatPercent(summary.avg_score_norm) const scoreDirectionLabel = summary.metric_config.lower_is_better ? "Lower scores rank higher" : "Higher scores rank higher" const leaderboardTitle = isResearchView ? "Leaderboard" : "Reporting Comparison" const leaderboardDescription = isResearchView ? "Models ranked by normalized score for this evaluation." : "Model results with stronger emphasis on reporting context and evaluator provenance." const toggleRow = (key: string) => setExpandedRows((current) => ({ ...current, [key]: !current[key], })) return (
Eval Metadata {summary.metric_config.score_type} {summary.metric_config.lower_is_better ? "Lower is better" : "Higher is better"} {(summary.factsheet?.input_modality ?? "text")}/{(summary.factsheet?.output_modality ?? "text")}
{summary.evaluation_name}

{summary.metric_config.evaluation_description}

{!isResearchView && (

{`${summary.factsheet?.purpose ?? "This benchmark provides a public-facing capability signal."} Scores should be read alongside reporting context and evaluator independence.`}

)}
Models
{summary.models_count}
{isResearchView ? "Avg norm" : "Reporting orgs"}
{isResearchView ? avgNorm : summary.evaluator_names.length}
{isResearchView ? "Top model" : "Score rule"}
{isResearchView && summary.best_model ? summary.best_model.name : scoreDirectionLabel}
{isResearchView && summary.best_model && (
{formatPercent(normalizeScore(summary.best_model.score))}
)}
{isResearchView ? "Bottom model" : "Purpose"}
{isResearchView && summary.worst_model ? summary.worst_model.name : summary.factsheet?.purpose ?? "General evaluation reporting"}
{isResearchView && summary.worst_model && (
{formatPercent(normalizeScore(summary.worst_model.score))}
)}
{isResearchView ? "Metric specification" : "Reading context"}
{isResearchView ? "Benchmark ID" : "What this covers"}
{isResearchView ? summary.evaluation_id : summary.metric_config.evaluation_description}
{isResearchView ? "Score scale" : "How to read scores"}
{isResearchView ? `${summary.metric_config.min_score ?? 0} - ${summary.metric_config.max_score ?? 1}` : scoreDirectionLabel}
Modalities
{(summary.factsheet?.input_modality ?? "text")}/{(summary.factsheet?.output_modality ?? "text")}
{summary.factsheet?.design ? "Documentation" : isResearchView ? "Reporting orgs" : "Evidence sources"}
{summary.factsheet?.design ? ( {summary.factsheet.design.replace(/^https?:\/\//, "")} ) : ( `${summary.evaluator_names.length} reporting org${summary.evaluator_names.length === 1 ? "" : "s"}` )}
{leaderboardTitle}
{leaderboardDescription}
{summary.models_count} models {scoreDirectionLabel} {isResearchView && ( Scale {summary.metric_config.min_score ?? 0} - {summary.metric_config.max_score ?? 1} )}
Rank Model {isResearchView ? "Developer" : "Provider"} Score {isResearchView ? ( Performance ) : ( Source type )} {isResearchView ? "Evaluator" : "Reporting Org"} Updated Details {leaderboardRows.map(({ key, rank, modelResult, normalizedScore }) => { const isExpanded = expandedRows[key] ?? false const subtasks = modelResult.score_details.details ? Object.entries(modelResult.score_details.details).filter(([, value]) => typeof value === "number") : [] const datasetName = Array.isArray(modelResult.source_data) ? undefined : modelResult.source_data.dataset_name const samples = Array.isArray(modelResult.source_data) ? undefined : modelResult.source_data.samples_number return (
{rank}
{modelResult.model_info.name}
{modelResult.model_info.parameter_count && ( {modelResult.model_info.parameter_count} )} {modelResult.model_info.architecture && ( {modelResult.model_info.architecture} )} {modelResult.model_info.developer ?? "Unknown developer"}
{modelResult.model_info.developer ?? "Unknown developer"}
{formatPercent(normalizedScore)}
Raw {formatRawScore(modelResult.score, summary.metric_config.unit)}
{isResearchView ? (
{formatPercent(normalizedScore)}
) : (
{modelResult.source_metadata.evaluator_relationship.replace(/_/g, " ")}
)}
{modelResult.source_metadata.source_organization_name}
{modelResult.source_metadata.evaluator_relationship.replace(/_/g, " ")}
{formatDate(modelResult.evaluation_timestamp)}
{isExpanded && (
{isResearchView && } {modelResult.source_metadata.source_url && ( View source } /> )} {modelResult.score_details.confidence_interval && ( )}
{subtasks.length > 0 && (
Subtask Distribution
Detailed sub-metric scores for this model run.
{subtasks.map(([subtaskName, value]) => { const numericValue = value as number const normalizedSubtaskScore = range > 0 ? (numericValue - minScore) / range : numericValue return (
{subtaskName.replace(/_/g, " ")}
{formatRawScore(numericValue, summary.metric_config.unit)}
{formatPercent(normalizedSubtaskScore)}
) })}
)} {modelResult.result.generation_config && (
Generation Config
Evaluation-time generation parameters.
{modelResult.result.generation_config.generation_args && Object.entries(modelResult.result.generation_config.generation_args).map(([key, value]) => (
{key.replace(/_/g, " ")}
{formatMetadataValue(value)}
))} {modelResult.result.generation_config.additional_details && (
Additional Details
{formatMetadataValue(modelResult.result.generation_config.additional_details)}
)} {modelResult.result.generation_config.prompt_template && (
Prompt Template
{formatMetadataValue(modelResult.result.generation_config.prompt_template)}
)}
)}
)}
) })}
) } function DetailPanel({ title, subtitle, children, }: { title: string subtitle: string children: React.ReactNode }) { return (
{title}
{subtitle}
{children}
) } function MetaRow({ label, value, }: { label: string value: React.ReactNode }) { return (
{label} {value}
) }