From 81f1cb496acc7a53b6d56c0fa14550e37d878399 Mon Sep 17 00:00:00 2001 From: Pine Date: Tue, 25 Aug 2026 12:54:16 +0800 Subject: [PATCH] =?UTF-8?q?feat(compute):=20=E9=80=9A=E9=81=93=E7=BC=96?= =?UTF-8?q?=E8=BE=91=E8=A1=A8=E5=8D=95=20mosdel=E5=AD=97=E6=AE=B5=E5=8A=A0?= =?UTF-8?q?=E3=80=8C=E4=BB=8E=20API=20=E8=8E=B7=E5=8F=96=E6=A8=A1=E5=9E=8B?= =?UTF-8?q?=E3=80=8D=E6=8C=89=E9=92=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 支持从供应商 API 拉取模型列表,选择后自动填入 models(需先填 Base URL+Key) --- src/pages/compute/channels.tsx | 24 +++++++++++++++++++++++- 1 file changed, 23 insertions(+), 1 deletion(-) diff --git a/src/pages/compute/channels.tsx b/src/pages/compute/channels.tsx index 678148d..4fdf1a5 100644 --- a/src/pages/compute/channels.tsx +++ b/src/pages/compute/channels.tsx @@ -193,8 +193,22 @@ function ChannelFormDialog({ open, row, onClose, onDone }: { }) { const [f, setF] = React.useState(blank); const [busy, setBusy] = React.useState(false); + const [fetching, setFetching] = React.useState(false); const [err, setErr] = React.useState(null); + const fetchModels = async () => { + if (!f.base_url || !f.key) { setErr("请先填 Base URL 与 Key 再获取模型"); return; } + setFetching(true); setErr(null); + const out = await computeAction("POST", "channel/fetch-models", { base_url: f.base_url, key: f.key }); + setFetching(false); + const list = out.data?.models; + if (out.ok && Array.isArray(list) && list.length) { + set("models", list.join(", ")); + } else { + setErr(out.data?.message || out.message || "获取模型失败"); + } + }; + React.useEffect(() => { if (open) { setF(row && row.id ? { ...blank, ...row, model_mapping: row.model_mapping ?? "" } : blank); setErr(null); } }, [open, row]); @@ -232,7 +246,15 @@ function ChannelFormDialog({ open, row, onClose, onDone }: { set("key", e.target.value)} placeholder="API Key / 可多Key" type="password" /> set("base_url", e.target.value)} placeholder="https://api.xxx.com" /> - set("models", e.target.value)} placeholder="gpt-4o,claude-sonnet-4-6" /> + +
+ set("models", e.target.value)} placeholder="gpt-4o,claude-sonnet-4-6" /> + +
+
set("group", e.target.value)} placeholder="default" /> set("model_mapping", e.target.value)} placeholder="model-a=>model-b, ..." /> set("weight", e.target.value)} />