即梦 Seedance 2.0、可灵 Kling、通义万相 Wan 2.5 这类视频生成模型,官方接口各有各的参数命名和鉴权方式,但调用形态高度一致:都是提交任务、拿 task_id、轮询结果的异步模型。本文给出三家 API 的接入步骤、能力对照与一份可运行的统一调用封装,并说明如何用 OpenAI 兼容端点把它们收敛到一处管理。
文本模型是「请求即返回」,视频模型不是。一条 5 秒 1080p 视频的生成耗时通常在几十秒到几分钟,任何一次同步调用都会把 HTTP 连接拖死。这带来三个和文本 API 完全不同的工程问题:
也正因为参数杂、各家命名不统一,把多家视频模型收敛到一个兼容端点的收益比文本模型更大——你只需要维护一套轮询逻辑和一套错误处理。
各家参数命名与可选值迭代很快,以上是接入形态层面的对照,具体字段名请以官方最新文档为准。
可以看到三家的差异主要在能力上限(谁能控运镜、谁能给首尾帧),而不是调用范式。这就给统一封装留出了空间。
无论哪家,流程都是这四步:
关键点:第 1 步返回不等于生成完成。很多初接的人在这里踩坑,拿到 task_id 就去取 URL,结果拿到空值。
下面这段代码把「提交、轮询、取结果」封装成一个函数,用 OpenAI 兼容端点做统一入口,切换模型只改 model 参数。
import os, time, requests
BASE_URL = os.getenv("VIDEO_BASE_URL", "https://easy88ai.com/v1")
API_KEY = os.getenv("VIDEO_API_KEY")
HEADERS = {
"Authorization": f"Bearer {API_KEY}",
"Content-Type": "application/json",
}
def create_video_task(prompt: str, model: str, **kwargs) -> str:
"""提交视频生成任务,返回 task_id"""
payload = {
"model": model,
"prompt": prompt,
"resolution": kwargs.get("resolution", "1080p"),
"aspect_ratio": kwargs.get("aspect_ratio", "16:9"),
"duration": kwargs.get("duration", 5),
}
# 各家扩展参数(首尾帧、运镜等)按需透传
payload.update(kwargs.get("extra", {}))
r = requests.post(f"{BASE_URL}/video/generations",
headers=HEADERS, json=payload, timeout=30)
r.raise_for_status()
return r.json()["task_id"]
def wait_for_video(task_id: str,
interval: int = 10,
timeout: int = 900) -> dict:
"""轮询任务直到终态,返回完整结果"""
deadline = time.time() + timeout
while time.time() < deadline:
r = requests.get(f"{BASE_URL}/video/tasks/{task_id}",
headers=HEADERS, timeout=30)
r.raise_for_status()
data = r.json()
status = data.get("status")
if status == "succeeded":
return data
if status == "failed":
raise RuntimeError(f"生成失败:{data.get('error')}")
time.sleep(interval)
raise TimeoutError(f"任务 {task_id} 超过 {timeout}s 未出结果")
if __name__ == "__main__":
tid = create_video_task(
prompt="雨后的青石板路,镜头缓慢推进,水洼倒映着暖黄路灯",
model="seedance-2.0", # 换成 kling / wan-2.5 即可切换模型
duration=5,
resolution="1080p",
)
print("task_id:", tid)
result = wait_for_video(tid)
print("video_url:", result["video_url"])三个细节值得注意:
视频任务本来就要跑几十秒,5 秒一次轮询纯属浪费。建议起步 10 秒,超过 60 秒还没完成再放慢到 20 至 30 秒。
queued 和 running 是两回事。高峰期 queued 可能持续几分钟,如果你的超时设成 60 秒,会误判成失败。
提交任务这一步如果超时,你并不知道服务端到底建没建任务。不要用同一个请求体盲目重试,应该先用 prompt 加时间窗口去查一次任务列表确认,否则容易生成两条一样的视频、扣两次钱。
不是所有「分辨率 × 时长 × 宽高比」组合都合法,比如某些档位只支持 5 秒。非法组合有的厂商在提交时就报 400,有的要到任务执行阶段才失败。接入前建议把常用组合跑一遍摸底。
部分厂商对 prompt 长度和字符有校验,长中文描述先做截断和清洗,避免提交时直接 400。
把多家视频模型收敛到一个兼容地址后,业务侧的变化是:
对刚起步的团队,建议先用兼容端点把流程跑通,等业务量上来、对某个模型形成强依赖后,再考虑是否直连官方。
视频生成 API 的接入难点不在「怎么发请求」,而在异步状态管理、失败重试和参数兼容这三件事上。先把提交、轮询、转存的骨架搭稳,再把各家差异收敛到 extra 透传字段里,后面加新模型就只是加一个模型名而已。
本文代码示例基于 OpenAI 兼容调用形态编写,不同服务商在字段命名上会有差异,请以实际接入文档的「模型名与参数」章节为准。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。