Скилл: ошибки и повторы
Диагностика без раскрытия ключей и повторных побочных действий
Разбор ошибки
Проверяй HTTP-статус и тело ответа. Ошибка может быть JSON, текстом или событием уже открытого потока
Поля error.code, error.type и идентификатор запроса могут отсутствовать. Не выводи ключ и полные конфиденциальные входные данные
В Chat Completions проверяй choices[].error и finish_reason: "error", ошибка может сопровождаться HTTP 200 и частью текста в message.content, такой ответ не считается завершённым
Действия
| Ошибка | Действие |
|---|---|
| Неверный ключ или права | Исправить доступ, не повторять тот же запрос |
| Неверная модель или параметры | Исправить запрос |
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
Сохраняй идентификатор и время запроса для поддержки, но не секреты
Подробности: ошибки API, повторы, таймауты
Для аудиозадания читай GET /v1/tasks/{task_id}, если task_id есть в журнале, ключом того же аккаунта. status: "FAILURE" вместе с reconciliation.billing_state: "manual_reconciliation" не подтверждает возврат, при cost_confirmed: false стоимость не установлена, при next_lookup_at: null следующая проверка не назначена. Сохраняй резерв и проводки для сверки с поддержкой, ID внутреннего задания может отличаться от ID внешнего запроса
Строка «Стоимость» для аудио в кабинете может показывать резерв после возврата остатка, сверяй итоговые проводки по task_id