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).

кр. — кредиты, покупаются за рубли.

Model

Статус

не поддерживается

Статус

не поддерживается

Статус

не поддерживается

Статус

не поддерживается

Песочница

Input

Ещё настройки

Чтобы создать видео — войдите и получите 50 кредитов на тесты и любое использование сервиса.

{
  "model": "wan/2-7-text-to-video",
  "input": {
    "prompt": "Рыжий кот в скафандре на фоне Земли, мягкий свет",
    "resolution": "720p",
    "duration": 2
  }
}
Output

Нажмите «Запустить» — готовый ролик появится здесь

Ролик делается минуты. Задача живёт не дольше 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
  }
}
Input

Ещё настройки

Чтобы создать видео — войдите и получите 50 кредитов на тесты и любое использование сервиса.

{
  "model": "wan/2-7-image-to-video",
  "input": {
    "prompt": "Рыжий кот в скафандре на фоне Земли, мягкий свет",
    "resolution": "720p",
    "duration": 2
  }
}
Output

Нажмите «Запустить» — готовый ролик появится здесь

Ролик делается минуты. Задача живёт не дольше 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
  }
}
Input

Ещё настройки

Чтобы создать видео — войдите и получите 50 кредитов на тесты и любое использование сервиса.

{
  "model": "wan/2-7-r2v",
  "input": {
    "prompt": "Рыжий кот в скафандре на фоне Земли, мягкий свет",
    "aspect_ratio": "16:9",
    "resolution": "720p",
    "duration": 2
  }
}
Output

Нажмите «Запустить» — готовый ролик появится здесь

Ролик делается минуты. Задача живёт не дольше 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
  }
}
Input

Ещё настройки

Чтобы создать видео — войдите и получите 50 кредитов на тесты и любое использование сервиса.

{
  "model": "wan/2-7-videoedit",
  "input": {
    "prompt": "Заменить фон на вечернюю городскую улицу, свет тёплый",
    "video_url": "https://example.com/input.mp4",
    "aspect_ratio": "16:9",
    "resolution": "720p",
    "duration": 2
  }
}
Output

Нажмите «Запустить» — готовый ролик появится здесь

Ролик делается минуты. Задача живёт не дольше 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

POST https://api.gen202.com/api/v1/jobs/createTask
GET https://api.gen202.com/api/v1/jobs/recordInfo?taskId=…

Ролик делается минуты, поэтому файл не приходит в ответ на запрос. Первый вызов ставит задачу и сразу отвечает её номером, второй по этому номеру отдаёт состояние задачи, а когда она готова — ссылку на результат. Ключ передаётся в обоих запросах заголовком 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 Поломка на нашей стороне. Подробности остаются в журнале шлюза и наружу не уходят.

Пример вызова

task.sh
# 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'
task.py
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.

POST https://api.gen202.com/api/v1/jobs/createTask
GET https://api.gen202.com/api/v1/jobs/recordInfo?taskId=…

Ролик делается минуты, поэтому файл не приходит в ответ на запрос. Первый вызов ставит задачу и сразу отвечает её номером, второй по этому номеру отдаёт состояние задачи, а когда она готова — ссылку на результат. Ключ передаётся в обоих запросах заголовком 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 Поломка на нашей стороне. Подробности остаются в журнале шлюза и наружу не уходят.

Пример вызова

task.sh
# 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'
task.py
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.

POST https://api.gen202.com/api/v1/jobs/createTask
GET https://api.gen202.com/api/v1/jobs/recordInfo?taskId=…

Ролик делается минуты, поэтому файл не приходит в ответ на запрос. Первый вызов ставит задачу и сразу отвечает её номером, второй по этому номеру отдаёт состояние задачи, а когда она готова — ссылку на результат. Ключ передаётся в обоих запросах заголовком 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 Поломка на нашей стороне. Подробности остаются в журнале шлюза и наружу не уходят.

Пример вызова

task.sh
# 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'
task.py
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.

POST https://api.gen202.com/api/v1/jobs/createTask
GET https://api.gen202.com/api/v1/jobs/recordInfo?taskId=…

Ролик делается минуты, поэтому файл не приходит в ответ на запрос. Первый вызов ставит задачу и сразу отвечает её номером, второй по этому номеру отдаёт состояние задачи, а когда она готова — ссылку на результат. Ключ передаётся в обоих запросах заголовком 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 Поломка на нашей стороне. Подробности остаются в журнале шлюза и наружу не уходят.

Пример вызова

task.sh
# 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'
task.py
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 режимов, а разными выходят только заполненные поля.

  1. Выберите режим. Переключатель над формой ставит нужный режим, и от него зависит, какие поля появятся в запросе.
  2. Напишите описание. В поле prompt складывают сцену, а в negative_prompt перечисляют то, чего в кадре быть не должно.
  3. Приложите файлы режима. Кадры, ролики и звук кладут каждый в своё поле; имена полей стоят в таблице выше.
  4. Задайте разрешение, длительность и форму кадра. Эти три поля решают, каким выйдет ролик, а разрешение вдобавок двигает ставку за секунду.
  5. Повторите удачный запуск. Поле 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.28 ГБ при выгрузке средствами ComfyUIComfyUI
Издание 1.3B выпуска 2.18,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

Режимы разведены тем, что кладут на вход, и тем, сколько секунд разрешено на выходе.

РежимЧто делаетБез чего не запуститсяПотолок длительности
«текст в видео»снимает ролик по одному описаниюprompt15 секунд
«картинка в видео»делает ролик из кадра, между двумя кадрами или продолжает присланныйprompt15 секунд
«по образцу»держит одних и тех же героев по присланным картинкам и роликамprompt10 секунд
«правка видео»переделывает готовый ролик по указанию словамиvideo_url10 секунд

Файлы разложены по своим полям: у «картинка в видео» это первый кадр, последний кадр, ролик для продолжения и звук, у «по образцу» — два списка по 5 ссылок, картинки и ролики.

Родной звук присланного ролика «правка видео» умеет оставить нетронутым — за это отвечает поле audio_setting, и образцами он берёт до 5 картинок.

Выпуски Wan: даты объявлений и наши адреса

Линейка идёт подряд от выпусков с открытыми весами к тем, что считаются только на стороне Alibaba. В таблице стоит имя у разработчика, дата его собственного объявления, суть перемены и адрес, по которому выпуск открывается у нас.

Имя у AlibabaДата по анонсуЧто изменилосьНаш адрес
Wan2.125 февраля 2025Код и веса выложены наружу, младшему изданию хватает бытовой видеокартыраздел про запуск у себя на этой странице
Wan2.228 июля 2025Расчёт разведён между двумя знатоками, набор для обучения заметно большестраница Wan 2.2
Wan2.5-Previewкоммерческий запуск 11 ноября 2025Звук стал делаться вместе с картинкой, ролик дорос до десяти секунд
Wan2.6 series16 декабря 2025Автор попадает в кадр своим лицом и голосом, ролик дорос до пятнадцати секунд
Wan2.7-Video7 апреля 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 свой прайс, в долларах. Что входит в кредит и как его пополняют, написано на странице цен.

Официальный канал Alibaba Cloud — объявление о выпуске от 3 апреля 2026 года: правка готового ролика по указанию и удержание облика персонажей между кадрами. Идёт меньше двух минут.

Частые вопросы

Как вызвать Wan 2.7 через API из России?
Запрос уходит на api.gen202.com, и это адрес GEN202, а не адрес Alibaba: обращения за границу в вызове Wan 2.7 нет, поэтому VPN не требуется. В поле model уходит идентификатор выбранного варианта: текст в видео (wan/2-7-text-to-video), картинка в видео (wan/2-7-image-to-video), по образцу (wan/2-7-r2v), правка видео (wan/2-7-videoedit). Порядок вызова Wan 2.7 с примерами кода разобран в документации.
Сколько стоит Wan 2.7
Цена за секунду Wan 2.7 — от 18 кр. (9 ₽ · $0.09) до 27 кр. (13,5 ₽ · $0.135). У Wan 2.7 списывается фактический расход, а задача, завершившаяся ошибкой, не тарифицируется вовсе.
Нужны ли VPN и иностранная карта для Wan 2.7
Ни то, ни другое: обращение к Wan 2.7 идёт на наш адрес, а расчёты с Alibaba ведём мы, поэтому договариваться с ним клиенту не о чем. Оплата рублями с карты российского банка.
Что Wan 2.7 принимает на вход
Обязательные поля запроса к Wan 2.7: Текст в видео — prompt — от 1 до 5 000 символов. Картинка в видео — prompt — от 1 до 5 000 символов. По образцу — prompt — от 1 до 5 000 символов. Правка видео — video_url — одна ссылка на видео. Остальные поля необязательны.
Как подключить Wan 2.7 API и сделать первый вызов
Войти на сайт и выпустить ключ в кабинете: при первом входе начисляется 50 кредитов, и этот же ключ открывает Wan 2.7 вместе с остальным каталогом. Собственного ключа Alibaba и договора с ним для вызова Wan 2.7 не нужно.
Какая компания разработала Wan 2.7
Wan 2.7 разработала Alibaba: набор Wan2.7-Video объявлен 7 апреля 2026 года. В нём четыре работы — ролик по описанию, ролик из картинки, ролик по образцам и правка готового видео.