Vidu 视频生成 API
POST https://api.yu-yu.ai/v1/videos
本页说明 Vidu 家族(Q4 / Q3 / Q2 / Q1 / 2.0)在本网关的对外调用方式。接口是异步的:提交任务后立即拿到任务 ID,再用任务 ID 轮询状态,成功后取回视频。
本网关同时提供两条等价入口:
| 入口 | 提交 | 查询 | 适合 |
|---|---|---|---|
| OpenAI 兼容(推荐新接入) | POST /v1/videos(别名 POST /v1/video/generations) | GET /v1/videos/{task_id} | 已经按 OpenAI 视频协议写好的客户端 |
| Vidu 原生 | POST /ent/v2/{text2video|img2video|start-end2video|reference2video} | GET /ent/v2/tasks/{task_id}/creations | 已有 Vidu 官方 SDK / 开源工具,只改 base URL 即可接入 |
两条入口共用同一套模型能力与参数校验;任务 ID 也是同一套,用哪条入口创建、用另一条入口查询都可以。下文先讲 OpenAI 兼容入口,Vidu 原生入口的差异集中在Vidu 原生协议入口。
模型能力
Vidu 家族共 15 个对外模型名。所有模型共用同一套请求字段,差别只在 model 取值,以及下表列出的可用输入组合、输出档位与时长范围。
model | 文生视频 | 首帧图生 | 首尾帧 | 参考生视频(参考图上限) | 输出档位 | 时长(秒) |
|---|---|---|---|---|---|---|
viduq4-preview | — | ✓ | — | ✓(15) | 540p / 720p / 1080p / 2K / 4K | 3–16 |
viduq3-pro | ✓ | ✓ | ✓ | — | 540p / 720p / 1080p | 1–16 |
viduq3-turbo | ✓ | ✓ | ✓ | ✓(7) | 540p / 720p / 1080p | 1–16 |
viduq3-pro-fast | — | ✓ | — | — | 720p / 1080p | 1–16 |
viduq3-mix | — | — | — | ✓(7) | 540p / 720p / 1080p | 3–16 |
viduq3-drama | — | — | — | ✓(7) | 720p / 1080p | 3–15 |
viduq3-ad | — | — | — | ✓(7) | 720p / 1080p | 3–15 |
viduq3 | — | — | — | ✓(7) | 540p / 720p / 1080p | 3–16 |
viduq2-pro | — | ✓ | ✓ | ✓(7) | 540p / 720p / 1080p | 1–10 |
viduq2 | ✓ | — | — | ✓(7) | 540p / 720p / 1080p | 1–10 |
viduq2-turbo | — | ✓ | ✓ | — | 540p / 720p / 1080p | 1–10 |
viduq2-pro-fast | — | ✓ | ✓ | — | 720p / 1080p | 1–10 |
viduq1 | ✓ | ✓ | ✓ | ✓(7) | 1080p | 5 |
viduq1-classic | — | ✓ | ✓ | — | 1080p | 5 |
vidu2.0 | — | ✓ | ✓ | — | 360p / 720p / 1080p | 4 或 8 |
说明
「文生 / 首帧图生 / 首尾帧 / 参考生」四列表示模型是否有这个专用动作:— 只说明没有该专用动作,只有参考生能力的模型收到 1–2 张图时会回落成参考生视频(见输入组合与动作);张数在任何动作下都不被该模型接受时才返回 400。输出档位 与 时长 是该模型可用的取值域:档位写成 WxH 时按像素面积折算到最近档位,折算不出合法档位或时长越界才返回 400。
音视频直出
Q4 / Q3 / Q2 系列支持 audio=true(成片直接带配音)。viduq1 / viduq1-classic / vidu2.0 传 audio=true 会被拒绝。
错峰生成
off_peak=true 表示允许把任务排到低峰时段执行,可用条件随模型不同:
| 模型 | off_peak 可用条件 |
|---|---|
viduq3、viduq3-pro-fast | 与 audio 取值无关 |
viduq3-pro、viduq3-turbo | 仅 audio=true 时可用 |
viduq2-pro、viduq2、viduq2-turbo、viduq2-pro-fast、viduq1、viduq1-classic、vidu2.0 | 仅 audio=false(或不传)时可用 |
viduq4-preview、viduq3-drama、viduq3-ad | 官方未明示支持范围;传 true 会被接受 |
viduq3-mix | 不支持,传 true 返回 400 |
鉴权
本接口仅支持 API Key 鉴权,请在 https://api.yu-yu.ai/console 获取 API Key:
http
Authorization: Bearer <API_KEY>
Content-Type: application/json提交任务
POST https://api.yu-yu.ai/v1/videos
同一入口还有一条别名:POST https://api.yu-yu.ai/v1/video/generations,行为完全一致。
Body 参数
model string 必选
需要调用的模型名,取值见上文的模型能力。不在清单内的模型名返回 400 unsupported_vidu_model。
prompt string 必选
画面描述,不能为空。按字符计长度,上限随动作不同:文生视频(Q3 系列)20000 字符,参考生视频 5000 字符,其余场景 2000 字符。
images string[] 可选
输入图片列表,决定本次请求走哪种生成场景(见下文输入组合与动作)。每张图片可以是公网 http(s) URL,也可以是 data:image/<类型>;base64,<数据> 内联形式。
image string 可选
单张图片的简写,仅在 images 为空时生效,等价于只传一张图。
duration integer 可选
生成时长,单位秒,只接受整数。取值必须在模型的时长区间内;vidu2.0 只接受 4 或 8。不传时默认 5 秒,模型不接受 5 秒时取该模型的时长下限。
seconds string 可选
时长的字符串写法,如 "8",仅在 duration 缺省时生效。
size string 可选
输出档位,与 metadata.resolution 等价,两者同时给出时以 metadata.resolution 为准。大小写不敏感,也接受 1280x720 这类 WxH 写法(按像素面积折算到该模型允许的最近档位)。两者都不传时默认 720p;该模型没有 720p 档时取它档位表中的第一个(因此 viduq1 / viduq1-classic 缺省 1080p)。
metadata object | string 可选
模型专用参数。对象或 JSON 字符串都接受。只接受下表中的键,未知键返回 400(不会静默丢弃):
| 键 | 类型 | 说明 |
|---|---|---|
resolution | string | 输出档位,取值同 size,优先级高于 size |
aspect_ratio | string | 画面比例:1:1、16:9、9:16、3:4、4:3、auto |
duration | integer | 时长,顶层 duration / seconds 都缺省时生效 |
seed | integer | 随机种子,范围 [0, 2147483648);不传由模型服务方随机 |
audio | boolean | 是否音视频直出,见音视频直出 |
off_peak | boolean | 是否错峰生成,见错峰生成 |
watermark | boolean | 是否叠加水印 |
wm_position | integer | 水印位置,取 1 / 2 / 3 / 4 |
wm_url | string | 水印图片地址 |
meta_data | string | 自定义元数据,原样透传给模型服务方 |
payload | string | 业务载荷,模型服务方原样回传,便于关联自有业务数据 |
is_rec | boolean | 使用推荐提示词(模型侧不采用传入的 prompt);prompt 仍必须提供,不能为空 |
movement_amplitude | string | 运镜幅度:auto、small、medium、large |
bgm | boolean | 是否带背景音乐;仅 viduq2、viduq2-pro 的参考生视频支持,其它组合传 true 返回 400 |
action | string | 显式指定生成动作,见输入组合与动作 |
images / image | string | string[] | 图片的兜底位置:仅当顶层 images / image 都为空时采用,两处不合并 |
三类特殊键:
callback_url:任务终态回调地址,放在顶层或metadata下都会被识别,由网关在任务结束后回调,不会转发给模型服务方。prompt/model:写在metadata下会被忽略,以顶层字段为准。sounds/videos/subjects/auto_subjects/voice_id:本期未开放,传入返回 400。
callback_url string 可选
任务进入终态后由网关 POST 回调的地址(也可写在 metadata.callback_url)。回调前会做可达性校验,指向内网或非法协议的地址返回 400 invalid_callback_url。
输入组合与动作
请求实际走哪种生成场景,由输入图片张数与模型能力共同决定;也可以用 metadata.action 显式指定。
| 输入图片 | 默认动作 | metadata.action 取值 |
|---|---|---|
| 0 张 | 文生视频 | textGenerate |
| 1 张 | 首帧图生视频(模型不支持图生、但支持参考生时走参考生) | generate |
| 2 张 | 首尾帧生视频(模型不支持首尾帧时走参考生) | firstTailGenerate |
| 3 张及以上 | 参考生视频 | referenceGenerate |
注意
显式 action 优先于张数推断,但目标动作必须是该模型支持的能力,否则返回 400。例如 viduq3-pro 不支持参考生视频,传 3 张图或 metadata.action=referenceGenerate 都会被拒绝。
图片要求
| 项 | 限制 |
|---|---|
| 引用形式 | 公网 http(s) URL,或 data:image/<类型>;base64,<数据> |
| 内联图片体积 | 单张解码后 ≤ 10 MB |
| multipart 上传 | 字段 first_frame_image、last_frame_image、input_reference、images;单文件 ≤ 10 MB,只接受 PNG / JPEG / WebP |
| 本网关素材库引用 | 不支持 asset://,请改用公网 URL 或内联形式 |
| 张数 | 图生 1 张、首尾帧 2 张、参考生 1–N 张(N 见模型能力) |
请求示例
文生视频:
bash
curl -X POST 'https://api.yu-yu.ai/v1/videos' \
-H 'Authorization: Bearer <API_KEY>' \
-H 'Content-Type: application/json' \
-d '{
"model": "viduq3-pro",
"prompt": "一只橘猫坐在窗边打哈欠,清晨自然光,镜头缓慢推进",
"duration": 5,
"size": "720p",
"metadata": { "aspect_ratio": "16:9", "seed": 12345 }
}'图生视频(首帧):
bash
curl -X POST 'https://api.yu-yu.ai/v1/videos' \
-H 'Authorization: Bearer <API_KEY>' \
-H 'Content-Type: application/json' \
-d '{
"model": "viduq2-pro",
"prompt": "镜头缓慢环绕,发丝随风摆动",
"image": "https://your-cdn.example.com/first-frame.png",
"duration": 5,
"metadata": { "resolution": "1080p", "movement_amplitude": "small" }
}'首尾帧生视频:
json
{
"model": "viduq1",
"prompt": "人物从静止到转身离开,镜头固定",
"images": [
"https://your-cdn.example.com/first.png",
"https://your-cdn.example.com/last.png"
]
}参考生视频(显式指定动作与音视频直出):
json
{
"model": "viduq4-preview",
"prompt": "三位角色依次登场,保持各自的服装与发型",
"images": [
"https://your-cdn.example.com/ref-1.png",
"https://your-cdn.example.com/ref-2.png",
"https://your-cdn.example.com/ref-3.png"
],
"duration": 8,
"metadata": {
"action": "referenceGenerate",
"resolution": "1080p",
"audio": true
}
}提交响应
提交成功后立即返回任务对象,此时视频还没生成:
json
{
"id": "task_xxxxxxxxxxxxxxxx",
"task_id": "task_xxxxxxxxxxxxxxxx",
"object": "video",
"model": "viduq3-pro",
"status": "queued",
"progress": 0,
"created_at": 1767225600,
"upstream_task_id": ""
}| 字段 | 类型 | 说明 |
|---|---|---|
id | string | 任务 ID,后续查询与取回都用它 |
task_id | string | 与 id 同值,兼容早期接口(逐步废弃) |
object | string | 固定为 video |
model | string | 实际使用的模型名 |
status | string | 提交阶段固定为 queued |
progress | integer | 进度百分比,0~100 |
created_at | integer | 创建时间(Unix 秒) |
upstream_task_id | string | 兼容字段;Vidu 任务固定为空串 |
查询任务
GET https://api.yu-yu.ai/v1/videos/{task_id}
旧入口的兼容别名是 GET https://api.yu-yu.ai/v1/video/generations/{task_id}:它返回网关通用任务体 {"code":"success","data":{...}},字段与本页描述的视频对象不同;要下面这套字段请用 /v1/videos/{task_id}。
Path 参数
task_id string 必选
提交任务时返回的任务 ID。
响应参数
json
{
"id": "task_xxxxxxxxxxxxxxxx",
"task_id": "task_xxxxxxxxxxxxxxxx",
"object": "video",
"model": "viduq3-pro",
"status": "completed",
"progress": 100,
"created_at": 1767225600,
"completed_at": 1767225720,
"upstream_task_id": "",
"metadata": {
"url": "https://your-cdn.example.com/result.mp4",
"cover_url": "https://your-cdn.example.com/result-cover.jpg",
"watermarked_url": "https://your-cdn.example.com/result-watermark.mp4"
}
}| 字段 | 类型 | 说明 |
|---|---|---|
id / task_id | string | 任务 ID |
model | string | 本次任务使用的对外模型名 |
status | string | 任务状态,见下表 |
progress | integer | 进度百分比;模型服务方不回报进度时为 0 |
created_at / completed_at | integer | 创建时间与任务行最后一次更新时间(Unix 秒)。任务未完成时也可能带上 completed_at,判断是否完成只看 status |
upstream_task_id | string | 兼容字段;Vidu 任务固定为空串 |
metadata.url | string | 结果视频地址,任务成功后返回 |
metadata.cover_url | string | 结果视频封面地址,模型服务方提供时返回 |
metadata.watermarked_url | string | 带水印的结果视频地址,模型服务方提供时返回 |
error | object | 失败时的 { code, message },见常见错误 |
状态取值
status | 含义 | 客户端处理 |
|---|---|---|
queued | 排队中,尚未开始 | 继续轮询 |
in_progress | 生成中 | 继续轮询 |
completed | 已完成 | 从 metadata.url 取回结果,或直接下载文件本体 |
failed | 失败 | 读取 error.code 与 error.message |
cancelled | 已取消 | 停止轮询 |
unknown | 状态无法识别 | 停止轮询并记录任务 ID |
说明
排队、准备素材、调度中等中间态统一显示为 queued;模型服务方回报的其它未知中间态统一按 in_progress 处理,不会被误判成失败。
取回视频文件
GET https://api.yu-yu.ai/v1/videos/{task_id}/content 返回视频二进制流(不是 JSON),响应头带内容类型,适合直接交给播放器或下载:
bash
curl -L 'https://api.yu-yu.ai/v1/videos/task_xxxxxxxxxxxxxxxx/content' \
-H 'Authorization: Bearer <API_KEY>' \
-o result.mp4任务未完成时该端点不会返回半成品,会按任务状态报错;也可以直接用查询结果里的 metadata.url。
注意
metadata.url 由模型服务方提供,存在有效期。需要长期保存时请及时下载或转存到自己的存储。
轮询建议
- 首次查询延迟 5 秒以上,之后每隔 5 秒查询一次;命中
completed/failed/cancelled立即停止。 - 1080p 以上档位、较长时长的任务耗时更久,请放宽轮询上限;也可以提交时传入
callback_url,由网关在终态回调。 - 查询返回 5xx 属于网关或模型服务方临时故障,重试 2~3 次即可,不要无限重试。
常见错误
错误响应分两种形状,取决于失败发生在哪一步。
请求本身失败(提交或查询返回 HTTP 4xx / 5xx):
json
{
"code": "invalid_duration",
"message": "viduq2 的时长必须在 1–10 秒之间(收到 12)",
"data": null
}任务失败(查询返回 HTTP 200、status 为 failed)——错误信息在 error 对象里:
json
{
"id": "task_xxxxxxxxxxxxxxxx",
"status": "failed",
"error": {
"code": "content_policy_violation",
"message": "输入未通过内容审核"
}
}两种形状的 code 命名规则一致,但可出现的取值不同:
code | 含义 | 处理方式 |
|---|---|---|
unsupported_vidu_model | model 不在本页清单内 | 换成清单中的模型名 |
prompt_too_long | prompt 超过该动作的字符上限 | 缩短提示词 |
invalid_image_count | 图片张数与动作不匹配 | 按输入组合与动作调整张数 |
invalid_action | metadata.action 取值非法,或该模型不支持这个动作 | 换一个该模型支持的动作 |
invalid_resolution | 档位不在该模型的档位表里 | 换成该模型支持的档位 |
invalid_duration | 时长越界,或 vidu2.0 传了非 4 / 8 的值 | 按模型的时长区间传值 |
invalid_metadata | metadata 里出现未知键或类型不符 | 按上表修正键名与类型 |
invalid_image | 图片既不是 http(s) URL,也不是合法的 data:image 内联串 | 换成可公网访问的 URL 或内联形式 |
invalid_callback_url | callback_url 不可达或协议非法 | 换成公网可达的 http(s) 地址 |
invalid_request | 请求体不是合法 JSON,或 prompt 为空 | 检查 JSON,并补上 prompt |
invalid_seconds | seconds 超过时长上限 | 改小 seconds,或改用 duration |
invalid_multipart_form | multipart 表单解析失败 | 检查表单字段与上传文件 |
audio_not_supported | 该模型不支持 audio=true | 去掉 audio,或换成支持音视频直出的模型 |
off_peak_not_supported | 该模型在对应 audio 取值下不支持错峰 | 按错峰生成调整 |
bgm_not_supported | 非 viduq2 / viduq2-pro 参考生视频传了 bgm=true | 去掉 bgm |
unauthorized | 模型服务方鉴权失败 | 联系管理员核对 API Key 配置 |
model_unavailable | 该模型在当前账号下不可用 | 换模型,或联系管理员开通 |
content_policy_violation | 输入或结果未通过内容审核 | 调整提示词或输入素材 |
invalid_parameter | 模型服务方判定参数非法 | 按 message 修正参数 |
upstream_rate_limited | 模型服务方限流 | 稍后重试 |
upstream_concurrency_exceeded | 模型服务方账号并发已满 | 稍后重试,或降低并发 |
upstream_busy | 同一请求正在被处理 | 稍后重试 |
insufficient_upstream_credit | 模型服务方账户资源不足 | 联系管理员处理 |
task_not_found | 任务 ID 不存在,或已被清理 | 核对任务 ID 是否来自当前 API Key 的提交 |
task_not_exist | 查询的任务 ID 不存在,或不属于当前 API Key | 用本 Key 自己的任务 ID 查询 |
cancelled | 任务已取消 | 不再轮询 |
upstream_error | 模型服务方返回未归类的错误 | 按 message 排查;持续失败请提交任务 ID |
empty_creation | 模型服务方返回成功但没有结果地址 | 重新提交;持续出现请联系管理员 |
timeout_queued | 排队超时,任务已被判失败 | 重新提交;长期排队请联系管理员 |
timeout_submitting | 提交超时,任务已被判失败 | 重新提交 |
internal_error | 网关内部错误(没有更具体的错误码) | 稍后重试;持续失败请提交任务 ID |
Vidu 原生协议入口
原生入口的路径与上游逐字一致,只需要把 base URL 换成 https://api.yu-yu.ai。请求体沿用上游字段,但只支持下面列出的白名单;白名单外的键与未开放能力会在提交校验阶段失败,见本节末尾的说明。
原生入口固定使用 Vidu 渠道。同一模型名如果还配置在其它渠道上,原生入口不会选到那些渠道;请确认要承接 /ent/v2/* 的模型挂在 Vidu 渠道下。
| 动作 | 提交端点 | 输入 |
|---|---|---|
| 文生视频 | POST https://api.yu-yu.ai/ent/v2/text2video | prompt,不接受图片 |
| 首帧图生视频 | POST https://api.yu-yu.ai/ent/v2/img2video | prompt + images(恰好 1 张) |
| 首尾帧生视频 | POST https://api.yu-yu.ai/ent/v2/start-end2video | prompt + images(恰好 2 张) |
| 参考生视频 | POST https://api.yu-yu.ai/ent/v2/reference2video | prompt + images(1 张到该模型上限) |
| 查询 | GET https://api.yu-yu.ai/ent/v2/tasks/{task_id}/creations | — |
| 取消 | POST https://api.yu-yu.ai/ent/v2/tasks/{task_id}/cancel | 见取消 |
鉴权
原生入口同时接受上游写法与网关写法:
http
Authorization: Token <API_KEY>http
Authorization: Bearer <API_KEY>请求体
原生请求体按上游字段原样提交,支持的键:
model、prompt、images、duration、resolution、aspect_ratio、seed、audio、off_peak、watermark、wm_position、wm_url、meta_data、payload、is_rec、movement_amplitude、bgm、callback_url。
json
{
"model": "viduq3-turbo",
"images": ["https://example.com/first.jpg"],
"prompt": "镜头缓慢推进,清晨自然光",
"duration": 5,
"resolution": "720p",
"aspect_ratio": "16:9",
"seed": 0,
"audio": false,
"off_peak": false,
"watermark": false
}与 OpenAI 入口的差异
- 动作由端点决定:调用
/img2video就是图生视频,不会因为少传/多传图片而自动换到别的端点。张数与端点不符不会换成别的端点:任务先入队,随后在提交校验阶段失败,查询时表现为state=failed+err_code=invalid_image_count。 prompt必填:与 OpenAI 入口一致。is_rec=true且提示词为空的原生请求会被拒绝。- 未开放的字段:
subjects、sounds、videos、voice_id、auto_subjects本网关暂不支持。提交会先入队成功,随后校验失败:查询得到state=failed+err_code=invalid_metadata(未知的 metadata 键同样是这个结果)。 metadata.action是 OpenAI 入口的概念;原生入口即使传了也会被端点覆盖。
提交响应
json
{
"task_id": "cgt-20261022160000-abcde",
"state": "created",
"model": "viduq3-turbo"
}这里的 task_id 是本网关的任务 ID,直接拿去 /ent/v2/tasks/{task_id}/creations 查询即可。提交阶段还没有调用上游,因此只回 state=created,不回 credits 等上游回显字段。
查询响应
json
{
"id": "cgt-20261022160000-abcde",
"state": "success",
"credits": 62.5,
"off_peak": false,
"bgm": false,
"creations": [
{
"id": "creation-1",
"url": "https://cdn.example.com/video.mp4",
"cover_url": "https://cdn.example.com/cover.jpg",
"watermarked_url": "https://cdn.example.com/video-wm.mp4"
}
]
}state 的取值与上游一致:
state | 含义 | 是否终态 |
|---|---|---|
created | 已受理:排队中、提交中或素材准备中 | 否 |
processing | 上游生成中 | 否 |
success | 成功,creations 里是结果地址 | 是 |
failed | 失败,看 err_code 与 message | 是 |
canceled | 已取消 | 是 |
failed 时 err_code 优先回上游原始错误码(如 TaskPromptPolicyViolation);本地判死、上游没给码时回网关错误码(如 empty_creation)。message 是可读文案,可直接展示给用户。
错误响应
鉴权、限流、分发等早于任务的失败,以及查询/取消失败,都使用上游同形的错误信封:
json
{
"code": 400,
"reason": "invalid_duration",
"message": "vidu2.0 只接受 4 或 8 秒(收到 5)",
"metadata": { "trace_id": "" }
}reason 按 Vidu 的错误码命名(Unauthorized、CreditInsufficient、QuotaExceeded、TooManyRequests、TaskNotFound、BadRequest、TaskPromptPolicyViolation、UserCancelled …)。网关内部独有的错误码(如 invalid_duration)会原样出现在 reason 里,而不是被编造成上游码。
取消
POST https://api.yu-yu.ai/ent/v2/tasks/{task_id}/cancel 已注册,但本网关暂未接上游取消能力:任务存在时返回 501 + reason=cancel_not_supported,任务不存在时返回 404 + reason=TaskNotFound。任务会继续执行到终态并正常结算,如需提前终止请联系管理员。
常见问题
- 提交返回
unsupported_vidu_model:model必须是本页清单里的名字,其它写法(含自定义别名)都会被拒绝。 - 只想文生视频却收到 400:
viduq4-preview、viduq3-pro-fast、viduq3-mix、viduq3-drama、viduq3-ad、viduq3、viduq2-pro、viduq2-turbo、viduq2-pro-fast、viduq1-classic、vidu2.0都不支持纯文本输入,至少要给一张图。 vidu2.0传 5 秒报错:该模型只接受4或8秒。- 参考图较多时报错:除
viduq4-preview(15 张)外,参考生视频最多 7 张。 - 查询一直
in_progress:模型正在生成或任务在排队;错峰任务排队时间可能明显更长。 - 结果地址打不开:
metadata.url有有效期,请及时下载;也可以调用GET /v1/videos/{task_id}/content由网关转发。
