模型路由 视频生成模型

CMR Video API 根据文本提示词和可选的图片、视频素材,异步生成视频,适用于营销内容制作、短视频创作、视频编辑等场景。你只需使用统一的接口和 CMR API Key,即可调用不同厂商的视频生成模型。视频生成为异步任务:先调用创建接口提交任务并获得任务 ID,再通过查询接口轮询任务状态,任务完成后从响应中获取视频下载地址。相关操作使用以下接口。

相关产品
模型路由 产品页,含版本规格、价格与购买入口。

一、概述

POST /v1/videos — 创建视频生成任务GET /v1/videos/{video_id} — 查询单个任务GET /v1/videos — 查询任务列表DELETE /v1/videos/{video_id} — 取消任务

二、前提条件

1. 建议提前阅读 使用约束 与 支持的模型提供商 了解相关信息。

2. 已创建模型路由实例,详细操作指导请参见 创建模型路由实例。

3. 已创建 BYOK 实例,详细操作指导请参见 创建 BYOK 实例。

4. 已创建模型路由访问密钥(API Key),详细操作指导请参见 创建模型路由访问密钥。

5. 已完成视频生成模型关联和模型路由策略配置,详细操作指导请参见 配置模型调度管理。

四、请求地址

POST {CMR_BASE_URL}/v1/videosGET {CMR_BASE_URL}/v1/videos/{video_id}GET {CMR_BASE_URL}/v1/videosDELETE {CMR_BASE_URL}/v1/videos/{video_id}

CMR_BASE_URL 为控制台展示的实例访问地址。请求使用 CMR 模型名称和 CMR API Key,无需填写厂商的接口地址或 API Key。

五、请求头

Header 必填 说明
Authorization 是 Bearer <CMR_API_KEY>
Content-Type 是 固定为 application/json

六、快速开始

将示例中的访问地址、API Key 和模型名称替换为自己的配置。

七、cURL

# ① 创建任务curl –request POST "${CMR_BASE_URL}/v1/videos" \\ –header "Authorization: Bearer ${CMR_API_KEY}" \\ –header "Content-Type: application/json" \\ –data '{ "model": "kling-v3", "contents": [ { "type": "text", "text": "一只橙色小猫在窗台上看向镜头,阳光洒在毛发上" } ], "duration": 5, "resolution": "1080p", "aspect_ratio": "16:9" }'# → {"id":"video_abc123","error":null}# ② 轮询任务状态,直到 status 为 completed 或 failedcurl –request GET "${CMR_BASE_URL}/v1/videos/video_abc123" \\ –header "Authorization: Bearer ${CMR_API_KEY}"# ③ status=completed 后,从 outputs[0].url 获取视频并尽快下载转存

八、Python

import osimport timeimport requestsbase_url = os.environ["CMR_BASE_URL"]headers = { "Authorization": f"Bearer {os.environ['CMR_API_KEY']}", "Content-Type": "application/json",}# ① 创建任务resp = requests.post( f"{base_url}/v1/videos", headers=headers, json={ "model": "kling-v3", "contents": [ {"type": "text", "text": "一只橙色小猫在窗台上看向镜头,阳光洒在毛发上"} ], "duration": 5, "resolution": "1080p", "aspect_ratio": "16:9", }, timeout=30,)resp.raise_for_status()video_id = resp.json()["id"]# ② 轮询任务状态(建议间隔 5 秒以上)while True: task = requests.get( f"{base_url}/v1/videos/{video_id}", headers=headers, timeout=30, ).json() if task["status"] in ("completed", "failed", "expired"): break time.sleep(5)# ③ 获取结果if task["status"] == "completed": print(task["outputs"][0]["url"]) # 视频地址,请尽快下载转存else: print(task["error"])

九、创建任务

POST /v1/videos

十、请求参数

参数 类型 必填 说明
model string 是 CMR 模型名称,可用值以控制台为准
contents array 是 素材数组,见素材结构。必须至少包含一个 type=text 的提示词
task_type string 否 任务类型:text_to_video(文生视频)、image_to_video(图生视频)、video_reference(视频参考)。不传时按素材自动推断;显式传入时须与素材匹配
duration integer | "auto" 否 视频时长,单位秒。"auto" 表示由模型自选时长(仅部分模型支持)
resolution string 否 分辨率档位:480p、540p、720p、768p、1080p、2k、4k
aspect_ratio string 否 宽高比:16:9、9:16、1:1、4:3、3:4、21:9、2:3、3:2
audio string 否 音频设置:native(生成视频时附带音频)、original(保留参考视频的原声,需在 contents 中包含视频素材)、none(默认,无声)。所选模型是否支持音频以模型为准,不支持时按无声处理或返回相应错误
seed integer 否 随机种子,用于结果复现(按模型支持)
watermark boolean 否 是否添加水印,默认 false(按模型支持)
negative_prompt string 否 负向提示词,描述不希望出现的内容(按模型支持)

参数取值与模型能力:duration、resolution、aspect_ratio 等参数的取值是否被所选模型支持,由模型侧校验——传入了模型不支持的取值时,请求会返回相应错误(错误信息来自模型侧,便于排查)。选填参数是否生效取决于所选模型,未填写的选填参数 CMR 不自动补默认值。

十一、素材结构

contents 数组中每项为一个素材对象:

类型 格式 说明
文本 {"type":"text","text":"…"} 提示词,唯一入口。一个任务至少一个
图片 {"type":"image","role":"first_frame" | "last_frame" | "reference","url":"…","id":"…"} url 支持公网 URL 或 Data URI;role 标注用途(首帧/尾帧/参考图);id 为可选引用锚点,供提示词引用素材,同任务内唯一
视频 {"type":"video","role":"base" | "feature","url":"…","id":"…"} 仅支持公网 URL;base 为待编辑的主体视频,feature 为参考视频
主体 {"type":"element","element_id":"…"} 厂商侧预置的主体素材 ID(按模型支持)

素材与任务类型的匹配:

任务类型 contents 组成 说明
文生视频 text_to_video 仅文本 传入图片或视频会返回 400
图生视频 image_to_video 文本 + 图片 ≥1 可用首帧/尾帧/参考图;须至少一张图片
视频参考 video_reference 文本 + 视频 ≥1 + 可选图片 以视频为参考生成新视频

格式约束:图片支持 jpg/jpeg/png/webp,大小 ≤50MB,短边 ≥300px;视频支持 mp4/mov,时长限制以所选模型为准。first_frame+last_frame 与 reference 类素材不可混用;base 与 feature 视频不可混用。

十二、请求示例

图生视频(指定首帧):

{ "model": "kling-v3", "contents": [ { "type": "text", "text": "让画面中的主体自然转头,微风吹动头发" }, { "type": "image", "role": "first_frame", "url": "https://example.com/start.jpg" } ], "duration": 5, "resolution": "1080p", "aspect_ratio": "16:9"}

视频生视频:

{ "model": "kling-3.0-omni", "contents": [ { "type": "text", "text": "让画面主体自然转头" }, { "type": "video", "role": "feature", "url": "https://example.com/clip.mp4" } ]}

十三、响应参数

参数 类型 是否一定返回 说明
id string 是 任务 ID,后续查询、取消的唯一句柄
error object | null 是 成功恒为 null;失败时返回统一错误格式

十四、响应示例

{ "id": "video_abc123", "error": null}

创建接口为异步受理:返回 id 只表示任务已受理排队,不代表生成成功,请通过查询接口获取最终结果。

十五、Provider 自定义参数

CMR 实例默认开启参数转换,并默认透传厂商自定义参数。按厂商要求将参数放入请求即可,无需逐个配置放行;如果实例已配置参数过滤规则,则按该规则处理。

例如,所选模型支持 return_last_frame(返回尾帧图,用于多段视频接力)时,可以这样请求:

{ "model": "doubao-seedance-2-5", "contents": [{ "type": "text", "text": "清晨的咖啡馆里,一杯咖啡冒着热气" }], "return_last_frame": true}

如需设置默认值、修改参数值或过滤字段,可在目标 CMR 实例的参数转换配置中设置规则。通过管理 API 配置时,使用 CreateParamTranslationConfig 保存、TestParamTranslationConfig 预览;Video 规则的端点填写 video。配置方法和示例可参考参数协议转换说明。自定义参数的名称、填写层级和取值以厂商说明为准。更换模型或厂商后,请确认这些参数仍然适用。

十六、查询任务

GET /v1/videos/{video_id}

路径参数 video_id 为创建时返回的任务 ID。

十七、响应参数

基本字段:

参数 类型 是否一定返回 说明
id string 是 任务 ID
object string 是 固定为 video
status string 是 任务状态,见任务状态
created_at integer 是 任务创建时间,Unix 时间戳,单位为秒
completed_at integer | null 是 任务到达终态的时间;未终态时为 null
model string 是 创建请求中的模型名称
error object | null 是 任务失败原因;成功和进行中为 null
outputs array 否 生成产物,仅 status=completed 时返回
usage object 否 用量信息,仅终态时返回

任务失败:查询接口本身失败(如任务不存在、无权限)返回统一错误格式;任务生成失败是任务属性而非请求失败——查询仍返回 HTTP 200,失败原因在 error 字段中。

产物 outputs[](当前每个任务返回一个视频):

参数 类型 是否一定返回 说明
outputs[].url string 是 视频下载地址(临时地址,请尽快转存)
outputs[].cover_url string | null 是 封面图地址;模型未提供时为 null
outputs[].watermark_url string | null 是 含水印版本地址;模型未提供时为 null
outputs[].last_frame_url string | null 是 尾帧图地址(用于多段接力);未请求或模型不支持时为 null

用量 usage(终态返回;进行中为 null):

参数 类型 是否一定返回 说明
usage.seconds integer 是 实际生成时长,单位秒
usage.width / usage.height integer | null 是 视频像素宽高;无法确定时为 null
usage.fps integer | null 是 帧率;模型未提供时为 null
usage.tokens integer | null 是 按 Token 计费模型的用量;按秒计费模型为 null
usage.billing array | null 是 部分模型返回的计费明细(金额、资源包抵扣等),对账依据;模型未提供时为 null

CMR 只返回模型实际提供的用量字段内容,缺失项为 null 而非补 0。

十八、响应示例

{ "id": "video_abc123", "object": "video", "status": "completed", "created_at": 1787000000, "completed_at": 1787000300, "model": "kling-v3", "error": null, "outputs": [ { "url": "https://example-cdn.com/output/abc123.mp4?sign=…", "cover_url": "https://example-cdn.com/output/abc123_cover.jpg?sign=…", "watermark_url": null, "last_frame_url": null } ], "usage": { "seconds": 5, "width": 1920, "height": 1080, "fps": 24, "tokens": null, "billing": null }}

十九、查询任务列表

GET /v1/videos

20、请求参数

参数 类型 说明
status string 按状态过滤:queued、in_progress、completed、failed、expired
model string 按模型名称精确过滤
offset integer 偏移量,默认 0(按创建时间降序)
limit integer 每页数量,1 – 100,默认 20

21、响应参数

参数 类型 说明
data array 任务列表,每项含 id、object、status、model、created_at、completed_at、error(不含 outputs/usage,获取产物请查询单任务)
total integer 满足当前过滤条件的任务总数

offset + limit < total 时还有下一页,由调用方自行判断。列表仅返回当前 CMR API Key 所属实例的任务。

22、取消任务

DELETE /v1/videos/{video_id}

仅 queued(排队中)状态的任务可取消。取消成功返回 204 No Content(无响应体)。

取消成功后,任务进入 failed 终态,error.code 为 cancelled。

是否支持取消取决于所选模型对应的厂商:不支持时返回 405(cancel_not_supported);任务已开始生成或已终态时返回 409(conflict)。

23、任务状态

状态 说明
queued 已受理,排队中(此状态可取消)
in_progress 生成中
completed 生成成功,outputs 可用
failed 生成失败(含用户取消、内容审核不通过),原因见 error
expired 任务超过保留期,产物已不可用

状态只会向前迁移,不会回退;终态(completed/failed/expired)不再变化。建议轮询间隔 5 秒以上,避免高频查询。

24、结果地址说明

·outputs[].url 为模型侧的临时下载地址,各厂商有效期不同(最短约 12 小时),请在任务完成后尽快下载转存。

·地址过期后访问会失败,且 CMR 不提供重新获取地址的能力。

·需要精确过期时间的调用方,可自行解析地址中的签名参数(如 URL 中的 Expires、q-sign-time 等字段,以实际返回为准)。

25、错误响应

·请求失败时,CMR 返回统一的错误格式:

{ "error": { "message": "duration 7 超出模型支持范围", "type": "invalid_request_error", "param": "duration", "code": "invalid_parameter" }}

参数 说明
error.message 错误说明;来自模型侧的错误保留原文,便于排查
error.type 错误类型
error.param 相关请求参数;无法定位时为 null
error.code 错误码,以实际响应为准

·常见错误码

HTTP type code 场景与处理建议
400 invalid_request_error invalid_parameter 请求格式错误、素材组合不匹配、参数取值不被模型支持。检查并修正请求
400 invalid_request_error content_policy_violation 内容未通过审核。调整提示词或素材
400 invalid_request_error model_not_supported 模型不存在或未绑定到实例。检查模型名称
401 authentication_error unauthorized API Key 无效。检查 CMR_API_KEY
403 permission_error capability_not_enabled 实例未开通视频能力
403 permission_error forbidden 访问了不属于当前 Key 的任务
404 not_found_error not_found 任务不存在。检查 video_id
405 invalid_request_error cancel_not_supported 该模型不支持取消
409 invalid_request_error conflict 取消的任务不在排队状态
429 rate_limit_error rate_limited 并发任务数或创建频率超限。参考 Retry-After(如有),降低频率后重试
500 api_error internal_error 平台内部错误。稍后重试
502 api_error upstream_error 模型侧创建失败且重试耗尽。稍后重试;持续失败时记录任务 ID 并联系支持
赞 (0)
上一篇 4天前
下一篇 4天前