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