import { useEffect, useState } from "react"; import { listModels, saveModel, setActive, deleteModel, testModel, type Model, type ModelInput, } from "./api"; const EMPTY: ModelInput = { provider: "openai-compatible", base_url: "", api_key: "", model: "", }; // 模型配置页:登记/激活/删除 + 测试连接。激活后经 NATS 热更新到 Dispatcher。 export function ModelsPage() { const [models, setModels] = useState([]); const [form, setForm] = useState(EMPTY); const [msg, setMsg] = useState(""); const [testing, setTesting] = useState(false); const refresh = () => listModels().then(setModels).catch((e) => setMsg(`✗ ${e.message}`)); useEffect(() => { refresh(); }, []); const set = (k: keyof ModelInput, v: string) => setForm((f) => ({ ...f, [k]: v })); const onSave = async () => { try { await saveModel(form); setMsg("✓ 已保存"); setForm(EMPTY); refresh(); } catch (e) { setMsg(`✗ ${(e as Error).message}`); } }; const onTest = async () => { setTesting(true); try { const r = await testModel(form); setMsg(r.ok ? `✓ 连接成功(${r.message})` : `✗ 连接失败:${r.message}`); } catch (e) { setMsg(`✗ ${(e as Error).message}`); } finally { setTesting(false); } }; return (

已配置模型

{models.length === 0 && ( )} {models.map((m) => ( ))}
状态 Provider Base URL Model API Key 操作
暂无模型,使用下方表单登记。
{m.active ? ( 激活 ) : ( )} {m.provider} {m.base_url} {m.model} {m.api_key || "—"}
{!m.active && ( )}

登记模型(开发期:第三方在线 API,OpenAI 兼容)

{msg && {msg}}
); }