import { useEffect, useState } from 'react'; import clsx from 'clsx'; const DEFAULT_FORM = { mode: 'equal_split', modelId: '', seed: 42, maxRounds: 20, temperature: 0.2, }; /** * Sidebar/header control that picks an inference mode and starts a live run. * * Props: * - modes: [{id,label,description,requires_credentials,...}] * - status: 'idle' | 'connecting' | 'running' | 'done' | 'error' * - lastError: string | null * - currentRunId: string | null * - onStart(opts): kicks off a new run (parent handles SSE wiring) * - onStop(): stops the current SSE subscription */ export default function RunControls({ modes = [], status = 'idle', lastError = null, currentRunId = null, onStart, onStop, }) { const [form, setForm] = useState(DEFAULT_FORM); const [open, setOpen] = useState(true); // Make sure the selected mode stays valid when the modes list refreshes. useEffect(() => { if (!modes.length) return; if (!modes.find(m => m.id === form.mode)) { setForm(f => ({ ...f, mode: modes[0].id })); } }, [modes, form.mode]); const selectedMode = modes.find(m => m.id === form.mode); const llmReady = selectedMode?.id !== 'llm' || selectedMode?.credentials_present; function update(key, value) { setForm(f => ({ ...f, [key]: value })); } function submit(e) { e.preventDefault(); onStart?.({ mode: form.mode, modelId: form.modelId || selectedMode?.default_model_id || null, seed: Number(form.seed) || 0, maxRounds: Number(form.maxRounds) || 20, temperature: Number(form.temperature) || 0, }); } const isBusy = status === 'connecting' || status === 'running'; return (

Live inference {currentRunId ? {currentRunId} : 'no run yet'}

{open && (
{selectedMode?.id === 'llm' && ( )}
{selectedMode?.id === 'llm' && ( )}
{isBusy && ( )}
{statusLabel(status)} {lastError && ( {lastError} )}
{selectedMode?.id === 'llm' && !selectedMode?.credentials_present && ( The server is missing HF_TOKEN /{' '} HF_MODEL_ID. Set them in .env and restart scripts/run_visualizer_server.py. )}
)}
); } function statusLabel(status) { switch (status) { case 'connecting': return 'Connecting to backend…'; case 'running': return 'Streaming live rounds'; case 'done': return 'Run complete'; case 'error': return 'Run failed'; default: return 'Idle'; } }