lily-memory
v5.2.3Persistent memory plugin for OpenClaw agents. Hybrid SQLite FTS5 keyword + Ollama vector semantic search with auto-capture, auto-recall, stuck-detection, and memory consolidation.
Installation
Please help me install the skill `lily-memory` from SkillHub official store.
npx skills add kevinodell/lily-memory
Lily Memory
Persistent memory plugin for OpenClaw agents. Gives your agent long-term memory that survives session resets, compaction, and restarts.
What It Does
- Auto-recall: Injects relevant memories as context before each LLM turn
- Auto-capture: Extracts facts from conversations and stores them automatically
- Hybrid search: SQLite FTS5 keyword search + Ollama vector cosine similarity
- Stuck detection: Detects topic repetition and nudges the agent to break loops
- Memory consolidation: Deduplicates entries on startup
- Dynamic entities: Config-driven allowlist + runtime tool to add entities
- Graceful degradation: Works without Ollama (keyword-only mode)
- Minimal dependencies: Uses better-sqlite3 for secure parameterized queries + native fetch
Requirements
- Node.js 18+ (for native
fetch) better-sqlite3npm package (installed vianpm install)- Optional: Ollama with
nomic-embed-textmodel for semantic search
Quick Start
- Install the plugin to your extensions directory
- Add to your
openclaw.json:
{
"plugins": {
"slots": { "memory": "lily-memory" },
"entries": {
"lily-memory": {
"enabled": true,
"config": {
"dbPath": "~/.openclaw/memory/decisions.db",
"entities": ["config", "system"]
}
}
}
}
}
- Restart the gateway:
openclaw gateway restart
Tools
| Tool | Description |
|---|---|
memory_search |
FTS5 keyword search across all facts |
memory_entity |
Look up all facts for a specific entity |
memory_store |
Save a fact to persistent memory |
memory_semantic_search |
Vector similarity search via Ollama |
memory_add_entity |
Register a new entity at runtime |
Configuration
| Option | Type | Default | Description |
|---|---|---|---|
dbPath |
string | ~/.openclaw/memory/decisions.db |
SQLite database path |
autoRecall |
boolean | true |
Inject memories before each turn |
autoCapture |
boolean | true |
Extract facts from responses |
maxRecallResults |
number | 10 |
Max memories per turn |
maxCapturePerTurn |
number | 5 |
Max facts per response |
stuckDetection |
boolean | true |
Topic repetition detection |
vectorSearch |
boolean | true |
Ollama semantic search |
ollamaUrl |
string | http://localhost:11434 |
Ollama endpoint |
embeddingModel |
string | nomic-embed-text |
Embedding model |
consolidation |
boolean | true |
Dedup on startup |
vectorSimilarityThreshold |
number | 0.5 |
Min cosine similarity |
entities |
array | [] |
Additional entity names |
Architecture
Recall flow: Extract keywords from message -> FTS5 + vector search -> merge and deduplicate -> inject as context
Capture flow: Regex scan for entity: key = value patterns -> validate entity against allowlist -> store to SQLite -> async embed via Ollama
Stuck detection: Track top 5 content words per response -> Jaccard similarity -> if 3+ consecutive >60% overlap, inject Reflexion nudge
License
MIT