新用户注册即赠体验积分 立即领取 →
AI 模型接口

视频(Videos)

通过 seedancehappyhorse 异步视频接口提交生成任务,保存任务 ID 并轮询状态,成功后及时转存产物。

seedance 系列 happyhorse 系列

支持的视频系列

系列模型擅长协议风格
seedanceseedance-2-0seedance-2-0-fastseedance-2-0-mini多模态参考(图 + 视频 + 音频)、有声视频、视频编辑与延长、最高 4K多模态 content 数组
happyhorsehappyhorse-1.1-t2vhappyhorse-1.1-i2vhappyhorse-1.1-r2vhappyhorse-1.0-video-edit物理真实、运动流畅;多参考图指代生成;视频局部替换编辑input + parameters

通用约定

Base URL https://api.tokgate.io
  • 鉴权:与其它接口一致,请求头带 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 系列不支持直接上传含真人人脸的参考图或参考视频。涉及肖像的场景需走上游提供的授权素材方案(同账号产物信任、预置虚拟人像、已授权真人素材),请先通过联系页与我们确认可行路径。

提交生成任务

POST https://api.tokgate.io/api/v3/contents/generations/tasks

请求体字段

参数类型必填说明
modelstring必填tokgate.io 模型 ID,见上方模型表。
contentarray<object>必填输入素材数组,见下方「content 元素」。
resolutionstring可选分辨率,默认 720p。可选 480p / 720p / 1080p / 4k1080p 不支持 fast 与 mini;4kseedance-2-0 支持。
ratiostring可选宽高比,默认 adaptive。可选 21:9 / 16:9 / 4:3 / 1:1 / 3:4 / 9:16 / adaptive
durationinteger可选时长(秒),默认 5,取值 4 ~ 15;也可填 -1 让模型自行决定。实际时长以查询接口返回的 duration 为准,时长直接影响计费
generate_audioboolean可选默认 true,输出带同步音频。设 false 输出无声视频。对话内容建议放在双引号内以优化音频效果。
output_formatstring可选输出格式,当前支持且默认使用 mp4
watermarkboolean可选默认 false。设 true 时右下角显示 AI 生成水印。
return_last_frameboolean可选默认 false。设 true 时可在查询接口拿到视频尾帧图(与视频同宽高、无水印)。
toolsarray<object>可选工具配置,目前支持 [{"type": "web_search"}]。仅纯文本输入场景可用。
callback_urlstring可选任务状态变化时的回调地址(POST)。回调体结构与查询接口返回一致。发送失败会重试 3 次。
execution_expires_afterinteger可选任务超时阈值(秒),默认 172800(48 小时),取值 3600 ~ 259200。超时后任务标记为 expired
priorityinteger可选排队优先级 0 ~ 9,默认 0,数值越大越靠前。相同优先级按先进先出。只影响排队顺序,不会打断正在执行的任务。
safety_identifierstring可选终端用户唯一标识,不超过 64 字符。建议传用户 ID 的哈希值,避免泄露隐私。

Seedance 2.0 系列不支持的字段seedframescamera_fixedservice_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-0seedance-2-0-fastseedance-2-0-mini
分辨率480p / 720p / 1080p / 4k(10bit 位深)480p / 720p480p / 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 成功返回顶层 idGET 路径中的 {id} 直接使用同一值。queued / running 继续轮询;succeeded 读取 content.video_url;其余终态停止轮询。不要改用 task_id,成功状态值也不是 success

查询任务状态

GET https://api.tokgate.io/api/v3/contents/generations/tasks/{id}

路径参数 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实际生成参数。用 adaptiveduration: -1 时,从这里读取模型最终选择的值。
usage本次任务的 Token 用量,用于对账。
created_at / updated_at创建时间与状态更新时间(Unix 秒)。
generate_audio / output_format实际音频开关与输出格式。当前 output_formatmp4content.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-i2vinput.media 中有且仅有 1 张 first_frameprompt 可选不要传 ratio,输出比例跟随首帧
参考生视频(R2V)happyhorse-1.1-r2vinput.media 中 1 ~ 9 张 reference_image + 必填 prompt在提示词中按数组顺序使用 [Image N] 指代图片
视频编辑happyhorse-1.0-video-editinput.media 中有且仅有 1 个 video,可加 0 ~ 5 张 reference_imageprompt 必填最小请求只需 resolution;不要传 ratioduration

使用完整模型 ID请求只使用上表四个完整 ID,不要根据版本号自行拼接模型名。上线前可通过 GET /v1/models 确认当前 API Key 可见这些模型。

提交生成任务

POST https://api.tokgate.io/api/v1/services/aigc/video-generation/video-synthesis

请求头

Header必填说明
Authorization必填Bearer sk-***
Content-Type必填application/json
X-DashScope-Async必填固定 enable缺少该头会报错(提示不支持同步调用)。

请求体字段

参数类型必填说明
modelstring必填模型名,见上方清单。
input.promptstring视能力而定提示词。T2V / R2V / 视频编辑必填,I2V 可选。支持任意语言,长度不超过 5000 个非中文字符或 2500 个中文字符,超出自动截断。
input.mediaarray<object>视能力而定素材列表,元素含 typeurl。T2V 不需要。
input.media[].typestring必填first_frame(I2V 首帧,有且仅 1 张)/ reference_image(参考图)/ video(待编辑视频,有且仅 1 个)。
input.media[].urlstring必填素材地址。图片支持公网 URL 或 Base64(data:{MIME};base64,{数据});视频必须是公网可访问 URL
parameters.resolutionstring可选分辨率档位 480P / 720P / 1080P默认 1080P。视频编辑仅支持 720P / 1080P。注意档位是大写 P
parameters.ratiostring可选仅 T2V / R2V 使用。默认 16:9;可选 16:9 / 9:16 / 1:1 / 4:3 / 3:4 / 4:5 / 5:4 / 9:21 / 21:9。I2V 和视频编辑都不要传:前者跟随首帧,后者跟随输入视频。
parameters.durationinteger可选本页已验证的 T2V / I2V / R2V 请求均使用 5 秒;I2V / R2V 支持 3 ~ 15 的整数且默认 5。视频编辑不支持该参数,输出时长跟随输入视频,最长 15 秒。
parameters.watermarkboolean可选默认 true,在右下角添加固定文案 “Happy Horse” 的水印。不需要水印必须显式传 false
parameters.seedinteger可选随机种子,[0, 2147483647]。固定后结果更可复现,但因模型概率性不保证完全一致。
parameters.audio_settingstring可选仅视频编辑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_image1 ~ 9 张;格式同上;短边不低于 400 px,推荐 720P 以上清晰图;不超过 20 MB。避免过小、模糊或压缩过度的图。
参考图(视频编辑的 reference_image0 ~ 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 小时。请勿重复创建任务,直接轮询即可。

查询任务状态

GET https://api.tokgate.io/api/v1/tasks/{task_id}
{
  "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)")

上游参考:文生视频 · 图生视频 · 参考生视频 · 视频编辑


系列差异速查

seedancehappyhorse
提交 / 查询路径POST /api/v3/contents/generations/tasks
GET /api/v3/contents/generations/tasks/{id}
POST /api/v1/services/aigc/video-generation/video-synthesis
GET /api/v1/tasks/{task_id}
异步请求头不需要额外头必须 X-DashScope-Async: enable
素材字段content[]type + roleinput.media[]type + url
控制参数位置请求体顶层parameters 对象内
任务 ID 字段idoutput.task_id
状态字段与取值status:小写(succeeded…)output.task_status:大写(SUCCEEDED…)
视频地址字段content.video_urloutput.video_url
分辨率写法小写 720p,默认 720p大写 720P,默认 1080P
水印默认值falsetrue
任务记录保留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 状态判断查询成功。