--- name: chromadb-memory description: Long-term memory via ChromaDB with local Ollama embeddings. Auto-recall injects relevant context every turn. No cloud APIs required — fully self-hosted. version: 1.0.0 author: matts homepage: https://github.com/openclaw/openclaw metadata: openclaw: emoji: "🧠" requires: bins: ["curl"] category: "memory" tags: - memory - chromadb - ollama - vector-search - local - self-hosted - auto-recall --- # ChromaDB Memory Long-term semantic memory backed by ChromaDB and local Ollama embeddings. Zero cloud dependencies. ## What It Does - **Auto-recall**: Before every agent turn, queries ChromaDB with the user's message and injects relevant context automatically - **`chromadb_search` tool**: Manual semantic search over your ChromaDB collection - **100% local**: Ollama (nomic-embed-text) for embeddings, ChromaDB for vector storage ## Prerequisites 1. **ChromaDB** running (Docker recommended): ```bash docker run -d --name chromadb -p 8100:8000 chromadb/chroma:latest ``` 2. **Ollama** with an embedding model: ```bash ollama pull nomic-embed-text ``` 3. **Indexed documents** in ChromaDB. Use any ChromaDB-compatible indexer to populate your collection. ## Install ```bash # 1. Copy the plugin extension mkdir -p ~/.openclaw/extensions/chromadb-memory cp {baseDir}/scripts/index.ts ~/.openclaw/extensions/chromadb-memory/ cp {baseDir}/scripts/openclaw.plugin.json ~/.openclaw/extensions/chromadb-memory/ # 2. Get your collection ID curl -s http://localhost:8100/api/v2/tenants/default_tenant/databases/default_database/collections | python3 -c "import json,sys; [print(f'{c[\"id\"]} {c[\"name\"]}') for c in json.load(sys.stdin)]" # 3. Add to your OpenClaw config (~/.openclaw/openclaw.json): ``` ```json { "plugins": { "entries": { "chromadb-memory": { "enabled": true, "config": { "chromaUrl": "http://localhost:8100", "collectionId": "YOUR_COLLECTION_ID", "ollamaUrl": "http://localhost:11434", "embeddingModel": "nomic-embed-text", "autoRecall": true, "autoRecallResults": 3, "minScore": 0.5 } } } } } ``` ```bash # 4. Restart the gateway openclaw gateway restart ``` ## Config Options | Option | Default | Description | |--------|---------|-------------| | `chromaUrl` | `http://localhost:8100` | ChromaDB server URL | | `collectionId` | *required* | ChromaDB collection UUID | | `ollamaUrl` | `http://localhost:11434` | Ollama API URL | | `embeddingModel` | `nomic-embed-text` | Ollama embedding model | | `autoRecall` | `true` | Auto-inject relevant memories each turn | | `autoRecallResults` | `3` | Max auto-recall results per turn | | `minScore` | `0.5` | Minimum similarity score (0-1) | ## How It Works 1. You send a message 2. Plugin embeds your message via Ollama (nomic-embed-text, 768 dimensions) 3. Queries ChromaDB for nearest neighbors 4. Results above `minScore` are injected into the agent's context as `` 5. Agent responds with relevant long-term context available ## Token Cost Auto-recall adds ~275 tokens per turn worst case (3 results × ~300 chars + wrapper). Against a 200K+ context window, this is negligible. ## Tuning - **Too noisy?** Raise `minScore` to 0.6 or 0.7 - **Missing context?** Lower `minScore` to 0.4, increase `autoRecallResults` to 5 - **Want manual only?** Set `autoRecall: false`, use `chromadb_search` tool ## Architecture ``` User Message → Ollama (embed) → ChromaDB (query) → Context Injection ↓ Agent Response ``` No OpenAI. No cloud. Your memories stay on your hardware.