Appearance
本页列出 OpenClaw 记忆搜索的每一个配置项。涵盖嵌入提供商自动检测逻辑、API 密钥解析、Gemini/Bedrock/本地嵌入专项配置、混合搜索调优(BM25+向量权重、MMR 多样性、时间衰减)、多模态索引、QMD 后端完整参数,以及 Dreaming 实验性功能的配置入口。
记忆搜索配置参考
本页列出 OpenClaw 记忆搜索的所有配置项。概念层面的说明请参见:
除非另有说明,所有记忆搜索配置均位于 openclaw.json 的 agents.defaults.memorySearch 下。
提供商选择
| 配置项 | 类型 | 默认值 | 说明 |
|---|---|---|---|
provider | string | 自动检测 | 嵌入适配器 ID:openai、gemini、voyage、mistral、bedrock、ollama、local |
model | string | 提供商默认 | 嵌入模型名称 |
fallback | string | "none" | 主提供商失败时的备用适配器 ID |
enabled | boolean | true | 启用或禁用记忆搜索 |
自动检测顺序
未设置 provider 时,OpenClaw 按顺序选择第一个可用的:
local— 如果memorySearch.local.modelPath已配置且文件存在。openai— 如果能解析到 OpenAI 密钥。gemini— 如果能解析到 Gemini 密钥。voyage— 如果能解析到 Voyage 密钥。mistral— 如果能解析到 Mistral 密钥。bedrock— 如果 AWS SDK 凭证链能解析(实例角色、访问密钥、profile、SSO、Web identity 或共享配置)。
ollama 支持但不会自动检测(需要显式设置)。
API 密钥解析
远程嵌入需要 API 密钥。Bedrock 使用 AWS SDK 默认凭证链(实例角色、SSO、访问密钥),不需要 API 密钥。
| 提供商 | 环境变量 | 配置项 |
|---|---|---|
| OpenAI | OPENAI_API_KEY | models.providers.openai.apiKey |
| Gemini | GEMINI_API_KEY | models.providers.google.apiKey |
| Voyage | VOYAGE_API_KEY | models.providers.voyage.apiKey |
| Mistral | MISTRAL_API_KEY | models.providers.mistral.apiKey |
| Bedrock | AWS 凭证链 | 不需要 API 密钥 |
| Ollama | OLLAMA_API_KEY(占位符) | — |
Codex OAuth 只覆盖 chat/completions,不满足嵌入请求。
远程端点配置
自定义 OpenAI 兼容端点或覆盖提供商默认值:
| 配置项 | 类型 | 说明 |
|---|---|---|
remote.baseUrl | string | 自定义 API 基础 URL |
remote.apiKey | string | 覆盖 API 密钥 |
remote.headers | object | 额外 HTTP 头(与提供商默认值合并) |
json5
{
agents: {
defaults: {
memorySearch: {
provider: "openai",
model: "text-embedding-3-small",
remote: {
baseUrl: "https://api.example.com/v1/",
apiKey: "YOUR_KEY",
},
},
},
},
}Gemini 专项配置
| 配置项 | 类型 | 默认值 | 说明 |
|---|---|---|---|
model | string | gemini-embedding-001 | 也支持 gemini-embedding-2-preview |
outputDimensionality | number | 3072 | Embedding 2 支持 768、1536 或 3072 |
注意:修改 model 或
outputDimensionality会触发自动全量重新索引。
Bedrock 嵌入配置
Bedrock 使用 AWS SDK 默认凭证链,不需要 API 密钥。如果 OpenClaw 运行在有 Bedrock 权限的 EC2 上,只需设置提供商和模型:
json5
{
agents: {
defaults: {
memorySearch: {
provider: "bedrock",
model: "amazon.titan-embed-text-v2:0",
},
},
},
}| 配置项 | 类型 | 默认值 | 说明 |
|---|---|---|---|
model | string | amazon.titan-embed-text-v2:0 | 任意 Bedrock 嵌入模型 ID |
outputDimensionality | number | 模型默认 | Titan V2 支持 256、512 或 1024 |
支持的模型
| 模型 ID | 提供商 | 默认维度 | 可配置维度 |
|---|---|---|---|
amazon.titan-embed-text-v2:0 | Amazon | 1024 | 256, 512, 1024 |
amazon.titan-embed-text-v1 | Amazon | 1536 | — |
amazon.titan-embed-g1-text-02 | Amazon | 1536 | — |
amazon.titan-embed-image-v1 | Amazon | 1024 | — |
amazon.nova-2-multimodal-embeddings-v1:0 | Amazon | 1024 | 256, 384, 1024, 3072 |
cohere.embed-english-v3 | Cohere | 1024 | — |
cohere.embed-multilingual-v3 | Cohere | 1024 | — |
cohere.embed-v4:0 | Cohere | 1536 | 256-1536 |
twelvelabs.marengo-embed-3-0-v1:0 | TwelveLabs | 512 | — |
twelvelabs.marengo-embed-2-7-v1:0 | TwelveLabs | 1024 | — |
吞吐量后缀变体(如 amazon.titan-embed-text-v1:2:8k)继承基础模型配置。
认证顺序
Bedrock 使用标准 AWS SDK 凭证解析顺序:
- 环境变量(
AWS_ACCESS_KEY_ID+AWS_SECRET_ACCESS_KEY) - SSO token 缓存
- Web identity token 凭证
- 共享凭证和配置文件
- ECS 或 EC2 元数据凭证
Region 从 AWS_REGION、AWS_DEFAULT_REGION、amazon-bedrock 提供商 baseUrl 解析,默认 us-east-1。
IAM 权限
IAM 角色或用户需要:
json
{
"Effect": "Allow",
"Action": "bedrock:InvokeModel",
"Resource": "*"
}最小权限,可将 InvokeModel 限定到具体模型:
arn:aws:bedrock:*::foundation-model/amazon.titan-embed-text-v2:0本地嵌入配置
| 配置项 | 类型 | 默认值 | 说明 |
|---|---|---|---|
local.modelPath | string | 自动下载 | GGUF 模型文件路径 |
local.modelCacheDir | string | node-llama-cpp 默认 | 下载模型的缓存目录 |
默认模型:embeddinggemma-300m-qat-Q8_0.gguf(约 0.6GB,自动下载)。 需要原生构建:pnpm approve-builds 然后 pnpm rebuild node-llama-cpp。
混合搜索配置
所有配置均在 memorySearch.query.hybrid 下:
| 配置项 | 类型 | 默认值 | 说明 |
|---|---|---|---|
enabled | boolean | true | 启用 BM25 + 向量混合搜索 |
vectorWeight | number | 0.7 | 向量分数权重(0-1) |
textWeight | number | 0.3 | BM25 分数权重(0-1) |
candidateMultiplier | number | 4 | 候选池大小倍数 |
MMR(多样性)
| 配置项 | 类型 | 默认值 | 说明 |
|---|---|---|---|
mmr.enabled | boolean | false | 启用 MMR 重排序 |
mmr.lambda | number | 0.7 | 0 = 最大多样性,1 = 最大相关性 |
时间衰减(近期优先)
| 配置项 | 类型 | 默认值 | 说明 |
|---|---|---|---|
temporalDecay.enabled | boolean | false | 启用近期加成 |
temporalDecay.halfLifeDays | number | 30 | 每 N 天分数减半 |
常青文件(MEMORY.md、memory/ 下无日期文件)不会衰减。
完整示例
json5
{
agents: {
defaults: {
memorySearch: {
query: {
hybrid: {
vectorWeight: 0.7,
textWeight: 0.3,
mmr: { enabled: true, lambda: 0.7 },
temporalDecay: { enabled: true, halfLifeDays: 30 },
},
},
},
},
},
}额外记忆路径
| 配置项 | 类型 | 说明 |
|---|---|---|
extraPaths | string[] | 额外需要索引的目录或文件 |
json5
{
agents: {
defaults: {
memorySearch: {
extraPaths: ["../team-docs", "/srv/shared-notes"],
},
},
},
}路径可以是绝对路径或相对 workspace 的路径。目录会递归扫描 .md 文件。符号链接处理取决于后端:内置引擎忽略符号链接,QMD 遵循底层扫描器行为。
跨 agent 的转录搜索请用 agents.list[].memorySearch.qmd.extraCollections,而非 memory.qmd.paths。Extra collections 使用相同的 { path, name, pattern? } 结构,按 agent 合并,并在路径指向 workspace 外时保留显式共享名称。若同一解析路径同时出现在 memory.qmd.paths 和 memorySearch.qmd.extraCollections 中,QMD 保留第一条并跳过重复项。
多模态记忆(Gemini)
使用 Gemini Embedding 2 同时索引图片和音频:
| 配置项 | 类型 | 默认值 | 说明 |
|---|---|---|---|
multimodal.enabled | boolean | false | 启用多模态索引 |
multimodal.modalities | string[] | — | ["image"]、["audio"] 或 ["all"] |
multimodal.maxFileBytes | number | 10000000 | 索引的最大文件大小 |
仅适用于 extraPaths 中的文件。默认记忆根目录仍只索引 Markdown。 需要 gemini-embedding-2-preview,且 fallback 必须为 "none"。
支持格式:.jpg、.jpeg、.png、.webp、.gif、.heic、.heif(图片);.mp3、.wav、.ogg、.opus、.m4a、.aac、.flac(音频)。
嵌入缓存
| 配置项 | 类型 | 默认值 | 说明 |
|---|---|---|---|
cache.enabled | boolean | false | 在 SQLite 中缓存 chunk 嵌入 |
cache.maxEntries | number | 50000 | 最大缓存嵌入数 |
在重新索引或转录更新时,避免对未变更文本重复嵌入。
批量索引
| 配置项 | 类型 | 默认值 | 说明 |
|---|---|---|---|
remote.batch.enabled | boolean | false | 启用批量嵌入 API |
remote.batch.concurrency | number | 2 | 并行批次数 |
remote.batch.wait | boolean | true | 等待批次完成 |
remote.batch.pollIntervalMs | number | — | 轮询间隔 |
remote.batch.timeoutMinutes | number | — | 批次超时时间 |
适用于 openai、gemini 和 voyage。OpenAI 批量通常最快也最便宜,适合大规模回填。
Session 记忆搜索(实验性)
索引 session 转录并通过 memory_search 工具展示:
| 配置项 | 类型 | 默认值 | 说明 |
|---|---|---|---|
experimental.sessionMemory | boolean | false | 启用 session 索引 |
sources | string[] | ["memory"] | 添加 "sessions" 可包含转录 |
sync.sessions.deltaBytes | number | 100000 | 触发重新索引的字节阈值 |
sync.sessions.deltaMessages | number | 50 | 触发重新索引的消息数阈值 |
Session 索引需要手动开启,异步运行,结果可能略有延迟。Session 日志存储在磁盘,文件系统访问即为信任边界。
SQLite 向量加速(sqlite-vec)
| 配置项 | 类型 | 默认值 | 说明 |
|---|---|---|---|
store.vector.enabled | boolean | true | 使用 sqlite-vec 进行向量查询 |
store.vector.extensionPath | string | 内置 | 覆盖 sqlite-vec 路径 |
sqlite-vec 不可用时,OpenClaw 自动回退到进程内余弦相似度计算。
索引存储
| 配置项 | 类型 | 默认值 | 说明 |
|---|---|---|---|
store.path | string | ~/.openclaw/memory/{agentId}.sqlite | 索引位置(支持 {agentId} token) |
store.fts.tokenizer | string | unicode61 | FTS5 分词器(unicode61 或 trigram) |
QMD 后端配置
设置 memory.backend = "qmd" 启用。所有 QMD 配置位于 memory.qmd 下:
| 配置项 | 类型 | 默认值 | 说明 |
|---|---|---|---|
command | string | qmd | QMD 可执行文件路径 |
searchMode | string | search | 搜索命令:search、vsearch、query |
includeDefaultMemory | boolean | true | 自动索引 MEMORY.md + memory/**/*.md |
paths[] | array | — | 额外路径:{ name, path, pattern? } |
sessions.enabled | boolean | false | 索引 session 转录 |
sessions.retentionDays | number | — | 转录保留天数 |
sessions.exportDir | string | — | 导出目录 |
OpenClaw 优先使用当前 QMD collection 和 MCP query 格式,但在检测到旧版 QMD 时会回退到传统 --mask collection 标志和旧 MCP 工具名。
QMD 模型覆盖配置在 QMD 侧而非 OpenClaw 配置中。如需全局覆盖 QMD 模型,可在 gateway 运行时环境中设置 QMD_EMBED_MODEL、QMD_RERANK_MODEL、QMD_GENERATE_MODEL 等环境变量。
更新计划
| 配置项 | 类型 | 默认值 | 说明 |
|---|---|---|---|
update.interval | string | 5m | 刷新间隔 |
update.debounceMs | number | 15000 | 文件变更防抖时间 |
update.onBoot | boolean | true | 启动时刷新 |
update.waitForBootSync | boolean | false | 阻塞启动直到刷新完成 |
update.embedInterval | string | — | 单独的嵌入节奏 |
update.commandTimeoutMs | number | — | QMD 命令超时 |
update.updateTimeoutMs | number | — | QMD 更新操作超时 |
update.embedTimeoutMs | number | — | QMD 嵌入操作超时 |
限制
| 配置项 | 类型 | 默认值 | 说明 |
|---|---|---|---|
limits.maxResults | number | 6 | 最大搜索结果数 |
limits.maxSnippetChars | number | — | 截断片段长度 |
limits.maxInjectedChars | number | — | 截断总注入字符数 |
limits.timeoutMs | number | 4000 | 搜索超时 |
完整 QMD 示例
json5
{
memory: {
backend: "qmd",
citations: "auto",
qmd: {
includeDefaultMemory: true,
update: { interval: "5m", debounceMs: 15000 },
limits: { maxResults: 6, timeoutMs: 4000 },
scope: {
default: "deny",
rules: [{ action: "allow", match: { chatType: "direct" } }],
},
paths: [{ name: "docs", path: "~/notes", pattern: "**/*.md" }],
},
},
}作用域(Scope)
控制哪些 session 能收到 QMD 搜索结果,与 session.sendPolicy 使用相同的 schema:
json5
{
memory: {
qmd: {
scope: {
default: "deny",
rules: [{ action: "allow", match: { chatType: "direct" } }],
},
},
},
}默认仅限私信(DM)。match.keyPrefix 匹配规范化后的 session key;match.rawKeyPrefix 匹配包含 agent:<id>: 前缀的原始 key。
Citations(引用标注)
memory.citations 适用于所有后端:
| 值 | 行为 |
|---|---|
auto(默认) | 在片段末尾加 Source: <path#line> 注脚 |
on | 始终加注脚 |
off | 省略注脚(路径仍在内部传递给 agent) |
Dreaming(实验性)
Dreaming 配置位于 plugins.entries.memory-core.config.dreaming,而非 agents.defaults.memorySearch。
Dreaming 作为一个定时扫描运行,内部使用 light/deep/REM 阶段作为实现细节。
概念行为和斜杠命令请参见 Dreaming。
用户配置
| 配置项 | 类型 | 默认值 | 说明 |
|---|---|---|---|
enabled | boolean | false | 启用或禁用 Dreaming |
frequency | string | 0 3 * * * | Dreaming 全量扫描的可选 cron 节奏 |
示例
json5
{
plugins: {
entries: {
"memory-core": {
config: {
dreaming: {
enabled: true,
frequency: "0 3 * * *",
},
},
},
},
},
}说明:
- Dreaming 将机器状态写入
memory/.dreams/。 - Dreaming 将人类可读的叙述输出写入
DREAMS.md(或已有的dreams.md)。 - light/deep/REM 阶段的策略和阈值是内部行为,不对外暴露配置。
常见问题
Q: 如何确认当前用的是哪个嵌入提供商?
A: 运行 openclaw doctor 可以看到记忆搜索当前使用的提供商和模型信息。如果想确认 API 密钥是否被正确识别,也可以查看启动日志中 memorySearch 相关的行。
Q: 切换嵌入模型后需要重新索引吗?
A: 是的。切换嵌入模型(或修改 outputDimensionality)后,向量空间发生变化,旧索引会失效,OpenClaw 会触发自动全量重新索引。
Q: QMD 和内置引擎应该怎么选?
A: 记忆文件不多(千级 Markdown)且不需要复杂搜索策略的情况下,用内置 SQLite 引擎开箱即用就够了。记忆量大(万级文件)或需要更精细的搜索控制(语义搜索模式、独立 embed 调度)时,考虑 QMD 后端。