kie-models
在 KIE 平台(api.kie.ai)上发现、查价并调用 AI 模型。当用户提到 KIE 或 kie.ai,问"X 用哪个 KIE 模型"、"列出 KIE 模型"、"在 KIE 上跑模型",或需要某个模型的 schema、价格、成功率时使用。
- 3,697
- installs
- 0 up / 0 down, score 0.00
- votes
- In the catalog since
- 6 Oct 2026
- From
- kie.ai
Skill instructions
Rendered from the published SKILL.md, 442 lines.
在 KIE 上调用 AI 模型
KIE(api.kie.ai)托管了 200 多个图像、视频、音乐、语音和文本模型。本文覆盖模型发现,
以及走统一任务接口的模型的完整调用流程。
English: references/en.md
重要规则
- 通过目录接口发现模型,不要凭记忆或训练数据写模型名。 目录持续变动——模型会新增、 改名、下线。你"记得"的名字可能已经不存在。
- 调用前先拉 schema,并按它返回的 path 调用。 不是所有模型都走
/api/v1/jobs/createTask,同步聊天和 Gemini 系列模型各有自己的路径。 假设只有一条路径,必然出错。 - 必填字段以 schema 的
required数组为准。 各模型不一致。callBackUrl对统一任务 接口是可选的,同步接口则没有这个字段。 - 模型名里的斜杠不要 URL 编码。
wan/v2-2-t2v原样拼进路径:/api/v1/models/wan/v2-2-t2v/schema。 - 读
data之前先判响应体里的code。 所有接口都返回{code, msg, data}。 HTTP 200 不代表调用成功。 - schema 从不描述如何取结果。 见取结果。
先决条件
下文的代码片段都是 POSIX shell,需要 PATH 上有 curl 和 jq。多数系统不预装
jq:brew install jq、apt install jq 或 winget install jqlang.jq。
Windows 上请在 WSL 或 Git Bash 里运行。PowerShell 的 curl 是 Invoke-WebRequest
的别名,不接受这些参数——要写 curl.exe。cmd.exe 下片段必须重写,不能直接粘贴。
鉴权
每个请求都需要 bearer token:
Authorization: Bearer $KIE_API_KEY
API key 在 https://kie.ai/api-key 创建。base URL 是 https://api.kie.ai,
schema 的 servers 字段里也有声明。
发现模型
查询目录
curl -s -H "Authorization: Bearer $KIE_API_KEY" \
'https://api.kie.ai/api/v1/models'
可选筛选参数,可组合,均不分页:
| 参数 | 含义 |
|---|---|
taskType |
任务类型。多值用逗号分隔。空格必须百分号编码——taskType=Text%20to%20Video,Image%20to%20Video。裸空格会让 curl 在发出请求前就失败(http=000)。用 + 也可以,或者交给 curl 编码:curl -G … --data-urlencode 'taskType=Text to Video' |
provider |
供应商名,如 Kling、Suno、Google |
q |
关键词模糊匹配 |
响应:
{
"code": 200,
"msg": "success",
"data": {
"total": 202,
"models": [
{
"model": "kling/v2-1-master-text-to-video",
"slug": "kling/v2-1-master-text-to-video",
"title": "Affordable Kling 2.1 Master API — Premium Text-to-Video Generation",
"provider": "Kling",
"taskType": ["Text to Video"],
"description": "…",
"pricingDesc": "A 5-second video costs 160 credits (0.80 USD), …"
}
]
}
}
model是后续所有接口使用的标识符。一段或两段(gpt-image-2-text-to-image、wan/v2-2-t2v)。description可能为null,不要依赖它。pricingDesc是文案不是数字,但与实际扣费一致,可以用来估算预算。total会随模型的新增、改名、下线而变化。从中读到的任何数量(包括上面示例里的 那个)都只是某一时刻的快照。- 筛选条件无匹配时返回
total: 0和空的models列表;接口故障则以非 200 的code返回——空列表永远不是错误。
查报价与成功率
curl -s -H "Authorization: Bearer $KIE_API_KEY" \
'https://api.kie.ai/api/v1/models/veo-3-1/price'
curl -s -H "Authorization: Bearer $KIE_API_KEY" \
'https://api.kie.ai/api/v1/models/veo-3-1/success-rate'
price 返回 {model, pricingDesc},文案与目录接口同源。
success-rate 返回最近 24 小时,10 分钟一个采样点,最多 144 个:
{
"model": "veo-3-1",
"points": [
{
"start": "2026-09-08T07:30:00Z",
"end": "2026-09-08T07:40:00Z",
"successRate": 100.0,
"errorRate": 0.0,
"isNormal": true
}
]
}
无流量的采样点,successRate 和 errorRate 为 null。points 为空列表表示没有监控
Show the whole skill (322 more lines)
数据,不代表成功率为零。
查余额
提交任务前,把账户余额和模型 pricingDesc 对一下:
curl -s -H "Authorization: Bearer $KIE_API_KEY" \
'https://api.kie.ai/api/v1/chat/credit'
# → {"code": 200, "msg": "success", "data": 2450}
data 是余额本身(数字)。目录接口返回的 pricingDesc 是单次调用的价格(例如
"A 5-second video costs 160 credits")。发 createTask 前先比一下——余额不足时任务
会返回 code 402。
读 schema
curl -s -H "Authorization: Bearer $KIE_API_KEY" \
'https://api.kie.ai/api/v1/models/gpt-image-2-text-to-image/schema'
返回 {model, openapi},其中 openapi 就是 OpenAPI 文档本身,以 JSON 对象内联返回——
直接读 data.openapi.paths,无需再解析一层。模型文档尚未同步时该字段为 null,此时
如实说明,不要凭空编一个调用路径。有值时它是该模型单个接口的完整 OpenAPI 3.1 文档,
也是以下信息的权威来源:
- 准确的调用路径与方法(
paths) - 每个请求字段的类型、说明、是否必填
- 投递到
callBackUrl的回调 payload 结构(operation.callbacks) - 业务错误码(401 未授权、402 额度不足、404 资源不存在、422 参数校验失败、 429 频率超限、433 子 key 超限、455 服务不可用)
- base URL(
servers)与鉴权方式(components.securitySchemes)
部分模型的 input 是 oneOf 多选一结构(例如按 task-id 或按 image-url 两种入参形态)。
每个分支有各自的 required 列表——只满足其中一个分支,不要跨分支混填字段。
解析 $ref
$ref 未预内联。它们指向同一份文档的 components,一定能在文档内解析——但需要你
自己做解引用。
组件键名是字面量,必须精确匹配:
- 空格被百分号编码:
#/components/schemas/response%20not%20with%20recordId。 查找前需对每段路径做 URL 解码。 - 有的键名以空格结尾:
#/components/responses/Error。匹配时不要 trim 空白。
两类模型形态
看 paths 区分:
paths 的键 |
形态 |
|---|---|
/api/v1/jobs/createTask |
任务制。 提交拿 taskId,再轮询取结果。下文详述。 |
| 其他 | 同步返回的 chat/completions 接口,结果直接在响应体里。见统一接口之外的模型。 |
图/视频模型的文件上传
目录里约 78 个模型(46 个图生视频、32 个图生图)需要在 input 里传一个文件 URL。
不同模型的字段名不一致——image_url、input_image、image、video_url、
first_frame_image 等等——必须去 schema 的 input 里查准确字段名,不要猜。
用户已经有公开 HTTPS URL 时直接用。没有就先把文件传到 KIE 的临时文件服务,拿到 URL
再塞进 input。
上传接口在另一个域名:https://kieai.redpandaai.co,不是 api.kie.ai。
沿用同一个 bearer token。上传的文件 24h 后自动删除——够用来立刻发一次任务,但不是长期
存储。
| 接口 | 场景 |
|---|---|
POST /api/file-base64-upload |
文件在内存里,小(≤10MB)。JSON body,base64 或 data URL |
POST /api/file-stream-upload |
文件在磁盘上,大(>10MB)。multipart/form-data |
POST /api/file-url-upload |
把一个公开 URL 转存到 KIE 的 CDN。JSON body |
三个接口返回同一结构:
{
"success": true,
"code": 200,
"msg": "File uploaded successfully",
"data": {
"downloadUrl": "https://tempfile.redpandaai.co/…/my-image.png",
"fileName": "my-image.png",
"filePath": "images/user-uploads/my-image.png",
"fileSize": 154832,
"mimeType": "image/png",
"uploadedAt": "2026-09-22T12:00:00.000Z"
}
}
把 data.downloadUrl 填到模型 input 里对应的字段——具体字段名以 schema 为准。
公共 body 字段(三个接口都有):uploadPath——必填,前后都不带斜杠(如
images/user-uploads);fileName——可选,包含扩展名。接口独有:base64Data
(base64)、file(stream 的表单字段)、fileUrl(url)。
# base64:内存里的小文件
curl -s -X POST 'https://kieai.redpandaai.co/api/file-base64-upload' \
-H "Authorization: Bearer $KIE_API_KEY" -H 'Content-Type: application/json' \
-d '{"base64Data": "data:image/png;base64,iVBORw0K…",
"uploadPath": "images/user-uploads",
"fileName": "input.png"}'
# stream:磁盘上的大文件
curl -s -X POST 'https://kieai.redpandaai.co/api/file-stream-upload' \
-H "Authorization: Bearer $KIE_API_KEY" \
-F "file=@/path/to/input.png" \
-F "uploadPath=images/user-uploads" \
-F "fileName=input.png"
# url 转存:从其他站点抓到 KIE
curl -s -X POST 'https://kieai.redpandaai.co/api/file-url-upload' \
-H "Authorization: Bearer $KIE_API_KEY" -H 'Content-Type: application/json' \
-d '{"fileUrl": "https://example.com/photo.jpg",
"uploadPath": "images/downloaded"}'
拿到 downloadUrl 直接喂给 createTask:
UPLOAD_URL=$(curl -s -X POST 'https://kieai.redpandaai.co/api/file-stream-upload' \
-H "Authorization: Bearer $KIE_API_KEY" \
-F "file=@/path/to/input.png" -F "uploadPath=images/user-uploads" \
| jq -r .data.downloadUrl)
curl -s -X POST 'https://api.kie.ai/api/v1/jobs/createTask' \
-H "Authorization: Bearer $KIE_API_KEY" -H 'Content-Type: application/json' \
-d "{\"model\":\"kling/v2-1-master-image-to-video\",
\"input\":{\"image_url\":\"$UPLOAD_URL\",\"prompt\":\"…\"}}"
调用模型
对 schema 中 paths 为 /api/v1/jobs/createTask 的模型:
curl -s -X POST 'https://api.kie.ai/api/v1/jobs/createTask' \
-H "Authorization: Bearer $KIE_API_KEY" \
-H 'Content-Type: application/json' \
-d '{
"model": "gpt-image-2-text-to-image",
"input": {
"prompt": "A single red maple leaf resting on wet slate, macro photograph",
"resolution": "1K",
"aspect_ratio": "1:1"
}
}'
请求体字段:
| 字段 | 必填 | 说明 |
|---|---|---|
model |
是 | 与目录接口返回的完全一致 |
input |
是 | 嵌套对象。 内部字段来自 schema,各模型不同 |
callBackUrl |
否 | 填了则任务完成时 KIE 会 POST 结果到此地址。payload 结构见 schema 的 callbacks |
响应:
{"code": 200, "msg": "success", "data": {"taskId": "e931f4f2…", "recordId": "e931f4f2…"}}
用 taskId 轮询。recordId 不是轮询用的键。
取结果
curl -s -H "Authorization: Bearer $KIE_API_KEY" \
'https://api.kie.ai/api/v1/jobs/recordInfo?taskId=e931f4f2…'
终态响应:
{
"code": 200,
"data": {
"taskId": "e931f4f24b0f6d5bc4744c719d3f67f3",
"model": "gpt-image-2-text-to-image",
"state": "success",
"successFlag": 1,
"costTime": 59,
"creditsConsumed": 3.0,
"createTime": 1788941299171,
"completeTime": 1788941358629,
"failCode": null,
"failMsg": null,
"resultJson": "{\"resultUrls\":[\"https://…/images/….png\"]}",
"response": {"resultUrls": ["https://…/images/….png"]}
}
}
状态机
state |
successFlag |
是否终态 |
|---|---|---|
waiting |
0 | 否 |
queuing |
0 | 否 |
generating |
0 | 否 |
success |
1 | 是 |
fail |
3 | 是 |
按 state 轮询。遇 success 或 fail 停止,其余一律视为仍在运行。fail 时读
failCode 和 failMsg。
一个可用的轮询循环。它把响应写进文件而不是变量,原因见下方警告:
out=$(mktemp)
deadline=$(( $(date +%s) + 300 ))
while :; do
if curl -sf -H "Authorization: Bearer $KIE_API_KEY" \
"https://api.kie.ai/api/v1/jobs/recordInfo?taskId=$TASK_ID" -o "$out"; then
[ "$(jq -r .code "$out")" = 200 ] || { jq -r .msg "$out" >&2; break; }
case $(jq -r .data.state "$out") in
success) jq -r '.data.response.resultUrls[]?' "$out"; break ;;
fail) jq -r '.data.failMsg' "$out" >&2; break ;;
esac
fi
[ "$(date +%s)" -ge "$deadline" ] && { echo '等待超时' >&2; break; }
sleep 3
done
rm -f "$out"
3 秒是合适的间隔。recordInfo 限流为每秒 10 次,一张 1K 图端到端通常在一分钟左右。
300 秒的截止时间适用于图像任务——视频和音乐耗时更长,要调大;没有它,遇到永远到不了
终态的任务就会无限空转。curl -sf 把 HTTP 层的失败变成一次重试,而不是拿空文件去解析
报错;code 不是 200 就停下并打印 msg——否则一个被拒绝的请求会被当成"仍在运行"。
resultUrls[]? 里的 ? 保证循环对 Suno 系列同样可用——它们的结果在别的字段,见
读取产出。所有出口都是 break,既能直接粘进交互式 shell,也保证走到
rm。
不要用 echo 把 KIE 的响应喂给 jq。 recordInfo 返回的 param 字段是 JSON 套
JSON,原始字节含有 \\\";zsh、dash、busybox ash 会展开这些转义,jq 随即报
Invalid numeric literal。bash 的内建 echo 不展开,所以换一个 shell 运行之前可能
都不会暴露。按上面的写法把响应落到文件,或者用 printf '%s' "$r" | jq …。
读取产出
response是resultJson解析后的结果,优先用它。- 多数模型把生成文件放在
response.resultUrls。Suno 的音频生成类任务使用 自己的结果结构:generate、extend、sounds 以及 upload-and-cover/extend 系列的音轨在response.data[].audio_url,每首附带stream_audio_url、封面image_url、title和duration。Suno 的文本与分析类任务(歌词生成、MIDI 提取)返回response.resultObject,歌词在resultObject.lyricsData[].text。 Suno 的文件工具类任务(WAV 转换、人声分离、封面图、音乐视频)和其他模型一样用resultUrls。所有模型的state/successFlag状态机是一致的。任务成功但 没有resultUrls时,按上述结构从response中取结果。 - 生成的媒体文件保存 14 天后自动删除,需要的内容请下载保存,不要把 URL 当作
长期地址。日志记录(即
recordInfo返回的文本与元数据)保存 2 个月。
拿产物的直接下载链接
有时 resultUrls 里的链接不能直接给浏览器或下游系统流式下载。这个接口把它转成
一个短期有效的直下载链接:
curl -s -X POST 'https://api.kie.ai/api/v1/common/download-url' \
-H "Authorization: Bearer $KIE_API_KEY" \
-H 'Content-Type: application/json' \
-d '{"url": "https://tempfile.redpandaai.co/…/output.png"}'
# → {"code": 200, "msg": "success", "data": "https://tempfile.…"}
- 入参
url必须是 KIE 自家的 URL(resultUrls里的,或上传接口返回的downloadUrl)。外部 URL 直接 422。 - 返回的下载链接有效期 20 分钟。它不延长底层文件的 14 天保存期,只是给一条 新鲜的直下载链接。
data是字符串本身(URL),不是对象。
统一接口之外的模型
不是所有模型都走 /api/v1/jobs/createTask。其余的是同步接口——
/claude/v1/messages、/codex/v1/responses、/grok/v1/responses 以及 Gemini
系列路径。按 schema 的 paths 提交、按 schema 描述构造请求体,结果直接在响应体里
返回——没有任务可轮询,也没有单独的取结果步骤。
限流
以下是默认额度。超限的请求会被拒绝,code 为 429——注意 429 在响应体里,HTTP
状态可能仍是 200,判 code 而不是状态行。被拒绝的请求不会进入队列,需要自行重试。
如需更高额度,可联系官方支持申请。
| 接口 | 限流 | 计数维度 |
|---|---|---|
models、schema、price、success-rate |
1 次 / 秒,四个接口共用一份额度 | 账户 |
createTask |
20 次 / 10 秒 | 账户 |
recordInfo |
10 次 / 秒 | taskId |
createTask 这一档通常支持 100 个以上任务同时运行。发现类接口的共享额度是最紧的一档:
一次目录调用和一次 schema 调用消耗的是同一份每秒 1 次的配额,连续做发现类调用时,
请求间隔至少 1.1 秒。目录接口一次就返回全量——需要多种筛选视图时,不带参数拉一次、
在本地过滤,别为每个筛选条件各花一格配额。
常见错误
最常见的失败就是违反重要规则,那六条这里不再重复。下面是容易忽略的响应 格式细节。
openapi可能为null。 模型可能已进目录但文档尚未同步。读data.openapi.paths前先判null。param.input回来是字符串。 请求时传的是对象,回显的是 JSON 文本,读回自己 的参数要再解析一层。progress不填充。recordInfo有这个字段,但不会填值。轮询state。- 结果 URL 14 天后失效。 拿到就下载,不要存 URL。
- 对同一个 taskId 轮询超过 10 次/秒会被限流。
echo会破坏响应。 zsh、dash、busybox ash 都会展开param里的反斜杠转义, jq 随即解析失败。改用文件或printf '%s'。- 查询串里的裸空格会让 curl 在发出请求前就失败。 要百分号编码:
taskType=Text%20to%20Video。 response不一定是resultUrls。 Suno 音频生成类任务的音轨在response.data[].audio_url,文本与分析类任务的结果在response.resultObject。见读取产出。