Skip to content

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 分钟内推理仍未开始,服务器关闭连接。

这意味着客户端需要:

  1. 将连接超时设置为 ≥ 10 分钟
  2. 处理流式响应中的空行

推荐应对策略

指数退避重试

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 限速对比

DeepSeekOpenAI
限速类型动态并发固定 RPM + TPM
公开数值❌ 不公开✅ 在 dashboard 查看
触发行为排队等待或 429直接 429
最长等待10 分钟立即失败

常见问题

Q: 怎么知道自己的并发上限是多少?

A: DeepSeek 目前不公开具体数值。生产环境建议从低并发(5-10)开始,逐步压测找到实际瓶颈。

Q: 流量波峰怎么平滑处理?

A: 使用请求队列(如 bottleneckp-limit)限制并发数,在系统层面削峰填谷,避免瞬时流量触发 429。

Q: 429 和 503 的区别是什么?

A: 429 是你的请求速率超限,减慢请求频率即可解决;503 是 DeepSeek 服务端本身负载过高,与你的请求频率无关,等待服务恢复即可。