# Claude Code 压缩失败：Error compacting conversation 原因与恢复

> Error compacting conversation 只说明压缩出错，原因在同时出现的那行报错。先升级，再按原文选回退、局部压缩或 /clear 恢复。

- URL: https://blog.laozhang.ai/zh/posts/claude-code-error-compacting-conversation
- Published: 2026-10-16
- Updated: 2026-10-16
- Author: LaoZhang AI Team (https://blog.laozhang.ai/zh/about)
- Topic: Claude Code
- Tags: Claude Code, /compact, 自动压缩, 上下文窗口, 报错排查

---
Claude Code 弹出红色的 `Error compacting conversation`，意思只是“这次压缩抛了错”，通知本身不写原因。不管是手动 `/compact`、自动压缩，还是回退菜单里的 Summarize，失败时都弹同一条通知。真正的原因在同时出现的那行报错里：`Error during compaction:` 后面的内容，或者以 `Compaction failed ·`、`Compaction interrupted ·`、`Prompt is too long · automatic compaction failed:` 开头的那一行。认出是哪一条，再选对应的恢复方法。

不管是哪一条，先做两件事：

1. 在终端运行 `claude update`。截至 2026 年 10 月 16 日，Claude Code 最新版是 2.1.301，此前的版本陆续修掉了多种压缩失败，例如 2.1.85 修了“对话大到连压缩请求都装不下”时 `/compact` 失败，2.1.290 修了压缩报 `null is not an object`。升级后重新运行一次 `/compact`，很多会话就能继续。
2. 准备回退或清空之前，用 `/export` 把当前对话导出成纯文本留底。

还不行，就按损失从小到大依次试：回退几条消息再压缩，用 Summarize from here 或 Summarize up to here 只压一段，带重点说明重新 `/compact`，去掉大附件，最后把任务状态写进文件再 `/clear`。这些操作都不动磁盘上的代码：压缩和 Summarize 不改文件，回退菜单的 Restore conversation 只回退对话、保留当前代码。

## Error compacting conversation 是什么意思：外壳通知，原因在旁边那行

在 2.1.301 里，这条红色通知会在三种压缩出错时弹出：手动 `/compact`、自动压缩，以及回退菜单里的 Summarize from here / Summarize up to here（局部压缩）。它只是把“压缩抛了错”告诉你，具体是什么错，看同时出现的报错行。

有三种情况不会弹这条通知，因为它们并不是压缩坏了：

- 压缩进行中你按了 Esc。2.1.133 起显示 `Compaction canceled.`，更早的版本会误弹红色通知，这个问题在 [Claude Code 更新日志](https://raw.githubusercontent.com/anthropics/claude-code/main/CHANGELOG.md)的 2.1.133 条目里修掉了。
- `/compact` 回答 `Not enough messages to compact.`：没有更早的内容可以总结。
- 配置里的 PreCompact hook 阻止了压缩。

所以如果你只看到这三条中的某一条，会话本身没出故障，按下面对照表里“不是故障”的部分处理即可。通知的触发条件依据 2.1.301 程序里的提示文字和更新日志，这条红色通知在交互界面中的实际触发没有复现过（复现范围见后文）。

## 压缩失败对照表：按同时出现的报错原文找原因

下面是会伴随 `Error compacting conversation` 出现的真正失败。报错原文以 Claude Code 2.1.301 为准，旧版本措辞可能不同。

| 同时出现的报错原文 | 含义 | 先这样恢复 |
| --- | --- | --- |
| `Conversation too long. Press esc twice to go up a few messages and try again.`，常见完整形式以 `Error during compaction: Error:` 开头 | 对话大到连压缩请求本身都装不下上下文窗口 | 清空输入框后按两次 Esc，选早几条的消息，用 Restore conversation 回退，再 `/compact`。2.1.85 和 2.1.284 都改进过这种情况，旧版本先升级 |
| `Compaction failed · conversation could not be reduced below the context limit` | 压缩之后仍降不到上下文上限以下 | 用 Summarize from here 从较早的位置压缩，或带重点 `/compact` 只保留计划和改动；仍失败就把状态写进文件后 `/clear` |
| `Compaction failed · attached media exceeds size limits` | 对话里的图片、PDF 等附件超出大小限制 | 按两次 Esc 回到加入大附件那一轮之前，或 `/clear`；大文件改成按路径引用 |
| `Compaction interrupted · This may be due to network issues — please try again.` | 压缩过程中连接中断 | 网络恢复后重新 `/compact` |
| `Prompt is too long · automatic compaction failed:` 后面跟具体原因 | 上下文已满，自动压缩又因另一个错误没跑成，例如模型不可用或认证失败 | 先解决冒号后面那个错误，否则 `/compact` 会因为同一个错误失败。2.1.229 起才显示这个原因，之前只显示 `Prompt is too long` |
| `Error during compaction:` 后面跟其他内容 | 压缩请求遇到了别的错误 | 先 `claude update`，下文列了已经修过的几种 |

![五条压缩失败报错原文分别对应的含义和第一步恢复方法](https://blog.laozhang.ai/posts/zh/claude-code-error-compacting-conversation/img/compaction-error-map.webp)

两条 `Compaction failed ·` 的具体触发条件，官方文档没有写。表里给它们的恢复方法是推断：第一条按“对话太大”的通用处理；第二条参照 [Claude Code 错误参考里的 Request too large 一节](https://code.claude.com/docs/en/errors#request-too-large)，那里对超过 32MB 请求上限的附件建议是按两次 Esc 退回加入大内容之前，或者 `/clear`。网络中断那条，合上 Mac 让它在压缩时休眠也会打断；2.1.290 修过休眠导致自动压缩直接放弃的问题。

`Error during compaction:` 后面跟的是其他内容时，先对照这些已在更新日志里修过的情况，版本低于对应号就升级：

- `Extra usage is required for long context requests`：压缩恢复出来的长上下文会话时失败，2.1.113 修复。
- Amazon Bedrock 的 `Input is too long for requested model.`：2.1.217 之前 Claude Code 不认这个说法，自动压缩不触发，`/compact` 也跟着失败。Bedrock 上的其他 400 报错可以看 [AWS Claude 报 400 怎么办：按报错原文逐条排查](https://blog.laozhang.ai/zh/posts/aws-claude-400-error)。
- 会话历史里有一条格式损坏的 MCP 工具通知，导致每一轮和 `/compact` 都失败：2.1.280 修复。
- 总结请求被模型拒绝：2.1.282 起会自动换备用模型重试。
- 保存的会话记录里压缩标记字段缺失或损坏，压缩和恢复会话都失败：2.1.285 修复。
- `null is not an object`：2.1.290 修复。
- 通过自定义 `ANTHROPIC_BASE_URL` 使用网关专用模型名，在 200K 附近以 `Prompt is too long · automatic compaction failed` 结束：2.1.299 修复。

### 看起来像压缩失败，其实不是：五条提示

| 提示原文 | 含义 | 怎么处理 |
| --- | --- | --- |
| `Compaction canceled.` | 压缩时按了 Esc | 需要时重新 `/compact` |
| `Not enough messages to compact.` | 没有更早的内容可总结：只有一轮对话，或刚压缩过 | 上下文却已满，说明一条提示加上每次请求附带的内容就占满了窗口：`/clear` 后少贴内容、换小附件再发，或减少 MCP 工具和记忆文件 |
| `Compaction blocked by PreCompact hook:` 后面是 hook 命令和它给出的原因 | 某个 PreCompact hook 以退出码 2 或 `{"decision":"block"}` 拦下了压缩 | 看原因决定；不再需要这个限制，就在 settings 里删掉或改写该 hook |
| `/compact isn't available in this environment.` | 设置了 `DISABLE_COMPACT=1`，手动和自动压缩都关了 | 去掉这个环境变量 |
| `Context limit reached · /compact or /clear to continue` | 上下文窗口满了，等你压缩或清空 | 运行 `/compact`；行尾还写着 `auto-compact is off · /config to turn it on` 时，去 `/config` 打开自动压缩 |

PreCompact hook 从 2.1.105 起可以阻止压缩。hook 写在哪、怎么配，见 [Claude Code Hooks、Skills 与斜杠命令：区别、选型和最小配置](https://blog.laozhang.ai/zh/posts/claude-code-hooks-slash-commands-skills)。

## 让会话继续：从回退到 /clear 的六种恢复方法

下面按丢失的上下文从少到多排。前一种不奏效再换下一种。

![从回退几条消息到写进文件再清空，六种恢复方法按丢失上下文从少到多排列](https://blog.laozhang.ai/posts/zh/claude-code-error-compacting-conversation/img/recovery-ladder.webp)

### 回退几条消息，再重新压缩

`Conversation too long` 的原文已经给了办法：往回退几条消息再试。

1. 确认输入框是空的。输入框里有文字时，按两次 Esc 会先清空文字（按 ↑ 能找回），而不是打开菜单。
2. 按两次 Esc，或输入 `/rewind`，打开回退菜单。
3. 选一条较早的消息，选 Restore conversation。这一步只回退对话，当前代码保持不变；那条消息的原始内容会回到输入框，方便你稍后重发。
4. 运行 `/compact`。

有用户反馈，另一种做法也能让旧版本恢复：退出 Claude Code，用 `claude --resume` 回到同一会话，再 `/compact`。这属于社区经验，不保证在当前版本仍然必要。

### 只压一段：Summarize from here 与 Summarize up to here

整段对话压不动时，可以只压其中一段，让压缩请求变小：

- **Summarize from here**：把选中的消息及之后的内容压成摘要。适合后半段是一长串调试输出的情况，前面的任务说明保持原样。
- **Summarize up to here**：把选中消息之前的内容压成摘要，之后的消息原样保留。

在回退菜单里用方向键高亮其中一项，在 add context (optional) 处输入你希望摘要保留的重点，再按 Enter；直接按数字键会不带说明立即压缩。原始消息仍保存在会话记录里。局部压缩同样是压缩，失败时也会弹 `Error compacting conversation`，要看同时出现的报错行。

### 带重点说明重新 /compact

`/compact` 后面可以跟一段说明，让摘要只保留你指定的内容，例如官方示例 `/compact keep only the plan and the diff`，也可以写中文：`/compact 只保留当前计划、已改文件和下一步`。摘要里留下的东西少，压缩后剩余空间就多，也不容易压完马上又满。

### 去掉大附件

报错提到附件，或者你记得失败前刚贴过大图、PDF，就按两次 Esc 回到加入它那一轮之前，用 Restore conversation 回退。之后让 Claude 按路径读取大文件，它可以分段读，不必一次装进上下文。

### 先修好底层错误

`Prompt is too long · automatic compaction failed:` 冒号后面写的才是要处理的问题。官方错误文档举的例子是模型不可用和认证失败：模型不可用就先用 `/model` 换一个可用的模型，认证失败就先重新登录。这个错误不解决，`/compact` 会因为同一个原因失败。详见 [Claude Code 错误参考里的 Prompt is too long 一节](https://code.claude.com/docs/en/errors#prompt-is-too-long)。

### 把状态写进文件，再 /clear

前面都不行，或者这段对话已经不值得保留，就换一个空会话继续。先让 Claude 把当前任务、已做的决定、改过的文件和下一步写进计划文件或项目根目录的 `CLAUDE.md`，再运行 `/clear`，在新会话里让它读这个文件接着做。

写进文件是因为文件不受压缩影响。按 [Claude Code 上下文窗口文档里“压缩后保留什么”一节](https://code.claude.com/docs/en/context-window#what-survives-compaction)，项目根目录的 `CLAUDE.md`、不带路径限定的规则、自动记忆和计划模式写下的计划，压缩后都会从磁盘重新载入；只存在于对话里的信息则会被总结掉或丢失。长期规则该放哪一层，见 [Claude Code Memory 指南（2026）：CLAUDE.md、auto memory 与插件怎么分工](https://blog.laozhang.ai/zh/posts/claude-code-memory)。

`/clear` 可以撤销：用 `/resume` 回到原来的对话；如果还在同一个 Claude Code 进程里，回退菜单顶部会多出一项 previous session，选它也能回去。

## Autocompact is thrashing：压缩成功了，但三轮内又满

完整提示是：

```text
Autocompact is thrashing: the context refilled to the limit within 3 turns of the previous compact, 3 times in a row. A file being read or a tool output is likely too large for the context window. Try reading in smaller chunks, or use /clear to start fresh.
```

这条不属于压缩失败：压缩本身成功了，只是每次压完，某个文件或工具输出又在 3 轮内把上下文填满，连续 3 次后 Claude Code 停下，免得白白消耗 API 调用（这个保护从 2.1.89 开始）。按 [Claude Code 故障排查文档的 thrashing 一节](https://code.claude.com/docs/en/troubleshooting)，处理顺序是：

1. 让 Claude 分段读那个大文件，比如只读某个行范围或某个函数。
2. 带重点 `/compact`，丢掉那段大输出，例如 `/compact keep only the plan and the diff`。
3. 把读大文件的工作交给子代理（subagent），文件内容留在它自己的上下文窗口里。
4. 之前的对话不再需要，就 `/clear`。

`/clear` 之后仍然出现，运行 `/context`，比较 Messages 一行和上面其他几行：Messages 最大，说明新对话里还是有文件或工具输出在撑满窗口，重复 1 到 3；其他几行加起来更大，说明会话一开始载入的系统提示、工具定义和记忆文件就占掉了大部分空间，要削减启动时载入的内容。MCP 工具定义和大返回怎么排查，见 [Claude Code MCP 上下文爆掉：排查占用、工具搜索与输出压缩](https://blog.laozhang.ai/zh/posts/claude-code-mcp-context-overload)。

另外看一眼窗口大小是否被算小了。原生 100 万 token 窗口的模型（Fable、Sonnet 5 及以后、Haiku 5.5、Opus 4.7 及以后）默认在约 967K token 时自动压缩；Claude Code 认不出的模型 ID（比如 LLM 网关里的别名）一律按 200K 计算。用的模型明明支持更大窗口，却总在 200K 附近反复压缩或报错，就按 [Claude Code 模型配置文档里修正网关模型窗口的说明](https://code.claude.com/docs/en/model-config#correct-the-window-for-a-gateway-or-custom-model-id)处理：先 `claude update`，仍不认识再用 `modelOverrides` 把你的 ID 映射到对应模型。2.1.286 起，如果是降级备用模型把窗口从 1M 降到了 200K，thrashing 提示里会直接写出来。

## 自动压缩开关：DISABLE_COMPACT 等三种关法与 /autocompact

| 设置 | 自动压缩 | 手动 `/compact` | 说明 |
| --- | --- | --- | --- |
| 环境变量 `DISABLE_COMPACT=1` | 关 | 不可用，回答 `/compact isn't available in this environment.` | 上下文满了只能 `/clear` |
| 环境变量 `DISABLE_AUTO_COMPACT=1` | 关，空闲压缩也关 | 可用 | 窗口满之前要自己 `/compact` |
| `/config` 里的 Auto-compact 开关，即设置项 `autoCompactEnabled: false` | 关 | 可用 | 窗口满时提示行会写 `auto-compact is off · /config to turn it on` |
| `/autocompact` 加 token 数，如 `/autocompact 500k` | 提前到指定位置触发 | 可用 | 范围 100K 到 1M，2.1.288 起按模型分别保存 |

关掉自动压缩并不能避免报错，只是把“自动压缩失败”换成了 `Context limit reached`。长会话里更有用的是把自动压缩的触发点调早一些，或者在开始一段新任务前主动带重点 `/compact`。

2.1.299 起还有空闲压缩：超过 200K token 的对话闲置约 54 分钟后，会在 1 小时提示缓存过期前先压缩，下次发消息就不必把整段对话重新处理一遍；不想要可以在 settings.json 里设 `"idleCompaction": false`。压缩与缓存失效对费用的影响，见 [Claude Code 缓存未命中 token 成本：一次对话为什么突然变贵](https://blog.laozhang.ai/zh/posts/claude-code-cache-miss-token-costs)。

## 在 Claude Code 2.1.301 上跑出的提示，和没能复现的几条

2026 年 10 月 16 日，在 macOS 上用 Claude Code 2.1.301 的非交互模式（`claude -p`，模型 Haiku 5.5，总花费约 $0.01）实际运行的结果：

- 全新空会话里 `/compact`：没有输出，也没有报错。
- 只有一轮问答的会话里 `/compact`：成功。
- 刚压缩完再 `/compact`：返回 `Not enough messages to compact.`。
- 配置一个以退出码 2 结束的 PreCompact hook 后 `/compact`：返回 `Compaction blocked by PreCompact hook:`，后面是 hook 命令和它输出的原因。
- 设置 `DISABLE_COMPACT=1` 后 `/compact`：返回 `/compact isn't available in this environment.`。

没有复现的：`Conversation too long`、两条 `Compaction failed ·`、`Compaction interrupted`、thrashing，以及交互界面里的红色通知本身。前几条需要接近上下文上限的超长会话才会触发。上文对它们的解释来自 Claude Code 官方文档、更新日志和 2.1.301 程序里的提示文字。

## 升级到 2.1.301 后仍复现：用 /feedback 或 GitHub issue 报告

先用 `claude --version` 确认已经是最新版。升级后同一个会话仍然压不动，就报告给 Anthropic：

- 在 Claude Code 里运行 `/feedback`，可以选择附带多少会话历史，发送前有确认页。2.1.149 起报告会包含压缩之前的那部分对话。通过第三方提供商或没有登录 Anthropic 账号时，报告会存到本地的 `~/.claude/feedback-bundles/`，需要你自己转交。
- 或者在 [Claude Code 的 GitHub issue 列表](https://github.com/anthropics/claude-code/issues)提交，写明版本号、完整报错行、手动还是自动压缩，以及 `/context` 的输出。

## Claude Code 压缩失败的常见问题

### Claude Code 压缩失败会丢掉已经改好的代码吗？

不会。压缩和 Summarize 只处理对话，不改磁盘上的文件；回退菜单里的 Restore conversation 也只回退对话、保留当前代码。只有选 Restore code 或 Restore code and conversation 才会把文件改回去，压缩失败时用不到这两项。

### 关掉自动压缩能避免 Error compacting conversation 吗？

不能。关掉后窗口满了会停在 `Context limit reached`，还是要你手动 `/compact` 或 `/clear`，手动压缩一样可能失败。更稳妥的是用 `/autocompact` 把触发点提前，并在切换任务时主动压缩或清空。

### 压缩时报 thinking blocks cannot be modified 怎么办？

这条报错的修复办法目前只有用户反馈：关掉终端，用 `claude --resume` 回到会话，必要时用 `/model` 换个模型再压缩。这些反馈出自 2025 年底前后的旧版本，先升级到最新版再试；仍出现就按上一节报告。

### Claude Code 压缩一直转圈、很慢，是卡住了吗？

先看进度。2.1.283 起，压缩进度的计时从压缩开始算，并实时统计摘要已生成的 token 数；2.1.228 起，重试倒计时和停滞提示也会在压缩期间显示。数字还在涨就是在工作。想放弃就按 Esc，会显示 `Compaction canceled.`。全屏模式下 `/compact` 和自动压缩时界面短暂冻结的问题，2.1.301 修复了。

### claude.ai 网页里的“正在压缩对话”也这样处理吗？

不适用。claude.ai 网页聊天的对话压缩，以及 Claude API 的服务端 Compaction，都是和 Claude Code 不同的产品，上面的命令和设置对它们无效。

## 参考来源

本文引用的外部页面，按正文出现顺序排列。最后更新于 2026-10-16。

- [Claude Code 更新日志](https://raw.githubusercontent.com/anthropics/claude-code/main/CHANGELOG.md) (raw.githubusercontent.com)
- [Claude Code 错误参考里的 Request too large 一节](https://code.claude.com/docs/en/errors) (code.claude.com)
- [Claude Code 上下文窗口文档里“压缩后保留什么”一节](https://code.claude.com/docs/en/context-window) (code.claude.com)
- [Claude Code 故障排查文档的 thrashing 一节](https://code.claude.com/docs/en/troubleshooting) (code.claude.com)
- [Claude Code 模型配置文档里修正网关模型窗口的说明](https://code.claude.com/docs/en/model-config) (code.claude.com)
- [Claude Code 的 GitHub issue 列表](https://github.com/anthropics/claude-code/issues) (github.com)
