Przejdź do treści

Перелік помилок

Коди помилок API інтеграції плагінів, відповідність статусів HTTP та troubleshooting.

Кожна відповідь з помилкою з API інтеграції плагінів використовує той самий конверт:

{
  "error": {
    "code": "quota_exceeded",
    "message_i18n": {
      "en": "Account does not have enough credits to reserve this job. Top up the credit balance.",
      "pl": "Konto nie ma wystarczającej liczby kredytów..."
    },
    "retryable": false,
    "doc_url": "https://qamera.ai/docs/plugin-api/errors/quota_exceeded"
  }
}

code стабільний між випусками — розгалужуйтесь за ним у клієнті. message_i18n є інформаційним і може еволюціонувати. retryable підказує, чи повтор з тим самим payload може спрацювати.

Коди

КодHTTPRetryableЗначення
invalid_input400ніPayload запиту не пройшов валідацію
unauthorized401ніВідсутній, неправильний або відкликаний API-ключ
forbidden403ніКлюч не має потрібного scope
not_found404ніРесурс не існує або недоступний
idempotency_conflict409ніIdempotency-Key повторно використаний з іншим payload
job_not_cancelable409ніЗавдання не в стані, що дозволяє скасування
job_not_completed409ніOutputs запитано до завершення завдання
batch_limit_exceeded400ніЗабагато елементів у batch
rate_limit_exceeded429такБюджет запитів на ключ вичерпано
quota_exceeded402ніОбліковий запис без кредитів
concurrency_limit_exceeded429такОбліковий запис досяг ліміту одночасних завдань для провайдера
content_policy_violation422ніSource asset або параметри порушують політику
source_asset_unavailable422ніНе вдається отримати вказаний source asset
low_quality_input422ніЯкість source asset надто низька для надійної генерації
output_unavailable410ніЗгенерований asset видалено зі сховища
packshot_not_approved422ніФотозйомка не має схваленого пекшоту для продукту
generation_failed502такПомилка upstream провайдера AI
internal_error500такНеочікувана помилка сервера

Категорії невдач генерації

Помилка, що виникла під час виконання завдання, додатково несе category, а її code походить із цієї категорії. Помилки валідації, авторизації та лімітів ніколи не досягають генератора, тож не мають category.

categorycoderetryable
CONTENT_POLICYcontent_policy_violationні
INPUT_MISSINGsource_asset_unavailableні
INPUT_NOT_READYsource_asset_unavailableтак
RATE_LIMITrate_limit_exceededтак
TRANSIENT_INFRAgeneration_failedтак
PROVIDER_CAPACITYgeneration_failedтак
INTERNAL_BUGinternal_errorні
PROVIDER_ACCOUNTinternal_errorні

Завдання, що зазнали невдачі до появи цієї класифікації, повідомляють generation_failed без category.

retryable для невдачі генерації описує завдання, а не запит: воно true лише тоді, коли наступна спроба вже запланована. Колонка вище — це стеля, яку допускає відповідна категорія, і її звужує власний status завдання: щойно цей статус стає кінцевим (completed, failed, cancelled, expired), конверт повідомляє false незалежно від категорії. Вебхук job.failed надсилається на переході в кінцевий стан, тож його error.retryable завжди false.

Два наслідки варто прочитати уважно:

  • internal_error, що виник під час генерації, ніколи не є retryable, хоча той самий код у відповіді 500 варто було б повторити — завдання не буде повторено за вас, тож повторне надсилання без змін не допоможе.
  • source_asset_unavailable у таблиці кодів вище позначено як не-retryable, і на рівні запиту це лишається правдою. Як результат завдання це залежить від категорії: INPUT_MISSING потребує того, що можете надати лише ви, і є остаточним, тоді як INPUT_NOT_READY означає, що ми самі ще готуємо ресурс — таке завдання повідомляє retryable: true, доки чекає, і false, коли очікування вичерпається і завдання завершиться як failed.

Тож будуйте логіку на code і category, а retryable читайте як «чи вже запланована наступна спроба», ніколи як «чи варто надіслати це ще раз».

message_i18n ніколи не містить тексту від постачальника чи внутрішньої діагностики. Будуйте логіку на code, а message_i18n показуйте людині.