Appearance
上下文窗口与 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:当启用
store和context_management时,OpenAI 在 Provider 侧压缩上下文。
详见 OpenAI provider。
自定义 Context Engine
Compaction 行为由当前活跃的 Context Engine 负责。内置(legacy)引擎使用上述内置摘要方式。插件引擎(通过 plugins.slots.contextEngine 选择)可以实现任意 Compaction 策略——DAG 摘要、向量检索、增量压缩等。
当插件引擎设置 ownsCompaction: true 时,OpenClaw 将所有 Compaction 决策交给引擎处理,不再运行内置自动 Compaction。
当 ownsCompaction 为 false 或未设置时,OpenClaw 内置的运行中自动 Compaction 可能仍会执行,但活跃引擎的 compact() 方法依然负责处理 /compact 和溢出恢复——不会自动回退到 legacy 引擎的路径。
如果你在开发非 owning 模式的 Context Engine,请在 compact() 中调用 openclaw/plugin-sdk/core 中的 delegateCompactionToRuntime(...)。
使用技巧
- 当对话感觉"陈旧"或上下文过于臃肿时,使用
/compact。 - 大型工具输出已经被截断;Session Pruning 可以进一步减少工具结果的堆积。
- 如果需要完全重置,用
/new或/reset开启新的会话 ID。