Simple JSON-based Memory System for OpenClaw
A lightweight, stable alternative to LanceDB-Pro. No complex dependencies, no crashes, just reliable memory storage and retrieval.
| Feature | Description |
|---|---|
| JSON Storage | Simple JSON files, no database crashes |
| Vector Search | Semantic similarity using embeddings |
| Keyword Search | Basic text matching for exact queries |
| Hybrid Scoring | Combines similarity + recency |
| Auto Capture | Automatically extracts memories from conversations |
| Noise Filter | Filters out greetings and low-quality content |
| Session Memory | Separate memory spaces per session |
Edit config.json:
{
"embedding": {
"provider": "zhipu",
"apiKey": "your-api-key",
"model": "embedding-3",
"dimensions": 2048
}
}
const { captureMemories } = require('./scripts/capture');
const conversation = [
{ role: 'user', content: 'ๆๅๆฌขๅๅๅก' },
{ role: 'user', content: '่ฎฐไฝๆ็้ฎ็ฎฑๆฏ user@example.com' }
];
await captureMemories(conversation, 'session-id');
const { searchMemories } = require('./scripts/recall');
const results = await searchMemories('็จๆทๅๆฌขไปไน', {
topK: 5,
sessionId: 'session-id'
});
console.log(results);
memory-simple/
โโโ config.json # Configuration
โโโ package.json
โโโ SKILL.md # This file
โโโ memories/
โ โโโ global.json # Global memories
โ โโโ sessions/ # Session-specific memories
โ โโโ session-1.json
โ โโโ session-2.json
โโโ scripts/
โโโ utils.js # Utility functions
โโโ embedder.js # Embedding API
โโโ capture.js # Memory capture
โโโ recall.js # Memory retrieval
| Option | Description | Default |
|---|---|---|
provider |
Embedding provider | zhipu |
apiKey |
API key | Required |
model |
Model name | embedding-3 |
dimensions |
Vector dimensions | 2048 |
| Option | Description | Default |
|---|---|---|
enabled |
Enable auto-capture | true |
keywords |
Trigger keywords | See config |
minContentLength |
Minimum content length | 10 |
maxContentLength |
Maximum content length | 500 |
| Option | Description | Default |
|---|---|---|
enabled |
Enable recall | true |
topK |
Number of results | 5 |
minSimilarity |
Minimum similarity threshold | 0.7 |
recencyWeight |
Weight for recency (0-1) | 0.3 |
similarityWeight |
Weight for similarity (0-1) | 0.7 |
captureMemories(conversation, sessionId?)Automatically extracts and stores memories from conversation.
Parameters:
conversation (Array): Array of message objectssessionId (String, optional): Session identifierReturns: Promise
Example:
const memories = await captureMemories([
{ role: 'user', content: 'ๆๅๆฌขๅ่ถ' },
{ role: 'assistant', content: 'ๅฅฝ็' },
{ role: 'user', content: '่ฎฐๅพๆ้ๆไธๅๅผไผ' }
], 'session-123');
manualStore(content, type?, metadata?)Manually store a memory.
Parameters:
content (String): Memory contenttype (String): Memory type (preference, decision, important, general)metadata (Object): Additional metadataReturns: Promise
Example:
const memory = await manualStore(
'็จๆทๅๆฌข่่ฒ',
'preference',
{ source: 'manual' }
);
searchMemories(query, options?)Search for relevant memories.
Parameters:
query (String): Search queryoptions (Object):
topK (Number): Number of resultsminSimilarity (Number): Minimum similarity thresholdsessionId (String): Include session memoriesincludeGlobal (Boolean): Include global memoriesReturns: Promise
Example:
const results = await searchMemories('็จๆทๅๆฌขไปไน', {
topK: 3,
sessionId: 'session-123'
});
getRecentMemories(limit?, sessionId?)Get most recent memories.
Parameters:
limit (Number): Number of memories to retrievesessionId (String): Session identifierReturns: Array - Recent memories
formatMemoriesForContext(memories)Format memories for injection into LLM context.
Parameters:
memories (Array): Memories to formatReturns: String - Formatted context string
The system automatically categorizes memories:
| Type | Description | Example |
|---|---|---|
preference |
User likes/dislikes | "ๆๅๆฌขๅๅๅก" |
decision |
Important decisions | "ๆๅณๅฎ้ๆฉAๆนๆก" |
important |
Important information | "่ฎฐไฝ่ฟๆฏ้่ฆ็" |
general |
General facts | "็จๆทไฝๅจไธๆตท" |
cd ~/.openclaw/workspace/skills/memory-simple
# Test capture
node scripts/capture.js
# Test recall
node scripts/recall.js "็จๆทๅๆฌขไปไน"
const { captureMemories } = require('./scripts/capture');
const { searchMemories } = require('./scripts/recall');
async function test() {
// Capture
await captureMemories([
{ role: 'user', content: 'ๆๅๆฌขๅ็ปฟ่ถ' }
]);
// Recall
const results = await searchMemories('็จๆทๅๆฌขไปไน้ฅฎๆ');
console.log(results);
}
test();
capture.enabled is true in configrecall.enabled is truememories/global.jsonminSimilarity threshold| Aspect | memory-simple | LanceDB-Pro |
|---|---|---|
| Stability | โ Very stable | โ ๏ธ Can crash |
| Complexity | Simple | Complex |
| Features | Core features only | Advanced features |
| Dependencies | None | LanceDB, etc. |
| Performance | Good for small data | Better for large data |
| Maintenance | Easy | Requires expertise |
Choose memory-simple if:
Choose LanceDB-Pro if:
This is a custom skill for internal use. Feel free to modify and extend.
Created by Demi | 2026-03-04