Skip to content

上下文窗口与 Compaction

每个模型都有上下文窗口(能看到的最大 token 数)。长对话会积累大量消息和工具调用结果;当窗口快撑不住时,OpenClaw 会**压缩(compact)**较早的历史记录,保持在限制之内。

Compaction 是什么

Compaction 会将较旧的对话内容总结为一条简洁的摘要,同时保留最近的消息。摘要会存储在会话历史中,后续请求使用的是:

  • 压缩摘要
  • 压缩点之后的近期消息

Compaction 的结果会持久化到会话的 JSONL 历史文件中。

配置

openclaw.json 中通过 agents.defaults.compaction 配置压缩行为(模式、目标 token 数等)。

默认情况下,压缩摘要会保留不透明标识符(identifierPolicy: "strict")。可以用 identifierPolicy: "off" 关闭,或用 identifierPolicy: "custom" 加上 identifierInstructions 提供自定义说明。

你还可以通过 agents.defaults.compaction.model 为摘要生成指定独立的模型。当主模型是本地小模型,但你希望用更强的模型生成压缩摘要时,这个选项非常实用。支持任何 provider/model-id 格式:

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

也可以用本地模型,比如专门跑摘要的第二个 Ollama 实例:

json
{
  "agents": {
    "defaults": {
      "compaction": {
        "model": "ollama/llama3.1:8b"
      }
    }
  }
}

未设置时,Compaction 使用 Agent 的主模型。

自动 Compaction(默认开启)

当会话接近或超出模型上下文窗口时,OpenClaw 会自动触发 Compaction,并可能用压缩后的上下文重试原始请求。

你会看到:

  • verbose 模式下显示 🧹 Auto-compaction complete
  • /status 显示 🧹 Compactions: <count>

在 Compaction 之前,OpenClaw 可以执行一次静默记忆刷新,将持久笔记写入磁盘。详情和配置见 Memory

手动 Compaction

使用 /compact(可附带说明)强制执行一次压缩:

/compact Focus on decisions and open questions

上下文窗口来源

上下文窗口大小因模型而异。OpenClaw 从已配置的 Provider 目录中读取模型定义来确定限制值。

Compaction 与 Session Pruning 的区别

  • Compaction:总结历史并持久化到 JSONL。
  • Session Pruning:仅内存中裁剪旧的工具调用结果,不修改会话文件。

Pruning 详情见 /concepts/session-pruning

OpenAI 服务端 Compaction

OpenClaw 也支持兼容 OpenAI 的模型的服务端 Compaction 提示。这与本地 Compaction 是独立的,可以并行工作。

  • 本地 Compaction:OpenClaw 将摘要持久化到会话 JSONL。
  • 服务端 Compaction:当启用 storecontext_management 时,OpenAI 在 Provider 侧压缩上下文。

详见 OpenAI provider

自定义 Context Engine

Compaction 行为由当前活跃的 Context Engine 负责。内置(legacy)引擎使用上述内置摘要方式。插件引擎(通过 plugins.slots.contextEngine 选择)可以实现任意 Compaction 策略——DAG 摘要、向量检索、增量压缩等。

当插件引擎设置 ownsCompaction: true 时,OpenClaw 将所有 Compaction 决策交给引擎处理,不再运行内置自动 Compaction。

ownsCompactionfalse 或未设置时,OpenClaw 内置的运行中自动 Compaction 可能仍会执行,但活跃引擎的 compact() 方法依然负责处理 /compact 和溢出恢复——不会自动回退到 legacy 引擎的路径。

如果你在开发非 owning 模式的 Context Engine,请在 compact() 中调用 openclaw/plugin-sdk/core 中的 delegateCompactionToRuntime(...)

使用技巧

  • 当对话感觉"陈旧"或上下文过于臃肿时,使用 /compact
  • 大型工具输出已经被截断;Session Pruning 可以进一步减少工具结果的堆积。
  • 如果需要完全重置,用 /new/reset 开启新的会话 ID。