From 2c760b490f0cefd4112db64117280de26f882244 Mon Sep 17 00:00:00 2001 From: sim Date: Fri, 11 Sep 2026 12:48:02 +0800 Subject: [PATCH] =?UTF-8?q?fix(settings):=20=E5=A4=9A=E6=A8=A1=E6=80=81?= =?UTF-8?q?=E6=80=BB=E5=BC=80=E5=85=B3=E6=89=93=E5=BC=80=E5=8D=B3=E5=9C=A8?= =?UTF-8?q?=20AI=20=E6=9C=8D=E5=8A=A1=E4=B8=8E=E6=A8=A1=E5=9E=8B=E5=B1=95?= =?UTF-8?q?=E7=A4=BA=20Omni=20=E8=A7=86=E5=9B=BE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 管线模式切换器位于 OmniChannelSection(挂在 kind=all 的 ProvidersSection 内), 而新版 ServicesTab 只有 pipelineMode=multimodal 时才生成 omni 视图——总开关 打开后没有任何入口切换模式,配置区域因此消失(回归)。 availableServiceViews 改为按「总开关」「生效模式」两个条件生成视图: 开关打开即出现 omni 视图(内含传统/多模态切换器),切到多模态模式后才 按既有语义隐藏传统 llm/asr 页。 --- .../app/src/pages/settings/navigation.test.ts | 21 +++++++++++++++++-- .../app/src/pages/settings/navigation.ts | 16 +++++++++++--- openless-all/app/src/pages/settings/tabs.tsx | 6 +++--- 3 files changed, 35 insertions(+), 8 deletions(-) diff --git a/openless-all/app/src/pages/settings/navigation.test.ts b/openless-all/app/src/pages/settings/navigation.test.ts index e0a7a10d..bf4babe4 100644 --- a/openless-all/app/src/pages/settings/navigation.test.ts +++ b/openless-all/app/src/pages/settings/navigation.test.ts @@ -85,7 +85,7 @@ assert.deepEqual( ); console.log('settings navigation tests passed'); -const omniViews = availableServiceViews(true, true); +const omniViews = availableServiceViews(true, true, true); assert.deepEqual( omniViews, ['omni', 'models', 'connections'], @@ -101,12 +101,28 @@ assert.equal( 'models', 'pipeline changes do not redirect a user managing local models', ); -const phoneViews = availableServiceViews(false, false); +const enabledTraditionalViews = availableServiceViews(true, false, true); +assert.deepEqual( + enabledTraditionalViews, + ['omni', 'llm', 'asr', 'models', 'connections'], + 'enabling the experiment must surface the Omni view while traditional pages remain', +); +assert.equal( + resolveServiceView('omni', enabledTraditionalViews), + 'omni', + 'the Omni view hosts the pipeline mode switcher', +); +const phoneViews = availableServiceViews(false, false, false); assert.equal( phoneViews.includes('models'), false, 'unsupported local model management is not exposed', ); +assert.equal( + phoneViews.includes('omni'), + false, + 'a disabled multimodal pipeline hides the Omni view', +); assert.equal( resolveServiceView('models', phoneViews), 'llm', @@ -117,3 +133,4 @@ assert.equal( 'llm', 'leaving Omni returns to a traditional service', ); +console.log('settings service view tests passed'); diff --git a/openless-all/app/src/pages/settings/navigation.ts b/openless-all/app/src/pages/settings/navigation.ts index ba12928d..57ccbf80 100644 --- a/openless-all/app/src/pages/settings/navigation.ts +++ b/openless-all/app/src/pages/settings/navigation.ts @@ -62,10 +62,20 @@ export function searchSettingsSections( export type ServiceViewId = 'llm' | 'asr' | 'omni' | 'models' | 'connections'; -export function availableServiceViews(multimodal: boolean, localModels: boolean): ServiceViewId[] { +/** + * 多模态总开关(multimodalPipelineEnabled)打开即展示 omni 视图—— + * 管线模式(传统 / 多模态)的切换器就在该视图里,否则开关打开后没有任何入口 + * 进入多模态配置。只有真正切到多模态模式后才隐藏传统 llm/asr 页。 + */ +export function availableServiceViews( + multimodalPipelineEnabled: boolean, + multimodalMode: boolean, + localModels: boolean, +): ServiceViewId[] { return [ - ...(multimodal ? ['omni' as const] : ['llm' as const, 'asr' as const]), - ...(localModels ? ['models' as const] : []), + ...(multimodalPipelineEnabled ? (['omni'] as const) : []), + ...(!multimodalMode ? (['llm', 'asr'] as const) : []), + ...(localModels ? (['models'] as const) : []), 'connections', ]; } diff --git a/openless-all/app/src/pages/settings/tabs.tsx b/openless-all/app/src/pages/settings/tabs.tsx index f07f2946..e48044c5 100644 --- a/openless-all/app/src/pages/settings/tabs.tsx +++ b/openless-all/app/src/pages/settings/tabs.tsx @@ -87,10 +87,10 @@ export function ServicesTab() { const { prefs } = useHotkeySettings(); const platformCaps = usePlatformCaps(); const showLocalModel = platformCaps?.supportsLocalAsr === true; - const multimodal = - prefs?.multimodalPipelineEnabled === true && prefs.pipelineMode === 'multimodal'; + const multimodalEnabled = prefs?.multimodalPipelineEnabled === true; + const multimodal = multimodalEnabled && prefs.pipelineMode === 'multimodal'; const [view, setView] = useState('llm'); - const views = availableServiceViews(multimodal, showLocalModel); + const views = availableServiceViews(multimodalEnabled, multimodal, showLocalModel); const selectedView = resolveServiceView(view, views); const contentRef = useRef(null);