速率限制
Shisa 服务会应用速率限制和配额,以保持平台对所有人都快速且公平。本指南解释当你触及限制时会发生什么,以及如何优雅地处理它。
限制与配额
请求会受到两种节流的约束:
- 速率限制对你在给定时间窗口内可发送的请求数量(以及吞吐量)设定上限。
- 配额是你的可用余额——新账户从 $10 的免费额度开始,高级套餐会增加付费余额和更高的限制。
适用于你账户的确切限制取决于你的套餐。请在 Shisa 平台 中查看你当前的限制和用量;如需更高的限制,请升级套餐或从平台联系销售。
备注
速率限制按账户应用于共享 https://api.shisa.ai 主机的所有服务。LLM、ASR、TTS 和翻译流量同时突发时,会动用同一账户级别的预算。
当你超出限制时
当你超出速率限制时,API 会以 HTTP 状态码 429(rate limit exceeded)响应。处理 429 的正确方式是等待并重试,而不是立即重新发送请求,因为那只会增加负载。
请使用指数退避:先等待一小段延迟,然后在每次后续重试时将其加倍,直到达到最大尝试次数。加入少量随机抖动可以避免许多客户端同步重试。
Python
import time
import random
import requests
def post_with_backoff(url, headers, json, max_retries=5):
delay = 1.0 # seconds
for attempt in range(max_retries):
response = requests.post(url, headers=headers, json=json)
if response.status_code != 429:
return response
# Rate limited — back off before retrying
sleep_for = delay + random.uniform(0, 0.5)
time.sleep(sleep_for)
delay *= 2
raise RuntimeError("Rate limit not cleared after retries")
JavaScript
async function postWithBackoff(url, options, maxRetries = 5) {
let delay = 1000; // milliseconds
for (let attempt = 0; attempt < maxRetries; attempt++) {
const response = await fetch(url, { ...options, method: 'POST' });
if (response.status !== 429) {
return response;
}
// Rate limited — back off before retrying
const jitter = Math.random() * 500;
await new Promise((resolve) => setTimeout(resolve, delay + jitter));
delay *= 2;
}
throw new Error('Rate limit not cleared after retries');
}
提示
在客户端中一次性构建退避逻辑,并在每次 Shisa 调用中复用它。如果你为 Shisa LLM 使用 OpenAI SDK,它们已经会自动以退避方式重试 429 响应。
减少触及限制的频率
- 尽可能批量处理,而不是在紧密的循环中发送大量微小的请求。
- 缓存在请求之间不会变化的响应。
- 错开后台任务,使它们不会在同一瞬间全部触发。
- 在 平台 中监控用量,并在发布之前(而非发布期间)请求更高的限制。