---
title: "Mem0"
id: integrations-mem0
description: "Mem0 integration for Haystack"
slug: "/integrations-mem0"
---
## haystack_integrations.components.retrievers.mem0.retriever
### Mem0MemoryRetriever
Retrieves memories from a Mem0MemoryStore as a list of ChatMessage objects.
Use this component in a Haystack Pipeline to fetch relevant memories before passing
context to a language model or Agent. The returned memories are system messages.
Provide either `filters` or at least one Mem0 entity ID (`user_id`, `run_id`, `agent_id`, or `app_id`)
when running the component. If both are provided, the filters and entity IDs are combined.
### Usage example
```python
from haystack_integrations.components.retrievers.mem0 import Mem0MemoryRetriever
from haystack_integrations.memory_stores.mem0 import Mem0MemoryStore
store = Mem0MemoryStore()
retriever = Mem0MemoryRetriever(memory_store=store, top_k=3)
result = retriever.run(query="What does Alice like?", user_id="alice")
memories = result["memories"]
print([message.text for message in memories])
# Pass query=None to retrieve all memories in scope.
all_memories = retriever.run(query=None, user_id="alice")["memories"]
```
#### __init__
```python
__init__(*, memory_store: Mem0MemoryStore, top_k: int = 5) -> None
```
Initialize the Mem0MemoryRetriever.
**Parameters:**
- **memory_store** (Mem0MemoryStore) – The Mem0MemoryStore instance to retrieve memories from.
- **top_k** (int) – Default maximum number of memories to return per query.
#### run
```python
run(
query: str | None,
*,
user_id: str | None = None,
run_id: str | None = None,
agent_id: str | None = None,
app_id: str | None = None,
filters: dict[str, Any] | None = None,
top_k: int | None = None
) -> dict[str, list[ChatMessage]]
```
Retrieve memories matching the query from Mem0.
**Parameters:**
- **query** (str | None) – Text query used to search for relevant memories. Pass `None` to retrieve all memories matching
the scope.
- **user_id** (str | None) – User ID to scope the search.
- **run_id** (str | None) – Run ID to scope the search.
- **agent_id** (str | None) – Agent ID to scope the search.
- **app_id** (str | None) – App ID to scope the search.
- **filters** (dict\[str, Any\] | None) – Haystack-style filters to apply. When provided with ID parameters, they are combined.
Mem0 requires entity IDs inside filters and supports a fixed set of native fields and operators:
[Search Memories API](https://docs.mem0.ai/api-reference/memory/search-memories) and
[Memory Filters](https://docs.mem0.ai/platform/features/v2-memory-filters). Fields that are not native
Mem0 filter fields are treated as Mem0 metadata fields.
- **top_k** (int | None) – Maximum number of memories to return. Overrides the init-time default.
**Returns:**
- dict\[str, list\[ChatMessage\]\] – Dictionary with key `memories` containing a list of ChatMessage objects. User-provided
Mem0 metadata is included in each message's meta. Mem0 retrieval fields such as `memory_id`, `user_id`,
`score`, and timestamps are included under `meta["mem0"]`.
#### to_dict
```python
to_dict() -> dict[str, Any]
```
Serialize this component to a dictionary.
#### from_dict
```python
from_dict(data: dict[str, Any]) -> Mem0MemoryRetriever
```
Deserialize this component from a dictionary.
## haystack_integrations.components.writers.mem0.writer
### Mem0MemoryWriter
Writes ChatMessage objects as memories to a Mem0MemoryStore.
Use this component in a Haystack Pipeline to persist conversation messages.
Scoping IDs (`user_id`, `run_id`, `agent_id`, `app_id`) are runtime parameters so the
same pipeline instance can serve multiple users or agents. The `infer` setting controls whether
Mem0 extracts memories from messages or stores message text as-is.
### Usage example
```python
from haystack.dataclasses import ChatMessage
from haystack_integrations.components.writers.mem0 import Mem0MemoryWriter
from haystack_integrations.memory_stores.mem0 import Mem0MemoryStore
store = Mem0MemoryStore()
writer = Mem0MemoryWriter(memory_store=store, infer=False)
result = writer.run(
messages=[ChatMessage.from_user("Alice prefers concise Python examples.")],
user_id="alice",
)
print(result["memories_written"])
```
#### __init__
```python
__init__(*, memory_store: Mem0MemoryStore, infer: bool = True) -> None
```
Initialize the Mem0MemoryWriter.
**Parameters:**
- **memory_store** (Mem0MemoryStore) – The Mem0MemoryStore instance to write memories to.
- **infer** (bool) – If True, Mem0 extracts memories from messages. If False, Mem0 stores message text as-is.
#### run
```python
run(
messages: list[ChatMessage],
*,
user_id: str | None = None,
run_id: str | None = None,
agent_id: str | None = None,
app_id: str | None = None
) -> dict[str, int]
```
Write messages as memories to the Mem0 store.
**Parameters:**
- **messages** (list\[ChatMessage\]) – List of ChatMessage objects to store.
- **user_id** (str | None) – User ID to scope the stored memories.
- **run_id** (str | None) – Run ID to scope the stored memories.
- **agent_id** (str | None) – Agent ID to scope the stored memories.
- **app_id** (str | None) – App ID to scope the stored memories.
**Returns:**
- dict\[str, int\] – Dictionary with key `memories_written` containing the count of stored memory items.
#### to_dict
```python
to_dict() -> dict[str, Any]
```
Serialize this component to a dictionary.
#### from_dict
```python
from_dict(data: dict[str, Any]) -> Mem0MemoryWriter
```
Deserialize this component from a dictionary.
## haystack_integrations.memory_stores.mem0.errors
### Mem0MemoryStoreError
Bases: RuntimeError
Raised when a Mem0 API operation fails.
## haystack_integrations.memory_stores.mem0.memory_store
### Mem0MemoryStore
A memory store backed by the Mem0 cloud API.
Stores and retrieves ChatMessage-based memories scoped by user_id, run_id, agent_id, or app_id.
The Mem0 client is created lazily on first use (or explicitly via warm_up()).
Requires a Mem0 API key set via the MEM0_API_KEY environment variable or passed explicitly.
#### __init__
```python
__init__(*, api_key: Secret = Secret.from_env_var('MEM0_API_KEY')) -> None
```
Initialize the Mem0 memory store.
The Mem0 client is not created until warm_up() is called (or the first method that
needs the client is invoked).
**Parameters:**
- **api_key** (Secret) – The Mem0 API key. Defaults to the MEM0_API_KEY environment variable.
#### warm_up
```python
warm_up() -> None
```
Create the Mem0 client. Called automatically on first use if not called explicitly.
Calling this method explicitly is useful when you want to validate the API key
or pre-connect before the first pipeline run.
#### client
```python
client: MemoryClient
```
Return the initialized client, calling warm_up() if necessary.
#### to_dict
```python
to_dict() -> dict[str, Any]
```
Serialize the store configuration to a dictionary.
#### from_dict
```python
from_dict(data: dict[str, Any]) -> Mem0MemoryStore
```
Deserialize the store from a dictionary.
#### add_memories
```python
add_memories(
*,
messages: list[ChatMessage],
user_id: str | None = None,
run_id: str | None = None,
agent_id: str | None = None,
app_id: str | None = None,
infer: bool = True,
**kwargs: Any
) -> list[dict[str, Any]]
```
Add ChatMessage memories to Mem0.
**Parameters:**
- **messages** (list\[ChatMessage\]) – List of ChatMessage objects to store as memories.
- **user_id** (str | None) – User ID to scope these memories.
- **run_id** (str | None) – Run ID to scope these memories.
- **agent_id** (str | None) – Agent ID to scope these memories. Required for Mem0 to store assistant messages.
- **app_id** (str | None) – App ID to scope these memories.
- **infer** (bool) – If True, Mem0 extracts memories from messages. If False, Mem0 stores message text as-is.
- **kwargs** (Any) – Additional keyword arguments forwarded to the Mem0 client add method.
Note: ChatMessage.meta is ignored because Mem0 doesn't support per-message metadata.
Pass `metadata` as a kwarg to attach metadata to the whole batch instead.
**Returns:**
- list\[dict\[str, Any\]\] – List of objects with `memory_id` and `memory` text for each stored memory.
**Raises:**
- Mem0MemoryStoreError – If the Mem0 API call fails.
#### search_memories
```python
search_memories(
*,
query: str | None = None,
filters: dict[str, Any] | None = None,
top_k: int = 5,
user_id: str | None = None,
run_id: str | None = None,
agent_id: str | None = None,
app_id: str | None = None,
**kwargs: Any
) -> list[ChatMessage]
```
Search for memories in Mem0.
Either `filters` or at least one of `user_id`, `run_id`, `agent_id`, or `app_id` must be provided.
When both `filters` and IDs are provided, they are combined with an `AND` condition.
**Parameters:**
- **query** (str | None) – Text query to search. If omitted, returns all memories matching the scope.
- **filters** (dict\[str, Any\] | None) – Haystack-style filters to apply. See
[Haystack metadata filtering](https://docs.haystack.deepset.ai/docs/metadata-filtering).
Mem0 requires entity IDs inside filters and supports a fixed set of native fields and operators:
[Search Memories API](https://docs.mem0.ai/api-reference/memory/search-memories) and
[Memory Filters](https://docs.mem0.ai/platform/features/v2-memory-filters).
Fields that are not native Mem0 filter fields are treated as Mem0 metadata fields.
- **top_k** (int) – Maximum number of results to return.
- **user_id** (str | None) – User ID to scope the search.
- **run_id** (str | None) – Run ID to scope the search.
- **agent_id** (str | None) – Agent ID to scope the search.
- **app_id** (str | None) – App ID to scope the search.
- **kwargs** (Any) – Additional keyword arguments forwarded to the Mem0 client.
**Returns:**
- list\[ChatMessage\] – List of ChatMessage (system role) objects containing the retrieved memories. User-provided
Mem0 metadata is included in each message's meta. Mem0 retrieval fields such as `memory_id`, `user_id`,
`score`, and timestamps are included under `meta["mem0"]`.
**Raises:**
- Mem0MemoryStoreError – If the Mem0 API call fails.
## haystack_integrations.tools.mem0.retriever_tool
### Mem0MemoryRetrieverTool
Bases: Tool
A tool that searches a Mem0MemoryStore for memories.
The `user_id` is injected at runtime from Agent State via `inputs_from_state`,
so a single tool instance can serve many users. The LLM only sees `query` and `top_k` by default.
If the LLM omits `query` or passes `None`, Mem0 returns all memories matching the injected scope.
Pass a custom `inputs_from_state` mapping to inject other supported Mem0 entity IDs such as
`run_id`, `agent_id`, or `app_id`. The mapping keys are Agent State keys and the values are this
tool's parameter names. For example, use
`inputs_from_state={"user_id": "user_id", "session_id": "run_id"}` to pass `state["session_id"]`
to the tool's `run_id` parameter at runtime.
### Usage example
```python
from haystack.components.agents import Agent
from haystack.components.generators.chat import OpenAIChatGenerator
from haystack.dataclasses import ChatMessage
from haystack_integrations.memory_stores.mem0 import Mem0MemoryStore
from haystack_integrations.tools.mem0 import Mem0MemoryRetrieverTool
store = Mem0MemoryStore()
retrieve_memories = Mem0MemoryRetrieverTool(memory_store=store, top_k=5)
agent = Agent(
chat_generator=OpenAIChatGenerator(model="gpt-4o-mini"),
tools=[retrieve_memories],
state_schema={"user_id": {"type": str}, "session_id": {"type": str}},
)
# The Agent can call retrieve_memories with a query for targeted recall,
# or without a query when it needs all scoped memories.
result = agent.run(
messages=[ChatMessage.from_user("What do you remember about me?")],
user_id="alice",
session_id="chat-42",
)
print(result["last_message"].text)
```
#### __init__
```python
__init__(
*,
memory_store: Mem0MemoryStore,
top_k: int = 5,
name: str = "retrieve_memories",
description: str = _DEFAULT_DESCRIPTION,
parameters: dict[str, Any] = _PARAMETERS,
inputs_from_state: dict[str, str] = _DEFAULT_INPUTS_FROM_STATE
) -> None
```
Initialize the Mem0MemoryRetrieverTool.
**Parameters:**
- **memory_store** (Mem0MemoryStore) – The Mem0MemoryStore instance to query.
- **top_k** (int) – Default maximum number of memories to return. The LLM may override this.
- **name** (str) – Tool name exposed to the LLM.
- **description** (str) – Tool description exposed to the LLM.
- **parameters** (dict\[str, Any\]) – JSON schema for the parameters exposed to the LLM. Defaults to optional `query` and `top_k`.
- **inputs_from_state** (dict\[str, str\]) – Mapping from Agent State keys to this tool's parameter names.
Defaults to `{"user_id": "user_id"}`, which injects `state["user_id"]` into the `user_id`
parameter. To pass more Mem0 IDs at runtime, add the state fields to the Agent's
`state_schema` and map them to the corresponding tool parameters, for example
`{"user_id": "user_id", "session_id": "run_id", "agent_name": "agent_id", "app_name": "app_id"}`.
#### warm_up
```python
warm_up() -> None
```
Initialize the Mem0 client. Subsequent calls are no-ops.
#### retrieve
```python
retrieve(
query: str | None = None,
*,
top_k: int | None = None,
user_id: str | None = None,
run_id: str | None = None,
agent_id: str | None = None,
app_id: str | None = None
) -> str
```
Retrieve memories relevant to a query, or all memories when no query is provided.
**Parameters:**
- **query** (str | None) – Text query used to search for relevant memories. If omitted or `None`, all memories matching
the scope are returned.
- **top_k** (int | None) – Maximum number of memories to return for query searches. Overrides the tool default.
- **user_id** (str | None) – User ID to scope the search. Injected from Agent State by default.
- **run_id** (str | None) – Run ID to scope the search. Can be injected with a custom `inputs_from_state` mapping.
- **agent_id** (str | None) – Agent ID to scope the search. Can be injected with a custom `inputs_from_state` mapping.
- **app_id** (str | None) – App ID to scope the search. Can be injected with a custom `inputs_from_state` mapping.
**Returns:**
- str – Retrieved memories formatted for the Agent, or a message when no memories were found.
#### to_dict
```python
to_dict() -> dict[str, Any]
```
Serialize this tool to a dictionary.
#### from_dict
```python
from_dict(data: dict[str, Any]) -> Mem0MemoryRetrieverTool
```
Deserialize this tool from a dictionary.
## haystack_integrations.tools.mem0.writer_tool
### Mem0MemoryWriterTool
Bases: Tool
A tool that writes a memory to a Mem0MemoryStore.
The `user_id` is injected at runtime from Agent State via `inputs_from_state`,
so a single tool instance can serve many users. The LLM only sees `text` and `infer`.
Pass a custom `inputs_from_state` mapping to inject other supported Mem0 entity IDs such as
`run_id`, `agent_id`, or `app_id`. The mapping keys are Agent State keys and the values are this
tool's parameter names. For example, use
`inputs_from_state={"user_id": "user_id", "session_id": "run_id"}` to pass `state["session_id"]`
to the tool's `run_id` parameter at runtime.
### Usage example
```python
from haystack.components.agents import Agent
from haystack.components.generators.chat import OpenAIChatGenerator
from haystack.dataclasses import ChatMessage
from haystack_integrations.memory_stores.mem0 import Mem0MemoryStore
from haystack_integrations.tools.mem0 import Mem0MemoryWriterTool
store = Mem0MemoryStore()
store_memory = Mem0MemoryWriterTool(memory_store=store)
agent = Agent(
chat_generator=OpenAIChatGenerator(model="gpt-4o-mini"),
tools=[store_memory],
state_schema={"user_id": {"type": str}, "session_id": {"type": str}},
)
result = agent.run(
messages=[ChatMessage.from_user("Remember that I prefer concise Python examples.")],
user_id="alice",
session_id="chat-42",
)
print(result["last_message"].text)
```
#### __init__
```python
__init__(
*,
memory_store: Mem0MemoryStore,
name: str = "store_memory",
description: str = _DEFAULT_DESCRIPTION,
parameters: dict[str, Any] = _PARAMETERS,
inputs_from_state: dict[str, str] = _DEFAULT_INPUTS_FROM_STATE
) -> None
```
Initialize the Mem0MemoryWriterTool.
**Parameters:**
- **memory_store** (Mem0MemoryStore) – The Mem0MemoryStore instance to write to.
- **name** (str) – Tool name exposed to the LLM.
- **description** (str) – Tool description exposed to the LLM.
- **parameters** (dict\[str, Any\]) – JSON schema for the parameters exposed to the LLM. Defaults to `text` and `infer`.
- **inputs_from_state** (dict\[str, str\]) – Mapping from Agent State keys to this tool's parameter names.
Defaults to `{"user_id": "user_id"}`, which injects `state["user_id"]` into the `user_id`
parameter. To pass more Mem0 IDs at runtime, add the state fields to the Agent's
`state_schema` and map them to the corresponding tool parameters, for example
`{"user_id": "user_id", "session_id": "run_id", "agent_name": "agent_id", "app_name": "app_id"}`.
#### warm_up
```python
warm_up() -> None
```
Initialize the Mem0 client. Subsequent calls are no-ops.
#### store
```python
store(
text: str,
*,
infer: bool = False,
user_id: str | None = None,
run_id: str | None = None,
agent_id: str | None = None,
app_id: str | None = None
) -> str
```
Store text as a memory.
**Parameters:**
- **text** (str) – The information to store as a memory.
- **infer** (bool) – If True, Mem0 extracts memories from the text. If False, Mem0 stores the text as-is.
- **user_id** (str | None) – User ID to scope the stored memory. Injected from Agent State by default.
- **run_id** (str | None) – Run ID to scope the stored memory. Can be injected with a custom `inputs_from_state` mapping.
- **agent_id** (str | None) – Agent ID to scope the stored memory. Can be injected with a custom `inputs_from_state` mapping.
- **app_id** (str | None) – App ID to scope the stored memory. Can be injected with a custom `inputs_from_state` mapping.
**Returns:**
- str – A string indicating how many memory items were stored.
#### to_dict
```python
to_dict() -> dict[str, Any]
```
Serialize this tool to a dictionary.
#### from_dict
```python
from_dict(data: dict[str, Any]) -> Mem0MemoryWriterTool
```
Deserialize this tool from a dictionary.