错误、速率限制与可靠性
生产代码与一个网络服务通信,因此它必须预期失败。在这里多一点结构,就是脆弱的集成与可靠的集成之间的区别。
错误对照表
你将要处理的典型 HTTP 状态:
| 状态 | 含义 | 应对方式 |
|---|---|---|
| 400 | 无效请求 | 修正负载;不要原样重试 |
| 401 | API 密钥错误/缺失 | 检查凭据 |
| 403 | 无权限 | 检查访问权限 |
| 429 | 触发速率限制 | 退避并重试(遵守 retry-after) |
| 500/529 | 服务端错误 / 过载 | 带退避地重试 |
各 SDK 将这些以 类型化异常 的形式暴露出来,因此你可以干净地分支处理,而无需解析字符串。
带退避的重试
对于瞬时错误(429、5xx),使用 指数退避 + 抖动 进行重试,并设上限:
import time, random
for attempt in range(5):
try:
return client.messages.create(...)
except (RateLimitError, APIStatusError) as e:
if attempt == 4 or not should_retry(e):
raise
time.sleep(min(2 ** attempt + random.random(), 30))
(许多 SDK 会自动重试瞬时错误——在添加自己的重试逻辑之前,先了解你所用客户端的默认行为。)
速率限制
限制按账户/层级(每分钟的请求数和 token 数)施加。当你触发某个限制时,会收到带有时间提示的 429。应对策略:遵守 retry-after、平滑突发流量、对离线工作进行 批处理,并在高并发步骤上使用更便宜的模型(选择模型)。
模型迁移
模型 ID 带日期/版本,并会被弃用。为自己留好缓冲: