Claude Code 报 Prompt is too long 怎么解决?五个吃上下文的大户
Prompt is too long
看到这条,绝大多数人的第一反应是「聊太久了」,然后 /clear 重开。
/clear 当然管用——但如果你是刚开一个新会话没几轮就撞上,或者清完之后没多久又满了,那问题就不在「聊太久」上。上下文有五个大户,历史对话只是其中一个。
这篇按官方给的处理逐条拆开,并给出定位方法。
一、先定位:/context 比猜有用
官方对这条报错给的处理里,有一条是运行 /context 查看上下文消耗细节。
这一步应该放在所有动作之前。因为下面五个大户里,你清掉哪一个,取决于是哪一个在占地方——不看就动手,很可能清了个小的,大的还在那。
/context 会告诉你各部分的占比。看清楚之后再对症。
二、大户一:挂着的 MCP 服务
官方处理里明确给了这条:
/mcp disable <name>
每一个挂着的 MCP 服务,都会把自己的工具定义塞进上下文。 一个服务提供十几个工具,每个工具有名字、描述、参数结构——这些全都要占位置,而且是每一轮都占。
挂五六个不常用的服务,你的会话可能一开局就先吃掉一块,还没说话呢。
这条是「新会话没几轮就满」最常见的真因。 判断方法很简单:/context 看工具定义那部分的占比,如果显眼,就把当前任务用不上的服务关掉。
顺带一提,/mcp 还能查 MCP 服务的状态,官方在排查页里把它和 /doctor 并列为两个自检入口。
三、大户二:CLAUDE.md
官方处理里的另一条是修剪大型 CLAUDE.md 内存文件。
CLAUDE.md 每次会话都会进上下文。你写得越详细,每一轮的可用空间越少——这是一笔持续支付的固定成本。
这里有个容易走的弯路:为了让它更懂你的项目,把规范、约定、历史决策、代码风格全写进去,写成几千字。结果是它确实更懂了,但你能聊的轮数变少了。
官方给的另一条相关处理是:把指令移到路径范围规则里。也就是说,不必所有内容都放在全局的 CLAUDE.md 里——只在特定目录下生效的规则,放到对应的范围里,不相关的时候就不占地方。
四、大户三:粘贴进来的大内容
官方在好几条报错的处理里反复给同一个建议:按路径引用大文件,而不是粘贴内容。
这条在 Prompt is too long、Request too large、自动压缩 thrashing 三个地方都出现了——出现三次,说明它是最高频的诱因。
粘贴和按路径引用的区别:
- 粘贴:整个内容立刻进上下文,而且赖着不走,之后每一轮都带着它
- 按路径:它需要的时候去读,可以只读你指定的行号区间或某个函数
后者的可控性完全不是一个量级。
有一个副作用值得知道:如果你一次性粘贴了超大内容把上下文灌满,然后想 /compact,可能会撞上 Not enough messages to compact.——官方解释过,即使上下文满了也可能出现这条,因为对话轮数太少,没有可总结的结构。这时候 /compact 帮不了你,只能 /clear。
五、大户四:工具输出
这个最隐蔽,因为不是你主动放进去的。
它读了一个大文件、跑了一条输出很长的命令、搜索命中了几百个结果——这些结果全都进上下文。
官方对自动压缩 thrashing 的说明正好印证了这一点:压缩成功了,但「一个文件或工具输出立刻把上下文重新灌满」。
对策在官方给的四条恢复办法里:
- 让它分块读——指定行号区间或某个函数,而不是整个文件
- 把大文件工作交给子代理,子代理跑在独立的上下文窗口里
/compact时带上重点,例如/compact keep only the plan and the diff,把大输出丢掉
第二条是最一劳永逸的。子代理有自己的上下文窗口,让它去啃那个大文件、只把结论带回来,主会话完全不受影响。
六、大户五:历史对话
最后才是大家最先想到的那个。官方给的处理:
/compact总结早期轮次、释放空间/clear直接重开
关于 /compact,有两个用法值得知道:
它可以带指示。 不是只能光秃秃地敲一个 /compact。你可以告诉它保留什么,官方给的例子是 /compact keep only the plan and the diff。带上重点之后,摘要会围着那部分组织,不容易被大输出挤掉。
别等满了才压。 压缩这个动作本身要占空间——剩余窗口如果连摘要都放不下,就会报 Error during compaction: Conversation too long。留一点余量去压,成功率完全不一样。
七、按顺序处理
把上面压成一条路径:
/context—— 先看是谁在占地方,不看别动手- 工具定义占比大 →
/mcp disable <name>关掉当前用不上的服务 CLAUDE.md占比大 → 精简它,或把局部规则移到路径范围规则里- 某次工具输出/粘贴内容占比大 → 以后按路径引用、分块读、或把这类活交给子代理
- 确实是历史对话堆起来的 →
/compact(可以带重点),或/clear - 压缩本身失败了 → 两次 Esc 回退几条再压;还不行
/clear
前四步治的是结构性问题(每次会话都会重现),第五步治的是当次问题。只做第五步的话,下次还会撞上。
八、几条相关报错的区别
| 报错 | 说的是 | 关键区别 |
|---|---|---|
Prompt is too long | 对话 + 附加内容超过上下文窗口 | 本文主题 |
Context exceeds the token limit | 对话已超过上下文窗口 | 处理方向同上(/compact 或 /clear) |
Request too large | 原始请求体超过 API 的 32MB 限制 | 是字节大小,不是 token 数;通常由贴入超大文本/数据触发 |
exceeded the 32000 output token maximum | 单次输出太长 | 跟上下文剩多少无关,是它一口气能写多长 |
Not enough messages to compact. | 轮数太少,没东西可总结 | 上下文满了也可能出现;这时 /compact 无解,用 /clear |
最后那条最反直觉,值得单独记住:上下文满 ≠ 有东西可压缩。
九、附件也是上下文,而且有独立的限制
图片和 PDF 容易被当成「额外的东西」,其实它们同样占地方,而且有自己独立的尺寸限制,撞上时报的是另外几条:
| 报错 | 官方说明与处理 |
|---|---|
Image was too large | 图片超过 API 的大小或尺寸限制。API 接受单张图最长边最多 8000 像素;多张图时是 2000 像素。处理:贴之前缩放,或者截一张更小范围的图 |
Unable to resize image | Claude Code 没法在发送前缩放这张图。如果报错要求转换格式,转成 PNG、JPEG、GIF 或 WebP;如果报的是尺寸或大小限制,自己先缩放 |
PDF too large | 超大 PDF:用 Read 工具读页面范围,或者用 pdftotext 先把文本提取出来 |
PDF is password protected / The PDF file was not valid | 去掉密码,或者从源应用重新导出 |
那个 8000 / 2000 像素的差别值得记住:一次贴一张图和一次贴多张图,单张的尺寸上限不一样。 批量贴截图时更容易撞上。
PDF 那条给的思路和大文件是一样的——别整个塞进去,按需读。Read 工具能读页面范围,pdftotext 能把文本抽出来,两种都比整份 PDF 进上下文省得多。
实操上有个习惯值得养成:截图截小一点。 全屏截图除了尺寸大,还带着一堆无关内容,既占地方又干扰判断。官方在处理里也是这么建议的——截相关区域的紧凑截图,而不是整个屏幕。
十、总结
- 先
/context,看清是谁占的地方再动手。 - 挂着的 MCP 服务是「新会话很快就满」的头号真因,
/mcp disable <name>关掉不用的。 CLAUDE.md是持续支付的固定成本,局部规则移到路径范围规则里。- 按路径引用大文件,不要粘贴——这条在官方文档里出现了三次。
- 大文件工作交给子代理,它有独立的上下文窗口。
/compact可以带重点,而且别等满了才压。
本文所引官方内容来自 Claude Code 官方错误参考与排查文档,核对日 2026-08-08。命令与产品行为会随版本变化,以官方文档为准。