内存概览
内存如何工作。
内置引擎
默认的 SQLite 后端。
QMD 引擎
本地优先的 sidecar。
内存搜索
搜索流程与调优。
活动内存
用于交互式会话的内存子代理。
openclaw.json 中的 agents.defaults.memorySearch 下。
如果你在寻找 活动内存 功能开关和子代理配置,它位于
plugins.entries.active-memory 下,而不是 memorySearch。活动内存使用双门控模型:- 插件必须启用并且目标指向当前 agent id
- 请求必须是符合条件的交互式持久聊天会话
提供方选择
| Key | Type | Default | Description |
|---|---|---|---|
provider | string | "openai" | 嵌入适配器 ID,例如 bedrock、deepinfra、gemini、github-copilot、local、mistral、ollama、openai、openai-compatible 或 voyage;也可以是已配置的 models.providers.<id>,其 api 指向内存嵌入适配器或 OpenAI 兼容的模型 API |
model | string | provider default | 嵌入模型名称 |
fallback | string | "none" | 主提供方失败时使用的回退适配器 ID |
enabled | boolean | true | 启用或禁用内存搜索 |
provider 时,OpenClaw 使用 OpenAI 嵌入。显式设置 provider
即可使用 Gemini、Voyage、Mistral、DeepInfra、Bedrock、GitHub Copilot、
Ollama、本地 GGUF 模型或 OpenAI 兼容的 /v1/embeddings 端点。
仍保留 provider: "auto" 的旧配置会解析为 openai。
当 provider 未设置、保留了旧的 provider: "auto",或
provider: "none" 用于有意选择仅 FTS 模式时,内存召回在嵌入不可用时仍可
使用词法 FTS 排名。
显式的非本地提供方会失败关闭。如果你将 memorySearch.provider 设置为
诸如 OpenAI、Gemini、Voyage、Mistral、
Bedrock、GitHub Copilot、DeepInfra、Ollama、LM Studio 或 OpenAI 兼容
自定义提供方这样的具体远程后端,而该提供方在运行时不可用,memory_search
会返回不可用结果,而不会静默退回到仅 FTS 召回。请修复
提供方/认证配置,切换到可访问的提供方,或在你希望明确使用仅 FTS 召回时
设置 provider: "none"。
自定义 provider id
memorySearch.provider 可以指向自定义的 models.providers.<id> 条目,用于内存专用的提供方适配器,例如 ollama,或用于 OpenAI 兼容的模型 API,例如 openai-responses / openai-completions。OpenClaw 会解析该提供方的 api 所属方以用于嵌入适配器,同时保留自定义提供方 id 以处理端点、认证和模型前缀逻辑。这使多 GPU 或多主机部署可以将内存嵌入专门指向某个本地端点:
API 密钥解析
远程嵌入需要 API 密钥。Bedrock 则使用 AWS SDK 默认凭证链(实例角色、SSO、访问密钥)。| Provider | Env var | Config key |
|---|---|---|
| Bedrock | AWS credential chain | 不需要 API 密钥 |
| DeepInfra | DEEPINFRA_API_KEY | models.providers.deepinfra.apiKey |
| Gemini | GEMINI_API_KEY | models.providers.google.apiKey |
| GitHub Copilot | COPILOT_GITHUB_TOKEN、GH_TOKEN、GITHUB_TOKEN | 通过设备登录的认证配置文件 |
| Mistral | MISTRAL_API_KEY | models.providers.mistral.apiKey |
| Ollama | OLLAMA_API_KEY(占位符) | — |
| OpenAI | OPENAI_API_KEY | models.providers.openai.apiKey |
| Voyage | VOYAGE_API_KEY | models.providers.voyage.apiKey |
Codex OAuth 仅覆盖聊天/补全,不满足嵌入请求。
远程端点配置
对于不应继承全局 OpenAI 聊天凭证的通用 OpenAI 兼容/v1/embeddings 服务,请使用 provider: "openai-compatible"。
自定义 API 基础 URL。
覆盖 API 密钥。
额外的 HTTP 标头(与提供方默认值合并)。
提供方特定配置
Gemini
Gemini
| Key | Type | Default | Description |
|---|---|---|---|
model | string | gemini-embedding-001 | 也支持 gemini-embedding-2-preview |
outputDimensionality | number | 3072 | 对于 Embedding 2:768、1536 或 3072 |
OpenAI-compatible input types
OpenAI-compatible input types
OpenAI 兼容的嵌入端点可以选择启用提供方特定的
更改这些值会影响提供方批量索引的嵌入缓存标识,当上游模型对这些标签的处理方式不同时时,应随后执行一次内存重建索引。
input_type 请求字段。这对于需要为查询和文档嵌入使用不同标签的非对称嵌入模型很有用。| Key | Type | Default | Description |
|---|---|---|---|
inputType | string | unset | 查询和文档嵌入共享的 input_type |
queryInputType | string | unset | 查询时的 input_type;覆盖 inputType |
documentInputType | string | unset | 索引/文档的 input_type;覆盖 inputType |
Bedrock
Bedrock
Bedrock 嵌入配置
Bedrock 使用 AWS SDK 默认凭证链——无需 API 密钥。如果 OpenClaw 运行在启用了 Bedrock 的 EC2 实例角色上,只需设置 provider 和 model:| Key | Type | Default | Description |
|---|---|---|---|
model | string | amazon.titan-embed-text-v2:0 | 任意 Bedrock 嵌入模型 ID |
outputDimensionality | number | model default | 对于 Titan V2:256、512 或 1024 |
| Model ID | Provider | Default Dims | Configurable Dims |
|---|---|---|---|
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 令牌缓存
- Web Identity 令牌凭证
- 共享凭证和配置文件
- ECS 或 EC2 元数据凭证
AWS_REGION、AWS_DEFAULT_REGION、amazon-bedrock 提供方的 baseUrl 中解析,或默认为 us-east-1。IAM 权限: IAM 角色或用户需要:InvokeModel 限定到特定模型:Local (GGUF + node-llama-cpp)
Local (GGUF + node-llama-cpp)
| Key | Type | Default | Description |
|---|---|---|---|
local.modelPath | string | auto-downloaded | GGUF 模型文件路径 |
local.modelCacheDir | string | node-llama-cpp default | 下载模型的缓存目录 |
local.contextSize | number | "auto" | 4096 | 嵌入上下文的上下文窗口大小。4096 可覆盖典型分块(128–512 tokens),同时限制非权重显存。受限主机上可降至 1024–2048。"auto" 使用模型训练的最大值——不建议用于 8B+ 模型(Qwen3-Embedding-8B:40 960 tokens → 约 32 GB VRAM,而在 4096 时约为 8.8 GB)。 |
embeddinggemma-300m-qat-Q8_0.gguf(约 0.6 GB,自动下载)。源代码检出版本仍需要本地原生构建审批:先执行 pnpm approve-builds,再执行 pnpm rebuild node-llama-cpp。使用独立 CLI 验证 Gateway 使用的相同 provider 路径:provider: "local"。hf: 和 HTTP(S) 模型引用在显式本地配置中受支持,但不会改变默认 provider。内联嵌入超时
覆盖内存索引期间内联嵌入批次的超时时间。未设置时使用提供方默认值:本地/自托管提供方(如
local、ollama 和 lmstudio)为 600 秒,托管提供方为 120 秒。当本地 CPU 受限的嵌入批次运行正常但较慢时,可增大该值。混合搜索配置
全部位于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 = 最大相关性 |
完整示例
附加内存路径
| 键 | 类型 | 描述 |
|---|---|---|
extraPaths | string[] | 要索引的额外目录或文件 |
.md 文件。符号链接的处理取决于当前启用的后端:内置引擎会忽略符号链接,而 QMD 则遵循底层 QMD 扫描器的行为。
对于按 agent 作用域的跨 agent 会话记录搜索,请使用 agents.list[].memorySearch.qmd.extraCollections,而不是 memory.qmd.paths。这些额外集合遵循相同的 { path, name, pattern? } 结构,但它们会按 agent 合并,并且当路径指向当前工作区之外时,可以保留显式的共享名称。如果同一个解析后的路径同时出现在 memory.qmd.paths 和 memorySearch.qmd.extraCollections 中,QMD 会保留第一条并跳过重复项。
多模态内存(Gemini)
使用 Gemini Embedding 2 将图片和音频与 Markdown 一起建立索引:| 键 | 类型 | 默认值 | 描述 |
|---|---|---|---|
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 | true | 在 SQLite 中缓存分块嵌入 |
cache.maxEntries | number | 50000 | 最大缓存嵌入数 |
批量索引
| 键 | 类型 | 默认值 | 描述 |
|---|---|---|---|
remote.nonBatchConcurrency | number | 4 | 并行的内联嵌入调用 |
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 批处理通常最快且最便宜。
remote.nonBatchConcurrency 控制本地/自托管提供方以及在提供方批处理 API 未启用时的托管提供方所使用的内联嵌入调用。Ollama 在非批量索引时默认使用 1,以避免压垮较小的本地主机;在更大的机器上可设置更高的值。
这与 sync.embeddingBatchTimeoutSeconds 是分开的,后者控制内联嵌入调用的超时时间。
会话内存搜索(实验性)
索引会话记录,并通过memory_search 暴露它们:
| 键 | 类型 | 默认值 | 描述 |
|---|---|---|---|
experimental.sessionMemory | boolean | false | 启用会话索引 |
sources | string[] | ["memory"] | 添加 "sessions" 以包含会话记录 |
sync.sessions.deltaBytes | number | 100000 | 重新索引的字节阈值 |
sync.sessions.deltaMessages | number | 50 | 重新索引的消息阈值 |
SQLite 向量加速(sqlite-vec)
| 键 | 类型 | 默认值 | 描述 |
|---|---|---|---|
store.vector.enabled | boolean | true | 使用 sqlite-vec 进行向量查询 |
store.vector.extensionPath | string | bundled | 覆盖 sqlite-vec 路径 |
索引存储
| 键 | 类型 | 默认值 | 描述 |
|---|---|---|---|
store.path | string | ~/.openclaw/memory/{agentId}.sqlite | 索引位置(支持 {agentId} 令牌) |
store.fts.tokenizer | string | unicode61 | FTS5 分词器(unicode61 或 trigram) |
QMD 后端配置
设置memory.backend = "qmd" 以启用。所有 QMD 设置都位于 memory.qmd 下:
| 键 | 类型 | 默认值 | 描述 |
|---|---|---|---|
command | string | qmd | QMD 可执行文件路径;当服务 PATH 与你的 shell 不同时,请设置绝对路径 |
searchMode | string | search | 搜索命令:search、vsearch、query |
rerank | boolean | — | 与 searchMode: "query" 和 QMD 2.1+ 一起设为 false 可跳过 QMD 重排序 |
includeDefaultMemory | boolean | true | 自动索引 MEMORY.md + memory/**/*.md |
paths[] | array | — | 额外路径:{ name, path, pattern? } |
sessions.enabled | boolean | false | 索引会话转录 |
sessions.retentionDays | number | — | 转录保留时间 |
sessions.exportDir | string | — | 导出目录 |
searchMode: "search" 仅支持词法/BM25。OpenClaw 不会为该模式运行语义向量就绪探测或 QMD 嵌入维护,包括在 memory status --deep 期间;vsearch 和 query 仍然需要 QMD 向量就绪和嵌入。
rerank: false 仅会更改 QMD query 模式,并且需要 QMD 2.1 或更新版本。在直接 CLI 模式下,OpenClaw 传递 --no-rerank;在由 mcporter 支持的 MCP 模式下,它会将 rerank: false 传递给 QMD 的统一查询工具。保持其未设置即可使用 QMD 默认的查询重排序行为。
OpenClaw 优先使用当前的 QMD 集合和 MCP 查询形态,但在需要时也会通过尝试兼容的集合模式标志和较旧的 MCP 工具名称来兼容旧版 QMD。当 QMD 声明支持多个集合过滤器时,同源集合会由一个 QMD 进程一起搜索;较旧的 QMD 构建版本则保留按集合的兼容路径。同源指的是持久化内存集合会被归为一组,而会话转录集合仍保持为单独一组,因此来源多样化仍然同时包含两类输入。
QMD 模型覆盖保留在 QMD 侧,而不是 OpenClaw 配置中。如果你需要全局覆盖 QMD 的模型,请在网关运行时环境中设置
QMD_EMBED_MODEL、QMD_RERANK_MODEL 和 QMD_GENERATE_MODEL 等环境变量。更新计划
更新计划
| 键 | 类型 | 默认值 | 描述 |
|---|---|---|---|
update.interval | string | 5m | 刷新间隔 |
update.debounceMs | number | 15000 | 文件变更防抖 |
update.onBoot | boolean | true | 当长期运行的 QMD 管理器打开时刷新;也控制显式启用的启动刷新 |
update.startup | string | off | 可选的网关启动刷新:off、idle 或 immediate |
update.startupDelayMs | number | 120000 | startup: "idle" 刷新开始前的延迟 |
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 搜索结果。与 默认配置允许直接会话和频道会话,同时仍然拒绝群组。默认仅适用于 DM。
session.sendPolicy 具有相同的 schema:match.keyPrefix 匹配规范化后的会话键;match.rawKeyPrefix 匹配包含 agent:<id>: 的原始键。引用
引用
memory.citations 适用于所有后端:| 值 | 行为 |
|---|---|
auto(默认) | 在片段中包含 Source: <path#line> 页脚 |
on | 始终包含页脚 |
off | 省略页脚(路径仍会在内部传递给 agent) |
完整 QMD 示例
Dreaming
Dreaming 配置在plugins.entries.memory-core.config.dreaming 下,而不是在 agents.defaults.memorySearch 下。
Dreaming 作为一次计划性扫描运行,并将内部的浅层/深层/REM 阶段作为实现细节。
有关概念性行为和斜杠命令,请参见 Dreaming。
用户设置
| Key | Type | Default | Description |
|---|---|---|---|
enabled | boolean | false | 完全启用或禁用 dreaming |
frequency | string | 0 3 * * * | 可选的完整 dreaming 扫描 cron 频率 |
model | string | default model | 可选的 Dream Diary 子代理模型覆盖 |
phases.deep.maxPromotedSnippetTokens | number | 160 | 每个提升到 MEMORY.md 的短期回忆片段所保留的最大估计 token 数;来源元数据仍保持可见 |
示例
- Dreaming 会将机器状态写入
memory/.dreams/。 - Dreaming 会将可读的叙述性输出写入
DREAMS.md(或现有的dreams.md)。 dreaming.model使用现有插件子代理的信任门控;在启用它之前,请设置plugins.entries.memory-core.subagent.allowModelOverride: true。- 当配置的模型不可用时,Dream Diary 会使用会话默认模型重试一次。信任或允许列表失败会被记录日志,不会被静默重试。
- 浅层/深层/REM 阶段策略和阈值属于内部行为,不是面向用户的配置。