文档 · 文生视频

三种状态,只有一种该放弃

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 里:

image

auto/image

文生图。同步,几秒不是几分钟

embedding

auto/embed

1024 维向量,单候选

rerank

auto/rerank

按相关度重排检索结果

tts

auto/tts

文字转语音

asr

auto/asr

语音转文字