AI API 返回的 429 响应可能意味着四种不同的情况:每分钟请求数过多、每分钟 Token 数过多、并发连接数过多,或账户余额耗尽。这四种情况返回的状态码相同,因此解决问题的关键在于诊断你实际触及了哪种限制,而不是盲目重试。本指南分析了各种故障模式,说明了当前限制条件下可获取(及不可获取)的证据,并提供了一套适用于生产环境的重试与回退模式。
核心要点
429可能意味着触及了请求上限、Token 配额、并发限制或账户余额耗尽。每种情况都需要不同的解决方案,盲目重试只能解决其中一种。- 应在成功响应时读取速率限制标头(headers),而不仅仅是在报错后读取,并在接近上限前进行限流。
- 客户端的 Token 计数只是估算值,而非保证值。你的库与提供商实际计数方式之间的分词器(tokenizer)差异,可能导致安全余量比你预想的更窄。
- 本文所引用的证据中并未发布各模型和层级的具体 RPM/TPM 上限。你在其他地方看到的任何数字都应与你自己的账户仪表板进行核对,而不是将其视为固定常数。
- 稳健的重试机制需要指数退避(exponential backoff)、抖动(jitter)、最大重试次数,并遵循
retry-after标头。切勿盲目重试非幂等(non-idempotent)操作。
理解 AI API 速率限制:四种故障模式
请求限制
大多数提供商会统计每分钟请求数(RPM)。超过此限制会立即收到 429 响应,通常响应体为空。用户快速翻页浏览结果,或 cron 任务在没有限流的情况下触发,是常见的触发原因。
Token 限制
这是团队最容易低估的陷阱。提供商通常会将每分钟 Token 数(TPM)与 RPM 分开执行,因此即使你的请求数远低于上限,也可能触及 429。大上下文模型使情况变得更糟:根据 TokenLab 的实时定价证据(观察于 2026-07-07),Claude Opus 4.8 和 GPT-5.5 都支持约 1,000,000+ 的上下文 Token。在一次请求中加载大型文档、完整代码库或长聊天记录,即便这只是“一个”请求,也可能消耗掉你每分钟 Token 配额的很大一部分。这是一种基于上下文窗口大小的容量规划风险,而非按单次调用计算的 Token 数,因此请根据你自己的日志验证实际用量,而不是假设一个固定数字。
并发限制
提供商可能会容忍你的平均每分钟流量,直到你同时打开五十个流。并发限制会限制同时进行的请求或连接数。流式响应会使连接保持开启的时间更长,这比短促的单次调用更快耗尽并发槽位。基于 Claude Sonnet 5 或 Kimi K2.7 Code 构建的编码智能体,以及从 Gemini 3.5 Flash 流式传输的语音接口,都是常见的触发原因,因为它们同时保持了许多长连接。
配额或余额耗尽
这在你的仪表板中看起来与速率限制完全一样:调用停止工作。但解决方法不同。如果你的账户预付额度用完或触及了硬性每日消费上限,API 返回的错误看起来就像速率限制。在这种情况下,退避机制毫无作用。你需要充值余额或提高消费阈值。
数据源快照
| 数据点 | 来源 | 观察时间 |
|---|---|---|
| 模型上下文窗口和每 Token 定价 | TokenLab 实时模型/定价证据 | 2026-07-07 |
| 模型 SSOT 命名(Claude Sonnet 5, GPT-5.5, Gemini 3.5 Flash 等) | TokenLab 模型 SSOT | 2026-07-07,2026-07-14 过期 |
| 官方提供商 RPM/TPM 层级限制 | 本证据集中不可用 | 未验证,请查看提供商账户仪表板 |
| TokenLab 网关标头标准化行为 | 本证据集中不可用 | 在依赖单一标头模式前,请查阅 TokenLab API 文档 |
当前模型上下文窗口和定价(TokenLab 实时证据)
这些数据直接来自 TokenLab 实时定价快照。它们不是 RPM 或 TPM 限制,而是展示了为什么大上下文模型上的单次调用会不成比例地消耗 Token 配额。
| 模型 | 提供商 | 上下文窗口 | 输入 $/MTok | 输出 $/MTok | 来源 | 观察时间 |
|---|---|---|---|---|---|---|
| Claude Sonnet 5 | Anthropic | 1,000,000 | $2.00 | $10.00 | TokenLab 实时定价证据 | 2026-07-07 |
| Claude Opus 4.8 | Anthropic | 1,000,000 | $5.00 | $25.00 | TokenLab 实时定价证据 | 2026-07-07 |
| Claude Fable 5 | Anthropic | 1,000,000 | $10.00 | $50.00 | TokenLab 实时定价证据 | 2026-07-07 |
| GPT-5.5 | OpenAI | 1,050,000 | $5.00 | $30.00 | TokenLab 实时定价证据 | 2026-07-07 |
| GPT-5.5 Batch/Flex | OpenAI | 1,050,000 | $2.50 | $15.00 | TokenLab 实时定价证据 | 2026-07-07 |
| Gemini 3.5 Flash | 1,048,576 | $1.50 | $9.00 | TokenLab 实时定价证据 | 2026-07-07 | |
| GLM-5.2 | Z.ai | 1,048,576 | $0.93 | $3.00 | TokenLab 实时定价证据 | 2026-07-07 |
| Kimi K2.7 Code | Moonshot AI | 262,144 | $0.74 | $3.50 | TokenLab 实时定价证据 | 2026-07-07 |
| DeepSeek V4 Pro | DeepSeek | 1,048,576 | $0.44 | $0.87 | TokenLab 实时定价证据 | 2026-07-07 |
| DeepSeek V4 Flash | DeepSeek | 1,048,576 | $0.09 | $0.18 | TokenLab 实时定价证据 | 2026-07-07 |
| Qwen3.7 Plus | Alibaba | 1,000,000 | $0.32 | $1.28 | TokenLab 实时定价证据 | 2026-07-07 |
| MiniMax M3 | MiniMax | 1,048,576 | $0.30 | $1.20 | TokenLab 实时定价证据 | 2026-07-07 |
模型 SSOT 说明:这些名称反映了 2026-07-07 观察到的 TokenLab 模型 SSOT,于 2026-07-14 过期。命名和可用性变化频繁。在将模型字符串硬编码到生产代码之前,请确认它在 TokenLab 模型目录 或 模型排行榜 中仍然有效。
无需从零构建重试逻辑即可修复速率限制故障
以上所有内容都是诊断。补救工作——决定回退到哪个模型、跟踪每个用户的并发情况、实时掌握哪些模型系列处于健康状态——正是 TokenLab 路由层旨在解决的问题。你无需在五个提供商之间手动构建回退矩阵,只需将请求指向 TokenLab,让网关根据可用性和你的回退规则在 当前模型目录 中进行选择。
一个诚实的告诫:TokenLab 位于多个上游提供商之前,每个上游提供商都会返回其自己的标头集、错误格式和重试语义。网关是否完全将每个速率限制标头标准化为一种一致的模式,还是将某些上游标头原样传递,在本文可用的证据中尚未得到证实。在编写假设所有模型具有统一模式的解析逻辑之前,请在 TokenLab 的 API 文档中验证当前的标头行为。编写标头解析器时要采取防御性策略,检查每个字段是否存在,而不是假设它一定存在。
读取速率限制标头
提供商在响应标头中返回速率限制信息,尽管确切名称因提供商而异。常见的模式如下:
x-ratelimit-limit-requests: 500
x-ratelimit-remaining-requests: 499
x-ratelimit-reset-requests: 12s
retry-after: 0
请在成功响应时读取这些信息,而不仅仅是在 429 之后。保持对剩余配额的滚动计数,并在低于安全阈值(通常为 10-20% 的余量)时减慢速度,尽管具体的数字取决于你的流量突发性,本证据集无法为你指定。
带有显式错误处理的重试逻辑
重试辅助函数需要处理的不仅仅是 429 情况。它应该区分瞬态错误(429、503、超时)和永远不会通过重试成功的客户端错误(除 429 之外的 4xx),并且在存在 retry-after 时应予以尊重。
async function callWithRetry(fn, maxRetries = 4) {
for (let attempt = 0; attempt <= maxRetries; attempt++) {
try {
return await fn();
} catch (err) {
const status = err.status;
// 除 429 外的客户端错误重试不会成功
if (status && status >= 400 && status < 500 && status !== 429) {
throw err;
}
// 无论错误类型如何,达到最大重试次数后放弃
if (attempt === maxRetries) throw err;
// 429:如果存在 retry-after 则遵循,否则使用带抖动的退避
if (status === 429) {
const retryAfter = parseRetryAfterHeader(err);
const delay = retryAfter
? retryAfter * 1000
: Math.pow(2, attempt) * 1000 + Math.random() * 1000;
await sleep(delay);
continue;
}
// 503 或网络超时:退避并重试,记录以供观察
if (status === 503 || err.code === 'ETIMEDOUT' || err.code === 'ECONNRESET') {
await sleep(Math.pow(2, attempt) * 1000 + Math.random() * 1000);
continue;
}
// 未知 5xx:带退避重试,严格限制尝试次数
if (status && status >= 500) {
await sleep(Math.pow(2, attempt) * 1000 + Math.random() * 1000);
continue;
}
throw err;
}
}
}
切勿在简单的重试循环中包装非幂等操作,例如支付扣款或具有副作用的写入操作。在重试这些调用之前,请确认幂等性或使用幂等键。
Token 估算准确性:为什么本地计数与提供商计数存在偏差
客户端 Token 计数库是对给定模型实际使用的分词器的近似。tiktoken 与 OpenAI 的系列非常匹配,但不能保证与 Anthropic、Google 或开源权重分词器完全匹配。差异出现在特殊 Token、多字节字符和系统提示词格式周围,并且在长对话中会累积。
减少偏差的实用步骤:
- 读取响应体中返回的实际 Token 用量(大多数提供商包含提示词和补全 Token 计数),并利用它随时间校准你的本地估算器。
- 保持安全余量,而不是硬边界。如果提供商的 TPM 上限接近你的估算用量,请延迟或拆分请求,而不是在边缘发送。
- 如果你的提示词在调用中很大或重复,请参阅 TokenLab 关于分词行为和提示词拆分策略的覆盖范围,以获取在触及上限前减少每请求 Token 数的具体方法。减少单次调用 Token 数通常比协商更高层级更划算。
流量整形与模型回退
带抖动的指数退避。每次重试后等待时间加倍,并添加随机抖动,以防止并发客户端同步重试。
按用户或任务进行流量整形。限制每个用户的并发调用(例如,3 个并发,每秒 5 个请求的突发),这样单个重度用户就不会耗尽你的账户级限制并降低其他人的体验。
发送前的 Token 配额估算。在客户端计算 Token,如果请求会使你超过跟踪的 TPM 配额,请延迟或拆分它,而不是发送并祈祷。
模型回退作为安全网。当主模型返回 429 时,路由到具有独立限制和相当能力的备选模型。编码任务可以从 Claude Sonnet 5 回退到 DeepSeek V4 Pro 或 Kimi K2.7 Code。大流量、低成本的工作负载可以在 DeepSeek V4 Flash、Gemini 3.5 Flash 和 Qwen3.7 Plus 之间回退,它们都位于当前模型目录的低成本路由层中。
速率限制处理检查清单
| 类别 | 检查内容 | 立即行动 | 长期修复 |
|---|---|---|---|
| 请求限制 | RPM 标头值,突发频率 | 限流客户端请求,添加本地速率限制器 | 按用户分层,服务端排队 |
| Token 限制 | 各模型 TPM 配额,平均单次调用 Token 数,响应报告的用量 | 预先计算 Token,拆分大型提示词,在接近上限时延迟调用 | 带 Token 配额的批处理,将大流量工作路由至低成本模型 |
| 并发限制 | 最大同时流或连接数 | 限制每个客户端的并发请求,关闭空闲流 | 连接池,错开流启动时间 |
| 配额 / 余额 | 账户余额,每日消费上限 | 充值额度,调整消费阈值 | 低余额提醒,预付自动充值 |
典型限制范围:我们能确认和不能确认的内容
针对此主题的二次搜索通常需要一张“典型”RPM/TPM 数字表。我们不会编造。已发布的各层级限制变化频繁,因账户历史和使用层级而异,且不是本文可用证据的一部分。
| 问题 | 状态 | 验证步骤 |
|---|---|---|
| 前沿模型的“典型”RPM 限制是多少? | 本证据集中未确认 | 直接检查你的提供商账户仪表板或速率限制响应标头 |
| 1M 上下文模型的“典型”TPM 限制是多少? | 本证据集中未确认 | 记录一周流量中响应标头的实际用量以建立你自己的基准 |
| 使用层级会改变这些数字吗? | 基于一般提供商行为是合理的,此处未进行基准测试 | 在你的提供商控制台中确认当前层级限制 |
| TokenLab 的聚合限制是否与上游提供商限制完全匹配? | 本证据集中未确认 | 在容量规划前查阅 TokenLab 的 API 文档 |
限制
- 对于 GPT-5.5、Claude Opus 4.8、Gemini 3.5 Flash 或此处引用的任何其他模型,均无官方 RPM/TPM 数据。定价表中的每个数字都是上下文窗口大小和每 Token 成本,而非速率限制。
- TokenLab 的网关是否完全统一了所有上游提供商的速率限制标头,还是将某些标头原样传递,在本文证据集中未得到确认。在文档中验证当前网关行为之前,请将标头解析视为特定于提供商的。
- 本文中的模型名称反映了 2026-07-07 观察到的 TokenLab 模型 SSOT,于 2026-07-14 过期。在发布硬编码模型字符串的代码之前,请在 模型目录 中确认当前可用性。
- 本证据集未对 Token 估算准确性与提供商端计数进行基准测试。请根据响应报告的用量校准你自己的估算器,而不是信任固定的偏移量。
常见问题解答
为什么我的应用即使在请求数低于限制时也会收到 429 错误? 首先检查每分钟 Token (TPM) 配额。单个大型提示词可能会耗尽 Token 配额,而请求数却保持在低位。还要检查并发:即使 RPM 和 TPM 看起来都正常,开启的流式连接也可能阻塞新请求。
收到 429 时我应该立即重试吗?
不应该。等待 retry-after 中指定的时间,如果该标头不存在,则使用带抖动的指数退避。立即重试可能会导致“惊群效应”(thundering-herd effect),并可能延长你的锁定窗口。
我怎么知道我的本地 Token 计数是否与提供商实际向我收费的计数匹配? 你无法准确知道。客户端分词器是近似值。读取每个响应体中返回的 Token 用量,并利用它随时间校准你的估算器,保持安全余量,而不是在估算的上限处发送请求。
TokenLab 是否在所有模型中暴露了一套统一的速率限制标头? 此处提供的证据中未确认。不同的上游提供商返回不同的标头格式,TokenLab 应用了多少标准化,需要查阅当前的 API 文档,而不是假设。
如何在不升级套餐的情况下避免速率限制? 结合 Token 配额管理、本地并发限制和模型回退。在发送前估算 Token,拆分长提示词,并在触及主限制时路由到备选模型,例如从 Claude Sonnet 5 路由到 DeepSeek V4 Pro。
开始使用
速率限制是构建 AI API 的事实,但它们不必导致服务中断。TokenLab 的网关让你能够访问 当前模型目录 和 实时定价与吞吐量数据,这样你就可以绕过限制进行路由,而不是盲目猜测。如果你也在评估聚合器的权衡,OpenRouter 比较 更深入地涵盖了回退行为和运营开销。在 tokenlab.sh 获取你的 API 密钥,构建一次重试与回退逻辑,而无需为每个提供商重复构建。
来源
价格观测于 2026-07-07
- TokenLab model directory观测于 2026-07-07



