快速开始
将以下内容粘贴到openclaw.json 中,作为安全默认配置——启用插件,仅作用于 main 代理,仅限直接消息会话,并在可用时继承会话模型:
plugins.entries.active-memory.enabled: true会开启插件config.agents: ["main"]只让main代理使用主动记忆config.allowedChatTypes: ["direct"]将其限定为直接消息会话(群组/频道需显式加入)config.model(可选)会固定一个专用回忆模型;不设置则继承当前会话模型config.modelFallback仅在没有显式或继承模型可用时使用config.promptStyle: "balanced"是recent模式下的默认值- 主动记忆仍然只会在符合条件的交互式持久聊天会话中运行
速度建议
最简单的配置是让config.model 保持未设置状态,并让主动记忆使用你平时用于正常回复的同一模型。这是最安全的默认方式,因为它会沿用你现有的提供商、认证和模型偏好。
如果你希望主动记忆更快,可以使用专用推理模型,而不是借用主聊天模型。回忆质量很重要,但对主回答路径来说,延迟比它更重要,而且主动记忆的工具面很窄(它只会调用可用的记忆回忆工具)。
推荐的快速模型选项:
cerebras/gpt-oss-120b,作为专用的低延迟回忆模型google/gemini-3-flash,作为低延迟后备,而不改变你的主聊天模型- 你的常规会话模型,只需让
config.model保持未设置
Cerebras 配置
添加一个 Cerebras 提供商,并将主动记忆指向它:chat/completions 访问权限——仅能看到 /v1/models 并不保证这一点。
如何查看
主动记忆会为模型注入一个隐藏的、不受信任的提示前缀。它不会在普通客户端可见回复中暴露原始的<active_memory_plugin>...</active_memory_plugin> 标签。
会话开关
当你想在不编辑配置的情况下暂停或恢复当前聊天会话中的主动记忆时,请使用插件命令:plugins.entries.active-memory.enabled、代理目标,或其他全局配置。
如果你希望命令写入配置,并为所有会话暂停或恢复主动记忆,请使用显式的全局形式:
plugins.entries.active-memory.config.enabled。它会保留
plugins.entries.active-memory.enabled 为开启状态,这样该命令以后仍然可用,以便重新打开主动记忆。
如果你想查看主动记忆在实时会话中的行为,请开启与你想要输出相匹配的会话开关:
- 一条主动记忆状态行,例如
Active Memory: status=ok elapsed=842ms query=recent summary=34 chars,当使用/verbose on - 一条可读的调试摘要,例如
Active Memory Debug: Lemon pepper wings with blue cheese.,当使用/trace on
/trace raw,被跟踪的 Model Input (User Role) 块会将隐藏的 Active Memory 前缀显示为:
运行时机
主动记忆使用两个门槛:- 配置显式启用
插件必须开启,并且当前代理 id 必须出现在
plugins.entries.active-memory.config.agents中。 - 严格的运行时资格 即使已启用并且已指定目标,主动记忆也只会在符合条件的 交互式持久聊天会话中运行。
会话类型
config.allowedChatTypes 控制哪些类型的对话可以运行主动
记忆。
默认值是:
config.allowedChatIds 和
config.deniedChatIds。
allowedChatIds 是解析后对话 id 的显式允许名单。当它
非空时,只有当会话的对话 id 在该列表中,主动记忆才会运行。
这会一次性缩小所有允许的聊天类型范围,包括直接消息。如果你想要所有直接消息,以及仅某些群组,请将直接对端 id 包含在 allowedChatIds 中,或者将 allowedChatTypes 只聚焦于你正在测试的群组/频道放量。
deniedChatIds 是显式拒绝名单。它总是优先于
allowedChatTypes 和 allowedChatIds,因此即使某个对话的会话类型原本允许,只要匹配也会被跳过。
这些 id 来自持久频道会话键:例如飞书的 chat_id / open_id、Telegram 的 chat id,或 Slack 的 channel id。匹配不区分大小写。如果 allowedChatIds 非空,而 OpenClaw 无法为该会话解析出对话 id,主动记忆会跳过该轮,而不是猜测。
示例:
运行位置
主动记忆是一个对话增强功能,而不是平台级推理功能。| Surface | Runs active memory? |
|---|---|
| Control UI / web chat persistent sessions | Yes, if the plugin is enabled and the agent is targeted |
| Other interactive channel sessions on the same persistent chat path | Yes, if the plugin is enabled and the agent is targeted |
| Headless one-shot runs | No |
| Heartbeat/background runs | No |
Generic internal agent-command paths | No |
| Sub-agent/internal helper execution | No |
为什么使用它
在以下情况下使用主动记忆:- 会话是持久化的,并且面向用户
- 代理拥有有意义的长期记忆可供搜索
- 连贯性和个性化比原始提示词确定性更重要
- 稳定偏好
- 反复出现的习惯
- 应当自然浮现的长期用户上下文
- 自动化
- 内部工作器
- 一次性 API 任务
- 隐式个性化显得突兀的场景
它是如何工作的
运行时结构如下: 阻塞式记忆子代理只能使用已配置的记忆召回工具。 默认情况下,这些工具是:memory_searchmemory_get
plugins.slots.memory 是 memory-lancedb 时,默认改为 memory_recall。
如果另一个记忆提供器暴露了不同的召回工具契约,请设置 config.toolsAllow。
如果连接较弱,它应返回 NONE。
查询模式
config.queryMode 控制阻塞式记忆子代理能看到多少对话内容。
请选择仍能很好回答后续问题的最小模式;超时时间预算应随着上下文大小增加(message < recent < full)。
- message
- recent
- full
只发送最新的用户消息。在以下情况下使用:
- 你想要最快的行为
- 你想要最强的稳定偏好召回倾向
- 后续轮次不需要对话上下文
config.timeoutMs 建议从 3000 到 5000 ms 开始。提示词样式
config.promptStyle 控制阻塞式记忆子代理在决定是否返回记忆时的积极程度或严格程度。
可用样式:
balanced:recent模式的通用默认值strict:最不积极;当你希望附近上下文泄漏最少时最合适contextual:最注重连贯性;当对话历史更重要时最合适recall-heavy:更愿意在较弱但仍然合理的匹配下展示记忆precision-heavy:除非匹配明显,否则强烈倾向于NONEpreference-only:针对喜好、习惯、例行模式、品味和重复出现的个人事实进行了优化
config.promptStyle 时的默认映射:
config.promptStyle,则该覆盖项优先生效。
示例:
模型回退策略
如果未设置config.model,主动记忆会按以下顺序解析模型:
config.modelFallback 控制已配置的回退步骤。
可选的自定义回退:
config.modelFallbackPolicy 仅保留为旧配置的弃用兼容字段。它不再改变运行时行为。
Memory tools
默认情况下,主动记忆允许阻塞式召回子代理调用memory_search 和 memory_get。这与内置的 memory-core
契约一致。当 plugins.slots.memory 选择 memory-lancedb 且
config.toolsAllow 未设置时,主动记忆会保留现有的 LanceDB 行为,
并改用 memory_recall。
如果你使用另一个记忆插件,请将 config.toolsAllow 设置为该插件注册的精确工具
名称。主动记忆会在召回
提示中列出这些工具,并将同样的列表传递给嵌入式子代理。如果没有任何已配置的
工具可用,或者记忆子代理失败,主动记忆会跳过该轮召回,主回复将继续而不带记忆上下文。
toolsAllow 只接受具体的记忆工具名称。通配符、group:*
条目,以及 read、exec、message 和
web_search 等核心代理工具,会在隐藏的记忆子代理启动前被忽略。
默认行为说明:主动记忆不再将 memory_recall 包含在
memory-core 的默认允许列表中。现有的 memory-lancedb 配置在
plugins.slots.memory 设为 memory-lancedb 时仍可继续工作。显式的 toolsAllow
始终会覆盖自动默认值。
内置 memory-core
默认配置不需要显式的toolsAllow:
LanceDB memory
随附的memory-lancedb 插件暴露了 memory_recall。选择
memory 插槽后,主动记忆就会使用该召回工具:
Lossless Claw
Lossless Claw 是一个带有自身召回工具的上下文引擎插件。请先将其安装并 配置为上下文引擎;参见 Context engine。 然后让主动记忆使用 Lossless Claw 的召回工具:toolsAllow 中包含 lcm_expand。
Lossless Claw 将其用作更低层级的委派扩展工具。
高级逃生通道
这些选项是有意不作为推荐设置的一部分。config.thinking 可以覆盖阻塞式记忆子代理的思考级别:
config.promptAppend 会在默认 Active Memory 提示词之后、对话上下文之前添加额外的操作指令:
promptAppend 与自定义的 toolsAllow 搭配使用。
config.promptOverride 会替换默认的 Active Memory 提示词。OpenClaw 仍会在之后追加对话上下文:
NONE 或简洁的用户事实的上下文。
转录持久化
Active memory 阻塞式记忆子代理在调用期间会创建一个真实的session.jsonl 转录文件。
默认情况下,该转录文件是临时的:
- 会写入临时目录
- 只用于该次阻塞式记忆子代理运行
- 运行结束后会立即删除
config.transcriptDir 更改相对子目录。
请谨慎使用:
- 阻塞式记忆子代理转录文件在繁忙会话中可能很快累积
full查询模式会重复大量对话上下文- 这些转录文件包含隐藏提示上下文和召回的记忆
配置
所有 active memory 配置都位于:| Key | Type | Meaning |
|---|---|---|
enabled | boolean | 启用插件本身 |
config.agents | string[] | 可以使用 active memory 的代理 ID |
config.model | string | 可选的阻塞式记忆子代理模型引用;未设置时,active memory 使用当前会话模型 |
config.allowedChatTypes | ("direct" | "group" | "channel")[] | 可以运行 Active Memory 的会话类型;默认为直连消息风格的会话 |
config.allowedChatIds | string[] | 可选的按会话 allowlist,在 allowedChatTypes 之后应用;非空列表会在失败时关闭 |
config.deniedChatIds | string[] | 可选的按会话 denylist,会覆盖允许的会话类型和允许的 ID |
config.queryMode | "message" | "recent" | "full" | 控制阻塞式记忆子代理能看到多少对话内容 |
config.promptStyle | "balanced" | "strict" | "contextual" | "recall-heavy" | "precision-heavy" | "preference-only" | 控制阻塞式记忆子代理在决定是否返回记忆时的积极程度或严格程度 |
config.toolsAllow | string[] | 阻塞式记忆子代理可以调用的具体记忆工具名称;默认是 ["memory_search", "memory_get"],或者当 plugins.slots.memory 为 memory-lancedb 时为 ["memory_recall"];忽略通配符、group:* 条目以及核心代理工具 |
config.thinking | "off" | "minimal" | "low" | "medium" | "high" | "xhigh" | "adaptive" | "max" | 阻塞式记忆子代理的高级思考级别覆盖;为速度起见,默认 off |
config.promptOverride | string | 高级完整提示词替换;不建议在正常使用中启用 |
config.promptAppend | string | 追加到默认或被覆盖提示词之后的高级额外指令 |
config.timeoutMs | number | 阻塞式记忆子代理的硬超时,最多 120000 ms |
config.setupGraceTimeoutMs | number | 在召回超时到期前的高级额外初始化预算;默认值为 0,且上限为 30000 ms。有关 v2026.4.x 升级指引,请参见 冷启动宽限期 |
config.maxSummaryChars | number | active-memory 摘要允许的最大总字符数 |
config.logging | boolean | 在调优期间输出 active memory 日志 |
config.persistTranscripts | boolean | 将阻塞式记忆子代理转录保留在磁盘上,而不是删除临时文件 |
config.transcriptDir | string | 位于代理会话文件夹下的相对阻塞式记忆子代理转录目录 |
| 键 | 类型 | 含义 |
|---|---|---|
config.maxSummaryChars | number | active-memory 摘要允许的最大总字符数 |
config.recentUserTurns | number | 当 queryMode 为 recent 时要包含的之前用户轮次 |
config.recentAssistantTurns | number | 当 queryMode 为 recent 时要包含的之前助手轮次 |
config.recentUserChars | number | 每个最近用户轮次的最大字符数 |
config.recentAssistantChars | number | 每个最近助手轮次的最大字符数 |
config.cacheTtlMs | number | 对重复的相同查询进行缓存复用(范围:1000-120000 ms;默认:15000) |
config.circuitBreakerMaxTimeouts | number | 对同一代理/模型连续超时达到此次数后跳过召回。成功召回或冷却时间结束后重置(范围:1-20;默认:3)。 |
config.circuitBreakerCooldownMs | number | 熔断触发后跳过召回的时长,单位 ms(范围:5000-600000;默认:60000)。 |
推荐配置
从recent 开始。
/verbose on 查看
正常状态行,或使用 /trace on 查看 active-memory 调试摘要,
而不是去找单独的 active-memory 调试命令。在聊天频道中,这些诊断行会在主助手回复之后发送,而不是之前。
然后切换到:
- 如果你想要更低延迟,使用
message - 如果你认为额外上下文值得接受更慢的阻塞式 memory 子代理,使用
full
冷启动宽限
在 v2026.5.2 之前,插件会在冷启动期间默默将你配置的timeoutMs 额外延长
30000 毫秒,这样模型预热、embedding 索引加载以及
首次 recall 就可以共用一个更大的预算。v2026.5.2 将这段宽限移到了一个显式的
setupGraceTimeoutMs 配置之后——默认情况下,你配置的 timeoutMs
现在就是预算,除非你主动启用它。
如果你是从 v2026.4.x 升级而来,并且你把 timeoutMs 设为了适配
旧的隐式宽限世界的值(推荐的入门 timeoutMs: 15000 就是一个
例子),请设置 setupGraceTimeoutMs: 30000,以将 prompt-build hook 和
外层 watchdog 的预算恢复到 v5.2 之前的有效值:
setupGraceTimeoutMs 配置之后,因此插件不再会悄悄把主通道上的
15000 毫秒配置延长到 45000 毫秒。”
嵌入式 recall 运行器使用相同的有效超时预算,因此
setupGraceTimeoutMs 同时覆盖外层的 prompt-build watchdog 和内层的
阻塞式 recall 运行。
对于资源紧张且冷启动延迟是已知取舍的网关,较低的值(5000–15000 毫秒)也可行——
代价是网关重启后第一次 recall 在预热完成前返回空结果的概率更高。
调试
如果 active memory 没有出现在你预期的位置:- 确认插件已在
plugins.entries.active-memory.enabled下启用。 - 确认当前 agent id 已列在
config.agents中。 - 确认你是在交互式持久聊天会话中进行测试。
- 打开
config.logging: true并查看网关日志。 - 使用
openclaw memory status --deep验证 memory search 本身是否正常工作。
maxSummaryChars
- 降低
queryMode - 降低
timeoutMs - 减少 recent turn counts
- 减少每轮字符上限
常见问题
Active Memory 依赖于所配置的 memory 插件的 recall 流水线,因此大多数 recall 异常其实是 embedding provider 问题,而不是 Active Memory 的 bug。默认的memory-core 路径使用 memory_search 和 memory_get;memory-lancedb 插槽使用
memory_recall。如果你使用的是其他 memory 插件,请确认 config.toolsAllow
列出了该插件实际注册的工具名称。
Embedding provider switched or stopped working
Embedding provider switched or stopped working
如果
memorySearch.provider 未设置,OpenClaw 将使用 OpenAI embeddings。请为本地、Ollama、Gemini、Voyage、
Mistral、DeepInfra、Bedrock、GitHub Copilot 或兼容 OpenAI 的
embeddings 显式设置 memorySearch.provider。如果配置的提供方无法运行,memory_search
可能会降级为仅词法检索;一旦运行时已经选定了提供方,后续失败不会自动回退。只有在你想要一个明确的单一回退时,才设置可选的 memorySearch.fallback。完整
提供方列表和示例请参见 Memory Search。Recall 感觉缓慢、为空,或不一致
Recall 感觉缓慢、为空,或不一致
- 打开
/trace on,以在会话中显示由插件拥有的 Active Memory 调试摘要。 - 打开
/verbose on,以便在每次回复后还看到🧩 Active Memory: ...状态行。 - 查看网关日志中的
active-memory: ... start|done、memory sync failed (search-bootstrap),或 provider embedding 错误。 - 运行
openclaw memory status --deep检查 memory-search 后端 和索引健康状态。 - 如果你使用
ollama,请确认已安装 embedding 模型 (ollama list)。
网关重启后的首次 recall 返回 `status=timeout`
网关重启后的首次 recall 返回 `status=timeout`
在 v2026.5.2 及更高版本中,如果冷启动初始化(模型预热 + embedding
索引加载)在第一次 recall 触发时还没有完成,运行就可能达到已配置的
timeoutMs 预算并返回 status=timeout,且输出为空。网关日志会在重启后
首个符合条件的回复附近显示 active-memory timeout after Nms。请参见“推荐配置”下的 冷启动宽限 以获取
推荐的 setupGraceTimeoutMs 值。