From d952435b60ad818d8df1e9372ccc75a421735d2d Mon Sep 17 00:00:00 2001 From: OG T Date: Fri, 17 Apr 2026 10:27:39 +0800 Subject: [PATCH] =?UTF-8?q?fix(drift):=20=E6=94=B9=E7=94=A8=20OpenClaw=20A?= =?UTF-8?q?I=20Router=20=E5=8F=96=E4=BB=A3=20Ollama=20httpx=20=E7=9B=B4?= =?UTF-8?q?=E9=80=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 根因:_call_nemotron() 直接呼叫 Ollama httpx(settings.OLLAMA_URL) 繞過 AI Router,無 fallback → "All connection attempts failed" → Telegram 卡顯示「意圖分析失敗:All connection attempts failed」 修復:改走 get_openclaw().call(prompt) 自動享有 Provider 降級與 fallback 機制(與其他 Agent 一致) 廢棄:BUG-001 httpx 直連繞過法(nvidia_provider 介面已穩定) Co-Authored-By: Claude Sonnet 4.6 --- apps/api/src/services/drift_interpreter.py | 45 ++++++---------------- 1 file changed, 12 insertions(+), 33 deletions(-) diff --git a/apps/api/src/services/drift_interpreter.py b/apps/api/src/services/drift_interpreter.py index 31baf523..ee88d30b 100644 --- a/apps/api/src/services/drift_interpreter.py +++ b/apps/api/src/services/drift_interpreter.py @@ -101,45 +101,24 @@ class NemotronDriftInterpreter: async def _call_nemotron(self, prompt: str) -> DriftInterpretation: """ - 呼叫本地 Ollama qwen2.5:7b-instruct 進行意圖分析 - BUG-001 修復 2026-04-11: nvidia_provider 已重構為返回 NvidiaProviderResult 物件(非 4-tuple), - 改用 Ollama httpx 直接呼叫,繞過 nvidia_provider,與 drift_narrator_service 一致 + 呼叫 OpenClaw AI Router 進行意圖分析。 + + 2026-04-17 ogt + Claude Sonnet 4.6: 改用 OpenClaw 取代直接 Ollama httpx 呼叫 + 根因:直接呼叫 Ollama 繞過 AI Router,無 fallback → "All connection attempts failed" + 修復:統一走 openclaw.call(),自動享有 Provider 降級與 fallback 機制 + 廢棄:BUG-001 的 httpx 直連繞過法(nvidia_provider 介面已於 7eb8375 穩定) """ - import httpx - from src.core.config import get_settings - from src.services.model_registry import get_model as _get_model - - # C1 修復 2026-04-11: 禁止寫死內網 IP(feedback_frontend_internal_ip_ban 鐵律) - # 改從 settings.OLLAMA_URL 讀取(已有此設定,default=http://192.168.0.111:11434) - _settings = get_settings() - OLLAMA_URL = getattr(_settings, "OLLAMA_URL", "http://192.168.0.111:11434") - # D1 集中化 2026-04-11: 從 models.json providers.ollama.models.drift_intent 讀取 - MODEL = _get_model("ollama", "drift_intent") - TIMEOUT = 45.0 - try: - async with httpx.AsyncClient(timeout=TIMEOUT) as client: - resp = await client.post( - f"{OLLAMA_URL}/api/generate", - json={ - "model": MODEL, - "prompt": prompt, - "stream": False, - "options": {"temperature": 0.2, "num_predict": 200}, - }, - ) - resp.raise_for_status() - data = resp.json() - response_text = data.get("response", "").strip() + from src.services.openclaw import get_openclaw + openclaw = get_openclaw() + response_text, _provider, success = await openclaw.call(prompt) - if not response_text: - return self._unknown_result("Ollama 回傳空值") + if not success or not response_text: + logger.warning("drift_interpreter_openclaw_failed", provider=_provider) + return self._unknown_result("AI Router 回傳失敗或空值") return self._parse_response(response_text) - except httpx.TimeoutException: - logger.warning("drift_interpreter_timeout", model=MODEL) - return self._unknown_result("Ollama 超時") except Exception as e: logger.warning("drift_interpreter_error", error=str(e)) return self._unknown_result(str(e))