Документация Генерация видео

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

Генерация видео через AI-модели. API предоставляет асинхронный интерфейс для создания видео из текстовых описаний (text-to-video) и референсных изображений (image-to-video / reference-to-video).

Базовый URL: https://api.ru-openrouter.ru/v1/


Обзор

Генерация видео — асинхронный процесс. В отличие от чата или генерации изображений, создание видео может занимать от 30 секунд до нескольких минут.

Типовой workflow:

  1. Создание задачиPOST /v1/videos
  2. Проверка статусаGET /v1/videos?job_id={jobId}
  3. Скачивание результатаGET /v1/videos/content?job_id={jobId}

Модели для генерации видео

GET /v1/videos/models

Список моделей, доступных для генерации видео, с указанием поддерживаемых разрешений, соотношений сторон и цен.

curl "https://api.ru-openrouter.ru/v1/videos/models" \
  -H "Authorization: Bearer sk_ваш_api_ключ"

Ответ:

{
  "object": "list",
  "data": [
    {
      "id": "google/veo-3.1",
      "object": "model",
      "created": 1719792000,
      "owned_by": "google",
      "capabilities": {
        "can_generate_video": true,
        "can_generate_audio": true,
        "output_modalities": ["video"]
      },
      "supported_resolutions": ["720p", "1080p"],
      "supported_aspect_ratios": ["16:9", "9:16", "1:1"],
      "supported_sizes": ["1280x720", "1920x1080"],
      "pricing": {
        "prompt": "0.500000000",
        "completion": "0.000000000",
        "unit": "sec",
        "currency": "RUB"
      }
    }
  ]
}
Поле Тип Описание
id string ID модели (используется в запросах генерации)
capabilities.can_generate_video boolean Поддержка генерации видео (всегда true)
capabilities.can_generate_audio boolean Может генерировать аудио-дорожку
supported_resolutions string[] Поддерживаемые разрешения: 480p, 720p, 1080p, 1K, 2K, 4K
supported_aspect_ratios string[] Поддерживаемые соотношения сторон
supported_sizes string[] Поддерживаемые размеры в пикселях (WIDTHxHEIGHT)
pricing.unit string Единица тарификации: sec (за секунду) или token
pricing.currency string Валюта ценообразования (RUB)

GET /v1/models?filter=video

Альтернативный способ получения списка видео-моделей через общий эндпоинт:

curl "https://api.ru-openrouter.ru/v1/models?filter=video" \
  -H "Authorization: Bearer sk_ваш_api_ключ"

Поддерживаемые разрешения

  • 480p — 640×480
  • 720p — 1280×720
  • 1080p — 1920×1080
  • 1K — 1024×1024 (или пропорционально)
  • 2K — 2560×1440
  • 4K — 3840×2160

Поддерживаемые соотношения сторон

  • 16:9 — широкоформатный ландшафт
  • 9:16 — вертикальный/портретный
  • 1:1 — квадратный
  • 4:3 — стандартный ландшафт
  • 3:4 — стандартный портретный
  • 3:2 — фотографический ландшафт
  • 2:3 — фотографический портретный
  • 21:9 — ультраширокий
  • 9:21 — ультравысокий

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

POST /v1/videos

Создание задачи генерации видео. Возвращает job_id и polling_url для отслеживания статуса.

Параметры запроса

Поле Тип Обязательный Описание
model string Да ID модели (например, google/veo-3.1)
prompt string Да Текстовое описание желаемого видео
duration integer Нет Длительность видео в секундах
resolution string Нет Разрешение: 720p, 1080p и др.
aspect_ratio string Нет Соотношение сторон: 16:9, 9:16, 1:1 и др.
size string Нет Точный размер в формате WIDTHxHEIGHT (например, 1280x720). Альтернатива resolution + aspect_ratio
frame_images array Нет Изображения для первого/последнего кадра (image-to-video)
input_references array Нет Референсные изображения для стиля (reference-to-video)
generate_audio boolean Нет Генерировать аудио-дорожку. По умолчанию true для моделей с поддержкой аудио
seed integer Нет Seed для детерминированной генерации (не гарантируется всеми провайдерами)
provider object Нет Провайдер-специфичные настройки

Пример: Text-to-Video

curl -X POST "https://api.ru-openrouter.ru/v1/videos" \
  -H "Authorization: Bearer sk_ваш_api_ключ" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "google/veo-3.1",
    "prompt": "Золотистый ретривер играет в мяч на солнечном пляже с волнами на заднем плане",
    "duration": 5,
    "resolution": "720p",
    "aspect_ratio": "16:9"
  }'

Ответ (202 Accepted):

{
  "id": "vid_abc123...",
  "generation_id": "vid_xyz789...",
  "polling_url": "https://api.ru-openrouter.ru/v1/videos/vid_abc123...",
  "status": "pending"
}

Использование изображений

Доступно два способа использования изображений, каждый активирует свой режим генерации:

Image-to-Video (frame_images): указывает первый или последний кадр видео.

{
  "model": "alibaba/wan-2.7",
  "prompt": "Персонаж идёт через лес",
  "frame_images": [
    {
      "type": "image_url",
      "image_url": {
        "url": "https://example.com/first-frame.png"
      },
      "frame_type": "first_frame"
    }
  ],
  "resolution": "1080p"
}

Reference-to-Video (input_references): предоставляет референсные изображения для стиля.

{
  "model": "alibaba/wan-2.7",
  "prompt": "Колоссальная солнечная вспышка рядом с планетой",
  "input_references": [
    {
      "type": "image_url",
      "image_url": {
        "url": "https://example.com/style-ref.png"
      }
    }
  ],
  "resolution": "1080p"
}

Если переданы оба поля, frame_images имеет приоритет, и запрос обрабатывается как image-to-video.

Провайдер-специфичные параметры

Параметры провайдера передаются через поле provider.options:

{
  "model": "google/veo-3.1",
  "prompt": "Таймлапс цветущего цветка",
  "provider": {
    "options": {
      "google-vertex": {
        "parameters": {
          "personGeneration": "allow",
          "negativePrompt": "blurry, low quality"
        }
      }
    }
  }
}

Дополнительные параметры, не входящие в стандартный список, можно передавать на верхнем уровне — они будут направлены провайдеру напрямую.


Проверка статуса

GET /v1/videos

Получение статуса задачи генерации видео.

Параметры:

Параметр Тип Обязательный Описание
job_id string Да ID задачи, полученный при создании
curl "https://api.ru-openrouter.ru/v1/videos?job_id=vid_abc123..." \
  -H "Authorization: Bearer sk_ваш_api_ключ"

Ответ (в процессе):

{
  "id": "vid_abc123...",
  "generation_id": "gen-xyz789...",
  "polling_url": "https://api.ru-openrouter.ru/v1/videos/vid_abc123...",
  "status": "in_progress",
  "model_name": "google/veo-3.1",
  "created_at": "2026-04-24 12:00:00",
  "updated_at": "2026-04-24 12:00:30"
}

Ответ (завершено):

{
  "id": "vid_abc123...",
  "generation_id": "gen-xyz789...",
  "polling_url": "https://api.ru-openrouter.ru/v1/videos/vid_abc123...",
  "status": "completed",
  "model_name": "google/veo-3.1",
  "download_url": "https://api.ru-openrouter.ru/v1/videos/content?job_id=vid_abc123...",
  "usage": {
    "cost": 16.50,
    "is_byok": false
  },
  "created_at": "2026-04-24 12:00:00",
  "updated_at": "2026-04-24 12:01:30"
}

Ответ (ошибка):

{
  "id": "vid_abc123...",
  "status": "failed",
  "error": "Content policy violation",
  "created_at": "2026-04-24 12:00:00",
  "updated_at": "2026-04-24 12:00:35"
}

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

Статус Описание
pending Задача создана и ожидает обработки
in_progress Видео генерируется
completed Видео готово к скачиванию
failed Ошибка генерации (проверьте поле error)

Скачивание видео

GET /v1/videos/content

Скачивание сгенерированного видео.

Параметры:

Параметр Тип Обязательный Описание
job_id string Да ID завершённой задачи
index integer Нет Индекс видео (по умолчанию 0). Используется, если модель сгенерировала несколько вариантов
curl "https://api.ru-openrouter.ru/v1/videos/content?job_id=vid_abc123..." \
  -H "Authorization: Bearer sk_ваш_api_ключ" \
  --output video.mp4

Ответ возвращается в формате video/mp4.


История видео

GET /v1/videos/history

Получение списка завершённых и активных задач пользователя.

Параметры:

Параметр Тип По умолчанию Описание
limit integer 20 Количество записей (макс. 100)
offset integer 0 Смещение для пагинации
curl "https://api.ru-openrouter.ru/v1/videos/history?limit=10" \
  -H "Authorization: Bearer sk_ваш_api_ключ"

Ответ:

{
  "videos": [
    {
      "job_id": "vid_abc123...",
      "prompt": "Золотистый ретривер играет в мяч...",
      "duration": 5,
      "resolution": "720p",
      "aspect_ratio": "16:9",
      "status": "completed",
      "model_name": "google/veo-3.1",
      "download_url": "/api/v1/videos/content?job_id=vid_abc123...",
      "actual_cost_rub": 16.50,
      "created_at": "2026-04-24 12:00:00",
      "completed_at": "2026-04-24 12:01:30"
    }
  ],
  "total": 1
}

Примеры на языках программирования

Python

import requests
import time
import json

API_KEY = "sk_ваш_api_ключ"
BASE_URL = "https://api.ru-openrouter.ru/v1"
headers = {
    "Authorization": f"Bearer {API_KEY}",
    "Content-Type": "application/json"
}

# Шаг 1: Создание задачи
payload = {
    "model": "google/veo-3.1",
    "prompt": "A golden retriever playing fetch on a sunny beach",
    "duration": 5,
    "resolution": "720p"
}

response = requests.post(f"{BASE_URL}/videos", headers=headers, json=payload)
result = response.json()
job_id = result["id"]
print(f"Job created: {job_id}, status: {result['status']}")

# Шаг 2: Ожидание и проверка статуса
while True:
    time.sleep(15)
    poll = requests.get(f"{BASE_URL}/videos?job_id={job_id}", headers=headers)
    status = poll.json()
    print(f"Status: {status['status']}")

    if status["status"] == "completed":
        # Шаг 3: Скачивание
        download = requests.get(
            f"{BASE_URL}/videos/content?job_id={job_id}",
            headers=headers
        )
        with open("output.mp4", "wb") as f:
            f.write(download.content)
        print("Video saved to output.mp4")
        break
    elif status["status"] == "failed":
        print(f"Failed: {status.get('error', 'Unknown error')}")
        break

JavaScript

const API_KEY = 'sk_ваш_api_ключ';
const BASE_URL = 'https://api.ru-openrouter.ru/v1';
const headers = {
  Authorization: `Bearer ${API_KEY}`,
  'Content-Type': 'application/json',
};

// Шаг 1: Создание задачи
const payload = {
  model: 'google/veo-3.1',
  prompt: 'A golden retriever playing fetch on a sunny beach',
  duration: 5,
  resolution: '720p',
};

const createRes = await fetch(`${BASE_URL}/videos`, {
  method: 'POST',
  headers,
  body: JSON.stringify(payload),
});
const { id: jobId } = await createRes.json();
console.log(`Job created: ${jobId}`);

// Шаг 2: Ожидание и проверка статуса
while (true) {
  await new Promise((r) => setTimeout(r, 15000));
  const pollRes = await fetch(`${BASE_URL}/videos?job_id=${jobId}`, { headers });
  const status = await pollRes.json();
  console.log(`Status: ${status.status}`);

  if (status.status === 'completed') {
    const downloadRes = await fetch(`${BASE_URL}/videos/content?job_id=${jobId}`, { headers });
    const blob = await downloadRes.blob();
    // Сохраните blob как файл
    console.log('Video ready');
    break;
  } else if (status.status === 'failed') {
    console.error(`Failed: ${status.error}`);
    break;
  }
}

Рекомендации

  • Детальные промпты: описывайте движение, ракурс камеры, освещение и композицию сцены для лучшего результата
  • Выбор разрешения: более высокое разрешение увеличивает время генерации и стоимость. Выбирайте разрешение, соответствующее задаче
  • Интервал опроса: используйте паузу 15–30 секунд между проверками статуса, чтобы избежать избыточных запросов
  • Обработка ошибок: всегда проверяйте статус failed и анализируйте поле error
  • Референсные изображения: при использовании input_references или frame_images убедитесь, что изображения доступны по URL и имеют поддерживаемый формат

Хранение видео

Сгенерированные видео хранятся в течение ограниченного срока. По истечении срока видео автоматически удаляются. Рекомендуется скачивать готовые видео сразу после получения статуса completed.