fix(drift): 改用 OpenClaw AI Router 取代 Ollama httpx 直連
All checks were successful
CD Pipeline / build-and-deploy (push) Successful in 32m34s

根因:_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 <noreply@anthropic.com>
This commit is contained in:
OG T
2026-04-17 10:27:39 +08:00
parent 0c15fa5988
commit d952435b60

View File

@@ -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: 禁止寫死內網 IPfeedback_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))