Генерация видео 
Ниже приведён перевод и адаптация официального руководства OpenAI Sora с сохранением структуры и примеров, адаптированных под AITUNNEL.
Обзор 
Sora — новейшая видеомодель OpenAI, создающая детальные динамичные клипы с аудио по тексту или изображениям. Видео‑API (preview) открывает эти возможности: позволяет программно создавать, расширять и ремиксировать видео. Доступно три ключевых действия:
- Создать видео (POST /v1/videos)
 - Получить статус (GET /v1/videos/{video_id})
 - Скачать видео (GET /v1/videos/{video_id}/content)
 
Модели 
Sora 2 
sora-2 — для скорости и гибкости. Подходит для быстрых итераций, концептов и соцсетей.
Sora 2 Pro 
sora-2-pro — более стабильное и качественное выводимое видео. Подходит для продакшн‑задач и маркетинговых материалов.
Генерация видео 
Генерация — асинхронный процесс:
POST /v1/videosвозвращает объект задания сidи начальнымstatus- Либо опрашивайте 
GET /v1/videos/{video_id}, либо используйте вебхуки - После 
completedскачайте MP4GET /v1/videos/{video_id}/content 
Начать рендер (curl) 
curl -X POST "https://api.aitunnel.ru/v1/videos" \
  -H "Authorization: Bearer $AITUNNEL_API_KEY" \
  -H "Content-Type: multipart/form-data" \
  -F prompt="Wide tracking shot of a teal coupe driving through a desert highway, heat ripples visible, hard sun overhead." \
  -F model="sora-2-pro" \
  -F size="1280x720" \
  -F seconds="8"Ответ (пример):
{
  "id": "video_68d7512d07848190b3e45da0ecbebcde004da08e1e0678d5",
  "object": "video",
  "created_at": 1758941485,
  "status": "queued",
  "model": "sora-2-pro",
  "progress": 0,
  "seconds": "8",
  "size": "1280x720"
}Мониторинг прогресса 
import OpenAI from 'openai';
const openai = new OpenAI({
  baseURL: 'https://api.aitunnel.ru/v1',
  apiKey: process.env.AITUNNEL_API_KEY
});
async function main() {
  const video = await openai.videos.createAndPoll({
    model: 'sora-2',
    prompt: "A video of the words 'Thank you' in sparkling letters",
  });
  if (video.status === 'completed') {
    console.log('Video successfully completed: ', video);
  } else {
    console.log('Video creation failed. Status: ', video.status);
  }
}
main();import asyncio
import os
from openai import AsyncOpenAI
client = AsyncOpenAI(
    base_url="https://api.aitunnel.ru/v1",
    api_key=os.getenv("AITUNNEL_API_KEY")
)
async def main() -> None:
    video = await client.videos.create_and_poll(
        model="sora-2",
        prompt="A video of a cat on a motorcycle",
    )
    if video.status == "completed":
        print("Video successfully completed:", video)
    else:
        print("Video creation failed. Status:", video.status)
asyncio.run(main())Примечание о вебхуках: на проде используйте вебхуки (
video.completed,video.failed) вместо частого опроса.
Получение результатов 
Скачать MP4 (curl) 
curl -L "https://api.aitunnel.ru/v1/videos/video_abc123/content" \
  -H "Authorization: Bearer $AITUNNEL_API_KEY" \
  --output video.mp4Дополнительные ассеты (thumbnail, spritesheet) 
# thumbnail
curl -L "https://api.aitunnel.ru/v1/videos/video_abc123/content?variant=thumbnail" \
  -H "Authorization: Bearer $AITUNNEL_API_KEY" \
  --output thumbnail.webp
# spritesheet
curl -L "https://api.aitunnel.ru/v1/videos/video_abc123/content?variant=spritesheet" \
  -H "Authorization: Bearer $AITUNNEL_API_KEY" \
  --output spritesheet.jpgИспользование изображений как референсов 
Прикрепите изображение в input_reference (разрешение должно совпадать с size). Поддержка: image/jpeg|png|webp.
import fs from 'node:fs';
import OpenAI from 'openai';
const openai = new OpenAI({
  baseURL: 'https://api.aitunnel.ru/v1',
  apiKey: process.env.AITUNNEL_API_KEY
});
const fileStream = fs.createReadStream('image.png');
const video = await openai.videos.create({
  model: 'sora-2-pro',
  prompt: 'She turns around and smiles, then slowly walks out of the frame.',
  size: '1280x720',
  seconds: '8',
  // пример передачи изображения как первого кадра
  input_reference: await OpenAI.toFile(fileStream, '832x480.png', { contentType: 'image/png' })
});
console.log(video.id, video.status);import os
from openai import OpenAI
client = OpenAI(
    base_url="https://api.aitunnel.ru/v1",
    api_key=os.getenv("AITUNNEL_API_KEY")
)
with open("image.png", "rb") as img:
    video = client.videos.create(
        model="sora-2-pro",
        prompt="She turns around and smiles, then slowly walks out of the frame.",
        size="1280x720",
        seconds="8",
        input_reference=img,
    )
print(video.id, video.status)curl -X POST "https://api.aitunnel.ru/v1/videos" \
  -H "Authorization: Bearer $AITUNNEL_API_KEY" \
  -H "Content-Type: multipart/form-data" \
  -F prompt="She turns around and smiles, then slowly walks out of the frame." \
  -F model="sora-2-pro" \
  -F size="1280x720" \
  -F seconds="8" \
  -F input_reference="@sample_720p.jpeg;type=image/jpeg"Ремикс готовых видео 
Сделайте точечные правки без полного пересоздания. Передайте prompt c описанием изменения.
curl -X POST "https://api.aitunnel.ru/v1/videos/video_abc123/remix" \
  -H "Authorization: Bearer $AITUNNEL_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "prompt": "Shift the color palette to teal, sand, and rust, with a warm backlight."
  }'Формат ответа (сводка) 
{
  "id": "video_abc123",
  "object": "video",
  "status": "in_progress",
  "model": "sora-2",
  "progress": 33,
  "seconds": "8",
  "size": "1280x720"
}Лучшие практики 
- Описывайте тип кадра, сюжет, действие, окружение и освещение
 - Используйте вебхуки вместо частого опроса
 - Соблюдайте guardrails: 18-, нет защищённых персонажей/музыки, без реальных лиц в input изображениях
 
API Reference (кратко) 
- POST 
/v1/videos— создать видео- Тело: 
prompt(string, required),model(string, default sora-2),seconds(string, default 4),size(string, default 720x1280) - Multipart (optional): 
input_reference(file, image/jpeg|png|webp) 
 - Тело: 
 - GET 
/v1/videos/{video_id}— статус/метаданные - GET 
/v1/videos/{video_id}/content— скачать контент (variant: video|thumbnail|spritesheet) - POST 
/v1/videos/{video_id}/remix— ремикс готового видео (тело:prompt)