Add memory management APIs for OpenViking: list, read, write, and delete memories

This commit is contained in:
2026-05-29 16:38:57 +08:00
parent 0ab2a35e16
commit 68b2513043
9 changed files with 578 additions and 3 deletions

View File

@ -1,6 +1,12 @@
import asyncio
from memory_system_api.schemas import MessageIngestRequest, ResourceUploadRequest, SearchRequest, SessionContextRequest
from memory_system_api.schemas import (
MemoryWriteRequest,
MessageIngestRequest,
ResourceUploadRequest,
SearchRequest,
SessionContextRequest,
)
from memory_system_api.service import MemorySystemService
@ -120,6 +126,22 @@ class FakeOpenViking:
self.calls.append(("delete_resource", user_key, uri, recursive))
return {"status": "ok", "result": {"uri": uri, "estimated_deleted_count": 4}}
async def list_memories(self, user_key: str, uri: str, recursive: bool = True) -> dict:
self.calls.append(("list_memories", user_key, uri, recursive))
return {"status": "ok", "result": {"children": [{"uri": "viking://user/memories/profile.md"}]}}
async def read_memory(self, user_key: str, uri: str) -> dict:
self.calls.append(("read_memory", user_key, uri))
return {"status": "ok", "result": {"uri": uri, "content": "# Profile"}}
async def write_memory(self, user_key: str, uri: str, content: str, mode: str, wait: bool = True) -> dict:
self.calls.append(("write_memory", user_key, uri, content, mode, wait))
return {"status": "ok", "result": {"uri": uri, "mode": mode}}
async def delete_memory(self, user_key: str, uri: str, recursive: bool = False) -> dict:
self.calls.append(("delete_memory", user_key, uri, recursive))
return {"status": "ok", "result": {"uri": uri, "estimated_deleted_count": 1}}
class FakeEverOS:
def __init__(self, fail_on_append: bool = False):
@ -334,6 +356,93 @@ def test_delete_resource_delegates_to_openviking_only():
assert everos.calls == []
def test_list_memories_delegates_to_openviking_only():
openviking = FakeOpenViking()
everos = FakeEverOS()
service = MemorySystemService(openviking=openviking, everos=everos)
response = asyncio.run(service.list_memories(
user_id="tom",
user_key="tom-key",
uri="viking://user/memories",
recursive=True,
))
assert response.status == "success"
assert response.memory == {"status": "ok", "result": {"children": [{"uri": "viking://user/memories/profile.md"}]}}
assert openviking.calls == [
("credential_for_user", "tom", "tom-key", None),
("list_memories", "key-tom", "viking://user/memories", True),
]
assert everos.calls == []
def test_read_memory_delegates_to_openviking_only():
openviking = FakeOpenViking()
everos = FakeEverOS()
service = MemorySystemService(openviking=openviking, everos=everos)
response = asyncio.run(service.read_memory(
user_id="tom",
user_key="tom-key",
uri="viking://user/memories/profile.md",
))
assert response.status == "success"
assert response.memory == {"status": "ok", "result": {"uri": "viking://user/memories/profile.md", "content": "# Profile"}}
assert openviking.calls == [
("credential_for_user", "tom", "tom-key", None),
("read_memory", "key-tom", "viking://user/memories/profile.md"),
]
assert everos.calls == []
def test_write_memory_delegates_to_openviking_content_write_only():
openviking = FakeOpenViking()
everos = FakeEverOS()
service = MemorySystemService(openviking=openviking, everos=everos)
response = asyncio.run(service.write_memory(MemoryWriteRequest(
user_id="tom",
user_key="tom-key",
uri="viking://user/memories/profile.md",
content="# Profile\n\nLikes Python.",
mode="replace",
wait=True,
)))
assert response.status == "success"
assert response.memory == {"status": "ok", "result": {"uri": "viking://user/memories/profile.md", "mode": "replace"}}
assert openviking.calls == [
("credential_for_user", "tom", "tom-key", None),
("write_memory", "key-tom", "viking://user/memories/profile.md", "# Profile\n\nLikes Python.", "replace", True),
]
assert everos.calls == []
def test_delete_memory_delegates_to_openviking_only_and_defaults_non_recursive():
openviking = FakeOpenViking()
everos = FakeEverOS()
service = MemorySystemService(openviking=openviking, everos=everos)
response = asyncio.run(service.delete_memory(
user_id="tom",
user_key="tom-key",
uri="viking://user/memories/preferences/python.md",
))
assert response.status == "success"
assert response.memory == {
"status": "ok",
"result": {"uri": "viking://user/memories/preferences/python.md", "estimated_deleted_count": 1},
}
assert openviking.calls == [
("credential_for_user", "tom", "tom-key", None),
("delete_memory", "key-tom", "viking://user/memories/preferences/python.md", False),
]
assert everos.calls == []
def test_search_removes_vectors_from_items_and_backend_results():
service = MemorySystemService(openviking=FakeOpenViking(), everos=FakeEverOSWithVector())