Claude Code 显示 100% Context Used,然后呢?
状态栏跳红,显示 100% context used。
第一反应通常是 /compact 或者干脆关掉会话重来。但这个数字本身并不能告诉你该做什么——它可能意味着三种完全不同的情况,对应三种完全不同的处理方式。
三种 100% 和各自的处理方式
1. 假满:200K 重置 Bug(已修复)
如果你的 Claude Code 版本还在 v2.1.209 以下,自动更新后有可能触发一个已知 Bug:CLI 更新时会短暂地把上下文窗口大小重置为 200K——即使你用的是 1M 模型。
百分比算法很简单:已用 Token ÷ 窗口大小。当分母从 100 万突然变成 20 万,而你的会话已经积累了 30 万 Token,显示 100% 就是纯粹的数学意外。实际上你离真正的上限还远得很。
怎么判断:会话还能正常对话和调工具,/context 显示窗口上限是 200K 而不是你模型的真实值。
怎么办:升级到 v2.1.210+,或者退出 CLI 重启。这个 Bug 在 v2.1.210 中修复了。
claude --version
claude update
2. 真满:上下文确实用完了
长会话、大量文件读取、反复调工具,Token 是会真正耗尽的。到这个阶段,模型的表现会明显劣化——开始遗忘前面的指令,重复犯已经纠正过的错误,回答质量肉眼可见地往下掉。
怎么判断:/context 里各分项加起来确实逼近窗口上限,而且你能感受到模型在变笨。
怎么办:取决于你接下来要做什么。
| 场景 | 操作 |
|---|---|
| 当前任务还没做完,需要保留上下文 | /compact 加一句描述:/compact 保留 auth 模块的修改记录和测试结果 |
| 要切到一个新任务 | /clear,干净利落 |
| 任务太大,一个会话装不下 | 拆分。把探索性的工作交给 Subagent,只拿结论回来 |
3. 到了阈值但还没满:Auto-compact 介入
你可能看到 100% 闪了一下,然后自动降回去了。这是 auto-compact 在工作——Claude Code 在接近窗口上限时会自动触发压缩,把对话历史浓缩成摘要继续往下跑。
大多数时候这是无感的,不需要你做任何事。但如果你注意到压缩后模型似乎忘了一些关键信息,说明自动压缩的摘要没能保住你需要的东西。这时候与其等它自动来,不如在接近上限之前主动 /compact,用描述告诉它什么该留。
/context 才是真相
百分比只是一个数字。要判断上下文的实际状况,用 /context 看分项数据:
- 窗口上限——应该等于你模型的真实窗口(Opus 5 / Opus 4.x 是 1M,Sonnet 是 200K)
- 系统提示——CLAUDE.md、rules、skills 描述、MCP 工具列表等,这些每个会话都会加载
- 对话历史——你和 Claude 来回对话的内容
- 工具输出——文件读取、命令执行结果、搜索结果等
工具输出通常是最大的 Token 消耗源。你在终端里看到的是一行”Read auth.ts”,但实际上整个文件的内容都进了上下文。一个 500 行的文件轻松占掉几千 Token。
上下文不是只靠省就行的
很多”最佳实践”会告诉你要尽量少读文件、控制对话轮数。这些没错,但更实际的思路是把上下文当作一种资源来分配,而不是当作一个需要节约的开销。
几个真正有用的习惯:
用 Subagent 做重活。 需要在代码库里大范围搜索、读一堆文件才能搞清楚一个问题的时候,交给 Subagent。它有自己独立的上下文窗口,做完只把结论交回来。中间过程读了多少文件、搜了多少代码,都不会占你主会话的空间。
切任务就 /clear。 前一个任务的上下文对新任务来说就是噪声。与其让模型在一堆过期信息里分心,不如写下当前状态然后开个干净的会话。
主动 /compact 比等自动的好。 自动压缩触发的时机往往是上下文最满的时候,这时候模型的注意力已经被大量信息分散,生成的摘要质量反而最差。在你主动判断”这块工作告一段落”的时候手动压缩,并且告诉它重点保留什么,效果会好很多。
持久信息放 CLAUDE.md。 构建命令、架构约定、代码规范——这些每个会话都需要的东西放在 CLAUDE.md 里。它每个会话开头自动加载,不会因为 /compact 被压缩掉。
近期的相关更新
7 月到 8 月之间,Claude Code 在上下文管理方面密集地改了一轮(截至 v2.1.233):
- v2.1.210:修复了自动更新后窗口重置为 200K 的误报 Bug
- v2.1.216:修复了长会话中消息处理的性能问题(耗时从秒级降下来了),
/context现在会在超过窗口时显示明确警告 - v2.1.217:修复了 Opus 4.8 在 Bedrock 上 auto-compact 不触发的问题;修复了被截断的 MCP 工具输出在内存里保留完整副本的内存泄漏
- v2.1.218:修复了
/context在压缩后仍然显示旧数据的问题 - v2.1.223:
CLAUDE_CODE_DISABLE_1M_CONTEXT现在对所有 1M 窗口的模型生效(不再只是固定的几个);对未识别的模型 ID,auto-compact 现在会主动限制在假设的窗口大小内,而不是放任增长——如果你用自定义模型并且需要旧行为,设CLAUDE_CODE_DISABLE_UNKNOWN_MODEL_WINDOW_ENFORCEMENT=1 - v2.1.229:压缩进度条改进,现在会显示重试倒计时
如果你之前被 100% 误报困扰过,升级到最新版本大概率能解决。
环境变量速查
| 变量 | 作用 |
|---|---|
CLAUDE_CODE_DISABLE_1M_CONTEXT | 强制所有 1M 模型使用 200K 窗口(通过 auto-compact 限制) |
CLAUDE_CODE_DISABLE_UNKNOWN_MODEL_WINDOW_ENFORCEMENT=1 | 允许未识别模型突破假设的窗口限制 |
CLAUDE_CODE_MAX_SUBAGENTS_PER_SESSION | 单会话 Subagent 上限,默认 200,/clear 重置 |
参考:Claude Code changelog · Context window 文档 · Session management & 1M context