Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
109 commits
Select commit Hold shift + click to select a range
f72c67a
eval: add clean failure diagnostics
Cookie-Cat21 Sep 20, 2026
bb6da2b
feat: infer distributed list and set retrieval generically
Cookie-Cat21 Sep 20, 2026
d6b4a00
feat: add session-aware temporal answers and distributed list synthesis
Cookie-Cat21 Sep 20, 2026
d209233
test: cover session dates relative dates and distributed lists
Cookie-Cat21 Sep 20, 2026
ab9c338
test: cover generic list and offering query planning
Cookie-Cat21 Sep 20, 2026
9fdaae0
feat: expose direct-turn provenance to retrieval ranking
Cookie-Cat21 Sep 20, 2026
91a2b04
feat: prefer direct evidence over derived reflections
Cookie-Cat21 Sep 20, 2026
13ebcd7
fix: parse full session dates and gate list aggregation
Cookie-Cat21 Sep 20, 2026
ecdd6d0
feat: resolve conversational month week and weekday dates
Cookie-Cat21 Sep 20, 2026
be2c5c2
test: cover relative month and weekday resolution
Cookie-Cat21 Sep 20, 2026
707408b
feat: add local semantic fallback retrieval
Cookie-Cat21 Sep 20, 2026
2d2cf49
feat: use local semantic retrieval when Qdrant is unavailable
Cookie-Cat21 Sep 20, 2026
2844a98
ci: benchmark local semantic fallback
Cookie-Cat21 Sep 20, 2026
6526eb9
ci: benchmark local semantic fallback
Cookie-Cat21 Sep 20, 2026
b6d498b
test: cover local semantic fallback without model downloads
Cookie-Cat21 Sep 20, 2026
f812df2
feat: infer repeated-history questions as distributed retrieval
Cookie-Cat21 Sep 20, 2026
38e545d
feat: improve duration extraction and suppress greeting answers
Cookie-Cat21 Sep 20, 2026
726b1fd
test: cover word durations and greeting suppression
Cookie-Cat21 Sep 20, 2026
d732c93
test: cover generic repeated-history planning
Cookie-Cat21 Sep 20, 2026
83e49eb
fix: make local semantic retrieval supplemental instead of rank-disru…
Cookie-Cat21 Sep 20, 2026
1dbc512
feat: hybrid reader routes temporal and distributed QA to structured …
Cookie-Cat21 Sep 20, 2026
c7ca14c
test: cover model-free temporal and distributed hybrid reader paths
Cookie-Cat21 Sep 20, 2026
004669d
feat: retrieve adjacent conversation turns by session
Cookie-Cat21 Sep 20, 2026
178fc03
feat: expand retrieved conversation turns with immediate neighbors
Cookie-Cat21 Sep 20, 2026
0ead7ed
test: cover adjacent conversation-turn evidence expansion
Cookie-Cat21 Sep 20, 2026
ec44322
feat: compose adjacent Q&A turns into reader evidence windows
Cookie-Cat21 Sep 20, 2026
371ade5
feat: prioritize conversational neighbor evidence in synthesis
Cookie-Cat21 Sep 20, 2026
4a7dd31
feat: synthesize compact values for distributed list answers
Cookie-Cat21 Sep 20, 2026
eaa4747
test: require compact distributed-list synthesis
Cookie-Cat21 Sep 20, 2026
1def955
feat: index adjacent conversational question-response pairs
Cookie-Cat21 Sep 20, 2026
c619c09
test: require searchable question-response pair chunks
Cookie-Cat21 Sep 20, 2026
32ba713
feat: bound local semantic candidates by query entities
Cookie-Cat21 Sep 20, 2026
2c365bb
perf: scope local semantic retrieval to query entities
Cookie-Cat21 Sep 20, 2026
f231be8
test: cover entity-scoped local semantic candidates
Cookie-Cat21 Sep 20, 2026
44be2dc
feat: add independent Prosus MemEval system adapter
Cookie-Cat21 Sep 20, 2026
fbf86c5
docs: document independent MemEval comparison workflow
Cookie-Cat21 Sep 20, 2026
ad58bab
feat: add evidence-linked compiled memory schema
Cookie-Cat21 Sep 20, 2026
55f2495
feat: ingest externally compiled propositions with provenance
Cookie-Cat21 Sep 20, 2026
d27cf61
feat: compile evidence-linked propositions in MemEval adapter
Cookie-Cat21 Sep 20, 2026
27cb889
test: cover evidence-linked compiled memory ingestion
Cookie-Cat21 Sep 20, 2026
08c116b
ci: cancel stale benchmark runs on newer commits
Cookie-Cat21 Sep 20, 2026
5c657ac
ci: cancel stale benchmark runs on newer commits
Cookie-Cat21 Sep 20, 2026
c5d623d
ci: cancel stale benchmark runs on newer commits
Cookie-Cat21 Sep 20, 2026
e445907
feat: add diversity-aware context packet compiler
Cookie-Cat21 Sep 20, 2026
f47674d
test: cover context dedupe diversity and budgets
Cookie-Cat21 Sep 20, 2026
ca3211e
feat: compile diverse evidence packets under context budgets
Cookie-Cat21 Sep 20, 2026
af413e9
fix: exclude auxiliaries from plural distributed-query detection
Cookie-Cat21 Sep 20, 2026
2fe6733
fix: normalize punctuation in near-duplicate context detection
Cookie-Cat21 Sep 20, 2026
c33d105
fix: keep compact list answers and normalize temporal date output
Cookie-Cat21 Sep 20, 2026
27adb37
fix: avoid auxiliary false positives in hybrid reader routing
Cookie-Cat21 Sep 20, 2026
42c7492
feat: intersect multi-person evidence for shared-answer questions
Cookie-Cat21 Sep 20, 2026
108cc93
test: cover shared-value intersection across multiple people
Cookie-Cat21 Sep 20, 2026
6005ee5
feat: plan duration-between-events questions as multi-evidence retrieval
Cookie-Cat21 Sep 20, 2026
1c906e5
test: cover duration-between-events retrieval planning
Cookie-Cat21 Sep 20, 2026
e5126e2
ci: add independent MemEval head-to-head workflow
Cookie-Cat21 Sep 20, 2026
45839b3
feat: extract explicit identity and favorite scalar values first
Cookie-Cat21 Sep 20, 2026
b12c1ba
test: cover precise identity and favorite-value extraction
Cookie-Cat21 Sep 20, 2026
4954f69
feat: expose compiled-memory confidence to retrieval ranking
Cookie-Cat21 Sep 20, 2026
3a4bf54
feat: use compiler confidence as a small generic ranking signal
Cookie-Cat21 Sep 20, 2026
143d1e9
feat: add hard entity-scoped evidence filter
Cookie-Cat21 Sep 20, 2026
e153d82
feat: hard-filter direct evidence to named query entities
Cookie-Cat21 Sep 20, 2026
d671444
test: cover entity-scoped evidence filtering
Cookie-Cat21 Sep 20, 2026
cfafec1
fix: project-scope SQLite chunk and FTS retrieval
Cookie-Cat21 Sep 20, 2026
a50c228
fix: keep temporal modifiers out of shared location values
Cookie-Cat21 Sep 20, 2026
0fd954b
ci: run one-sample independent MemEval on pull requests
Cookie-Cat21 Sep 20, 2026
6d429ad
fix: handle singular shared-location questions
Cookie-Cat21 Sep 20, 2026
fc4882a
eval: strengthen fair MemEval extraction and reasoning
Cookie-Cat21 Sep 20, 2026
a1c6938
fix: import MemEval adapter concurrency helpers
Cookie-Cat21 Sep 20, 2026
c09693f
perf: keep independent MemEval setup minimal
Cookie-Cat21 Sep 20, 2026
738efee
feat: distinguish multi-evidence queries from true bridge reasoning
Cookie-Cat21 Sep 20, 2026
adebbc6
refactor: keep distributed retrieval entity-scoped and anchor expansions
Cookie-Cat21 Sep 20, 2026
1ed3b23
test: cover multi-evidence versus bridge planning
Cookie-Cat21 Sep 20, 2026
3fae5f8
feat: generalize distributed activity and event synthesis
Cookie-Cat21 Sep 20, 2026
7b37d80
test: cover generic activity and event aggregation
Cookie-Cat21 Sep 20, 2026
dcbb73c
feat: route favorite questions through preference memory
Cookie-Cat21 Sep 20, 2026
b31b7b2
test: cover favorite preference routing
Cookie-Cat21 Sep 20, 2026
86a1bd3
fix: narrow identity intent and prioritize duration answers
Cookie-Cat21 Sep 20, 2026
3e43f31
test: protect identity intent and duration precedence
Cookie-Cat21 Sep 20, 2026
7455df2
feat: enforce duration quantity consistency in reranking
Cookie-Cat21 Sep 20, 2026
5564e32
test: cover quantity-consistent reranking
Cookie-Cat21 Sep 20, 2026
c771831
ci: skip independent MemEval cleanly when API secret is absent
Cookie-Cat21 Sep 20, 2026
7aa1b30
feat: model recency queries as current temporal intent
Cookie-Cat21 Sep 20, 2026
08400ac
feat: rerank recent queries by event time
Cookie-Cat21 Sep 20, 2026
8c274a3
test: cover recency temporal planning
Cookie-Cat21 Sep 20, 2026
8468af3
test: cover recency event-time reranking
Cookie-Cat21 Sep 20, 2026
1d03427
feat: add generic semantic-domain query expansions
Cookie-Cat21 Sep 20, 2026
a03e8cb
fix: extract lowercase locations without temporal suffix leakage
Cookie-Cat21 Sep 20, 2026
b509ab9
test: cover lowercase place extraction and time cleanup
Cookie-Cat21 Sep 20, 2026
0d0a93f
feat: detect participation and group-preference queries as multi-evid…
Cookie-Cat21 Sep 20, 2026
b8558c7
feat: aggregate participation and group-preference answers
Cookie-Cat21 Sep 20, 2026
bf35d7a
test: cover participation and group preference planning
Cookie-Cat21 Sep 20, 2026
4d711cf
fix: align hybrid reader with recency and multi-evidence planning
Cookie-Cat21 Sep 20, 2026
e9990f9
feat: balance evidence across multiple named entities
Cookie-Cat21 Sep 20, 2026
e1baa9c
test: require balanced multi-entity evidence
Cookie-Cat21 Sep 20, 2026
afee715
feat: prioritize named speakers in conversational entity scope
Cookie-Cat21 Sep 20, 2026
1ac2a07
test: prioritize speaker identity over topical capitalized entities
Cookie-Cat21 Sep 20, 2026
8a38f03
fix: restrict identity predicate matching to direct identity questions
Cookie-Cat21 Sep 20, 2026
b6d3237
fix: preserve relevant evidence inside moderate session contexts
Cookie-Cat21 Sep 20, 2026
3affbf7
test: preserve relevant evidence in moderate session logs
Cookie-Cat21 Sep 20, 2026
630d5c4
fix: trust high-confidence single structured list values
Cookie-Cat21 Sep 20, 2026
875e58d
test: trust single structured list extraction
Cookie-Cat21 Sep 20, 2026
d88e315
feat: diversify context across sessions for multi-evidence queries
Cookie-Cat21 Sep 20, 2026
0864438
feat: preserve chunk metadata in keyword retrieval
Cookie-Cat21 Sep 20, 2026
43df5ad
feat: expose conversational pair provenance in keyword search
Cookie-Cat21 Sep 20, 2026
7ce9a7c
feat: make conversational entity scope attribution-aware
Cookie-Cat21 Sep 20, 2026
d6c685a
test: cover question-answer attribution in entity scope
Cookie-Cat21 Sep 20, 2026
6497426
fix: propagate project scope to SQLite keyword retrieval
Cookie-Cat21 Sep 20, 2026
352b481
fix: retain weak conversational evidence after strong attribution
Cookie-Cat21 Sep 20, 2026
139abc5
test: require strong-first attribution without recall loss
Cookie-Cat21 Sep 20, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 6 additions & 0 deletions .github/workflows/full-clean-benchmark.yml
Original file line number Diff line number Diff line change
Expand Up @@ -4,10 +4,16 @@ on:
pull_request:
workflow_dispatch:

concurrency:
group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }}
cancel-in-progress: true

jobs:
clean-benchmark:
runs-on: ubuntu-latest
timeout-minutes: 20
env:
ULTIMATE_MEMORY_LOCAL_SEMANTIC: "1"
steps:
- uses: actions/checkout@v4
- name: Install uv
Expand Down
92 changes: 92 additions & 0 deletions .github/workflows/memeval.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,92 @@
name: Independent MemEval

on:
pull_request:
workflow_dispatch:
inputs:
samples:
description: "Number of LoCoMo conversations"
required: true
default: "1"
with_judge:
description: "Run GPT judge in addition to token F1"
required: true
type: boolean
default: false

concurrency:
group: independent-memeval
cancel-in-progress: true

jobs:
memeval:
runs-on: ubuntu-latest
timeout-minutes: 60
env:
OPENAI_API_KEY: ${{ secrets.OPENAI_API_KEY }}
LLM_MODEL: gpt-4.1-mini
EMBEDDING_MODEL: text-embedding-3-small
steps:
- name: Check API key
id: api_key
run: |
if [ -z "$OPENAI_API_KEY" ]; then
echo "::notice::OPENAI_API_KEY Actions secret is not configured; independent MemEval is skipped."
echo "available=false" >> "$GITHUB_OUTPUT"
else
echo "available=true" >> "$GITHUB_OUTPUT"
fi

- name: Checkout Ultimate Memory
if: steps.api_key.outputs.available == 'true'
uses: actions/checkout@v4
with:
path: ultimate-memory

- name: Checkout Prosus MemEval
if: steps.api_key.outputs.available == 'true'
uses: actions/checkout@v4
with:
repository: ProsusAI/MemEval
path: MemEval

- name: Install uv
if: steps.api_key.outputs.available == 'true'
uses: astral-sh/setup-uv@v3

- name: Install MemEval and Ultimate Memory
if: steps.api_key.outputs.available == 'true'
working-directory: MemEval
run: |
uv sync
uv pip install httpx
uv pip install -e ../ultimate-memory
cp ../ultimate-memory/integrations/memeval/ultimate_memory.py src/agents_memory/systems/ultimate_memory.py

- name: Run fair head-to-head
if: steps.api_key.outputs.available == 'true'
working-directory: MemEval
shell: bash
run: |
SAMPLES="1"
EXTRA="--skip-judge"
if [ "${{ github.event_name }}" = "workflow_dispatch" ]; then
SAMPLES="${{ inputs.samples }}"
if [ "${{ inputs.with_judge }}" = "true" ]; then
EXTRA=""
fi
fi
uv run python scripts/run_full_benchmark.py \
--systems ultimate_memory,propmem \
--num-samples "$SAMPLES" \
--llm-model "$LLM_MODEL" \
$EXTRA \
--output-dir benchmark-output

- name: Upload benchmark results
if: always() && steps.api_key.outputs.available == 'true'
uses: actions/upload-artifact@v4
with:
name: independent-memeval-results
path: MemEval/benchmark-output/
if-no-files-found: warn
5 changes: 5 additions & 0 deletions .github/workflows/reader-benchmark.yml
Original file line number Diff line number Diff line change
Expand Up @@ -4,12 +4,17 @@ on:
pull_request:
workflow_dispatch:

concurrency:
group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }}
cancel-in-progress: true

jobs:
reader-benchmark:
runs-on: ubuntu-latest
timeout-minutes: 20
env:
TOKENIZERS_PARALLELISM: "false"
ULTIMATE_MEMORY_LOCAL_SEMANTIC: "1"
steps:
- uses: actions/checkout@v4
- name: Install uv
Expand Down
4 changes: 4 additions & 0 deletions .github/workflows/tests.yml
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,10 @@ on:
pull_request:
branches: [master]

concurrency:
group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }}
cancel-in-progress: true

jobs:
test:
runs-on: ubuntu-latest
Expand Down
25 changes: 25 additions & 0 deletions evals/run_clean_benchmarks.py
Original file line number Diff line number Diff line change
Expand Up @@ -156,6 +156,7 @@ def run(
planner_correct = 0
planner_confusion: dict[str, dict[str, int]] = defaultdict(lambda: defaultdict(int))
asked = 0
diagnostics: list[dict] = []
started = time.perf_counter()

for sample in data:
Expand Down Expand Up @@ -209,6 +210,19 @@ def run(
planner_total += 1
planner_correct += int(planned_kind == expected_kind)
planner_confusion[expected_kind][planned_kind] += 1
diagnostics.append({
"sample_id": sample_id,
"category": category,
"question": qa["question"],
"gold": golds,
"answer": result["answer"],
"token_f1": round(100 * score, 2),
"evidence_recall": round(100 * evidence_score, 2),
"gold_token_coverage": round(100 * coverage, 2),
"planned_kind": planned_kind,
"expected_kind": expected_kind,
"top_contexts": [str(x)[:320] for x in contexts_used[:4]],
})
asked += 1

if max_questions is not None and asked >= max_questions:
Expand Down Expand Up @@ -258,6 +272,17 @@ def run(
"by_category": by_category,
"use_llm": use_llm,
"use_reader": use_reader,
"worst_answer_failures": sorted(
diagnostics,
key=lambda item: (item["token_f1"], -item["gold_token_coverage"]),
)[:12],
"retrieval_failures": sorted(
diagnostics,
key=lambda item: (item["gold_token_coverage"], item["evidence_recall"]),
)[:12],
"planner_misses": [
item for item in diagnostics if item["planned_kind"] != item["expected_kind"]
][:12],
}


Expand Down
54 changes: 54 additions & 0 deletions integrations/memeval/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,54 @@
# Ultimate Memory on ProsusAI MemEval

ProsusAI/MemEval is the primary external fair-comparison gate for Ultimate Memory.
It standardizes the answer LLM, embedding model, scoring pipeline, and token accounting
across memory systems.

At the time this integration was added, MemEval's published LoCoMo leader is PropMem
at 0.605 token-F1 and 0.823 judge score.

## Run head-to-head

Clone MemEval next to Ultimate Memory, install both projects, and copy the adapter:

```bash
git clone https://github.com/ProsusAI/MemEval.git
cd MemEval
uv sync --all-extras
uv pip install -e ../ultimate-memory
cp ../ultimate-memory/integrations/memeval/ultimate_memory.py \
src/agents_memory/systems/ultimate_memory.py
```

Set `OPENAI_API_KEY`, then run one conversation first:

```bash
uv run python scripts/run_full_benchmark.py \
--systems ultimate_memory,propmem \
--num-samples 1 \
--llm-model gpt-4.1-mini \
--skip-judge
```

For the full externally comparable LoCoMo run:

```bash
uv run python scripts/run_full_benchmark.py \
--systems ultimate_memory,propmem \
--num-samples 10 \
--llm-model gpt-4.1-mini
```

Do not claim a leaderboard position from Ultimate Memory's internal clean harness.
Use the MemEval result for cross-system claims.

## Fairness

The adapter:

- ingests only raw conversation sessions;
- never receives the gold question category;
- uses MemEval's supplied answer model;
- uses `text-embedding-3-small` for semantic fallback;
- leaves MemEval's scoring and judge code untouched;
- counts answer-LLM tokens through MemEval's normal OpenAI instrumentation.
Loading
Loading