From d4fed639f603e1f8cb9d765558b2e2f54519ff33 Mon Sep 17 00:00:00 2001 From: OG T Date: Thu, 16 Apr 2026 00:03:01 +0800 Subject: [PATCH] =?UTF-8?q?fix(ai-router):=20DIAGNOSE=20=E6=81=A2=E5=BE=A9?= =?UTF-8?q?=20OPENCLAW=5FNEMO=20=E8=B7=AF=E7=94=B1=EF=BC=8C=E4=BF=AE?= =?UTF-8?q?=E5=BE=A9=E5=85=A8=E9=83=A8=20timeout=20=E9=99=8D=E7=B4=9A?= =?UTF-8?q?=E5=95=8F=E9=A1=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 根因: 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 --- apps/api/src/services/ai_router.py | 22 +++++++--------------- k8s/awoooi-prod/04-configmap.yaml | 10 ++++------ 2 files changed, 11 insertions(+), 21 deletions(-) diff --git a/apps/api/src/services/ai_router.py b/apps/api/src/services/ai_router.py index 97663f70b..e2bbb053b 100644 --- a/apps/api/src/services/ai_router.py +++ b/apps/api/src/services/ai_router.py @@ -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-27s,JSON 輸出可靠 + 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( diff --git a/k8s/awoooi-prod/04-configmap.yaml b/k8s/awoooi-prod/04-configmap.yaml index b069e826c..f78f1a770 100644 --- a/k8s/awoooi-prod/04-configmap.yaml +++ b/k8s/awoooi-prod/04-configmap.yaml @@ -37,12 +37,10 @@ data: CORS_ORIGINS: '["https://awoooi.wooo.work","http://localhost:3000","http://localhost:3001"]' # AI 配置 (JSON array 格式 for pydantic-settings) - # 2026-04-01 ogt: NVIDIA 第一 (免費) → Gemini(備援 ~100ms) → Ollama(本地) → Claude - # NVIDIA timeout 降為 15s,快速失敗後轉 Gemini,避免免費 tier 阻塞整條鏈 - # 2026-04-01 ogt: ADR-044 OpenClaw RCA 用 Gemini 優先 (穩定快速) - # nvidia(nemotron-mini-4b) JSON 截斷問題; ollama K8s 並發請求 timeout - # Gemini = 雲端 API,穩定、快速、JSON 輸出可靠 - AI_FALLBACK_ORDER: '["gemini","ollama","nvidia","claude"]' + # 2026-04-16 ogt: 修正 fallback 順序 — nvidia(OpenClaw Nemo) 第一 + # 舊順序 gemini→ollama→nvidia 導致 Gemini 失敗後落入 Ollama deepseek(238s timeout) + # nvidia = via 188:8088 OpenClaw → NVIDIA NIM,實測 2-27s + AI_FALLBACK_ORDER: '["nvidia","gemini","ollama","claude"]' AI_CACHE_TTL: "3600" # ============================================================================