رفتن به محتوا

محدودیت نرخ درخواست

نحوه کار و مدیریت آحصار کردن درخواست‌ها

مستندات

نحوه کار

  • محدودیت‌ها برای هر کاربر و هر مدل جداگانه اعمال می‌شوند
  • الگوریتم Sliding Window استفاده می‌شود
  • پنجره زمانی پیش‌فرض: 1 دقیقه (قابل تنظیم)
  • نقض مکرر محدودیت‌ها منجر به مسدود شدن موقت/دائمی می‌شود

هدرهای پاسخ

هدرهای پاسخ
هدرتوضیح
X-RateLimit-Limitحداکثر درخواست در پنجره
X-RateLimit-Remainingدرخواست‌های باقی‌مانده
X-RateLimit-Window-Secondsمدت زمان پنجره (ثانیه)
Retry-Afterثانیه‌هایی برای صبر (فقط 429)

پاسخ محدودیت (429)

{  "error": {    "message": "محدودیت نرخ درخواست تجاوز شده. 100 درخواست برای 60 ثانیه مجاز است.",    "type": "rate_limit_error",    "code": "rate_limited"  }}

استراتژی Retry

import timeimport random def call_with_exponential_backoff(func, max_retries=5):    for attempt in range(max_retries):        try:            response = func()             if response.status_code == 429:                retry_after = int(response.headers.get("Retry-After", 60))                print(f"صبر {retry_after} ثانیه...")                time.sleep(retry_after)                continue             response.raise_for_status()            return response         except Exception as e:            if attempt == max_retries - 1:                raise             # Exponential backoff با تصادف            wait_time = (2 ** attempt) + random.uniform(0, 1)            print(f"تلاش {attempt + 1} ناموفق. دوباره تلاش در {wait_time:.1f}ث...")            time.sleep(wait_time)

پیش از نوشتن حلقهٔ تلاش مجدد، کلید یکتاسازی را هم بخوانید: بدون آن، هر تلاش مجدد می‌تواند یک پردازش و یک هزینهٔ تازه باشد.

کلید یکتاسازی (Idempotency)

یکتاسازی حالا صفحهٔ خودش را دارد. هدر Idempotency-Key، پاسخ ذخیره‌شده، هدر Idempotent-Replayed، خطای 409 و طرز ترکیب همهٔ این‌ها با Retry-After آنجاست.

کلید یکتاسازی (جلوگیری از کسر هزینهٔ دوباره هنگام Retry)