import { useEffect, useState } from "react"; import type { GepaIterData, PanelNav } from "../types"; interface GepaIterLevelProps { datasetId: string; gepaIter: number; fetchGepaIter: (dsId: string, gepaIter: number) => Promise; onDrillDown: (nav: PanelNav) => void; } export default function GepaIterLevel({ datasetId, gepaIter, fetchGepaIter, onDrillDown, }: GepaIterLevelProps) { const [data, setData] = useState(null); useEffect(() => { fetchGepaIter(datasetId, gepaIter).then(setData).catch(() => {}); }, [datasetId, gepaIter, fetchGepaIter]); if (!data) return
Loading GEPA iteration...
; return (
{/* Stats row */}
Total tokens:{" "} {((data.total_input_tokens + data.total_output_tokens) / 1000).toFixed(1)}k Time: {data.total_execution_time.toFixed(1)}s RLM Calls: {data.rlm_calls.length}
{/* RLM iteration timeline */} {data.rlm_calls.map((call) => (
{data.rlm_calls.length > 1 && (
RLM Call {call.rlm_call_idx}
)}
{call.iterations.map((it) => (
onDrillDown({ datasetId, level: 3, gepaIter, rlmCallIdx: call.rlm_call_idx, rlmIter: 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)"}
))}
))} {/* Final answer if present */} {data.final_answer && (
Final Answer
{data.final_answer}
)}
); }