454 lines
15 KiB
JSON
454 lines
15 KiB
JSON
{
|
|
"id": "memory-lancedb-pro",
|
|
"name": "Memory (LanceDB Pro)",
|
|
"description": "Enhanced LanceDB-backed long-term memory with hybrid retrieval, multi-scope isolation, long-context chunking, and management CLI",
|
|
"version": "1.0.26",
|
|
"kind": "memory",
|
|
"configSchema": {
|
|
"type": "object",
|
|
"additionalProperties": false,
|
|
"properties": {
|
|
"embedding": {
|
|
"type": "object",
|
|
"additionalProperties": false,
|
|
"properties": {
|
|
"provider": {
|
|
"type": "string",
|
|
"const": "openai-compatible"
|
|
},
|
|
"apiKey": {
|
|
"oneOf": [
|
|
{
|
|
"type": "string",
|
|
"minLength": 1
|
|
},
|
|
{
|
|
"type": "array",
|
|
"items": {
|
|
"type": "string",
|
|
"minLength": 1
|
|
},
|
|
"minItems": 1
|
|
}
|
|
],
|
|
"description": "Single API key or array of keys for round-robin rotation"
|
|
},
|
|
"model": {
|
|
"type": "string"
|
|
},
|
|
"baseURL": {
|
|
"type": "string"
|
|
},
|
|
"dimensions": {
|
|
"type": "integer",
|
|
"minimum": 1
|
|
},
|
|
"taskQuery": {
|
|
"type": "string",
|
|
"description": "Embedding task for queries (provider-specific, e.g. Jina: retrieval.query)"
|
|
},
|
|
"taskPassage": {
|
|
"type": "string",
|
|
"description": "Embedding task for passages/documents (provider-specific, e.g. Jina: retrieval.passage)"
|
|
},
|
|
"normalized": {
|
|
"type": "boolean",
|
|
"description": "Request normalized embeddings when supported by the provider (e.g. Jina v5)"
|
|
},
|
|
"chunking": {
|
|
"type": "boolean",
|
|
"default": true,
|
|
"description": "Enable automatic chunking for documents exceeding embedding context limits"
|
|
}
|
|
},
|
|
"required": [
|
|
"apiKey"
|
|
]
|
|
},
|
|
"dbPath": {
|
|
"type": "string"
|
|
},
|
|
"enableManagementTools": {
|
|
"type": "boolean",
|
|
"default": false,
|
|
"description": "Enable memory_list and memory_stats management tools"
|
|
},
|
|
"autoCapture": {
|
|
"type": "boolean"
|
|
},
|
|
"autoRecall": {
|
|
"type": "boolean",
|
|
"default": false
|
|
},
|
|
"autoRecallMinLength": {
|
|
"type": "integer",
|
|
"minimum": 1,
|
|
"maximum": 200,
|
|
"default": 15,
|
|
"description": "Minimum prompt length (in characters) to trigger auto-recall. Prompts shorter than this are skipped. Default: 15 for English, 6 for CJK."
|
|
},
|
|
"autoRecallMinRepeated": {
|
|
"type": "integer",
|
|
"minimum": 0,
|
|
"maximum": 100,
|
|
"default": 0,
|
|
"description": "Minimum number of turns before the same memory can be recalled again in the same session. Set to 0 to disable deduplication (default behavior: inject all memories)."
|
|
},
|
|
"captureAssistant": {
|
|
"type": "boolean"
|
|
},
|
|
"retrieval": {
|
|
"type": "object",
|
|
"additionalProperties": false,
|
|
"properties": {
|
|
"mode": {
|
|
"type": "string",
|
|
"enum": [
|
|
"hybrid",
|
|
"vector"
|
|
],
|
|
"default": "hybrid"
|
|
},
|
|
"vectorWeight": {
|
|
"type": "number",
|
|
"minimum": 0,
|
|
"maximum": 1,
|
|
"default": 0.7
|
|
},
|
|
"bm25Weight": {
|
|
"type": "number",
|
|
"minimum": 0,
|
|
"maximum": 1,
|
|
"default": 0.3
|
|
},
|
|
"minScore": {
|
|
"type": "number",
|
|
"minimum": 0,
|
|
"maximum": 1,
|
|
"default": 0.3
|
|
},
|
|
"rerank": {
|
|
"type": "string",
|
|
"enum": [
|
|
"cross-encoder",
|
|
"lightweight",
|
|
"none"
|
|
],
|
|
"default": "cross-encoder"
|
|
},
|
|
"rerankApiKey": {
|
|
"type": "string",
|
|
"description": "API key for reranker service (enables cross-encoder reranking)"
|
|
},
|
|
"rerankModel": {
|
|
"type": "string",
|
|
"default": "jina-reranker-v3",
|
|
"description": "Reranker model name"
|
|
},
|
|
"rerankEndpoint": {
|
|
"type": "string",
|
|
"default": "https://api.jina.ai/v1/rerank",
|
|
"description": "Reranker API endpoint URL. Compatible with Jina, SiliconFlow, Pinecone, or any service with a similar interface."
|
|
},
|
|
"rerankProvider": {
|
|
"type": "string",
|
|
"enum": [
|
|
"jina",
|
|
"siliconflow",
|
|
"voyage",
|
|
"pinecone"
|
|
],
|
|
"default": "jina",
|
|
"description": "Reranker provider format. Determines request/response shape and auth header."
|
|
},
|
|
"candidatePoolSize": {
|
|
"type": "integer",
|
|
"minimum": 10,
|
|
"maximum": 100,
|
|
"default": 20
|
|
},
|
|
"recencyHalfLifeDays": {
|
|
"type": "number",
|
|
"minimum": 0,
|
|
"maximum": 365,
|
|
"default": 14,
|
|
"description": "Half-life in days for recency boost. Newer memories get higher scores. Set 0 to disable."
|
|
},
|
|
"recencyWeight": {
|
|
"type": "number",
|
|
"minimum": 0,
|
|
"maximum": 0.5,
|
|
"default": 0.1,
|
|
"description": "Maximum recency boost factor added to score"
|
|
},
|
|
"filterNoise": {
|
|
"type": "boolean",
|
|
"default": true,
|
|
"description": "Filter out noise memories (agent denials, meta-questions, boilerplate)"
|
|
},
|
|
"lengthNormAnchor": {
|
|
"type": "integer",
|
|
"minimum": 0,
|
|
"maximum": 5000,
|
|
"default": 500,
|
|
"description": "Length normalization anchor in chars. Entries longer than this get score penalized. Set 0 to disable."
|
|
},
|
|
"hardMinScore": {
|
|
"type": "number",
|
|
"minimum": 0,
|
|
"maximum": 1,
|
|
"default": 0.35,
|
|
"description": "Hard cutoff after all scoring stages. Results below this score are discarded."
|
|
},
|
|
"timeDecayHalfLifeDays": {
|
|
"type": "number",
|
|
"minimum": 0,
|
|
"maximum": 365,
|
|
"default": 60,
|
|
"description": "Time decay half-life in days. Old entries lose score gradually. Floor at 0.5x. Set 0 to disable."
|
|
},
|
|
"reinforcementFactor": {
|
|
"type": "number",
|
|
"minimum": 0,
|
|
"maximum": 2,
|
|
"default": 0.5,
|
|
"description": "Access reinforcement factor for time decay. Frequently recalled memories decay slower. 0 to disable."
|
|
},
|
|
"maxHalfLifeMultiplier": {
|
|
"type": "number",
|
|
"minimum": 1,
|
|
"maximum": 10,
|
|
"default": 3,
|
|
"description": "Maximum half-life multiplier from access reinforcement. Prevents frequently accessed memories from becoming immortal."
|
|
}
|
|
}
|
|
},
|
|
"sessionMemory": {
|
|
"type": "object",
|
|
"additionalProperties": false,
|
|
"properties": {
|
|
"enabled": {
|
|
"type": "boolean",
|
|
"default": true,
|
|
"description": "Store session summaries to LanceDB on /new command (replaces built-in session-memory hook)"
|
|
},
|
|
"messageCount": {
|
|
"type": "integer",
|
|
"minimum": 1,
|
|
"maximum": 100,
|
|
"default": 15,
|
|
"description": "Number of recent messages to include in session summary"
|
|
}
|
|
}
|
|
},
|
|
"scopes": {
|
|
"type": "object",
|
|
"additionalProperties": false,
|
|
"properties": {
|
|
"default": {
|
|
"type": "string",
|
|
"default": "global"
|
|
},
|
|
"definitions": {
|
|
"type": "object",
|
|
"additionalProperties": {
|
|
"type": "object",
|
|
"properties": {
|
|
"description": {
|
|
"type": "string"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"agentAccess": {
|
|
"type": "object",
|
|
"additionalProperties": {
|
|
"type": "array",
|
|
"items": {
|
|
"type": "string"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"required": [
|
|
"embedding"
|
|
]
|
|
},
|
|
"uiHints": {
|
|
"embedding.apiKey": {
|
|
"label": "API Key(s)",
|
|
"sensitive": true,
|
|
"placeholder": "sk-proj-... or [\"key1\", \"key2\"] for rotation",
|
|
"help": "Single API key or array of keys for round-robin rotation with automatic failover on rate limits (or use ${OPENAI_API_KEY}; use a dummy value for keyless local endpoints)"
|
|
},
|
|
"embedding.model": {
|
|
"label": "Embedding Model",
|
|
"placeholder": "text-embedding-3-small",
|
|
"help": "Embedding model name (e.g. text-embedding-3-small, gemini-embedding-001, nomic-embed-text)"
|
|
},
|
|
"embedding.baseURL": {
|
|
"label": "Base URL",
|
|
"placeholder": "https://api.openai.com/v1",
|
|
"help": "Custom base URL for OpenAI-compatible embedding endpoints (e.g. https://generativelanguage.googleapis.com/v1beta/openai/ for Gemini, http://localhost:11434/v1 for Ollama)",
|
|
"advanced": true
|
|
},
|
|
"embedding.dimensions": {
|
|
"label": "Vector Dimensions",
|
|
"placeholder": "auto-detected from model",
|
|
"help": "Override vector dimensions for custom models not in the built-in lookup table",
|
|
"advanced": true
|
|
},
|
|
"embedding.taskQuery": {
|
|
"label": "Query Task",
|
|
"placeholder": "retrieval.query",
|
|
"help": "Optional task selector for query embeddings (Jina: retrieval.query). If unset, no task field is sent.",
|
|
"advanced": true
|
|
},
|
|
"embedding.taskPassage": {
|
|
"label": "Passage Task",
|
|
"placeholder": "retrieval.passage",
|
|
"help": "Optional task selector for passage/document embeddings (Jina: retrieval.passage). If unset, no task field is sent.",
|
|
"advanced": true
|
|
},
|
|
"embedding.normalized": {
|
|
"label": "Normalized Embeddings",
|
|
"help": "Request normalized embeddings when the provider supports it (Jina v5). If unset, the field is not sent.",
|
|
"advanced": true
|
|
},
|
|
"embedding.chunking": {
|
|
"label": "Auto-Chunk Documents",
|
|
"help": "Automatically split long documents into chunks when they exceed embedding context limits. Set to false to disable and let the model fail on long documents.",
|
|
"advanced": true
|
|
},
|
|
"dbPath": {
|
|
"label": "Database Path",
|
|
"placeholder": "~/.openclaw/memory/lancedb-pro",
|
|
"help": "Directory path for the LanceDB database files",
|
|
"advanced": true
|
|
},
|
|
"autoCapture": {
|
|
"label": "Auto-Capture",
|
|
"help": "Automatically capture important information from conversations"
|
|
},
|
|
"autoRecall": {
|
|
"label": "Auto-Recall",
|
|
"help": "Automatically inject relevant memories into context"
|
|
},
|
|
"autoRecallMinLength": {
|
|
"label": "Auto-Recall Min Length",
|
|
"help": "Minimum prompt length to trigger auto-recall (shorter prompts are skipped). Default: 15 chars for English, 6 for CJK.",
|
|
"advanced": true
|
|
},
|
|
"autoRecallMinRepeated": {
|
|
"label": "Auto-Recall Min Repeated",
|
|
"help": "Minimum number of conversation turns before a specific memory can be re-injected in the same session.",
|
|
"advanced": true
|
|
},
|
|
"captureAssistant": {
|
|
"label": "Capture Assistant Messages",
|
|
"help": "Also auto-capture assistant messages (default false to reduce memory pollution)",
|
|
"advanced": true
|
|
},
|
|
"retrieval.mode": {
|
|
"label": "Retrieval Mode",
|
|
"help": "Use hybrid search (vector + BM25) or vector-only for backward compatibility",
|
|
"advanced": true
|
|
},
|
|
"retrieval.vectorWeight": {
|
|
"label": "Vector Search Weight",
|
|
"help": "Weight for vector similarity in hybrid search (0-1)",
|
|
"advanced": true
|
|
},
|
|
"retrieval.bm25Weight": {
|
|
"label": "BM25 Search Weight",
|
|
"help": "Weight for BM25 keyword search in hybrid search (0-1)",
|
|
"advanced": true
|
|
},
|
|
"retrieval.minScore": {
|
|
"label": "Minimum Score Threshold",
|
|
"help": "Drop results below this relevance score (0-1)",
|
|
"advanced": true
|
|
},
|
|
"retrieval.rerank": {
|
|
"label": "Reranking Mode",
|
|
"help": "Re-score fused results for better quality (cross-encoder uses configured reranker API)",
|
|
"advanced": true
|
|
},
|
|
"retrieval.rerankApiKey": {
|
|
"label": "Reranker API Key",
|
|
"sensitive": true,
|
|
"placeholder": "jina_... / sk-... / pcsk_...",
|
|
"help": "Reranker API key for cross-encoder reranking",
|
|
"advanced": true
|
|
},
|
|
"retrieval.rerankModel": {
|
|
"label": "Reranker Model",
|
|
"placeholder": "jina-reranker-v3",
|
|
"help": "Reranker model name (e.g. jina-reranker-v3, BAAI/bge-reranker-v2-m3)",
|
|
"advanced": true
|
|
},
|
|
"retrieval.rerankEndpoint": {
|
|
"label": "Reranker Endpoint",
|
|
"placeholder": "https://api.jina.ai/v1/rerank",
|
|
"help": "Custom reranker API endpoint URL",
|
|
"advanced": true
|
|
},
|
|
"retrieval.rerankProvider": {
|
|
"label": "Reranker Provider",
|
|
"help": "Provider format: jina (default), siliconflow, voyage, or pinecone",
|
|
"advanced": true
|
|
},
|
|
"retrieval.candidatePoolSize": {
|
|
"label": "Candidate Pool Size",
|
|
"help": "Number of candidates to fetch before fusion and reranking",
|
|
"advanced": true
|
|
},
|
|
"retrieval.lengthNormAnchor": {
|
|
"label": "Length Normalization Anchor",
|
|
"help": "Entries longer than this (chars) get score penalized to prevent long entries dominating. 0 = disabled.",
|
|
"advanced": true
|
|
},
|
|
"retrieval.hardMinScore": {
|
|
"label": "Hard Minimum Score",
|
|
"help": "Discard results below this score after all scoring stages. Higher = fewer but more relevant results.",
|
|
"advanced": true
|
|
},
|
|
"retrieval.timeDecayHalfLifeDays": {
|
|
"label": "Time Decay Half-Life",
|
|
"help": "Old entries lose score over this many days. Floor at 0.5x. 0 = disabled.",
|
|
"advanced": true
|
|
},
|
|
"sessionMemory.enabled": {
|
|
"label": "Session Memory",
|
|
"help": "Store session summaries to LanceDB when /new is triggered (replaces built-in session-memory hook)"
|
|
},
|
|
"sessionMemory.messageCount": {
|
|
"label": "Session Message Count",
|
|
"help": "Number of recent messages to include in session summaries",
|
|
"advanced": true
|
|
},
|
|
"scopes.default": {
|
|
"label": "Default Scope",
|
|
"help": "Default memory scope for new memories",
|
|
"advanced": true
|
|
},
|
|
"scopes.definitions": {
|
|
"label": "Scope Definitions",
|
|
"help": "Define custom memory scopes with descriptions",
|
|
"advanced": true
|
|
},
|
|
"scopes.agentAccess": {
|
|
"label": "Agent Access Control",
|
|
"help": "Define which scopes each agent can access",
|
|
"advanced": true
|
|
},
|
|
"enableManagementTools": {
|
|
"label": "Management Tools",
|
|
"help": "Enable memory_list and memory_stats tools for debugging and auditing",
|
|
"advanced": true
|
|
}
|
|
}
|
|
}
|