پرش به محتوای اصلی

خطاها و محدودیت‌ها

خطاها و محدودیت‌ها

هر خطا با پوشش بومی پروتکل برمی‌گردد تا مدیریت خطای SDK شما بدون تغییر کار کند. دات‌هوش روی پوشش OpenAI چند فیلد اضافه می‌گذارد که برای تصمیم‌گیری لازم‌اند.

پوشش خطا

json
{
  "error": {
    "type": "invalid_request_error",
    "code": "unsupported_parameter",
    "message": "…",
    "request_id": "…",
    "parameter": "anthropic-version",
    "retryable": false,
    "retry_scope": "never",
    "partial_delivery": false
  }
}
json
{
  "type": "error",
  "error": { "type": "invalid_request_error", "message": "…" },
  "request_id": "req_…"
}

پوشش دوم همان پوشش بومی Anthropic است: کد وضعیت در سرآیند، و دستهٔ خطا در error.type. فیلدهای ریز خطا (code، retryable، retry_scope) فقط در پوشش OpenAI می‌آیند؛ روی مسیر Anthropic همین اطلاعات را از error.type و کد وضعیت بگیرید.

فیلدکاربرد
codeروی این شرط بگذارید. ثابت است؛ message قابل بازنویسی است
typeدستهٔ خطا (invalid_request_error، authentication_error، rate_limit_error، provider_error و …)
messageمتن فارسی برای انسان؛ متناسب با مخاطب نوشته شده و قابل بازنویسی است
request_idبرای پیگیری پشتیبانی؛ روی مسیر OpenAI در سرآیند X-Request-Id و روی مسیر Anthropic در سرآیند Request-Id هم می‌آید
parameterنام فیلدی که باعث خطا شده، وقتی مشخص باشد
retryableاینکه تلاش دوباره می‌تواند موفق شود یا نه
retry_scopeیکی از never، same-request-before-first-byte، new-request-after-delay، manual-review
retry_after_secondsوقتی دات‌هوش می‌داند چقدر باید صبر کنید
partial_deliveryآیا بخشی از پاسخ را گرفته‌اید

message عمداً محافظه‌کارانه است: نه پرامپت شما، نه پاسخ، نه هویت ارائه‌دهنده، نه endpoint داخلی و نه اعتبارنامه در آن نیست. اگر پیامی کلی به‌نظر می‌رسد، دلیل همین است؛ روی code و request_id تکیه کنید.

معنای retry_scope

مقداریعنی
neverهرگز؛ درخواست مشکل دارد، دوباره فرستادن همان خطا را می‌دهد
same-request-before-first-byteپیش از نخستین بایت می‌توان روی همان مدل دوباره تلاش کرد
new-request-after-delayبا تأخیر، به‌عنوان یک درخواست تازه
manual-reviewتلاش دوبارهٔ خودکار جایز نیست؛ باید وضعیت را بررسی کنید

جدول کدها

«وضعیت» دو عدد دارد: اولی روی /v1/* و دومی روی /anthropic/v1/messages. بعضی کدها بین دو پروتکل وضعیت یکسانی ندارند و همین تفاوت را باید در مدیریت خطا لحاظ کنید.

احراز هویت و دسترسی

کدوضعیت OpenAI / Anthropicretryableretry_scopeمعنا
api_key_malformed401 / 401nomanual-reviewساختار کلید API نامعتبر است
api_key_invalid401 / 401nomanual-reviewکلید API معتبر نیست
api_key_revoked401 / 401nomanual-reviewکلید API لغو شده است
api_key_disabled401 / 401nomanual-reviewکلید API غیرفعال است
api_key_expired401 / 401nomanual-reviewکلید API منقضی شده است
api_key_model_not_allowed403 / 403nomanual-reviewمدل برای این کلید مجاز نیست
api_key_environment_mismatch403 / 403nomanual-reviewمحیط کلید با درخواست سازگار نیست
api_key_ip_not_allowed403 / 403nomanual-reviewنشانی IP مجاز نیست
api_key_scope_insufficient403 / 403nomanual-reviewدسترسی کلید کافی نیست
api_key_leak_suspended403 / 403nomanual-reviewکلید مشکوک به افشا تعلیق شد
api_key_or_account_spend_limit403 / 403nomanual-reviewسقف هزینهٔ کلید یا حساب رد شد
project_or_account_disabled403 / 403nomanual-reviewپروژه یا حساب غیرفعال است
api_key_rpm_exceeded429 / 429yesnew-request-after-delayسقف درخواست در دقیقه تکمیل است
api_key_tpm_exceeded429 / 429yesnew-request-after-delayسقف توکن در دقیقه تکمیل است
api_key_concurrency_exceeded429 / 429yesnew-request-after-delayسقف درخواست هم‌زمان تکمیل است

مدل، قابلیت و ارائه‌دهنده

کدوضعیت OpenAI / Anthropicretryableretry_scopeمعنا
model_not_found404 / 404noneverمدل پیدا نشد
model_private_or_admin_only404 / 404noneverمدل خصوصی یا ویژهٔ ادمین است
model_deprecated_scheduled_or_removed410 / 404noneverمدل منسوخ، زمان‌بندی‌شده یا حذف شده است
model_temporarily_unavailable503 / 500yesnew-request-after-delayمدل موقتاً در دسترس نیست
unsupported_capability400 / 400noneverقابلیت درخواستی پشتیبانی نمی‌شود
unsupported_parameter400 / 400noneverپارامتر درخواستی پشتیبانی نمی‌شود
invalid_structured_output_schema400 / 400noneverساختار خروجی معتبر نیست
invalid_image_or_media_input400 / 400noneverورودی تصویر یا رسانه معتبر نیست
context_length_exceeded400 / 400noneverطول زمینه از سقف مدل بیشتر است
provider_overloaded503 / 529yesnew-request-after-delayظرفیت ارائه‌دهنده تکمیل است
provider_timeout504 / 500yesnew-request-after-delayزمان پاسخ ارائه‌دهنده پایان یافت
provider_auth_or_quota_failure503 / 500yesnew-request-after-delayاحراز هویت یا سهمیهٔ ارائه‌دهنده ناموفق است
all_same_model_endpoints_unavailable503 / 500yesnew-request-after-delayهمهٔ مسیرهای همان مدل خارج از دسترس‌اند
stream_interrupted_before_first_byte502 / 500nomanual-reviewجریان پیش از نخستین بایت قطع شد
partial_stream_after_first_byte502 / 500nomanual-reviewجریان پس از شروع ناقص ماند
upstream_usage_missing_or_unknown409 / 400nomanual-reviewمصرف بالادست نامشخص است
canonical_mapping_failure502 / 500nomanual-reviewنگاشت مدل داخلی ناموفق بود
response_validation_failure502 / 500nomanual-reviewاعتبارسنجی پاسخ ناموفق بود

کیف پول و صورت‌حساب

کدوضعیت OpenAI / Anthropicretryableretry_scopeمعنا
insufficient_available_balance402 / 400nomanual-reviewموجودی قابل‌استفاده کافی نیست
reservation_conflict409 / 400nomanual-reviewرزرو مالی با تعارض روبه‌رو شد
price_version_changed_before_start409 / 400nomanual-reviewنسخهٔ قیمت پیش از شروع تغییر کرده است
promotional_credit_expired402 / 400nomanual-reviewاعتبار هدیه منقضی شده است
spend_limit_daily_monthly_or_total403 / 403nomanual-reviewسقف هزینهٔ روزانه، ماهانه یا کل رد شد
reconciliation_required409 / 400nomanual-reviewتطبیق مالی لازم است
fx_source_unavailable503 / 500yesnew-request-after-delayمنبع نرخ ارز در دسترس نیست
fx_abnormal_change409 / 400nomanual-reviewتغییر غیرعادی نرخ ارز شناسایی شد

سرویس و BYOK

کدوضعیت OpenAI / Anthropicretryableretry_scopeمعنا
maintenance_mode503 / 500yesnew-request-after-delayسامانه در حالت نگه‌داری است
global_incident503 / 500yesnew-request-after-delayرخداد سراسری فعال است
service_degraded503 / 500yesnew-request-after-delayسرویس در وضعیت افت کیفیت است
byok_connection_disabled403 / 403nomanual-reviewاتصال BYOK غیرفعال است
byok_credential_invalid401 / 401nomanual-reviewاعتبارنامهٔ BYOK معتبر نیست
byok_credential_revoked401 / 401nomanual-reviewاعتبارنامهٔ BYOK لغو شده است
byok_permission_insufficient403 / 403nomanual-reviewمجوز اتصال BYOK کافی نیست
byok_accessible_model_list_empty400 / 400noneverفهرست مدل‌های BYOK خالی است
byok_quota_exhausted429 / 429yesnew-request-after-delayسهمیهٔ BYOK تمام شده است
byok_provider_unavailable503 / 500yesnew-request-after-delayارائه‌دهندهٔ BYOK در دسترس نیست
byok_fallback_unavailable503 / 500yesnew-request-after-delayمسیر جایگزین BYOK در دسترس نیست
byok_test_timeout504 / 500yesnew-request-after-delayآزمون BYOK به پایان زمان رسید
byok_delete_blocked_by_active_route409 / 400nomanual-reviewحذف BYOK به‌دلیل مسیر فعال مسدود است
byok_secret_decrypt_or_kms_failure503 / 500yesnew-request-after-delayرمزگشایی BYOK یا KMS ناموفق بود
credential_redemption_denied403 / 403nomanual-reviewبازخرید اعتبارنامه مجاز نشد

قاعدهٔ تلاش دوباره

فقط وقتی retryable برابر true است دوباره بفرستید و retry_after_seconds را رعایت کنید. از backoff نمایی با jitter استفاده کنید و یک سقف تلاش بگذارید.

هرگز یک خطای غیرقابل‌تلاش‌دوباره را در حلقه نگذارید. تکرار insufficient_available_balance یا خطاهای خانوادهٔ api_key_* فقط سهمیهٔ خودتان را می‌سوزاند.

دو حالت ظریف:

  • stream_interrupted_before_first_byte و partial_stream_after_first_byte هر دو manual-review هستند. هیچ‌کدام را خودکار تکرار نکنید؛ در حالت دوم بخشی از پاسخ را گرفته‌اید و همان اندازه هم حساب شده است (استریم).
  • price_version_changed_before_start و reservation_conflict هم manual-review هستند. دات‌هوش ترجیح می‌دهد شما وضعیت را ببینید تا اینکه دو بار روی یک رزرو نامعلوم عمل شود.

محدودیت‌ها و پاسخ 429

سقف‌ها روی هر API key گذاشته می‌شوند (محدودیت‌ها):

سقفکد
درخواست در دقیقهapi_key_rpm_exceeded
توکن در دقیقهapi_key_tpm_exceeded
درخواست هم‌زمانapi_key_concurrency_exceeded
هزینهapi_key_or_account_spend_limit

پاسخ‌های 429 سرآیند Retry-After را هم برمی‌گردانند. TPM پیش از اجرا با برآورد بررسی می‌شود، پس درخواستی با سقف توکن خروجی بزرگ زودتر از آنچه انتظار دارید سهمیهٔ دقیقه را مصرف می‌کند.

موجودی و صورت‌حساب

کدمعنا
insufficient_available_balanceموجودی قابل‌استفاده برای رزرو این درخواست کافی نیست؛ هیچ مبلغی کم نشده است
api_key_or_account_spend_limitسقف هزینهٔ کلید یا حساب پر شده است
reconciliation_requiredوضعیت مالی درخواست روشن نیست و به بررسی نیاز دارد
reservation_conflictعملیات هم‌زمان روی همان رزرو؛ بدون بررسی دوباره نفرستید

«موجودی قابل‌استفاده» مبلغی است که در همان لحظه توسط درخواست‌های در جریان رزرو نشده است. هر درخواست هم‌زمان تا تسویه یک رزرو نگه می‌دارد، پس ممکن است موجودی قابل‌استفاده کمتر از موجودی کل باشد.

درخواستی که پیش از رسیدن به ارائه‌دهنده رد شود، هزینه‌ای ندارد. رزرو در همان لحظه آزاد می‌شود.

گرفتن کمک

request_id را — از بدنهٔ خطا یا سرآیند X-Request-Id / Request-Id — به‌همراه زمان رخداد و کدی که گرفته‌اید بفرستید. همین‌ها برای ردیابی سرتاسری یک درخواست کافی است. هرگز کلید API خود را نفرستید.

مطالب مرتبط