openmemory
Docs

Benchmarks

How well openmemory's recall finds the right conversation on the LongMemEval benchmark, what was and wasn't measured, and how to reproduce it.

Measured on 2 November 2026 with LongMemEval, a public benchmark of 500 questions, each with about 50 past conversations to search through. Unanswerable questions are left out, leaving 470.

What it measures

Each question gets a fresh space with one memory per conversation turn, about 490 in all, and then runs the real recall. A question counts as a hit when a turn from a conversation holding the answer is in the top results.

Results

SearchQuestionsTop 1Top 5Top 10
Words only47085.5%94.0%96.2%
Words only, without word forms47084.9%93.2%96.2%
Words only20, evenly spaced90%100%100%
Words and meaningthe same 20100%100%100%
Meaning onlythe same 2095%95%95%
Words and meaning12 of the 28 questions words alone missed33.3%50%75%

Meaning search used @cf/baai/bge-small-en-v1.5 with a similarity cut-off of 0.52.

How to read this

  • There is no full score for words and meaning. Embedding all 470 question sets would pass the service's free daily allowance many times over, so that mode ran on samples.
  • This is retrieval, not answer accuracy. Nothing here answers the question. Benchmarks that have an LLM answer and a second LLM judge the result measure something harder, so don't compare these numbers with theirs.
  • Questions keyword search missed are the hard ones. The 50% is what meaning search adds on those; it isn't a score for all questions.
  • It isn't how openmemory is meant to be used. Agents store short facts, and this stores whole conversation turns. The numbers measure search, not an agent's memory end to end.
  • Weakest area: preference questions, with 19 of 30 in the top 5 on words alone. They often share few words with the conversation.

Run it yourself

The script is apps/api/scripts/bench-longmemeval.ts. Download longmemeval_s from the dataset, then from apps/api:

bash
pnpm bench longmemeval_s.json --mode keyword

For meaning search, it calls Workers AI, so set CLOUDFLARE_ACCOUNT_ID and CLOUDFLARE_API_TOKEN. Embeddings are cached on disk, and --max-neurons stops the run before it passes a budget:

bash
pnpm bench longmemeval_s.json --mode hybrid --sample 20 --cache ./embed-cache --max-neurons 4500