پرش به محتوا

مدیریت هزینه و محدودیت‌ها

سقف درخواست در دقیقه، درخواست‌های همزمان، اندازهٔ درخواست، سقف هزینهٔ کلید و بودجهٔ پروژه، سقف مصرف پیش از احراز هویت و رفتار درست در برابر خطای ۴۲۹.

بازبینی: ۸ مهر ۱۴۰۵ ۴ دقیقه مطالعه

محدودیت‌ها دو دسته‌اند: محدودیت سرعت که جلوی فشار بیش از حد را می‌گیرد، و سقف هزینه که خودتان می‌گذارید تا یک اشکال در کد یا کلید لورفته اعتبارتان را خالی نکند. مقدار واقعی محدودیت‌های هر کلید را 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
)
  • این‌ها را دوباره بفرستید: 429 (بعد از Retry-After)، 502 و 503.
  • این‌ها را دوباره نفرستید: 400، 401، 402، 403، 404، 413؛ تا علت را درست نکنید، جواب همان است.

درخواست‌های موازی#

برای پردازش دسته‌ای (خلاصه کردن هزار متن)، تعداد درخواست‌های همزمان را خودتان زیر سقف حساب نگه دارید تا به concurrency_limit نخورید:

Python محدود کردن همزمانی
# 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) را با پرسشتان در تیکت بفرستید تا دقیق بررسی کنیم.

تیکت پشتیبانی