/v1/video/generations 接口提交,使用 metadata.task_type 字段区分任务类型。提交与查询的响应结构不同,这是最容易踩坑的地方: 提交( POST /v1/video/generations)返回扁平结构,任务 ID 在顶层id(同时提供task_id别名)。查询( GET /v1/video/generations/{task_id})返回{code, message, data:{...}}包裹结构,业务字段全部在data里。详见第 1 节与第 4 节的响应示例。
{
"id": "435190535455101",
"task_id": "435190535455101",
"object": "video",
"model": "MiniMax-H3",
"status": "",
"progress": 0,
"created_at": 1787801999
}| 字段 | 类型 | 说明 |
|---|---|---|
id | string | 任务 ID,用于后续查询。推荐读这个字段 |
task_id | string | 与 id 值相同,兼容旧接口保留,后续可能废弃 |
object | string | 固定为 "video" |
model | string | 提交时使用的模型名 |
status | string | 建单瞬间为空字符串 "",不要据此判断任务状态,请以查询接口为准 |
progress | integer | 建单瞬间为 0(注意:提交响应里是整数,查 询响应里是字符串) |
created_at | integer | 建单时间(Unix 秒) |
⚠️ 提交响应没有 code/message/data包裹层,id在顶层。正确取法:resp["id"](或resp["task_id"]),不是resp["data"]["task_id"]。
{
"model": "MiniMax-H3",
"prompt": "画面中的女孩转过身来,微笑着挥手",
"duration": 5,
"resolution": "2K",
"metadata": {
"first_frame_image": "https://your-cdn.example.com/first-frame.jpg"
}
}{
"model": "MiniMax-H3",
"prompt": "镜头推进,最终定格在城市天际线",
"duration": 8,
"resolution": "2K",
"metadata": {
"last_frame_image": "https://your-cdn.example.com/last-frame.jpg"
}
}图生视频(首帧/尾帧)场景下 ratio由输入图片决定,即使你传了具体比例,平台也会强制改写为adaptive后再发往上游。
{
"model": "MiniMax-H3",
"prompt": "一位女性角色在海边散步,参考提供的人物形象和场景氛围",
"duration": 6,
"resolution": "2K",
"ratio": "16:9",
"metadata": {
"reference_images": [
"https://your-cdn.example.com/ref1.jpg",
"https://your-cdn.example.com/ref2.jpg"
]
}
}{
"model": "MiniMax-H3",
"prompt": "角色说话:Hello, welcome to the future. 参考视频中的人物动作和音频1的音色",
"duration": 5,
"resolution": "2K",
"ratio": "adaptive",
"metadata": {
"reference_videos": [
"https://your-cdn.example.com/reference.mp4"
],
"reference_audios": [
"https://your-cdn.example.com/reference.mp3"
]
}
}source_task_id 只能引用自己账号下已成功的任务,平台会校验归属与状态;引用不存在或未成功的任务会返回 build_request_failed(见第 7 节)。id 在顶层)。metadata.task_type 必须设置为 "regeneration"source_task_id 与 base_video_url 二选一,同时提供时以 source_task_id 为先base_video_url 支持公网 URL、mm_file://{file_id}、Base64 data URIprompt 必填(平台入口层强制校验,缺失直接 400)duration,输出时长由源视频决定reference_audios 等参考素材在提升分辨率的同时调整画面{
"model": "MiniMax-H3",
"prompt": "角色说话:Follow the wind, live free. 参考音频1的音色和视频1的人物动作",
"duration": 5,
"ratio": "adaptive",
"metadata": {
"task_type": "h3_context_ir",
"reference_videos": [
"https://your-cdn.example.com/reference.mp4"
],
"reference_audios": [
"https://your-cdn.example.com/reference.mp3"
]
}
}id 在顶层)。metadata.task_type 必须设置为 "h3_context_ir"prompt 必填resolution(只输出文本,无分辨率概念),传了也会被忽略duration 和 ratio 以影响扩写内容的时长描述和构图描述{code, message, data:{...}} 包裹结构,业务字段全部在 data 内。{
"code": "success",
"message": "",
"data": {
"task_id": "435190535455101",
"action": "generate",
"status": "IN_PROGRESS",
"fail_reason": "",
"submit_time": 1787801998,
"start_time": 1787802005,
"finish_time": 0,
"progress": "50%",
"data": {
"task": {
"id": "435190535455101",
"model": "MiniMax-H3",
"status": "running",
"ratio": "16:9",
"duration": 5,
"resolution": "768P",
"task_type": "generation",
"usage": {},
"created_at": 1787801999,
"updated_at": 1787801999
}
}
}
}{
"code": "success",
"message": "",
"data": {
"task_id": "435190535455101",
"action": "generate",
"status": "SUCCESS",
"fail_reason": "",
"result_url": "https://algeng-video-infer.oss-cn-shanghai.aliyuncs.com/infer/output_aigc.mp4?Expires=...&Signature=...",
"submit_time": 1787801998,
"start_time": 1787802005,
"finish_time": 1787802115,
"progress": "100%",
"data": {
"task": {
"id": "435190535455101",
"model": "MiniMax-H3",
"status": "succeeded",
"content": { "url": "https://.../output_aigc.mp4?Expires=..." },
"usage": {
"total_tokens": 162745,
"completion_tokens": 162745,
"prompt_tokens": 0,
"total_seconds": 5,
"output_seconds": 5,
"input_seconds": 0,
"input_image_count": 0
},
"ratio": "16:9",
"duration": 5,
"resolution": "768P",
"task_type": "generation",
"created_at": 1787801999,
"updated_at": 1787802113
}
}
}
}视频地址在 data.result_url(同一地址也出现在透传层data.data.task.content.url)。该地址为限时地址,请在任务成功后尽快下载或转存;也可直接用GET /v1/videos/{task_id}/content由平台代理拉流,无需处理下游限时地址过期。
result_url 字段,扩写结果在透传层 data.data.task.content.prompt:{
"code": "success",
"message": "",
"data": {
"task_id": "435194938720659",
"action": "generate",
"status": "SUCCESS",
"fail_reason": "",
"submit_time": 1787802032,
"start_time": 1787802036,
"finish_time": 1787802073,
"progress": "100%",
"data": {
"task": {
"id": "435194938720659",
"model": "MiniMax-H3",
"status": "succeeded",
"modality": "text",
"task_type": "h3_context_ir",
"content": {
"prompt": "integrated_multimodal_description: [Shot 1] 一个穿着白色T恤的十岁男孩站在金色沙滩上...\noverall_soundscape: 海浪拍打沙滩的声音,篮球弹跳的清脆响声...\nnon_diegetic_music: 轻快的钢琴旋律伴随弦乐,节奏明快..."
},
"usage": { "total_tokens": 6114, "prompt_tokens": 5648, "completion_tokens": 466 }
}
}
}
}Context-IR 任务的 data.action仍是"generate",不是"h3_context_ir"。任务类型以透传层data.data.task.task_type与modality: "text"为准。
{
"code": "success",
"message": "",
"data": {
"task_id": "435190535455101",
"action": "generate",
"status": "FAILURE",
"fail_reason": "content[1].image_url: media not found (HTTP 404)",
"result_url": "",
"submit_time": 1787746910,
"start_time": 1787746919,
"finish_time": 1787746925,
"progress": "100%"
}
}判断任务成败以 data.status为准。code表示平台层调用是否成功,任务本身失败时code仍为"success",具体失败原因在data.fail_reason。
| 字段 | 类型 | 说明 |
|---|---|---|
task_id | string | 任务 ID |
action | string | 任务动作标识,H3 全部任务类型均为 "generate" |
status | string | 任务状态,大写,取值见下表 |
fail_reason | string | 失败原因,成功时为空字符串 |
result_url | string | 结果地址(限时)。视频任务为视频 URL;Context-IR 任务无此字段 |
submit_time | integer | 任务提交时间(Unix 秒) |
start_time | integer | 任务开始处理时间(Unix 秒) |
finish_time | integer | 任务完成时间(Unix 秒),未完成时为 0 |
progress | string | 任务进度,字符串且带百分号,如 "0%"、"50%"、"100%" |
data | object | 上游原始对象透传层,内含 task(见下) |
| 字段 | 类型 | 说明 |
|---|---|---|
id | string | 上游任务 ID |
model | string | 模型名 |
status | string | 上游状态,小写,取值见下表 |
content.url | string | 视频任务产物地址 |
content.prompt | string | Context-IR 任务的扩写文本 |
usage | object | 用量与计费信息 |
resolution / duration / ratio | - | 上游实际采用的参数(可能与请求值不同,见第 5 节) |
task_type | string | generation / regeneration / h3_context_ir |
modality | string | Context-IR 任务为 "text" |
外层 data.status(大写) | 透传层 data.data.task.status(小写) | 说明 |
|---|---|---|
NOT_START | — | 未开始 |
SUBMITTED | — | 已提交,排队中 |
QUEUED | queued | 排队中 |
IN_PROGRESS | running | 生成中 |
SUCCESS | succeeded | 已完 成 |
FAILURE | failed / cancelled | 失败 |
两套状态词并存,调用方判断成败建议以外层大写 data.status为准。实际观测中进度通常跳变0% → 50% → 100%,任务提交后很快进入IN_PROGRESS,NOT_START/SUBMITTED窗口很短。
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
model | string | 是 | 固定值:"MiniMax-H3" |
prompt | string | 是 | 文本描述。所有任务类型均强制非空,包括 regeneration 与 Context-IR;缺失或为空返回 400 invalid_request |
duration | integer | 否 | 生成视频时长(秒),范围 [4, 15] 的整数,默认 5。传字符串(如 "5")会返回 400;超范围返回 500 build_request_failed。regeneration 任务不需要此参数 |
resolution | string | 否 | 清晰度,可选值 "768P"、"2K"。未传或传无法识别的值时默认按 "2K" 处理 |
ratio | string | 否 | 宽高比,可选值 "adaptive"、"21:9"、"16:9"、"4:3"、"1:1"、"3:4"、"9:16"。平台会按场景改写,见下方说明 |
aigc_watermark | boolean | 否 | 是否在生成视频中添加 AIGC 标识水印,默认 false。也可放在 metadata 内 |
ratio 的实际处理规则(平台会按场景改写后再发往上游):| 场景 | 处理 |
|---|---|
| 纯文生视频 | 未传或传 adaptive 时改写为 16:9;传具体比例则原样使用 |
| 图生视频(首帧/尾帧) | 强制改写为 adaptive,请求中传入的值被忽略 |
| 多模态参考(参考图/视频/音频) | 传了就用传入值,未传则用 adaptive |
"5:5")不会在平台侧拦截,会被上游拒绝并返回 400 fail_to_fetch_task。| 参数 | 类型 | 说明 |
|---|---|---|
task_type | string | 任务类型: - 不传或 "generation":文生视频/图生视频- "regeneration":视频再生成- "h3_context_ir":智能扩写传其他值按 generation 处理,不报错 |
first_frame_image | string | 首帧图片 URL(仅 generation) |
last_frame_image | string | 尾帧图片 URL(仅 generation) |
reference_images | array | 参考 图片 URL 列表,最多 9 张(仅 generation) |
reference_videos | array | 参考视频 URL 列表,最多 3 段(generation / context_ir) |
reference_audios | array | 参考音频 URL 列表,最多 3 段(generation / context_ir) |
source_task_id | string | 源任务 ID(仅 regeneration,与 base_video_url 二选一)。只能引用自己账号下已成功的任务。别名:base_task_id |
base_video_url | string | 源视频 URL(仅 regeneration,与 source_task_id 二选一)。支持公网 URL、mm_file://{file_id}、Base64 data URI |
content | array | 高级用法:完全自定义上游多模态 content 数组。传了此字段时上面的 first_frame_image 等便捷字段不再生效 |
callback_url | string | 任务完成后的回调地址(可选)。配置后平台会先发送含 challenge 字段的验 证请求(需 3 秒内原样返回 challenge),验证成功后每当任务状态变更即向该地址 POST 推送,推送体结构与查询接口响应一致 |
首帧/尾帧模式与参考图/视频/音频模式不可混用,混用返回 500 build_request_failed。顶层 images数组可作为便捷写法:images[0]当首帧、images[1]当尾帧;多张参考图请显式走metadata.reference_images。请求体总大小 ≤ 64 MB ,大文件请使用公网 URL,避免 Base64。
| 信封 | 出现场景 | 结构 |
|---|---|---|
| 扁平体 | 提交任务成功 | {id, task_id, object, model, status, progress, created_at} |
| 业务包裹 | 查询任务、业务层错误 | {code, message, data} |
| 网关错误 | 鉴权、路由、模型不可用等 | {error: {code, message, type}} |
| 代理拉流错误 | GET /v1/videos/{id}/content 出错 | {error: {message, type}}(OpenAI 风格) |
{
"error": {
"code": "",
"message": "无效的令牌 (request id: 20260827102641657613236tt6sxSxB)",
"type": "moyu_api_error"
}
}{
"code": "task_not_exist",
"message": "task_not_exist",
"data": null
}code,请勿只按 HTTP 状态码分支:| 场景 | HTTP | code / 信封 | message 示例 |
|---|---|---|---|
| 缺少 Authorization | 401 | 网关,code 为空 | 未提供令牌 |
| 令牌 无效 | 401 | 网关,code 为空 | 无效的令牌 |
缺少或空 model | 400 | 网关,code 为空 | 未指定模型名称... |
| 模型无可用渠道 | 503 | 网关 model_not_found | 分组 default 下模型 ... 无可用渠道(distributor) |
| 请求体非合法 JSON | 400 | 网关,code 为空 | Invalid request, 无效的请求, invalid character ... |
缺少或空 prompt | 400 | 业务 invalid_request | prompt is required |
duration 类型错误 | 400 | 业务 invalid_request | json: cannot unmarshal string into Go struct field .Alias.duration of type int |
| 余额低于阈值 | 403 | 业务 quota_below_block_threshold | 余额不足,低于禁止阈值... |
duration 超出 [4,15] | 500 | 业务 build_request_failed | convert request payload failed: duration must be within [4,15] for MiniMax-H3 |
| 首尾帧与参考素材混用 | 500 | 业务 build_request_failed | convert request payload failed: MiniMax-H3: first_frame/last_frame cannot mix with reference_image/video/audio |
| regeneration 源任务不存在/未成功 | 500 | 业务 build_request_failed | convert request payload failed: MiniMax-H3 regeneration: source task ... not found |
ratio 非法、content 文本为空等上游拒绝 | 400 | 业务 fail_to_fetch_task | 内嵌上游原始错误 JSON,见下 |
| 查询的任务不存在 | 400 | 业务 task_not_exist | task_not_exist |
| 代理拉流任务不存在 | 404 | 代理,OpenAI 风格 | Task not found |
| 素材不可达等运行期失败 | 200 | 查询得 data.status: FAILURE | content[...].image_url: media not found (HTTP 404) |
fail_to_fetch_task 的特殊之处:其 message 字段里内嵌了上游返回的原始错误 JSON(含上游内部错误码与 request_id),需要对 message 做二次 JSON 解析才能拿到具体原因:{
"code": "fail_to_fetch_task",
"message": "{\"type\":\"error\",\"error\":{\"type\":\"bad_request_error\",\"message\":\"invalid params, ratio=\\\"5:5\\\" invalid, allowed: adaptive, 16:9, 4:3, 1:1, 3:4, 9:16, 21:9 (2013)\",\"http_code\":\"400\"},\"request_id\":\"...\"}",
"data": null
}data.data.task.usage 返回。参考量级:| 任务 | 参考用量 |
|---|---|
| 768P / 5 秒 | 约 162745 tokens |
| 2K / 5 秒 | 约 260390 tokens |
| Context-IR | 约 6114 tokens |
usage 含 total_seconds / output_seconds / input_seconds / input_image_count;Context-IR 的 usage 只有 total_tokens / prompt_tokens / completion_tokens。FAILUREresult_url 为限时地址,成功后请尽快转存,或使用 GET /v1/videos/{task_id}/content 由平台代理拉流(返回 Content-Type: video/mp4 字节流)