博客

Claude Code 提示「Prompt is too long」:原因和解决办法

一句话答案

Prompt is too long 的意思是:Claude Code 发出的这次请求,超过了模型的上下文窗口。请求里不只有你的对话,还有系统提示词、工具定义(包括每个 MCP 服务器的工具)、CLAUDE.md 这类记忆文件,以及附带的文件。

想接着干活:

  1. 运行 /compact 把前面的对话压缩成摘要,或者 /clear 重新开始。
  2. 运行 /context 看看窗口被什么占了。
  3. 用 /mcp disable <name> 关掉暂时用不到的 MCP 服务器,把过长的 CLAUDE.md 删减一下。
  4. 如果关了自动压缩(auto-compact),在 /config 里打开。

如果模型明明是 1M 窗口,却在 200K 左右就报这个错,尤其是你用了网关或自定义模型 ID,那多半是 Claude Code 不认识这个模型 ID。最后一节讲怎么改。

报错长什么样

Claude Code 错误说明 里列了几种形式。交互式会话里一般显示:

text
Context limit reached · /compact or /clear to continue

在 -p 输出和会话记录里,是不带后缀的原文:

text
Prompt is too long

更长的几种写法会说明原因:

提示 意思
Context limit reached · /compact or /clear to continue · auto-compact is off · /config to turn it on 你在用户设置里关掉了自动压缩
Prompt is too long · automatic compaction failed: <the underlying error> Claude Code 试过自动压缩,但碰到了别的错误,比如模型不可用或鉴权失败
Prompt is too long · this conversation is a single exchange and cannot be compacted — ... 没有更早的对话可以压缩;单条提示加上 Claude Code 随请求发送的内容就占满了窗口
Input is too long for requested model. Amazon Bedrock 对同一情况的报错写法

底层是 Claude API 的报错:按 Anthropic 上下文窗口文档 的说法,输入本身超过模型上下文窗口时,API 返回 400 invalid_request_error("prompt is too long")。

窗口有多大

按 Anthropic 上下文窗口文档,Claude Fable 5.1、Opus 5.5、Sonnet 5.5、Haiku 5.5、Opus 5、Sonnet 5、Opus 4.8、Sonnet 4.6 等当前模型都是 1M token 的上下文窗口;Claude Haiku 4.5、Sonnet 4.5 等其他模型是 200K。

自动压缩默认开启,一般会在窗口占满之前就把对话压缩掉,所以碰到这个报错,通常是下面几种原因之一:

  • 自动压缩被关掉了。
  • 单条提示或附件太大,比如贴了一大段日志,或者附了一个大文件。
  • 固定开销太大:MCP 服务器多、CLAUDE.md 很长、工具很多。
  • 自动压缩本身因为别的错误失败了。
  • Claude Code 以为窗口比模型实际的小。

怎么解决

先腾出空间。

  • /compact:把前面的对话压缩成摘要,接着用。可以指定保留什么,比如 /compact focus on the auth bug fix。
  • /clear:开一个新对话。如果 /compact 回复 Not enough messages to compact.,说明整个对话只有一轮,没有更早的内容可压缩,这时就用 /clear。

看清窗口被什么占了。 运行 /context,会按系统提示词、工具、记忆文件、消息分别列出占用。

减少固定开销。

  • 对这次会话用不到的 MCP 服务器,运行 /mcp disable <name>,它们的工具定义就会从上下文里移除。
  • 删减过长的 CLAUDE.md,或者把说明拆成按路径加载的规则,只在相关时才加载(见 记忆文档)。
  • 如果是单轮对话就报错,少贴一些文字、换小一点的附件再发。

保持自动压缩开启。 如果你在 /config 里或用 DISABLE_AUTO_COMPACT 关掉了它,重新打开。如果坚持关着,就在窗口占满前自己运行 /compact。也可以用 /autocompact 让它更早触发,比如 /autocompact 500k。

先解决底层错误。 如果提示里有 automatic compaction failed:,在把那个错误解决之前,/compact 也会因为同样的错误失败。比如是鉴权错误,就要先换一个能用的 Key,而不是缩短对话。

用网关或自定义模型 ID 时卡在 200K

Claude Code 要知道模型的上下文窗口,才能决定什么时候压缩。它不认识的模型 ID,一律按 200K 处理,启动时会给出类似这样的警告(见 模型配置文档):

text
⚠ Model "my-gateway-opus" isn't recognized · context assumed to be 200k tokens · ...

如果模型实际窗口就是 200K,不用改。否则按情况选一种:

  • 模型比你的 Claude Code 版本新:运行 claude update。
  • 网关给 Claude Code 认识的模型起了别的名字:在设置里用 modelOverrides 做映射,比如 "claude-opus-4-8": "my-gateway-opus"。
  • 模型是 1M 窗口:在模型 ID 后面加 [1m],比如 claude --model 'my-gateway-opus[1m]'。
  • 其他窗口大小:在启动 Claude Code 的环境里设置 CLAUDE_CODE_MAX_CONTEXT_TOKENS,比如 CLAUDE_CODE_MAX_CONTEXT_TOKENS=400000。它对哪些 ID 生效,先看一下文档。

通过 TeamoRouter 使用 Claude Code

TeamoRouter 是一个 API 网关,一个 Key 可以调 Claude、GPT、Gemini、DeepSeek。Claude 走原生 Anthropic 协议(/v1/messages),Claude Code 只需要一个 Base URL 和一个 Key。没有订阅,按用量付费,最低充值 $5。

  1. 在 TeamoRouter 控制台 创建 API Key,Key 以 sk-teamo- 开头。
  2. 充值,最低 $5。 充值弹窗支持银行卡;也可以点 「USDT支付」,用 USDT、USDC 或 ETH,从币安、OKX 等交易所 App 转账——收银台会按金额显示可用网络(BEP20 从 $5 起就能用),不用装钱包插件。步骤见 用 USDT 充值。
  3. 设置两个环境变量(macOS / Linux):
bash
export ANTHROPIC_BASE_URL=https://api.teamorouter.com
export ANTHROPIC_AUTH_TOKEN="你的 TeamoRouter API Key"
claude

Base URL 后面不要加 /v1。可用的模型 ID 用 GET /v1/models 查。如果启动时出现 isn't recognized · context assumed to be 200k tokens 警告,先运行 claude update,再按上一节处理。Windows 命令和模型设置见 安装与配置 Claude Code。

常见问题

/compact 会丢掉我的工作吗? 它会把前面的对话换成摘要。按 Claude Code 文档,压缩后系统提示词、CLAUDE.md、记忆、技能说明和 MCP 工具都会自动重新加载,最近修改过的文件也会重新读取。较早对话里的细节可能会丢,所以可以用 /compact <重点> 说明要保留什么。

为什么新会话第一条消息就报错? 这就是单轮对话的情况:一条提示加上系统提示词、工具定义和附件,已经占满了窗口。去掉附件或 MCP 服务器,再发一次。

换个模型有用吗? 只有换到上下文窗口更大的模型才有用。压缩时,Claude Code 也不会退回到窗口更小的备用模型。

这和用量上限是一回事吗? 不是。用量上限看的是一段时间内用了多少;Prompt is too long 看的是单次请求有多大。

延伸阅读

准备好接入了吗?登录控制台 · 购买额度 · 创建 API Key,三步即可开始。