import { useEffect, useState } from "react"; import type { OverviewData, PanelNav } from "../types"; interface OverviewLevelProps { datasetId: string; fetchOverview: (dsId: string) => Promise; onDrillDown: (nav: PanelNav) => void; } export default function OverviewLevel({ datasetId, fetchOverview, onDrillDown }: OverviewLevelProps) { const [data, setData] = useState(null); useEffect(() => { fetchOverview(datasetId).then(setData).catch(() => {}); }, [datasetId, fetchOverview]); if (!data) return
Loading overview...
; const correctCount = data.examples.filter((ex) => ex.eval_correct === true).length; const incorrectCount = data.examples.filter((ex) => ex.eval_correct === false).length; const unknownCount = data.examples.filter((ex) => ex.eval_correct === null || ex.eval_correct === undefined).length; return (
{/* Experiment metadata */}
Model: {data.metadata.model} Method: {data.metadata.method} Run: {data.metadata.run_id}
{/* Summary stats */}
{data.examples.length} examples {correctCount > 0 && ( {correctCount} correct )} {incorrectCount > 0 && ( {incorrectCount} incorrect )} {unknownCount > 0 && ( {unknownCount} unknown )}
{/* Example cards */}
{data.examples.map((ex) => (
onDrillDown({ datasetId, level: 2, exampleIdx: ex.example_idx, }) } >
Ex {ex.example_idx} {ex.n_iterations} iter{ex.n_iterations !== 1 ? "s" : ""} {ex.eval_correct === true && ( )} {ex.eval_correct === false && ( )}
{ex.total_execution_time.toFixed(1)}s
{/* Question preview */}
{ex.question_text || "(no question text)"}
{((ex.total_input_tokens + ex.total_output_tokens) / 1000).toFixed(1)}k tokens
{ex.final_answer_preview && (
Answer: {ex.final_answer_preview}
)}
))}
); }