54 lines
2.2 KiB
Python
54 lines
2.2 KiB
Python
"""Offline contract smoke against a real Hermes checkout.
|
|
|
|
HERMES_SOURCE=/path/to/hermes-agent python tests/smoke_hermes.py
|
|
Host modules are real; only the Mem0 backend is mocked. Uses a temporary profile.
|
|
"""
|
|
|
|
import json
|
|
import os
|
|
import pathlib
|
|
import shutil
|
|
import sys
|
|
import tempfile
|
|
from unittest.mock import Mock
|
|
|
|
hermes_source = pathlib.Path(os.environ["HERMES_SOURCE"]).resolve()
|
|
plugin_source = pathlib.Path(__file__).resolve().parents[1]
|
|
sys.path.insert(0, str(hermes_source))
|
|
with tempfile.TemporaryDirectory() as d:
|
|
os.environ["HERMES_HOME"] = d
|
|
os.environ["MEM0_API_KEY"] = "test-key"
|
|
import plugins.memory as pm
|
|
from agent.memory_manager import MemoryManager
|
|
|
|
destination = pathlib.Path(d) / "plugins" / "mem0"
|
|
shutil.copytree(plugin_source, destination)
|
|
assert pm.find_provider_dir("mem0") == hermes_source / "plugins" / "memory" / "mem0"
|
|
pm._MEMORY_PLUGINS_DIR = pathlib.Path(d) / "empty-bundled"
|
|
pm._MEMORY_PLUGINS_DIR.mkdir()
|
|
provider = pm.load_memory_provider("mem0", register_skills=False)
|
|
assert provider is not None
|
|
assert provider.__class__.__module__.startswith("_hermes_user_memory.")
|
|
backend = Mock()
|
|
backend.search.return_value = []
|
|
backend.add.return_value = {}
|
|
provider._create_backend = lambda: backend
|
|
manager = MemoryManager()
|
|
manager.add_provider(provider)
|
|
manager.initialize_all("s1", platform="cli", user_id="alice")
|
|
result = manager.handle_tool_call("mem0_search", {"query": "favorite programming language"})
|
|
assert json.loads(result)["result"] == "No relevant memories found."
|
|
manager.sync_all(
|
|
"I prefer Python for tooling. " * 100 + "UNIQUE_END_MARKER",
|
|
"I will remember that.",
|
|
session_id="s2",
|
|
messages=[{"role": "tool", "content": "NOT_FOR_CAPTURE"}],
|
|
turn_author={"id": "alice"},
|
|
)
|
|
manager.shutdown_all()
|
|
assert backend.add.call_count >= 1
|
|
sent = str(backend.add.call_args_list)
|
|
assert "UNIQUE_END_MARKER" in sent and "NOT_FOR_CAPTURE" not in sent
|
|
assert backend.add.call_args.kwargs["run_id"] == "s2"
|
|
print("PASS:", hermes_source, "real external loader + MemoryManager lifecycle/tools/full capture/session ID")
|