Hujjatlardan qidirish

Sahifa yoki bo‘lim nomini kiriting

API

Xatolar va idempotency

Error envelope, statuslar, retry va `Idempotency-Key` semantikasi.

Standart error envelope

JSON xato
{
  "error": {
    "code": "invalid_request",
    "message": "So‘rov ma’lumotlari noto‘g‘ri.",
    "type": "invalid_request_error"
  },
  "request_id": "req_…"
}

User-facing xabarlar o‘zbekcha lokalizatsiya qilinadi. Ichki DB/provider tafsiloti klientga sizib chiqmaydi; correlation uchun request ID qaytariladi va logga yoziladi.

Muhim kodlar

HTTPCodeKlient harakati
400invalid_requestPayload/capabilityni tuzating
401invalid_api_key / api_key_expired / api_key_revokedYangi credential oling
403insufficient_scope / model_not_allowed / ip_not_allowed / account_disabledSiyosatni admin bilan hal qiling
404not_found / model_not_found / file_not_foundID/alias va ownershipni tekshiring
409Conflict/idempotency in progressBir xil key bilan kutib retry qiling
413Payload/file too largeHajmni kamaytiring
429usage_limit_exceededRetry-Afterni hurmat qiling
502/503provider_error / unavailableRetryable flag va backoff bo‘yicha qayta urinib ko‘ring
500internal_errorRequest ID bilan operatorga murojaat qiling

Idempotency-Key

Machine inference mutationlarida barqaror, bitta mantiqiy amal uchun yagona key yuboring. Server user/key/route va request fingerprintini bog‘laydi. Bir xil key va bir xil payload yakunlangan bo‘lsa saqlangan status/header/body replay qilinadi; bir xil key boshqa payload bilan kelganda conflict qaytadi.

  • Key’ni retrylar orasida o‘zgartirmang.
  • Boshqa biznes amal uchun eski key’ni qayta ishlatmang.
  • In-progress javobida Retry-After bo‘lsa kuting.
  • Streaming javob ham replay uchun saqlanadi; ownership key principalga bog‘langan.

Retry strategiyasi

Soddalashtirilgan exponential backoff
for (let attempt = 0; attempt < 4; attempt++) {
  const response = await fetch(url, {
    method: "POST",
    headers: {
      Authorization: `Bearer ${apiKey}`,
      "Content-Type": "application/json",
      "Idempotency-Key": operationId,
    },
    body: JSON.stringify(payload),
  });

  if (response.ok || ![409, 429, 502, 503].includes(response.status)) return response;
  const retryAfter = Number(response.headers.get("retry-after") ?? 2 ** attempt);
  await new Promise((resolve) => setTimeout(resolve, retryAfter * 1000));
}