Memory Pipeline
Every meaningful exchange gets summarized, embedded, indexed, and made searchable across 44 per-agent SQLite databases. Search runs at 70% vector + 30% BM25 keyword hybrid.
The components
Section titled “The components”- Inputs: anything that flows through Claude — conversation text, file contents, tool results — gets queued for embedding.
- Embedding: Voyage-4 via Portkey (config slug
pc-opencl-22d508). Embeddings are cached by content hash so duplicate text doesn’t re-embed. - Storage: 44 SQLite databases at
~/.openclaw/memory/<agent>.sqlite. Each DB has 5 tables:chunks— raw text + metadatachunks_fts— SQLite FTS5 keyword indexchunks_vec— vec0 vector indexpending_saves— queue for async writesdead_letters— failed embeddings for retry
- Hybrid retrieval: when you call
memory_search, both indexes run in parallel. Vector search weights 0.7 (semantic similarity); BM25 keyword weights 0.3 (exact match). Scores fuse and rerank.
Per-agent isolation
Section titled “Per-agent isolation”Each agent has its own DB. The aurora agent’s memory is separate from acq’s. To search across all 44, the memory CLI accepts --agent <name> to scope or scan multiple.
How to query it
Section titled “How to query it”python3 ~/.openclaw/tools/claude-memory.py search "your query"python3 ~/.openclaw/tools/claude-memory.py search "your query" --agent acqpython3 ~/.openclaw/tools/claude-memory.py statsOr via MCP from inside Claude: memory_search (openclaw-tools server) returns top-K hits.
Total scale
Section titled “Total scale”~5,568 chunks fleet-wide as of last fleet check. Largest DBs are agent-specific working sets (aurora, acq, dispo); smallest are fresh agents (single-digit chunks).