接口文档
文档更新时间:2026-10-20
本站接口是 OpenAI 风格:任何支持「自定义接口地址 + API Key」的软件,把地址填
https://taiyi.tech/v1、Key 填你自己的 sk- 就能直接用,不用改代码。
基础信息
| Base URL | https://taiyi.tech/v1 |
|---|---|
| 鉴权方式 | 请求头 Authorization: Bearer sk-你的key |
| 请求格式 | Content-Type: application/json,UTF-8 |
| 响应格式 | application/json;出错时返回 {"error": {"message": "...", "code": "..."}} |
| 计费单位 | 1 太乙币 = 1.0 元;响应里的 cost_milli 是本次花费的「毫」(1000 毫 = 1 太乙币) |
调用总流程
1. GET /v1/models 查当前上架的模型、档位和价格(模型名以它返回为准)
2. POST /v1/images/generations 图片:同步,直接返回结果
POST /v1/videos 视频:提交任务,返回 task_id
3. GET /v1/videos/{task_id} 视频:轮询,直到 success / failed
查可用模型
GET /v1/models Authorization: Bearer sk-你的key
模型上下架、档位和价格改动会实时反映在这个接口里,客户端不要写死模型列表。
只想看看的话,网页上也能查:GET /api/models(免鉴权),或直接看 价格表。
{
"object": "list",
"data": [
{
"id": "模型名",
"object": "model",
"owned_by": "taiyi",
"kind": "video",
"unit": "per_call",
"price_milli": 2900,
"prices": {"15": 2900, "30": 3900},
"durations": ["15", "30"],
"ratios": ["16:9", "9:16", "1:1"],
"resolutions": ["720p"],
"min_refs": 0,
"max_refs": 9,
"max_videos": 0,
"max_audios": 0,
"max_media": 0,
"note": "稳定可用"
}
]
}
| 字段 | 含义 |
|---|---|
| id | 调用时原样填进 model 的稳定 ID,不要自己猜名字 |
| kind | image 走图片接口,video 走视频接口 |
| unit | 当前图片模型为 per_image(按实际出图张数),视频模型为 per_call(每个任务按次收费) |
| prices | 分档价(毫)。视频可按时长档设置每个任务的单次价格,但不按秒数累加;图片可按清晰度档设置每张价格。未命中档位时使用 price_milli |
| durations | 该模型允许的时长档,只能填这里面的值 |
| ratios / resolutions | 允许的比例 / 清晰度,只能填这里面的值 |
| max_refs / max_videos / max_audios | 参考图 / 视频 / 音频各自的数量上限,0 表示不额外限制 |
| max_media | 参考素材合计上限(图片 + 视频 + 音频),0 表示不额外限制 |
| min_refs | 至少要几张参考图,0 表示不要求 |
图片生成
POST /v1/images/generations
Authorization: Bearer sk-你的key
Content-Type: application/json
{
"model": "模型名",
"prompt": "一只在雪山上的猫,电影感",
"n": 1,
"size": "1024x1024"
}
| 字段 | 必填 | 说明 |
|---|---|---|
| model | 是 | 用 /v1/models 返回的 id |
| prompt | 是 | 提示词 |
| n | 否 | 要几张,默认 1;按张计费的模型按实际张数扣费 |
| size | 否 | 尺寸或清晰度档,以该模型支持的为准 |
| image / images | 否 | 参考图,公网 https 直链;单张用 image,多张用 images 数组 |
同步返回,失败会自动退款。返回的图片地址可以直接下载(不用再带 Key)。注意它是临时地址:保留约 24 小时,之后自动清理(服务器磁盘吃紧时会更早删),请及时转存到自己的存储。
{
"created": 1759296000,
"data": [{"url": "https://taiyi.tech/f/xxxxxxxx.png"}],
"request_id": "req_xxxxxxxx",
"cost_milli": 2200
}
视频生成(异步)
视频是异步任务:先提交拿 task_id,再轮询。视频按任务计费;若模型设置了时长价格档,会按提交的时长选择本次单价,但不会将秒数乘进费用。提交时预扣一个任务的费用,完成后结算,多退少补。
1. 提交任务
POST /v1/videos
Authorization: Bearer sk-你的key
Content-Type: application/json
{
"model": "模型名",
"prompt": "镜头缓慢推进,女子在雨中回眸",
"duration": 15,
"ratio": "16:9",
"resolution": "720p"
}
→ {"task_id": "task_xxxxxxxx", "status": "pending",
"request_id": "req_xxxxxxxx", "hold_milli": 2900}
2. 轮询任务
GET /v1/videos/{task_id}
Authorization: Bearer sk-你的key
→ {"task_id": "task_xxxxxxxx", "status": "running"}
→ {"task_id": "task_xxxxxxxx", "status": "success", "cost_milli": 2900,
"result": {"url": "https://taiyi.tech/f/xxxxxxxx.mp4"}}
→ {"task_id": "task_xxxxxxxx", "status": "failed", "refunded": true, "error": "失败原因"}
status:pending / running / success / failed。
失败的预扣会全额退回。建议每 5~10 秒查一次;重复查同一个已经结束的任务不会重复扣费。
如果某次查询返回 running 并带一个 note,说明查询通道临时不通、任务已保留,过一会儿再查即可。
视频是真实排队生成的,没有固定出片时间:快的几分钟,慢的(长时长、多张参考图)可能要几十分钟。
查任务状态不花钱,一直查到 success / failed 就行;不要用短超时去重试提交,那会重复建任务。
成功后的 result.url 和图片一样是临时地址:保留约 24 小时,请及时下载转存。
3. 可选参数
| 字段 | 说明 |
|---|---|
| duration | 生成时长(别名 seconds / dur);如果模型设置了时长价格档,会用于选择本次任务的价格,不代表按秒计费 |
| ratio | 画面比例(别名 aspect_ratio),如 16:9 / 9:16 / 1:1 |
| resolution | 清晰度,如 720p / 768p / 2K(以模型支持的为准) |
| reference_images | 参考图数组,公网 https 直链 |
| reference_videos | 参考视频数组,只有声明支持的模型生效 |
| reference_audios | 参考音频数组,只有声明支持的模型生效(部分模型还要同时给至少一张参考图) |
每个模型能收几张参考图、能不能收视频 / 音频、有哪些时长和比例,都以 /v1/models 返回的
min_refs / max_refs / max_videos / max_audios / durations / ratios 为准。
不符合模型能力的请求会在扣费之前直接返回 400 bad_request,错误信息里写明差在哪,
不会先扣一笔再退给你。0 / 空表示不限;请求里没带的项不校验(个别模型要求把秒数写进提示词,这类模型不用带 duration)。
参考素材要求
| 地址格式 | 必须是公网可访问的 https:// 直链;本地路径、需要登录才能看的页面、网盘预览页都不行 |
|---|---|
| 个数上限 | 见模型的 max_refs / max_videos / max_audios;若返回了 max_media,还会限制三类合计总量 |
| 有效期 | 任务处理期间必须一直能访问,中途失效会导致生成失败 |
| 图床 | 自己的 CDN、对象存储公开地址、任意图床都可以 |
结果链接
| 地址形式 | https://yiwu7.xyz/f/<32位随机名> |
|---|---|
| 要不要鉴权 | 不要。拿到链接的人都能直接下载(文件服务不做登录校验,只能给公开直链) |
| 保留多久 | 约 24 小时,到期自动清理;服务器磁盘吃紧时会更早删掉最老的 |
| 怎么用 | 出片后尽快下载转存到自己的对象存储 / CDN,别把我们的地址当永久存储 |
| 能枚举吗 | 文件名随机且难以猜测;拿到地址的人仍可访问,请勿公开分享敏感素材链接 |
计费与限额
| 预扣与结算 | 视频提交时预扣一个任务的费用,完成后结算(hold_milli / cost_milli),多退少补;时长档决定单次价格,不按秒累加 |
|---|---|
| 失败退款 | 生成失败、提交失败一律全额退回预扣,不会只扣不退 |
| 接口限流 | 单个 API Key 每分钟最多 300 次请求;同一来源 IP 每分钟最多 600 次 |
| 同账号并发 | 图片生成、视频提交和任务查询都会占用"在途并发"额度;超限时返回 429 busy |
| 同时生成 | 同时在跑的任务数另有上限。满了不会直接拒绝:先排队等一会儿,还排不到才返回 429 busy。排队和拒绝都不会扣费 |
| Key 额度 | 可以给单个 Key 设额度,用满返回 402 quota_exceeded |
错误码
| HTTP | code | 含义 | 怎么办 |
|---|---|---|---|
| 400 | bad_request | 请求体不是合法 JSON,或参数不符合模型能力 | 检查 JSON 和字段名;错误信息里会写明是哪一项(参考图数量 / 时长 / 比例) |
| 401 | no_key / bad_key | 没带 Key 或 Key 无效 | 检查请求头和 Key 有没有复制全 |
| 403 | key_disabled / user_banned | Key 被停用或账号被封 | 联系管理员 |
| 403 | ip_denied | 该 Key 设了 IP 白名单,当前 IP 不在里面 | 换成登记过的 IP,或找管理员改白名单 |
| 402 | insufficient_balance | 余额不足 | 充值 |
| 402 | quota_exceeded | 该 Key 自己的额度用完了 | 新建 Key 或找管理员改额度 |
| 404 | model_unavailable | 模型名不对或已下架 | 用 /v1/models 查正确的名字 |
| 404 | task_not_found | 任务号不存在,或不是这个 Key 的任务 | 核对 task_id;任务只能用自己的 Key 查 |
| 429 | busy | 并发过高,或同时在生成的任务已到上限且排队超时 | 降低同时提交数,稍后重试;这一路不会扣费 |
| 429 | (无 code) | 超过接口限流 | 放慢请求频率 |
| 502 | generation_failed | 生成失败(已自动退款) | 稍后重试;反复失败就拿 request_id 找管理员 |
| 500 | channel_missing | 任务对应的模型已下架 | 联系管理员 |
对接示例
curl
curl -X POST https://taiyi.tech/v1/images/generations \
-H "Authorization: Bearer sk-你的key" \
-H "Content-Type: application/json" \
-d '{"model":"模型名","prompt":"一只在雪山上的猫","n":1}'
Python(官方 openai 库)
from openai import OpenAI client = OpenAI(base_url="https://taiyi.tech/v1", api_key="sk-你的key") resp = client.images.generate(model="模型名", prompt="一只在雪山上的猫", n=1) print(resp.data[0].url)
Python(requests,视频轮询)
import time, requests
H = {"Authorization": "Bearer sk-你的key"}
task = requests.post("https://taiyi.tech/v1/videos", headers=H, json={
"model": "模型名", "prompt": "镜头缓慢推进", "duration": 15,
}).json()
while True:
data = requests.get("https://taiyi.tech/v1/videos/" + task["task_id"], headers=H).json()
if data["status"] in ("success", "failed"):
break
time.sleep(8)
print(data)
JavaScript
const res = await fetch("https://taiyi.tech/v1/images/generations", {
method: "POST",
headers: {
Authorization: "Bearer sk-你的key",
"Content-Type": "application/json",
},
body: JSON.stringify({ model: "模型名", prompt: "一只在雪山上的猫", n: 1 }),
});
console.log(await res.json());
其他软件
任何支持「自定义接口地址」的软件,把地址填 https://taiyi.tech/v1,Key 填你自己的 sk-,
模型名按 /v1/models 返回的 id 填即可。
安全须知
| Key 只放服务端 | Key 直接代表你的余额,绝对不要写进浏览器前端、App 安装包或公开的在线工具里 |
|---|---|
| 泄露就吊销 | 怀疑泄露,立刻在控制台停用旧 Key、建一个新的,余额不受影响 |
| 别公开 | 不要把带 Key 的请求贴到公开仓库、群聊或截图里 |
| 可以限权 | 给 Key 设额度或 IP 白名单,能把万一泄露的损失压到最小 |