Skip to main content
Version: 2.30-unstable

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 variablesmemory_store: A Mem0MemoryStore instance.
Environment variablesMEM0_API_KEY: Your Mem0 cloud API key.
Mem0 API docsSearch Memories, Add Memories
API referenceMem0
GitHub linkhttps://github.com/deepset-ai/haystack-core-integrations/tree/main/integrations/mem0
Package namemem0-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_store is mandatory. It is the Mem0MemoryStore instance to query.
  • top_k is optional and defaults to 5. It sets the default maximum number of memories returned for query searches.
  • name is optional and defaults to "retrieve_memories".
  • description is optional and describes the tool to the LLM.
  • parameters is optional and lets you override the JSON schema exposed to the LLM.
  • inputs_from_state is optional and defaults to {"user_id": "user_id"}.

Mem0MemoryWriterTool:

  • memory_store is mandatory. It is the Mem0MemoryStore instance to write to.
  • name is optional and defaults to "store_memory".
  • description is optional and describes the tool to the LLM.
  • parameters is optional and lets you override the JSON schema exposed to the LLM.
  • inputs_from_state is 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:

shell
pip install mem0-haystack

Set your Mem0 API key:

shell
export MEM0_API_KEY="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.

python
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.

python
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",
)