Kemory · benchmarks
Benchmark · LongMemEval-S oracle

89.6%, end to end,
and here's the method.

Kemory answers 448 of 500 questions correctly on the LongMemEval-S oracle benchmark — measured end to end, through retrieval and generation, judged by an LLM against the reference answer, against the live production deployment. Not a retrieval metric.

Everything below is what we actually ran: the dataset and its configuration, the three phases in detail, the per-category breakdown, the run-to-run variance, and the four caveats that matter when you compare this to anyone else's number — including where the harness is tuned to the benchmark. The harness, the dataset and the raw run output are preserved so the number can be re-derived rather than taken on trust.

The headline

89.6% 448 / 500 End-to-end answer accuracy on the LongMemEval-S oracle set, LLM-judged.
PropertyValue
BenchmarkLongMemEval (ICLR 2025), -S oracle configuration
Questions500, across six question types
Haystack10,960 memories ingested
MetricEnd-to-end answer accuracy — retrieve, generate, then judge against the reference
Reader & judgeLlama-3.3-70B (see caveats — the paper uses GPT-4o as judge)
Retrieval depthPer question type, top-k 10–30; 16.1 memories reaching the reader on average
Run11 August 2026, against the live production deployment, release v3.70.2 (see run history)
HardwareThe production Kemory deployment — a single instance on commodity hardware

By category

Six question types, weighted as the benchmark defines them. Where Kemory is strong and where it isn't:

single-session-assistant98.2%
single-session-user95.7%
knowledge-update92.3%
temporal-reasoning88.0%
multi-session84.2%
single-session-preference83.3%
TypeCorrectAccuracyWhat it tests
single-session-assistant55 / 5698.2%Recalling what the assistant said within one session.
single-session-user67 / 7095.7%Recalling what the user stated within one session.
knowledge-update72 / 7892.3%A fact changed later — does the current value win?
temporal-reasoning117 / 13388.0%Ordering, elapsed time, and counting across dates.
multi-session112 / 13384.2%Evidence spread across several conversations.
single-session-preference25 / 3083.3%Applying a stated preference, scored against a rubric.
Overall448 / 50089.6%
Reading the weak spots honestly

Temporal reasoning and multi-session remain the genuinely hard cases and hold 37 of the 52 remaining misses: both need several memories assembled in the right order, which is a retrieval problem and an arithmetic problem at once. Counting and elapsed-day questions are where most of those errors live. Preference is now the lowest category at 83.3%, and it remains the fuzziest to score: the rubric rewards applying a taste, not retrieving a fact, so partial credit is a judgement call.

Run history

The same harness, run six times. We publish all six — including the runs that scored lower than the headline — because a single number without its variance is not a result.

RunResultWhat was different
14 Aug 2026 — re-run89.0% (445/500)Release v3.74.0, four releases after the published run; same vault, harness and judge. The question-level diff against the 89.6% run shows 13 fixed / 16 broken, scattered across all six question types with no category pattern — run-to-run noise, and no regression from the intervening releases.
11 Aug 2026 (evening) — current89.6% (448/500)Same day, same vault, same harness and judge as the morning run — the only variable was the deployed release, v3.70.2 (see the note below). This is the published figure.
11 Aug 2026 (morning)88.2% (441/500)First run against the live production deployment over the public API. Self-consistency voting on counting and duration questions — experimental in May — became part of the standard harness. Ingest skipped: the vault was still seeded with the April ingest's 10,960 memories.
28 Apr 2026 — canonical full run87.8% (439/500)Full three-phase run including ingest, on the pre-voting harness.
9 May 2026 — reproduce86.2% (431/500)Ingest phase skipped; the vault was already populated. Same harness, same dataset.
9 May 2026 — experimental88.0% (440/500)First run with self-consistency voting on counting and duration questions — the method change that has since become standard.
What moved the number from 88.2% to 89.6%

Nothing in the benchmark harness changed between the two 11 August runs — the gain came from the product. Release v3.70.1/v3.70.2 fixed how Kemory's unified search fuses results across surfaces (proper reciprocal-rank fusion instead of comparing raw scores across different scales) and tightened deduplication. A question-level diff between the runs shows 20 questions fixed and 13 broken (net +7), with the gains concentrated in multi-session (+8 fixed) and temporal-reasoning (+7 fixed) — exactly the categories that depend on assembling several memories in the right order, which is what a rank-fusion fix should improve. That said: +1.4 points sits inside our stated ±2-point run variance, so while the category pattern points at the retrieval fix rather than noise, a single run can't fully separate the two.

Run-to-run variance is roughly ±2 points on most categories. Multi-session is the most prompt-sensitive and has swung about 7 points between runs. Treat 89.6% as the centre of a range, not a precision measurement — anyone quoting a memory benchmark to a tenth of a point is overstating what these harnesses can resolve.

Relative to the April canonical run, two further things are different, and neither makes it a like-for-like re-run: the harness gained self-consistency voting (a method change), and the target moved from a local instance to the production deployment. What did not change across all six runs: the dataset, the judge, the prompts, and the memories being retrieved against.

The dataset

LongMemEval (ICLR 2025) tests long-term memory in chat assistants: a haystack of prior sessions, then a question whose answer is buried somewhere in it. We use the oracle configuration of LongMemEval-S — the sessions containing the evidence, without the full distractor corpus.

Question typeCount
temporal-reasoning133
multi-session133
knowledge-update78
single-session-user70
single-session-assistant56
single-session-preference30
Total500

A subset carries an abstention marker — questions whose answer is not in the history, where the correct behaviour is to decline rather than invent. A memory system that confabulates scores badly on these by design.

Which configuration, and why it matters

LongMemEval ships in more than one size. The distinction is how much irrelevant history surrounds the evidence:

ConfigurationWhat it contains
Oracle — what we ranOnly the sessions that contain the evidence. Tests whether the system can find and use the right turn.
-S / -MThe evidence plus a large distractor haystack. Also tests resistance to being misled by irrelevant history.

Oracle is a legitimate and widely-reported configuration, and it is the harder-to-fake one in that retrieval still has to pick the right turn out of a real conversation. But it is not the full-haystack test, and a number produced on it should only be set against other oracle numbers. We have not yet published a full-haystack run.

Provenance: the corpus is the official release accompanying the LongMemEval paper (ICLR 2025). We hold it alongside the harness rather than fetching it at run time, so a result stays reproducible even if the upstream mirror moves — and so the exact bytes behind a published number are pinned rather than assumed.

How we ran it

Three phases, each independently resumable — a 500-question run is long enough that restartability matters.

PHASE 1

Ingest

Every haystack session is written into Kemory through the normal public write pathPOST /api/v1/memories, the same call any user makes, with no benchmark-only ingestion route.

Each conversation turn is stored as its own memory rather than the session as a block, so retrieval has to find the right turn instead of being handed a whole session that happens to contain it. Turns are written as conversation content type, sixteen concurrently, and each question's history lands in its own namespace — lme_oracle_<question_id> — so retrieval for one question structurally cannot see another's evidence.

A state file maps every question to the memory IDs it produced, which is what makes the phase resumable and cleanly reversible. 10,960 memories, zero terminal failures. Wall clock: 97.7 minutes.

The published 11 Aug 2026 run reuses the vault seeded by this April ingest — the same 10,960 memories, untouched in between — rather than re-ingesting. A harness script reconstructs the state file from the live namespace listing so Phases 2–3 can run standalone.

PHASE 2

Retrieve & generate

For each question the harness searches that question's namespace through Kemory's ordinary hybrid search — POST /api/v1/memories/search, vector plus full-text, fused and re-ranked — then asks a reader model to answer from what came back.

Three things are tuned per question type rather than held flat, and they are the reason this section exists:

Question typetop-kAlso
multi-session30Two-pass verification and self-consistency voting on counting and duration questions
single-session-preference25Needs broad context for the rubric
temporal-reasoning15
knowledge-update15Results sorted chronologically, so the latest value is last
single-session-user / -assistant10

Some questions also get an entity-extraction pass first: a model pulls the named entities out of the question, each is searched separately, and the results are merged — a two-pass retrieval for questions where one embedding of the whole question retrieves poorly. Answer prompts are written per question type. Wall clock: ~24 minutes for the published run (2.9 s per question, network round-trips to the production API included).

PHASE 3

Judge

Each answer is scored against the reference using the official LongMemEval judge prompts, per question type as the paper specifies them:

StandardDoes the response contain the correct answer?
Temporal reasoningSame, with off-by-one tolerance on day counts — the dataset's own reference answers give both readings.
Knowledge updateAccepts the updated answer even when the superseded value also appears.
PreferenceRubric — did it recall the preference and apply it?
AbstentionCorrect only if the model identifies the question as unanswerable.

Wall clock: ~1 minute.

Total: about 115 minutes for a full run from an empty vault; about 25 minutes for the published run, which reused the seeded vault. All three phases take --resume; the run output records the hypothesis and the judge's verdict for every one of the 500 questions.

What retrieval actually did

The number depends as much on what reached the reader as on the reader itself.

Retrieval depth10 for single-session types, 15 for temporal and knowledge-update, 25 for preference, 30 for multi-session
Memories reaching the reader16.1 on average across the run
GranularityOne memory per conversation turn — retrieval finds turns, not whole sessions
MethodKemory's standard hybrid retrieval — vector similarity and full-text, fused and re-ranked
ScopeNamespace-scoped per question, so cross-question leakage is structurally impossible

Two honest observations about those numbers.

Depth is tuned per question type, and that flatters the result. Multi-session gets three times the retrieval budget of a single-session question. That is a defensible engineering choice — a question whose evidence is spread across five conversations genuinely needs a wider window than one answered by a single turn — but it is a choice made with knowledge of the question type, which a live system does not always have. A flat top-k 10 across all types would score lower.

Turn-level granularity cuts the other way. Storing each turn as its own memory makes retrieval harder, not easier: the system has to locate the specific exchange rather than being handed a whole session that happens to contain the answer. That is also how Kemory stores real conversations, so it is the honest configuration rather than a benchmark convenience.

Caveats

Four things a careful reader should know before comparing this number to anything else. We would rather state them than have someone find them.

1. The harness is tuned to this benchmark

This is the most important one. The answer prompts are written per question type, and they were refined using failure analysis from earlier runs on this same dataset. Retrieval depth is likewise set per question type, and the self-consistency voting on counting and duration questions was added after failure analysis showed those questions dominated the misses. None of it was arrived at blind.

That makes the figure a measure of Kemory retrieving well when the harness around it has been tuned for the task — not a zero-shot result on unseen data. It is the normal way these numbers are produced across the field, and the per-type judge protocol in the benchmark itself invites per-type handling. But anyone comparing our number to a system evaluated with a single flat prompt is not comparing like with like, and we would rather say so than let the number imply otherwise.

What is not tuned: the storage and retrieval path. Ingestion goes through the public write API, retrieval through ordinary hybrid search, and every question is isolated in its own namespace.

2. A different judge

The paper judges with GPT-4o. We judge with Llama-3.3-70B, using the paper's prompt templates verbatim. The prompts are identical; the model grading them is not. LLM judges disagree at the margins, so our figure is not strictly interchangeable with a GPT-4o-judged one. We use the same model as reader and judge, which is a further deviation worth knowing about.

3. The oracle configuration

We run the oracle set — the evidence-bearing sessions, without the full distractor haystack. That is a legitimate configuration of the benchmark and the one many published numbers use, but it is an easier retrieval problem than the full corpus. A number on the oracle set should be compared with other oracle-set numbers.

4. Variance

±2 points run to run, ~7 on multi-session. The 86.2% reproduce run above is the same system on the same data. We publish the canonical run as the headline and the spread alongside it, rather than quietly reporting our best day.

What we have not done

We have not run a head-to-head against Mem0, Letta, Zep or Honcho on identical hardware with an identical harness. Until that exists, treat any cross-system ranking — including one that flatters us — as unproven.

On comparing this to other numbers

The most common mistake with memory benchmarks is comparing two figures that measure different things.

MetricWhat it asks
Retrieval recall (R@5, R@10)Did the right document appear in the top k? Says nothing about whether the system answered correctly.
End-to-end accuracyWas the final answer right? Retrieval, assembly and generation all have to work.

89.6% is the second kind. Recall figures are usually higher than end-to-end figures on the same system, because finding the evidence is easier than using it. A published R@5 in the mid-90s and an end-to-end score in the high-80s can describe systems of similar quality — they are not on the same axis, and setting them side by side is a category error rather than a result.

Reproduce it

The harness, the oracle dataset and the raw run output are preserved together — hypotheses and judge results for every one of the 500 questions, so any individual answer can be inspected rather than trusted.

The three phases run against a live Kemory instance with your own credentials:

# Phase 1 — ingest the haystack into Kemory
python3 ingest.py --data longmemeval_oracle.json \
                  --out output/ingestion_state.json --resume

# Phase 2 — retrieve and generate
python3 run.py --data longmemeval_oracle.json \
               --state output/ingestion_state.json \
               --out output/hypotheses.jsonl --topk 10 --resume

# Phase 3 — judge against the reference answers
python3 score.py --hyp output/hypotheses.jsonl \
                 --ref longmemeval_oracle.json \
                 --out output/results.json --resume

Every phase takes --resume, so an interrupted run continues rather than restarting. Phase 1 is the expensive one and only needs running once per vault.

Re-score our answers with a different judge

Phase 2 writes hypotheses.jsonl in the format the official LongMemEval evaluator expects. That means our answers can be graded by the paper's own scoring script, with GPT-4o, without re-running anything:

python3 evaluate_qa.py gpt-4o hypotheses.jsonl longmemeval_oracle.json

This is the direct answer to the judge caveat above. If you do not trust a Llama-judged score, you do not have to take ours — take our raw answers and grade them yourself, with whatever judge you consider authoritative.

Want to verify it yourself?

If you are evaluating Kemory seriously and want to run this — on the oracle set, the full haystack, or your own corpus — email hello@sekondbrain.ai and we'll set you up with an instance and the harness. A benchmark you ran yourself is worth more than one we published.