MiniMax H3 API
Принимает текстовое описание и возвращает готовый ролик. Разрешение 768P, 2K, 6 соотношений сторон, от 21:9 до 9:16, описание до 7 000 символов. Модель MiniMax.
Принимает изображение и оживляет его, возвращая ролик. Разрешение 768P, 2K, описание до 7 000 символов. Модель MiniMax.
Принимает изображения-образцы и переносит показанное на них в новый ролик. Разрешение 768P, 2K, 7 соотношений сторон, от adaptive до 9:16, описание до 7 000 символов. Модель MiniMax.
MiniMax H3 API работает в России без VPN: один API ключ GEN202, оплата рублями с российской карты, цена до 35% ниже официальной.
Цена: за секунду, 768p — 10.4 кр. (5,2 ₽ · $0.052), 2K — 16.9 кр. (8,45 ₽ · $0.0845).
Цена: за секунду, 768p — 10.4 кр. (5,2 ₽ · $0.052), 2K — 16.9 кр. (8,45 ₽ · $0.0845).
Цена: за секунду, 768p — 10.4 кр. (5,2 ₽ · $0.052), 2K — 16.9 кр. (8,45 ₽ · $0.0845).
кр. — кредиты, покупаются за рубли.
работает
работает
работает
Песочница
{ "model": "minimax/h3-text-to-video", "input": { "prompt": "Рыжий кот в скафандре на фоне Земли, мягкий свет", "duration": 4, "aspect_ratio": "21:9", "resolution": "768P" } }
Нажмите «Запустить» — готовый ролик появится здесь
Ролик делается минуты. Задача живёт не дольше 60 минут, после чего шлюз закрывает её сам и возвращает удержание целиком.
{
"code": 200,
"msg": "success",
"data": {
"taskId": "cm8r4t0vk0001s60p2xq7f9ab",
"model": "minimax/h3-text-to-video",
"state": "success",
"resultJson": "{\"resultUrls\":[\"https://file.example/result.mp4\"]}",
"failCode": "",
"failMsg": "",
"creditsConsumed": 10.4
}
}
{ "model": "minimax/h3-image-to-video", "input": { "prompt": "Рыжий кот в скафандре на фоне Земли, мягкий свет", "duration": 4, "resolution": "768P" } }
Нажмите «Запустить» — готовый ролик появится здесь
Ролик делается минуты. Задача живёт не дольше 60 минут, после чего шлюз закрывает её сам и возвращает удержание целиком.
{
"code": 200,
"msg": "success",
"data": {
"taskId": "cm8r4t0vk0001s60p2xq7f9ab",
"model": "minimax/h3-image-to-video",
"state": "success",
"resultJson": "{\"resultUrls\":[\"https://file.example/result.mp4\"]}",
"failCode": "",
"failMsg": "",
"creditsConsumed": 10.4
}
}
{ "model": "minimax/h3-reference-to-video", "input": { "prompt": "Рыжий кот в скафандре на фоне Земли, мягкий свет", "duration": 4, "aspect_ratio": "adaptive", "resolution": "768P" } }
Нажмите «Запустить» — готовый ролик появится здесь
Ролик делается минуты. Задача живёт не дольше 60 минут, после чего шлюз закрывает её сам и возвращает удержание целиком.
{
"code": 200,
"msg": "success",
"data": {
"taskId": "cm8r4t0vk0001s60p2xq7f9ab",
"model": "minimax/h3-reference-to-video",
"state": "success",
"resultJson": "{\"resultUrls\":[\"https://file.example/result.mp4\"]}",
"failCode": "",
"failMsg": "",
"creditsConsumed": 10.4
}
}
Цена MiniMax H3
Цена за секунду. Списывается фактический расход, о котором сообщил поставщик.
| Вариант | Скидка от официальной цены | Наша цена |
|---|---|---|
| 768P | $0.08 −35% | 10.4 кр. $0.0525,2 ₽ |
| 2K | $0.13 −35% | 16.9 кр. $0.08458,45 ₽ |
В среднем на 35% ниже официальной цены поставщика. кр. — кредиты, покупаются за рубли.
Цена за секунду. Списывается фактический расход, о котором сообщил поставщик.
| Вариант | Скидка от официальной цены | Наша цена |
|---|---|---|
| 768P | $0.08 −35% | 10.4 кр. $0.0525,2 ₽ |
| 2K | $0.13 −35% | 16.9 кр. $0.08458,45 ₽ |
В среднем на 35% ниже официальной цены поставщика. кр. — кредиты, покупаются за рубли.
Цена за секунду. Списывается фактический расход, о котором сообщил поставщик.
| Вариант | Скидка от официальной цены | Наша цена |
|---|---|---|
| 768P | $0.08 −35% | 10.4 кр. $0.0525,2 ₽ |
| 2K | $0.13 −35% | 16.9 кр. $0.08458,45 ₽ |
В среднем на 35% ниже официальной цены поставщика. кр. — кредиты, покупаются за рубли.
На время работы шлюз удерживает ставку выбранного разрешения, умноженную на запрошенную длительность; больше 253.5 кредита по этой модели он не удержит ни при каком запросе (duration до 15 с). Разница между удержанием и фактическим расходом возвращается на баланс тем же запросом состояния, который увидел итог.
Вызов через API
Ролик делается минуты, поэтому файл не приходит в ответ на запрос. Первый вызов
ставит задачу и сразу отвечает её номером, второй по этому номеру отдаёт состояние задачи, а когда
она готова — ссылку на результат. Ключ передаётся в обоих запросах заголовком
Authorization: Bearer sk-… и выпускается
в кабинете. На один ключ шлюз пропускает
30 постановок задачи и 300
запросов состояния в минуту.
Поля запроса
Значения проверяются до обращения к поставщику: поле не из списка модели или значение вне
перечисления возвращают 422 и кредитов не тратят.
| Поле | Тип | Обяз. | Допустимые значения |
|---|---|---|---|
| model | текст | обязательное | minimax/h3-text-to-video |
| input | объект | обязательное | Параметры генерации — поля из таблицы ниже |
Поля input
| Поле | Тип | Обяз. | Допустимые значения |
|---|---|---|---|
| prompt | текст | обязательное | от 1 до 7 000 символов |
| duration | целое число | обязательное | целое от 4 до 15 |
| aspect_ratio | значение из списка | обязательное | 21:9 · 16:9 · 4:3 · 1:1 · 3:4 · 9:16 |
| resolution | значение из списка | опц. | 768P · 2K |
Ответ
Оба запроса отвечают одним конвертом: {"code":…,"msg":…,"data":…}, где
code повторяет HTTP-статус, а полезное лежит в
data. Тот же конверт приходит и при отказе — разбирать две формы ответа
не нужно.
/api/v1/jobs/createTask
| Поле | Тип | Что в нём |
|---|---|---|
| data.taskId | строка | Номер задачи. Больше в ответе ничего нет и быть не может — работа только началась. |
/api/v1/jobs/recordInfo
| Поле | Тип | Что в нём |
|---|---|---|
| data.taskId | строка | Номер задачи — тот же, что вернул createTask. |
| data.model | строка | Имя модели в том виде, в каком его прислал клиент. |
| data.state | строка | Состояние задачи: waiting, queuing, generating, success или fail. |
| data.param | строка | Параметры, с которыми задача создана, — строкой JSON внутри JSON. |
| data.resultJson | строка | Результат строкой JSON внутри JSON: {"resultUrls":["https://…"]} — разбирается вторым разбором. До завершения задачи — пустая строка. |
| data.failCode | строка | Код неудачи из таблицы ниже. У остальных задач — пустая строка. |
| data.failMsg | строка | Причина неудачи словами. Иначе пустая строка. |
| data.costTime | число | Сколько задача заняла, миллисекунды. Пока не завершилась — null. |
| data.completeTime | число | Когда завершилась, миллисекунды эпохи Unix. Пока не завершилась — null. |
| data.createTime | число | Когда создана, миллисекунды эпохи Unix. |
| data.updateTime | число | Когда состояние менялось в последний раз, миллисекунды эпохи Unix. |
| data.creditsConsumed | число | Сколько кредитов списано. Ноль, пока задача не завершилась, и ноль у неудачной. |
Состояния задачи
Состояние лежит в поле state ответа
/api/v1/jobs/recordInfo. Первые три означают, что работа идёт: запрос надо
повторить примерно через 3 секунды — чаще спрашивать нечего, столько же
ждёт между опросами сам шлюз. Два последних состояния окончательные: после них задача не меняется.
| state | Что происходит |
|---|---|
| waiting | Задача принята и стоит в очереди шлюза; поставщику она ещё не отправлена. |
| queuing | Поставщик задачу принял и поставил в свою очередь. |
| generating | Генерация идёт. |
| success | Готово: ссылки на результат лежат в resultJson, в creditsConsumed — сколько списано. |
| fail | Задача не удалась: причина в failCode и failMsg, удержанные кредиты возвращены целиком. |
Опрос не бывает бесконечным: задача на видео живёт не дольше 60
минут, после чего шлюз закрывает её сам состоянием fail и возвращает
удержанные кредиты целиком. Причина неудачи приходит двумя полями:
failCode из таблицы ниже и failMsg словами.
| failCode | Что произошло |
|---|---|
| 501 | Поставщик вернул отказ: генерация не удалась. |
| 408 | Результата нет дольше крайнего срока задачи (60 минут для видео). |
| 404 | Поставщик не знает такой задачи. |
| 429 | Поставщик отбил создание задачи по своему лимиту. |
| 500 | Поломка на нашей стороне; подробности остаются в журнале шлюза. |
Ссылка на готовый файл живёт 14 дней — столько его хранит поставщик. Файл,
который нужен дольше, скачивайте к себе сразу после того, как задача пришла в состояние
success.
Отказы
Тело отказа одно на все случаи: {"code":…,"msg":…,"data":null}. Задача, не
дошедшая до результата, не тарифицируется — удержанные кредиты возвращаются целиком.
| Код | Адрес | Когда |
|---|---|---|
| 400 | /api/v1/jobs/createTask | Тело запроса — не разбираемый JSON. |
| 401 | /api/v1/jobs/createTask | Ключа нет в заголовке Authorization, либо он неверный или отключён. |
| 402 | /api/v1/jobs/createTask | Свободных кредитов меньше, чем удерживается под задачу. |
| 403 | /api/v1/jobs/createTask | Аккаунт заблокирован: вызовы модели, пополнение и загрузка файлов ему закрыты. Ключи при этом не отключены — запрет лежит на аккаунте. |
| 413 | /api/v1/jobs/createTask | Тело запроса больше 512 КиБ. |
| 415 | /api/v1/jobs/createTask | Тело отправлено не как application/json или заголовок Content-Type не передан. |
| 422 | /api/v1/jobs/createTask | Поле model пустое или его имени нет в каталоге, input — не объект, поле не из списка модели либо значение вне её перечисления. В сообщении перечислено, что принимается. |
| 429 | /api/v1/jobs/createTask | Больше 30 запросов в минуту на один ключ либо больше 50 незавершённых задач на аккаунте. |
| 500 | /api/v1/jobs/createTask | Поломка на нашей стороне. Подробности остаются в журнале шлюза и наружу не уходят. |
| 401 | /api/v1/jobs/recordInfo | Ключа нет в заголовке Authorization, либо он неверный или отключён. |
| 404 | /api/v1/jobs/recordInfo | Задачи с таким номером нет или она создана другим аккаунтом. |
| 422 | /api/v1/jobs/recordInfo | Параметр taskId не передан. |
| 429 | /api/v1/jobs/recordInfo | Больше 300 запросов в минуту на один ключ. |
| 500 | /api/v1/jobs/recordInfo | Поломка на нашей стороне. Подробности остаются в журнале шлюза и наружу не уходят. |
Пример вызова
# 1. Поставить задачу — в ответе придёт её номер
TASK=$(curl -s https://api.gen202.com/api/v1/jobs/createTask \
-H "Authorization: Bearer sk-ваш-ключ" \
-H "Content-Type: application/json" \
-d '{
"model": "minimax/h3-text-to-video",
"input": {
"prompt": "Рыжий кот в скафандре на фоне Земли, мягкий свет",
"duration": 4,
"aspect_ratio": "21:9",
"resolution": "768P"
}
}' | jq -r '.data.taskId')
# 2. Спрашивать состояние, пока задача не закончится: waiting, queuing и
# generating означают «работа идёт», success и fail — окончательные
while true; do
RECORD=$(curl -s "https://api.gen202.com/api/v1/jobs/recordInfo?taskId=$TASK" \
-H "Authorization: Bearer sk-ваш-ключ")
STATE=$(echo "$RECORD" | jq -r '.data.state')
case "$STATE" in success|fail) break;; esac
sleep 3
done
# 3. Забрать результат. Ссылка на файл лежит в resultJson — это строка JSON
# внутри JSON, поэтому её разбирают вторым разбором (fromjson)
echo "$RECORD" | jq -r '.data |
if .state == "fail"
then "отказ \(.failCode): \(.failMsg)"
else .resultJson | fromjson | .resultUrls[0]
end'
import json
import time
import requests
headers = {"Authorization": "Bearer sk-ваш-ключ"}
# 1. Поставить задачу — в ответе придёт её номер
created = requests.post(
"https://api.gen202.com/api/v1/jobs/createTask",
headers=headers,
json={
"model": "minimax/h3-text-to-video",
"input": {
"prompt": "Рыжий кот в скафандре на фоне Земли, мягкий свет",
"duration": 4,
"aspect_ratio": "21:9",
"resolution": "768P"
}
},
).json()
task_id = created["data"]["taskId"]
# 2. Спрашивать состояние, пока задача не закончится: waiting, queuing и
# generating означают «работа идёт», success и fail — окончательные
while True:
task = requests.get(
"https://api.gen202.com/api/v1/jobs/recordInfo",
headers=headers,
params={"taskId": task_id},
).json()["data"]
if task["state"] in ("success", "fail"):
break
time.sleep(3)
# 3. Разобрать итог. У неудачи причина в failCode и failMsg
if task["state"] == "fail":
raise SystemExit("отказ " + task["failCode"] + ": " + task["failMsg"])
# resultJson — строка JSON внутри JSON, поэтому разбор второй
result = json.loads(task["resultJson"])
print(result["resultUrls"][0])
print("списано кредитов:", task["creditsConsumed"])
Пример проходит весь путь: ставит задачу, повторяет запрос состояния раз в
3 секунды, пока задача не закончится, и разбирает ответ до ссылки
на файл. Разборов два, потому что поле resultJson — строка JSON
внутри JSON. В теле первого запроса стоят обязательные поля модели и значения из её
перечислений, поэтому он проходит проверку шлюза как есть.
Подставить остаётся только свой ключ.
Пример на оболочке разбирает ответ через jq; на Python своего
ничего не нужно, кроме requests.
Ролик делается минуты, поэтому файл не приходит в ответ на запрос. Первый вызов
ставит задачу и сразу отвечает её номером, второй по этому номеру отдаёт состояние задачи, а когда
она готова — ссылку на результат. Ключ передаётся в обоих запросах заголовком
Authorization: Bearer sk-… и выпускается
в кабинете. На один ключ шлюз пропускает
30 постановок задачи и 300
запросов состояния в минуту.
Поля запроса
Значения проверяются до обращения к поставщику: поле не из списка модели или значение вне
перечисления возвращают 422 и кредитов не тратят.
| Поле | Тип | Обяз. | Допустимые значения |
|---|---|---|---|
| model | текст | обязательное | minimax/h3-image-to-video |
| input | объект | обязательное | Параметры генерации — поля из таблицы ниже |
Поля input
| Поле | Тип | Обяз. | Допустимые значения |
|---|---|---|---|
| prompt | текст | обязательное | от 1 до 7 000 символов |
| duration | целое число | обязательное | целое от 4 до 15 |
| first_frame_url | ссылка | опц. | одна ссылка на изображение |
| last_frame_url | ссылка | опц. | одна ссылка на изображение |
| resolution | значение из списка | опц. | 768P · 2K |
Ссылка на изображение принимается только полным адресом на http или https: не длиннее 2048 символов, на общедоступном сайте, без имени и пароля перед адресом и без порта, кроме 80 и 443. Относительный путь, а также адреса внутри сети — localhost, 127.0.0.1, 10.0.0.5, 192.168.1.2 — и имена без точки шлюз отклоняет ответом 422, к поставщику не обращаясь.
Ответ
Оба запроса отвечают одним конвертом: {"code":…,"msg":…,"data":…}, где
code повторяет HTTP-статус, а полезное лежит в
data. Тот же конверт приходит и при отказе — разбирать две формы ответа
не нужно.
/api/v1/jobs/createTask
| Поле | Тип | Что в нём |
|---|---|---|
| data.taskId | строка | Номер задачи. Больше в ответе ничего нет и быть не может — работа только началась. |
/api/v1/jobs/recordInfo
| Поле | Тип | Что в нём |
|---|---|---|
| data.taskId | строка | Номер задачи — тот же, что вернул createTask. |
| data.model | строка | Имя модели в том виде, в каком его прислал клиент. |
| data.state | строка | Состояние задачи: waiting, queuing, generating, success или fail. |
| data.param | строка | Параметры, с которыми задача создана, — строкой JSON внутри JSON. |
| data.resultJson | строка | Результат строкой JSON внутри JSON: {"resultUrls":["https://…"]} — разбирается вторым разбором. До завершения задачи — пустая строка. |
| data.failCode | строка | Код неудачи из таблицы ниже. У остальных задач — пустая строка. |
| data.failMsg | строка | Причина неудачи словами. Иначе пустая строка. |
| data.costTime | число | Сколько задача заняла, миллисекунды. Пока не завершилась — null. |
| data.completeTime | число | Когда завершилась, миллисекунды эпохи Unix. Пока не завершилась — null. |
| data.createTime | число | Когда создана, миллисекунды эпохи Unix. |
| data.updateTime | число | Когда состояние менялось в последний раз, миллисекунды эпохи Unix. |
| data.creditsConsumed | число | Сколько кредитов списано. Ноль, пока задача не завершилась, и ноль у неудачной. |
Состояния задачи
Состояние лежит в поле state ответа
/api/v1/jobs/recordInfo. Первые три означают, что работа идёт: запрос надо
повторить примерно через 3 секунды — чаще спрашивать нечего, столько же
ждёт между опросами сам шлюз. Два последних состояния окончательные: после них задача не меняется.
| state | Что происходит |
|---|---|
| waiting | Задача принята и стоит в очереди шлюза; поставщику она ещё не отправлена. |
| queuing | Поставщик задачу принял и поставил в свою очередь. |
| generating | Генерация идёт. |
| success | Готово: ссылки на результат лежат в resultJson, в creditsConsumed — сколько списано. |
| fail | Задача не удалась: причина в failCode и failMsg, удержанные кредиты возвращены целиком. |
Опрос не бывает бесконечным: задача на видео живёт не дольше 60
минут, после чего шлюз закрывает её сам состоянием fail и возвращает
удержанные кредиты целиком. Причина неудачи приходит двумя полями:
failCode из таблицы ниже и failMsg словами.
| failCode | Что произошло |
|---|---|
| 501 | Поставщик вернул отказ: генерация не удалась. |
| 408 | Результата нет дольше крайнего срока задачи (60 минут для видео). |
| 404 | Поставщик не знает такой задачи. |
| 429 | Поставщик отбил создание задачи по своему лимиту. |
| 500 | Поломка на нашей стороне; подробности остаются в журнале шлюза. |
Ссылка на готовый файл живёт 14 дней — столько его хранит поставщик. Файл,
который нужен дольше, скачивайте к себе сразу после того, как задача пришла в состояние
success.
Отказы
Тело отказа одно на все случаи: {"code":…,"msg":…,"data":null}. Задача, не
дошедшая до результата, не тарифицируется — удержанные кредиты возвращаются целиком.
| Код | Адрес | Когда |
|---|---|---|
| 400 | /api/v1/jobs/createTask | Тело запроса — не разбираемый JSON. |
| 401 | /api/v1/jobs/createTask | Ключа нет в заголовке Authorization, либо он неверный или отключён. |
| 402 | /api/v1/jobs/createTask | Свободных кредитов меньше, чем удерживается под задачу. |
| 403 | /api/v1/jobs/createTask | Аккаунт заблокирован: вызовы модели, пополнение и загрузка файлов ему закрыты. Ключи при этом не отключены — запрет лежит на аккаунте. |
| 413 | /api/v1/jobs/createTask | Тело запроса больше 512 КиБ. |
| 415 | /api/v1/jobs/createTask | Тело отправлено не как application/json или заголовок Content-Type не передан. |
| 422 | /api/v1/jobs/createTask | Поле model пустое или его имени нет в каталоге, input — не объект, поле не из списка модели либо значение вне её перечисления. В сообщении перечислено, что принимается. |
| 429 | /api/v1/jobs/createTask | Больше 30 запросов в минуту на один ключ либо больше 50 незавершённых задач на аккаунте. |
| 500 | /api/v1/jobs/createTask | Поломка на нашей стороне. Подробности остаются в журнале шлюза и наружу не уходят. |
| 401 | /api/v1/jobs/recordInfo | Ключа нет в заголовке Authorization, либо он неверный или отключён. |
| 404 | /api/v1/jobs/recordInfo | Задачи с таким номером нет или она создана другим аккаунтом. |
| 422 | /api/v1/jobs/recordInfo | Параметр taskId не передан. |
| 429 | /api/v1/jobs/recordInfo | Больше 300 запросов в минуту на один ключ. |
| 500 | /api/v1/jobs/recordInfo | Поломка на нашей стороне. Подробности остаются в журнале шлюза и наружу не уходят. |
Пример вызова
# 1. Поставить задачу — в ответе придёт её номер
TASK=$(curl -s https://api.gen202.com/api/v1/jobs/createTask \
-H "Authorization: Bearer sk-ваш-ключ" \
-H "Content-Type: application/json" \
-d '{
"model": "minimax/h3-image-to-video",
"input": {
"prompt": "Рыжий кот в скафандре на фоне Земли, мягкий свет",
"duration": 4,
"resolution": "768P"
}
}' | jq -r '.data.taskId')
# 2. Спрашивать состояние, пока задача не закончится: waiting, queuing и
# generating означают «работа идёт», success и fail — окончательные
while true; do
RECORD=$(curl -s "https://api.gen202.com/api/v1/jobs/recordInfo?taskId=$TASK" \
-H "Authorization: Bearer sk-ваш-ключ")
STATE=$(echo "$RECORD" | jq -r '.data.state')
case "$STATE" in success|fail) break;; esac
sleep 3
done
# 3. Забрать результат. Ссылка на файл лежит в resultJson — это строка JSON
# внутри JSON, поэтому её разбирают вторым разбором (fromjson)
echo "$RECORD" | jq -r '.data |
if .state == "fail"
then "отказ \(.failCode): \(.failMsg)"
else .resultJson | fromjson | .resultUrls[0]
end'
import json
import time
import requests
headers = {"Authorization": "Bearer sk-ваш-ключ"}
# 1. Поставить задачу — в ответе придёт её номер
created = requests.post(
"https://api.gen202.com/api/v1/jobs/createTask",
headers=headers,
json={
"model": "minimax/h3-image-to-video",
"input": {
"prompt": "Рыжий кот в скафандре на фоне Земли, мягкий свет",
"duration": 4,
"resolution": "768P"
}
},
).json()
task_id = created["data"]["taskId"]
# 2. Спрашивать состояние, пока задача не закончится: waiting, queuing и
# generating означают «работа идёт», success и fail — окончательные
while True:
task = requests.get(
"https://api.gen202.com/api/v1/jobs/recordInfo",
headers=headers,
params={"taskId": task_id},
).json()["data"]
if task["state"] in ("success", "fail"):
break
time.sleep(3)
# 3. Разобрать итог. У неудачи причина в failCode и failMsg
if task["state"] == "fail":
raise SystemExit("отказ " + task["failCode"] + ": " + task["failMsg"])
# resultJson — строка JSON внутри JSON, поэтому разбор второй
result = json.loads(task["resultJson"])
print(result["resultUrls"][0])
print("списано кредитов:", task["creditsConsumed"])
Пример проходит весь путь: ставит задачу, повторяет запрос состояния раз в
3 секунды, пока задача не закончится, и разбирает ответ до ссылки
на файл. Разборов два, потому что поле resultJson — строка JSON
внутри JSON. В теле первого запроса стоят обязательные поля модели и значения из её
перечислений, поэтому он проходит проверку шлюза как есть.
Подставить остаётся только свой ключ.
Пример на оболочке разбирает ответ через jq; на Python своего
ничего не нужно, кроме requests.
Ролик делается минуты, поэтому файл не приходит в ответ на запрос. Первый вызов
ставит задачу и сразу отвечает её номером, второй по этому номеру отдаёт состояние задачи, а когда
она готова — ссылку на результат. Ключ передаётся в обоих запросах заголовком
Authorization: Bearer sk-… и выпускается
в кабинете. На один ключ шлюз пропускает
30 постановок задачи и 300
запросов состояния в минуту.
Поля запроса
Значения проверяются до обращения к поставщику: поле не из списка модели или значение вне
перечисления возвращают 422 и кредитов не тратят.
| Поле | Тип | Обяз. | Допустимые значения |
|---|---|---|---|
| model | текст | обязательное | minimax/h3-reference-to-video |
| input | объект | обязательное | Параметры генерации — поля из таблицы ниже |
Поля input
| Поле | Тип | Обяз. | Допустимые значения |
|---|---|---|---|
| prompt | текст | обязательное | от 1 до 7 000 символов |
| duration | целое число | обязательное | целое от 4 до 15 |
| reference_image_urls | список ссылок | опц. | до 9 ссылок на изображение |
| reference_video_urls | список ссылок | опц. | до 3 ссылок на видео |
| reference_audio_urls | список ссылок | опц. | до 3 ссылок на аудио |
| aspect_ratio | значение из списка | опц. | adaptive · 21:9 · 16:9 · 4:3 · 1:1 · 3:4 · 9:16 |
| resolution | значение из списка | опц. | 768P · 2K |
Ссылка на исходный файл принимается только полным адресом на http или https: не длиннее 2048 символов, на общедоступном сайте, без имени и пароля перед адресом и без порта, кроме 80 и 443. Относительный путь, а также адреса внутри сети — localhost, 127.0.0.1, 10.0.0.5, 192.168.1.2 — и имена без точки шлюз отклоняет ответом 422, к поставщику не обращаясь.
Ответ
Оба запроса отвечают одним конвертом: {"code":…,"msg":…,"data":…}, где
code повторяет HTTP-статус, а полезное лежит в
data. Тот же конверт приходит и при отказе — разбирать две формы ответа
не нужно.
/api/v1/jobs/createTask
| Поле | Тип | Что в нём |
|---|---|---|
| data.taskId | строка | Номер задачи. Больше в ответе ничего нет и быть не может — работа только началась. |
/api/v1/jobs/recordInfo
| Поле | Тип | Что в нём |
|---|---|---|
| data.taskId | строка | Номер задачи — тот же, что вернул createTask. |
| data.model | строка | Имя модели в том виде, в каком его прислал клиент. |
| data.state | строка | Состояние задачи: waiting, queuing, generating, success или fail. |
| data.param | строка | Параметры, с которыми задача создана, — строкой JSON внутри JSON. |
| data.resultJson | строка | Результат строкой JSON внутри JSON: {"resultUrls":["https://…"]} — разбирается вторым разбором. До завершения задачи — пустая строка. |
| data.failCode | строка | Код неудачи из таблицы ниже. У остальных задач — пустая строка. |
| data.failMsg | строка | Причина неудачи словами. Иначе пустая строка. |
| data.costTime | число | Сколько задача заняла, миллисекунды. Пока не завершилась — null. |
| data.completeTime | число | Когда завершилась, миллисекунды эпохи Unix. Пока не завершилась — null. |
| data.createTime | число | Когда создана, миллисекунды эпохи Unix. |
| data.updateTime | число | Когда состояние менялось в последний раз, миллисекунды эпохи Unix. |
| data.creditsConsumed | число | Сколько кредитов списано. Ноль, пока задача не завершилась, и ноль у неудачной. |
Состояния задачи
Состояние лежит в поле state ответа
/api/v1/jobs/recordInfo. Первые три означают, что работа идёт: запрос надо
повторить примерно через 3 секунды — чаще спрашивать нечего, столько же
ждёт между опросами сам шлюз. Два последних состояния окончательные: после них задача не меняется.
| state | Что происходит |
|---|---|
| waiting | Задача принята и стоит в очереди шлюза; поставщику она ещё не отправлена. |
| queuing | Поставщик задачу принял и поставил в свою очередь. |
| generating | Генерация идёт. |
| success | Готово: ссылки на результат лежат в resultJson, в creditsConsumed — сколько списано. |
| fail | Задача не удалась: причина в failCode и failMsg, удержанные кредиты возвращены целиком. |
Опрос не бывает бесконечным: задача на видео живёт не дольше 60
минут, после чего шлюз закрывает её сам состоянием fail и возвращает
удержанные кредиты целиком. Причина неудачи приходит двумя полями:
failCode из таблицы ниже и failMsg словами.
| failCode | Что произошло |
|---|---|
| 501 | Поставщик вернул отказ: генерация не удалась. |
| 408 | Результата нет дольше крайнего срока задачи (60 минут для видео). |
| 404 | Поставщик не знает такой задачи. |
| 429 | Поставщик отбил создание задачи по своему лимиту. |
| 500 | Поломка на нашей стороне; подробности остаются в журнале шлюза. |
Ссылка на готовый файл живёт 14 дней — столько его хранит поставщик. Файл,
который нужен дольше, скачивайте к себе сразу после того, как задача пришла в состояние
success.
Отказы
Тело отказа одно на все случаи: {"code":…,"msg":…,"data":null}. Задача, не
дошедшая до результата, не тарифицируется — удержанные кредиты возвращаются целиком.
| Код | Адрес | Когда |
|---|---|---|
| 400 | /api/v1/jobs/createTask | Тело запроса — не разбираемый JSON. |
| 401 | /api/v1/jobs/createTask | Ключа нет в заголовке Authorization, либо он неверный или отключён. |
| 402 | /api/v1/jobs/createTask | Свободных кредитов меньше, чем удерживается под задачу. |
| 403 | /api/v1/jobs/createTask | Аккаунт заблокирован: вызовы модели, пополнение и загрузка файлов ему закрыты. Ключи при этом не отключены — запрет лежит на аккаунте. |
| 413 | /api/v1/jobs/createTask | Тело запроса больше 512 КиБ. |
| 415 | /api/v1/jobs/createTask | Тело отправлено не как application/json или заголовок Content-Type не передан. |
| 422 | /api/v1/jobs/createTask | Поле model пустое или его имени нет в каталоге, input — не объект, поле не из списка модели либо значение вне её перечисления. В сообщении перечислено, что принимается. |
| 429 | /api/v1/jobs/createTask | Больше 30 запросов в минуту на один ключ либо больше 50 незавершённых задач на аккаунте. |
| 500 | /api/v1/jobs/createTask | Поломка на нашей стороне. Подробности остаются в журнале шлюза и наружу не уходят. |
| 401 | /api/v1/jobs/recordInfo | Ключа нет в заголовке Authorization, либо он неверный или отключён. |
| 404 | /api/v1/jobs/recordInfo | Задачи с таким номером нет или она создана другим аккаунтом. |
| 422 | /api/v1/jobs/recordInfo | Параметр taskId не передан. |
| 429 | /api/v1/jobs/recordInfo | Больше 300 запросов в минуту на один ключ. |
| 500 | /api/v1/jobs/recordInfo | Поломка на нашей стороне. Подробности остаются в журнале шлюза и наружу не уходят. |
Пример вызова
# 1. Поставить задачу — в ответе придёт её номер
TASK=$(curl -s https://api.gen202.com/api/v1/jobs/createTask \
-H "Authorization: Bearer sk-ваш-ключ" \
-H "Content-Type: application/json" \
-d '{
"model": "minimax/h3-reference-to-video",
"input": {
"prompt": "Рыжий кот в скафандре на фоне Земли, мягкий свет",
"duration": 4,
"aspect_ratio": "adaptive",
"resolution": "768P"
}
}' | jq -r '.data.taskId')
# 2. Спрашивать состояние, пока задача не закончится: waiting, queuing и
# generating означают «работа идёт», success и fail — окончательные
while true; do
RECORD=$(curl -s "https://api.gen202.com/api/v1/jobs/recordInfo?taskId=$TASK" \
-H "Authorization: Bearer sk-ваш-ключ")
STATE=$(echo "$RECORD" | jq -r '.data.state')
case "$STATE" in success|fail) break;; esac
sleep 3
done
# 3. Забрать результат. Ссылка на файл лежит в resultJson — это строка JSON
# внутри JSON, поэтому её разбирают вторым разбором (fromjson)
echo "$RECORD" | jq -r '.data |
if .state == "fail"
then "отказ \(.failCode): \(.failMsg)"
else .resultJson | fromjson | .resultUrls[0]
end'
import json
import time
import requests
headers = {"Authorization": "Bearer sk-ваш-ключ"}
# 1. Поставить задачу — в ответе придёт её номер
created = requests.post(
"https://api.gen202.com/api/v1/jobs/createTask",
headers=headers,
json={
"model": "minimax/h3-reference-to-video",
"input": {
"prompt": "Рыжий кот в скафандре на фоне Земли, мягкий свет",
"duration": 4,
"aspect_ratio": "adaptive",
"resolution": "768P"
}
},
).json()
task_id = created["data"]["taskId"]
# 2. Спрашивать состояние, пока задача не закончится: waiting, queuing и
# generating означают «работа идёт», success и fail — окончательные
while True:
task = requests.get(
"https://api.gen202.com/api/v1/jobs/recordInfo",
headers=headers,
params={"taskId": task_id},
).json()["data"]
if task["state"] in ("success", "fail"):
break
time.sleep(3)
# 3. Разобрать итог. У неудачи причина в failCode и failMsg
if task["state"] == "fail":
raise SystemExit("отказ " + task["failCode"] + ": " + task["failMsg"])
# resultJson — строка JSON внутри JSON, поэтому разбор второй
result = json.loads(task["resultJson"])
print(result["resultUrls"][0])
print("списано кредитов:", task["creditsConsumed"])
Пример проходит весь путь: ставит задачу, повторяет запрос состояния раз в
3 секунды, пока задача не закончится, и разбирает ответ до ссылки
на файл. Разборов два, потому что поле resultJson — строка JSON
внутри JSON. В теле первого запроса стоят обязательные поля модели и значения из её
перечислений, поэтому он проходит проверку шлюза как есть.
Подставить остаётся только свой ключ.
Пример на оболочке разбирает ответ через jq; на Python своего
ничего не нужно, кроме requests.
Остальные модели этого семейства и их поля — в разделе документации Видео.
Что делает нейросеть MiniMax H3
MiniMax H3 — видеомодель MiniMax третьего поколения, объявленная 31 июля 2026 года. Цена у GEN202 — от 5,2 ₽ до 8,45 ₽ за секунду, и цену задаёт выбранное разрешение. Ролик она отдаёт со звуком, а сцену для него берёт из описания, из присланного кадра или из образцов.
У той же модели есть второе имя — Hailuo AI: так MiniMax называет её на своём сайте для людей. Ищут её чаще под этим именем, а в поле model уходит первое.
Способов задать сцену 3, и под каждый есть свой режим: minimax/h3-text-to-video, minimax/h3-image-to-video и minimax/h3-reference-to-video.
Общего у режимов больше, чем своего: prompt, duration и resolution стоят у всех 3, а расходятся они полями под кадры и образцы. Что уходит в теле запроса целиком, разобрано в разделе «MiniMax».
Как снять ролик в MiniMax H3 и что забирают себе
Ролик считается на стороне MiniMax, а запрос уходит туда через нас. Поля заполняют в песочнице, готовый ролик проигрывается прямо под формой, и оттуда же он скачивается файлом.
Считается работа посекундно: сколько секунд заказали, столько и оплачено, а ставку задаёт выбранное разрешение. Приветственные кредиты приходят на счёт при первом входе, и пробный ролик снимается за них.
Файлы самой модели MiniMax выложил наружу — про это ниже на этой странице отдельный раздел. Тем, кому нужен готовый ролик, а не расчёт у себя, ставить ничего не придётся.
Порядок работы один на все 3 режимов, а меняются в нём заполненные поля.
- Выберите режим. Переключатель над формой ставит нужный, и от него зависит, появятся ли в запросе поля кадров и образцов.
- Опишите сцену. В поле prompt складывают, кто в кадре и что происходит. Движение камеры вписывают действием внутри сцены — так просит сам разработчик.
- Приложите кадры или образцы. Ссылки кладут каждую в своё поле: кадры отдельно, картинки, ролики и звук — отдельными списками.
- Назначьте длительность и разрешение. Эти два поля решают, каким выйдет ролик, и разрешение вдобавок двигает ставку за секунду.
- Сверьте замысел коротким роликом. Младшее разрешение и короткая длительность обходятся дешевле, и описание доводят на них, а нужную длину ставят уже готовому описанию.
Запуск MiniMax H3 на своей видеокарте: файлы и веса
Файлы этой модели MiniMax выложил наружу вскоре после выпуска, и лежат они в открытом хранилище под именем MiniMaxAI/MiniMax-H3. На тех же весах работает модель у нас — разница в том, чья видеокарта считает.
Слово о разрешении при своём расчёте стоит сказать заранее: у практиков ролик в родном для модели разрешении выходил чище, чем тот же ролик, поднятый выше, — на подъёме в кадре появлялись искажения.
Звук у неё свой и пишется вместе с картинкой, поэтому отдельной звуковой модели к ней не нужно.
Прежние поколения этой линейки — Hailuo 02 и 2.3 — файлами наружу не выкладывались и считаются на стороне MiniMax. Они стоят в каталоге рядом и собраны на странице MiniMax API.
Чем различаются режимы MiniMax H3
Разводит режимы только вход: ставка, длительность и разрешения у всех одинаковы, а различаются поля, которыми задают сцену.
| Режим | Откуда берётся сцена | Что кладут сверх описания |
|---|---|---|
| «текст в видео» | из одного описания | форма кадра, 6 значения на выбор |
| «картинка в видео» | из присланного кадра | first_frame_url, last_frame_url или оба сразу |
| «по образцам» | из образцов | до 9 картинок, до 3 роликов и до 3 звуковых дорожек |
Обязательных полей у «текст в видео» 3: prompt, duration и aspect_ratio. У остальных двух их 2 — prompt и duration, а форма кадра приходит вместе с присланным материалом.
Значение adaptive есть только у «по образцам»: по нему пропорции берутся с образца, а не назначаются числом.
Выпуски ряда Hailuo: имена у MiniMax и даты
Свою модель MiniMax называет третьим поколением ряда, и два прежних считает своими же. В таблице собраны имена у разработчика, дата объявления, суть переделки и те имена, которые уходят в поле model.
| Имя у MiniMax | Дата по анонсу | Что изменилось | Имя для поля model |
|---|---|---|---|
| MiniMax-H3 | 31 июля 2026 | Задачи сведены в одну модель; старшее разрешение собирается перегенерацией собственного кадра, а не отдельным увеличителем | minimax/h3-text-to-video, minimax/h3-image-to-video и minimax/h3-reference-to-video |
| Hailuo 02 | в анонсе H3 не названа | Переделаны основные части прежней системы: устройство модели, качество данных и размер | — |
Прочерк во второй строке таблицы значит, что этот выпуск на странице не показан: она собрана вокруг третьего поколения, и в поле model уходят имена его режимов.
Дата стоит на самой странице анонса строкой «2026-07-31», а текст под ней открывается словами «Today, we're launching MiniMax H3» — перевод наш: «Сегодня мы выпускаем MiniMax H3». Страница — объявление о выпуске MiniMax H3.
Прежние поколения разработчик перечисляет там же: «We previously developed two generations of models: Hailuo 01 built the system from the ground up, and Hailuo 02 focused on improving core components like architectural efficiency, data quality, and scale». Перевод наш: «Раньше мы сделали два поколения моделей: Hailuo 01 построила систему с нуля, Hailuo 02 улучшала основные части — эффективность архитектуры, качество данных и масштаб».
Почему устройство прошлого выпуска в новый не перешло, MiniMax объясняет прямо: «Notably, we set aside the Hailuo-02 architecture, despite the significant architectural advantages it once gave us, because it would introduce unnecessary complexity for a model built around task generalization». Перевод наш: «Примечательно, что мы отказались от архитектуры Hailuo-02, несмотря на её прежние преимущества: для модели, построенной вокруг обобщения задач, она добавляла лишнюю сложность».
Какой длины и в каком разрешении выходит ролик MiniMax H3
Поле duration принимает целое число секунд, от 4 до 15, и заполнить его нужно при любом способе задать сцену.
Разрешений 2 — 768P и 2K. Выбор между ними двигает ставку за секунду, и обе строки стоят таблицей выше.
Форм кадра 6: 21:9, 16:9, 4:3, 1:1, 3:4, 9:16. Широкая и вертикальная стоят в том же перечне, что и квадратная, поэтому ролик под ленту и ролик под экран заказываются одним и тем же полем.
Что кладут в запрос MiniMax H3 кроме описания
Описание вмещает до 7 000 знаков — это самое просторное поле запроса, и в нём же называют звуки сцены.
Кадры кладут по одной ссылке в поле: first_frame_url задаёт начало ролика, last_frame_url — его конец. Заполняют либо одно из них, либо оба.
Образцы перечисляют тремя списками ссылок — отдельно картинки, отдельно готовые ролики, отдельно звук. Имена полей и предел каждого списка стоят в таблице выше.
Как выглядит заполненная форма, видно сразу: до первой правки в ней стоят допустимые значения, и запрос из неё уходит как есть.
Что MiniMax говорит о модели MiniMax H3
Чем разработчик считает эту модель, сказано первой строкой объявления: «Today, we're launching MiniMax H3, a general-purpose multimodal generation model. H3 understands unified context across text, images, video, and audio, generating video with native stereo sound, up to 15 seconds at 2K resolution». Перевод наш: «Сегодня мы выпускаем MiniMax H3, универсальную многомодальную модель генерации. H3 понимает единый контекст из текста, картинок, видео и звука и порождает видео с родным стереозвуком длиной до 15 секунд в разрешении 2K». Страница — объявление о выпуске MiniMax H3.
Что выходит на выходе, разработчик перечисляет таблицей «Output Specs»: «Model name | MiniMax-H3», «Output resolution | 768P / 2K», «Output duration | 4–15 seconds, integer values only». Перевод наш: имя модели MiniMax-H3, разрешение на выходе 768P или 2K, длительность от 4 до 15 секунд и только целым числом. Страница — руководство MiniMax по генерации видео. Те же значения стоят в форме GEN202: разрешения 768P и 2K и длительность от 4 до 15 секунд.
Как получается старшее разрешение, MiniMax объясняет в том же объявлении о выпуске: «For H3's 2K output, instead of using a conventional dedicated super-resolution module, we have the H3 base model regenerate its own low-resolution output in-context». Перевод наш: «Для выхода в 2K мы не используем отдельный модуль повышения разрешения: базовая модель H3 заново порождает свой же результат низкого разрешения, держа его в контексте».
Свою цену MiniMax публикует сам, строками таблицы: «MiniMax-H3 | 768P | Billed per second | $0.08 / second» и «MiniMax-H3 | 2K | Billed per second | $0.13 / second». Перевод наш: счёт по секундам, 0,08 доллара за секунду в 768P и 0,13 в 2K. Страница — страница цен MiniMax по факту работы. Те же два числа стоят официальной ценой в таблице цен GEN202 — $0.08 и $0.13 за секунду, а рублёвая цена GEN202 стоит в таблице цен выше.
Где модели есть куда расти, разработчик называет сам: «H3 still has room to grow, and here are our priorities for future versions» и дальше «Visual detail can still be improved in certain scenarios. We will continue pushing toward higher resolutions and greater visual fidelity». Перевод наш: «H3 есть куда расти, вот наши приоритеты на будущие версии» и «В некоторых сценах детализация картинки пока может быть лучше; мы будем двигаться к более высоким разрешениям и точности изображения».
Слова MiniMax о модели H3 приведены по его страницам на 14 сентября 2026 года.
Где MiniMax сам очерчивает границу
Кадров на вход берётся один или два: начало ролика, его конец или оба вместе.
У присланной картинки названы пределы сторон в точках и допустимый разброс пропорций — очень вытянутый лист остаётся за границей.
Ролик-образец и звуковой образец ограничены дважды: числом кусков и общей длительностью всех кусков вместе.
Когда образцы смешивают — и картинки, и ролики, и звук в одном запросе, — назван ещё и общий предел на число приложенных файлов.
Что показали независимые проверки MiniMax H3
MiniMax H3 проверяют слепым сравнением на LMArena: человек смотрит два ролика, не зная, чей какой, и выбирает лучший. В арене «картинка в видео» у minimax-h3 стоит 1494 с допуском 6 при 49 443 голосах, у прошлого поколения, hailuo-2.3, — 1262 с допуском 5 при 394 450. В арене «текст в видео» у minimax-h3 — 1462 с допуском 10 при 7 648 голосах, у hailuo-2.3 — 1205 с допуском 6 при 82 971. Между поколениями больше двухсот пунктов в обеих аренах. Числа MiniMax взяты из таблиц — арена «картинка в видео» и арена «текст в видео» на LMArena.
Первый разбор — ролик Airt «MiniMax H3 Is Incredible – And It's FREE (100+ Examples)» от 7 августа 2026 года. Про физику автор говорит так: «Now, physics. This is where you find out if a model actually understands weight. Watch the moment things touch. That's where models cheat». Перевод наш: «Физика — здесь видно, понимает ли модель вес. Смотрите на момент касания: там модели жульничают». Итог он подводит числом предметов: «With one thing moving, it's solid. Add a few more and it starts guessing» — перевод наш: «Один движущийся предмет — держит уверенно. Добавьте ещё несколько — начинает угадывать». Ролик — разбор ста с лишним примеров MiniMax H3.
Что у модели вышло, тот же автор показывает на надписях в кадре: «Now, motion graphics, titles, logos, interfaces, this is where most models fall apart. Watch the text. It stays readable». Перевод наш: «Движущаяся графика, титры, логотипы, интерфейсы — здесь большинство моделей разваливается. Смотрите на текст: он остаётся читаемым». Про постоянство героя: «They gave it a character sheet, one page of drawings, and it kept the same character the whole way» — перевод наш: «Ей дали лист с рисунками героя, одну страницу, и она держала того же героя до конца».
Про открытые файлы он оговаривается отдельно: «So, a free model is actually competing now. That part is real, but the free one isn't the 2K one. That still costs money». Перевод наш: «Бесплатная модель теперь по-настоящему конкурирует. Но бесплатная — не та, что в 2K. За 2K по-прежнему платят».
Второй разбор — ролик Mark Gadala-Maria «I Tested China's New Uncensored AI Video Model (Hailuo H3)» от 7 августа 2026 года, снятый на своём компьютере. Время он называет числом: «But with a 5090, I was able to create a 15-second clip in about 7 to 8 minutes». Перевод наш: «На карте 5090 пятнадцатисекундный ролик у меня выходил примерно за 7–8 минут». Ролик — проверка MiniMax H3 на своём компьютере.
Своё число времени называет и разработчик, но на другом железе и на другом ролике: в его руководстве по запуску у себя стоит строка «Mean inference latency 75.10 seconds across three prompt/seed pairs» при условиях «4 × H200, Ulysses 4, resident, lossless» и «1344 × 768, 124 frames, 24 FPS, 50 steps, 5-second T2VA». Перевод наш: средняя задержка вывода 75,10 секунды по трём парам описание и зерно, на четырёх картах H200, для пятисекундного ролика. Страница — руководство MiniMax по запуску H3 у себя. Оба числа получены на своём оборудовании и на роликах разной длины, поэтому между собой они не сравниваются, и ни одно из них не относится к вызову через GEN202.
Что меняют образцы, второй автор проверил напрямую: «I also put reference images of Michael Jackson and Donald Trump. It I tried it without the reference images and it just does not work as well». Перевод наш: «Я добавил картинки-образцы. Пробовал без них — работает заметно хуже».
Оба ролика о MiniMax H3 приведены на 14 сентября 2026 года, числа арен — на 21 сентября.
Что видно на съёмке в MiniMax H3
Справочник разработчика — его руководство по генерации видео на платформе MiniMax — описывает поля запроса. Ниже — то, что всплывает уже на работе: где пересняли и как обошли.
Наблюдения о MiniMax H3 взяты из разборов с живыми прогонами: Airt, 6 августа 2026, Mark Gadala-Maria, 7 августа 2026, Kingy AI, 10 августа 2026, Dan Kieft, 21 августа 2026.
- Ролик в родном для модели разрешении выходит чище того же ролика, поднятого выше: на подъёме в кадре набираются искажения. Замысел поэтому доводят на низком разрешении, а высокое берут для готового описания.
- Музыка рождается заново в каждом куске, и длинный ролик, склеенный из нескольких, звучит разными темами. Обходят это просьбой оставить одни звуки сцены — шаги, удары, шум, — а музыку кладут при монтаже.
- Движение камеры надёжнее вписать в сцену действием: у прежних поколений работали квадратные скобки с названием приёма, а здесь то же самое говорят обычными словами.
- Звуки сцены модель берёт из описания охотно, и называть их стоит там же, где действие: удар, скрип, шаги по гравию попадают в дорожку вместе с движением, которое их вызвало.
Отсюда обычный порядок: короткий ролик на низком разрешении, доведённое на нём описание и уже потом длинный ролик в высоком. Так переснимается проба, а не готовая сцена.