Skip to content

3.0.0 — Powering long-term memory for agents (2026-04-28)

EvolutionDB 3.0 is the closure of the agent-memory roadmap proposed in ADR-002. The release re-positions the project from "another open-source SQL database" to a single-process backend purpose-built for AI agent frameworks.

Highlights

  • First-class agent-memory DDL. CHECKPOINT STORE, MEMORY STORE, MESSAGE LOG, DOCUMENT STORE, GRAPH STORE, ENTITY STORE are now native catalog objects.
  • Vector + ANN. VECTOR(N) data type, distance functions (<=>, <->, <#>), HNSW index, hybrid search.
  • Time-travel queries. FOR SYSTEM_TIME AS OF TRANSACTION <xid> returns the snapshot at the captured transaction; new WITH SYSTEM VERSIONING table modifier lets the engine maintain history automatically.
  • Bitemporal knowledge graph. GRAPH STORE upserts nodes and edges with valid_from, valid_to, invalid_at so "what did we know about X six months ago" is a single SQL query.
  • Mongo-style document filter DSL. DOCUMENT FILTER FROM … WHERE '<json>' accepts the operator subset agent applications actually use ($eq, $ne, $gt, $gte, $lt, $lte, $in, $nin, $and, $or, $not, $exists).
  • Reactive streaming. Durable LISTEN/NOTIFY subscription queues survive disconnects; CDC streaming server emits NDJSON events per WAL change on a dedicated port (default 9970).
  • TTL columns + scheduled jobs. CREATE TABLE … WITH (ttl_column='expires_at') enables a background prune daemon; CREATE JOB … ON SCHEDULE '<cron>' DO … registers cron-style jobs.
  • C SDK + Python ctypes binding. libevosql-memory.{dylib,so,a} exposes a connection / exec / query / memory / checkpoint / vector / subscription surface; the Python wrapper auto-discovers the library and bridges the streaming callback into Python under thread-local error storage.
  • Six framework adapters. Drop-in shims for LangGraph, LangChain, LlamaIndex, CrewAI, AutoGen, and a Mem0-compatible Memory class. None of them imports its target framework — applications can install whichever subset they actually use.

What's measured

From bench/run_all.py (single-process Docker deploy, p99):

op p99
MEMORY PUT ~ 8 ms
MEMORY GET ~ 2 ms
CHECKPOINT PUT ~ 5 ms
MEMORY SEARCH top-10 ~ 4 ms
NOTIFY push delivery ~ 0.4 ms
poll @ 1 s ~ 990 ms

Push delivery is roughly 2900× faster than a 1-second polling loop.

Compatibility

The framework-compat suite (44 cases plus a 16×50 cross-adapter concurrency stress) runs as a separate matrix job per framework on every push and PR. Status:

Framework Compat

Breaking changes from 2.x

  • None at the SQL level. Every 2.x DDL/DML statement still works; the new agent-memory primitives are additive.
  • File format version 8. Pre-existing evosql.db files from 2.x are not auto-migrated — pgm_init rejects mismatches with a clear error. The agent-memory catalog slots (CAT_SYS_CHECKPOINT_STORES through CAT_SYS_ENTITY_STORES) required widening catalog_roots[] to 27 slots, which is what bumped the major version. Take a pg_dump-style backup (COPY TO) before upgrading from 2.x; restore with COPY FROM after upgrade. A future 3.1 will ship an in-place migrator.
  • Major version bump (2.1.0 → 3.0.0). Reflects the product repositioning as well as the file-format change.

What's deferred

  • Task 215 v2 (Task 170): SQL execution body for scheduled jobs. v1 records calendar fires + last_run_unix; the cron evaluator works but the job body itself doesn't run because re-entering query_execute from the auto-RECLAIM thread stomps thread-local state. v2 ships a dedicated executor thread.
  • Task 211 v2: server-side ack channel for CDC. The C SDK records local cursor; the durable-queue ack pipe is on the v2 list.
  • Cross-vendor bench rows. Zep / Mem0 / langgraph-store-mongodb / Pinecone comparison rows in bench/run_all.py are scaffolded but disabled — the comparator backends ship as separate Docker images and the v3.1 sweep adds them.
  • Mongo-filter on JSON paths. The DSL works on top-level document columns; meta.subkey paths are v3.x.

Upgrade path

  1. Take a backup: psql -p 5433 evosql -c '\COPY my_tbl TO …'.
  2. Stop 2.x: docker compose down.
  3. Replace the image tag with evolutiondb/evolutiondb:3.0.0.
  4. Start 3.0: docker compose up -d.
  5. Reload schema and data via \COPY FROM.

Documentation

Thanks

To everyone who tried 2.x and reported what didn't work — the agent-memory pivot started from those reports.