Генерация видео
Ниже приведён перевод и адаптация официального руководства 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)