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 } }}
效果对比:
|
|
|
|
|---|---|---|
|
|
|
|
|
|
|
|
这就是”事后救火“和”事前预防“的区别。强烈建议所有长任务场景都开启此选项。
💾 第三招: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:压缩后把旧日志归档,创建新日志
如果没有 truncateAfterCompaction,maxActiveTranscriptBytes 就失去了意义——检测到了也不清理,文件还是继续膨胀。
📏 推荐配置:
开发环境: "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 项目
|
|
|
|
|---|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
⚠️ 注意事项
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 的朋友,一起避坑 🚀
夜雨聆风