乐于分享
好东西不私藏

openclaw 上下文总是溢出不要慌我教你如何应对

openclaw 上下文总是溢出不要慌我教你如何应对

  做 AI Agent 开发的朋友最近总跟我吐槽一个共同问题:跑着跑着任务,突然弹出一个”上下文溢出”的错误,前面几个小时的工作全白费了。这种挫败感我懂。今天我们就把 OpenClaw 的上下文压缩机制彻底讲透,让你从此告别溢出焦虑。


🔍 问题出在哪里

先说原理。Agent 运行时会把每一轮对话、每一次工具调用都记录到 .jsonl 日志文件里,这个文件位于 ~/.openclaw/agents/{agent}/sessions/ 目录下。

默认情况下,这个文件会无限增长。想象一下:你让 Agent 执行一个复杂任务,它可能需要连续调用几十次工具——exec 执行命令、read 读取文件、edit 编辑代码、browser 操作网页……每一次调用的输入输出都会追加到日志里。

当累积内容超过模型 token 限制(比如 128K 或 256K),系统就会报错:上下文装不下了

早期的解决方案是简单粗暴的”压缩摘要”:把旧对话用模型总结成一段话。但这带来两个新问题:

1️⃣ 摘要会丢细节:用户说”记住我的项目用 React+TypeScript”,压缩后这句话可能被概括成”用户有技术项目”,关键信息丢失

2️⃣ 日志文件不缩小:内存中的上下文压缩了,但磁盘上的 .jsonl 文件还是那么大,该爆照爆

OpenClaw 在新版本引入了一套组合拳,我们逐一拆解。


💰 第一招:用免费模型做摘要

先说最实在的配置——compaction.model

{  "agents": {    "defaults": {      "compaction": {        "mode": "safeguard",        "model": "zhipu/glm-4-flash"      }    }  }}

为什么要单独指定模型? 算笔账就明白了。

假设你的主力模型是 qwen3.5-397b-a17b,这种大模型 token 成本有点高。而压缩摘要这种”读旧日志→总结大意”的任务,根本不需要这么强的推理能力,用智谱的免费 Flash 模型就足够了。

如果你不指定 model,系统会用当前 agent 的主模型做压缩。意味着什么?你本来就在为 token 不够用发愁,结果压缩操作还在疯狂消耗主力 token——雪上加霜

💡 最佳实践:所有生产环境 agent 都应配置轻量级压缩模型,把主力 token 留给真正的推理任务。


🛡️ 第二招:midTurnPrecheck(从事后救火到事前预防)

这是最容易被忽略但最关键的配置。

默认情况下,compaction 只在”轮次之间”触发。什么意思?

Agent 的一轮对话可能包含多次工具调用。举个例子:

用户:帮我把项目里的 console.log 都替换成 debug 日志Agent 思考  → exec(查找所有 JS 文件)  → read(读取 file1.js)  → edit(替换)  → read(读取 file2.js)  → edit(替换)  → ...  → exec(第 N 次) → 💥 溢出报错

看到了吗?这一轮里 Agent 可能连续调用了 20 次工具,但中间没有任何上下文检查。直到最后一次调用返回,系统发现:”完了,装不下了”。

这时候你已经浪费了前面所有时间。

开启 midTurnPrecheck 后,机制变成:

每次工具调用返回  → 立即检查上下文压力  → 超过阈值就触发压缩  → 继续下一轮调用

配置方式:

{  "compaction": {    "midTurnPrecheck": {      "enabled": true    }  }}

效果对比

midTurnPrecheck 关闭
midTurnPrecheck 开启
行为
执行到第 18 次工具调用时溢出
第 5 次调用后触发压缩
结果
前 17 次白费
后续调用在干净上下文里继续

这就是”事后救火“和”事前预防“的区别。强烈建议所有长任务场景都开启此选项。


💾 第三招:memoryFlush(压缩前先存起来)

compaction 的本质是”有损压缩“。模型再强,把 100 轮对话压缩成 1 轮摘要,一定会丢信息。

有些信息是绝对不能丢的:

  • 用户说”记住我的数据库密码是 xxx”
  • 用户说”项目使用 React+TypeScript 技术栈”
  • 用户说”部署环境是 Ubuntu 22.04″

memoryFlush 的作用:在压缩之前,先扫描对话中的关键信息,把它们写入 memory/ 目录下的持久化文件。

{  "compaction": {    "memoryFlush": {      "enabled": true    }  }}

工作流程:

① 用户说:"记住,我的服务器 SSH 密钥在 ~/.ssh/id_rsa"② Agent 回复:"已记住"③ 触发压缩前,memoryFlush 检测到"记住"意图④ 把这条信息写入 memory/YYYY-MM-DD.md 或 MEMORY.md⑤ 然后才执行压缩——即使摘要里丢了,原始记录还在 memory 文件里

🧠 关键理解:compaction 压缩的是”对话上下文”,memoryFlush 保护的是”长期记忆”。两者配合,既控制 token 用量,又不丢失关键信息。


🔄 第四招:truncateAfterCompaction + maxActiveTranscriptBytes(日志轮转机制)

这是最容易被误解的一组配置。

先说问题:OpenClaw 的会话日志 .jsonl 文件默认只增不减。你每次 compaction 只是压缩了”内存中的上下文”,磁盘上的文件该多大还多大。

结果就是:

  • 第一次运行:日志 1MB,正常 ✅
  • 运行一个月:日志 2GB,启动 agent 要加载半天,甚至直接卡死 ❌

truncateAfterCompaction:压缩后归档

压缩完成后,把旧的 .jsonl 日志归档(比如重命名为 .jsonl.archived),然后创建一个新的精简日志文件。

{  "compaction": {    "truncateAfterCompaction": true  }}

maxActiveTranscriptBytes:主动触发阈值

但只有 truncateAfterCompaction 还不够。你总不能让日志无限增长到某个随机时刻才压缩一次吧?这就需要 maxActiveTranscriptBytes

{  "compaction": {    "maxActiveTranscriptBytes": "20mb"  }}

配置含义:当活跃日志文件超过 20MB 时,自动触发压缩 + 轮转。

两者配合逻辑

maxActiveTranscriptBytes:主动检测,达到阈值就触发           ↓      执行 compaction 压缩           ↓truncateAfterCompaction:压缩后把旧日志归档,创建新日志

如果没有 truncateAfterCompactionmaxActiveTranscriptBytes 就失去了意义——检测到了也不清理,文件还是继续膨胀。

📏 推荐配置

  • 开发环境:"50mb"(容忍更大日志便于调试)
  • 生产环境:"20mb" 或更小(严格控制磁盘占用)

📋 完整配置(一键复制)

把以下配置复制到你的 /openclaw.json

{  "agents": {    "defaults": {      "compaction": {        "mode": "safeguard",        "midTurnPrecheck": {          "enabled": true        },        "memoryFlush": {          "enabled": true        },        "truncateAfterCompaction": true,        "maxActiveTranscriptBytes": "20mb",        "notifyUser": true,        "model": "zhipu/glm-4-flash"      }    }  }}

配置速查

  • mode: "safeguard"
     → 保守模式,只在接近溢出时触发
  • midTurnPrecheck
     → 工具调用循环中实时检查
  • memoryFlush
     → 压缩前先存记忆
  • truncateAfterCompaction
     → 压缩后轮转日志
  • maxActiveTranscriptBytes: "20mb"
     → 20MB 触发阈值
  • notifyUser
     → 压缩时通知用户
  • model: "zhipu/glm-4-flash"
     → 用免费模型做摘要

所有子 agent 默认继承此配置,无需逐个设置。


📊 实战效果对比

场景:让 Agent 重构一个 50 个文件的 Node.js 项目

指标
配置前
配置后
最大连续工具调用
8 次溢出
100+ 次稳定运行
单次任务耗时
15 分钟(含重试)
12 分钟(无中断)
日志文件大小
2.3GB(一个月)
<20MB(自动轮转)
Token 消耗
主力模型压缩
Flash 免费模型压缩

⚠️ 注意事项

1. 首次配置后重启 agent:修改 openclaw.json 后需要重启 agent 才能生效

2. memory 目录定期清理:虽然 memoryFlush 保护了关键信息,但 memory/ 目录也会增长,建议每季度手动清理一次旧文件

3. 生产环境先测试:在正式任务前,先用小任务验证配置是否生效,观察日志轮转是否正常


🎯 总结

上下文溢出不是 bug,是设计特性——AI 需要记忆,但记忆需要管理。

OpenClaw 的这套组合拳:

招式
配置
核心作用
💰 省钱摘要
compaction.model
用免费模型降低压缩成本
🛡️ 事前预防
midTurnPrecheck
从轮次级检查细化到工具调用级检查
💾 保护记忆
memoryFlush
压缩前先保存关键信息
🔄 日志轮转
truncateAfterCompaction

 + maxActiveTranscriptBytes
日志文件自动轮转,避免磁盘爆炸

四招齐出,从此你的 Agent 可以稳定运行数小时甚至数天,不再担心中途溢出前功尽弃。


喜欢的请关注一下!

本文配置已在 OpenClaw v2026.5.4 版本验证,如有更新以官方文档为准。

觉得有用?转发给也在用 OpenClaw 的朋友,一起避坑 🚀