Agent-memory benchmark adapters

August 15, 2026 ยท View on GitHub

These adapters exercise the released lwc CLI without adding benchmark-only behavior to the Rust product. Generated corpora, state, upstream clones, and reports belong under .local-benchmarks/, which is ignored by Git.

Tested contracts

BenchmarkUpstreamTested revisionLocal mode
LongMemEval-Shttps://github.com/xiaowu0162/LongMemEval9e0b455f4ef0e2ab8f2e582289761153549043fccomplete retrieval metrics
Agent Memory Leaderboardhttps://github.com/AML-memory/agent-memory-leaderboard5761ed58502d24153115cbdc010e44957cb18c3asynchronous Add/Search HTTP
LongMemEval-V2https://github.com/xiaowu0162/LongMemEval-V22cc8c540bdb87fe6761629b585e727e1c4704520official no-model harness smoke

Build the measured binary first:

cargo build --release --locked

To run every bounded local smoke from a clean checkout with one command:

benchmarks/agent_memory/run_smokes.sh

This downloads about 1.5 GB of pinned public text data. It runs a five-question LongMemEval-S retrieval smoke, the direct AML HTTP tests, the official LongMemEval-V2 one-question/one-trajectory no-model harness, and the V2 adapter tests. It does not expose an endpoint, call a reader or judge, or submit a run.

LongMemEval-S

The cleaned dataset is pinned by content hash. The tested Hugging Face dataset revision is 98d7416c24c778c2fee6e6f3006e7a073259d48f.

mkdir -p .local-benchmarks/agent-memory/lme-v1
curl -L \
  https://huggingface.co/datasets/xiaowu0162/longmemeval-cleaned/resolve/98d7416c24c778c2fee6e6f3006e7a073259d48f/longmemeval_s_cleaned.json \
  -o .local-benchmarks/agent-memory/lme-v1/longmemeval_s_cleaned.json
shasum -a 256 .local-benchmarks/agent-memory/lme-v1/longmemeval_s_cleaned.json

Expected SHA-256:

d6f21ea9d60a0d56f34a05b609c79c88a451d2ae03597821ea3d5a9678c3a442

A limited run is a smoke only and writes partial=true:

python3 -m benchmarks.agent_memory.longmemeval_v1 \
  --data .local-benchmarks/agent-memory/lme-v1/longmemeval_s_cleaned.json \
  --state-root .local-benchmarks/agent-memory/lme-v1/smoke-state \
  --output .local-benchmarks/agent-memory/lme-v1/smoke-report.json \
  --upstream-revision 9e0b455f4ef0e2ab8f2e582289761153549043fc \
  --lwc-commit "$(git rev-parse HEAD)" \
  --lwc-binary "$PWD/target/release/lwc" \
  --limit 5

The complete retrieval run omits --limit:

python3 -m benchmarks.agent_memory.longmemeval_v1 \
  --data .local-benchmarks/agent-memory/lme-v1/longmemeval_s_cleaned.json \
  --state-root .local-benchmarks/agent-memory/lme-v1/full-state \
  --output .local-benchmarks/agent-memory/lme-v1/full-report.json \
  --upstream-revision 9e0b455f4ef0e2ab8f2e582289761153549043fc \
  --lwc-commit "$(git rev-parse HEAD)" \
  --lwc-binary "$PWD/target/release/lwc"

Use --workers 4 to evaluate isolated questions concurrently. Recall and MRR are unchanged; latency percentiles then describe four-way load rather than an idle single-query run. The report records the worker count.

Only a report with complete=true, instances_processed=500, and instances_retrieval_scored=470 is a complete LongMemEval-S retrieval result. This runner measures retrieval, not downstream answer generation.

The pinned dataset contains one inert PEM placeholder in question c7cf7dfd. The runner does not bypass LWC's sensitive-source gate automatically. After reviewing that snapshot and verifying the dataset hash above, resume with --acknowledge-sensitive-question-id c7cf7dfd; the report records every such question ID.

Agent Memory Leaderboard Add/Search API

Start a local service:

python3 -m benchmarks.agent_memory.aml_api \
  --state-root .local-benchmarks/agent-memory/aml/state \
  --lwc-binary "$PWD/target/release/lwc" \
  --host 127.0.0.1 \
  --port 8080

Exercise the current synchronous contract:

curl -sS http://127.0.0.1:8080/health
curl -sS http://127.0.0.1:8080/add \
  -H 'Content-Type: application/json' \
  -d '{"request_id":"smoke-1","messages":[{"role":"user","content":"remember indigo-orchid"}],"user_id":"smoke-user","session_id":"smoke-session"}'
curl -sS http://127.0.0.1:8080/search \
  -H 'Content-Type: application/json' \
  -d '{"query":"indigo orchid","user_id":"smoke-user","top_k":5}'

Set AML_MEMORY_API_KEY to protect Add/Search. Clients may send it as Authorization: Bearer ..., Authorization: Token ..., or X-Api-Key. Health remains unauthenticated. Do not place a key in source or an image.

When Docker is available:

docker build -f benchmarks/agent_memory/Dockerfile -t lwc-aml:local .
docker run --rm -p 8080:8080 \
  -v "$PWD/.local-benchmarks/agent-memory/aml/docker-state:/data" \
  -e AML_MEMORY_API_KEY \
  lwc-aml:local

A formal AML evaluation additionally requires a stable public HTTPS endpoint and an issued AML Eval Key. Running the local service does not submit, score, or publish anything. Review endpoint exposure, storage lifetime, bandwidth, and evaluation cost before starting a formal run.

LongMemEval-V2

The first adapter is deliberately text-only: text_only=true. It accepts query_image for protocol compatibility but returns no image context.

Clone and prepare the pinned official harness:

git clone https://github.com/xiaowu0162/LongMemEval-V2.git \
  .local-benchmarks/upstreams/LongMemEval-V2
git -C .local-benchmarks/upstreams/LongMemEval-V2 \
  checkout 2cc8c540bdb87fe6761629b585e727e1c4704520
python3.11 -m venv .local-benchmarks/venvs/lme-v2
.local-benchmarks/venvs/lme-v2/bin/pip install \
  -r .local-benchmarks/upstreams/LongMemEval-V2/requirements.txt
git -C .local-benchmarks/upstreams/LongMemEval-V2 apply \
  "$PWD/benchmarks/agent_memory/longmemeval_v2.patch"

On Intel macOS, if the newest cryptography release has no wheel, install a compatible wheel such as cryptography==46.0.7 before the requirements.

run_smokes.sh downloads the pinned dataset revision f152293e235517d504809563c833d7190b8c713b, verifies the three required file hashes, and extracts one real Small question plus one trajectory from its official haystack under .local-benchmarks/agent-memory/lme-v2/smoke/:

questions-one.json
haystack-one.json
trajectories-one.json

The script generates a per-run memory config. For a manual run, save this as lwc-memory-config.json under the smoke directory with resolved absolute paths:

{
  "memory_type": "lwc",
  "memory_params": {
    "state_root": "/absolute/path/to/.local-benchmarks/agent-memory/lme-v2/state",
    "lwc_binary": "/absolute/path/to/target/release/lwc",
    "search_limit": 10,
    "command_timeout_seconds": 120
  }
}

Run the no-model smoke:

LME_V2_ROOT="$PWD/.local-benchmarks/upstreams/LongMemEval-V2"
PYTHONPATH="$PWD:$LME_V2_ROOT" \
.local-benchmarks/venvs/lme-v2/bin/python "$LME_V2_ROOT/evaluation/harness.py" \
  --domain web \
  --questions-path .local-benchmarks/agent-memory/lme-v2/smoke/questions-one.json \
  --haystack-path .local-benchmarks/agent-memory/lme-v2/smoke/haystack-one.json \
  --trajectories-path .local-benchmarks/agent-memory/lme-v2/smoke/trajectories-one.json \
  --memory-config-path .local-benchmarks/agent-memory/lme-v2/smoke/lwc-memory-config.json \
  --output-dir .local-benchmarks/agent-memory/lme-v2/harness-output \
  --save-memory \
  --skip-evaluation

For a full Small or Medium run, first use the official data workflow:

LME_V2_ROOT="$PWD/.local-benchmarks/upstreams/LongMemEval-V2"
DATA_ROOT="$PWD/.local-benchmarks/agent-memory/lme-v2/data"
.local-benchmarks/venvs/lme-v2/bin/python "$LME_V2_ROOT/data/download_data.py" --data-root "$DATA_ROOT" --revision f152293e235517d504809563c833d7190b8c713b
.local-benchmarks/venvs/lme-v2/bin/python "$LME_V2_ROOT/data/prepare_data.py" --data-root "$DATA_ROOT" --mode symlink
.local-benchmarks/venvs/lme-v2/bin/python "$LME_V2_ROOT/data/validate_data.py" --data-root "$DATA_ROOT" --tier small

The current public snapshot is roughly 1.2 GB of trajectories plus 5.9 GB of screenshots. A scored run also requires the fixed Qwen3.5-9B reader endpoint and GPT-5.2 judge configuration required by the package validator. Full reader, judge, packaging, and submission commands are intentionally a separately reviewed execution because they spend external resources and may publish an artifact. Use the upstream leaderboard/README.md only after both web and enterprise runs are complete.

Verification

The deterministic adapter suite uses a real LWC binary:

LWC_BENCH_BINARY="$PWD/target/release/lwc" \
python3 -m unittest discover -s benchmarks/agent_memory -p 'test_*.py' -v

V2-specific tests additionally need the pinned, patched upstream and its Python environment:

LME_V2_ROOT="$PWD/.local-benchmarks/upstreams/LongMemEval-V2" \
LWC_BENCH_BINARY="$PWD/target/release/lwc" \
PYTHONPATH="$PWD:$PWD/.local-benchmarks/upstreams/LongMemEval-V2" \
.local-benchmarks/venvs/lme-v2/bin/python -m unittest \
  benchmarks.agent_memory.test_adapters.LongMemEvalV2Tests -v

smoke means protocol compatibility on a bounded subset. partial means a dataset run stopped by an explicit limit. complete means every expected instance was processed. scored requires the benchmark's official answer and judge pipeline. submitted requires successful organizer ingestion and is never implied by a local report.