| name | memory-lancedb-pro-openclaw |
| description | Expert skill for memory-lancedb-pro — a production-grade LanceDB-backed long-term memory plugin for OpenClaw agents with hybrid retrieval, cross-encoder reranking, multi-scope isolation, and smart auto-capture. |
| triggers | ["help me set up long-term memory for my OpenClaw agent","configure memory-lancedb-pro plugin","my agent keeps forgetting things between sessions","enable hybrid retrieval with BM25 and vector search","set up cross-encoder reranking for memory","how do I use memory_recall and memory_store tools","migrate or upgrade memory-lancedb-pro","configure multi-scope memory isolation per agent or user"] |
memory-lancedb-pro OpenClaw Plugin
Skill by ara.so — Daily 2026 Skills collection.
memory-lancedb-pro is a production-grade long-term memory plugin for OpenClaw agents. It stores preferences, decisions, and project context in a local LanceDB vector database and automatically recalls relevant memories before each agent reply. Key features: hybrid retrieval (vector + BM25 full-text), cross-encoder reranking, LLM-powered smart extraction (6 categories), Weibull decay-based forgetting, multi-scope isolation (agent/user/project), and a full management CLI.
Installation
Option A: One-Click Setup Script (Recommended)
curl -fsSL https://raw.githubusercontent.com/CortexReach/toolbox/main/memory-lancedb-pro-setup/setup-memory.sh -o setup-memory.sh
bash setup-memory.sh
Flags:
bash setup-memory.sh --dry-run
bash setup-memory.sh --beta
bash setup-memory.sh --uninstall
bash setup-memory.sh --selfcheck-only
The script handles fresh installs, upgrades from git-cloned versions, invalid config fields, broken CLI fallback, and provider presets (Jina, DashScope, SiliconFlow, OpenAI, Ollama).
Option B: OpenClaw CLI
openclaw plugins install memory-lancedb-pro@beta
Option C: npm
npm i memory-lancedb-pro@beta
Critical: When installing via npm, you must add the plugin's absolute install path to plugins.load.paths in openclaw.json. This is the most common setup issue.
Minimal Configuration (openclaw.json)
{
"plugins": {
"load": {
"paths": ["/absolute/path/to/node_modules/memory-lancedb-pro"]
},
"slots": { "memory": "memory-lancedb-pro" },
"entries": {
"memory-lancedb-pro": {
"enabled": true,
"config": {
"embedding": {
"provider": "openai-compatible",
"apiKey": "${OPENAI_API_KEY}",
"model": "text-embedding-3-small"
},
"autoCapture": true
Why these defaults:
autoCapture + smartExtraction → agent learns from conversations automatically, no manual calls needed
autoRecall → memories injected before each reply
extractMinMessages: 2 → triggers in normal two-turn chats
sessionMemory.enabled: false → avoids polluting retrieval with session summaries early on
Full Production Configuration
{
"plugins": {
"slots": { "memory": "memory-lancedb-pro" },
"entries": {
"memory-lancedb-pro": {
"enabled": true,
"config": {
"embedding": {
"provider": "openai-compatible",
"apiKey": "${OPENAI_API_KEY}",
"model": "text-embedding-3-small",
"baseURL": "https://api.openai.com/v1"
},
"reranker": {
"provider": "jina",
"apiKey": "${JINA_API_KEY}"
Provider Options for Embedding
| Provider | provider value | Notes |
|---|
| OpenAI / compatible | "openai-compatible" | Requires apiKey, optional baseURL |
| Jina | "jina" | Requires apiKey |
| Gemini | "gemini" | Requires apiKey |
| Ollama | "ollama" | Local, zero API cost, set baseURL |
| DashScope | "dashscope" | Requires apiKey |
| SiliconFlow | "siliconflow" | Requires apiKey, free reranker tier |
Deployment Plans
Full Power (Jina + OpenAI):
{
"embedding": { "provider": "jina", "apiKey": "${JINA_API_KEY}", "model": "jina-embeddings-v3" },
"reranker": { "provider": "jina", "apiKey": "${JINA_API_KEY}", "model": "jina-reranker-v2-base-multilingual" },
"extraction": { "provider": "openai-compatible", "apiKey": "${OPENAI_API_KEY}", "model": "gpt-4o-mini" }
}
Budget (SiliconFlow free reranker):
{
"embedding": { "provider": "openai-compatible", "apiKey": "${OPENAI_API_KEY}", "model": "text-embedding-3-small" },
"reranker": { "provider": "siliconflow", "apiKey": "${SILICONFLOW_API_KEY}", "model": "BAAI/bge-reranker-v2-m3" },
"extraction": { "provider": "openai-compatible", "apiKey": "${OPENAI_API_KEY}", "model": "gpt-4o-mini" }
}
Fully Local (Ollama, zero API cost):
{
"embedding": { "provider": "ollama", "baseURL": "http://localhost:11434", "model": "nomic-embed-text" },
"extraction": { "provider": "ollama", "baseURL": "http://localhost:11434", "model": "llama3" }
}
CLI Reference
Validate config and restart after any changes:
openclaw config validate
openclaw gateway restart
openclaw logs --follow --plain | grep "memory-lancedb-pro"
Expected startup log output:
memory-lancedb-pro: smart extraction enabled
memory-lancedb-pro@1.x.x: plugin registered
Memory Management CLI
openclaw memory-pro stats
openclaw memory-pro list
openclaw memory-pro list --scope user --limit 20
openclaw memory-pro list --filter "typescript"
openclaw memory-pro search "coding preferences"
openclaw memory-pro search "database decisions" --scope project
openclaw memory-pro forget <memory-id>
openclaw memory-pro export --scope global --output memories-backup.json
openclaw memory-pro export --scope user --output user-memories.json
openclaw memory-pro import --input memories-backup.json
openclaw memory-pro upgrade --dry-run
openclaw memory-pro upgrade
openclaw plugins info memory-lancedb-pro
MCP Tool API
The plugin exposes MCP tools to the agent. Core tools are always available; management tools require enableManagementTools: true in config.
Core Tools (always available)
memory_recall
Retrieve relevant memories for a query.
const results = await memory_recall({
query: "user's preferred code style",
scope: "user",
topK: 5
});
memory_store
Manually store a memory.
await memory_store({
content: "User prefers tabs over spaces, always wants error handling",
category: "preference",
scope: "user",
tags: ["coding-style", "typescript"]
});
memory_forget
Delete a specific memory by ID.
await memory_forget({ id: "mem_abc123" });
memory_update
Update an existing memory.
await memory_update({
id: "mem_abc123",
content: "User now prefers 2-space indentation (changed from tabs on 2026-03-01)",
category: "preference"
});
Management Tools (requires enableManagementTools: true)
memory_stats
const stats = await memory_stats({ scope: "global" });
memory_list
const list = await memory_list({ scope: "user", limit: 20, offset: 0 });
self_improvement_log
Log an agent learning event for meta-improvement tracking.
await self_improvement_log({
event: "user corrected indentation preference",
context: "User asked me to switch from tabs to spaces",
improvement: "Updated coding-style preference memory"
});
self_improvement_extract_skill
Extract a reusable pattern from a conversation.
await self_improvement_extract_skill({
conversation: "...",
domain: "code-review",
skillName: "typescript-strict-mode-setup"
});
self_improvement_review
Review and consolidate recent self-improvement logs.
await self_improvement_review({ days: 7 });
Smart Extraction: 6 Memory Categories
When smartExtraction: true, the LLM automatically classifies memories into:
| Category | What gets stored | Example |
|---|
profile | User identity, background | "User is a senior TypeScript developer" |
preference | Style, tool, workflow choices | "Prefers functional programming patterns" |
entity | Projects, people, systems | "Project 'Falcon' uses PostgreSQL + Redis" |
event | Decisions made, things that happened | "Chose Vite over webpack on 2026-02-15" |
case | Solutions to specific problems | "Fixed CORS by adding proxy in vite.config.ts" |
pattern | Recurring behaviors, habits | "Always asks for tests before implementation" |
Hybrid Retrieval Internals
With retrieval.mode: "hybrid", every recall runs:
- Vector search — semantic similarity via embeddings (weight:
vectorWeight, default 0.7)
- BM25 full-text search — keyword matching (weight:
bm25Weight, default 0.3)
- Score fusion — results merged with weighted RRF (Reciprocal Rank Fusion)
- Cross-encoder rerank — top
candidatePoolSize candidates reranked by a cross-encoder model
- Score filtering — results below
hardMinScore are dropped
"retrieval": {
"mode": "hybrid",
"vectorWeight": 0.7,
"bm25Weight": 0.3,
"topK": 10
},
"rerank": {
"enabled": true,
"type": "cross-encoder",
"candidatePoolSize": 12,
"minScore": 0.6,
"hardMinScore": 0.62
}
Retrieval mode options:
"vector" — pure semantic search only
"bm25" — pure keyword search only
"hybrid" — both fused (recommended)
Multi-Scope Isolation
Scopes let you isolate memories by context. Enabling all three gives maximum flexibility:
"scopes": {
"agent": true,
"user": true,
"project": true
}
When recalling, specify scope to narrow results:
await memory_recall({ query: "database choices", scope: "project" });
await memory_recall({ query: "coding style", scope: "user" });
await memory_recall({ query: "error handling patterns", scope: "global" });
Weibull Decay Model
Memories naturally fade over time. The decay model prevents stale memories from polluting retrieval.
"decay": {
"enabled": true,
"model": "weibull",
"halfLifeDays": 30
}
- Memories accessed frequently get their decay clock reset
- Important, repeatedly-recalled memories effectively become permanent
- Noise and one-off mentions fade naturally after ~30 days
Upgrading
From pre-v1.1.0
openclaw memory-pro export --scope global --output memories-backup-$(date +%Y%m%d).json
openclaw memory-pro upgrade --dry-run
openclaw memory-pro upgrade
openclaw memory-pro stats
See CHANGELOG-v1.1.0.md in the repo for behavior changes and upgrade rationale.
Troubleshooting
Plugin not loading
openclaw plugins info memory-lancedb-pro
openclaw config validate
openclaw logs --follow --plain | grep "memory-lancedb-pro"
Common causes:
- Missing or relative
plugins.load.paths (must be absolute when using npm install)
plugins.slots.memory not set to "memory-lancedb-pro"
- Plugin not listed under
plugins.entries
autoRecall not injecting memories
By default autoRecall is false in some versions — explicitly set it to true:
"autoRecall": true
Also confirm the plugin is bound to the memory slot, not just loaded.
Jiti cache issues after upgrade
rm -rf ~/.openclaw/.cache/jiti
openclaw gateway restart
Memories not being extracted from conversations
- Check
extractMinMessages — must be ≥ number of turns in the conversation (set to 2 for normal chats)
- Check
extractMaxChars — very long contexts may be truncated; increase to 12000 if needed
- Verify extraction LLM config has a valid
apiKey and reachable endpoint
- Check logs:
openclaw logs --follow --plain | grep "extraction"
Retrieval returns nothing or poor results
- Confirm
retrieval.mode is "hybrid" not "bm25" alone (BM25 requires indexed content)
- Lower
rerank.hardMinScore temporarily (try 0.4) to see if results exist but are being filtered
- Check embedding model is consistent between store and recall operations — changing models requires re-embedding
Environment variable not resolving
Ensure env vars are exported in the shell that runs OpenClaw, or use a .env file loaded by your process manager. The ${VAR} syntax in openclaw.json is resolved at startup.
export OPENAI_API_KEY="sk-..."
export JINA_API_KEY="jina_..."
openclaw gateway restart
Telegram Bot Quick Config Import
If using OpenClaw's Telegram integration, send this to the bot to auto-configure:
Help me connect this memory plugin with the most user-friendly configuration:
https://github.com/CortexReach/memory-lancedb-pro
Requirements:
1. Set it as the only active memory plugin
2. Use Jina for embedding
3. Use Jina for reranker
4. Use gpt-4o-mini for the smart-extraction LLM
5. Enable autoCapture, autoRecall, smartExtraction
6. extractMinMessages=2
7. sessionMemory.enabled=false
8. captureAssistant=false
9. retrieval mode=hybrid, vectorWeight=0.7, bm25Weight=0.3
10. rerank=cross-encoder, candidatePoolSize=12, minScore=0.6, hardMinScore=0.62
11. Generate the final openclaw.json config directly, not just an explanation
Resources