Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
40 commits
Select commit Hold shift + click to select a range
c131f02
fix(qdrant): index the `type` payload field so recall filters stop 40…
zackkatz Aug 11, 2026
92b98ec
docs(mcp): audit remote vs stdio transport parity
jack-arturo Aug 14, 2026
ee844bb
test(mcp): add gated cross-transport parity harness
jack-arturo Aug 14, 2026
2260c0c
test(mcp): add tools/call parity scenario matrix
jack-arturo Aug 14, 2026
b182206
ci(mcp): run node suite in make test and add parity workflow
jack-arturo Aug 14, 2026
bcef376
docs: target feature PRs at develop (#228)
jack-arturo Aug 23, 2026
7a92ebd
fix(stream): emit live memory operations on GET /stream (#227)
jack-arturo Aug 23, 2026
009d58e
fix(backup): page FalkorDB export by node id instead of deep SKIP (#221)
zackkatz Aug 23, 2026
daa906b
style(tests): black-format qdrant payload index assertions
jack-arturo Aug 23, 2026
ea148e5
fix(enrichment): circuit-break exhausted quota calls
mikemikimike Aug 23, 2026
6566675
test(enrichment): cover probe recovery and request suppression
mikemikimike Aug 23, 2026
97d67fa
test(enrichment): fix probe recovery assertions
mikemikimike Aug 23, 2026
83df352
test(enrichment): separate probe success and failure cases
mikemikimike Aug 23, 2026
4cf9ef1
fix(mcp): close false-failure and coverage gaps in the parity harness
jack-arturo Aug 23, 2026
9ac5b4e
fix(mcp): align the parity harness with its own allowlist
jack-arturo Aug 23, 2026
89346e9
fix(mcp): close partial connections when parity setup fails
jack-arturo Aug 23, 2026
fa458b0
fix(mcp): isolate parity fixtures per scenario and drop the false alarm
jack-arturo Aug 23, 2026
10bcac7
fix(qdrant): index the `type` payload field so recall filters stop 40…
jack-arturo Aug 23, 2026
969755d
test(mcp): add cross-transport parity harness for remote vs stdio MCP…
jack-arturo Aug 23, 2026
b5106a1
Merge branch 'develop' into fix/222-enrichment-quota-circuit
mikemikimike Aug 24, 2026
29f359d
fix(enrichment): preserve quota circuit during in-flight calls
jack-arturo Aug 28, 2026
d9787cb
docs(enrichment): document quota circuit
jack-arturo Aug 28, 2026
e177b60
docs: add Qdrant on-disk storage design
jack-arturo Aug 28, 2026
56da2b7
docs: add Qdrant on-disk implementation plan
jack-arturo Aug 28, 2026
c97b5b1
perf(qdrant): store new collection data on disk
jack-arturo Aug 28, 2026
b04b9e1
perf(qdrant): support disk-backed HNSW restores
jack-arturo Aug 28, 2026
d05a2d9
docs(qdrant): add on-disk migration runbook
jack-arturo Aug 28, 2026
ad3ed27
fix(enrichment): circuit-break exhausted quota calls (#229)
jack-arturo Aug 28, 2026
369c060
chore: merge develop into qdrant storage branch
jack-arturo Aug 28, 2026
db71f07
docs(qdrant): harden on-disk migration runbook
jack-arturo Aug 28, 2026
45e77f4
docs(qdrant): verify migration export before restore
jack-arturo Aug 28, 2026
9b31cde
docs(qdrant): limit migration to default topology
jack-arturo Aug 28, 2026
07d8704
perf(qdrant): store collection data on disk (#231)
jack-arturo Aug 28, 2026
93afcff
docs: align provider and maintenance guidance
jack-arturo Aug 28, 2026
a8be394
fix(docs): correct re-embedding migration setup
jack-arturo Aug 28, 2026
4dd1325
fix(recovery): honor configured graph and cloud migrations
jack-arturo Aug 28, 2026
abfd0c8
style(test): format recovery regression
jack-arturo Aug 28, 2026
3468443
fix(docs): complete embedding migration runbooks
jack-arturo Aug 28, 2026
0bc0096
fix(config): preserve Ollama defaults and migration checks
jack-arturo Aug 28, 2026
c40d1d2
docs: align provider and maintenance guidance (#232)
jack-arturo Aug 28, 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
109 changes: 0 additions & 109 deletions .agents/skills/automem-regression-drift-scout/SKILL.md

This file was deleted.

11 changes: 10 additions & 1 deletion .env.example
Original file line number Diff line number Diff line change
Expand Up @@ -11,12 +11,21 @@ QDRANT_HOST=
QDRANT_PORT=6333
QDRANT_URL=
QDRANT_COLLECTION=memories
VECTOR_SIZE=1024 # Must match your embedding provider (1024=voyage-4, 3072=text-embedding-3-large, 768=text-embedding-3-small)
# Recommended embeddings: Voyage is the default when its API key is configured.
EMBEDDING_PROVIDER=auto
VOYAGE_API_KEY=
VOYAGE_MODEL=voyage-4
VECTOR_SIZE=1024 # voyage-4 and Ollama bge-m3; must match your selected provider
PORT=8001
# OpenAI is the automatic API fallback when VOYAGE_API_KEY is unset.
OPENAI_API_KEY=
# For OpenAI-compatible providers (OpenRouter, LiteLLM, vLLM, etc.):
# OPENAI_BASE_URL=https://openrouter.ai/api/v1
# EMBEDDING_MODEL=openai/text-embedding-3-small
# For local/self-hosted Ollama embeddings (for example, multilingual BGE-M3):
# OLLAMA_BASE_URL=http://localhost:11434
# OLLAMA_MODEL=bge-m3
# FastEmbed is local/self-hosted only; do not rely on it as a cloud default.
# --- LLM classification (scripts/reclassify_with_llm.py) ---
# Optional. Defaults to OpenAI gpt-4o-mini via OPENAI_API_KEY.
# OPENROUTER_API_KEY= # used by --provider openrouter
Expand Down
69 changes: 69 additions & 0 deletions .github/workflows/mcp-parity.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,69 @@
name: MCP Transport Parity

# Diffs the remote MCP bridge against the stdio package against one live
# AutoMem. See docs/MCP_TRANSPORT_PARITY.md for the contract.
#
# No scheduled run yet, deliberately. While the harness is intentionally red
# against the known gaps, `continue-on-error` leaves the workflow successful
# either way, so a cron job could not distinguish "same known gaps" from "a
# newly published mcp-automem added drift" — it would be an alarm that cannot
# alarm. The weekly drift check lands with the change that turns the harness
# green, where a failure is a real signal.

on:
pull_request:
paths:
- 'mcp-sse-server/**'
- 'automem/api/**'
- 'app.py'
workflow_dispatch:

jobs:
parity:
runs-on: ubuntu-latest
# Phase 1 only. The harness is legitimately red until the bridge is moved
# onto the shared MCP surface; this is removed in the same change.
continue-on-error: true
steps:
- uses: actions/checkout@v4

- uses: actions/setup-node@v4
with:
node-version: '20'
cache: npm
cache-dependency-path: mcp-sse-server/package-lock.json

- name: Start AutoMem stack
env:
AUTOMEM_API_HOST_PORT: '8011'
AUTOMEM_API_TOKEN: test-token
ADMIN_API_TOKEN: test-admin-token
run: docker compose up -d

- name: Wait for /health
run: |
for i in $(seq 1 60); do
if curl -fsS http://localhost:8011/health > /dev/null; then
echo "AutoMem is up after ${i}s"
exit 0
fi
sleep 1
done
echo "AutoMem did not become healthy within 60s"
docker compose logs flask-api
exit 1

- name: Run parity harness
working-directory: mcp-sse-server
env:
AUTOMEM_RUN_PARITY_TESTS: '1'
AUTOMEM_PARITY_API_URL: http://localhost:8011
AUTOMEM_PARITY_API_TOKEN: test-token
run: |
npm ci
node -p "'stdio package under test: ' + require('@verygoodplugins/mcp-automem/package.json').version"
npm test

- name: Dump service logs on failure
if: failure()
run: docker compose logs --tail=200
8 changes: 4 additions & 4 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -33,10 +33,8 @@ node_modules/
# Experiment results (promote notable runs to tests/benchmarks/results/)
/tests/benchmarks/experiments/results_*/

# Recall Quality Lab data (snapshots, test results)
/lab/snapshots/
/lab/results/
/lab/test_sets/
# Recall Quality Lab data (generated snapshots, test sets, and results)
/lab/

# Benchmark overrides and snapshots
.env.bench
Expand All @@ -47,3 +45,5 @@ node_modules/
benchmarks/baselines/locomo_baseline.json
data/bm25_index.db
data/
/.agents
/docs/superpowers/
5 changes: 3 additions & 2 deletions AGENTS.md
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@
- `benchmarks/`: Snapshot-based benchmark system. See `EXPERIMENT_LOG.md` for current baselines and results.
- `scripts/bench/`: Benchmark tooling (ingest, eval, compare, health check).
- `docs/`: API, testing, deployment, monitoring, and env var references.
- `scripts/`: Maintenance and ops helpers (backup, reembed, health monitor).
- `scripts/`: Maintenance and ops helpers (backup, reembed, health monitor). See the canonical [scripts catalog](scripts/README.md) for lifecycle and usage.
- `mcp-sse-server/`: Optional MCP bridge used in some deployments.

## Build, Test, and Development
Expand Down Expand Up @@ -76,11 +76,12 @@ The benchmark system uses **snapshot-based evaluation**: ingest once, eval many
- `benchmarks/baselines/` — baseline result JSONs (small files committed, large ones gitignored).
- `benchmarks/snapshots/` — Qdrant/FalkorDB snapshot data (gitignored, regenerate with `make bench-ingest`).
- `benchmarks/results/` — per-run result JSONs (gitignored).
- `scripts/bench/` — shell and Python scripts driving ingest, eval, compare, and health checks.
- `scripts/bench/` — shell and Python scripts driving ingest, eval, compare, and health checks; see [scripts/README.md](scripts/README.md).
- `tests/benchmarks/` — legacy benchmark harnesses (LoCoMo, LongMemEval) and historical result markdown files.

## Commit & Pull Requests

- Feature PRs target `develop` (repo default). Promote `develop` to `main` with a validated release merge; release-please and GHCR `:stable` then run on `main`. Do not open feature work onto `main`.
- PR titles must use Conventional Commit format because squash merges use the PR title as the release commit title. Do not prefix titles with `[codex]`, `[claude]`, `[copilot]`, `[wip]`, or similar labels; put agent/status context in the PR body.
- Use Conventional Commit types: `feat`, `fix`, `docs`, `refactor`, `test`, `ci`, `build`, `chore`, `perf`, `revert` (e.g., `feat(api): add /analyze endpoint`).
- For public API changes, use `feat(api): ...` unless the change is strictly a bug fix with no new public surface. For docs-only changes, use `docs: ...`; for release automation, use `ci(release): ...` or `chore(release): ...`.
Expand Down
14 changes: 11 additions & 3 deletions CLAUDE.md
Original file line number Diff line number Diff line change
Expand Up @@ -142,11 +142,13 @@ AutoMem uses a provider pattern with multiple embedding backends:
#### Provider Priority (Auto-Selection)

1. **Voyage AI** (`voyage:voyage-4`) - If `VOYAGE_API_KEY` is set
- Recommended provider for new deployments: multilingual quality with a generous free tier; see [Voyage pricing](https://docs.voyageai.com/docs/pricing) for current limits and rates
- High-quality embeddings with flexible model family (voyage-4, voyage-4-large, voyage-4-lite)
- Supports output dimensions: 256, 512, 1024, 2048
- Requires network and API key

2. **OpenAI / OpenAI-compatible** (`openai:text-embedding-3-small`) - If `OPENAI_API_KEY` is set
- API fallback when Voyage is not configured
- Semantic embeddings via API, truncated to `VECTOR_SIZE` via Matryoshka (OpenAI native only)
- If `VECTOR_SIZE` > 1536, auto-upgrades to `text-embedding-3-large` (set `EMBEDDING_MODEL=text-embedding-3-large` to silence)
- Supports any OpenAI-compatible endpoint via `OPENAI_BASE_URL` (OpenRouter, LiteLLM, vLLM, Azure, etc.) for both embeddings and classification/enrichment LLM calls
Expand All @@ -155,23 +157,25 @@ AutoMem uses a provider pattern with multiple embedding backends:
3. **Ollama** (`ollama:nomic-embed-text`) - If `OLLAMA_BASE_URL` or `OLLAMA_MODEL` is configured
- Fully local, easy model swapping
- Requires running Ollama server
- Use `ollama pull bge-m3`, then `OLLAMA_MODEL=bge-m3` with `VECTOR_SIZE=1024` for local/self-hosted multilingual BGE-M3

4. **FastEmbed** (`fastembed:BAAI/bge-base-en-v1.5`) - Local ONNX model
- Good quality semantic embeddings
- No API key or internet required (after first download)
- Downloads ~210MB model to `~/.config/automem/models/` on first use
- 768 dimensions (default), also supports 384 and 1024 dim models
- Local/self-hosted only: its 1024d cloud fallback can consume roughly 4 GB RSS and raise hosting cost substantially

5. **Placeholder** (`placeholder`) - Hash-based fallback
- Deterministic vectors from content hash
- No semantic meaning, last resort only

**Upgrade safety:** `VECTOR_SIZE_AUTODETECT=true` (default) automatically adopts your existing collection dimension on startup. No manual action needed when updating. To enforce strict matching, set `VECTOR_SIZE_AUTODETECT=false`.
**Upgrade safety:** `VECTOR_SIZE_AUTODETECT=true` (default) only adopts an existing collection dimension. It does not make vectors from different models compatible: any provider or model change requires recreating the Qdrant collection and a full re-embed, including a swap between two 1024d models. To enforce strict dimension matching, set `VECTOR_SIZE_AUTODETECT=false`.

#### Provider Configuration

Control via `EMBEDDING_PROVIDER` environment variable:
- `auto` (default): Try Voyage → OpenAI → Ollama → FastEmbed → Placeholder
- `auto` (default): Try Voyage → OpenAI → Ollama (only when configured) → FastEmbed → Placeholder
- `voyage`: Use Voyage only (fail if unavailable)
- `openai`: Use OpenAI only (fail if unavailable). Also works with OpenAI-compatible providers when `OPENAI_BASE_URL` is set.
- `ollama`: Use Ollama only (fail if unavailable)
Expand Down Expand Up @@ -226,7 +230,7 @@ QDRANT_HOST= # OR hostname for self-hosted Qdrant (e.g. "qdrant"
QDRANT_PORT=6333 # Port for self-hosted Qdrant (used with QDRANT_HOST)
QDRANT_API_KEY= # Qdrant Cloud API key (optional, not needed for self-hosted)
QDRANT_COLLECTION=memories # Collection name
VECTOR_SIZE=1024 # Embedding dimensions (1024 for voyage-4, 768 for small, 3072 for large)
VECTOR_SIZE=1024 # Embedding dimensions (1024 for voyage-4 or Ollama bge-m3, 768 for small, 3072 for large)
VECTOR_SIZE_AUTODETECT=true # Adopt existing collection dim on startup (false = fail on mismatch)

# API configuration
Expand All @@ -236,8 +240,12 @@ ADMIN_API_TOKEN= # For admin endpoints

# Embedding configuration
EMBEDDING_PROVIDER=auto # auto|voyage|openai|ollama|local|placeholder
VOYAGE_API_KEY= # Recommended for new cloud deployments
VOYAGE_MODEL=voyage-4
OPENAI_API_KEY= # For OpenAI or compatible provider (optional)
OPENAI_BASE_URL= # Custom endpoint for OpenAI-compatible APIs used by embeddings and classification/enrichment (optional)
OLLAMA_BASE_URL= # Intentional local/self-hosted Ollama endpoint
OLLAMA_MODEL= # e.g. bge-m3 (requires `ollama pull bge-m3`)

# Consolidation intervals (seconds)
CONSOLIDATION_DECAY_INTERVAL_SECONDS=86400 # 1 day (default)
Expand Down
Loading
Loading