限流
限流分两层:平台层按 Key 限每秒请求数与并发数,模型层按模型限每分钟请求数与 token 数;每个响应都带三个头,随时告诉你还剩多少额度。
Praxis 的限流分两层:平台层按你的 Key 限每秒请求数和同时进行的请求数;模型层按模型限每分钟请求数(RPM)和每分钟 token 数(TPM)。每个响应——不论成功还是 429——都带三个 x-ratelimit-* 头,写明当前额度和重置时间,你不需要猜,也不需要为读额度多发请求。
两层限额
| 层 | 按什么计 | 限什么 | 超出的表现 |
|---|---|---|---|
| 平台层 | 你的 Key(没带凭证时按来源 IP) | 每秒请求数、同时进行的请求数 | 429 + retry-after,等待后重试 |
| 模型层 | 模型 × 租户 | 每分钟请求数(RPM)、每分钟 token 数(TPM)、月度预算 | 429,见下文模型层 |
两层的 429 都带同样的三个限流头;是哪一层触发的,看错误体的说明(错误)。
平台层:每秒请求数与并发数
默认每个 API Key 每秒最多 5 个请求,同时最多 4 个在途请求。流式请求在流结束前占用并发槽位。超过任一默认限额返回 429,响应带 ratelimit-limit、ratelimit-remaining、ratelimit-reset 和 retry-after;并发超限须等已有请求结束。
实际限额可能因账户而异;以响应头和并发错误详情为准。
三个响应头
x-ratelimit-limit-requests: 5
x-ratelimit-remaining-requests: 4
x-ratelimit-reset-requests: 850ms| 头 | 含义 |
|---|---|
x-ratelimit-limit-requests | 该凭证每秒的请求上限 |
x-ratelimit-remaining-requests | 本秒还剩多少个请求 |
x-ratelimit-reset-requests | 距离额度重置的时间:不满一秒写作 850ms,一秒及以上写作 1s |
同样的三个数也以 IETF 标准名 RateLimit-Limit / RateLimit-Remaining / RateLimit-Reset(整数秒)同时给出。以上 5 次/秒、4 个并发为默认限额;配置覆盖后的请求速率以响应头显示为准。
超出每秒上限
一秒内的第 N+1 个请求(N 为该 Key 的每秒上限)返回 429,并带 retry-after(整数秒,通常是 1)。被拒绝的请求不消耗额度:x-ratelimit-remaining-requests 保持 0,等窗口重置即可恢复。
超出并发上限
同时进行的请求(包括尚未结束的流式响应——流结束前一直占坑)超过该 Key 的并发上限时,多出的请求返回 429,retry-after 为 1。这种情况下仅等待秒级窗口重置不会释放并发槽位:须等一个进行中的请求结束。是并发还是每秒触发的,错误说明里写得很清楚("Concurrent request limit …" / "Requests per second limit …")。
错误体
错误体跟着地址第一段走(见错误)。/model/v1/chat/completions 等原生端点是 Problem Details:
{
"type": "https://deepraxis.ai/problems/rate_limit",
"title": "rate_limited",
"status": 429,
"detail": "Requests per second limit of 5 exceeded for this credential. Retry after the listed wait.",
"instance": "problem_eqfnxu",
"kind": "rate_limit",
"scope": "platform",
"retryable": true
}scope: "platform" 表示是平台层触发的(模型层限额的错误不带此字段或为 model)。/openai/v1/chat/completions 等厂商前缀按该家的错误格式,例如 OpenAI 兼容端点:
{ "error": { "code": 429, "type": "rate_limit_error", "message": "Requests per second limit of 5 exceeded for this credential. Retry after the listed wait." } }没带凭证的请求
公开端点(如 GET /model/v1/models)允许不带 Key 调用,这时按来源 IP 计入一个较小的匿名额度,响应头同样给出。带了 Key 就按 Key 计,与 IP 无关。
GET /meta/v1/health 不限流,探活监控可以任意频率调用。
模型层:每分钟请求数与 token 数
限额维度是模型 × 租户 × 分钟,不是 API Key:
- 每个模型在模型元数据里配置自己的 RPM(每分钟请求数)与 TPM(每分钟 token 数);未配置或为
0表示不限制。 - 命中任一限额返回
429,type为rate_limit_error,Retry-After: 60,problem.details.rateLimit给出当前值与限额。 - BYOK 调用自带供应商凭证,不占平台模型限额。
- 上游供应商限流由平台自动 failover 到其他供应商;全部供应商不可用时按返回的
429处理。
模型另有月度预算:按模型当月累计收入计,超出返回 429,type 为 budget_error(QUOTA_EXHAUSTED),无 Retry-After——等待无效,需要提升该模型的预算。