๐Ÿง  memory-simple

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.


โœจ Features

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

๐Ÿš€ Quick Start

1. Configuration

Edit config.json:

{
  "embedding": {
    "provider": "zhipu",
    "apiKey": "your-api-key",
    "model": "embedding-3",
    "dimensions": 2048
  }
}

2. Capture Memories

const { captureMemories } = require('./scripts/capture');

const conversation = [
  { role: 'user', content: 'ๆˆ‘ๅ–œๆฌขๅ–ๅ’–ๅ•ก' },
  { role: 'user', content: '่ฎฐไฝๆˆ‘็š„้‚ฎ็ฎฑๆ˜ฏ user@example.com' }
];

await captureMemories(conversation, 'session-id');

3. Recall Memories

const { searchMemories } = require('./scripts/recall');

const results = await searchMemories('็”จๆˆทๅ–œๆฌขไป€ไนˆ', {
  topK: 5,
  sessionId: 'session-id'
});

console.log(results);

๐Ÿ“ File Structure

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

โš™๏ธ Configuration

Embedding Settings

Option Description Default
provider Embedding provider zhipu
apiKey API key Required
model Model name embedding-3
dimensions Vector dimensions 2048

Capture Settings

Option Description Default
enabled Enable auto-capture true
keywords Trigger keywords See config
minContentLength Minimum content length 10
maxContentLength Maximum content length 500

Recall Settings

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

๐Ÿ”ง API Reference

Capture Module

captureMemories(conversation, sessionId?)

Automatically extracts and stores memories from conversation.

Parameters:

Returns: Promise - Captured memories

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:

Returns: Promise - Stored memory

Example:

const memory = await manualStore(
  '็”จๆˆทๅ–œๆฌข่“่‰ฒ',
  'preference',
  { source: 'manual' }
);

Recall Module

searchMemories(query, options?)

Search for relevant memories.

Parameters:

Returns: Promise - Matching memories with scores

Example:

const results = await searchMemories('็”จๆˆทๅ–œๆฌขไป€ไนˆ', {
  topK: 3,
  sessionId: 'session-123'
});

getRecentMemories(limit?, sessionId?)

Get most recent memories.

Parameters:

Returns: Array - Recent memories

formatMemoriesForContext(memories)

Format memories for injection into LLM context.

Parameters:

Returns: String - Formatted context string


๐ŸŽฏ Memory Types

The system automatically categorizes memories:

Type Description Example
preference User likes/dislikes "ๆˆ‘ๅ–œๆฌขๅ–ๅ’–ๅ•ก"
decision Important decisions "ๆˆ‘ๅ†ณๅฎš้€‰ๆ‹ฉAๆ–นๆกˆ"
important Important information "่ฎฐไฝ่ฟ™ๆ˜ฏ้‡่ฆ็š„"
general General facts "็”จๆˆทไฝๅœจไธŠๆตท"

๐Ÿงช Testing

Run Tests

cd ~/.openclaw/workspace/skills/memory-simple

# Test capture
node scripts/capture.js

# Test recall
node scripts/recall.js "็”จๆˆทๅ–œๆฌขไป€ไนˆ"

Manual Test

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();

๐Ÿ”’ Privacy & Security


๐Ÿ› Troubleshooting

No memories being captured

  1. Check capture.enabled is true in config
  2. Verify content contains capture keywords
  3. Check content length is within limits

Search returns no results

  1. Check recall.enabled is true
  2. Verify memories exist in memories/global.json
  3. Try lowering minSimilarity threshold

Embedding API errors

  1. Verify API key is correct
  2. Check network connectivity
  3. Review API rate limits

๐Ÿ“ Comparison with LanceDB-Pro

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:


๐Ÿค Contributing

This is a custom skill for internal use. Feel free to modify and extend.


Created by Demi | 2026-03-04