# Ошибки задач

Объект ошибки один и у задачи (поле `error` задачи со `status: "failed"`), и у HTTP-ошибки запроса (тело `{ "error": {…} }`). Это не формат OpenAI: поля `type` нет. Код из закрытого списка ниже, решение о повторе в `retry`. Ошибка задачи приходит в самой задаче: HTTP 200 у `POST` в пределах `wait` и всегда у `GET`.

- `code` (string) — Код из списка ниже
- `retry` (string) — `as_is`: повторить так же. `change_input`: исправить запрос. `no`: не повторять
- `message` (string) — Текст для разработчика, по-английски
- `param` (string, ошибка запроса) — JSON Pointer на поле тела: `/input/references/1`, `/wait`. Если ошибка в параметре строки запроса (`GET` списка и моделей), это его имя: `limit`. Ошибка не в поле, например тело не JSON: `param` нет
- `retry_after` (integer, 429, 503) — Секунды; то же в `Retry-After`
- `required`, `balance` (object, 402) — Сколько нужно на резерв и сколько есть

**Пример**

```json
{
  "error": {
    "code": "insufficient_balance",
    "retry": "as_is",
    "message": "Insufficient balance for this task. Top up in the cabinet.",
    "required": {
      "amount": "17.18",
      "currency": "rub"
    },
    "balance": {
      "amount": "4.00",
      "currency": "rub"
    }
  }
}
```

`X-Request-Id` в ответе шлюза не `id` задачи. Всё, от чего зависит решение (`retry`, `retry_after`, `poll_after`), есть и в теле.

- `400` (invalid_request) — Запрос не прошёл проверку. Исправьте поле из `param`. `retry`: change_input
- `400` (reference_too_large) — Присланный data URL больше 10 МиБ. `retry`: change_input
- `400` (reference_unsupported) — Тип присланного data URL не png, jpeg или webp. `retry`: change_input
- `413` (payload_too_large) — Тело запроса больше 32 МиБ. `retry`: change_input
- `401` (unauthorized) — Ключа нет, он неверный или отозван. `retry`: no
- `402` (insufficient_balance) — Денег на резерв не хватает, в ответе `required` и `balance`. Пополните баланс и повторите. `retry`: as_is
- `402` (key_limit_reached) — Ключ достиг своего лимита трат; пополнение его не снимает. Повторите после того, как владелец поднимет лимит ключа. `retry`: as_is
- `404` (not_found) — Нет такой задачи у аккаунта или неизвестная модель. `retry`: no
- `405` (method_not_allowed) — Метод не поддерживается этим путём; допустимые в заголовке `Allow`. `retry`: no
- `409` (task_id_conflict) — Этот id занят другим запросом, задачей другого аккаунта или удалённой задачей с другим запросом. `retry`: no
- `410` (task_purged) — Срок хранения задачи вышел; тот же запрос с её id тоже даёт 410. `retry`: no
- `429` (rate_limited) — Лимит запросов ключа в минуту или одновременных задач ключа. Подождите `retry_after` секунд. `retry`: as_is
- `503` (capacity_exceeded) — Модель временно недоступна, повторите через `retry_after` секунд. `retry`: as_is
- `503` (upstream_unavailable) — Нет маршрута для модели с этими параметрами или задачи выключены (`retry_after` 60); сервис на паузе, процесс перегружен или чтение задач не уложилось во время (`retry_after` 1). `retry`: as_is
- `500` (internal_error) — Наша ошибка. Повторите тот же запрос с тем же `id`. `retry`: as_is
- `в задаче` (invalid_request) — Провайдер отверг вход. `retry`: change_input
- `в задаче` (content_policy_violation) — Модерация. Текст провайдера мы не показываем. `stage`: `input`, если отклонены промпт или референсы, `retry`: change_input; `output`, если отклонено готовое изображение, `retry`: as_is. Отклонённое готовое изображение мы генерируем ещё раз, один раз, пока у задачи есть время: в `events` это `attempt.failed` и следующий `attempt.started`. `category`, только если провайдер её назвал: `sexual`, `minors`, `violence`, `hate`, `self_harm`, `illegal`, `public_figure`, `copyright`
- `в задаче` (upstream_timeout) — Попытка не успела. `retry`: as_is
- `в задаче` (upstream_unavailable) — Провайдер недоступен. `retry`: as_is
- `в задаче` (upstream_capacity) — Провайдер перегружен. `retry`: as_is
- `в задаче` (upstream_error) — Ошибка у провайдера. `retry`: as_is
- `в задаче` (capacity_exceeded) — Модель временно недоступна. `retry`: as_is
- `в задаче` (result_unavailable) — Результат не сохранился. `retry`: as_is
- `в задаче` (task_expired) — Задача не успела к `deadline_at`. `retry`: as_is

**Попытки.** Если попытка не удалась, задача идёт дальше, и в `events` это видно: `attempt.started`, `attempt.failed` и `attempt.lost` с номером попытки `attempt` и причиной `reason` из того же списка кодов; у отказа модерации в `attempt.failed` ещё `stage` и `category`, как в ошибке задачи. Какой провайдер отвечал и сколько он стоит, не показывается.

Источник: https://polyapi.ru/docs/tasks-errors
