万相 2.7
| 模型 | 能力 | 必填字段 |
|---|---|---|
wan2.7-t2v | 文生视频 | input.prompt |
wan2.7-i2v | 图生视频(首帧驱动,可选尾帧) | input.prompt、input.media[] 中的 first_frame(兼容旧写法 input.img_url) |
万相 2.7 的官方协议是阿里百炼 DashScope 的 视频合成异步接口,ModelGo 网关按官方路径与请求/响应格式原样接收:创建 → 轮询 → 取内容。请求体与阿里百炼文档一致,具体由哪家供应商渲染由网关路由决定,对调用方不可见;请求落到官方百炼通道时,请求体按你写的内容原样转发,网关只替换 model(兼容旧写法的字段会改写成官方写法)。
使用阿里官方 DashScope SDK 时,只需把
base_url(DASHSCOPE_HTTP_BASE_URL)指向https://api.modelgo.ai、api_key换成 ModelGo API Key。
1. 创建任务
POST https://api.modelgo.ai/api/v1/services/aigc/video-generation/video-synthesis
请求头:Authorization: Bearer $MODELGO_API_KEY、X-DashScope-Async: enable、Content-Type: application/json。
文生视频
curl https://api.modelgo.ai/api/v1/services/aigc/video-generation/video-synthesis \
-H "Authorization: Bearer $MODELGO_API_KEY" \
-H "X-DashScope-Async: enable" \
-H "Content-Type: application/json" \
-d '{
"model": "wan2.7-t2v",
"input": {"prompt": "一只毛茸茸的橘猫在阳光下的窗台上玩毛线球"},
"parameters": {"resolution": "1080P", "duration": 5, "prompt_extend": true}
}'图生视频
curl https://api.modelgo.ai/api/v1/services/aigc/video-generation/video-synthesis \
-H "Authorization: Bearer $MODELGO_API_KEY" \
-H "X-DashScope-Async: enable" \
-H "Content-Type: application/json" \
-d '{
"model": "wan2.7-i2v",
"input": {
"prompt": "猫缓缓转头并眨眼",
"media": [{"type": "first_frame", "url": "https://example-cdn.com/cat.jpg"}]
},
"parameters": {"resolution": "720P", "duration": 5}
}'响应
{
"output": {"task_id": "gw_e99647a0-692d-4fdd-ae46-e1d777e72bf5", "task_status": "PENDING", "submit_time": "2026-09-07 17:05:59.000"},
"request_id": "gw_e99647a0-692d-4fdd-ae46-e1d777e72bf5"
}output.task_id 是网关任务 ID,轮询与取内容都用它。
2. 参数说明
| 字段 | 类型 | 适用 | 说明 |
|---|---|---|---|
model | string | 全部 | wan2.7-t2v 或 wan2.7-i2v |
input.prompt | string | 全部 | 必填。画面内容与动作描述 |
input.media[] | object[] | 全部 | 百炼 wan2.7 官方写法,元素为 {"type": ..., "url": ...}:first_frame(首帧)、last_frame(尾帧)、driving_audio(驱动音频)、first_clip(视频续写,仅 i2v,见下)。first_frame / last_frame / first_clip 仅 i2v,t2v 带上会被拒绝(不会静默按文生视频处理);driving_audio 两个模型都可用;同一 type 不能重复;其他 type 会被拒绝。首帧 URL 须公网可直接下载 |
input.img_url | string | i2v | 兼容旧写法,等同 media 的 first_frame,新接入请用 media[] |
input.last_frame_url | string | i2v | 兼容旧写法,等同 media 的 last_frame |
input.audio_url | string | 全部 | 驱动音频 URL(wav/mp3),t2v 的官方写法;i2v 请用 media 的 driving_audio(audio_url 作为兼容写法也接受)。同一项不能用两种写法重复给出 |
input.negative_prompt | string | 全部 | 反向提示词 |
parameters.resolution | string | 全部 | 分辨率档位 720P / 1080P,缺省 1080P |
parameters.ratio | string | 全部 | 宽高比,例如 16:9(缺省)/ 9:16 / 1:1;与 resolution 共同决定输出尺寸(见下表)。也接受 aspect_ratio 写法,两者同时给出时必须一致,完整取值以官方文档为准 |
parameters.size | string | t2v | 与 resolution 等价的像素写法,如 1280*720、1920*1080;与 ratio 同时给出时比例必须一致 |
parameters.duration | int | 全部 | 时长(秒),缺省 5 |
parameters.prompt_extend | boolean | 全部 | 是否让上游智能改写提示词 |
parameters.watermark | boolean | 全部 | 是否加水印 |
parameters.seed | int | 全部 | 随机种子 |
未在上表列出的 parameters 键(例如 wan2.7 已弃用的 shot_type)不被网关解析,也不会报错:和官方行为一致,上游会忽略它们,不影响计费。
音频
- 万相 2.7 官方接口没有音频开关,ModelGo 与官方保持一致:不传
input.media[]的driving_audio(t2v 为input.audio_url)时,由模型根据画面自动生成匹配的背景音乐或音效;传了就以你的音频为驱动音轨。 - 因此 万相 2.7 只有一档价格(有声档),不再提供「无声档」。
parameters.audio不是 wan2.7 的参数,网关不会把它发给上游。 - 明确要求无声的请求会被拒绝:
parameters.audio=false、顶层generate_audio=false或"false"创建时返回400,不产生费用,不会被静默改成有声再计费。传true等同于不传,不报错。
分辨率档位
| 档位 | 16:9 | 9:16 | 1:1 | 4:3 | 3:4 |
|---|---|---|---|---|---|
| 720P | 1280*720 | 720*1280 | 960*960 | 1088*832 | 832*1088 |
| 1080P | 1920*1080 | 1080*1920 | 1440*1440 | 1632*1248 | 1248*1632 |
- 4:3 / 3:4 的
size同时接受百炼写法:720P1104*832/832*1104,1080P1648*1248/1248*1648,与表中写法为同一档位、同价。 - 只提供 720P / 1080P。 传
4K或表外size会在创建时被拒(HTTP400),不会静默降档生成,也不产生费用。 - 按可交付档位选路。 网关只把请求交给能按所声明档位交付的供应商(如
wan2.7-t2v的 720P 目前仅由官方百炼通道渲染),不会由其他供应商按 1080P 代出再按 720P 计费;若当前没有能出该档位的供应商,创建返回400,不产生费用。 input中除上表字段外的键(如ref_images_url)不被本接口支持,会被拒绝而不是忽略。
视频续写(first_clip,仅 i2v)
- 用
input.media[]的{"type": "first_clip", "url": "<视频直链>"}(或平铺的input.first_clip_url)从一段已有视频接着往下生成;片段须为 2–10 秒的 mp4 / mov,URL 须公网可直接下载(不能是需要鉴权的地址,例如本网关的/v1/videos/{id}/content)。 - 只能用于
wan2.7-i2v,不能与first_frame(img_url)或driving_audio(audio_url)同时给出,可与last_frame搭配;违反上述任一条件创建时返回400,不产生费用。 - 按 i2v 计费,档位与不带续写的 i2v 相同。
- 并非所有供应商通道都能承载续写:网关只把续写请求交给确认支持的通道,当前没有可用通道时创建返回
400,不产生费用。
首帧图片的要求(i2v)
- 必须是上游服务器能直接
GET到的直链:无鉴权、无跳转、不依赖 Referer / Cookie。 - 部分站点直链对非浏览器抓取返回 403,会导致任务在生成阶段失败(
task_status=FAILED),不计费。建议使用自有对象存储或 CDN 地址。
3. 轮询任务
GET https://api.modelgo.ai/api/v1/tasks/{task_id}
curl https://api.modelgo.ai/api/v1/tasks/gw_e99647a0-692d-4fdd-ae46-e1d777e72bf5 \
-H "Authorization: Bearer $MODELGO_API_KEY"完成时:
{
"output": {
"task_id": "gw_e99647a0-692d-4fdd-ae46-e1d777e72bf5",
"task_status": "SUCCEEDED",
"submit_time": "2026-09-07 17:05:59.000",
"end_time": "2026-09-07 17:09:06.000",
"video_url": "https://api.modelgo.ai/v1/videos/gw_e99647a0-692d-4fdd-ae46-e1d777e72bf5/content"
},
"usage": {"video_duration": 6, "video_count": 1},
"request_id": "gw_e99647a0-692d-4fdd-ae46-e1d777e72bf5"
}task_status:PENDING→RUNNING→SUCCEEDED/FAILED。失败时output.code/output.message给出原因,任务不计费。- 生成耗时通常 1–3 分钟,请按 5–10 秒间隔轮询并带退避。
output.video_url指向网关内容接口,需带 API Key 下载;不要持久化,产物有保留期。
4. 下载视频
GET https://api.modelgo.ai/v1/videos/{task_id}/content
curl https://api.modelgo.ai/v1/videos/gw_e99647a0-692d-4fdd-ae46-e1d777e72bf5/content \
-H "Authorization: Bearer $MODELGO_API_KEY" -o cat.mp4返回 video/mp4 字节流,支持 Range。只有任务所属 API Key(或同租户控制台登录态)能访问;未完成返回 409,过期或不存在返回 404。
5. 完整示例(Python,官方 SDK 风格)
import os, time, requests
BASE = "https://api.modelgo.ai"
H = {"Authorization": f"Bearer {os.environ['MODELGO_API_KEY']}", "X-DashScope-Async": "enable"}
def synthesize(model: str, inp: dict, params: dict, out: str, timeout: int = 600) -> None:
r = requests.post(f"{BASE}/api/v1/services/aigc/video-generation/video-synthesis",
json={"model": model, "input": inp, "parameters": params}, headers=H, timeout=30)
r.raise_for_status()
task_id = r.json()["output"]["task_id"]
deadline = time.time() + timeout
while True:
if time.time() > deadline:
raise TimeoutError(task_id)
o = requests.get(f"{BASE}/api/v1/tasks/{task_id}", headers=H, timeout=30).json()["output"]
if o["task_status"] == "SUCCEEDED":
break
if o["task_status"] == "FAILED":
raise RuntimeError(o.get("message") or o.get("code"))
time.sleep(8)
with requests.get(o["video_url"], headers=H, stream=True, timeout=120) as c:
c.raise_for_status()
with open(out, "wb") as f:
for chunk in c.iter_content(1 << 20):
f.write(chunk)
synthesize("wan2.7-t2v", {"prompt": "一只毛茸茸的橘猫在阳光下玩毛线球"}, {"resolution": "1080P", "duration": 5}, "t2v.mp4")
synthesize("wan2.7-i2v", {"prompt": "猫缓缓转头并眨眼", "media": [{"type": "first_frame", "url": "https://example-cdn.com/cat.jpg"}]}, {"resolution": "720P", "duration": 5}, "i2v.mp4")6. 计费口径
- 按视频秒数 × 分辨率档位单价计费;创建时按请求的
duration预授权冻结,任务完成后按实际交付秒数结算(usage.video_duration)。上游可能多交付 1 秒(请求 5 秒、交付 6 秒),按 6 秒结算。 - 未传时长按缺省值预授权(万相 / 可灵 5 秒,Veo 8 秒),缺省值同时发给供应商;结算取供应商回报的实际交付秒数,四舍五入到整秒(如 5.041 → 5,5.5 → 6),可能与请求时长相差 ±1 秒。
- 创建被拒(
400)或生成失败(FAILED)不计费,预授权自动释放。 - 万相 2.7 没有「无声档」,所有请求按有声档单价计费(见上文「音频」)。
- 各模型单价以控制台「模型列表」中的价格为准。
常见错误
| 现象 | 原因 | 处理 |
|---|---|---|
创建返回 400 | resolution / size 不在 720P / 1080P 内;缺 input.prompt;i2v 缺 input.img_url(或 media 的 first_frame);t2v 带了 input.img_url / input.last_frame_url(图生视频请用 wan2.7-i2v);input 含不支持的键,或 input.media[] 的 type 不支持、与旧字段重复;ratio 不在可选值内,或与 aspect_ratio / size 的比例不一致;当前无供应商能出所请求档位 | 按参数表修正或换模型/档位 |
创建返回 400,提示 has no audio switch | 带了 parameters.audio=false 或 generate_audio=false;万相 2.7 没有静音能力 | 去掉该字段(官方接口无此参数),需要无声请在下载后自行去除音轨 |
task_status=FAILED | 上游无法下载 img_url 或生成失败 | 换成公网可直接下载的直链 |
轮询返回 task_not_found | task_id 不是本 Key 创建的任务 | 核对 task_id 与 Key |
/content 返回 409 / 404 | 任务未完成 / 产物过期 | 先轮询到 SUCCEEDED;及时下载 |