为 OpenViking 内存命中添加最新内容读取功能,并更新相关文档和测试用例
This commit is contained in:
@ -228,6 +228,10 @@ class MemorySystemService:
|
||||
|
||||
backends = await self._run_backends(openviking=search_openviking, everos=search_everos)
|
||||
backends = self._remove_vectors_from_backends(backends)
|
||||
backends["openviking"] = await self._enrich_openviking_search_memory_content(
|
||||
backends["openviking"],
|
||||
credential,
|
||||
)
|
||||
items = self._merge_search_items(backends)
|
||||
compact_backends = self._compact_search_backends(backends)
|
||||
return SearchResponse(
|
||||
@ -340,6 +344,52 @@ class MemorySystemService:
|
||||
return "partial_success"
|
||||
return "failed"
|
||||
|
||||
async def _enrich_openviking_search_memory_content(
|
||||
self,
|
||||
backend: BackendStatus,
|
||||
credential: Any,
|
||||
) -> BackendStatus:
|
||||
if backend.status != "success":
|
||||
return backend
|
||||
memory_items = self._openviking_search_memory_items(backend.result)
|
||||
if not memory_items:
|
||||
return backend
|
||||
await asyncio.gather(
|
||||
*(self._add_latest_memory_content(credential, item) for item in memory_items),
|
||||
)
|
||||
return backend
|
||||
|
||||
async def _add_latest_memory_content(self, credential: Any, item: dict[str, Any]) -> None:
|
||||
uri = item.get("uri")
|
||||
if not isinstance(uri, str) or not uri.startswith("viking://"):
|
||||
return
|
||||
try:
|
||||
result = await self.openviking.read_memory(credential, uri)
|
||||
except Exception: # noqa: BLE001
|
||||
return
|
||||
data = result.get("result") if isinstance(result, dict) and isinstance(result.get("result"), dict) else result
|
||||
content = data.get("content") if isinstance(data, dict) else None
|
||||
if isinstance(content, str):
|
||||
item["content"] = content
|
||||
|
||||
def _openviking_search_memory_items(self, result: Any) -> list[dict[str, Any]]:
|
||||
if not isinstance(result, dict):
|
||||
return []
|
||||
if isinstance(result.get("items"), list):
|
||||
return [
|
||||
item for item in result["items"]
|
||||
if isinstance(item, dict) and self._is_openviking_memory_item(item)
|
||||
]
|
||||
data = result.get("data") if isinstance(result.get("data"), dict) else result
|
||||
if isinstance(data.get("result"), dict):
|
||||
data = data["result"]
|
||||
if not isinstance(data, dict) or not isinstance(data.get("memories"), list):
|
||||
return []
|
||||
return [item for item in data["memories"] if isinstance(item, dict)]
|
||||
|
||||
def _is_openviking_memory_item(self, item: dict[str, Any]) -> bool:
|
||||
return item.get("context_type") == "memory" or item.get("memory_type") == "memory"
|
||||
|
||||
def _merge_search_items(self, backends: dict[str, BackendStatus]) -> list[dict[str, Any]]:
|
||||
items: list[dict[str, Any]] = []
|
||||
for backend_name, backend in backends.items():
|
||||
|
||||
Reference in New Issue
Block a user