Appearance
DeepSeek API 的限速基于动态并发控制,不公开固定 RPM/TPM 数值。触发限速时返回 HTTP 429,服务器在高负载时会保持连接并持续发送空行(非流式)或 keep-alive 注释(流式),最长等待 10 分钟。本文提供生产环境推荐的限速应对方案。
DeepSeek API 限速
限速机制
DeepSeek API 采用动态并发限制,根据当前服务器负载实时调整,没有公开的固定 RPM(每分钟请求数)或 TPM(每分钟 token 数)数值。
触发限速时,API 返回 HTTP 429。
请求排队行为
当服务器繁忙时,DeepSeek 不会立即返回 429,而是:
- 非流式请求:服务器持续发送空行(空 HTTP body chunks),保持连接
- 流式请求:服务器发送 keep-alive 注释行,保持连接
超时规则: 请求最长等待 10 分钟。如果 10 分钟内推理仍未开始,服务器关闭连接。
这意味着客户端需要:
- 将连接超时设置为 ≥ 10 分钟
- 处理流式响应中的空行
推荐应对策略
指数退避重试
typescript
async function callWithRetry<T>(
fn: () => Promise<T>,
maxRetries = 5,
): Promise<T> {
for (let attempt = 0; attempt < maxRetries; attempt++) {
try {
return await fn();
} catch (error: any) {
if (error.status === 429 && attempt < maxRetries - 1) {
const delay = Math.pow(2, attempt) * 1000; // 1s, 2s, 4s, 8s, 16s
console.warn(`限速,${delay}ms 后重试(第 ${attempt + 1} 次)`);
await new Promise((resolve) => setTimeout(resolve, delay));
continue;
}
throw error;
}
}
throw new Error("超出最大重试次数");
}
// 使用
const response = await callWithRetry(() =>
client.chat.completions.create({ model: "deepseek-v4-pro", messages })
);并发控制(批量处理场景)
typescript
import pLimit from "p-limit";
const limit = pLimit(5); // 最多同时 5 个并发请求
const tasks = items.map((item) =>
limit(() => processItem(item))
);
const results = await Promise.all(tasks);长超时配置
typescript
const client = new OpenAI({
baseURL: "https://api.deepseek.com",
apiKey: process.env.DEEPSEEK_API_KEY,
timeout: 10 * 60 * 1000, // 10 分钟,与服务器超时对齐
});与 OpenAI 限速对比
| DeepSeek | OpenAI | |
|---|---|---|
| 限速类型 | 动态并发 | 固定 RPM + TPM |
| 公开数值 | ❌ 不公开 | ✅ 在 dashboard 查看 |
| 触发行为 | 排队等待或 429 | 直接 429 |
| 最长等待 | 10 分钟 | 立即失败 |
常见问题
Q: 怎么知道自己的并发上限是多少?
A: DeepSeek 目前不公开具体数值。生产环境建议从低并发(5-10)开始,逐步压测找到实际瓶颈。
Q: 流量波峰怎么平滑处理?
A: 使用请求队列(如 bottleneck 或 p-limit)限制并发数,在系统层面削峰填谷,避免瞬时流量触发 429。
Q: 429 和 503 的区别是什么?
A: 429 是你的请求速率超限,减慢请求频率即可解决;503 是 DeepSeek 服务端本身负载过高,与你的请求频率无关,等待服务恢复即可。