Claude Code 报 Error during compaction 怎么解决?三种压缩报错要分开治

2026-08-08

用 Claude Code 干长活的人,迟早会在某一次 /compact 之后看到一行红字,然后整个会话卡在那儿——上下文满了压不下去,想接着干也干不了。

麻烦的是,「压缩失败」在 Claude Code 里其实是三种不同的报错,长得像,成因完全不一样,解法也不通用。网上很多帖子把它们混在一起讲,照着做没效果,多半就是治错了病。这篇按报错原文把它们拆开,并且明确标出哪些是官方文档给的做法、哪些只是社区的绕过办法、哪些到今天仍然没有定论。

一、先对号入座:你看到的是哪一条

Error during compaction: Conversation too long
Not enough messages to compact.
Autocompact is thrashing: the context refilled to the limit...

三条报错对应三种完全不同的处境:

报错实际发生了什么治的方向
Conversation too long压缩这个动作本身要占上下文,但剩余空间已经装不下生成的摘要了先腾出一点空间,再压
Not enough messages to compact.对话轮数太少,没东西可总结不是故障,换个思路处理
Autocompact is thrashing压缩成功了,但立刻又被灌满,连续几次后系统主动停手治「谁在灌满它」

第一条最常见,第三条最容易被误判成第一条。先看清楚自己是哪一条,再往下走——这一步省下的时间比后面所有步骤加起来都多

二、Conversation too long:压缩自己也要占地方

这条报错的反直觉之处在于:你是因为上下文快满了才去压缩的,结果它告诉你因为太满所以压不了

原因不难理解。/compact 的工作方式是让模型读一遍现有对话、写出一份摘要,然后用摘要替换掉原文。写摘要这个动作本身要占输出空间,如果剩余窗口连摘要都放不下,这一步就失败了。所以它不是「压缩坏了」,而是你启动压缩启动得太晚了

官方给的做法

官方错误参考页对这条的处理是三步,按顺序试:

  1. 按两次 Esc,打开消息列表,往回退几条消息
  2. 回退之后再运行 /compact
  3. 如果回退腾出的空间仍然不够,直接 /clear

第一步是关键,也是最容易被跳过的一步。往回退几条消息意味着把最近那几轮从上下文里摘出去——通常正是那几轮里有一次超大的文件读取或工具输出,把窗口撑爆的就是它们。退掉之后再压,成功率会明显不一样。

如果你不确定该退到哪里,运行 /context 看一眼上下文的消耗构成,哪一块占得离谱一眼就能看出来。

社区在 issue #7530 里给的绕过办法

官方三步不管用的时候,还有一条流传比较广的路子。先说清楚:这是社区在 GitHub issue #7530(已关闭,134 条评论)里给出的绕过办法,官方文档没有收录,也没有确认过。

那条高赞评论给的步骤是:

  1. ^C^C(连按两次 Ctrl+C 退出 claude
  2. 重新运行 claude
  3. /resume 恢复上一个会话
  4. 再执行 /compact

评论者称自己试了约 30 次全部成功。同一个帖子里还有人反映,在剩余 25%、甚至 12% 的时候也照样撞上这条报错——这说明它并不严格等于「上下文完全用尽」,所以你在还有空间的时候遇到它,不必怀疑自己看错了。

为什么退出重进会有用,公开信息里没有解释。这是一条经验性的绕过办法,不是原理性的修复,能不能用要你自己试。好消息是它没有破坏性:退出 claude 不会丢对话,/resume 能在同一目录接回来。

三、Not enough messages to compact.:这不是故障

看到这条,很多人的第一反应是「明明上下文都满了,怎么会没东西压」。

官方排查页专门解释过这个看起来矛盾的情况:即使上下文已经满了,也可能出现这条提示——典型场景是你一次性粘贴了一大段内容,一下就把窗口灌满了,但对话轮数只有寥寥几轮。摘要是从「多轮对话」里提炼的,只有两三轮、其中一轮特别巨大,就没有可总结的结构。

所以这条不该按报错治。对的做法是处理那一大坨内容本身

  • 如果那段内容来自文件,别粘贴,改成按路径让 Claude 去读——官方在 Request too large 那条里给的也是同一个建议:按路径引用大文件,而不是把内容贴进去
  • 如果确实需要它在上下文里,让 Claude 分块读,比如指定行号区间或某个函数
  • 如果那段内容已经用完了,直接 /clear 重开更省事

四、Autocompact is thrashing:压缩没坏,是有人一直在灌

这条报错的完整形态是 Autocompact is thrashing: the context refilled to the limit...,意思官方写得很直白:自动压缩成功了,但一个文件或工具输出立刻又把上下文灌满,连续好几次都这样。Claude Code 于是主动停止重试,避免在一个不前进的循环里空烧 API 调用。

这是三条里唯一一条系统主动踩刹车的。它不是失败,是保护。

官方给的四条恢复办法:

  1. 让 Claude 分块读那个超大文件——指定行号区间或某个函数,而不是整个读进来
  2. 运行 /compact带上重点,把大输出丢掉,例如 /compact keep only the plan and the diff
  3. 把涉及大文件的工作交给子代理去做,子代理跑在独立的上下文窗口里,不会污染主会话
  4. 前面的对话已经不需要了,就 /clear

第三条是四条里最值得记住的。子代理有自己的上下文窗口,让它去啃那个大文件、只把结论带回来,主会话就不会被原始内容撑爆。很多人是在反复撞上 thrashing 之后才想起来还有这个用法,其实它本来就是为这类场景准备的。

第二条那个写法也值得单独说一句:/compact 是可以带指示的,不是只能光秃秃地敲。你告诉它保留什么,摘要就会围着那部分组织,被大输出挤掉重点的概率会小很多。

五、怎么确认自己真的修好了

压缩类的问题有个讨厌的地方:当时看起来好了,干十几分钟又回来了。所以别只看「这次没报错」,按下面两条确认:

  • /context 看构成。压缩之后跑一次,看占比最大的那块是不是降下来了。如果压完之后某个大块纹丝不动,说明它每轮都在被重新塞进去,你治的是症状不是病根。
  • /doctor 做一次整体自检。官方排查页把它列为不确定该看哪里时的第一站,它会检查安装、设置、扩展和上下文用量,发现问题会在你确认后应用修复。如果 claude 已经起不来了,就在 shell 里跑 claude doctor

六、以后怎么少碰到

压缩报错基本都是上下文卫生问题的滞后表现。几条能明显减少复发的习惯:

  • 别等满了才压。上下文的余量是有用的资源,压缩本身要花掉一部分——留着最后一点余量去压,等于把成功率压到最低。
  • 大文件按路径引用,不要粘贴。这条在官方文档里出现了不止一次(Prompt is too longRequest too large、thrashing 三处都提到),说明它是最高频的诱因。
  • 关掉用不上的 MCP 服务。官方在 Prompt is too long 那条里明确给了 /mcp disable <name>——每个挂着的 MCP 服务都会把自己的工具定义塞进上下文,挂五六个不用的,开局就先吃掉一块。
  • 精简 CLAUDE.md。它每次会话都会进上下文,写得越长,你每一轮的可用空间越少。
  • 重启不丢对话。这一点很多人不知道,导致宁可硬扛也不敢退出。实际上关掉之后在同一目录跑 claude --resume 就能接回来,该退就退。

七、把三条对照着记

最后压成一张表,下次看到红字直接对:

你看到的第一步该做什么证据级别
Conversation too long两次 Esc 回退几条 → 再 /compact → 还不行 /clear官方文档
Conversation too long(官方三步无效)退出 → 重开 → /resume/compact社区办法,官方未确认(issue #7530)
Not enough messages to compact.不当故障治,改掉「大段粘贴」的用法官方文档
Autocompact is thrashing找出每轮灌满上下文的那个大输出,交给子代理或分块读官方文档

三条报错里,前两条治的是你自己的上下文用法,第三条治的是某一个具体的大输出。方向搞对了,剩下的都是体力活。

本文所引官方处理均来自 Claude Code 官方错误参考与排查文档,社区办法来自 GitHub issue #7530,核对日 2026-08-08。产品行为会随版本变化,具体以官方文档与你所用版本的实际表现为准。

相关阅读

想系统学会用 AI?报名体系课或加入会员,照着学、照着用。