fix(ai-router): DIAGNOSE 恢復 OPENCLAW_NEMO 路由,修復全部 timeout 降級問題
Some checks failed
CD Pipeline / build-and-deploy (push) Failing after 2m16s

根因: 2026-04-12 patch 把 DIAGNOSE 改為 None(複雜度路由)
→ 落入 Rule 6 → Ollama deepseek-r1:14b (CPU 238s) → timeout
→ 降級 20% 信心 + 「待分析」→ 全部 unknown

修復:
1. ai_router.py: DIAGNOSE → OPENCLAW_NEMO(via 188:8088 NVIDIA NIM, 2-27s)
2. ai_router.py: 移除 Rule 6 的 DIAGNOSE deepseek 特殊case(已無用)
3. 04-configmap.yaml: AI_FALLBACK_ORDER 改為 nvidia 優先
   gemini→ollama→nvidia(舊)→ nvidia→gemini→ollama(新)

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
OG T
2026-04-16 00:03:01 +08:00
parent b55575b56b
commit d4fed639f6
2 changed files with 11 additions and 21 deletions

View File

@@ -265,12 +265,11 @@ class AIRouter:
IntentType.RESTART: None, # 依複雜度
IntentType.SCALE: None, # 依複雜度
IntentType.CONFIG: None, # 依複雜度 (但 HIGH 會升級)
# P0 2026-04-04 Claude Code: DIAGNOSE 升級至 Nemotron高能力雲端
# 2026-04-12 ogt: 暫停 NEMOTRON routing — NIM tool_call 返回無 confidence 欄位
# → openclaw_analysis_complete confidence=0.0 → 告警卡顯示規則匹配
# 改為 None複雜度路由 讓 Gemini/openclaw_nemo 處理 DIAGNOSE
# 待 NemotronProvider._parse_confidence() 修復後恢復
IntentType.DIAGNOSE: None,
# 2026-04-16 ogt: 恢復 DIAGNOSE → OPENCLAW_NEMO
# 2026-04-12 patch 改為 None複雜度路由後落入 Rule 6 → Ollama deepseek-r1:14b
# deepseek-r1:14b CPU 需 238s → timeout → degraded 20% → 全部「待分析」
# OPENCLAW_NEMO = via 188:8088 → NVIDIA NIM實測 2-27sJSON 輸出可靠
IntentType.DIAGNOSE: AIProviderEnum.OPENCLAW_NEMO,
# 輔助意圖
IntentType.DELETE: AIProviderEnum.CLAUDE, # CRITICAL → 強制 Claude
IntentType.ROLLBACK: None, # 依複雜度
@@ -454,15 +453,8 @@ class AIRouter:
# =======================================================================
provider = AIProviderEnum.OLLAMA
# 低複雜度使用輕量模型 (更快回應)
# 2026-04-12 ogt: DIAGNOSE 需要結構化 JSON 輸出 (含 confidence 欄位)
# gemma3:4b (summary model) 不輸出結構化 JSON → confidence=0.0
# 強制用 deepseek-r1:14b (default model) 處理 DIAGNOSE
if intent == IntentType.DIAGNOSE:
model = self._ollama_default
reason = f"複雜度={score}/5, 風險={risk.value} → Ollama[deepseek] (DIAGNOSE 需結構化輸出)"
else:
model = self._ollama_summary if score <= 1 else self._ollama_default
reason = f"複雜度={score}/5, 風險={risk.value} → Ollama (成本優先)"
model = self._ollama_summary if score <= 1 else self._ollama_default
reason = f"複雜度={score}/5, 風險={risk.value} → Ollama (成本優先)"
return provider, model, reason
def _select_model(