mem0

Mem0 Platform SDK for adding persistent memory to AI applications. TRIGGER when: user mentions "mem0", "MemoryClient", "memory layer", "remember user preferences", "persistent context", "personalization", or needs to add long-term memory to chatbots, agents, or AI apps. Covers Python SDK (mem0ai), TypeScript SDK (mem0ai), and framework integrations (LangChain, CrewAI, OpenAI Agents SDK, Pipecat, LlamaIndex, AutoGen, LangGraph). Also covers the open-source self-hosted Memory class. This is the DEFAULT mem0 skill for ambiguous queries. DO NOT TRIGGER when: user asks about CLI commands, terminal usage, or shell scripts (use mem0-cli), or Vercel AI SDK / @mem0/vercel-ai-provider / createMem0 (use mem0-vercel-ai-sdk).

Install
npx skills add 'https://github.com/mem0ai/mem0/tree/main/skills/mem0'
Download bundle ↓
main · 0df3e4bScanned 2026-09-17

Contributors

GitHub-linked commit authors for this SKILL.md at the saved revision. Co-authors and history before file renames are not included.

File history ↗
View on GitHub
← Back to SKILL.md

Mem0 SDK Guide

Complete SDK reference for Python and TypeScript. All methods use MemoryClient (Platform API).

For language-specific deep references (including OSS): See client/python.md and client/node.md. For Python vs TypeScript differences: client/differences.md.

Initialization

Python:

from mem0 import MemoryClient
client = MemoryClient(api_key="m0-your-api-key")

Python (Async):

from mem0 import AsyncMemoryClient
client = AsyncMemoryClient(api_key="m0-your-api-key")

TypeScript:

import MemoryClient from 'mem0ai';
const client = new MemoryClient({ apiKey: 'm0-your-api-key' });

Constructor accepts apiKey (required) and host (optional, default: https://api.mem0.ai).


add() -- Store Memories

Python:

messages = [
    {"role": "user", "content": "I'm a vegetarian and allergic to nuts."},
    {"role": "assistant", "content": "Got it! I'll remember that."}
]
client.add(messages, user_id="alice")

# With metadata
client.add(messages, user_id="alice", metadata={"source": "onboarding"})

TypeScript:

await client.add(messages, { userId: "alice" });
await client.add(messages, { userId: "alice", metadata: { source: "onboarding" } });

Parameters

NameTypeDescription
messagesarray[{"role": "user", "content": "..."}]
user_idstringUser identifier (recommended)
agent_idstringAgent identifier
run_idstringSession identifier
metadataobjectCustom key-value pairs
inferbooleanIf false, store raw text without inference (default: true)

Advanced Add Options

# Agent + session scoping
client.add(messages, user_id="alice", agent_id="nutrition-agent", run_id="session-456")

# Raw text -- skip LLM inference
client.add(
    [{"role": "user", "content": "User prefers dark mode."}],
    user_id="alice",
    infer=False,
)

search() -- Find Memories

Python:

results = client.search("dietary preferences?", filters={"user_id": "alice"})

# With filters and reranking
results = client.search(
    query="work experience",
    filters={"AND": [{"user_id": "alice"}, {"categories": {"contains": "professional_details"}}]},
    top_k=5,
    rerank=True,
    threshold=0.5
)

TypeScript:

const results = await client.search("dietary preferences", { filters: { user_id: "alice" } });
const results = await client.search("work experience", {
    filters: { AND: [{ user_id: "alice" }, { categories: { contains: "professional_details" } }] },
    topK: 5,
    rerank: true,
});

Parameters

NameTypeDescription
querystringNatural language search query
filtersobjectFilter object (AND/OR operators). Use {"user_id": "..."} to filter by user
top_knumberNumber of results (default: 10 for Platform)
rerankbooleanEnable reranking for better relevance (default: false)
thresholdnumberMinimum similarity score (default: 0.1)

Common Filter Patterns

Python:

# Single user filter
filters={"user_id": "alice"}

# OR across agents
filters={"OR": [{"user_id": "alice"}, {"agent_id": {"in": ["travel-agent", "sports-agent"]}}]}

# Category filtering (partial match)
filters={"AND": [{"user_id": "alice"}, {"categories": {"contains": "finance"}}]}

# Category filtering (exact match)
filters={"AND": [{"user_id": "alice"}, {"categories": {"in": ["personal_information"]}}]}

# Wildcard (match any non-null run)
filters={"AND": [{"user_id": "alice"}, {"run_id": "*"}]}

# Date range
filters={"AND": [
    {"user_id": "alice"},
    {"created_at": {"gte": "2024-01-01T00:00:00Z"}},
    {"created_at": {"lt": "2024-02-01T00:00:00Z"}}
]}

# Exclude categories with NOT
filters={"AND": [{"user_id": "user_123"}, {"NOT": {"categories": {"in": ["spam", "test"]}}}]}

# Multi-dimensional query
filters={"AND": [
    {"user_id": "user_123"},
    {"keywords": {"icontains": "invoice"}},
    {"categories": {"in": ["finance"]}},
    {"created_at": {"gte": "2024-01-01T00:00:00Z"}}
]}

TypeScript:

// Single user filter
filters: { user_id: "alice" }

// OR across agents
filters: { OR: [{ user_id: "alice" }, { agent_id: { in: ["travel-agent", "sports-agent"] } }] }

// Category filtering (partial match)
filters: { AND: [{ user_id: "alice" }, { categories: { contains: "finance" } }] }

// Category filtering (exact match)
filters: { AND: [{ user_id: "alice" }, { categories: { in: ["personal_information"] } }] }

get() / getAll() -- Retrieve Memories

Python:

# Single memory by ID
memory = client.get(memory_id="ea925981-...")

# All memories for a user
memories = client.get_all(filters={"user_id": "alice"})

# With date range
memories = client.get_all(
    filters={"AND": [
        {"user_id": "alex"},
        {"created_at": {"gte": "2024-07-01", "lte": "2024-07-31"}}
    ]}
)

TypeScript:

const memory = await client.get("ea925981-...");
const memories = await client.getAll({ filters: { user_id: "alice" } });

Note: get_all requires at least one of user_id, agent_id, app_id, or run_id in filters.


update() -- Modify Memories

Python:

client.update(memory_id="ea925981-...", text="Updated: vegan since 2024")
client.update(memory_id="ea925981-...", text="Updated", metadata={"verified": True})

TypeScript:

await client.update("ea925981-...", { text: "Updated: vegan since 2024" });

delete() / deleteAll() -- Remove Memories

Python:

client.delete(memory_id="ea925981-...")
client.delete_all(user_id="alice")  # Irreversible bulk delete

TypeScript:

await client.delete("ea925981-...");
await client.deleteAll({ userId: "alice" });

history() -- Track Changes

Python:

history = client.history(memory_id="ea925981-...")
# Returns: [{previous_value, new_value, action, timestamps}]

TypeScript:

const history = await client.history("ea925981-...");

Batch Operations (TypeScript)

// Batch update
await client.batchUpdate([
    { memoryId: "uuid-1", text: "Updated text" },
    { memoryId: "uuid-2", text: "Another updated text" },
]);

// Batch delete
await client.batchDelete(["uuid-1", "uuid-2", "uuid-3"]);

Additional Methods

# List all users/agents/sessions with memories
users = client.users()

# Delete a user/agent entity
client.delete_users(user_id="alice")

# Submit feedback on a memory
client.feedback(memory_id="...", feedback="POSITIVE", feedback_reason="Accurate extraction")

# Export memories
export = client.create_memory_export(filters={"AND": [{"user_id": "alice"}]})
data = client.get_memory_export(memory_export_id=export["id"])

Common Pitfalls

  1. Entity cross-filtering fails silently -- AND with user_id + agent_id returns empty. Use OR.
  2. SQL operators rejected -- use gte, lt, etc. Not >=, <.
  3. Metadata filtering is limited -- only top-level keys with eq, contains, ne.
  4. Wildcard * excludes null -- only matches non-null values.
  5. Default threshold is 0.1 -- increase for stricter matching.
  6. Async processing -- memories process asynchronously. Wait 2-3s after add() before searching.

Naming Conventions

Python uses snake_case everywhere (user_id, memory_id, get_all). TypeScript uses camelCase for methods (getAll, deleteAll, batchUpdate) and top-level parameters (userId, topK, pageSize), but filter keys use snake_case (user_id, agent_id).


v2 to v3 Migration

Breaking Changes in v3

1. Entity IDs in search() and getAll()

v3 requires entity IDs (user_id, agent_id, run_id) inside filters instead of as top-level parameters:

# v2 (deprecated)
client.search("query", user_id="alice")
client.get_all(user_id="alice")

# v3
client.search("query", filters={"user_id": "alice"})
client.get_all(filters={"user_id": "alice"})
// v2 (deprecated)
await client.search("query", { user_id: "alice" });
await client.getAll({ user_id: "alice" });

// v3
await client.search("query", { filters: { user_id: "alice" } });
await client.getAll({ filters: { user_id: "alice" } });

2. TypeScript Parameter Naming

v3 TypeScript uses camelCase for all parameters:

v2v3
user_iduserId
agent_idagentId
run_idrunId
top_ktopK
page_sizepageSize

3. Default Values Changed

Parameterv2 Defaultv3 Default
threshold0.30.1
rerank(not specified)false

4. Removed Parameters

The following parameters are no longer supported:

ParameterStatus
enable_graphRemoved from add/search/getAll
keyword_searchRemoved from search
filter_memoriesRemoved
immutableRemoved from add
expiration_dateRemoved from add
includesRemoved from add
excludesRemoved from add
async_modeRemoved from add
Referenced from SKILL.md