Генерация видео

Видео генерируется асинхронно: запрос создаёт задачу, вы опрашиваете её статус и, когда ролик готов, скачиваете его. Модели видео тарифицируются за секунду ролика или за ролик целиком.

Создание задачи

POST/api/v1/videos. Обязательные поля — model и prompt. Необязательные:

  • duration — длительность в секундах, целое от 1 до 60;
  • resolution — 360p, 480p, 720p, 768p, 1080p, 1K, 2K или 4K;
  • aspect_ratio — соотношение сторон;
  • size — точный размер ШИРИНАxВЫСОТА, не больше 5040x2160;
  • generate_audio — true или false, нужен ли звук;
  • seed — целое, для повторяемого результата;
  • frame_images — первый или последний кадр: части image_url с frame_type first_frame или last_frame;
  • input_references — образцы: части image_url, video_url или audio_url;
  • upscale_factor (до 4) и creativity (целое) — для моделей, которые увеличивают видео.

Какие значения подходят модели, видно в её parameters (список моделей). previous_job_id и callback_url не поддерживаются — 422, другие поля модели не передаются.

curl https://infergate.ru/api/v1/videos \
  -H "Authorization: Bearer $INFERGATE_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "google/veo-3.1",
    "prompt": "A cat surfing a wave at sunset",
    "duration": 8
  }'

В ответ придёт 202 Accepted с id задачи и адресом для опроса polling_url:

{
  "id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
  "polling_url": "https://infergate.ru/api/v1/videos/3fa85f64-5717-4562-b3fc-2c963f66afa6",
  "status": "pending"
}

Резерв и оплата

Пока ролик генерируется, на балансе резервируется сумма с запасом — по цене модели и по самому дорогому варианту, который допускает запрос. Чего вы не указали, считается по максимуму: без duration — по самой большой длительности модели, без resolution или с size — по самому дорогому разрешению, без generate_audio: false — по цене со звуком. Видео и аудио во входных данных тоже увеличивают резерв.

Чтобы резерв был меньше, указывайте duration, resolution и, если звук не нужен, generate_audio: false (если во входных данных есть видео или аудио, duration резерв не уменьшает). Когда задача завершится, списывается фактическая стоимость, а остаток резерва возвращается. Если задача не удалась, резерв возвращается полностью.

Статус задачи

GET/api/v1/videos/{id} возвращает состояние задачи. Опрашивать её может только ключ, которым она создана.

  • pending, processing — генерация идёт, повторите запрос через несколько секунд;
  • completed — ролик готов, ссылка на скачивание — в unsigned_urls;
  • failed, cancelled, expired — задача завершилась без результата, причина — в error, деньги не списываются.
{
  "id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
  "status": "completed",
  "unsigned_urls": ["https://infergate.ru/api/v1/videos/3fa85f64-5717-4562-b3fc-2c963f66afa6/content?index=0"]
}

Стоимость списывается один раз — при первом опросе, который увидел completed; повторные опросы ничего не стоят. Если в таком ответе есть usage, в нём указана стоимость задачи; итог в любом случае виден в журнале запросов.

Скачивание

GET/api/v1/videos/{id}/content отдаёт готовый ролик в MP4. Если файлов несколько, нужный выбирается параметром index (по умолчанию 0). Скачать ролик может только ключ, которым создана задача.

curl -o video.mp4 "https://infergate.ru/api/v1/videos/3fa85f64-5717-4562-b3fc-2c963f66afa6/content?index=0" \
  -H "Authorization: Bearer $INFERGATE_API_KEY"

Модели видео

GET/api/v1/videos/models — модели, которые принимает POST/api/v1/videos, с supported_parameters (duration, resolution, aspect_ratio и другие). Цена за единицу, например за секунду, — в media_price. Это ориентир для оценки, а списывается фактическая стоимость задачи.

curl https://infergate.ru/api/v1/videos/models \
  -H "Authorization: Bearer $INFERGATE_API_KEY"

В parameters — допустимые значения полей запроса:

  • duration (секунды), resolution, aspect_ratio, size и frame_images (какие кадры модель принимает) — списки {"type": "enum", "values": [...]};
  • generate_audio и seed — {"type": "boolean"}, если модель их поддерживает;
  • upscale_factor у моделей, которые увеличивают видео, — диапазон {"type": "range", "min": …, "max": …}.

Если значения для модели неизвестны, поля parameters нет. Например:

"id": "google/veo-3.1",
"parameters": {
  "duration": { "type": "enum", "values": [4, 6, 8] },
  "resolution": { "type": "enum", "values": ["720p", "1080p", "4K"] },
  "aspect_ratio": { "type": "enum", "values": ["16:9", "9:16"] },
  "size": { "type": "enum", "values": ["1280x720", "1080x1920", "1920x1080", "720x1280", "3840x2160", "2160x3840"] },
  "frame_images": { "type": "enum", "values": ["first_frame", "last_frame"] },
  "generate_audio": { "type": "boolean" },
  "seed": { "type": "boolean" }
}