feat: expose completed-turn message context to memory providers

Adds an optional `messages` keyword to the `MemoryProvider.sync_turn`
contract so external/community memory plugins can receive the OpenAI-style
conversation message list for the completed turn — including assistant tool
calls and tool result content — not just the final assistant text.

Dispatch uses signature inspection (`_provider_sync_accepts_messages`): only
providers that declare a `messages` parameter (or `**kwargs`) receive it; all
existing in-tree providers keep their legacy text-only signature and are
called unchanged. No structured-trace envelope is added to core — providers
reconstruct whatever they need from the standard message list.

Also documents Memori as a standalone community memory provider.

Salvaged from #28065 — rebased onto current main.

Co-authored-by: Dave Heritage <david@memorilabs.ai>
This commit is contained in:
Dave Heritage 2026-05-29 02:10:06 +05:30 committed by kshitijk4poor
parent ea5a6c216b
commit 5a95fb2e14
8 changed files with 155 additions and 7 deletions

View file

@ -91,6 +91,45 @@ class TestSyncExternalMemoryForTurn:
session_id="test_session_001",
)
def test_completed_turn_syncs_messages_when_present(self):
agent = _bare_agent()
messages = [
{
"role": "assistant",
"content": None,
"tool_calls": [
{
"id": "call-1",
"type": "function",
"function": {
"name": "terminal",
"arguments": "{\"command\":\"pytest\"}",
},
}
],
},
{
"role": "tool",
"name": "terminal",
"tool_call_id": "call-1",
"content": "final Hermes-processed output",
}
]
agent._sync_external_memory_for_turn(
original_user_message="run tests",
final_response="tests passed",
interrupted=False,
messages=messages,
)
agent._memory_manager.sync_all.assert_called_once_with(
"run tests",
"tests passed",
session_id="test_session_001",
messages=messages,
)
# --- Edge cases (pre-existing behaviour preserved) ------------------
def test_no_final_response_skips(self):