Grok API报429怎么办?RPS与TPM限制、退避重试和队列排查
从xAI团队与模型限额识别429,区分请求突发和Token预算,采用有上限的指数退避与队列控制,…
文章目录
脚本单次调用正常,批量运行却不断返回429,往往不是提示词写得不好,而是请求节奏或Token预算超过限制。本教程先核对团队与模型限额,再用有限重试和队列削峰,避免多个工作进程同时重发,把一次短暂限流放大成持续失败。
第一步:记录准确状态与目标模型
先确认HTTP状态真是429,记录时间、目标模型、团队、每秒请求量和最近输入规模。401、403、连接超时或服务端错误不能简单当成同一种限流。错误内容只保留必要类型,不把密钥、完整业务提示或请求头写进公开日志。
官方说明文本模型按团队、每模型约束RPS与TPM,在xAI Console的Models页查看当前个性化限额。文档数值和层级可能变化,本教程不硬编码可用请求数。额度余额、消费等级与速率上限是相关但不同维度,余额充足也不保证可以无限并发。
第二步:区分突发请求和Token预算
RPS限制每秒请求,不能把整分钟预算在同一秒用完。TPM统计实际消耗的提示、输出、推理及缓存提示Token,缓存虽然价格较低,也仍计入该限额。长上下文与长输出任务即使请求数量不多,也可能受Token预算限制。
语音接口还可能按并发会话而非同样Token维度限制,图像和视频也有各自规则。先找到自己使用的端点与模型,不把文本模型的限额照搬给语音合成或图片生成。混用多个应用但属于同一团队时,要一起看总负载。
第三步:用有限指数退避处理可重试429
先确认错误是可重试限流,再采用官方建议的指数退避。下面示例针对纯文本请求,最多总计四次尝试,在429之间增加等待并加入少量随机抖动;不是所有失败都重试,也不承诺一个重试循环能解决长期超过上限的问题。
import os
import time
import random
import requests
def ask_with_backoff(prompt):
for attempt in range(4):
response = requests.post(
"https://api.x.ai/v1/chat/completions",
headers={"Authorization": "Bearer " + os.environ["XAI_API_KEY"]},
json={"model": "grok-4.7",
"messages": [{"role": "user", "content": prompt}]},
timeout=120,
)
if response.status_code != 429:
response.raise_for_status()
return response.json()
if attempt == 3:
response.raise_for_status()
time.sleep(2 ** attempt + random.uniform(0, 0.5))
raise RuntimeError("未得到结果")
# 有API权限与额度时才手动调用;本示例不自动执行请求。
这段函数不会自动运行付费调用,只有你明确调用时才发请求。网络异常会直接上抛,不被当作429自动重放;正式应用若服务返回明确等待指示,也应按实际协议处理。不要在SDK自带重试外再无上限套循环,导致尝试次数难以控制。
第四步:把并发放进共享队列
退避只处理暂时波峰,持续过载需要减少并发、平滑发出请求或缩小不必要上下文。给任务稳定编号,记录排队、运行、成功与待重试状态,多个进程共享同一限额协调,而不是每个进程都按全部预算发满。
排查表:同一团队是否有其他应用同时调用;是否一秒启动全部任务;长文件是否重复附带;是否多个重试层叠加;失败任务是否重复入队;成功结果是否按任务ID保存。逐项核对实际日志,不以请求数少推断Token预算一定充足。
任务涉及外部写入工具时,要额外处理幂等与重复动作,不能因文本请求重试示例就默认所有工具可安全重放。停止或取消的任务也应从待重试队列移除,避免用户以为结束后仍继续消耗。
第五步:验证改善并申请合适容量
用一小批代表性任务比较调整前后的429比例、等待时间和成功数,检查每个任务只对应一份最终结果,不为测限额连续压满服务。确需更高容量时按控制台当前渠道申请,消费层级变化以官方规则为准,不把充值当成唯一解法。
完成标准是知道触发哪个维度、重试有边界、队列不会重复放大请求,失败也能保留可追踪状态。若长期超过需求容量,就先降低负载或安排运行窗口;不断换密钥和并行账号不能替代清楚的容量规划。
官方资料
资料核对日期:2026年10月27日。
本文地址:https://www.163264.com/18229
