محدودیتها دو دستهاند: محدودیت سرعت که جلوی فشار بیش از حد را میگیرد، و سقف هزینه که خودتان میگذارید تا یک اشکال در کد یا کلید لورفته اعتبارتان را خالی نکند.
مقدار واقعی محدودیتهای هر کلید را GET /me برمیگرداند؛ عددهای این صفحه پیشفرضاند.
محدودیت سرعت#
| محدودیت | پیشفرض | خطا |
|---|---|---|
| درخواست در دقیقه برای هر کلید (RPM) | ۶۰ | 429 rate_limit_exceeded |
| درخواست همزمان برای هر حساب | ۸ | 429 concurrency_limit |
| درخواست در دقیقه از هر IP (پیش از بررسی کلید) | ۶۰۰ | 429 rate_limit_exceeded |
| حجم بدنهٔ درخواست | ۲۰ مگابایت (فایل صوتی تا ۲۵ مگابایت) | 413 request_too_large |
| تعداد پیام در یک درخواست | ۵۰۰ | 400 too_many_messages |
| زمان انتظار برای پاسخ سرویسدهنده | حدود ۹۰ ثانیه | 502 upstream_unreachable |
RPM هر کلید را هنگام ساختن کلید میتوانید کمتر از سقف حساب بگذارید؛ مثلاً برای کلیدی که به یک ابزار آزمایشی دادهاید. اگر برنامهتان به RPM یا همزمانی بیشتری نیاز دارد، با شرح کار و حجم تقریبی تیکت بفرستید.
هدرهای محدودیت#
پاسخ درخواستهای کلیددار سقف و باقیماندهٔ همان دقیقه را در هدرها میآورد. پاسخ 429 هدر Retry-After دارد: چند ثانیه صبر کنید.
HTTP/2 200
x-ratelimit-limit: 60
x-ratelimit-remaining: 57
x-request-id: req_4b1f0c9a7e2d8f3a6c5b0e1d
HTTP/2 429
retry-after: 12
x-ratelimit-limit: 60
x-ratelimit-remaining: 0
تلاش دوباره#
SDK رسمی OpenAI خطاهای ۴۲۹ و ۵xx را خودش با فاصلهٔ فزاینده (Exponential Back-off) دوباره میفرستد و Retry-After را رعایت میکند. تعداد تلاش و زمان انتظار را متناسب با کارتان بگذارید:
from openai import OpenAI
# The SDK already retries 429 and 5xx with exponential back-off and honours Retry-After.
client = OpenAI(
base_url="https://gisoo.pro/api/v1",
api_key="sk-gisoo-v1-...",
max_retries=4, # default is 2
timeout=120, # seconds
)
const client = new OpenAI({
baseURL: "https://gisoo.pro/api/v1",
apiKey: process.env.GISOO_API_KEY,
maxRetries: 4,
timeout: 120 * 1000,
});
- اینها را دوباره بفرستید:
429(بعد ازRetry-After)،502و503. - اینها را دوباره نفرستید:
400،401،402،403،404،413؛ تا علت را درست نکنید، جواب همان است.
درخواستهای موازی#
برای پردازش دستهای (خلاصه کردن هزار متن)، تعداد درخواستهای همزمان را خودتان زیر سقف حساب نگه دارید تا به concurrency_limit نخورید:
# Keep at most N requests in flight — below your account's concurrency limit.
import asyncio
from openai import AsyncOpenAI
client = AsyncOpenAI(base_url="https://gisoo.pro/api/v1", api_key="sk-gisoo-v1-...")
gate = asyncio.Semaphore(4)
async def summarise(text: str) -> str:
async with gate:
reply = await client.chat.completions.create(
model="gpt-4o-mini",
messages=[{"role": "user", "content": "Summarise in one Persian sentence:\n" + text}],
max_tokens=120,
)
return reply.choices[0].message.content
async def main(texts):
return await asyncio.gather(*(summarise(t) for t in texts))
سقف هزینه#
این سقفها را خودتان در اپ گیسو، بخش API، میگذارید و در لحظهٔ هر درخواست بررسی میشوند:
| سقف | روی | اگر پر شود |
|---|---|---|
| سقف هزینهٔ کلید | کل خرج یک کلید | 402 key_spend_limit_reached |
| بودجهٔ ماهانهٔ پروژه | خرج همهٔ کلیدهای یک پروژه در ماه جاری | 402 project_budget_exceeded |
| مدلهای مجاز | پروژه و کلید؛ هر دو باید مدل را مجاز بدانند | 403 model_not_allowed |
سقف هزینهٔ روزانه برای کل حساب هم هست که با درخواست شما از پشتیبانی تنظیم میشود (402 daily_cap_reached). وقتی سقفی پر شود، اعلانش را میگیرید.
برای هر برنامه یک پروژه با بودجهٔ ماهانه بسازید و به هر کلید سقف هزینه بدهید. اگر یک حلقهٔ بیپایان در کد یا یک کلید لورفته شروع به خرج کند، فقط تا همان سقف پیش میرود.
سقف پیش از احراز هویت#
حسابی که هنوز احراز هویت نکرده، در مجموع تا ۲ دلار مصرف میکند؛ برای آزمودن سرویس کافی است. بعد از آن همهٔ درخواستها، از استودیو و از API، با
403 kyc_required رد میشوند تا هویتتان تأیید شود. فرم احراز هویت داخل اپ گیسو پر میشود؛ اگر پیشتر در نِت اَرز احراز هویت کردهاید، در گیسو هم تأییدشدهاید.
درخواستهای بزرگ#
- تصویر و صدای base64 حدود یکسوم از فایل اصلی بزرگترند؛ پیش از فرستادن کوچکشان کنید (تصویر، صدا).
- برای سند بلند، بهجای فرستادن کل متن در هر درخواست، با امبدینگ فقط بخشهای مرتبط را بفرستید.
- بدنه را با UTF-8 بفرستید. PowerShell 5.1 ویندوز بهطور پیشفرض کدگذاری دیگری میفرستد و خطای
400 invalid_jsonمیگیرد؛ در آنجا بدنه را با[System.Text.Encoding]::UTF8.GetBytes(...)بفرستید.
پاسخ پرسشتان را پیدا نکردید؟
شناسهٔ درخواست (هدر X-Request-Id) را با پرسشتان در تیکت بفرستید تا دقیق بررسی کنیم.