import { useState } from 'react'; import Box from '@mui/material/Box'; import List from '@mui/material/List'; import ListItemButton from '@mui/material/ListItemButton'; import ListItemText from '@mui/material/ListItemText'; import Select from '@mui/material/Select'; import MenuItem from '@mui/material/MenuItem'; import Typography from '@mui/material/Typography'; import Alert from '@mui/material/Alert'; import Table from '@mui/material/Table'; import TableBody from '@mui/material/TableBody'; import TableCell from '@mui/material/TableCell'; import TableHead from '@mui/material/TableHead'; import TableRow from '@mui/material/TableRow'; import type { FrameResponse } from '../services/labeleval'; import { getDatasets, getFrameIds, getFrame, usePoll } from '../services/labeleval'; import { useLabelEval } from '../context/LabelEvalContext'; import InputStage from '../components/labeleval/InputStage'; import { SectionCard, StatusChip, LoadingBox, ErrorNote, fmtNum } from '../components/labeleval/shared'; import { HeadCell } from '../components/help/InfoTip'; export default function LabelGenerationPage() { const { activeDatasetId, setActiveDatasetId } = useLabelEval(); const datasets = usePoll(getDatasets, 10000); const frameIds = usePoll( () => (activeDatasetId ? getFrameIds(activeDatasetId) : Promise.resolve({ frame_ids: [] as string[] })), null, [activeDatasetId] ); const [selectedFrame, setSelectedFrame] = useState(null); const [frameData, setFrameData] = useState(null); const [frameLoading, setFrameLoading] = useState(false); const [frameError, setFrameError] = useState(null); const activeDataset = datasets.data?.datasets.find((d) => d.dataset_id === activeDatasetId) ?? null; const loadFrame = async (frameId: string) => { setSelectedFrame(frameId); setFrameLoading(true); setFrameError(null); try { setFrameData(await getFrame(frameId)); } catch (err) { setFrameData(null); setFrameError(err instanceof Error ? err.message : String(err)); } finally { setFrameLoading(false); } }; return ( Auto-generated labels are hypotheses, not truth — every annotation below must pass the evaluation pipeline (anomaly detection, grading, strict validation and triage) before it can be verified. Dataset: {!activeDatasetId ? ( Select a dataset to browse its frames. ) : ( FRAMES ({frameIds.data?.frame_ids.length ?? 0}) {frameIds.loading ? : null} {frameIds.error && !frameIds.data ? : null} {(frameIds.data?.frame_ids ?? []).map((fid) => ( void loadFrame(fid)} > ))} {frameLoading ? : null} {frameError ? : null} {frameData && !frameLoading ? ( <> {frameData.frame.frame_id} — scene {frameData.frame.scene_id}, seq {frameData.frame.sequence_id} t = {frameData.frame.timestamp_us.toLocaleString()} µs ·{' '} {frameData.frame.num_lidar_points.toLocaleString()} lidar points · ego speed{' '} {fmtNum(frameData.frame.ego_pose.speed_mps, 1)} m/s · prev: {frameData.prev ?? '—'} · next:{' '} {frameData.next ?? '—'} Annotation Class Version {frameData.frame.annotations.map((a) => ( {a.annotation_id} {a.class_name} {fmtNum(a.confidence)} {a.model} {a.model_version} ))}
{frameData.frame.annotations.length === 0 ? ( No annotations in this frame. ) : null} ) : !frameLoading && !frameError ? ( Select a frame to inspect its auto-label hypotheses. ) : null}
)}
); }