Wan 2.7 API
Принимает текстовое описание и возвращает готовый ролик. Разрешение 720p, 1080p, описание до 5 000 символов. Модель Alibaba.
Принимает изображение и оживляет его, возвращая ролик. Разрешение 720p, 1080p, описание до 5 000 символов. Модель Alibaba.
Принимает изображения-образцы и переносит показанное на них в новый ролик. Разрешение 720p, 1080p, 5 соотношений сторон, от 16:9 до 3:4, описание до 5 000 символов. Модель Alibaba.
Принимает готовый ролик и переделывает его по текстовому указанию. Разрешение 720p, 1080p, 5 соотношений сторон, от 16:9 до 3:4, описание до 5 000 символов. Модель Alibaba.
Wan 2.7 API работает в России без VPN: один API ключ GEN202, оплата рублями с российской карты, цена до 10% ниже официальной.
Цена: за секунду, 720p — 18 кр. (9 ₽ · $0.09), 1080p — 27 кр. (13,5 ₽ · $0.135).
Цена: за секунду, 720p — 18 кр. (9 ₽ · $0.09), 1080p — 27 кр. (13,5 ₽ · $0.135).
Цена: за секунду, 720p — 18 кр. (9 ₽ · $0.09), 1080p — 27 кр. (13,5 ₽ · $0.135).
Цена: за секунду, 720p — 18 кр. (9 ₽ · $0.09), 1080p — 27 кр. (13,5 ₽ · $0.135).
кр. — кредиты, покупаются за рубли.
не поддерживается
не поддерживается
не поддерживается
не поддерживается
Песочница
Ещё настройки
Чтобы создать видео — войдите и получите 50 кредитов на тесты и любое использование сервиса.
{ "model": "wan/2-7-text-to-video", "input": { "prompt": "Рыжий кот в скафандре на фоне Земли, мягкий свет", "resolution": "720p", "duration": 2 } }
Нажмите «Запустить» — готовый ролик появится здесь
Ролик делается минуты. Задача живёт не дольше 60 минут, после чего шлюз закрывает её сам и возвращает удержание целиком.
{
"code": 200,
"msg": "success",
"data": {
"taskId": "cm8r4t0vk0001s60p2xq7f9ab",
"model": "wan/2-7-text-to-video",
"state": "success",
"resultJson": "{\"resultUrls\":[\"https://file.example/result.mp4\"]}",
"failCode": "",
"failMsg": "",
"creditsConsumed": 18
}
}
Ещё настройки
Чтобы создать видео — войдите и получите 50 кредитов на тесты и любое использование сервиса.
{ "model": "wan/2-7-image-to-video", "input": { "prompt": "Рыжий кот в скафандре на фоне Земли, мягкий свет", "resolution": "720p", "duration": 2 } }
Нажмите «Запустить» — готовый ролик появится здесь
Ролик делается минуты. Задача живёт не дольше 60 минут, после чего шлюз закрывает её сам и возвращает удержание целиком.
{
"code": 200,
"msg": "success",
"data": {
"taskId": "cm8r4t0vk0001s60p2xq7f9ab",
"model": "wan/2-7-image-to-video",
"state": "success",
"resultJson": "{\"resultUrls\":[\"https://file.example/result.mp4\"]}",
"failCode": "",
"failMsg": "",
"creditsConsumed": 18
}
}
Ещё настройки
Чтобы создать видео — войдите и получите 50 кредитов на тесты и любое использование сервиса.
{ "model": "wan/2-7-r2v", "input": { "prompt": "Рыжий кот в скафандре на фоне Земли, мягкий свет", "aspect_ratio": "16:9", "resolution": "720p", "duration": 2 } }
Нажмите «Запустить» — готовый ролик появится здесь
Ролик делается минуты. Задача живёт не дольше 60 минут, после чего шлюз закрывает её сам и возвращает удержание целиком.
{
"code": 200,
"msg": "success",
"data": {
"taskId": "cm8r4t0vk0001s60p2xq7f9ab",
"model": "wan/2-7-r2v",
"state": "success",
"resultJson": "{\"resultUrls\":[\"https://file.example/result.mp4\"]}",
"failCode": "",
"failMsg": "",
"creditsConsumed": 18
}
}
Ещё настройки
Чтобы создать видео — войдите и получите 50 кредитов на тесты и любое использование сервиса.
{ "model": "wan/2-7-videoedit", "input": { "prompt": "Заменить фон на вечернюю городскую улицу, свет тёплый", "video_url": "https://example.com/input.mp4", "aspect_ratio": "16:9", "resolution": "720p", "duration": 2 } }
Нажмите «Запустить» — готовый ролик появится здесь
Ролик делается минуты. Задача живёт не дольше 60 минут, после чего шлюз закрывает её сам и возвращает удержание целиком.
{
"code": 200,
"msg": "success",
"data": {
"taskId": "cm8r4t0vk0001s60p2xq7f9ab",
"model": "wan/2-7-videoedit",
"state": "success",
"resultJson": "{\"resultUrls\":[\"https://file.example/result.mp4\"]}",
"failCode": "",
"failMsg": "",
"creditsConsumed": 18
}
}
Цена Wan 2.7
Цена за секунду. Списывается фактический расход, о котором сообщил поставщик.
| Вариант | Скидка от официальной цены | Наша цена |
|---|---|---|
| 720p | $0.1 −10% | 18 кр. $0.099 ₽ |
| 1080p | $0.15 −10% | 27 кр. $0.13513,5 ₽ |
В среднем на 10% ниже официальной цены поставщика. кр. — кредиты, покупаются за рубли.
Цена за секунду. Списывается фактический расход, о котором сообщил поставщик.
| Вариант | Скидка от официальной цены | Наша цена |
|---|---|---|
| 720p | $0.1 −10% | 18 кр. $0.099 ₽ |
| 1080p | $0.15 −10% | 27 кр. $0.13513,5 ₽ |
В среднем на 10% ниже официальной цены поставщика. кр. — кредиты, покупаются за рубли.
Цена за секунду. Списывается фактический расход, о котором сообщил поставщик.
| Вариант | Скидка от официальной цены | Наша цена |
|---|---|---|
| 720p | $0.1 −10% | 18 кр. $0.099 ₽ |
| 1080p | $0.15 −10% | 27 кр. $0.13513,5 ₽ |
В среднем на 10% ниже официальной цены поставщика. кр. — кредиты, покупаются за рубли.
Цена за секунду. Списывается фактический расход, о котором сообщил поставщик.
| Вариант | Скидка от официальной цены | Наша цена |
|---|---|---|
| 720p | $0.1 −10% | 18 кр. $0.099 ₽ |
| 1080p | $0.15 −10% | 27 кр. $0.13513,5 ₽ |
В среднем на 10% ниже официальной цены поставщика. кр. — кредиты, покупаются за рубли.
На время работы шлюз удерживает ставку выбранного разрешения, умноженную на запрошенную длительность; больше 405 кредитов по этой модели он не удержит ни при каком запросе (duration до 15 с). Разница между удержанием и фактическим расходом возвращается на баланс тем же запросом состояния, который увидел итог.
Вызов через API
Ролик делается минуты, поэтому файл не приходит в ответ на запрос. Первый вызов
ставит задачу и сразу отвечает её номером, второй по этому номеру отдаёт состояние задачи, а когда
она готова — ссылку на результат. Ключ передаётся в обоих запросах заголовком
Authorization: Bearer sk-… и выпускается
в кабинете. На один ключ шлюз пропускает
30 постановок задачи и 300
запросов состояния в минуту.
Поля запроса
Значения проверяются до обращения к поставщику: поле не из списка модели или значение вне
перечисления возвращают 422 и кредитов не тратят.
| Поле | Тип | Обяз. | Допустимые значения |
|---|---|---|---|
| model | текст | обязательное | wan/2-7-text-to-video |
| input | объект | обязательное | Параметры генерации — поля из таблицы ниже |
Поля input
| Поле | Тип | Обяз. | Допустимые значения |
|---|---|---|---|
| prompt | текст | обязательное | от 1 до 5 000 символов |
| negative_prompt | текст | опц. | не длиннее 500 символов |
| resolution | значение из списка | опц. | 720p · 1080p |
| ratio | значение из списка | опц. | 16:9 · 9:16 · 1:1 · 4:3 · 3:4 |
| duration | целое число | опц. | целое от 2 до 15 |
| audio_url | ссылка | опц. | одна ссылка на аудио |
| prompt_extend | да или нет | опц. | true или false |
| watermark | да или нет | опц. | true или false |
| seed | целое число | опц. | целое от 0 до 2 147 483 647 |
| nsfw_checker | да или нет | опц. | true или false |
Ссылка на исходный файл принимается только полным адресом на 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": "wan/2-7-text-to-video",
"input": {
"prompt": "Рыжий кот в скафандре на фоне Земли, мягкий свет",
"resolution": "720p",
"duration": 2
}
}' | 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": "wan/2-7-text-to-video",
"input": {
"prompt": "Рыжий кот в скафандре на фоне Земли, мягкий свет",
"resolution": "720p",
"duration": 2
}
},
).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 | текст | обязательное | wan/2-7-image-to-video |
| input | объект | обязательное | Параметры генерации — поля из таблицы ниже |
Поля input
| Поле | Тип | Обяз. | Допустимые значения |
|---|---|---|---|
| prompt | текст | обязательное | от 1 до 5 000 символов |
| negative_prompt | текст | опц. | не длиннее 500 символов |
| resolution | значение из списка | опц. | 720p · 1080p |
| first_frame_url | ссылка | опц. | одна ссылка на изображение |
| last_frame_url | ссылка | опц. | одна ссылка на изображение |
| first_clip_url | ссылка | опц. | одна ссылка на видео |
| driving_audio_url | ссылка | опц. | одна ссылка на аудио |
| duration | целое число | опц. | целое от 2 до 15 |
| prompt_extend | да или нет | опц. | true или false |
| watermark | да или нет | опц. | true или false |
| seed | целое число | опц. | целое от 0 до 2 147 483 647 |
| nsfw_checker | да или нет | опц. | true или false |
Ссылка на исходный файл принимается только полным адресом на 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": "wan/2-7-image-to-video",
"input": {
"prompt": "Рыжий кот в скафандре на фоне Земли, мягкий свет",
"resolution": "720p",
"duration": 2
}
}' | 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": "wan/2-7-image-to-video",
"input": {
"prompt": "Рыжий кот в скафандре на фоне Земли, мягкий свет",
"resolution": "720p",
"duration": 2
}
},
).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 | текст | обязательное | wan/2-7-r2v |
| input | объект | обязательное | Параметры генерации — поля из таблицы ниже |
Поля input
| Поле | Тип | Обяз. | Допустимые значения |
|---|---|---|---|
| prompt | текст | обязательное | от 1 до 5 000 символов |
| negative_prompt | текст | опц. | не длиннее 500 символов |
| resolution | значение из списка | опц. | 720p · 1080p |
| reference_image | список ссылок | опц. | до 5 ссылок на изображение |
| reference_video | список ссылок | опц. | до 5 ссылок на видео |
| first_frame | ссылка | опц. | одна ссылка на изображение |
| reference_voice | ссылка | опц. | одна ссылка на аудио |
| aspect_ratio | значение из списка | опц. | 16:9 · 9:16 · 1:1 · 4:3 · 3:4 |
| duration | целое число | опц. | целое от 2 до 10 |
| prompt_extend | да или нет | опц. | true или false |
| watermark | да или нет | опц. | true или false |
| seed | целое число | опц. | целое от 0 до 2 147 483 647 |
| nsfw_checker | да или нет | опц. | true или false |
Ссылка на исходный файл принимается только полным адресом на 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": "wan/2-7-r2v",
"input": {
"prompt": "Рыжий кот в скафандре на фоне Земли, мягкий свет",
"aspect_ratio": "16:9",
"resolution": "720p",
"duration": 2
}
}' | 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": "wan/2-7-r2v",
"input": {
"prompt": "Рыжий кот в скафандре на фоне Земли, мягкий свет",
"aspect_ratio": "16:9",
"resolution": "720p",
"duration": 2
}
},
).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 | текст | обязательное | wan/2-7-videoedit |
| input | объект | обязательное | Параметры генерации — поля из таблицы ниже |
Поля input
| Поле | Тип | Обяз. | Допустимые значения |
|---|---|---|---|
| video_url | ссылка | обязательное | одна ссылка на видео |
| prompt | текст | опц. | не длиннее 5 000 символов |
| negative_prompt | текст | опц. | не длиннее 500 символов |
| resolution | значение из списка | опц. | 720p · 1080p |
| reference_image | список ссылок | опц. | до 5 ссылок на изображение |
| aspect_ratio | значение из списка | опц. | 16:9 · 9:16 · 1:1 · 4:3 · 3:4 |
| duration | число из списка | опц. | 2 · 3 · 4 · 5 · 6 · 7 · 8 · 9 · 10 |
| audio_setting | значение из списка | опц. | auto · origin |
| prompt_extend | да или нет | опц. | true или false |
| watermark | да или нет | опц. | true или false |
| seed | целое число | опц. | целое от 0 до 2 147 483 647 |
| nsfw_checker | да или нет | опц. | true или false |
Ссылка на исходный файл принимается только полным адресом на 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": "wan/2-7-videoedit",
"input": {
"prompt": "Заменить фон на вечернюю городскую улицу, свет тёплый",
"video_url": "https://example.com/input.mp4",
"aspect_ratio": "16:9",
"resolution": "720p",
"duration": 2
}
}' | 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": "wan/2-7-videoedit",
"input": {
"prompt": "Заменить фон на вечернюю городскую улицу, свет тёплый",
"video_url": "https://example.com/input.mp4",
"aspect_ratio": "16:9",
"resolution": "720p",
"duration": 2
}
},
).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. В теле первого запроса стоят обязательные поля модели и значения из её
перечислений, поэтому он проходит проверку шлюза как есть.
Заменить в нём нужно два значения: свой ключ и ссылки на исходные файлы — адреса example.com стоят заполнителями, файлов по ним нет.
Пример на оболочке разбирает ответ через jq; на Python своего
ничего не нужно, кроме requests.
Остальные модели этого семейства и их поля — в разделе документации Видео.
Что делает нейросеть Wan 2.7
Wan 2.7 — видеомодели Alibaba, объявленные 7 апреля 2026 года набором Wan2.7-Video. В каталоге GEN202 они разложены на 4 режима, а секунда у всех стоит одинаково — от 9 ₽ до 13,5 ₽, и цену двигает только выбранное разрешение.
Wan 2.7 — нейросеть Alibaba: она снимает видео по описанию, по кадру и по образцам, а ещё правит готовое.
Работ здесь 4, и у каждой своё имя в поле model: wan/2-7-text-to-video, wan/2-7-image-to-video, wan/2-7-r2v и wan/2-7-videoedit.
Новый ролик собирают режимы «текст в видео», «картинка в видео» и «по образцу», а «правка видео» переделывает готовое видео по указанию словами.
Обязательное поле у них разное: съёмке нужно описание, правке — ссылка на исходный ролик. Общих полей при этом больше, чем своих: prompt, negative_prompt, resolution, duration, prompt_extend, watermark, seed и nsfw_checker стоят у всех 4 режимов.
Можно ли скачать Wan 2.7 и снять ролик бесплатно
Wan 2.7 работает на стороне Alibaba, а запрос к ней идёт через нас — ставить и настраивать что-либо у себя не нужно. Забирают готовый ролик: под ним в песочнице появляется кнопка «Скачать», и файл приходит в mp4.
Плата считается по расходу: каждая секунда ролика стоит своих денег, и ставку поднимает разрешение. Приветственные кредиты новому счёту начисляют при первом входе, и короткий ролик снимается уже за них. Помесячной платы за доступ нет, а удержание по задаче, закончившейся отказом, возвращается на баланс целиком.
Файлами наружу выложены только ранние выпуски семейства, и считают их на своей видеокарте: какие файлы берут, сколько нужно видеопамяти и сколько идёт расчёт — ниже на этой странице. Ряд выпусков целиком, от 2.1 до 3.0, стоит на странице Wan нейросеть.
Порядок работы общий у всех 4 режимов, а разными выходят только заполненные поля.
- Выберите режим. Переключатель над формой ставит нужный режим, и от него зависит, какие поля появятся в запросе.
- Напишите описание. В поле prompt складывают сцену, а в negative_prompt перечисляют то, чего в кадре быть не должно.
- Приложите файлы режима. Кадры, ролики и звук кладут каждый в своё поле; имена полей стоят в таблице выше.
- Задайте разрешение, длительность и форму кадра. Эти три поля решают, каким выйдет ролик, а разрешение вдобавок двигает ставку за секунду.
- Повторите удачный запуск. Поле seed возвращает прежний результат, когда описание оставляют без изменений.
Запуск Wan на своей видеокарте: ComfyUI, файлы и видеопамять
Наружу выложены два выпуска — Wan 2.1 и Wan 2.2. Код и веса 2.1 разработчик выложил 25 февраля 2025 года, 2.2 — 28 июля того же года, и в тот же день выпуск появился в ComfyUI. Лицензия у обоих Apache 2.0, и коммерческая работа ею разрешена. Выпуски 2.5 и новее считаются на стороне Alibaba, файлами их не выкладывали.
Издание A14B собрано из двух экспертов: первый работает в начале расчёта и строит кадр, второй работает в конце и отвечает за подробности. Веса лежат двумя папками по 53,2 гигабайта — high_noise_model и low_noise_model, — и обе нужны для одного ролика. Издание TI2V-5B лежит одной моделью на 18,63 гигабайта и выдаёт 720P при 24 кадрах в секунду.
В ComfyUI берут не оригинальные файлы, а пересборки: один файл на эксперта у Comfy-Org — 13,31 гигабайта в половинной точности — или семейство GGUF у QuantStack, от 4,94 гигабайта у Q2_K до 14,35 у Q8_0. Кроме самой модели скачивают текстовый кодировщик umt5 и сжимающий блок wan2.2_vae на 1,31 гигабайта. Обе части A14B берут в одной и той же степени сжатия.
Сколько видеопамяти нужно, две стороны называют по-разному, и расходятся они из-за способа запуска: разработчик считает для своего кода, где веса грузятся целиком, ComfyUI — для своей связки, где слои подгружаются по мере надобности.
| Что запускают | Сколько видеопамяти названо | Кто называет |
|---|---|---|
| A14B выпуска 2.2 | не меньше 80 ГБ | разработчик |
| TI2V-5B выпуска 2.2 | не меньше 24 ГБ, в примере RTX 4090 | разработчик |
| TI2V-5B выпуска 2.2 | 8 ГБ при выгрузке средствами ComfyUI | ComfyUI |
| Издание 1.3B выпуска 2.1 | 8,19 ГБ | разработчик |
Время расчёта у практиков расходится в десятки раз, и решает его не карта, а ускоряющая приставка. На RTX 5090 пятисекундный ролик по 14B в исходной точности считался больше получаса, а с четырёхшаговым ускорением — меньше пяти минут. На RTX 4090 обе стадии A14B заняли около четырнадцати минут, на RTX 3060 в половинной точности — около 315 секунд, на ноутбуке с восемью гигабайтами и GGUF Q4_K_S — около 150 секунд. Замеры между собой напрямую не сравниваются: разрешение, число шагов и приставки у всех разные.
Обрывается расчёт по памяти чаще всего на 720p: восемь гигабайт держат 14B ниже этого разрешения, а на нём приходит ошибка нехватки памяти. Двенадцать гигабайт на 14B заканчивались вылетом в самом конце расчёта, и там же измерена цена выгрузки — расход падает вдвое, а расчёт во столько же раз удлиняется. Останавливает работу и обычная память: на 32 гигабайтах оперативной второй проход не запускался.
Издание 5B считает быстро, и это его единственный крупный выигрыш: разборы сходятся в том, что движение у него ограниченнее, в кадре появляются деформации, а текст разваливается.
Своя видеокарта нужна не всегда: тот же кадр считается на стороне модели, и тогда всё делается в браузере, с обычного компьютера или с телефона. Что вышло под именем 2.2 и чем этот выпуск отличается от 2.1 — на странице Wan 2.2, ряд выпусков целиком — на странице Wan нейросеть.
Чем различаются режимы Wan 2.7
Режимы разведены тем, что кладут на вход, и тем, сколько секунд разрешено на выходе.
| Режим | Что делает | Без чего не запустится | Потолок длительности |
|---|---|---|---|
| «текст в видео» | снимает ролик по одному описанию | prompt | 15 секунд |
| «картинка в видео» | делает ролик из кадра, между двумя кадрами или продолжает присланный | prompt | 15 секунд |
| «по образцу» | держит одних и тех же героев по присланным картинкам и роликам | prompt | 10 секунд |
| «правка видео» | переделывает готовый ролик по указанию словами | video_url | 10 секунд |
Файлы разложены по своим полям: у «картинка в видео» это первый кадр, последний кадр, ролик для продолжения и звук, у «по образцу» — два списка по 5 ссылок, картинки и ролики.
Родной звук присланного ролика «правка видео» умеет оставить нетронутым — за это отвечает поле audio_setting, и образцами он берёт до 5 картинок.
Выпуски Wan: даты объявлений и наши адреса
Линейка идёт подряд от выпусков с открытыми весами к тем, что считаются только на стороне Alibaba. В таблице стоит имя у разработчика, дата его собственного объявления, суть перемены и адрес, по которому выпуск открывается у нас.
| Имя у Alibaba | Дата по анонсу | Что изменилось | Наш адрес |
|---|---|---|---|
| Wan2.1 | 25 февраля 2025 | Код и веса выложены наружу, младшему изданию хватает бытовой видеокарты | раздел про запуск у себя на этой странице |
| Wan2.2 | 28 июля 2025 | Расчёт разведён между двумя знатоками, набор для обучения заметно больше | страница Wan 2.2 |
| Wan2.5-Preview | коммерческий запуск 11 ноября 2025 | Звук стал делаться вместе с картинкой, ролик дорос до десяти секунд | — |
| Wan2.6 series | 16 декабря 2025 | Автор попадает в кадр своим лицом и голосом, ролик дорос до пятнадцати секунд | — |
| Wan2.7-Video | 7 апреля 2026 | Четыре модели под разные работы, правка готового ролика словами | эта страница, 4 режима |
| Wan3.0 | общая доступность 24 августа 2026 | Окно генерации выросло вдвое, на вход пошли документы и веб-страницы | карточка Wan 3.0 Video |
Состав нынешнего набора разработчик перечисляет по именам моделей, а дату ставит под заголовком публикации: «April 7, 2026». Что вошло в набор, сказано там же: «Wan2.7-Video supports flexible video generation ranging from 2 to 15 seconds and delivers 720p and 1080p output. Its enterprise APIs enable batch processing and tailored workflows». Перевод наш: «Wan2.7-Video гибко делает ролики от 2 до 15 секунд и выдаёт 720p и 1080p. Её деловые интерфейсы позволяют обрабатывать пачками и строить свой порядок работы». Публикация — объявление Alibaba Cloud о выпуске Wan2.7-Video.
Чем нынешний набор отличается от следующего поколения, разработчик свёл в свою таблицу. В строке про образцы у Wan2.7 стоит «Text, image, video, audio», у Wan3.0 — тот же перечень «plus DOC, XLS, PPT, PDF, TXT, KEY, Pages, Numbers, Markdown, and webpages». Перевод наш: текст, картинка, ролик и звук — против них же плюс документы, таблицы, презентации и веб-страницы. Про правку в той же таблице сказано короче: «Introduced in Wan2.7» и «Carried forward into Wan3.0» — перевод наш: появилась в Wan2.7 и перенесена в Wan3.0. Разбор — сравнение Alibaba «Wan2.7 vs. Wan3.0».
Даты выпусков с открытыми весами взяты из ленты новостей в хранилище кода разработчика: «Feb 25, 2025: 👋 We've released the inference code and weights of Wan2.1» и «Jul 28, 2025: 👋 We've released the inference code and model weights of Wan2.2». Перевод наш: 25 февраля 2025 года выложены код вывода и веса Wan2.1, 28 июля того же года — код вывода и веса Wan2.2. Лента — хранилище кода Wan2.2.
Из этого ряда в каталоге GEN202 продаются два поколения: нынешнее — здесь, четырьмя режимами, и следующее — на странице Wan 3.0 Video. Выпуски до 2.6 разобраны на странице Wan нейросеть.
Какой длины и в каком разрешении выходит ролик Wan 2.7
Потолок длительности задаёт режим: «текст в видео» и «картинка в видео» доходят до 15 секунд, «по образцу» и «правка видео» — до 10.
Из разрешений доступны 720p и 1080p, и они же разводят цену секунды; строки стоят таблицей выше.
Форму кадра выбирают из 5 значений, а поле под неё называется по-разному: у режима «текст в видео» это ratio, у «по образцу» и «правка видео» — aspect_ratio. У режима «картинка в видео» пропорции приходят с присланным кадром.
Что кладут в запрос Wan 2.7 кроме описания
Само описание вмещает до 5 000 знаков. Рядом стоит отрицательное описание — до 500 знаков на то, чего в кадре быть не должно.
Звук в каждом режиме заводится своим полем: audio_url при съёмке по описанию, driving_audio_url при съёмке из кадра, reference_voice при работе по образцам и audio_setting при правке готового.
Повторить прежний результат позволяет поле seed. Что кладётся в тело запроса целиком, разобрано в разделе «Wan».
Что Alibaba говорит о наборе Wan 2.7
Что делает режим из кадра, разработчик пишет первой строкой справочника: «The Wan 2.7 image-to-video model supports multimodal input (text, images, audio, and video) and performs three tasks: first-frame-to-video, first-and-last-frame-to-video, and video continuation». Перевод наш: «Модель Wan 2.7 "картинка в видео" принимает многомодальный вход — текст, картинки, звук и видео — и делает три работы: видео из первого кадра, видео из первого и последнего кадра и продолжение видео». Страница — справочник Alibaba Cloud по режиму из кадра.
Какие связки файлов он принимает, там же перечислено без оговорок: «Only the following asset combinations are valid. Invalid combinations return an error». Перевод наш: «Годятся только перечисленные сочетания материалов, негодное сочетание возвращает ошибку». Дальше идут сами связки: первый кадр либо первый кадр со звуком; первый и последний кадр либо они же со звуком; кусок ролика либо кусок ролика с последним кадром.
Как считается продолжение, объяснено примером: «For example, if duration=15 and the input video is 3 s long, the model generates a 12-s continuation. The final output video is 15 s long and is billed for 15 s». Перевод наш: «Например, при duration=15 и входном ролике в 3 секунды модель снимает продолжение на 12 секунд; готовый ролик выходит на 15 секунд, и счёт выставляется за 15 секунд». Про звук на входе там же: «With audio: The model uses it as a driving source for lip-sync and action timing. Without audio: The model automatically generates matching background music or sound effects» — перевод наш: «Со звуком модель ведёт по нему совпадение губ со словами и отсчёт движения; без звука сама подбирает музыку или шумы».
Сколько идёт работа, разработчик называет сам: «Image-to-video tasks typically take 1 to 5 minutes, so the API uses asynchronous invocation». Перевод наш: «Работа "картинка в видео" обычно занимает от 1 до 5 минут, поэтому обращение к интерфейсу устроено отложенным». Та же фраза про 1–5 минут стоит и в справочниках по правке и по работе с образцами, и это единственное число времени, названное разработчиком.
Правку он описывает так: «The Wan 2.7 video editing model accepts multimodal inputs (text, images, and videos) for instruction-based editing and style transfer». Перевод наш: «Модель правки Wan 2.7 принимает многомодальный вход — текст, картинки и ролики — для правки по указанию и переноса манеры». Что делает поле звука при правке, сказано там же: «origin: Forces the retention of the original audio from the input video without regeneration» — перевод наш: «origin: родной звук присланного ролика сохраняется принудительно, без пересоздания». Страница — справочник по правке видео Wan2.7.
Работу по образцам он объясняет отдельной строкой: «Wan-R2V accepts multimodal input (images, videos, and audio) to generate videos featuring one or more characters while preserving their appearance and voice across scenes». Перевод наш: «Wan-R2V принимает многомодальный вход — картинки, ролики и звук — и делает ролики с одним или несколькими героями, сохраняя их внешность и голос от сцены к сцене». Про старшинство звука там же: «If both reference_video (with audio) and reference_voice are provided, reference_voice takes precedence and overrides the original video audio» — перевод наш: «Если переданы и ролик-образец со звуком, и reference_voice, берётся reference_voice, и он перекрывает родной звук ролика». Страница — справочник по работе с образцами Wan2.7.
Про повторяемость разработчик предупреждает прямо: «Because model generation is probabilistic, the same seed does not guarantee identical results». Перевод наш: «Модель работает вероятностно, поэтому одно и то же значение seed не гарантирует одинакового результата». Поле seed в форме GEN202 есть у всех режимов.
Свою цену за секунду Alibaba печатает прайсом по регионам: у строки wan2.7-t2v для международных регионов стоит «720P | $0.10/second» и «1080P | $0.15/second», а рядом бесплатный остаток «50 seconds». Перевод наш: 0,10 доллара за секунду в 720p, 0,15 в 1080p и 50 бесплатных секунд. Те же две цены стоят у остальных трёх режимов набора. В таблице цен GEN202 официальной ценой 720p стоит $0.1 за секунду, а 1080p — $0.15: с прайсом разработчика это сходится число в число. Прайс лежит по адресу страница цен Alibaba Cloud Model Studio.
Правило счёта у правки и работы по образцам он выписывает отдельно: «Pricing rule: both input and output videos are billed by video duration (seconds). Failed requests are not billed and do not consume the free quota». Перевод наш: «И входной, и выходной ролик считаются по длительности в секундах. Неудавшиеся запросы не оплачиваются и бесплатный остаток не расходуют». У нас удержание по неудавшейся задаче возвращается на баланс целиком, и это видно под таблицей цен выше.
Сам с собой разработчик здесь расходится: в разборе «Wan2.7 vs. Wan3.0» от 27 августа 2026 года в строке про цену у прошлого поколения стоит «Not stated in the public materials» — перевод наш: «в открытых материалах не названа», — хотя на его же прайсе цена Wan2.7 за секунду напечатана.
Слова Alibaba о наборе Wan 2.7 приведены по страницам Alibaba Cloud на 15 сентября 2026 года.
Что показали независимые проверки Wan 2.7
Выпуски линейки сравнивает между собой LMArena: человеку показывают два ролика без имён и просят выбрать лучший. В арене «картинка в видео» у строки wan2.7-i2v стоит 1426 с допуском 5 при 80 260 голосах, у wan2.5-i2v-preview — 1321 при 16 913 голосах, у wan2.6-i2v — 1310 при 116 288, у открытой wan-v2.2-a14b — 1170 при 27 054. Числа Wan взяты из таблицы — арена «картинка в видео» на LMArena.
Числа эти стоит читать как сравнение поколений: между нынешним и тем, что выложено файлами наружу, разрыв больше двухсот пятидесяти пунктов, а между нынешним и двумя предыдущими — около сотни.
Письменный разбор с прогонами вышел на vc.ru 11 апреля 2026 года, через четыре дня после объявления. Время работы там названо числом: «Зависит от настроек. 5-секундный ролик в 720p генерируется за 1–3 минуты». Это сходится с тем, что пишет о своей стороне разработчик. Разбор — «WAN 2.7 — нейросеть для генерации видео: полный обзор и гайд».
Где ломалось, в том же разборе сказано прямо: «Дрейф лица на длинных видео. На роликах 10+ секунд лицо может постепенно меняться. Решение: используйте First-Last Frame контроль с одинаковым лицом на обоих кадрах. Или генерируйте короткие клипы (5–7 секунд) и монтируйте». И второе: «Артефакты "скользящего окна". На длинных генерациях иногда заметны швы между сегментами. Решение: выбирайте длительность 5–10 секунд для максимального качества. 15 секунд — это потолок, но не всегда оптимально».
Числа арены и разбор vc.ru о Wan 2.7 приведены на 15 сентября 2026 года.
Что в Wan 2.7 получается не с первого прогона
Справочники описывают поля запроса. Ниже — то, что всплывает уже на работе: какие сцены даются модели труднее и чем это правят.
Наблюдения о Wan 2.7 взяты из разборов с живыми прогонами: charcoal to checkpoint, 6 апреля 2026, Ai-techboom, 6 апреля 2026, Get Songs Done, 6 апреля 2026, DexNotDexter, 14 апреля 2026, Roboverse, 30 апреля 2026, Creative AI Show, 15 июля 2026.
- Быстрое движение и всё, что подчиняется физике, даётся труднее прочего: вода летит отдельно от того, кто её стряхивает, дождь застывает в воздухе, предмет в руке гнётся. Драку и бег надёжнее разложить на короткие куски с одним действием.
- Одно и то же свободное описание от прогона к прогону даёт разное. Надёжнее держать постоянный порядок — кто в кадре, что делает, как стоит камера, какой свет — и менять потом по одному слою.
- Описание с пятью действиями героя подряд выходит дёрганым, и часть заказанного в ролик не попадает. Одно действие на ролик модель выполняет точнее.
- Когда на входе свой кадр, слова про внешность мешают: возраст, цвет волос и одежды заставляют модель переписать то, что на картинке уже есть. В описании оставляют движение камеры и действие.
- В режиме из кадра оживает только то, что в кадре уже есть. Просьба про то, чего не видно, либо пропускается, либо дорисовывается наугад.
- Когда заданы и первый кадр, и последний, на середине бывает скачок, а переход к последнему выходит резким. Помогает сблизить кадры по построению и назвать движение камеры словами.
- Правка уверенно берёт одежду, свет и обстановку, а перестановка предметов в кадре и выражение лица даются ей хуже. Просить её стоит как изменение — «замени обстановку на уличное кафе, героя оставь как есть», — а не описанием желаемой картинки целиком.
- Вместе с заказанной правкой меняется и то, о чём не просили: с новой одеждой у героя уезжает лицо. В описании поэтому прямо перечисляют, что должно остаться нетронутым.
- Образцом героя надёжнее подать один чёткий лист с ним, чем набор роликов: из нескольких образцов один может просто не попасть в результат.
- Продолжение стыкуется с исходным роликом без шва: и манера съёмки, и голос переезжают в новый кусок.
Отсюда обычный порядок работы: сначала короткий кусок с одним действием, потом продолжение от его последнего кадра. Сцена набирается частями, и переснимать приходится только испорченную.
Рубли в таблице выше — цены GEN202, сервиса доступа к моделям с оплатой из России; у Alibaba Cloud свой прайс, в долларах. Что входит в кредит и как его пополняют, написано на странице цен.