可灵 3.0
| 接口 | 能力 | 必填字段 |
|---|---|---|
POST /kling/text-to-video/kling-3.0 | 文生视频 | prompt |
POST /kling/image-to-video/kling-3.0 | 图生视频(首帧驱动,可选尾帧与主体) | contents(至少含一个 first_frame) |
GET /kling/tasks?task_ids={id} | 查询任务 | task_ids |
ModelGo 按可灵官方 3.0 API 的路径与请求/响应格式接收请求(settings、options、contents[]……),网关负责路由到供应商并计费;由哪家供应商渲染对调用方不可见。
使用可灵官方示例代码时,把 API 域名换成
https://api.modelgo.ai/kling,鉴权改为Authorization: Bearer $MODELGO_API_KEY(无需可灵的 JWT 签名)。
1. 创建任务
文生视频
bash
curl https://api.modelgo.ai/kling/text-to-video/kling-3.0 \
-H "Authorization: Bearer $MODELGO_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"prompt": "一颗红色小球在木桌上缓缓滚动,柔和日光",
"settings": {
"resolution": "720p",
"aspect_ratio": "16:9",
"duration": 5,
"audio": "native"
}
}'图生视频
bash
curl https://api.modelgo.ai/kling/image-to-video/kling-3.0 \
-H "Authorization: Bearer $MODELGO_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"contents": [
{"type": "prompt", "text": "小狗缓缓转头"},
{"type": "first_frame", "url": "https://example-cdn.com/dog.jpg"}
],
"settings": {"resolution": "1080p", "duration": 5}
}'响应
json
{
"code": 0,
"message": "SUCCEED",
"request_id": "gw_6dce033e-9243-4a64-9c57-73d08a8e379a",
"data": {
"id": "gw_6dce033e-9243-4a64-9c57-73d08a8e379a",
"status": "submitted",
"create_time": 1788773081000,
"update_time": 1788773081000
}
}data.id 是网关任务 ID,轮询与取内容都用它。时间戳为毫秒。
2. 参数说明
请求体
| 字段 | 适用 | 说明 |
|---|---|---|
prompt | text-to-video | 必填,≤ 3072 字符 |
contents | image-to-video | 必填,数组,见下表 |
settings | 全部 | 生成设置,见下表 |
options | 全部 | 附加选项,见下表 |
contents[](image-to-video)
type | 字段 | 说明 |
|---|---|---|
first_frame | url | 必填,且只能一个。首帧图片:公网可直接下载的 http(s) URL。当前供应商通道不接受 base64 内联图片(裸 base64 或 data: URI),会返回 400(error_class=provider_unsupported) |
last_frame | url | 可选,尾帧,只能一个。必须与 first_frame 一起传,只传尾帧返回 400 |
prompt | text | 可选,只能一个,≤ 3072 字符 |
element | element_id、id | 可选,最多 3 个;element_id 为可灵侧主体 ID,id 在同一任务内唯一 |
settings
| 字段 | 取值 | 说明 |
|---|---|---|
resolution | 720p / 1080p / 4k | 档位,缺省 720p;不传按 720P 计费。其他值返回 400 |
audio | native / off | 是否生成原生音频,缺省 off。native 会切换到含音频的计费档 |
duration | 整数 3–15 | 时长(秒),缺省 5 |
aspect_ratio | 16:9 / 9:16 / 1:1 | 仅 text-to-video;图生视频跟随首帧比例 |
multi_shot | bool | 分镜开关,见下文「分镜」。prompt 使用 镜头 n, 秒数, 描述; 写法且未传该字段时,按官方默认 true 处理;prompt 是普通文本且未传时网关不下发该字段,按供应商缺省处理。传 false 则 镜头 文字只当普通提示词 |
options
| 字段 | 说明 |
|---|---|
watermark_info | {"enabled": true/false},按原样转交供应商,不影响计费。enabled: true 只在转发该字段的供应商通道上可用,其余通道返回 400(error_class=provider_unsupported) |
callback_url / external_task_id | 接受但不生效:网关不回调,任务以 id 轮询 |
- 上表之外的字段会在创建时被拒绝(HTTP
400,消息指出字段名),不会被忽略。 multi_shot: true、element、watermark_info.enabled: true只会路由到能原样转发它们的供应商通道;当前没有这样的通道可用时返回400(error_class=provider_unsupported),不会静默丢弃后按普通视频计费。这些字段本身不改变单价。
分镜
settings.multi_shot 为 true 时,分镜写在 prompt 里:
- 自定义分镜:按
镜头 n, 秒数, 描述;逐条书写,例如镜头 1, 3, 一只猫在窗边眨眼; 镜头 2, 3, 猫伸了个懒腰;。镜头从 1 起顺序编号,最多 6 个,每个镜头描述 ≤ 512 字符,各镜头秒数之和必须等于settings.duration(缺省 5),否则创建返回400。 - 自动分镜:
prompt不使用上述写法时,由模型按提示词自动拆分镜头。
档位
resolution | 输出 |
|---|---|
720p | 1280×720(按比例),缺省 |
1080p | 1920×1080(按比例) |
4k | 4K(按比例),仅由支持 4K 的供应商承接,单价另计 |
- 只提供以上三档。 网关按各供应商可交付档位选路:请求
4k时只会交给能出 4K 的供应商,不会静默降档;若当前没有可用的 4K 供应商,创建返回400,不产生费用。
首帧图片的要求(image-to-video)
- 必须是上游服务器能直接
GET到的直链:无鉴权、无跳转、不依赖 Referer / Cookie;JPG / PNG,≤ 10MB,宽高 ≥ 300px,比例 1:2.5–2.5:1。 - 图片拉取失败会导致任务失败(
status=failed),不计费。建议使用自有对象存储或 CDN 地址。
3. 轮询任务
GET https://api.modelgo.ai/kling/tasks?task_ids={id}
bash
curl "https://api.modelgo.ai/kling/tasks?task_ids=gw_6dce033e-9243-4a64-9c57-73d08a8e379a" \
-H "Authorization: Bearer $MODELGO_API_KEY"完成时:
json
{
"code": 0,
"message": "SUCCEED",
"request_id": "gw_6dce033e-9243-4a64-9c57-73d08a8e379a",
"data": [
{
"id": "gw_6dce033e-9243-4a64-9c57-73d08a8e379a",
"status": "succeeded",
"create_time": 1788773081000,
"update_time": 1788773250000,
"outputs": [
{
"type": "video",
"id": "gw_6dce033e-9243-4a64-9c57-73d08a8e379a",
"url": "https://api.modelgo.ai/v1/videos/gw_6dce033e-9243-4a64-9c57-73d08a8e379a/content",
"duration": "6"
}
]
}
]
}status:submitted→processing→succeeded/failed。失败时message给出原因,任务不计费。- 每次请求只查询一个任务:
task_ids传单个 ID(逗号分隔的多个 ID 与external_task_ids会返回400)。 - 生成耗时通常 1–3 分钟,请按 5–10 秒间隔轮询并带退避。
outputs[].url指向网关内容接口,需带 API Key 下载;duration为实际交付秒数。
4. 下载视频
GET https://api.modelgo.ai/v1/videos/{id}/content
bash
curl https://api.modelgo.ai/v1/videos/gw_6dce033e-9243-4a64-9c57-73d08a8e379a/content \
-H "Authorization: Bearer $MODELGO_API_KEY" -o kling.mp4返回 video/mp4 字节流,支持 Range。只有任务所属 API Key(或同租户控制台登录态)能访问;未完成返回 409,过期或不存在返回 404。
5. 完整示例(Python)
python
import os, time, requests
BASE = "https://api.modelgo.ai/kling"
H = {"Authorization": f"Bearer {os.environ['MODELGO_API_KEY']}"}
def generate(path: str, body: dict, out: str, timeout: int = 600) -> None:
r = requests.post(f"{BASE}/{path}/kling-3.0", json=body, headers=H, timeout=30)
r.raise_for_status()
task_id = r.json()["data"]["id"]
deadline = time.time() + timeout
while True:
if time.time() > deadline:
raise TimeoutError(task_id)
task = requests.get(f"{BASE}/tasks", params={"task_ids": task_id}, headers=H, timeout=30).json()["data"][0]
if task["status"] == "succeeded":
break
if task["status"] == "failed":
raise RuntimeError(task.get("message", "generation failed"))
time.sleep(8)
url = task["outputs"][0]["url"]
with requests.get(url, headers=H, stream=True, timeout=120) as c:
c.raise_for_status()
with open(out, "wb") as f:
for chunk in c.iter_content(1 << 20):
f.write(chunk)
generate("text-to-video", {"prompt": "一颗红色小球在木桌上缓缓滚动", "settings": {"resolution": "720p", "duration": 5, "audio": "native"}}, "t2v.mp4")
generate("image-to-video", {"contents": [{"type": "prompt", "text": "小狗缓缓转头"}, {"type": "first_frame", "url": "https://example-cdn.com/dog.jpg"}], "settings": {"resolution": "1080p", "duration": 5}}, "i2v.mp4")6. 计费口径
- 按视频秒数 × 单价计费,单价由三个维度决定:输入方式(文生 / 图生)、档位(
720p/1080p/4k)、是否生成音频(audio)。 - 创建时按请求的
duration预授权冻结,任务完成后按实际交付秒数结算;部分通道多交付约 1 秒(请求 5 秒交付 6 秒),以outputs[].duration为准。 - 未传时长按缺省值预授权(可灵 5 秒),缺省值同时发给供应商;结算取供应商回报的实际交付秒数,四舍五入到整秒(如 5.041 → 5,5.5 → 6),可能与请求时长相差 ±1 秒。
- 创建被拒(
400)或生成失败(failed)不计费,预授权自动释放。 - 各档单价以控制台「模型列表」中的价格为准。
错误响应
失败的请求保持对应的 HTTP 状态码,响应体与官方一致:{"code": 1201, "message": "…", "request_id": "…"}。code 取官方错误码表的业务码,按 HTTP 状态归类:400→1201、401→1000、403→1103、404→1203、405→1202、429→1302、500→5000、503→5001、504→5002;message 指出具体原因。任务本身生成失败不是请求错误:仍返回 code=0,任务 status=failed,原因在 message。
常见错误
| 现象 | 原因 | 处理 |
|---|---|---|
创建返回 400 | settings.resolution 不是 720p/1080p/4k;settings.audio 不是 native/off;duration 不在 3–15;text-to-video 缺 prompt;image-to-video 缺 first_frame 或只传了 last_frame;分镜写法错误或各镜头秒数之和≠duration;带了上文之外的字段;当前无供应商能出所请求档位 | 按参数表修正(响应消息会指出具体字段) |
创建返回 400,error_class=provider_unsupported | 使用了 base64 内联图片,或 multi_shot / element / watermark_info.enabled=true 当前没有能转发的供应商通道 | 图片改用公网 URL;去掉该字段或稍后重试 |
status=failed | 上游无法下载首帧图或生成失败 | 换成公网可直接下载的直链 |
轮询返回 404、code=1203 | task_ids 不是本 Key 创建的任务 | 使用创建响应里的 data.id |
/content 返回 409 / 404 | 任务未完成 / 产物过期 | 先轮询到 succeeded;及时下载 |