fix(drift): 改用 OpenClaw AI Router 取代 Ollama httpx 直連
All checks were successful
CD Pipeline / build-and-deploy (push) Successful in 32m34s
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:
@@ -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))
|
||||
|
||||
Reference in New Issue
Block a user