Надёжность
Что мы делаем, чтобы сбой одного провайдера не стал вашим сбоем, - и где проходит граница, за которой ошибка всё-таки доходит до вас.
Failover до того, как вы увидите ошибку
У большинства моделей есть несколько провайдеров. Запрос идёт к ним по очереди, от дешёвого к дорогому. Если провайдер отвечает 429, таймаутом или 5xx, мы молча переходим к следующему - в вашем ответе это никак не отражается, кроме поля provider в логе.
Провайдер, который упал несколько раз подряд, временно исключается из выдачи (circuit breaker) и не мешает следующим запросам, пока не восстановится. Ошибку 503 вы получите, только если перебрали все маршруты и все они отказали.
Что не переигрывается
Если провайдер уже принял запрос и начал биллить его на своей стороне - например, создал асинхронную задачу генерации, - мы не отправляем запрос второму провайдеру, даже если первый затем отвалился. Иначе вы заплатили бы дважды за одну картинку. В таком случае ошибка возвращается вам как есть.
Отказ модерации тоже не переигрывается: если провайдер отклонил промпт, другой провайдер той же модели отклонит его так же. Такой запрос сразу возвращает 400 content_policy_violation и не тратит кредиты.
Таймауты и отмена
- Запрос, не уложившийся в отведённое время, завершается 504
timeout. Зарезервированные под него кредиты возвращаются на баланс. - Если соединение разорвали вы (например, отменили стрим), запрос помечается в логе как 499
client_closed. Это не сбой сервиса. - Резерв под запрос, чей процесс умер, освобождается автоматически - деньги не зависают.
Честные ожидания
Мы даём доступ к моделям по цене ниже официальных API, и часть этой разницы - работа с провайдерами, у каждого из которых своя стабильность. Failover сглаживает их сбои, но не отменяет: наша доступность складывается из нашей собственной и доступности хотя бы одного маршрута к вашей модели. Для моделей с единственным провайдером резерва нет по определению.
В продакшене стоит закладываться на это: ретраить 5xx с backoff, уважать retry-after при 429 и держать запасную модель для критичного пути. Разбор кодов - в разделе Ошибки.