import { useEffect, useState } from "react"; import type { ExampleDetailData, RlmIterDetail } from "../types"; import IterationDetail from "./IterationDetail"; interface ExampleDetailLevelProps { datasetId: string; exampleIdx: number; fetchExampleDetail: (dsId: string, exampleIdx: number) => Promise; fetchIterDetail: (dsId: string, exampleIdx: number, rlmIter: number) => Promise; } export default function ExampleDetailLevel({ datasetId, exampleIdx, fetchExampleDetail, fetchIterDetail, }: ExampleDetailLevelProps) { const [data, setData] = useState(null); const [expandedIter, setExpandedIter] = useState(null); const [iterDetail, setIterDetail] = useState(null); useEffect(() => { fetchExampleDetail(datasetId, exampleIdx).then(setData).catch(() => {}); }, [datasetId, exampleIdx, fetchExampleDetail]); useEffect(() => { if (expandedIter === null) { setIterDetail(null); return; } fetchIterDetail(datasetId, exampleIdx, expandedIter) .then(setIterDetail) .catch(() => {}); }, [datasetId, exampleIdx, expandedIter, fetchIterDetail]); if (!data) return
Loading example detail...
; return (
{/* Question text */}
Question
{data.eval_correct === true && ( ✓ Correct )} {data.eval_correct === false && ( ✗ Incorrect )}
{data.question_text}
{/* Stats row */}
Total tokens:{" "} {((data.total_input_tokens + data.total_output_tokens) / 1000).toFixed(1)}k Time: {data.total_execution_time.toFixed(1)}s Iterations: {data.iterations.length}
{/* Iteration timeline */}
Iteration Timeline
{data.iterations.map((it) => (
setExpandedIter(expandedIter === it.rlm_iter ? null : it.rlm_iter) } >
iter {it.rlm_iter}
{it.has_code_blocks && ( {it.n_code_blocks} code )} {it.has_final_answer && ( FINAL )}
{((it.input_tokens + it.output_tokens) / 1000).toFixed(1)}k tok {it.execution_time.toFixed(1)}s
{it.response_preview || "(empty)"}
))}
{/* Expanded iteration detail */} {expandedIter !== null && iterDetail && ( )} {/* Final answer if present */} {data.final_answer && (
Final Answer
{data.final_answer}
)}
); }