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 (
{currentRunId} : 'no run yet'}