COMPARE · COMPARISON: AGENT MEMORY

AI agent memory compared: real tests on 7 open-source projects

AUTHOR · XERJ documentation team · REVIEWED BY · XERJ engineering team · PUBLISHED · 2026-10-31 · UPDATED · 2026-10-31
SHORT ANSWER · UPDATED 2026-10-31

Which open-source agent memory recalls best? With the same MiniLM model, XERJ semantic recall found the right memory in the top 5 for 94.7% of 75 questions, ReMe and XERJ hybrid 93.3%, mcp-memory-service 89.3% and mem0 88.0%. Keyword only setups scored 71% to 75%. Only XERJ with a recency weight ranked changed facts correctly.

Key number: Same data for every system: 85 memories and 75 questions, scored by one script. Embedding systems all used all-MiniLM-L6-v2 on CPU. (as of 2026-10-31 · source: github.com/xerj-org/xerj/tree/main/benchmarks/agent-memory)

TL;DR We ran seven open-source agent memory projects on the same 85 memories and 75 questions. With neural embeddings on, XERJ, ReMe, mcp-memory-service and mem0 all found the right memory in the top 5 for 88% to 95% of questions. Keyword only setups found 71% to 75%. Changed facts were the hard part: only XERJ with a recency weight reliably ranked the new value first.

Diagram

How every system was tested

  1. 1. Same data85 memoriesNotes about one user and one project, written in 6 sessions. 15 facts change in later sessions.
  2. 2. Same callsOne adapter eachA short script calls the project's own write and search API with its default settings.
  3. 3. Same questions75 recalls, top 525 with the same words, 25 reworded, 15 about changed facts, 10 near misses.
  4. 4. Same scoringOne score scriptDoes a returned memory hold the answer? For a changed fact, does the new value rank above the old?
Every adapter, the data set and the scoring script are in benchmarks/agent-memory in the XERJ repository. Systems that need embeddings all used all-MiniLM-L6-v2 on CPU, so the model is the same and the design is what differs.
PASTE THIS TO YOUR AI AGENT — IT DOES THE REST Act as a coding agent. Read https://xerj.org/llms.txt, install XERJ, start a local node with --embed-mode neural, store ten facts about this project with POST /_memory/project, change two of them, then recall each fact with BM25, semantic and hybrid recall and tell me which mode found the most and whether the new value of each changed fact came first.
RUN THIS XERJ COMMAND curl -fsSL https://xerj.org/get | sh Install the single XERJ binary.
RUN THIS XERJ COMMAND xerj --embed-mode neural Start a local node with the built-in MiniLM embedder, needed for semantic and hybrid recall.
RUN THIS XERJ COMMAND curl -s -XPOST 'http://127.0.0.1:9200/_memory/project/_recall' -H 'content-type: application/json' -d '{"query":"which port does the API use","hybrid":true,"recency_weight":0.3,"k":5}' Hybrid recall that favors newer memories, the setting that won the update test.

Results

Top 5 means the right memory was in the first five results. Reworded means the question used different words from the memory. Newest first counts how often the new value of a changed fact ranked above the old one. Times are the median, in milliseconds.

Recorded run, 75 questions

Did the right memory come back?

XERJOther projects

Right answer in the top 5, all questions, %

  • XERJ, semantic, MiniLM94.7
  • XERJ, hybrid, MiniLM93.3
  • ReMe, hybrid, MiniLM93.3
  • mcp-memory-service, default, MiniLM89.3
  • Mem0, infer=False, MiniLM88.0
  • Mem0, infer=True, Qwen2.5 3B86.7
  • MemPalace, default, MiniLM84.0
  • agentmemory, default, no key74.7
  • XERJ, BM25, default recall73.3
  • ReMe, default, BM2570.7
  • XERJ, hybrid + recency 0.368.0
  • memvid, default, lexical1.3

New value ranked above the old one, 15 updated facts, %

  • XERJ, hybrid + recency 0.393.3
  • Mem0, infer=True, Qwen2.5 3B20.0
  • ReMe, default, BM2520.0
  • XERJ, BM25, default recall13.3
  • XERJ, semantic, MiniLM13.3
  • XERJ, hybrid, MiniLM13.3
  • Mem0, infer=False, MiniLM13.3
  • MemPalace, default, MiniLM13.3
  • ReMe, hybrid, MiniLM13.3
  • agentmemory, default, no key13.3
  • mcp-memory-service, default, MiniLM6.7
  • memvid, default, lexical0.0
Drawn from out/summary.csv in benchmarks/agent-memory. Bars start at 0 and the full width is 100%. Every setup got the same 85 memories in the same order and the same 75 questions, with k = 5.

Sort or filter the full table. The keyword and embedding filters split the setups by how they search.

Try it: sort and filter the results

12 setups, 75 questions each

SystemSetupTop 1 %Top 5 %Reworded %Newest first %Write msQuery msLLM calls per writePackages
XERJBM25, default recall54.773.324.013.311.33.800
XERJsemantic, MiniLM65.394.784.013.37.26.300
XERJhybrid, MiniLM60.093.384.013.36.56.500
XERJhybrid + recency 0.344.068.036.093.36.56.800
Mem0infer=False, MiniLM64.088.068.013.310.222.40.050
Mem0infer=True, Qwen2.5 3B64.086.772.020.01652329.11.050
MemPalacedefault, MiniLM57.384.056.013.321.222.7086
ReMedefault, BM2553.370.720.020.02.71.40138
ReMehybrid, MiniLM61.393.380.013.32.612.00138
agentmemorydefault, no key53.374.728.013.34.44.80143
mcp-memory-servicedefault, MiniLM64.089.384.06.716.716.7072
memviddefault, lexical1.31.30.00.067.30.302

Runs in your browser and sends nothing. Click a column name to sort. Top 1 and Top 5: share of the 75 questions where a returned memory holds the right answer at rank 1 or in the first five. Reworded: the 25 questions asked in other words. Newest first: the 15 questions about a fact that changed, where the new value must rank above the old one. Times are medians on one shared 8 core box. Packages: resolved install size from deps.json. Raw data is in benchmarks/agent-memory in the XERJ repository.

The same table as plain text:

SystemSetupTop 1 %Top 5 %Reworded %Newest first %Write msQuery msLLM calls per write
XERJBM25, default recall54.773.324.013.311.313.770
XERJsemantic, MiniLM65.394.784.013.37.176.290
XERJhybrid, MiniLM60.093.384.013.36.456.490
XERJhybrid + recency 0.344.068.036.093.36.466.780
mem0infer=False, MiniLM64.088.068.013.310.2222.440
mem0infer=True, Qwen2.5 3B64.086.772.020.016522.5829.151
MemPalacedefault, MiniLM57.384.056.013.321.2122.660
ReMedefault, BM2553.370.720.020.02.681.410
ReMehybrid, MiniLM61.393.380.013.32.6211.990
agentmemorydefault, no key53.374.728.013.34.394.750
mcp-memory-servicedefault, MiniLM64.089.384.06.716.6916.740
memviddefault, lexical1.31.30.00.067.330.310

What the numbers say

Where XERJ loses

How we tested

Not tested this round

ProjectWhy not
claude-memBuilt into Claude Code. Hooks and a model write summaries, with no standalone store to call.
HindsightRuns in Docker and calls an LLM on every write.
cogneeBuilds a knowledge graph from each document. Not run in this round.
GraphitiNeeds Neo4j, FalkorDB or Neptune, plus an LLM.
SupermemoryThe local server asks for a model choice on first boot.
TencentDB Agent MemoryNeeds two LLM configurations and a proxy.
LettaA stateful agent harness, not a memory API you call.
MemoriNeeds a Memori API key plus an LLM key.
memUNeeds a cloud key or an embedding provider, OpenAI by default.
EverOSNeeds an OpenRouter API key.
MemOSNeeds a hosted key or Docker with Neo4j and Qdrant.

For mem0 the local 3B model took a median of 16.5 s per write on our CPU machine. Systems that call a model on every write need a GPU for a fair run. We plan to add them in a later round.

Raw data

Everything is in benchmarks/agent-memory: the data set, the adapters, per question results, versions, commit SHAs and the exact commands.

Try it with XERJ

Use the Copy the prompt button and paste it into your coding agent. It installs XERJ, stores ten facts, changes two and tells you which recall mode works best for your project.

Sources checked

All checked on 2026-10-31. Star counts and licenses from the GitHub API. Versions tested: XERJ v1.0.0-rc.100, mem0ai 2.2.1, mempalace 3.11.0, reme-ai 0.4.2.1, agentmemory 0.9.31, mcp-memory-service 12.4.0 and memvid-sdk 2.0.160.

FAQ

Which agent memory scored best?

On finding the right memory in the top 5, XERJ semantic recall led with 94.7%, then XERJ hybrid and ReMe hybrid at 93.3%. The gap between the top systems is small. The bigger gap is between keyword only search and search with embeddings.

Why do most systems fail the update test?

When a fact changes, the old and new notes look almost the same to search. Without a sense of time, the old one ranks first about as often as the new one. Only XERJ with a recency weight put the new value first in 14 of 15 cases, and that setting cost accuracy elsewhere.

Did you test mem0 with its LLM?

Yes. With infer=True and Qwen2.5 3B on llama.cpp, mem0 made 1 LLM call per write. The median write took 16.5 s on our CPU machine. It found 86.7% in the top 5, close to the 88.0% of raw mode.

Why were Letta, Zep, cognee and others not tested?

They need an LLM call on each write, extra services such as a graph database, or a hosted key. We could not run those fairly on the shared CPU machine used for this round. Each one is listed below with the reason.

Can I run the benchmark myself?

Yes. The data set, one adapter per system, the score script and our raw results are in benchmarks/agent-memory in the XERJ repository.

Is the latency comparable to production numbers?

Treat it as a rough guide. All systems ran on one shared 8 core machine, one at a time, with no GPU. Some run in process and some over HTTP, which adds a little time.

Evidence

Related