文档 · 文生视频
三种状态,只有一种该放弃
auto/video 是异步的。提交一个提示词,拿回一个 id,然后轮询到任务结束。一条片子大约两分钟。真正要记住的一点:上游状态是 unknown 的任务仍然在跑——把它当失败处理,你的客户端会把马上要成功的活儿扔掉。
提交
curl https://tokenexchage.com/v1/videos/generations \
-H "Authorization: Bearer sk-你的key" \
-H "Content-Type: application/json" \
-d '{"model":"auto/video","prompt":"云层翻过山脊,延时摄影"}'
{
"object": "video",
"id": "a1b2c3d4-…",
"status": "processing"
}
轮询
curl https://tokenexchage.com/v1/videos/generations/a1b2c3d4-… \
-H "Authorization: Bearer sk-你的key"
只有三种状态,没有别的:
status | 含义 | 怎么办 |
|---|---|---|
processing | 还在做 | 继续轮询 |
succeeded | 好了,url 有值 | 取地址 |
failed | 终态,error 说明原因 | 停下来报错 |
上游的 PENDING 和 RUNNING 都归到 processing,这没什么意外。要单独讲的是 UNKNOWN:任务刚提交、还没完全登记时上游会报这个状态,而它是瞬态的——我们自己的探测里,任务是先 UNKNOWN 后 SUCCEEDED,十一条全部出片。
所以 UNKNOWN 映射成 processing,不是 failed。如果映成失败,客户端在问得太早的那一刻就会放弃一个其实在跑的任务,而那些任务本来都会成功。
import time, requests
H = {"Authorization": "Bearer sk-你的key"}
base = "https://tokenexchage.com/v1/videos/generations"
job = requests.post(base, headers=H,
json={"model": "auto/video", "prompt": "云层翻过山脊"}).json()
while True:
st = requests.get(base + "/" + job["id"], headers=H).json()
if st["status"] == "succeeded": break
if st["status"] == "failed": raise SystemExit(st.get("error"))
time.sleep(10)
print(st["url"])
十到十五秒轮一次。一条片子约两分钟,一秒一次的循环基本只是在制造负载。
刻意没有的东西
只收文生视频。图生视频、参考图生视频、视频编辑都要输入一张图或一段片子,是另一个操作、另一套请求形状,不是这个接口上的一个开关。
别名只在当前模型被上游下线(404 / 410)时才会换候选。视频不是那种「换个模型重试一下」的请求:换个模型就是另一条片子,而你要看过才知道。
其他能力
同一套命名,一个能力一个别名,都在 /v1/models 里: