可灵 3.0(kling-v3)文生 / 图生视频(Kling 原生协议)
| 接口 | 能力 | 必填字段 |
|---|---|---|
POST /kling/v1/videos/text2video | 文生视频 | model_name、prompt |
POST /kling/v1/videos/image2video | 图生视频(首帧驱动,可选尾帧) | model_name、prompt、image |
ModelGo 按可灵官方 API 的路径与请求/响应格式接收请求(model_name、mode、sound、duration、aspect_ratio……),网关负责路由到供应商并计费;由哪家供应商渲染对调用方不可见。轮询路径与官方一致:同一路径 + /{task_id}。
使用可灵官方 SDK / 示例代码时,把 API 域名换成
https://api.modelgo.com/kling,鉴权改为Authorization: Bearer $MODELGO_API_KEY(无需可灵的 JWT 签名)。
1. 创建任务
文生视频
bash
curl https://api.modelgo.com/kling/v1/videos/text2video \
-H "Authorization: Bearer $MODELGO_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model_name": "kling-v3",
"prompt": "一颗红色小球在木桌上缓缓滚动,柔和日光",
"mode": "std",
"duration": "5",
"aspect_ratio": "16:9",
"sound": "on",
"cfg_scale": 0.5
}'图生视频
bash
curl https://api.modelgo.com/kling/v1/videos/image2video \
-H "Authorization: Bearer $MODELGO_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model_name": "kling-v3",
"prompt": "小狗缓缓转头",
"image": "https://example-cdn.com/dog.jpg",
"mode": "pro",
"duration": "5"
}'响应
json
{
"code": 0,
"message": "SUCCEED",
"request_id": "gw_6dce033e-9243-4a64-9c57-73d08a8e379a",
"data": {
"task_id": "gw_6dce033e-9243-4a64-9c57-73d08a8e379a",
"task_status": "submitted",
"created_at": 1788773081000,
"updated_at": 1788773081000
}
}data.task_id 是网关任务 ID,轮询与取内容都用它。
2. 参数说明
| 字段 | 类型 | 适用 | 说明 |
|---|---|---|---|
model_name | string | 全部 | 固定 kling-v3 |
prompt | string | 全部 | text2video 必填;image2video 可选(与官方一致)。≤ 2500 字符 |
image | string | image2video | 必填。首帧图片的公网可直接下载的 URL。text2video 请求不得携带 image / image_tail(会被拒绝,不会静默按文生视频处理) |
image_tail | string | image2video | 尾帧图片 URL |
mode | string | 全部 | 档位:std(720P)、pro(1080P)或 4k,缺省 pro |
duration | string / int | 全部 | 时长(整数秒)3–15,缺省 5 |
aspect_ratio | string | text2video | 16:9 / 9:16 / 1:1,缺省 16:9。图生视频跟随首帧比例 |
sound | string | 全部 | on / off,缺省 off。开启会切换到含音频的计费档 |
negative_prompt | string | 全部 | 反向提示词 |
cfg_scale | number | 全部 | 提示词遵循度 [0, 1],缺省 0.5 |
callback_url / external_task_id | string | 全部 | 接受但不生效:网关不回调,任务以 task_id 轮询 |
档位
mode | 输出 |
|---|---|
std | 1280×720(按比例) |
pro | 1920×1080(按比例),缺省 |
4k | 4K(按比例),仅由支持 4K 的供应商承接,单价另计 |
- 只提供以上三档。 其他值会在创建时被拒(HTTP
400)。网关按各供应商可交付档位选路:请求4k时只会交给能出 4K 的供应商,不会静默降档;若当前没有可用的 4K 供应商,创建返回400,不产生费用。
首帧图片的要求(image2video)
- 必须是上游服务器能直接
GET到的直链:无鉴权、无跳转、不依赖 Referer / Cookie;JPG / PNG,≤ 10MB,宽高 ≥ 300px,比例 1:2.5–2.5:1。 - 图片拉取失败会导致任务失败(
task_status=failed),不计费。建议使用自有对象存储或 CDN 地址。
3. 轮询任务
GET https://api.modelgo.com/kling/v1/videos/text2video/{task_id}(image2video 创建的任务到 .../image2video/{task_id} 轮询)
bash
curl https://api.modelgo.com/kling/v1/videos/text2video/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": {
"task_id": "gw_6dce033e-9243-4a64-9c57-73d08a8e379a",
"task_status": "succeed",
"task_result": {
"videos": [{"id": "gw_6dce033e-9243-4a64-9c57-73d08a8e379a", "url": "https://api.modelgo.com/v1/videos/gw_6dce033e-9243-4a64-9c57-73d08a8e379a/content", "duration": "6"}]
},
"created_at": 1788773081000,
"updated_at": 1788773250000
}
}task_status:submitted→processing→succeed/failed。失败时task_status_msg给出原因,任务不计费。- 生成耗时通常 1–3 分钟,请按 5–10 秒间隔轮询并带退避。
videos[].url指向网关内容接口,需带 API Key 下载;duration为实际交付秒数。
4. 下载视频
GET https://api.modelgo.com/v1/videos/{task_id}/content
bash
curl https://api.modelgo.com/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.com/kling/v1/videos"
H = {"Authorization": f"Bearer {os.environ['MODELGO_API_KEY']}"}
def generate(kind: str, body: dict, out: str, timeout: int = 600) -> None:
body.setdefault("model_name", "kling-v3")
r = requests.post(f"{BASE}/{kind}", json=body, headers=H, timeout=30)
r.raise_for_status()
task_id = r.json()["data"]["task_id"]
deadline = time.time() + timeout
while True:
if time.time() > deadline:
raise TimeoutError(task_id)
data = requests.get(f"{BASE}/{kind}/{task_id}", headers=H, timeout=30).json()["data"]
if data["task_status"] == "succeed":
break
if data["task_status"] == "failed":
raise RuntimeError(data.get("task_status_msg", "generation failed"))
time.sleep(8)
url = data["task_result"]["videos"][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("text2video", {"prompt": "一颗红色小球在木桌上缓缓滚动", "mode": "std", "duration": "5", "sound": "on"}, "t2v.mp4")
generate("image2video", {"prompt": "小狗缓缓转头", "image": "https://example-cdn.com/dog.jpg", "mode": "pro", "duration": "5"}, "i2v.mp4")6. 计费口径
- 按视频秒数 × 单价计费,单价由三个维度决定:输入方式(文生 / 图生)、档位(
std720P /pro1080P /4k)、是否生成音频(sound)。 - 创建时按请求的
duration预授权冻结,任务完成后按实际交付秒数结算;部分通道多交付约 1 秒(请求 5 秒交付 6 秒),以videos[].duration为准。 - 未传时长按缺省值预授权(万相 / 可灵 5 秒,Veo 8 秒),缺省值同时发给供应商;结算取供应商回报的实际交付秒数,四舍五入到整秒(如 5.041 → 5,5.5 → 6),可能与请求时长相差 ±1 秒。
- 创建被拒(
400)或生成失败(failed)不计费,预授权自动释放。 - 各档单价以控制台「模型列表」中的价格为准。
常见错误
| 现象 | 原因 | 处理 |
|---|---|---|
创建返回 400 | mode 不是 std/pro/4k;sound 不是 on/off;缺 model_name;text2video 缺 prompt;image2video 缺 image;text2video 带了 image/image_tail;当前无供应商能出所请求档位 | 按参数表修正或换接口/档位 |
task_status=failed | 上游无法下载首帧图或生成失败 | 换成公网可直接下载的直链 |
轮询 task_not_found | task_id 不是本 Key 创建的任务,或轮询路径的接口族与创建时不一致 | 用创建时的同一路径轮询 |
/content 返回 409 / 404 | 任务未完成 / 产物过期 | 先轮询到 succeed;及时下载 |