大模型 API 限流与重试最佳实践

在使用大模型 API 时,最常见也最头疼的问题莫过于“429 Too Many Requests”。无论是每分钟请求数(RPM)还是每秒令牌数(TPM)耗尽,如果没有合理的限流应对策略,你的应用就会在关键时刻掉链子。本文将拆解 API 限流背后的逻辑,并结合代码示例,分享一套生产可用的重试最佳实践。

## 理解限流:它为什么要拒绝你

API 限流是服务端为了保护基础设施、实现公平调度而设置的流量控制机制。常见的限流维度包括:

- **每分钟请求数(RPM)**:例如 500 次请求/分钟 - **每分钟令牌数(TPM)**:例如 100 万 tokens/分钟 - **并发连接数**:限制同时打开的 WebSocket 或 SSE 通道

当客户端超过阈值时,服务端会返回 `429` 状态码,并在响应头中带上 `Retry-After`(秒数)或 `X-RateLimit-Reset` 等提示。合理的客户端必须尊重这些信号,而不是无脑重试。

## 重试策略:别让重试变成“惊群”

### 1. 指数退避 + 随机抖动

最简单的重试是固定间隔,但这会加剧冲突。推荐使用“指数退避 + 随机抖动”:

``` backoff_time = min(base_delay * (2 ** attempt), max_delay) jitter = random.uniform(0, backoff_time * 0.5) sleep_time = backoff_time + jitter ```

这种组合让重试在时间上分散,避免多个客户端同时发起请求造成二次过载。

### 2. 尊重 `Retry-After` 头

如果响应里带有 `Retry-After`,应优先使用该值,它是服务端最准确的恢复指示。代码中可以这样处理:

```python def get_retry_after(response): retry_after = response.headers.get('Retry-After') if retry_after: try: return int(retry_after) except ValueError: pass return None ```

### 3. 使用成熟的退避库

手动实现退避逻辑容易出错,推荐 Python 的 `tenacity` 或 `backoff` 库。以下是基于 `backoff` 的健壮示例:

```python import backoff import requests import random

@backoff.on_exception( backoff.expo, # 指数退避 requests.exceptions.HTTPError, max_tries=5, # 最多重试5次 max_time=120, # 总重试时间不超过120秒 giveup=lambda e: e.response.status_code != 429 # 只在429时重试 ) def call_llm(url, payload, api_key): headers = {"Authorization": f"Bearer {api_key}"} response = requests.post(url, json=payload, headers=headers) if response.status_code == 429: # 如果存在 Retry-After,将其作为退避的“特殊”处理 # 这里简单抛出,让 backoff 自动等待 raise requests.exceptions.HTTPError(response=response) response.raise_for_status() return response.json() ```

`backoff.expo` 默认的退避因子是 2,并自动加入随机抖动,无需自己计算。若需要完全遵循服务端的 `Retry-After`,可以自定义 `factor` 或结合 `wait_gen`。

### 4. 客户端侧预限流

除了被动重试,还应在客户端实现速率控制。可以使用令牌桶(Token Bucket)或信号量,预先限制发出的请求速率,从源头减少 429 的发生。

### 5. 熔断与降级

当重试次数过多或时间内一直命中 429,应该触发熔断,暂停请求并快速失败,返回缓存数据或备用回复,避免雪崩。可以加入 gRPC 拦截器或 API 网关层统一处理。

## 一次配置,多模型无忧

虽然我们可以花大量时间针对每个模型 API 调优重试策略,但如果你同时接入了 DeepSeek、Qwen、Claude、Gemini 等多种模型,维护各自的限流逻辑会让代码变得臃肿。此时一个统一的中转站能极大减轻负担。

**TokenPocket API 中转站** (https://tokenpocket.site) 正是为此而生。它支持 DeepSeek、Qwen、Claude、Gemini 等主流模型的统一调用,全系按量计费,无需规划复杂的各厂商限流规则,新用户注册即送免费额度。你只需一个 token,一个 endpoint,就能用完全相同的调用风格访问所有模型,内部已优化好重试与容错,把你的精力留给业务创新。

Read more

AI 编程助手配置指南:Cursor/Cline 接入教程

AI 编程助手已经成为日常开发的高频工具,Cursor 和 Cline 是其中关注度很高的两款。默认情况下,它们可以接入官方模型服务,但如果你想使用 DeepSeek、Qwen、Claude、Gemini 等模型,或者希望统一按量计费、用 USDT 支付,自定义 API 中转站会是一个更灵活的选择。下面介绍如何把 Cursor 和 Cline 接入兼容 OpenAI 格式的 API 服务。 ## 一、Cursor 接入自定义 API 打开 Cursor,进入 `Settings` → `Models`,找到 `OpenAI API Key` 区域。关键操作是开启 `Override OpenAI Base URL`,然后填写中转站地址和密钥。

By 罗本

波场免费转账科普:USDD 是什么?和 USDT 有什么区别?怎么免 TRX 转?

在波场(TRON)生态里,提到转账,很多人第一反应是:需要 TRX 做手续费。但如果你经常转 USDT 或 USDD,会发现现在有更省钱的路径——甚至可以实现“0 TRX”免费转账。今天就来讲清楚 USDD 与 USDT 的区别,以及免费转账的正确姿势。 ## 一、USDD 是什么? USDD 是波场生态推出的去中心化美元稳定币,由 TRON DAO Reserve 管理。它目标与美元 1:1 锚定,发行和稳定机制更依赖超额抵押资产和链上套利,而不是单纯由某一家中心化公司持有美元储备。 USDD 基于 TRC-20 标准发行,可以在波场钱包、DeFi、DEX 中自由流转。因为同为波场上的 TRC-20 资产,

By 罗本

如何为你的应用接入多模型 AI 能力

在 AI 应用开发中,单一模型很难同时满足成本、速度、推理能力和多语言等要求。接入多模型能力,不仅能根据任务动态调度,还能在主模型限流或故障时自动降级,提升整体可用性。 ## 一、多模型接入的常见架构 最轻量的方式不是分别对接每家厂商 SDK,而是选择一个兼容 OpenAI Chat Completions 协议的 API 网关或中转服务。这样业务代码只需维护一套请求格式,通过 `model` 参数切换不同模型,例如 DeepSeek、Qwen、Claude、Gemini。 ## 二、基础代码示例 以下使用 OpenAI Python SDK 封装一个多模型客户端: ```python import os from openai import OpenAI MODELS = { "deepseek": "deepseek-chat&

By 罗本

波场TRON转USDT为什么可以零手续费?原理详解

相信不少朋友在转移 USDT 时都会被“Gas 费”绊住脚:明明账户里有足额 USDT,却因为没有 TRX 而无法发起转账。这种尴尬在波场 TRON 网络上尤其常见,因为大部分用户以为 USDT 转账必须燃烧 TRX。但你是否见过一些钱包能实现 **零手续费** 转 USDT 甚至 USDD?背后并不是魔法,而是一套巧妙利用波场资源模型的方案。今天我们就来把这件事聊透。 ### 1. 波场的“资源”是怎么回事? 波场和以太坊不同,它不直接要求每笔交易都以特定代币支付手续费,而是设计了两种公共资源:**带宽(Bandwidth)** 和 **能量(Energy)**。 - **带宽**:一般用于普通 TRX 转账。每个账户每天有 1500 点免费带宽,足够完成一两笔简单的 TRX 转账。

By 罗本