import { Fragment, useState } from 'react'; import Box from '@mui/material/Box'; import Button from '@mui/material/Button'; import Chip from '@mui/material/Chip'; import Collapse from '@mui/material/Collapse'; 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 Typography from '@mui/material/Typography'; import { AlertTriangle, ChevronDown, ChevronRight, Sparkles } from 'lucide-react'; import type { CopilotExplainRequest, RegressionEntry, RegressionResponse } from '../../types/labeleval'; import { SectionCard, fmtNum } from './shared'; import { ExplainTip, HeadCell } from '../help/InfoTip'; function DeltaTable({ entry }: { entry: RegressionEntry }) { return ( Metric Baseline Current {entry.deltas.map((d) => ( {d.metric} {fmtNum(d.baseline)} {fmtNum(d.current)} {d.delta > 0 ? '+' : ''} {fmtNum(d.delta)} ±{fmtNum(d.tolerance)} ))}
); } export default function RegressionTracking({ regression, onAskCopilot, }: { regression: RegressionResponse | null; onAskCopilot: (request: CopilotExplainRequest) => void; }) { const [expanded, setExpanded] = useState(null); return ( <> {regression?.current_alert ? ( REGRESSION DETECTED The current model performs worse than its baseline beyond configured tolerances. Affected labels are blocked from auto-verification until resolved. ) : null} {!regression || regression.entries.length === 0 ? ( No regression comparisons yet — they appear automatically after the pipeline evaluates a model version that has a registered baseline to compare against. ) : ( Model Baseline Dataset Date Kinds Affected classes Affected scenarios Status {regression.entries.map((e) => { const key = e.run_id; const isOpen = expanded === key; return ( setExpanded(isOpen ? null : key)} sx={{ cursor: 'pointer' }}> {isOpen ? : } {e.model_version} {e.baseline_version ?? '—'} {e.dataset_version} {new Date(e.date).toLocaleString()} {e.kinds.map((k) => ( ))} {e.affected_classes.join(', ') || '—'} {e.affected_scenarios.join(', ') || '—'} ev.stopPropagation()}> {e.regression_detected ? ( ) : null} ); })}
)}
); }