diff --git a/apps/api/src/services/ai_router.py b/apps/api/src/services/ai_router.py index 306161ce..e0e8cd69 100644 --- a/apps/api/src/services/ai_router.py +++ b/apps/api/src/services/ai_router.py @@ -260,9 +260,9 @@ class AIRouter: IntentType.RESTART: None, # 依複雜度 IntentType.SCALE: None, # 依複雜度 IntentType.CONFIG: None, # 依複雜度 (但 HIGH 會升級) - # 2026-04-04 ogt: Phase 25 P0 — DIAGNOSE 改為 NEMOTRON (NIM 188) - # 原因: 零費用本地 NIM + 高能力; 搭配 _local_fallback_chain 保證不觸碰雲端 - IntentType.DIAGNOSE: AIProviderEnum.NEMOTRON, # 診斷優先 NIM 本地 (隱私) + # P0 2026-04-04 Claude Code: DIAGNOSE 升級至 Nemotron(高能力雲端) + # 注意: FORCE_LOCAL 情境由 require_local=True + privacy 過濾保護,Nemotron 會被正確跳過 + IntentType.DIAGNOSE: AIProviderEnum.NEMOTRON, # 輔助意圖 IntentType.DELETE: AIProviderEnum.CLAUDE, # CRITICAL → 強制 Claude IntentType.ROLLBACK: None, # 依複雜度 diff --git a/apps/api/tests/test_p0_diagnose_routing.py b/apps/api/tests/test_p0_diagnose_routing.py index fd0cbca1..76b9bd54 100644 --- a/apps/api/tests/test_p0_diagnose_routing.py +++ b/apps/api/tests/test_p0_diagnose_routing.py @@ -136,3 +136,18 @@ class TestLocalFallbackChain: assert result.success is False assert result.error == "local_providers_unavailable" + + +class TestDiagnoseIntentOverride: + """DIAGNOSE intent 應優先路由至 Nemotron(非 FORCE_LOCAL 情境)""" + + def test_diagnose_override_is_nemotron(self): + """_intent_provider_overrides[DIAGNOSE] 應為 NEMOTRON""" + from src.services.ai_router import AIRouter, AIProviderEnum + from src.services.intent_classifier import IntentType + + router = AIRouter() + override = router._intent_provider_overrides.get(IntentType.DIAGNOSE) + assert override == AIProviderEnum.NEMOTRON, ( + f"DIAGNOSE 應路由至 NEMOTRON,實際為 {override}" + )