设置

语言

AI API 速率限制:工作原理及应对策略

T
TokenLab
·2026年2月26日·约 10 分钟阅读·更新 2026年7月14日·1950 次浏览
#速率限制#生产环境#错误处理#教程#最佳实践
AI API 速率限制:工作原理及应对策略

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 Google 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 情况。它应该区分瞬态错误(429503、超时)和永远不会通过重试成功的客户端错误(除 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

分享:

公开模型最近更新

用本文涉及的模型开始构建

对比价格、测试路由,把文章里的调研直接变成可运行的 API 调用。