视频(Videos)
通过 seedance 与 happyhorse 异步视频接口提交生成任务,保存任务 ID 并轮询状态,成功后及时转存产物。
支持的视频系列
| 系列 | 模型 | 擅长 | 协议风格 |
|---|---|---|---|
| seedance | seedance-2-0、seedance-2-0-fast、seedance-2-0-mini | 多模态参考(图 + 视频 + 音频)、有声视频、视频编辑与延长、最高 4K | 多模态 content 数组 |
| happyhorse | happyhorse-1.1-t2v、happyhorse-1.1-i2v、happyhorse-1.1-r2v、happyhorse-1.0-video-edit | 物理真实、运动流畅;多参考图指代生成;视频局部替换编辑 | input + parameters |
通用约定
- 鉴权:与其它接口一致,请求头带
Authorization: Bearer sk-***。 - 异步流程:提交任务 → 拿到任务 ID → 按固定间隔轮询状态 → 状态成功后取视频地址 → 立即下载转存。
- 轮询间隔:视频生成通常需要 1 ~ 5 分钟,建议间隔 15 秒左右,不要低于 5 秒。
- 不要重复提交:提交成功后请保存任务 ID 并轮询。重复提交会生成新任务并重复计费。
- 产物有效期:两个系列返回的视频链接均只保留 24 小时,过期自动清除。
超时与长连接视频接口不要用长连接等结果。客户端 HTTP 超时按「提交请求」的耗时设置(数秒级),生成进度靠轮询接口获取。
seedance 系列
火山方舟 Doubao Seedance 2.0 系列支持图像、视频、音频、文本多模态输入,以及视频生成、编辑与延长能力。
支持的模型
请求时在 model 字段中使用以下模型 ID。
| 模型 ID | 定位 |
|---|---|
seedance-2-0 | 旗舰,追求最高生成品质,唯一支持 4K |
seedance-2-0-fast | 更快出片,兼顾质量与速度 |
seedance-2-0-mini | 成本优先,适合大批量试片 |
公共模型 ID请求只使用上表三个公共模型 ID。内部 endpoint ID 与响应中的上游规范化模型名都不是请求参数;成功响应的 model 可能显示为上游名称,后续请求仍使用上表 ID。
能力矩阵
| 能力 | 输入组合 | 说明 |
|---|---|---|
| 文生视频 | 文本 | 纯提示词生成 1 个视频。 |
| 图生视频 · 首帧 | 首帧图 + 文本(可选) | 以给定图片作为第一帧向后生成。 |
| 图生视频 · 首尾帧 | 首帧图 + 尾帧图 + 文本(可选) | 在两张图之间补全运动过程。 |
| 多模态参考生视频 | 图片 0~9 张 + 视频 0~3 个 + 音频 0~3 个 + 文本(可选) | 组合参考素材生成全新视频。不可只传音频,至少要有 1 个参考视频或图片。 |
| 编辑视频 | 视频 + 图片 + 文本 | 如「把视频里礼盒中的香水替换成图 1 中的面霜,运镜不变」。 |
| 延长视频 | 待延长视频 + 文本 | 在已有视频后续接内容。 |
| 有声视频 | — | generate_audio: true 时自动生成与画面同步的人声、音效与背景音乐(单声道)。 |
| 联网搜索 | 纯文本输入 | tools: [{"type": "web_search"}],让模型先查资料再生成。仅纯文本输入时可用。 |
| 返回尾帧图 | — | return_last_frame: true,用上一段的尾帧作下一段的首帧,可串出连续长视频。 |
真人肖像素材有限制Seedance 2.0 系列不支持直接上传含真人人脸的参考图或参考视频。涉及肖像的场景需走上游提供的授权素材方案(同账号产物信任、预置虚拟人像、已授权真人素材),请先通过联系页与我们确认可行路径。
提交生成任务
请求体字段
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
model | string | 必填 | tokgate.io 模型 ID,见上方模型表。 |
content | array<object> | 必填 | 输入素材数组,见下方「content 元素」。 |
resolution | string | 可选 | 分辨率,默认 720p。可选 480p / 720p / 1080p / 4k。1080p 不支持 fast 与 mini;4k 仅 seedance-2-0 支持。 |
ratio | string | 可选 | 宽高比,默认 adaptive。可选 21:9 / 16:9 / 4:3 / 1:1 / 3:4 / 9:16 / adaptive。 |
duration | integer | 可选 | 时长(秒),默认 5,取值 4 ~ 15;也可填 -1 让模型自行决定。实际时长以查询接口返回的 duration 为准,时长直接影响计费。 |
generate_audio | boolean | 可选 | 默认 true,输出带同步音频。设 false 输出无声视频。对话内容建议放在双引号内以优化音频效果。 |
output_format | string | 可选 | 输出格式,当前支持且默认使用 mp4。 |
watermark | boolean | 可选 | 默认 false。设 true 时右下角显示 AI 生成水印。 |
return_last_frame | boolean | 可选 | 默认 false。设 true 时可在查询接口拿到视频尾帧图(与视频同宽高、无水印)。 |
tools | array<object> | 可选 | 工具配置,目前支持 [{"type": "web_search"}]。仅纯文本输入场景可用。 |
callback_url | string | 可选 | 任务状态变化时的回调地址(POST)。回调体结构与查询接口返回一致。发送失败会重试 3 次。 |
execution_expires_after | integer | 可选 | 任务超时阈值(秒),默认 172800(48 小时),取值 3600 ~ 259200。超时后任务标记为 expired。 |
priority | integer | 可选 | 排队优先级 0 ~ 9,默认 0,数值越大越靠前。相同优先级按先进先出。只影响排队顺序,不会打断正在执行的任务。 |
safety_identifier | string | 可选 | 终端用户唯一标识,不超过 64 字符。建议传用户 ID 的哈希值,避免泄露隐私。 |
Seedance 2.0 系列不支持的字段seed、frames、camera_fixed、service_tier(仅在线推理)、draft(样片模式)在 2.0 系列上暂不支持,传入会被忽略或报错。
content 元素
type | 结构 | role | 说明 |
|---|---|---|---|
text | {"type":"text","text":"..."} | — | 提示词。可在其中用「图片1」「视频1」「音频1」指代后面的素材。 |
image_url | {"type":"image_url","image_url":{"url":"..."},"role":"reference_image"} | reference_image | 参考图片,0 ~ 9 张。支持公网 URL 或 Base64 data URI。 |
video_url | {"type":"video_url","video_url":{"url":"..."},"role":"reference_video"} | reference_video | 参考视频,0 ~ 3 个。用于编辑、延长或风格参考。 |
audio_url | {"type":"audio_url","audio_url":{"url":"..."},"role":"reference_audio"} | reference_audio | 参考音频,0 ~ 3 个。不能单独只传音频。 |
输出规格差异
| 项 | seedance-2-0 | seedance-2-0-fast | seedance-2-0-mini |
|---|---|---|---|
| 分辨率 | 480p / 720p / 1080p / 4k(10bit 位深) | 480p / 720p | 480p / 720p |
| 宽高比 | 21:9、16:9、4:3、1:1、3:4、9:16、adaptive | ||
| 时长 | 4 ~ 15 秒(或 -1 交由模型决定) | ||
| 输出格式 | MP4(4K 为 H.265 编码) | ||
4K 播放兼容性4K 视频采用 H.265 + 10bit 编码,少数浏览器与播放器不兼容。如遇播放异常,建议改用 VLC、MPV、QuickTime Player 等播放器,或降到 1080p。
提交响应
{
"id": "cgt-2026xxxx-xxxx"
}
返回的 id 即任务 ID,用于后续查询。任务记录保留 7 天(从创建时间起算),超时自动清除。
任务 ID 与轮询契约POST 成功返回顶层 id,GET 路径中的 {id} 直接使用同一值。queued / running 继续轮询;succeeded 读取 content.video_url;其余终态停止轮询。不要改用 task_id,成功状态值也不是 success。
查询任务状态
路径参数 id 直接填写提交接口返回的同名 id。
{
"id": "cgt-2026xxxx-xxxx",
"model": "doubao-seedance-2-0-260128",
"status": "succeeded",
"content": {
"video_url": "https://.../result.mp4"
},
"usage": {
"completion_tokens": 108900,
"total_tokens": 108900
},
"created_at": 1779348818,
"updated_at": 1779348874,
"resolution": "720p",
"ratio": "16:9",
"duration": 5,
"framespersecond": 24,
"generate_audio": true,
"output_format": "mp4",
"service_tier": "default",
"execution_expires_after": 172800,
"priority": 0
}
| 字段 | 说明 |
|---|---|
model | 响应中的上游规范化模型名,仅用于记录结果;后续请求仍使用上方公共模型 ID。 |
status | 任务状态,见下方枚举。 |
content.video_url | 视频地址,仅 succeeded 时返回。有效期 24 小时。 |
error | 失败时返回错误详情;成功响应可能不包含此字段。 |
resolution / ratio / duration / framespersecond | 实际生成参数。用 adaptive 或 duration: -1 时,从这里读取模型最终选择的值。 |
usage | 本次任务的 Token 用量,用于对账。 |
created_at / updated_at | 创建时间与状态更新时间(Unix 秒)。 |
generate_audio / output_format | 实际音频开关与输出格式。当前 output_format 为 mp4,content.video_url 指向可下载的 MP4 文件。 |
| status | 含义 | 处理 |
|---|---|---|
queued | 已提交,排队中 | 继续轮询 |
running | 生成中 | 继续轮询 |
succeeded | 成功 | 取 content.video_url 并立即转存 |
failed | 失败 | 读 error 定位原因,修改提示词或素材后重试 |
cancelled | 已取消(仅排队中的任务可取消) | 需要结果时重新提交 |
expired | 超过 execution_expires_after 未完成,已终止 | 重新提交,必要时调大超时阈值 |
完整示例
# Step 1:提交任务
curl -X POST https://api.tokgate.io/api/v3/contents/generations/tasks \
-H "Content-Type: application/json" \
-H "Authorization: Bearer sk-***" \
-d '{
"model": "seedance-2-0",
"content": [
{ "type": "text", "text": "清晨的海岸线,浪花拍打礁石,海鸥低空盘旋,镜头由远及近推进" }
],
"resolution": "720p",
"ratio": "16:9",
"duration": 5,
"generate_audio": true,
"output_format": "mp4",
"watermark": false
}'
# 响应: { "id": "cgt-2026xxxx-xxxx" }
# Step 2:轮询任务状态(建议间隔 15 秒)
curl https://api.tokgate.io/api/v3/contents/generations/tasks/cgt-2026xxxx-xxxx \
-H "Authorization: Bearer sk-***"
# Step 3:status 变为 succeeded 后下载 content.video_url
curl -o coastline.mp4 "https://.../result.mp4"
curl -X POST https://api.tokgate.io/api/v3/contents/generations/tasks \
-H "Content-Type: application/json" \
-H "Authorization: Bearer sk-***" \
-d '{
"model": "seedance-2-0-fast",
"content": [
{ "type": "text", "text": "以图片1为首帧,产品缓慢旋转展示细节,柔和棚拍光" },
{
"type": "image_url",
"image_url": { "url": "https://your-cdn.example.com/product.jpg" },
"role": "reference_image"
}
],
"resolution": "720p",
"ratio": "adaptive",
"duration": 5
}'
{
"model": "seedance-2-0",
"content": [
{
"type": "text",
"text": "第一人称视角的果茶广告:首帧为图片1,手摘下一颗带晨露的苹果;随后快切到雪克杯摇晃;尾帧定格为图片2。全程使用视频1的构图节奏,音频1作为背景音乐"
},
{ "type": "image_url", "image_url": { "url": "https://your-cdn.example.com/pic1.jpg" }, "role": "reference_image" },
{ "type": "image_url", "image_url": { "url": "https://your-cdn.example.com/pic2.jpg" }, "role": "reference_image" },
{ "type": "video_url", "video_url": { "url": "https://your-cdn.example.com/ref.mp4" }, "role": "reference_video" },
{ "type": "audio_url", "audio_url": { "url": "https://your-cdn.example.com/bgm.mp3" }, "role": "reference_audio" }
],
"generate_audio": true,
"ratio": "16:9",
"duration": 11,
"watermark": false,
"return_last_frame": true
}
{
"model": "seedance-2-0",
"content": [
{ "type": "text", "text": "拍一段介绍玻璃蛙外形特征的自然纪录片镜头,需符合真实生物特征" }
],
"tools": [{ "type": "web_search" }],
"ratio": "16:9",
"duration": 11,
"watermark": false
}
上游参考:火山方舟 Doubao Seedance 2.0 系列教程
happyhorse 系列
HappyHorse 视频生成系列支持文生视频、图生视频(基于首帧)、参考生视频(多图指代)与视频编辑。
支持的模型
| 能力 | 模型(model) | 输入 | 关键参数规则 |
|---|---|---|---|
| 文生视频(T2V) | happyhorse-1.1-t2v | 仅传必填的 input.prompt,不要传 input.media | 可传 ratio;本页验证组合为 720P、16:9、5 秒 |
| 图生视频 · 基于首帧(I2V) | happyhorse-1.1-i2v | input.media 中有且仅有 1 张 first_frame;prompt 可选 | 不要传 ratio,输出比例跟随首帧 |
| 参考生视频(R2V) | happyhorse-1.1-r2v | input.media 中 1 ~ 9 张 reference_image + 必填 prompt | 在提示词中按数组顺序使用 [Image N] 指代图片 |
| 视频编辑 | happyhorse-1.0-video-edit | input.media 中有且仅有 1 个 video,可加 0 ~ 5 张 reference_image;prompt 必填 | 最小请求只需 resolution;不要传 ratio 或 duration |
使用完整模型 ID请求只使用上表四个完整 ID,不要根据版本号自行拼接模型名。上线前可通过 GET /v1/models 确认当前 API Key 可见这些模型。
提交生成任务
请求头
| Header | 必填 | 说明 |
|---|---|---|
Authorization | 必填 | Bearer sk-*** |
Content-Type | 必填 | application/json |
X-DashScope-Async | 必填 | 固定 enable。缺少该头会报错(提示不支持同步调用)。 |
请求体字段
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
model | string | 必填 | 模型名,见上方清单。 |
input.prompt | string | 视能力而定 | 提示词。T2V / R2V / 视频编辑必填,I2V 可选。支持任意语言,长度不超过 5000 个非中文字符或 2500 个中文字符,超出自动截断。 |
input.media | array<object> | 视能力而定 | 素材列表,元素含 type 与 url。T2V 不需要。 |
input.media[].type | string | 必填 | first_frame(I2V 首帧,有且仅 1 张)/ reference_image(参考图)/ video(待编辑视频,有且仅 1 个)。 |
input.media[].url | string | 必填 | 素材地址。图片支持公网 URL 或 Base64(data:{MIME};base64,{数据});视频必须是公网可访问 URL。 |
parameters.resolution | string | 可选 | 分辨率档位 480P / 720P / 1080P,默认 1080P。视频编辑仅支持 720P / 1080P。注意档位是大写 P。 |
parameters.ratio | string | 可选 | 仅 T2V / R2V 使用。默认 16:9;可选 16:9 / 9:16 / 1:1 / 4:3 / 3:4 / 4:5 / 5:4 / 9:21 / 21:9。I2V 和视频编辑都不要传:前者跟随首帧,后者跟随输入视频。 |
parameters.duration | integer | 可选 | 本页已验证的 T2V / I2V / R2V 请求均使用 5 秒;I2V / R2V 支持 3 ~ 15 的整数且默认 5。视频编辑不支持该参数,输出时长跟随输入视频,最长 15 秒。 |
parameters.watermark | boolean | 可选 | 默认 true,在右下角添加固定文案 “Happy Horse” 的水印。不需要水印必须显式传 false。 |
parameters.seed | integer | 可选 | 随机种子,[0, 2147483647]。固定后结果更可复现,但因模型概率性不保证完全一致。 |
parameters.audio_setting | string | 可选 | 仅视频编辑。auto(默认,由模型控制)或 origin(保留输入视频原始声音)。 |
模型必须匹配输入结构T2V 只传 input.prompt;I2V、R2V 和视频编辑必须按上表传 input.media。出现 Field required: input.media 通常表示模型与请求体结构不匹配,不要通过给 T2V 添加无关素材来规避。
默认带水印happyhorse 的 watermark 默认为 true,与 seedance(默认 false)相反。商业用途请显式传 false。
素材限制
| 素材 | 限制 |
|---|---|
首帧图(first_frame) | 格式 JPEG / JPG / PNG / WEBP;宽高均不小于 300 px;宽高比 1:2.5 ~ 2.5:1;不超过 20 MB;有且仅 1 张。 |
参考图(R2V 的 reference_image) | 1 ~ 9 张;格式同上;短边不低于 400 px,推荐 720P 以上清晰图;不超过 20 MB。避免过小、模糊或压缩过度的图。 |
参考图(视频编辑的 reference_image) | 0 ~ 5 张;宽高均不小于 300 px;宽高比 1:2.5 ~ 2.5:1;不超过 20 MB。 |
待编辑视频(video) | 格式 MP4 / MOV(建议 H.264);时长 3 ~ 60 秒;长边不超过 4096 px、短边不小于 360 px;宽高比 1:2.5 ~ 2.5:1;不超过 100 MB;帧率大于 8 fps;必须是公网可访问 URL。 |
视频编辑的输出时长输出为 3 ~ 15 秒。输入视频不超过 15 秒时,输出时长与输入一致;超过 15 秒时系统自动截取前 15 秒,因此最长输出 15 秒。
R2V 的参考指代写法
参考生视频要在 prompt 里用 [Image 1]、[Image 2] 指代 media 数组中对应位置的图片(顺序与数组一致),并明确指出参考图中的具体对象。例如「[Image 1] 中身着红色旗袍的女性,轻抬手展开 [Image 2] 中的折扇」。
提交响应
{
"output": {
"task_status": "PENDING",
"task_id": "0385dc79-5ff8-4d82-bcb6-xxxxxx"
},
"request_id": "4909100c-7b5a-9f92-bfe5-xxxxxx"
}
保存 output.task_id,查询有效期 24 小时。请勿重复创建任务,直接轮询即可。
查询任务状态
{
"request_id": "99243b47-ec5f-9413-9993-xxxxxx",
"output": {
"task_id": "4673458e-28be-4a05-bf2a-xxxxxx",
"task_status": "SUCCEEDED",
"submit_time": "2026-04-20 17:55:17.075",
"scheduled_time": "2026-04-20 17:55:17.129",
"end_time": "2026-04-20 17:56:36.658",
"orig_prompt": "一座由硬纸板和瓶盖搭建的微型城市,在夜晚焕发出生机",
"video_url": "https://.../result.mp4?Expires=..."
},
"usage": {
"duration": 5,
"input_video_duration": 0,
"output_video_duration": 5,
"video_count": 1,
"SR": 720,
"ratio": "16:9"
}
}
{
"request_id": "e5d70b02-ebd3-98ce-9fe8-xxxxxx",
"output": {
"task_id": "86ecf553-d340-4e21-af6e-xxxxxx",
"task_status": "FAILED",
"code": "InvalidParameter",
"message": "The parameter is invalid."
}
}
{
"request_id": "a4de7c32-7057-9f82-8581-xxxxxx",
"output": {
"task_id": "502a00b1-19d9-4839-a82f-xxxxxx",
"task_status": "UNKNOWN"
}
}
| 字段 | 说明 |
|---|---|
output.task_status | 任务状态,见下方枚举。 |
output.video_url | 视频地址,仅 SUCCEEDED 时返回。格式 MP4(H.264 编码),有效期 24 小时。 |
output.orig_prompt | 原始输入的提示词。 |
output.submit_time / scheduled_time / end_time | 提交 / 开始执行 / 完成时间,格式 YYYY-MM-DD HH:mm:ss.SSS。 |
usage.duration | 计费总视频时长(秒)。视频编辑通常按输入与输出视频时长合计,以接口实际返回值为准。 |
usage.input_video_duration / output_video_duration | 输入 / 输出视频时长(秒)。 |
usage.SR / usage.ratio | 实际输出的分辨率档位与宽高比。 |
usage.video_count | 输出视频数量,固定为 1。 |
request_id | 请求唯一标识,排查问题时请提供。 |
| task_status | 含义 | 处理 |
|---|---|---|
PENDING | 排队中 | 继续轮询 |
RUNNING | 处理中 | 继续轮询 |
SUCCEEDED | 成功 | 取 video_url 并立即转存 |
FAILED | 失败 | 读 code / message 定位原因 |
CANCELED | 已取消 | 需要结果时重新提交 |
UNKNOWN | 任务不存在,或 task_id 已超过 24 小时有效期 | 确认 task_id;已过期只能重新提交 |
PENDING / RUNNING 时继续轮询;SUCCEEDED / FAILED / CANCELED / UNKNOWN 都是停止轮询的终态。查询接口即使 HTTP 200,也必须继续检查 output.task_status。默认查询上限为 20 RPS,建议每 15 秒轮询一次。
完整示例
# Step 1:只提交一次任务
curl -X POST https://api.tokgate.io/api/v1/services/aigc/video-generation/video-synthesis \
-H "Content-Type: application/json" \
-H "Authorization: Bearer sk-***" \
-H "X-DashScope-Async: enable" \
-d '{
"model": "happyhorse-1.1-t2v",
"input": {
"prompt": "一座由硬纸板和瓶盖搭建的微型城市,在夜晚焕发出生机。一列硬纸板火车缓缓驶过,小灯点缀其间,照亮前路。"
},
"parameters": {
"resolution": "720P",
"ratio": "16:9",
"duration": 5
}
}'
# 保存响应中的 output.task_id,不要重新 POST
# Step 2:每 15 秒查询一次同一个 task_id
curl https://api.tokgate.io/api/v1/tasks/0385dc79-5ff8-4d82-bcb6-xxxxxx \
-H "Authorization: Bearer sk-***"
# Step 3:仅当 output.task_status 为 SUCCEEDED 时下载 output.video_url
curl -o happyhorse-result.mp4 "https://.../result.mp4?Expires=..."
curl -X POST https://api.tokgate.io/api/v1/services/aigc/video-generation/video-synthesis \
-H "Content-Type: application/json" \
-H "Authorization: Bearer sk-***" \
-H "X-DashScope-Async: enable" \
-d '{
"model": "happyhorse-1.1-i2v",
"input": {
"prompt": "一只猫在草地上奔跑,阳光穿过草叶",
"media": [
{ "type": "first_frame", "url": "https://your-cdn.example.com/cat.png" }
]
},
"parameters": {
"resolution": "720P",
"duration": 5
}
}'
curl -X POST https://api.tokgate.io/api/v1/services/aigc/video-generation/video-synthesis \
-H "Content-Type: application/json" \
-H "Authorization: Bearer sk-***" \
-H "X-DashScope-Async: enable" \
-d '{
"model": "happyhorse-1.1-r2v",
"input": {
"prompt": "[Image 1] 中身着红色旗袍的女性,轻抬手展开 [Image 2] 中的折扇,最后推近至面部特写",
"media": [
{ "type": "reference_image", "url": "https://your-cdn.example.com/girl.jpg" },
{ "type": "reference_image", "url": "https://your-cdn.example.com/fan.jpg" }
]
},
"parameters": {
"resolution": "720P",
"ratio": "16:9",
"duration": 5
}
}'
curl -X POST https://api.tokgate.io/api/v1/services/aigc/video-generation/video-synthesis \
-H "Content-Type: application/json" \
-H "Authorization: Bearer sk-***" \
-H "X-DashScope-Async: enable" \
-d '{
"model": "happyhorse-1.0-video-edit",
"input": {
"prompt": "让视频中的角色穿上图片中的条纹毛衣,其余画面保持不变",
"media": [
{ "type": "video", "url": "https://your-cdn.example.com/source.mp4" },
{ "type": "reference_image", "url": "https://your-cdn.example.com/sweater.webp" }
]
},
"parameters": {
"resolution": "720P"
}
}'
Python 完整闭环(只创建一次)
先把 Key 放入 TOKGATE_API_KEY 环境变量。下面脚本只 POST 一次,随后一直查询同一个 task_id;遇到任一终态即停止,并在成功时校验 MP4 容器头后保存文件。要调用其它 HappyHorse 模型,只替换 payload 为上方对应请求体。
import json
import os
import time
from pathlib import Path
from urllib.request import Request, urlopen
base_url = "https://api.tokgate.io"
api_key = os.environ["TOKGATE_API_KEY"]
payload = {
"model": "happyhorse-1.1-t2v",
"input": {
"prompt": "一座由硬纸板和瓶盖搭建的微型城市,在夜晚焕发出生机"
},
"parameters": {
"resolution": "720P",
"ratio": "16:9",
"duration": 5
}
}
# 只创建一次任务
create_request = Request(
f"{base_url}/api/v1/services/aigc/video-generation/video-synthesis",
data=json.dumps(payload, ensure_ascii=False).encode("utf-8"),
headers={
"Authorization": f"Bearer {api_key}",
"Content-Type": "application/json",
"X-DashScope-Async": "enable",
},
method="POST",
)
with urlopen(create_request, timeout=30) as response:
created = json.load(response)
task_id = created["output"]["task_id"]
print(f"task_id={task_id}")
# 最多等待 30 分钟;PENDING / RUNNING 继续,任一终态停止
terminal_statuses = {"SUCCEEDED", "FAILED", "CANCELED", "UNKNOWN"}
for _ in range(120):
time.sleep(15)
query_request = Request(
f"{base_url}/api/v1/tasks/{task_id}",
headers={"Authorization": f"Bearer {api_key}"},
)
with urlopen(query_request, timeout=30) as response:
result = json.load(response)
output = result["output"]
status = output["task_status"]
print(f"task_status={status}")
if status in terminal_statuses:
break
else:
raise TimeoutError("任务在 30 分钟内未进入终态")
if status != "SUCCEEDED":
raise RuntimeError(
f"{status}: {output.get('code', '')} {output.get('message', '')}"
)
# 成功后立即下载;结果 URL 仅保留 24 小时
with urlopen(output["video_url"], timeout=180) as response:
video = response.read()
if len(video) < 12 or video[4:8] != b"ftyp":
raise RuntimeError("返回内容不是有效的 MP4 文件")
Path("happyhorse-result.mp4").write_bytes(video)
print(f"saved happyhorse-result.mp4 ({len(video)} bytes)")
上游参考:文生视频 · 图生视频 · 参考生视频 · 视频编辑
系列差异速查
| 项 | seedance | happyhorse |
|---|---|---|
| 提交 / 查询路径 | POST /api/v3/contents/generations/tasksGET /api/v3/contents/generations/tasks/{id} | POST /api/v1/services/aigc/video-generation/video-synthesisGET /api/v1/tasks/{task_id} |
| 异步请求头 | 不需要额外头 | 必须 X-DashScope-Async: enable |
| 素材字段 | content[](type + role) | input.media[](type + url) |
| 控制参数位置 | 请求体顶层 | parameters 对象内 |
| 任务 ID 字段 | id | output.task_id |
| 状态字段与取值 | status:小写(succeeded…) | output.task_status:大写(SUCCEEDED…) |
| 视频地址字段 | content.video_url | output.video_url |
| 分辨率写法 | 小写 720p,默认 720p | 大写 720P,默认 1080P |
| 水印默认值 | false | true |
| 任务记录保留 | 7 天 | 24 小时 |
| 音频生成 | generate_audio(默认开) | 视频编辑可用 audio_setting 保留原声 |
错误处理
- 提交阶段 4xx:多为参数组合非法(如给 fast / mini 传
1080p、给happyhorse-1.1-i2v传多张首帧、视频编辑传了duration)。按对应参数表核对后重试。状态码语义见 错误码。 - 缺少异步头:happyhorse 未带
X-DashScope-Async: enable会直接报错,提示不支持同步调用。 - 任务失败:常见原因是内容审核不通过、素材不符合限制、上游生成失败或超时。修改提示词、更换素材,或降低分辨率与时长后重试。
- 素材不可访问:传 URL 时确保公网可访问、无防盗链、无需鉴权;待编辑视频不支持 Base64,必须是可访问 URL。
- 产物过期:视频链接 24 小时后失效。生产环境务必在任务成功后立即下载并转存到自有对象存储。
- 不存在的任务仍可能返回 HTTP 200:客户端必须检查
status/output.task_status与错误字段,不能只按 HTTP 状态判断查询成功。
