AssetManager.UniApp/plugins/memory-lancedb-pro/openclaw.plugin.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
}
}
}