Skip to content

本页介绍 OpenClaw 的上下文压缩(Compaction)机制:当对话历史接近模型 context 窗口上限时,自动将旧消息摘要化以便继续对话。覆盖自动压缩触发条件、手动 /compact 命令、使用独立模型压缩的配置、与 Session Pruning 的区别,以及常见排查思路。

上下文压缩(Compaction)

每个模型都有上下文窗口——它能一次性处理的最大 token 数量。当对话接近上限时,OpenClaw 会自动将旧消息压缩(compact)成摘要,让对话得以继续。

工作原理

  1. 将较早的对话轮次摘要化为一条压缩条目
  2. 摘要保存到会话记录中
  3. 保留最近几轮消息的完整内容

当 OpenClaw 切分历史进行压缩时,会确保 assistant 工具调用和对应的 toolResult 保持配对。如果切分点落在工具调用块中间,OpenClaw 会移动边界以保持配对完整,同时保留当前未摘要的尾部内容。

完整对话历史始终保存在磁盘上。压缩只改变下一轮模型看到的内容,不删除任何记录。

自动压缩

自动压缩默认开启。触发条件:

  • 会话接近 context 窗口上限
  • 模型返回 context 溢出错误(此时 OpenClaw 自动压缩后重试)

常见溢出信号:request_too_largecontext length exceededinput exceeds the maximum number of tokensinput token count exceeds the maximum number of input tokensinput is too long for the modelollama error: context length exceeded

压缩前,OpenClaw 会自动提醒 agent 将重要笔记保存到 memory 文件,防止上下文信息丢失。

手动压缩

在对话中输入 /compact 强制触发。可以添加指令引导摘要方向:

/compact 重点保留 API 设计相关决策

使用不同模型压缩

默认使用 agent 的主模型做压缩。可以指定更强的模型获得更好的摘要:

json5
{
  agents: {
    defaults: {
      compaction: {
        model: "openrouter/anthropic/claude-sonnet-4-6",
      },
    },
  },
}

压缩开始通知

默认压缩静默运行。启用 notifyUser 后,每次压缩开始时会显示简短提示:

json5
{
  agents: {
    defaults: {
      compaction: {
        notifyUser: true,
      },
    },
  },
}

Compaction 与 Session Pruning 的区别

CompactionSession Pruning
作用摘要化旧对话内容裁剪旧工具输出
是否持久化是(保存到会话记录)否(仅内存,单次请求级别)
范围整个对话历史仅工具调用结果

Session Pruning 是更轻量的补充方案,裁剪工具输出而不摘要对话内容。

排查

压缩太频繁? 模型 context 窗口可能较小,或工具输出较大。建议启用 Session Pruning 减少工具结果占用。

压缩后上下文感觉丢失了? 使用 /compact 重点保留 <主题> 引导摘要方向,或启用 memory flush 让重要笔记在压缩中存活。

需要完全重置对话? /new 开启新会话,不触发压缩。

高级配置(保留 token 数、标识符保留、自定义 context 引擎、OpenAI 服务端压缩)请参考 Session Management Deep Dive

相关

  • Session:会话管理与生命周期
  • Session Pruning:裁剪工具输出
  • Hooks:压缩生命周期 hook(before_compaction、after_compaction)

常见问题

Q: 压缩后之前讨论的功能细节消失了,如何保留?

A: 压缩前先将关键决策记录到 memory 文件(直接告诉 agent"请把 XX 保存到 memory"),或用 /compact 重点保留 <主题> 引导摘要重点。

Q: 能禁用自动压缩吗?

A: 目前没有直接禁用选项,但可以通过设置较大的 context reserve token 数来推迟压缩触发。建议配合 Session Pruning 降低压缩频率。

Q: 手动 /compact 和自动压缩的摘要质量有区别吗?

A: 手动 /compact <指令> 可以指定保留重点,通常质量更高。自动压缩没有引导,依赖模型自行判断摘要重点。