最近我在排查一个很迷惑的问题:

  • Claude 网页版正常
  • `Usage` 页面显示当前周只用了 `46%`
  • `Sonnet only` 甚至还是 `0%`
  • 但 Claude Code CLI 一发请求就报:

API Error: Rate limit reached

一开始我也以为是 Anthropic 又收紧了额度,或者订阅认证出了问题。结果最后查下来,根因都不是。

真正的问题是:

**我的 Claude Code 默认模型被配置成了 `sonnet[1m]`,而不是普通 `sonnet`。**

在当前这条 Claude Code 订阅登录路径里,`sonnet[1m]` 会被服务端判定成 long-context request,然后直接返回:


429 rate_limit_error: Extra usage is required for long context requests.

CLI 把这条错误又包装成了笼统的 `Rate limit reached`,所以特别容易误判。

---

现象为什么很容易把人带偏

我这次的现场信息是这样的:

1. `claude auth status` 显示登录正常

2. `authMethod` 是 `claude.ai`

3. `subscriptionType` 是 `max`

4. 网页版对话完全正常

5. CLI 重启、重新登录、新开会话都没用

如果你只看这些信息,很容易得出两个错误结论:

  • 是 Anthropic 把 Max 用户额度突然砍了
  • 是 Claude Code 的登录状态坏了

但这两个都不对。

---

我是怎么定位到根因的

第一步:先排除认证问题

先确认 CLI 走的是订阅登录模式,而不是 API 模式:


claude auth status

我这里返回的是:


{

  "loggedIn": true,

  "authMethod": "claude.ai",

  "apiProvider": "firstParty",

  "subscriptionType": "max"

}

这一步说明:

  • 账号没掉
  • 套餐没失效
  • CLI 确实走的是官方 first-party 订阅路径

---

第二步:做最小复现,不要在大对话里猜

我用一条最短请求单独打了一次:


claude -p --output-format json "Reply with exactly OK."

结果还是直接失败,而且关键是:

  • `input_tokens = 0`
  • `output_tokens = 0`
  • `duration_api_ms = 0`

这说明它根本还没进正常推理阶段,就在入口被挡掉了。

---

第三步:打开 debug,抓真实错误

真正有用的是这条:


claude -p \

  --debug api \

  --debug-file /tmp/claude-debug.txt \

  --output-format json \

  "Reply with exactly OK."

然后查日志:


rg -n "rate_limit_error|Extra usage|required for long context" /tmp/claude-debug.txt

我实际抓到的是:


429 {"type":"error","error":{"type":"rate_limit_error","message":"Extra usage is required for long context requests."}}

到这一步,问题性质就变了:

  • 不是“本周额度真的没了”
  • 不是“普通 Sonnet 额度不够”
  • 而是“当前请求被判定成了 long-context request”

---

真正的坑:我以为自己配的是 `sonnet`,其实是 `sonnet[1m]`

我本机当时的 Claude Code 配置里,模型是:


{

  "model": "sonnet[1m]",

  "effortLevel": "auto"

}

注意这里的重点不是 `auto`,而是 `[1m]`。

很多人脑子里会默认把它理解成:

  • `sonnet` = 普通 Sonnet
  • `sonnet[1m]` = 只是上下文更大一点的 Sonnet

但在 Claude Code 里,这个理解并不安全。

**`[1m]` 不是一个“无副作用后缀”,它会把请求送进 long-context 路径。**

而你当前账号、当前产品路径、当前灰度权限,未必对这个路径开放。

---

为什么 `sonnet[1m]` 不行,但 `opus[1m]` 可能可以

这块是最容易误解的地方。

结论先说:

**API 支持 1M,不等于 Claude Code 订阅路径也同样支持。**

截至 `2026-03-30`,官方信息至少说明了三件事:

1. Claude API 文档里,`Opus 4.6` 和 `Sonnet 4.6` 都支持 `1M` context

文档:<https://support.claude.com/en/articles/8606395-how-large-is-the-claude-api-s-context-window>

2. 但 Claude Code FAQ 明确写了:`1M context` 在 Claude Code 里**还没有对所有用户普遍开放**,目前只对一部分 Max 20x 用户开放

文档:<https://support.claude.com/en/articles/12386420-claude-code-faq>

3. `Sonnet 4.6` 的 `1M context` 仍是 beta 状态

文档:<https://support.claude.com/en/articles/12138966-release-notes>

所以现实情况可能是:

  • `opus[1m]` 在某些账号/路径下可用
  • `sonnet[1m]` 在 API 里可用
  • 但 `sonnet[1m]` 在 **Claude Code + 订阅登录 + 当前账号 entitlement** 这条组合上不可用

这不是模型能力问题,而是**产品权限、灰度和计费路径**的问题。

---

最后验证:改成普通 `sonnet` 之后,立刻恢复

我最后做了一个最关键的对照实验:

失败配置


{

  "model": "sonnet[1m]",

  "effortLevel": "auto"

}

最短请求直接报:


Extra usage is required for long context requests.

成功配置


{

  "model": "sonnet",

  "effortLevel": "auto"

}

同样一条最短请求,立刻正常返回:


OK.

更关键的是,成功时日志里还能看到:

  • 请求依然会自动附加 skills
  • 但实际上下文只在正常 Sonnet 范围内
  • 不再被送进 long-context 限流路径

也就是说:

**这次真正导致 CLI 挂掉的,不是我 skills 太多,不是 auto,不是总额度,而是默认模型写成了 `sonnet[1m]`。**

---

正确修复方式

如果你也遇到“网页版正常、CLI 报 `Rate limit reached`、Usage 还没用完”的情况,建议按这个顺序排查。

1. 看认证状态


claude auth status

确认是不是:

  • `loggedIn: true`
  • `authMethod: claude.ai`
  • `subscriptionType: max/pro`

2. 看默认模型

检查:


cat ~/.claude/settings.json

如果你看到的是:


"model": "sonnet[1m]"

而你本来只是想用普通 Sonnet,那就改成:


"model": "sonnet"

3. 再做最小请求测试


claude -p --output-format json "Reply with exactly OK."

如果这条能通,说明主问题已经解掉了。

---

我最后保留的配置

我最后保留的是这组默认值:


{

  "model": "sonnet",

  "effortLevel": "auto",

  "forceLoginMethod": "claudeai"

}

这组配置的含义是:

  • 默认用普通 Sonnet,避免误入 long-context 路径
  • `auto` 保留一定弹性,不用每次手动切 effort
  • 强制走订阅登录模式,而不是误回 API 模式

---

这次排障给我的两个经验

经验 1:CLI 的 `Rate limit reached` 不一定真的是“额度没了”

Claude Code CLI 会把很多底层 429 都显示成同一句:


API Error: Rate limit reached

但它底下真正的原因可能完全不同,比如:

  • 周额度真的用完
  • 当前模型额度用完
  • long-context request 没权限
  • 容量/通道限流

所以一定要看 debug 日志,不要只看表面报错。

经验 2:不要把 `sonnet` 和 `sonnet[1m]` 当成同一个东西

从工程上看,它们不是“同一模型的轻微变体”,而是**不同请求路径**。

如果你只是想把 Claude Code 默认模型调成 Sonnet,写:


"model": "sonnet"

不要顺手保留 `[1m]`。

---

一句话总结

**如果 Claude Code 网页版正常、CLI 却一直报 `Rate limit reached`,而你的默认模型又是 `sonnet[1m]`,那优先怀疑的不是额度,而是 long-context entitlement。**

把默认模型改回普通 `sonnet`,很可能立刻恢复。

如果你也踩过这个坑,欢迎在评论区说说你遇到的是哪一种 429,我后面可以把 Claude Code 常见 429 再整理成一篇排障图谱。

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐