视频生成概览
万相 3.0 · Seedance · MiniMax H3 · Grok Imagine。异步提交轮询取片,三个系列的计费口径并不一致
视频生成是异步的:提交拿到 task_id,轮询到 completed,再取片。
一次生成通常 3 到 8 分钟,长时长更久。
POST /v1/videos 提交任务
GET /v1/videos/{task_id} 查询状态
GET /v1/videos/{task_id}/content 下载成片三个接口共用同一把 Key,都带 Authorization: Bearer <API_KEY>。
因为是异步的,这里不受 120 秒超时的约束——提交请求本身很快返回,长耗时发生在 轮询之间。这是视频与文本、图像端点最大的不同。
基本调用
提交、轮询、取片三步。官方 SDK 未覆盖这组接口,直接发 HTTP 即可。
# 1. 提交
curl -X POST "https://www.vibeapi.cn/v1/videos" \
-H "Authorization: Bearer $API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "wan3.0-video-720p",
"prompt": "一只猫在窗台上打盹,阳光缓缓移动",
"seconds": "5",
"aspect_ratio": "16:9"
}'
# 2. 轮询(每 10~15 秒一次)
curl "https://www.vibeapi.cn/v1/videos/$TASK_ID" -H "Authorization: Bearer $API_KEY"
# 3. 取片
curl -L "https://www.vibeapi.cn/v1/videos/$TASK_ID/content" \
-H "Authorization: Bearer $API_KEY" -o output.mp4import time, requests
BASE = "https://www.vibeapi.cn/v1"
H = {"Authorization": "Bearer YOUR_API_KEY"}
task = requests.post(f"{BASE}/videos", headers=H, json={
"model": "wan3.0-video-720p",
"prompt": "一只猫在窗台上打盹,阳光缓缓移动",
"seconds": "5", # wan3.0 传字符串
"aspect_ratio": "16:9",
}).json()
task_id = task["id"]
while True:
s = requests.get(f"{BASE}/videos/{task_id}", headers=H).json()
if s["status"] in ("completed", "failed"):
break
time.sleep(12) # 每 10~15 秒一次,超时按 15 分钟设
if s["status"] == "completed":
# metadata.url 多数模型指向 /content,H3 则是对象存储直链
url = s.get("metadata", {}).get("url") or f"{BASE}/videos/{task_id}/content"
mp4 = requests.get(url, headers=H).content
open("output.mp4", "wb").write(mp4)import fs from "fs";
const BASE = "https://www.vibeapi.cn/v1";
const H = { Authorization: "Bearer YOUR_API_KEY", "Content-Type": "application/json" };
const sleep = (ms) => new Promise((r) => setTimeout(r, ms));
const task = await (await fetch(`${BASE}/videos`, {
method: "POST",
headers: H,
body: JSON.stringify({
model: "wan3.0-video-720p",
prompt: "一只猫在窗台上打盹,阳光缓缓移动",
seconds: "5", // wan3.0 传字符串
aspect_ratio: "16:9",
}),
})).json();
let s;
while (true) {
s = await (await fetch(`${BASE}/videos/${task.id}`, { headers: H })).json();
if (s.status === "completed" || s.status === "failed") break;
await sleep(12_000); // 每 10~15 秒一次,超时按 15 分钟设
}
if (s.status === "completed") {
// metadata.url 多数模型指向 /content,H3 则是对象存储直链
const url = s.metadata?.url ?? `${BASE}/videos/${task.id}/content`;
const mp4 = Buffer.from(await (await fetch(url, { headers: H })).arrayBuffer());
fs.writeFileSync("output.mp4", mp4);
}所有参数行为、分辨率与计费口径均来自真实调用,最后验证:2026-09-05。怎么调得好看,见视频生成工作流。
本页结论来自对本网关的真实调用,最后验证:2026-09-05。
| 页面 | 内容 |
|---|---|
| 万相 3.0 | 文生 / 图生视频,分辨率在模型名里,首尾帧与参考视频 |
| Seedance | 一口价 30 秒长片,三个型号的差异 |
| MiniMax H3 | 图 / 视频 / 音频三类参考素材,768P |
| Grok 视频 | 按秒计费,走 Grok 自己的端点 |
| 视频生成工作流 | 先出 4K 参考图再喂视频模型、无缝循环 |
三个接口
视频生成是异步的:提交拿到 task_id,轮询到 completed,再取片。
一次生成通常 3 到 8 分钟,长时长更久。三个接口共用同一把 Key。
POST https://www.vibeapi.cn/v1/videos 提交任务
GET https://www.vibeapi.cn/v1/videos/{task_id} 查询状态
GET https://www.vibeapi.cn/v1/videos/{task_id}/content 下载成片/content 对所有模型都可用,需带同一个 Authorization 头。
查询响应里的 metadata.url 分两种:多数模型回的就是上面那个 /content 地址;
MiniMax H3 回的是对象存储直链,可以不带鉴权直接下载,也省一次中转。
两种都能用,写代码时取 metadata.url 即可,不要假设它一定指向我们的域名。
模型与计费
同一个 /v1/videos 接口下,三个系列的收费方式并不一致。
| wan3.0 系列 | MiniMax H3 | seedance 系列 | |
|---|---|---|---|
| 计费口径 | 按秒 — 单价 × 时长 | 按秒 — 单价 × 时长 | 一口价 — 与时长无关 |
| 时长参数 | seconds,字符串 | seconds 或 duration | duration,数字 |
| 分辨率 | 写在模型名里,三档 | 固定 768P | 固定 |
| 时长范围 | 推荐 5–15 秒 | 1–15 秒整数 | 30 秒(seedance-2.5) |
| 画面比例 | aspect_ratio,四档含 adaptive | 六档固定,另有条件可用的 adaptive | aspect_ratio,逐型号不同 |
seedance 传 4 秒还是 15 秒价钱一样,用满时长才划算;wan3.0 与 H3 每多一秒都在计费。
全部模型
| 模型 | 能力 | 输出 | 计费 |
|---|---|---|---|
wan3.0-video-{480p,720p,1080p} | 文生 / 图生 / 参考视频 | 832×480 / 1280×720 / 1920×1080 | 按输出 + 参考视频总时长 |
wan3.0-video-prime-* | 同上,高速版 | 同上 | 按秒,单价高约 20% |
wan3.0-image-* | 图生视频专用,不收参考视频 | 同上三档 | 仅按输出时长 |
wan3.0-image-prime-* | 同上,高速版 | 同上三档 | 仅按输出时长 |
seedance-2.5 | 文生 / 图生,固定 30 秒,参考图最多 9 张 | 1280×720,全比例 | 一口价 |
seedance-2.0-i2v | 图生视频,参考图必填 1–9 张,5–15 秒,另收 3 视频 / 3 音频 | resolution 可选 720p / 1080p,比例三选一 | 一口价 |
MiniMax-H3 | 文生 / 参考图生,1–15 秒,9 图 / 3 视频 / 3 音频参考 | 固定 768P,六种比例 | 按秒 |
seedance-2.0 已下架。
单价见 https://www.vibeapi.cn/pricing
轮询与取片
状态走 queued → in_progress → completed。建议每 10 到 15 秒查一次,超时按 15 分钟设。
curl "https://www.vibeapi.cn/v1/videos/$TASK_ID" -H "Authorization: Bearer $API_KEY"完成时:
{
"id": "task_397b84onbn1ML8uBNhsiaQP3gafAe3AI",
"status": "completed",
"progress": 100,
"metadata": { "url": "https://www.vibeapi.cn/v1/videos/task_397b.../content" }
}下载:
curl -L "https://www.vibeapi.cn/v1/videos/$TASK_ID/content" \
-H "Authorization: Bearer $API_KEY" -o output.mp4完整 Python 示例
import os, time, requests
BASE = "https://www.vibeapi.cn/v1"
H = {"Authorization": f"Bearer {os.environ['VIBEAPI_KEY']}"}
def generate(payload, timeout=900, interval=12):
task = requests.post(f"{BASE}/videos", headers=H, json=payload, timeout=120).json()
if "id" not in task:
raise RuntimeError(f"提交失败: {task}")
tid = task["id"]
print("已提交", tid)
deadline = time.time() + timeout
while time.time() < deadline:
r = requests.get(f"{BASE}/videos/{tid}", headers=H, timeout=60).json()
status = r.get("status")
if status == "completed":
break
if status == "failed":
raise RuntimeError(f"生成失败: {r.get('error')}")
time.sleep(interval)
else:
raise TimeoutError(f"{timeout} 秒内未完成: {tid}")
mp4 = requests.get(f"{BASE}/videos/{tid}/content", headers=H, timeout=600)
mp4.raise_for_status()
return tid, mp4.content
tid, data = generate({
"model": "wan3.0-video-1080p",
"prompt": "伊卡洛斯坠落。少年蜡制的双翼在刺目烈日下崩解成漫天金色羽毛,"
"自极高处向湛蓝的爱琴海坠落,云层翻涌,镜头自远处缓慢仰摇",
"seconds": "5",
"aspect_ratio": "16:9",
})
open(f"{tid}.mp4", "wb").write(data)样片:https://file-hub-dev.tianshu.sh/20260904/video-models/video/icarus-1080p.mp4
一条 15 秒的 1080P 成片通常 40 到 230 MB,码率很高,做网页背景前建议自行转码压缩。
错误与退款
提交阶段报错,额度不扣;任务失败,额度全额退回(用量日志里失败任务额度记为 0)。
| 现象 | 原因 | 怎么办 |
|---|---|---|
model_not_found | Key 所在分组没有这个模型 | 确认 Key 分组,或换模型名 |
| HTTP 400,提示缺时长 | 没传 seconds / duration | 补上;wan3.0 传字符串,seedance 传数字 |
| 提示该模型维护中 | 模型临时不可用 | 换模型,或稍后重试 |
提交成功但很快 failed | 生成失败 | 额度已全额退回,直接重试 |
参考素材导致失败的两个常见原因:
- 链接不是公网可直接下载。 要登录、要 Cookie、是分享页而非直链都不行。 贴进无痕窗口能直接下载才算数。
- 在提示词里写了比例或时长。 「竖屏」「16:9」「8 秒」会和参数冲突,
比例和时长只用
aspect_ratio和seconds控制。
能力边界
| 做不到 | 说明 |
|---|---|
| 续写 / 剪辑 / 延长 | 只做单条生成 |
| 固定随机种子 | 同一提示词两次结果不同,没有 seed 参数 |
| 任意模型收参考视频 | wan3.0-image-* 与 seedance-2.5 不收;其余收 |
| H3 上用首尾帧 | 上游不允许首尾帧与参考图混用,本接口只开放参考图。要首尾帧请用 wan3.0-image-* |
| 成片长期保留 | 取到就存自己那边 |
| 完成回调 | 只能轮询,没有 Webhook |
要点
- 先分清计费口径:wan3.0 与 MiniMax H3 按秒,seedance 一口价。
- 分辨率写在模型名里,请求体里的
size覆盖不了它。 - seedance 三个型号能力不同:时长、比例、参考视频/音频的支持都不一样,别按系列套。
- 参考素材必须是公网可直接下载的 HTTPS 直链,不能要登录。
- 比例和时长只用参数控制,别写进提示词,会冲突。
wan3.0-video-*的参考视频时长计入计费,wan3.0-image-*不计。- 任务失败全额退款,重试即可;
seedance-2.5请预留一次重试。 - H3 的分辨率不用传,固定 768P;
adaptive比例只在带了图或视频时可用。 - 接口以本页为准,不要照上游厂商的原文调用我们的域名——协议由网关翻译,端点和请求体都不一样。
想让画面更好看,接着读视频生成工作流。
在线调试
填入你自己的 API Key 即可直接发起请求,参数表与响应结构由接口定义生成。
提交任务
Authorization
BearerAuth
使用 Bearer Token 认证。
格式: Authorization: Bearer sk-xxxxxx
In: header
Request Body
multipart/form-data
模型/风格 ID
文本描述提示词
图片输入 (URL 或 Base64)
视频时长(秒)
视频宽度
视频高度
视频帧率
随机种子
生成视频数量
响应格式
用户标识
扩展参数 (如 negative_prompt, style, quality_level 等)
Response Body
application/json
application/json
curl -X POST "https://www.vibeapi.cn/v1/videos"{
"id": "string",
"object": "string",
"model": "string",
"status": "string",
"progress": 0,
"created_at": 0,
"seconds": "string",
"completed_at": 0,
"expires_at": 0,
"size": "string",
"error": {
"message": "string",
"code": "string"
},
"metadata": {}
}{
"error": {
"message": "string",
"type": "string",
"param": "string",
"code": "string"
}
}查询状态
Authorization
BearerAuth
使用 Bearer Token 认证。
格式: Authorization: Bearer sk-xxxxxx
In: header
Path Parameters
视频任务 ID
Response Body
application/json
application/json
curl -X GET "https://www.vibeapi.cn/v1/videos/string"{
"id": "string",
"object": "string",
"model": "string",
"status": "string",
"progress": 0,
"created_at": 0,
"seconds": "string"
}{
"error": {
"message": "string",
"type": "string",
"param": "string",
"code": "string"
}
}下载成片
Authorization
BearerAuth
使用 Bearer Token 认证。
格式: Authorization: Bearer sk-xxxxxx
In: header
Path Parameters
视频任务 ID
Response Body
video/mp4
application/json
curl -X GET "https://www.vibeapi.cn/v1/videos/string/content""string"{
"error": {
"message": "string",
"type": "string",
"param": "string",
"code": "string"
}
}