Skip to content

Wan

Wan (Tongyi Wanxiang) — семейство видео-моделей Alibaba, обслуживаемое каналами DashScope. Задачи проходят через те же эндпоинты, что и любая другая видеомодель — см. Создание задачи и Получение задачи. Эта страница полностью описывает адаптер Wan 3.0: какие поля запроса он читает, как строит запрос DashScope, правила для материалов, как читать запись задачи и как рассчитывается оплата по секундам.

Генерация видео асинхронна: отправьте задачу, сохраните task_id, опрашивайте каждые 10–15 секунд и скачайте результат, когда статус станет SUCCESS.

Model IDРазрешенияДлительностьПримечания
wan3.0-video480P, 720P, 1080P2–30 секунд или -1 (умная)Стандартная модель: текст в видео, первый/последний кадр, множественные референсы
wan3.0-video-prime480P, 720P, 1080P2–30 секунд или -1 (умная)Более быстрый вариант с теми же возможностями

Обе по умолчанию используют 1080P и 5 секунд, когда запрос их не задаёт. Обе поддерживают текст в видео, изображение в видео с первым кадром и с первым и последним кадром, референсные изображения, видео и аудио, монтаж и удлинение видео. ID моделей — те, что возвращает GET /v1/models; доступные вашему аккаунту модели и их цены задаются в консоли RouteAPI.

Канал также обслуживает старые модели Wan 2.x (wan2.7-i2v, wan2.7-t2v, wan2.5-i2v-preview, wan2.2-*, wanx2.1-*), правила которых отличаются и здесь не рассматриваются.

Отображение общего конверта

Section titled “Отображение общего конверта”
Поле конвертаЧто делает адаптер Wan 3.0
promptОтправляется как input.prompt. Как и в любом запросе задачи, пустой prompt отклоняется с 400 до отправки
image / imagesПервым кадром становится image, если он задан, иначе первый непустой элемент images; последним — второй непустой элемент images. Всё после первых двух изображений игнорируется
input_referenceСокращение для одного изображения: заменяет массив images одним URL, но для первого кадра image верхнего уровня всё равно важнее
resolutionОтправляется как parameters.resolution, приводится к верхнему регистру и при необходимости получает суффикс P
ratioОтправляется как parameters.ratio, приводится к нижнему регистру
sizeСвёртывается в resolution и ratio, затем удаляется. 1920x1080 и 1920*1080 принимаются; размер в формате * вне таблицы даёт 400, а простой уровень вроде 720p используется как разрешение
durationОтправляется как parameters.duration. Отсутствующее значение становится 5
secondsРазбирается как целая длительность, когда duration отсутствует
generate_audioОтправляется как parameters.audio; явный false передаётся как есть
metadataНакладывается на построенный запрос, поэтому metadata.parameters.* и metadata.input.* переопределяют сопоставленные значения

Если заданы оба, явные resolution / ratio важнее значений, выведенных из size; size всегда удаляется из тела запроса к провайдеру. Затем адаптер отправляет input, parameters и model на эндпоинт синтеза видео DashScope — вызывать его самостоятельно не нужно.

Поскольку тело использует структуру DashScope, те же значения можно передать в metadata:

{
"metadata": {
"input": { "negative_prompt": "blurry, low quality" },
"parameters": { "duration": 10, "resolution": "720p", "ratio": "9:16" }
}
}

metadata не может изменить модель: metadata.model, отличный от разрешённой upstream-модели, отклоняется с 400.

Эти поля можно записывать на верхнем уровне тела запроса. Ключи конкретной модели помещаются в metadata.

ПолеТипЗначенияПримечания
modelstringwan3.0-video, wan3.0-video-primeОбязательно
promptstring—Обязательно и не пусто. В режиме референсов материалы обозначаются как «image 1», «video 1», «audio 1»
resolutionstring480P, 720P, 1080PБез учёта регистра, завершающий P необязателен. По умолчанию 1080P
ratiostringadaptive, 21:9, 16:9, 4:3, 1:1, 3:4, 9:16Без учёта регистра. Если не задан, DashScope применяет adaptive
sizestring1280*720, 1280x720 или 720pСвёртывается в resolution и ratio, затем удаляется. Принимаются только размеры из таблицы адаптера
durationinteger2–30Секунды вывода. По умолчанию 5. Отрицательное значение или больше 3600 отклоняется общей проверкой задачи; -1 (умная длительность) работает только в metadata.parameters
secondsstringцелая строкаИспользуется вместо duration, когда тот отсутствует или равен 0. Нецелое значение даёт 400
imagestringURLОдно изображение первого кадра; для первого кадра оно важнее images
imagesarrayURL1 изображение — первый кадр; 2 изображения — первый, затем последний кадр
input_referencestringURLЗаменяет images одним URL первого кадра; для первого кадра image верхнего уровня важнее
generate_audiobooleantrue / falseОтправляется как parameters.audio; явный false передаётся как false
metadataobjectinput / parameters DashScopeПереопределяет сопоставленные значения; см. ниже

Если size — пара ШИРИНА*ВЫСОТА, она должна присутствовать в таблице адаптера: 480P принимает 832*480, 480*832, 624*624; 720P — 1280*720, 720*1280, 960*960, 1088*832, 832*1088; 1080P — 1920*1080, 1080*1920, 1440*1440, 1632*1248, 1248*1632. Соотношение вычисляется сокращением пары и сохраняется, только если совпадает с одним из поддерживаемых значений; иначе запрос остаётся на усмотрение соотношения DashScope по умолчанию.

metadata повторяет объекты input и parameters DashScope. Все ключи ниже необязательны.

Ключ metadataТипПримечания
input.mediaarrayСписок материалов из элементов {"type", "url"}. Если задан, изображения верхнего уровня не используются
input.promptstringЗаменяет prompt верхнего уровня для провайдера, но общая проверка всё равно требует prompt верхнего уровня
input.audio_urlstringСокращение для добавления элемента reference_audio
input.negative_promptstringНегативный prompt
input.templatestringШаблон эффекта DashScope, передаётся как есть
parameters.resolutionstringТо же, что resolution верхнего уровня
parameters.ratiostringТо же, что ratio верхнего уровня
parameters.sizestringТо же, что size верхнего уровня
parameters.durationinteger-1 для умной длительности, иначе 2–30
parameters.audiobooleanТо же, что generate_audio
parameters.seedinteger-1 или 0–2147483647. 0 сохраняется как явное значение; одинаковый seed не гарантирует одинаковый результат
parameters.watermarkbooleanВодяной знак провайдера; выключен по умолчанию
parameters.prompt_extendbooleanПринимается, но не действует — переписывание prompt всегда включено (см. ниже)

Значения в metadata.parameters.* важнее эквивалентов верхнего уровня. Неизвестные ключи в metadata игнорируются, а ключ с неверным типом даёт 400 до какой-либо резервации.

prompt_extend нельзя отключить. На верхнем уровне такого поля нет, поэтому prompt_extend верхнего уровня просто игнорируется; в metadata.parameters адаптер всегда начинает с true, а поле хранится в bool без указателя с omitempty, поэтому false отбрасывается при отправке в DashScope и применяется значение провайдера по умолчанию (включено). Передавайте его только чтобы повторить значение по умолчанию; это ничего не меняет.

Wan 3.0 принимает материалы через input.media — массив элементов {"type": "...", "url": "..."}. Адаптер строит его из полей изображений верхнего уровня и добавляет то, что вы передали явно:

typeЗначениеЛимит (DashScope)
first_frameПервый кадр видео1
last_frameПоследний кадр видео; требует первого кадра1
reference_imageРеференсное изображение для субъекта или стиля10
reference_videoРеференсное видео для генерации, монтажа или удлинения5, всего 15 секунд
reference_audioРеференсное аудио. input.audio_url добавляется с этим типом5, всего 15 секунд

Массив media, явно переданный в metadata.input.media, сохраняется как есть; если его нет, адаптер строит его из полей изображений верхнего уровня в порядке first_frame, last_frame. Этот запасной путь также читает старые ключи metadata.input.img_url / first_frame_url / last_frame_url, а metadata.input.audio_url всегда добавляет элемент reference_audio. Все четыре старых поля сворачиваются в media и затем очищаются — Wan 3.0 понимает только media.

Количества и длительности в таблице выше — правила DashScope. RouteAPI их не проверяет заранее; нарушение отклоняется провайдером и возвращается — либо как ошибка fail_to_fetch_task, либо как задача FAILURE, но не как локальный 400.

Правила материалов:

  • URL материалов должны быть публично доступными для скачивания адресами http(s) без авторизации. Изображения также можно передавать как data:image/png;base64,....
  • Ограничения на элемент: изображения JPEG / JPG / PNG (без альфа-канала) / BMP / WEBP, 240–8000 px по стороне, соотношение сторон не более 8:1, не более 20 МБ; видео mp4 / mov, по 1–15 секунд, не менее 16 fps, 240–4096 px по стороне, не более 100 МБ; аудио wav / mp3, по 1–15 секунд, не более 15 МБ.
  • Режим первого/последнего кадра и режим референсных материалов взаимоисключающие. Смешение кадров с элементами reference_* в одном массиве media отклоняется провайдером: задача возвращается.
  • reference_image, reference_video и reference_audio свободно комбинируются.
  • В prompt ссылайтесь на материалы по порядковому номеру — «image 1», «video 1», «audio 1» — счёт по типу в порядке элементов media.

Два правила проверяются локально, до отправки: ни провайдер, ни баланс не затрагиваются.

  • metadata.input.audio_url вместе с элементом first_frame или last_frame отклоняется с 400 и сообщением wan3 does not support audio_url together with first/last frame images. Проверка смотрит только на input.audio_url; элемент reference_audio, помещённый прямо в media рядом с кадром, перехватывает DashScope (задача FAILURE, возврат).
  • После слияния metadata запрос с пустым prompt и пустым массивом media отклоняется с 400 (wan3 requires prompt or input.media). На практике общая проверка задачи уже отклоняет пустой prompt, поэтому prompt обязателен всегда.

Только prompt и параметры видео:

Terminal window
curl https://api.routeapi.ai/v1/video/generations \
-H "Authorization: Bearer $ROUTEAPI_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "wan3.0-video",
"prompt": "An orange cat walking on a rooftop, cinematic lighting",
"resolution": "480P",
"ratio": "16:9",
"duration": 2
}'

Первый и последний кадр

Section titled “Первый и последний кадр”

Поместите изображения в массив images верхнего уровня: одно изображение — первый кадр, два — первый и последний кадр в этом порядке.

Terminal window
curl https://api.routeapi.ai/v1/video/generations \
-H "Authorization: Bearer $ROUTEAPI_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "wan3.0-video",
"prompt": "The scene shifts naturally from morning to sunset while the camera moves smoothly",
"images": [
"https://cdn.example.com/first.jpg",
"https://cdn.example.com/last.jpg"
],
"resolution": "720P",
"ratio": "adaptive",
"duration": 5
}'

Можно также описать кадры в metadata.input.media с явным type; last_frame всегда отправляется вместе с first_frame.

Референсное изображение + видео + аудио

Section titled “Референсное изображение + видео + аудио”

Для референсных материалов запишите каждый элемент в metadata.input.media. Как только media присутствует, поля изображений верхнего уровня игнорируются.

Terminal window
curl https://api.routeapi.ai/v1/video/generations \
-H "Authorization: Bearer $ROUTEAPI_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "wan3.0-video",
"prompt": "The character in image 1 performs the motion from video 1, dancing to the rhythm of audio 1",
"resolution": "720P",
"ratio": "adaptive",
"duration": 8,
"metadata": {
"input": {
"media": [
{ "type": "reference_image", "url": "https://cdn.example.com/character.jpg" },
{ "type": "reference_video", "url": "https://cdn.example.com/motion.mp4" },
{ "type": "reference_audio", "url": "https://cdn.example.com/music.mp3" }
]
}
}
}'

Запрос с элементом reference_video резервирует 30 секунд при отправке независимо от запрошенной длительности, потому что итоговая длина вывода в этот момент неизвестна — см. Оплата.

Монтаж и удлинение видео

Section titled “Монтаж и удлинение видео”

Оба режима передают исходное видео как reference_video и выражают намерение в prompt.

  • Монтаж — например, «полностью преобразовать video 1 в стиль пластилиновой анимации». Передайте ratio: "adaptive", чтобы вывод сохранил соотношение сторон исходника.
  • Удлинение — например, «продлить video 1 вперёд, сохранив движение персонажа и стиль камеры». ratio должен быть adaptive. Укажите в duration длину исходника плюс удлинение: 5-секундное видео, удлинённое на 2 секунды, — это 7. Можно также указать -1 и позволить модели решить.

При наличии видеовхода длина исходного видео плюс длина вывода не может превышать 30 секунд. Ограничение применяет DashScope; запрос, который его нарушает, завершается ошибкой и возвращается.

Terminal window
curl https://api.routeapi.ai/v1/video/generations \
-H "Authorization: Bearer $ROUTEAPI_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "wan3.0-video",
"prompt": "Convert video 1 entirely into a claymation style",
"resolution": "480P",
"ratio": "adaptive",
"duration": 2,
"metadata": {
"input": {
"media": [ { "type": "reference_video", "url": "https://cdn.example.com/input.mp4" } ]
}
}
}'

Чтобы удлинить тот же 5-секундный клип на 2 секунды, измените prompt и длительность:

Terminal window
curl https://api.routeapi.ai/v1/video/generations \
-H "Authorization: Bearer $ROUTEAPI_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "wan3.0-video",
"prompt": "Extend video 1 forward by two seconds, keeping the character motion and camera style consistent",
"resolution": "480P",
"ratio": "adaptive",
"duration": 7,
"metadata": {
"input": {
"media": [ { "type": "reference_video", "url": "https://cdn.example.com/input.mp4" } ]
}
}
}'

При умной длительности длину выбирает модель. Передайте -1 в metadata.parameters.duration; отрицательный duration верхнего уровня отклоняется общей проверкой задачи с invalid_seconds.

Terminal window
curl https://api.routeapi.ai/v1/video/generations \
-H "Authorization: Bearer $ROUTEAPI_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "wan3.0-video",
"prompt": "An orange cat walking on a rooftop, cinematic lighting",
"resolution": "480P",
"ratio": "16:9",
"metadata": { "parameters": { "duration": -1 } }
}'

Задача с умной длительностью резервирует 30 секунд при отправке и рассчитывается по фактической длине вывода при завершении.

Terminal window
curl https://api.routeapi.ai/v1/video/generations/task_FQvcRkHE9wjSWwyISDcrWCKoqCPNdkCx \
-H "Authorization: Bearer $ROUTEAPI_KEY"
{
"code": "success",
"message": "",
"data": {
"id": 4512,
"created_at": 1792412645,
"updated_at": 1792412780,
"task_id": "task_FQvcRkHE9wjSWwyISDcrWCKoqCPNdkCx",
"platform": "17",
"user_id": 1024,
"group": "default",
"channel_id": 18,
"quota": 50000,
"action": "textGenerate",
"status": "SUCCESS",
"progress": "100%",
"fail_reason": "",
"result_url": "https://dashscope-result.oss.example/video.mp4",
"submit_time": 1792412645,
"start_time": 1792412650,
"finish_time": 1792412780,
"properties": {
"input": "",
"origin_model_name": "wan3.0-video",
"upstream_model_name": "wan3.0-video"
},
"data": {
"request_id": "42a9c287-db7b-9edb-b613-xxxxxxxx",
"output": {
"task_id": "dd40fcb4-34f4-4292-a9e0-xxxxxxxx",
"task_status": "SUCCEEDED",
"video_url": "https://dashscope-result.oss.example/video.mp4",
"orig_prompt": "An orange cat walking on a rooftop, cinematic lighting"
},
"usage": {
"video_count": 1,
"duration": 2,
"input_video_duration": 0,
"output_video_duration": 2,
"fps": 30,
"SR": 480,
"ratio": "16:9"
}
}
}
}

Внешние поля принадлежат RouteAPI. Доверяйте data.status; data.progress для Wan — лишь грубый маркер этапа (20% в очереди, 30% генерация, 100% завершено), а не реальный процент провайдера. data.quota — сумма, списанная к этому моменту; после успешной задачи она отражает рассчитанную сумму. data.action равен generate, если запрос содержал поле изображения верхнего уровня (image, images или input_reference), иначе textGenerate.

data.data — это исходная нагрузка задачи DashScope, сохранённая как есть. Полезные поля:

ПолеЗначение
data.data.output.task_idID задачи DashScope, отличается от внешнего data.task_id
data.data.output.video_urlURL видео провайдера; совпадает с внешним data.result_url
data.data.output.orig_promptPrompt, полученный DashScope
data.data.usage.output_video_durationФактические секунды вывода — именно они оплачиваются
data.data.usage.input_video_durationСекунды входного видео; бесплатно. 0 для текста в видео
data.data.usage.durationСекунды входа + вывода; только справочно, никогда не используется в расчёте
data.data.usage.SRФактический уровень разрешения (480, 720, 1080); используется в расчёте
data.data.usage.fpsЧастота кадров вывода, 30 для этих моделей
data.data.usage.ratioФактическое соотношение сторон. При adaptive — соотношение исходника, например 427:240

data.data может быть неполным до завершения задачи, поэтому судите о завершении по data.status, а не по наличию usage.

Статусы: NOT_START и QUEUED — продолжайте опрос, IN_PROGRESS — идёт генерация, SUCCESS — скачивайте, FAILURE — читайте fail_reason; зарезервированная сумма уже возвращена.

data.result_url указывает на файл, размещённый Alibaba. Этот URL временный — Alibaba делает его недействительным по своему графику, поэтому скачивайте сразу; либо передавайте через RouteAPI, что не зависит от оставшегося срока жизни URL:

Terminal window
curl -L -o out.mp4 \
https://api.routeapi.ai/v1/videos/task_FQvcRkHE9wjSWwyISDcrWCKoqCPNdkCx/content \
-H "Authorization: Bearer $ROUTEAPI_KEY"

Эндпоинт контента отдаёт данные только для завершённых задач вызывающего: незавершённая задача — 400 с текущим статусом в сообщении, неизвестный или чужой task_id — 404, ошибка получения у провайдера — 502. Полный список ошибок см. в Получение задачи. Действующий result_url можно также напрямую использовать как reference_video или reference_image следующего запроса.

Сопоставление статусов

Section titled “Сопоставление статусов”
Статус DashScopeСтатус записи задачи
PENDINGQUEUED
RUNNINGIN_PROGRESS
SUCCEEDEDSUCCESS
FAILED, CANCELED, UNKNOWNFAILURE

Wan 3.0 оплачивается за секунду вывода с множителем по разрешению. Цена в консоли — это цена за секунду для 480P; остальные уровни равны этой цене, умноженной на коэффициент разрешения модели, по умолчанию 1 : 2 : 4 для 480P : 720P : 1080P.

И резервация, и финальное списание считаются одинаково:

base quota = model price (per 480P second) × group ratio
reserved quota = base quota × reserved seconds × resolution ratio
settled quota = min(base quota × output seconds × effective ratio, reserved quota)

Действующий коэффициент — коэффициент запрошенного уровня, либо, если DashScope сообщает более низкий SR, коэффициент нижнего уровня. Он никогда не повышается выше запрошенного уровня.

Резервация и расчёт:

ЗапросРезерв при отправкеПри завершении
Явная длительность, без reference_videoзапрошенные секундыфактические секунды вывода
Содержит элемент reference_video30 секундфактические секунды вывода, разница возвращается
metadata.parameters.duration: -1 (умная длительность)30 секундфактические секунды вывода, разница возвращается

Правила расчёта, проверенные в адаптере:

  • Оплачивается только usage.output_video_duration. Секунды входного видео, референсные изображения и аудио, а также первый/последний кадры бесплатны, и генерация аудио не меняет цену.
  • Цена за единицу — та, что зафиксирована при отправке. Изменение цены в консоли во время выполнения задачи на неё не влияет; резервация остаётся как была списана.
  • Расчёт только возвращает. Задача, сообщающая больше секунд, чем зарезервировано, более высокий SR или некорректный usage, сохраняет резервацию вместо дополнительного списания; отсутствие usage у успешной задачи также сохраняет резервацию.
  • Неуспешная задача — отклонение модерацией, таймаут провайдера, отмена — возвращает резервацию. 400 отклоняется до отправки и никогда не списывает средства.
  • Запросам, резервирующим 30 секунд, нужен баланс или квота ключа, достаточные для этой резервации, иначе отправка отклоняется с 403 insufficient_user_quota.

Ответ на отправку содержит заголовок X-New-Api-Other-Ratios с применёнными множителями, например {"resolution-1080P":4,"seconds":5} для запроса 1080P на 5 секунд. Для запроса с референсным видео или умной длительностью seconds равен 30.

Пример (цены гипотетические; реальные смотрите в консоли). Предположим, модель стоит $0.05 за секунду 480P, значит 720P — $0.10, 1080P — $0.20 по таблице 1 : 2 : 4, а коэффициент группы равен 1:

  1. Запрос 1080P, duration: 5. Резерв: 0.20 × 5 = $1.00.
  2. DashScope сообщает usage.SR: 720 и output_video_duration: 5 — вывод на уровень ниже. Расчёт: 0.10 × 5 = $0.50, и $0.50 возвращается.
  3. Если бы он сообщил SR: 1080 за 5 секунд, списание осталось бы $1.00 — расчёт никогда не превышает резервацию.

Второй пример: 480P с 2-секундным исходным видео, duration: 2. Поскольку присутствует reference_video, резерв равен 30 × $0.05 = $1.50; фактический вывод — 2 секунды, поэтому списание рассчитывается как 2 × $0.05 = $0.10, и $1.40 возвращается.

Ошибки параметров перехватываются до отправки: они возвращают 400, не отправляются провайдеру и ничего не стоят.

СтатусКодЗначение
400invalid_requestОтсутствует или пуст prompt (prompt is required); audio_url вместе с первым/последним кадром (wan3 does not support audio_url together with first/last frame images); пусты и prompt, и media; поле metadata неверного типа; metadata.model отличается от разрешённой модели (can't change model with metadata)
400invalid_requestОшибки валидации параметров — см. таблицу сообщений ниже
400invalid_jsonТело не удаётся разобрать
400invalid_secondsduration / seconds верхнего уровня отрицательны или больше 3600 (seconds must be between 1 and 3600)
400missing_modelВ теле нет model (model field is required)
400task_not_existtask_id неизвестен или принадлежит другому аккаунту
403insufficient_user_quotaБаланс или квота ключа не покрывает резервацию; ничего не отправляется
429—Ёмкость провайдера исчерпана; сообщение заменяется на Upstream load is saturated, please try again later
500build_request_failed, do_request_failed, invalid_responseСбой преобразования, провайдер недоступен или DashScope не вернул ID задачи
статус провайдераali_api_errorDashScope вернул код и сообщение об ошибке в теле ответа
статус провайдераfail_to_fetch_taskDashScope отклонил отправку; HTTP-статус — статус DashScope

Частые сообщения 400 от валидации Wan 3.0, ровно как возвращаются:

messageПричина
invalid duration: 40, wan3 supports -1 or 2-30Длительность вне 2–30 и не -1
invalid resolution: 4KP, wan3 supports 480P, 720P, 1080PРазрешение вне поддерживаемых уровней (показано после приведения к верхнему регистру и добавления P)
invalid ratio: 1:2, wan3 supports adaptive, 21:9, 16:9, 4:3, 1:1, 3:4, 9:16Соотношение вне поддерживаемого списка
invalid seed: 3000000000, wan3 supports -1 or 0-2147483647Seed вне -1 или 0–2147483647
invalid size: 1000*1000Размер ШИРИНА*ВЫСОТА отсутствует в таблице
wan3 does not support audio_url together with first/last frame imagesКадры вместе с референсным аудио через input.audio_url
wan3 requires prompt or input.mediaНет ни prompt, ни media после слияния metadata
can't change model with metadatametadata.model отличается от разрешённой upstream-модели
convert seconds to int failed: ...seconds не является целой строкой
seconds must be between 1 and 3600Длительность верхнего уровня отрицательна или слишком велика; для -1 используйте metadata.parameters.duration

Сбои после отправки — модерация, недоступный материал, недопустимая комбинация материалов, вход + вывод больше 30 секунд — не возвращаются как HTTP-ошибки. Они появляются в записи задачи как FAILURE с fail_reason, и зарезервированная сумма возвращается.

  • Другой эндпоинт. RouteAPI не предоставляет /api/v1/services/aigc/video-generation/video-synthesis; направить SDK DashScope на наш базовый URL не получится.
  • Нативные объекты input / parameters DashScope помещаются в metadata.input / metadata.parameters. Общие параметры (prompt, resolution, ratio, size, duration, images, generate_audio) можно также передавать на верхнем уровне — они сопоставляются автоматически.
  • Возвращаемый task_id — это ID RouteAPI, а не DashScope. ID DashScope находится в data.data.output.task_id.
  • Переписывание prompt (prompt_extend) всегда включено и не может быть отключено.
  • Старые поля изображений по моделям (img_url, first_frame_url, last_frame_url, audio_url) отбрасываются; до провайдера доходит только input.media.
  • Уведомления по callback не поддерживаются — опрашивайте эндпоинт задачи.
  • Оплата идёт за секунду вывода с коэффициентом разрешения; поштучная или ступенчатая тарификация провайдера не применяется.

Нужны bash, curl и jq.

#!/usr/bin/env bash
set -euo pipefail
: "${ROUTEAPI_KEY:?set ROUTEAPI_KEY first}"
BASE="${ROUTEAPI_BASE:-https://api.routeapi.ai}"
AUTH="Authorization: Bearer $ROUTEAPI_KEY"
TASK_ID=$(curl -sS -X POST "$BASE/v1/video/generations" \
-H "$AUTH" -H "Content-Type: application/json" \
-d '{"model":"wan3.0-video","prompt":"An orange cat walking on a rooftop, cinematic lighting","resolution":"480P","ratio":"16:9","duration":2}' \
| jq -er .task_id)
echo "task: $TASK_ID"
for _ in $(seq 1 60); do
RESP=$(curl -sS "$BASE/v1/video/generations/$TASK_ID" -H "$AUTH")
STATUS=$(printf '%s' "$RESP" | jq -r .data.status)
echo "status: $STATUS $(printf '%s' "$RESP" | jq -r .data.progress)"
case "$STATUS" in
SUCCESS)
echo "billed seconds: $(printf '%s' "$RESP" | jq -r .data.data.usage.output_video_duration)"
curl -sSL -o "$TASK_ID.mp4" "$BASE/v1/videos/$TASK_ID/content" -H "$AUTH"
echo "saved $TASK_ID.mp4"
exit 0
;;
FAILURE)
echo "failed: $(printf '%s' "$RESP" | jq -r .data.fail_reason)"
exit 1
;;
esac
sleep 15
done
echo "timed out waiting for the task"
exit 1