Mem0 Memory Tools
The Mem0 integration provides two ready-made Tools for Agent memory workflows:
retrieve_memories(Mem0MemoryRetrieverTool) searches long-term memories, or returns all scoped memories when no query is provided.store_memory(Mem0MemoryWriterTool) stores durable facts, preferences, and context as long-term memories.
| Mandatory init variables | memory_store: A Mem0MemoryStore instance. |
| Environment variables | MEM0_API_KEY: Your Mem0 cloud API key. |
| Mem0 API docs | Search Memories, Add Memories |
| API reference | Mem0 |
| GitHub link | https://github.com/deepset-ai/haystack-core-integrations/tree/main/integrations/mem0 |
| Package name | mem0-haystack |
Overview
Use these tools when an Agent needs persistent memory across conversations. The retriever tool gives the Agent access to memories stored in Mem0, and the writer tool lets the Agent save new information that should be useful in future runs.
Both tools use a shared Mem0MemoryStore. By default, they inject user_id from Agent State through inputs_from_state, so one Agent instance can serve multiple users without exposing user IDs to the LLM as tool-call parameters.
Mem0MemoryRetrieverTool exposes query and top_k to the LLM. If the Agent omits query or passes null, the tool returns all memories in the injected scope. This is useful when the Agent needs to inspect known context before deciding whether a more specific memory search is necessary.
Mem0MemoryWriterTool exposes text and infer to the LLM. The writer tool uses infer=False by default so the Agent stores exactly the memory text it chose. Use infer=True when you want Mem0 to extract memories from longer text, such as a conversation transcript.
Parameters
Mem0MemoryRetrieverTool:
memory_storeis mandatory. It is theMem0MemoryStoreinstance to query.top_kis optional and defaults to5. It sets the default maximum number of memories returned for query searches.nameis optional and defaults to"retrieve_memories".descriptionis optional and describes the tool to the LLM.parametersis optional and lets you override the JSON schema exposed to the LLM.inputs_from_stateis optional and defaults to{"user_id": "user_id"}.
Mem0MemoryWriterTool:
memory_storeis mandatory. It is theMem0MemoryStoreinstance to write to.nameis optional and defaults to"store_memory".descriptionis optional and describes the tool to the LLM.parametersis optional and lets you override the JSON schema exposed to the LLM.inputs_from_stateis optional and defaults to{"user_id": "user_id"}.
To pass more Mem0 entity IDs at runtime, add the fields to the Agent's state_schema and map those State keys to the tool parameters with inputs_from_state. For example, {"user_id": "user_id", "session_id": "run_id"} passes state["session_id"] to the tool's run_id parameter.
At least one Mem0 scope must be available when retrieving or storing memories. Use user_id for the common per-user case, or add run_id, agent_id, or app_id when your application needs a narrower scope.
Usage
Install the Mem0 integration:
Set your Mem0 API key:
With an Agent
You can use both tools with an Agent to read memories at the beginning of a turn and write new durable memories before the final answer.
from haystack.components.agents import Agent
from haystack.components.generators.chat import OpenAIChatGenerator
from haystack.components.generators.utils import print_streaming_chunk
from haystack.dataclasses import ChatMessage
from haystack_integrations.memory_stores.mem0 import Mem0MemoryStore
from haystack_integrations.tools.mem0 import (
Mem0MemoryRetrieverTool,
Mem0MemoryWriterTool,
)
store = Mem0MemoryStore()
retrieve_memories = Mem0MemoryRetrieverTool(memory_store=store, top_k=10)
store_memory = Mem0MemoryWriterTool(memory_store=store)
agent = Agent(
chat_generator=OpenAIChatGenerator(model="gpt-5.4"),
tools=[retrieve_memories, store_memory],
system_prompt="""You are a helpful assistant with long-term memory.
At the beginning of each turn, call retrieve_memories without a query to inspect known memories.
Use store_memory only for new durable user-specific facts, preferences, or project context.
Before storing, compare the proposed memory with retrieved memories and avoid duplicates.
Do not store transient requests that are only useful in the current conversation.
""",
streaming_callback=print_streaming_chunk,
state_schema={"user_id": {"type": str}},
)
result = agent.run(
messages=[
ChatMessage.from_user(
"My name is Alice. Please remember that I prefer concise Python examples.",
),
],
user_id="alice",
)
Pass more IDs through State
Mem0 supports scoping memories with user_id, run_id, agent_id, and app_id. The tools expose only user_id by default, but you can inject more IDs through Agent State without adding them to the LLM-facing parameter schema.
from haystack.components.agents import Agent
from haystack.components.generators.chat import OpenAIChatGenerator
from haystack.components.generators.utils import print_streaming_chunk
from haystack_integrations.memory_stores.mem0 import Mem0MemoryStore
from haystack_integrations.tools.mem0 import (
Mem0MemoryRetrieverTool,
Mem0MemoryWriterTool,
)
store = Mem0MemoryStore()
inputs_from_state = {
"user_id": "user_id",
# Map the Agent State key "conversation_id" to the tool's "run_id" parameter.
"conversation_id": "run_id",
}
retrieve_memories = Mem0MemoryRetrieverTool(
memory_store=store,
inputs_from_state=inputs_from_state,
)
store_memory = Mem0MemoryWriterTool(
memory_store=store,
inputs_from_state=inputs_from_state,
)
agent = Agent(
chat_generator=OpenAIChatGenerator(model="gpt-5.4"),
tools=[retrieve_memories, store_memory],
state_schema={
"user_id": {"type": str},
"conversation_id": {"type": str},
},
streaming_callback=print_streaming_chunk,
)
result = agent.run(
messages=[
ChatMessage.from_user(
"Remember that this conversation is about the docs assistant prototype.",
),
],
user_id="alice",
conversation_id="docs-assistant-prototype",
)