Wan
Wan (Tongyi Wanxiang) — семейство видео-моделей Alibaba, обслуживаемое каналами DashScope. Задачи проходят через те же эндпоинты, что и любая другая видеомодель — см. Создание задачи и Получение задачи. Эта страница полностью описывает адаптер Wan 3.0: какие поля запроса он читает, как строит запрос DashScope, правила для материалов, как читать запись задачи и как рассчитывается оплата по секундам.
Генерация видео асинхронна: отправьте задачу, сохраните task_id, опрашивайте каждые 10–15 секунд и скачайте результат, когда статус станет SUCCESS.
Модели
Section titled “Модели”| Model ID | Разрешения | Длительность | Примечания |
|---|---|---|---|
wan3.0-video | 480P, 720P, 1080P | 2–30 секунд или -1 (умная) | Стандартная модель: текст в видео, первый/последний кадр, множественные референсы |
wan3.0-video-prime | 480P, 720P, 1080P | 2–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.
Параметры
Section titled “Параметры”Эти поля можно записывать на верхнем уровне тела запроса. Ключи конкретной модели помещаются в metadata.
| Поле | Тип | Значения | Примечания |
|---|---|---|---|
model | string | wan3.0-video, wan3.0-video-prime | Обязательно |
prompt | string | — | Обязательно и не пусто. В режиме референсов материалы обозначаются как «image 1», «video 1», «audio 1» |
resolution | string | 480P, 720P, 1080P | Без учёта регистра, завершающий P необязателен. По умолчанию 1080P |
ratio | string | adaptive, 21:9, 16:9, 4:3, 1:1, 3:4, 9:16 | Без учёта регистра. Если не задан, DashScope применяет adaptive |
size | string | 1280*720, 1280x720 или 720p | Свёртывается в resolution и ratio, затем удаляется. Принимаются только размеры из таблицы адаптера |
duration | integer | 2–30 | Секунды вывода. По умолчанию 5. Отрицательное значение или больше 3600 отклоняется общей проверкой задачи; -1 (умная длительность) работает только в metadata.parameters |
seconds | string | целая строка | Используется вместо duration, когда тот отсутствует или равен 0. Нецелое значение даёт 400 |
image | string | URL | Одно изображение первого кадра; для первого кадра оно важнее images |
images | array | URL | 1 изображение — первый кадр; 2 изображения — первый, затем последний кадр |
input_reference | string | URL | Заменяет images одним URL первого кадра; для первого кадра image верхнего уровня важнее |
generate_audio | boolean | true / false | Отправляется как parameters.audio; явный false передаётся как false |
metadata | object | input / 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
Section titled “Параметры metadata”metadata повторяет объекты input и parameters DashScope. Все ключи ниже необязательны.
| Ключ metadata | Тип | Примечания |
|---|---|---|
input.media | array | Список материалов из элементов {"type", "url"}. Если задан, изображения верхнего уровня не используются |
input.prompt | string | Заменяет prompt верхнего уровня для провайдера, но общая проверка всё равно требует prompt верхнего уровня |
input.audio_url | string | Сокращение для добавления элемента reference_audio |
input.negative_prompt | string | Негативный prompt |
input.template | string | Шаблон эффекта DashScope, передаётся как есть |
parameters.resolution | string | То же, что resolution верхнего уровня |
parameters.ratio | string | То же, что ratio верхнего уровня |
parameters.size | string | То же, что size верхнего уровня |
parameters.duration | integer | -1 для умной длительности, иначе 2–30 |
parameters.audio | boolean | То же, что generate_audio |
parameters.seed | integer | -1 или 0–2147483647. 0 сохраняется как явное значение; одинаковый seed не гарантирует одинаковый результат |
parameters.watermark | boolean | Водяной знак провайдера; выключен по умолчанию |
parameters.prompt_extend | boolean | Принимается, но не действует — переписывание prompt всегда включено (см. ниже) |
Значения в metadata.parameters.* важнее эквивалентов верхнего уровня. Неизвестные ключи в metadata игнорируются, а ключ с неверным типом даёт 400 до какой-либо резервации.
prompt_extend нельзя отключить. На верхнем уровне такого поля нет, поэтому prompt_extend верхнего уровня просто игнорируется; в metadata.parameters адаптер всегда начинает с true, а поле хранится в bool без указателя с omitempty, поэтому false отбрасывается при отправке в DashScope и применяется значение провайдера по умолчанию (включено). Передавайте его только чтобы повторить значение по умолчанию; это ничего не меняет.
Входные материалы
Section titled “Входные материалы”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 обязателен всегда.
Текст в видео
Section titled “Текст в видео”Только prompt и параметры видео:
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 верхнего уровня: одно изображение — первый кадр, два — первый и последний кадр в этом порядке.
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 присутствует, поля изображений верхнего уровня игнорируются.
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; запрос, который его нарушает, завершается ошибкой и возвращается.
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 и длительность:
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" } ] } } }'Умная длительность
Section titled “Умная длительность”При умной длительности длину выбирает модель. Передайте -1 в metadata.parameters.duration; отрицательный duration верхнего уровня отклоняется общей проверкой задачи с invalid_seconds.
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 секунд при отправке и рассчитывается по фактической длине вывода при завершении.
Получение задачи
Section titled “Получение задачи”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_id | ID задачи DashScope, отличается от внешнего data.task_id |
data.data.output.video_url | URL видео провайдера; совпадает с внешним data.result_url |
data.data.output.orig_prompt | Prompt, полученный 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; зарезервированная сумма уже возвращена.
Скачивание видео
Section titled “Скачивание видео”data.result_url указывает на файл, размещённый Alibaba. Этот URL временный — Alibaba делает его недействительным по своему графику, поэтому скачивайте сразу; либо передавайте через RouteAPI, что не зависит от оставшегося срока жизни URL:
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 | Статус записи задачи |
|---|---|
PENDING | QUEUED |
RUNNING | IN_PROGRESS |
SUCCEEDED | SUCCESS |
FAILED, CANCELED, UNKNOWN | FAILURE |
Оплата
Section titled “Оплата”Wan 3.0 оплачивается за секунду вывода с множителем по разрешению. Цена в консоли — это цена за секунду для 480P; остальные уровни равны этой цене, умноженной на коэффициент разрешения модели, по умолчанию 1 : 2 : 4 для 480P : 720P : 1080P.
И резервация, и финальное списание считаются одинаково:
base quota = model price (per 480P second) × group ratioreserved quota = base quota × reserved seconds × resolution ratiosettled quota = min(base quota × output seconds × effective ratio, reserved quota)Действующий коэффициент — коэффициент запрошенного уровня, либо, если DashScope сообщает более низкий SR, коэффициент нижнего уровня. Он никогда не повышается выше запрошенного уровня.
Резервация и расчёт:
| Запрос | Резерв при отправке | При завершении |
|---|---|---|
Явная длительность, без reference_video | запрошенные секунды | фактические секунды вывода |
Содержит элемент reference_video | 30 секунд | фактические секунды вывода, разница возвращается |
metadata.parameters.duration: -1 (умная длительность) | 30 секунд | фактические секунды вывода, разница возвращается |
Правила расчёта, проверенные в адаптере:
- Оплачивается только
usage.output_video_duration. Секунды входного видео, референсные изображения и аудио, а также первый/последний кадры бесплатны, и генерация аудио не меняет цену. - Цена за единицу — та, что зафиксирована при отправке. Изменение цены в консоли во время выполнения задачи на неё не влияет; резервация остаётся как была списана.
- Расчёт только возвращает. Задача, сообщающая больше секунд, чем зарезервировано, более высокий
SRили некорректныйusage, сохраняет резервацию вместо дополнительного списания; отсутствиеusageу успешной задачи также сохраняет резервацию. - Неуспешная задача — отклонение модерацией, таймаут провайдера, отмена — возвращает резервацию.
400отклоняется до отправки и никогда не списывает средства. - Запросам, резервирующим 30 секунд, нужен баланс или квота ключа, достаточные для этой резервации, иначе отправка отклоняется с
403insufficient_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:
- Запрос
1080P,duration: 5. Резерв: 0.20 × 5 = $1.00. - DashScope сообщает
usage.SR: 720иoutput_video_duration: 5— вывод на уровень ниже. Расчёт: 0.10 × 5 = $0.50, и $0.50 возвращается. - Если бы он сообщил
SR: 1080за 5 секунд, списание осталось бы $1.00 — расчёт никогда не превышает резервацию.
Второй пример: 480P с 2-секундным исходным видео, duration: 2. Поскольку присутствует reference_video, резерв равен 30 × $0.05 = $1.50; фактический вывод — 2 секунды, поэтому списание рассчитывается как 2 × $0.05 = $0.10, и $1.40 возвращается.
Ограничения и ошибки
Section titled “Ограничения и ошибки”Ошибки параметров перехватываются до отправки: они возвращают 400, не отправляются провайдеру и ничего не стоят.
| Статус | Код | Значение |
|---|---|---|
| 400 | invalid_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) |
| 400 | invalid_request | Ошибки валидации параметров — см. таблицу сообщений ниже |
| 400 | invalid_json | Тело не удаётся разобрать |
| 400 | invalid_seconds | duration / seconds верхнего уровня отрицательны или больше 3600 (seconds must be between 1 and 3600) |
| 400 | missing_model | В теле нет model (model field is required) |
| 400 | task_not_exist | task_id неизвестен или принадлежит другому аккаунту |
| 403 | insufficient_user_quota | Баланс или квота ключа не покрывает резервацию; ничего не отправляется |
| 429 | — | Ёмкость провайдера исчерпана; сообщение заменяется на Upstream load is saturated, please try again later |
| 500 | build_request_failed, do_request_failed, invalid_response | Сбой преобразования, провайдер недоступен или DashScope не вернул ID задачи |
| статус провайдера | ali_api_error | DashScope вернул код и сообщение об ошибке в теле ответа |
| статус провайдера | fail_to_fetch_task | DashScope отклонил отправку; 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-2147483647 | Seed вне -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 metadata | metadata.model отличается от разрешённой upstream-модели |
convert seconds to int failed: ... | seconds не является целой строкой |
seconds must be between 1 and 3600 | Длительность верхнего уровня отрицательна или слишком велика; для -1 используйте metadata.parameters.duration |
Сбои после отправки — модерация, недоступный материал, недопустимая комбинация материалов, вход + вывод больше 30 секунд — не возвращаются как HTTP-ошибки. Они появляются в записи задачи как FAILURE с fail_reason, и зарезервированная сумма возвращается.
Отличия от API DashScope
Section titled “Отличия от API DashScope”- Другой эндпоинт. RouteAPI не предоставляет
/api/v1/services/aigc/video-generation/video-synthesis; направить SDK DashScope на наш базовый URL не получится. - Нативные объекты
input/parametersDashScope помещаются в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 не поддерживаются — опрашивайте эндпоинт задачи.
- Оплата идёт за секунду вывода с коэффициентом разрешения; поштучная или ступенчатая тарификация провайдера не применяется.
Полный скрипт
Section titled “Полный скрипт”Нужны bash, curl и jq.
#!/usr/bin/env bashset -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 15done
echo "timed out waiting for the task"exit 1