Compare

Mem0 vs Letta vs Zep vs Ujex Recall: Picking an Agent Memory Layer

Akshay Sarode
Verdict

Mem0: managed, vector-first, dev-friendly drop-in. Letta: full agent framework with three-tier memory built in. Zep: knowledge-graph memory, opinionated retrieval. Ujex Recall: markdown-first, your-bucket-is-the-source-of-truth, BM25 + Vertex AI vectors. Pick based on framework needs and self-host requirements.

Pick the wrong memory layer and you'll rip it out in three months. Vectorize's writeup covers Mem0 vs Letta in detail; Letta's own essay on agent memory is canonical reading. This post adds Zep and Ujex Recall to the matrix and gives the pick-by-use-case rule.

The four shapes

Mem0

A memory service. SDK in Python and JS. Vectors via your choice of store. Hosted or self-hosted. The shape: agent calls memory.add and memory.search as plain functions; Mem0 handles chunking, embeddings, retrieval. Opinions about deduplication and update vs append.

Letta (formerly MemGPT)

An agent runtime with memory baked in. Three tiers: Core (in-context, RAM), Recall (searchable conversation, disk cache), Archival (long-term, cold storage). Letta is the agent loop, not just the memory. Self-hostable; managed Letta Code product available.

Zep

A knowledge-graph memory. Extracts entities and relations from conversation. Retrieval is graph-walk + vector. Hosted; SDKs in major languages.

Ujex Recall

Markdown files in your Cloud Storage bucket are the source of truth. Firestore holds derived metadata + vector index (Vertex AI embeddings). BM25 search baseline; vector retrieval optional. The agent reads/writes name.md files with frontmatter. Apache-2.0 SDKs.

Decision matrix

Mem0LettaZepUjex Recall
Memory shapeVector-firstThree-tier (Core/Recall/Archival)Knowledge graphMarkdown files + BM25 + vectors
Need an agent framework?No (your loop)Yes (Letta is the framework)No (your loop)No (your loop)
Self-hostable✓ Free, full feature✓ (paid)✓ Apache-2.0
Managed offering✓ Letta Code✓ Free tier
Data ownershipYour store / theirsYour DB / theirsTheirs (managed)Your bucket (always)
SDK languagesPython, JSPython (primary)ManyPython, Go, TypeScript
License (SDK)OpenApache-2.0Open client SDKsApache-2.0
Frontmatter / human-readableInternal format✓ (just .md)

Pick Mem0 if

Pick Letta if

Pick Zep if

Pick Ujex Recall if

The migration question

All four have export paths to plain JSON. Migrating between them is "export, transform, re-ingest." Vector embeddings will need recomputation (different embedding models). Plan for an afternoon, not a week.

What about Hindsight, SuperMemory, MemClaw?

Vectorize's Letta-alternatives roundup covers Hindsight, Mem0, Zep, SuperMemory. Hindsight in particular is the closest philosophical sibling to Ujex Recall — pure memory service, no opinion about your loop. MemClaw is newer; haven't tested in depth.

FAQ

Can I use Mem0 inside LangGraph?

Yes. Mem0 is a tool/library; LangGraph is the orchestration. They compose.

Does Letta run on its own?

Yes — Letta is a full runtime. You don't bring a separate framework.

Is Ujex Recall multi-tenant?

Yes — at the Pod level. Multiple agents per pod each get their own bucket prefix; cross-pod isolation is enforced via Firestore security rules + IAM.

What about token cost?

All four bill embeddings against your model provider. Storage is separate. Letta's three-tier model can save context-window tokens by paging Recall in/out; the others don't have that opinion.