diff --git a/CHANGELOG.md b/CHANGELOG.md index 6c74544..f846590 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,12 @@ ## 2026-04-07 +### 管理员模型配置页新增统一能力总览 + +- `管理员配置台 -> 模型与接入` 新增了 `统一能力总览`,把 `语言模型 / ASR / 文生图 / 图生图 / 生视频` 五类能力做成了可点击总览卡。 +- 每张卡都会直接带到对应锚点,管理员不需要再自己判断是去 `系统模型`、`运行时接入` 还是 `Huobao` 的图片/视频配置区。 +- 这样“所有需要模型的能力都在一个配置页里”不只是文案层成立,实际管理路径也更清楚了。 + ### 管理员模型配置页明确覆盖全部模型能力 - `管理员配置台 -> 模型与接入` 顶部新增了统一能力说明,直接标明这里覆盖 `语言模型 / ASR / 文生图 / 图生图 / 生视频`。 diff --git a/web/storyforge-web-v4/assets/app.js b/web/storyforge-web-v4/assets/app.js index ea2ed69..937a53f 100644 --- a/web/storyforge-web-v4/assets/app.js +++ b/web/storyforge-web-v4/assets/app.js @@ -5867,6 +5867,69 @@ function renderAdminHuobaoConfigPanel(serviceType, label, description) { `; } +function renderAdminModelCapabilityOverviewPanel() { + const state = getAdminModelAccessState(); + const textConfigs = safeArray(state.huobao_configs?.text?.items); + const imageConfigs = safeArray(state.huobao_configs?.image?.items); + const videoConfigs = safeArray(state.huobao_configs?.video?.items); + const runtime = state.runtime || {}; + const systemModels = safeArray(state.system_model_profiles); + const cards = [ + { + label: "语言模型", + summary: `${formatNumber(systemModels.length)} 条系统模型 / ${formatNumber(textConfigs.length)} 条文本接入`, + hint: "主 Agent、策略分析和文案生成默认都走这组配置。", + anchorId: "admin-system-models-anchor" + }, + { + label: "ASR", + summary: runtime.asr?.configured ? `已配置 · ${runtime.asr?.active_device || runtime.asr?.runtime_device_mode || "auto"}` : "未配置", + hint: "语音转文字入口,当前会显示实际运行设备和模型。", + anchorId: "admin-model-runtime-asr-anchor" + }, + { + label: "文生图", + summary: `${formatNumber(imageConfigs.length)} 条图片配置`, + hint: "封面图、海报图和图片生成都在这里维护。", + anchorId: "admin-model-image-anchor" + }, + { + label: "图生图", + summary: `${formatNumber(imageConfigs.length)} 条图片配置`, + hint: "图生图和素材加工与文生图共用同一组图片模型配置。", + anchorId: "admin-model-image-anchor" + }, + { + label: "生视频", + summary: `${formatNumber(videoConfigs.length)} 条视频配置`, + hint: "AI 视频、Seedance 2.0 和火山视频引擎统一从这里接。", + anchorId: "admin-model-video-anchor" + } + ]; + return ` +
+
+
+

统一能力总览

+
先看每类模型能力当前是否具备可用配置,再点进去做管理员维护。
+
+
+
+ ${cards.map((item) => ` +
+

${escapeHtml(item.label)}

+

${escapeHtml(item.hint)}

+
+ ${escapeHtml(item.summary)} + 前往配置 +
+
+ `).join("")} +
+
+ `; +} + function renderAdminModelAccessPanel() { return `
@@ -5885,6 +5948,7 @@ function renderAdminModelAccessPanel() {
+
${renderAdminModelCapabilityOverviewPanel()}
${renderAdminModelRuntimePanel()}
${renderAdminSystemModelPanel()}
${renderAdminHuobaoConfigPanel("text", "文本模型服务", "大模型文本、策略、文案与分析模型统一在这里维护。")}
diff --git a/web/storyforge-web-v4/tests/workbench-pages.test.mjs b/web/storyforge-web-v4/tests/workbench-pages.test.mjs index 89edc7c..f4aadad 100644 --- a/web/storyforge-web-v4/tests/workbench-pages.test.mjs +++ b/web/storyforge-web-v4/tests/workbench-pages.test.mjs @@ -273,11 +273,17 @@ test("admin workbench exposes a dedicated model access workspace and actions", ( assert.match(loadControls, /\/v2\/admin\/model-access\/overview/); assert.match(admin, /运行时接入/); assert.match(admin, /统一模型配置/); + assert.match(admin, /统一能力总览/); assert.match(admin, /语言模型/); assert.match(admin, /ASR/); assert.match(admin, /文生图/); assert.match(admin, /图生图/); assert.match(admin, /生视频/); + assert.match(admin, /data-action="focus-admin-model-access"/); + assert.match(admin, /admin-system-models-anchor/); + assert.match(admin, /admin-model-runtime-asr-anchor/); + assert.match(admin, /admin-model-image-anchor/); + assert.match(admin, /admin-model-video-anchor/); assert.match(admin, /系统模型/); assert.match(admin, /文生图 \/ 图生图模型服务/); assert.match(admin, /生视频模型服务/);