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);