
Видео API — это не chat completion с файлом на выходе
Главная ошибка при добавлении AI-видео в SaaS — проектировать функцию как синхронный запрос. Видео создаётся дольше текста, может стоять в очереди, завершаться модерацией, возвращать временную ссылку и требовать повторной генерации по причинам, которые пользователь считает «плохим качеством», а провайдер — успешной задачей.
Поэтому продукту нужен не один endpoint, а жизненный цикл задачи. Если его спроектировать правильно, модель можно менять. Если неправильно — любая новая модель только увеличит число зависших заказов и спорных списаний.
Минимальная архитектура
Компонент | Ответственность |
API приложения | Проверяет запрос и создаёт внутренний job |
Очередь | Ограничивает параллелизм и сглаживает нагрузку |
Worker | Отправляет запрос модели и сохраняет provider task ID |
Status service | Получает callback или опрашивает провайдера |
Storage | Копирует результат из временной ссылки |
Moderation | Проверяет входные и выходные материалы |
Billing | Резервирует и списывает кредиты по правилам продукта |
Observability | Связывает user job, provider task, стоимость и результат |
Два идентификатора вместо одного
В базе должны храниться внутренний job_id и task_id провайдера. Пользователь видит только первый. Это позволяет повторить запрос у другой модели, не меняя публичный контракт, и не раскрывать внутреннюю маршрутизацию.
Статусы также должны принадлежать продукту: created, queued, submitted, processing, succeeded, rejected, failed, cancelled, expired. Статус провайдера переводится в эту схему через адаптер.
Retry: место, где сгорает бюджет
Ситуация | Повторять автоматически? | Почему |
Timeout до получения task ID | Только с idempotency key | Задача могла быть создана |
429 | Да, с backoff и лимитом | Временное ограничение |
Provider 5xx | Ограниченно | Нужен circuit breaker |
Moderation rejected | Нет | Повтор того же запроса бессмысленен |
Технически успешное, но плохое видео | Нет автоматически | Это новая платная творческая попытка |
Временная ссылка истекла | Не генерировать заново | Нужно восстановить файл или обратиться к storage |
Стоимость попытки и стоимость принятого ролика
Провайдер обычно считает успешную генерацию, даже если маркетолог отклонил результат. SaaS должен разделять provider success и product acceptance.
Стоимость принятого ролика = генерации + повторные попытки + хранение + проверка ÷ количество одобренных роликов. Эта метрика позволяет честно сравнивать модели с разной ценой и стабильностью.
Маршрутизация видео моделей
Задача | Логика маршрута |
Быстрый черновик | Дешёвая модель или низкое разрешение |
Товарный ролик | Модель с лучшей точностью объекта |
Длинная история | Модель с большей длительностью и continuity |
Reference-heavy | Модель с поддержкой изображений, видео и аудио |
Финальный asset | Высокое разрешение после принятия композиции |
Сбой основного маршрута | Fallback только если формат задачи совместим |
OdiRouter.ai как модельный слой
OdiRouterобъединяет видео модели вместе с LLM, изображениями и аудио через единый каталог. Для SaaS это полезно на уровне маршрутизации: приложение хранит собственный job lifecycle, а model ID и параметры провайдера остаются в адаптере.
Российские команды могут свободно использовать сервис, пополнять баланс в рублях и тестировать модели без отдельного платёжного контура для каждого поставщика. Но данные о task status, callback, длительности ссылок и биллинге каждой модели всё равно нужно нормализовать внутри продукта.
Чек-лист перед публичным запуском
Проверка | Готово, если |
Idempotency | Повтор API-запроса не создаёт второй платный job |
Backpressure | Очередь ограничивает нагрузку по тарифу и пользователю |
Cancellation | Отмена имеет понятные правила списания |
Storage | Файл копируется до истечения ссылки |
Moderation | Пользователь понимает причину отказа |
Billing | Баланс не становится отрицательным при параллельных задачах |
Fallback | Не меняет длительность, ratio и смысл запроса молча |
Support | По одному job_id можно восстановить весь путь |
Вывод
Видео-функция становится надёжной не тогда, когда модель генерирует красивый ролик, а когда продукт умеет объяснить любой статус, любое списание и любой повтор. Модель создаёт контент; SaaS отвечает за доверие.