From 2d9a0f3a91366d4b2c6e139695104fae58d126f4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E5=86=A0=E8=BE=B0?= Date: Wed, 24 Jun 2026 14:42:12 +0800 Subject: [PATCH] fix(hermes): inject recalled context into system prompt MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: 李冠辰 --- .../memory/memory_tencentdb/__init__.py | 19 ++++++- .../tests/test_system_prompt_block.py | 52 +++++++++++++++++++ 2 files changed, 70 insertions(+), 1 deletion(-) create mode 100644 hermes-plugin/memory/memory_tencentdb/tests/test_system_prompt_block.py diff --git a/hermes-plugin/memory/memory_tencentdb/__init__.py b/hermes-plugin/memory/memory_tencentdb/__init__.py index 86350fad..b9e2cea4 100644 --- a/hermes-plugin/memory/memory_tencentdb/__init__.py +++ b/hermes-plugin/memory/memory_tencentdb/__init__.py @@ -816,7 +816,7 @@ def _background_start(): def system_prompt_block(self) -> str: if not self._gateway_available: return "" - return ( + block = ( "# memory-tencentdb Memory\n" f"Active. User: {self._user_id}.\n" "Four-layer memory system (L0→L1→L2→L3) with automatic conversation " @@ -824,6 +824,23 @@ def system_prompt_block(self) -> str: "Use memory_tencentdb_memory_search to find specific memories, " "memory_tencentdb_conversation_search to search raw conversation history." ) + if not self._client: + return block + try: + result = self._client.recall( + query="system prompt memory context", + session_key=self._session_id, + user_id=self._user_id, + ) + self._record_success() + context = result.get("context", "") + if context: + return f"{block}\n\n## Recalled memory context\n{context}" + except Exception as e: + self._record_failure() + logger.debug("memory-tencentdb system_prompt_block recall failed: %s", e) + self._try_recover_gateway() + return block def prefetch(self, query: str, *, session_id: str = "") -> str: """Synchronous recall — fetch memories in real-time for the current turn.""" diff --git a/hermes-plugin/memory/memory_tencentdb/tests/test_system_prompt_block.py b/hermes-plugin/memory/memory_tencentdb/tests/test_system_prompt_block.py new file mode 100644 index 00000000..14f3a434 --- /dev/null +++ b/hermes-plugin/memory/memory_tencentdb/tests/test_system_prompt_block.py @@ -0,0 +1,52 @@ +from __future__ import annotations + +import pathlib +import sys +import types +import unittest +from unittest.mock import MagicMock + + +_THIS_FILE = pathlib.Path(__file__).resolve() +_HERMES_PLUGIN_ROOT = _THIS_FILE.parents[3] +if str(_HERMES_PLUGIN_ROOT) not in sys.path: + sys.path.insert(0, str(_HERMES_PLUGIN_ROOT)) + +if "agent.memory_provider" not in sys.modules: + agent_module = types.ModuleType("agent") + memory_provider_module = types.ModuleType("agent.memory_provider") + + class MemoryProvider: # Minimal test stub for the Hermes interface. + pass + + memory_provider_module.MemoryProvider = MemoryProvider + agent_module.memory_provider = memory_provider_module + sys.modules.setdefault("agent", agent_module) + sys.modules["agent.memory_provider"] = memory_provider_module + +from memory.memory_tencentdb import MemoryTencentdbProvider + + +class SystemPromptBlockTest(unittest.TestCase): + def test_system_prompt_block_includes_recalled_persona_context(self) -> None: + provider = MemoryTencentdbProvider() + provider._gateway_available = True + provider._session_id = "session-1" + provider._user_id = "user-1" + provider._client = MagicMock() + provider._client.recall.return_value = { + "context": "\nPrefers concise answers.\n", + } + + block = provider.system_prompt_block() + + self.assertIn("Prefers concise answers.", block) + provider._client.recall.assert_called_once() + call_kwargs = provider._client.recall.call_args.kwargs + self.assertEqual(call_kwargs["session_key"], "session-1") + self.assertEqual(call_kwargs["user_id"], "user-1") + self.assertTrue(call_kwargs["query"]) + + +if __name__ == "__main__": + unittest.main()