Скилл: ошибки и повторы
Диагностика без раскрытия ключей и повторных побочных действий
Разбор ошибки
Проверяй HTTP-статус и тело ответа. Ошибка может быть JSON, текстом или событием уже открытого потока
Поля error.code, error.type и идентификатор запроса могут отсутствовать
Не выводи ключ и полные конфиденциальные входные данные
В Chat Completions проверяй choices[].error и finish_reason: "error", ошибка может сопровождаться HTTP 200 и частью текста в message.content, такой ответ не считается завершённым
Действия
| Ошибка | Действие |
|---|---|
| Неверный ключ или права | Исправить доступ, не повторять тот же запрос |
| Неверная модель или параметры | Исправить запрос |
402 | Проверить причину в теле, при metadata.limit_source: "openrouter_credits" передать ID запроса в поддержку GetAPI для проверки кредитов OpenRouter |
429 | Проверить причину ограничения, учесть Retry-After, если есть |
Временная 5xx | Ограниченный повтор с задержкой, если операция безопасна |
| Таймаут после отправки | Состояние выполнения неизвестно, проверить последствия |
| Ошибка SSE | Считать ответ частичным, не выдавать за завершённый |
Один статус 503 не определяет причину. Если тело указывает на model_not_found, повтор без изменения модели не исправит запрос
Если состояние видео failed не содержит причины, прочитай GET /v1/tasks/{id} тем же ключом. В fail_reason может быть дополнительное описание, данные расчёта могут отсутствовать. Проверяй возврат по связанным проводкам, одного status: "FAILURE" недостаточно
Проверка резерва
Для Batch проверяй billing_status, reserved_quota и charged_quota отдельно от status. При reconciliation_required возврат резерва ещё не подтверждён
Сохраняй ID задания, суммы и время, сверяй связанные проводки. Не создавай новое задание ради освобождения прежнего резерва, передай данные в поддержку, если расчёт остаётся незавершённым
Запрос отмены Batch POST /v1/batches/{id}/cancel может вернуть unsupported_operation. При таком ответе не считай задание отменённым и резерв возвращённым, продолжай проверять исходный ID
Повторы
Установи предел попыток и общий срок. Используй задержку с увеличением и случайным разбросом, если это соответствует приложению
Не дублируй внешние действия агента при повторе генерации. Для платного асинхронного задания сначала проверь уже созданный ID
После таймаута или HTTP 502 запрос мог быть выполнен, проверь первую попытку по ID перед повторным созданием ресурса
Если ID не получен, сохрани идентификатор запроса из ответа или журнала и передай в поддержку, не создавай дубликат автоматически
Сохраняй идентификатор и время запроса для поддержки, но не секреты
Подробности: ошибки API, повторы, таймауты
Для аудиозадания или изображения прочитай GET /v1/tasks/{task_id} ключом того же аккаунта, если task_id есть в журнале
Внутренний ID задания может отличаться от ID запроса
При status: "FAILURE" и reconciliation.billing_state: "manual_reconciliation" возврат ещё не подтверждён
Значение cost_confirmed: false означает, что стоимость не установлена, next_lookup_at: null означает, что следующая проверка не назначена
Сохрани резерв и проводки для сверки с поддержкой
Строка «Стоимость» для аудио в кабинете может показывать резерв после возврата остатка, сверяй итоговые проводки по task_id
При response delivery failed: context_canceled сопоставляй журнал с сохранённым ответом приложения по request ID. Такая запись может сопровождаться полученным HTTP 200, не повторяй платный запрос только из-за этой строки
При bad_response_body с сообщением cost is missing or invalid окончательная стоимость ответа не подтверждена, сохрани ID запроса и сверь проводки
При model_price_error с сообщением hosted-search quantity is unpriced не рассчитан резерв поиска, сохрани полный ответ для поддержки