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