fix(post-3.5g): restore generate_embedding for KM dual-write (CRIT-1)

從 4349db2~1 撈回 OllamaService.generate_embedding,補齊被誤刪的方法。

問題:
- services/openclaw_learning_service.py:67 仍呼叫 ollama_service.generate_embedding(...)
- 4349db2 大改時把這個方法刪掉,導致每次 NemoTron 寫入學習資料時觸發
  AttributeError: 'OllamaService' object has no attribute 'generate_embedding'
- pgvector KM 因此完全停寫,違反 ADR-007 雙寫鐵律

修法:
- 把 method paste 回 OllamaService 末端(line 508)
- 對齊現代 config:os 已在檔案頂部 import,移除方法內重複 import
- embedding 走 EMBEDDING_HOST(Hermes 主機,內網免認證)
- model 預設 bge-m3:latest(ADR-003 對齊)

驗證:
- AST parse OK
- grep 'def generate_embedding' 已存在

Critic finding: CRIT-1
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
OoO
2026-04-28 12:48:06 +08:00
parent d1fc71c6a3
commit b49b704e82

View File

@@ -505,6 +505,37 @@ class OllamaService:
return self.generate(prompt, system_prompt=system_prompt, temperature=0.5, timeout=120)
def generate_embedding(self, text: str, model: str = "bge-m3:latest",
host: str = None) -> List[float]:
"""
[ADR-007, Step 3] 呼叫 Ollama API 將文字轉換為向量 Embedding
2026-04-19 更新ADR-003 對齊):
embedding 預設走 Hermes 主機 `EMBEDDING_HOST`env: EMBEDDING_HOST
→ fallback http://192.168.0.111:11434內網免認證
避免 self.host 若指向公開 ollama.wooo.work 時回 401。
可透過 host 參數 override。
"""
target_host = host or os.getenv("EMBEDDING_HOST", "http://192.168.0.111:11434")
try:
payload = {"model": model, "prompt": text}
response = requests.post(
f"{target_host}/api/embeddings",
json=payload,
timeout=60,
)
if response.status_code == 200:
data = response.json()
return data.get("embedding", [])
else:
logger.error(
f"Ollama Embed Error HTTP {response.status_code} @ {target_host}: {response.text[:200]}"
)
return []
except Exception as e:
logger.error(f"Ollama Embed Exception @ {target_host}: {e}")
return []
# 建立全域服務實例
ollama_service = OllamaService()