From 99bf6c312b4c183f281f2a7cb77cfe547bbbb7d5 Mon Sep 17 00:00:00 2001 From: Kinyoo Date: Tue, 7 Jul 2026 15:28:57 +0800 Subject: [PATCH] fix(platform): fall back to the model's own name when displayName is left empty ModelManagement shows the resolved model name as the display-name placeholder; WorkbenchModel save maps empty displayName to the model's cascader label so the workspace model picker never renders a blank option. Co-Authored-By: Claude Opus 4.8 --- .../src/pages/BuildPage/bench/ModelManagement.tsx | 13 ++++++++++++- .../ModelPage/manage/tabs/WorkbenchModel.tsx | 15 ++++++++++++++- 2 files changed, 26 insertions(+), 2 deletions(-) diff --git a/src/frontend/platform/src/pages/BuildPage/bench/ModelManagement.tsx b/src/frontend/platform/src/pages/BuildPage/bench/ModelManagement.tsx index d8a275185..784ad768a 100644 --- a/src/frontend/platform/src/pages/BuildPage/bench/ModelManagement.tsx +++ b/src/frontend/platform/src/pages/BuildPage/bench/ModelManagement.tsx @@ -43,6 +43,17 @@ export const ModelManagement = forwardRef { + if (!id) return ''; + for (const group of assistantLlmOptions) { + const hit = group.children?.find((el) => el.value == id); + if (hit) return hit.label; + } + return ''; + }; + const selectFooter = (
onNameChange(index, e.target.value)} - placeholder={t('bench.displayName')} + placeholder={getModelLabel(model.id) || t('bench.displayName')} /> {errors[model.key] &&

{errors[model.key]?.[1]}

}
diff --git a/src/frontend/platform/src/pages/ModelPage/manage/tabs/WorkbenchModel.tsx b/src/frontend/platform/src/pages/ModelPage/manage/tabs/WorkbenchModel.tsx index db99c9d8f..479a05c0f 100644 --- a/src/frontend/platform/src/pages/ModelPage/manage/tabs/WorkbenchModel.tsx +++ b/src/frontend/platform/src/pages/ModelPage/manage/tabs/WorkbenchModel.tsx @@ -76,6 +76,17 @@ export default function WorkbenchModel({ onBack }) { const { data: linsightConfig, isLoading: loading, refetch: refetchConfig, error } = useLinsightConfig(); + // Look up the model's own name from the cascader options by id, used as + // the default displayName when the admin leaves it empty. + const findModelLabel = (id) => { + if (!id) return ''; + for (const group of llmOptions) { + const hit = group.children?.find((el) => el.value == id); + if (hit) return hit.label; + } + return ''; + }; + const handleSave = async () => { const { linsightDefaultModelId, sourceModelId, asrModelId, ttsModelId, chatTitleLlmId, models } = form; const errors = []; @@ -86,7 +97,9 @@ export default function WorkbenchModel({ onBack }) { setSaveLoad(true); try { const data = { - models, + // Empty displayName falls back to the model's own name so the + // workspace model picker never renders a blank option. + models: models.map((m) => m.displayName ? m : { ...m, displayName: findModelLabel(m.id) }), embedding_model: { id: String(sourceModelId) }, // Linsight default executor model: one of the workbench chat models' id. linsight_default_model_id: linsightDefaultModelId ? String(linsightDefaultModelId) : null,