From b49b704e826be445876bed64262efbd4e4c2e5cb Mon Sep 17 00:00:00 2001 From: OoO Date: Tue, 28 Apr 2026 12:48:06 +0800 Subject: [PATCH] fix(post-3.5g): restore generate_embedding for KM dual-write (CRIT-1) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 從 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) --- services/ollama_service.py | 31 +++++++++++++++++++++++++++++++ 1 file changed, 31 insertions(+) diff --git a/services/ollama_service.py b/services/ollama_service.py index fd64b0d..4830344 100644 --- a/services/ollama_service.py +++ b/services/ollama_service.py @@ -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()