Claude Code 明明还有额度,却一直报 `Rate limit reached`?根因可能不是额度,而是 `sonnet[1m]`
最近我在排查一个很迷惑的问题:
- 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 再整理成一篇排障图谱。
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐



所有评论(0)