feat(mem0): add get_memories() convenience method to Mem0MemoryService

Expose a public method for retrieving all stored memories outside the
pipeline, avoiding the need for callers to reimplement client branching,
OR filter construction, and asyncio.to_thread wrapping. Simplify the
example get_initial_greeting() to use it.
This commit is contained in:
Mark Backman
2026-03-26 13:25:28 -04:00
parent 9152d85824
commit 9c6d51c570
2 changed files with 64 additions and 54 deletions

View File

@@ -113,6 +113,45 @@ class Mem0MemoryService(FrameProcessor):
self.last_query = None
logger.info(f"Initialized Mem0MemoryService with {user_id=}, {agent_id=}, {run_id=}")
async def get_memories(self) -> List[Dict[str, Any]]:
"""Retrieve all stored memories for the configured user/agent/run IDs.
This is a convenience method for accessing memories outside the pipeline,
e.g. to build a personalized greeting at connection time. It wraps the
blocking Mem0 ``get_all()`` call in a background thread.
Returns:
List of memory dictionaries. Each dict contains at least a
``"memory"`` key with the memory text. Returns an empty list on
error.
"""
try:
if isinstance(self.memory_client, Memory):
params = {
"user_id": self.user_id,
"agent_id": self.agent_id,
"run_id": self.run_id,
}
params = {k: v for k, v in params.items() if v is not None}
memories = await asyncio.to_thread(lambda: self.memory_client.get_all(**params))
else:
id_pairs = [
("user_id", self.user_id),
("agent_id", self.agent_id),
("run_id", self.run_id),
]
clauses = [{name: value} for name, value in id_pairs if value is not None]
filters = {"OR": clauses} if clauses else {}
memories = await asyncio.to_thread(
lambda: self.memory_client.get_all(filters=filters)
)
results = memories.get("results", []) if isinstance(memories, dict) else memories
return results
except Exception as e:
logger.error(f"Error retrieving memories from Mem0: {e}")
return []
async def _store_messages(self, messages: List[Dict[str, Any]]):
"""Store messages in Mem0.