fix(hermes-zhiyi): recall 默认全库跨 namespace 检索(修复 memory_search 看不到 a06-main 的问题, t_4171e2ad)
- ZhiYiClient.recall: agent_id 默认 hermes-a06 → None, namespace 可选
- prefetch: 改为全库检索(原 ZHIYI_AGENT_ID 默认值导致只搜 hermes-main)
- commit/写入侧语义不变;备份 ~/.hermes/backups/zhiyi-ns-isolation-fix-20260923/
- 验收: 改后 recall('SOUL.md 精简…') top1 = a06-main worklog score 0.8847 ✓
- 生效需 gateway 重启(本体批准后执行)
This commit is contained in:
@@ -184,11 +184,21 @@ class ZhiYiClient:
|
||||
return None
|
||||
|
||||
def recall(self, query: str, top_k: int = 5,
|
||||
agent_id: str = "hermes-a06") -> List[Dict[str, Any]]:
|
||||
"""语义搜索 ZhiYi 记忆。返回 [{content, score, category}, ...]。"""
|
||||
agent_id: Optional[str] = None,
|
||||
namespace: Optional[str] = None) -> List[Dict[str, Any]]:
|
||||
"""语义搜索 ZhiYi 记忆。返回 [{content, score, category}, ...]。
|
||||
|
||||
namespace="" / agent_id=None → 全库跨 ns 检索(zhiyi recallUncached namespace=="" 路径)。
|
||||
2026-09-23: 此前固定传 agent_id="hermes-a06" 导致检索只限 hermes-main,
|
||||
而 worker 写入 a06-main 的记忆完全搜不到(namespace 隔离 bug)。
|
||||
"""
|
||||
try:
|
||||
payload = {"query": query, "top_k": top_k, "use_rerank": True,
|
||||
"agent_id": agent_id}
|
||||
payload: Dict[str, Any] = {"query": query, "top_k": top_k, "use_rerank": True}
|
||||
if namespace is not None:
|
||||
payload["namespace"] = namespace
|
||||
elif agent_id is not None:
|
||||
payload["agent_id"] = agent_id
|
||||
# 两者都不传 → resolveRecallNamespace("", "", query) → namespace="" → 全库
|
||||
r = self._session.post(self._url("/api/v1/recall"), json=payload, timeout=self.timeout)
|
||||
if r.status_code == 200:
|
||||
data = r.json()
|
||||
@@ -500,9 +510,9 @@ class HermesZhiYiMemoryProvider(MemoryProvider):
|
||||
blocks.append(" (可用 memory_feedback 标记 memory_id 有用/无用)")
|
||||
|
||||
# 语义搜索(如果缓存没有命中)
|
||||
# 2026-09-23: 改为全库跨 ns 检索(不传 agent_id),修复 a06-main 记忆对主脑不可见的问题
|
||||
if results is None:
|
||||
results = self._client.recall(query.strip(), top_k=3,
|
||||
agent_id=os.environ.get("ZHIYI_AGENT_ID", "hermes-a06"))
|
||||
results = self._client.recall(query.strip(), top_k=3)
|
||||
for r in results:
|
||||
score = r.get("score", 0)
|
||||
content = r.get("content", "") or r.get("text", "") or r.get("snippet", "")
|
||||
|
||||
Reference in New Issue
Block a user