多模态
异步、基于任务 — 先创建任务,再轮询状态。创建时按请求的秒数计费;轮询状态免费。该端点没有 OpenRouter 式的兜底路由 —
每个模型都由拥有它的供应商直接提供服务。这一个端点覆盖三种生成模式 — 普通的
文生视频(下文)、
图生视频(为起始帧添加动画),以及
参考生成视频
(同时用多张图片、视频与音频片段来指导生成)— 具体是哪一种,只取决于你传的
model 是哪个。
文生视频
import time
import requests
# 创建任务
resp = requests.post(
"https://videorouter.sh/api/v1/videos",
headers={"Authorization": "Bearer llmr_sk_live_...", "Content-Type": "application/json"},
json={
"model": "minimax/h3/fal",
"prompt": "a paper airplane gliding over a city",
"duration_secs": 8,
},
)
job = resp.json()
# 轮询直到任务离开队列("queued" -> "in_progress" -> "completed"/"failed")
while job["status"] not in ("completed", "failed"):
time.sleep(5)
job = requests.get(
f"https://videorouter.sh/api/v1/videos/{job['id']}",
headers={"Authorization": "Bearer llmr_sk_live_..."},
).json()
if job["status"] == "completed":
video_url = job["data"][0]["url"] # 生成完成的视频
else:
raise RuntimeError(job["error"])
OpenAI SDK 目前还没有原生的视频方法 — 请用它的底层
client.post/client.get,
或直接用 requests,调用同一个
base_url。
分辨率与宽高比
传入 resolution(模型支持的档位,例如
"720p")与
aspect_ratio(
16:9/9:16/1:1/4:3/3:4/21:9 之一)
即可一起指定尺寸 — 与 /v1/images
形状一致。每个模型只支持部分组合;不识别或不支持的组合从不返回 400 — 会被忽略,转而使用该模型的默认分辨率/方向,
效果与两者都不传相同。显式传入
height/width
像素整数依然有效,且会覆盖
resolution/aspect_ratio —
但对大多数调用者来说,resolution/aspect_ratio
比手动计算精确像素尺寸更简单。
import requests
job = requests.post(
"https://videorouter.sh/api/v1/videos",
headers={"Authorization": "Bearer llmr_sk_live_...", "Content-Type": "application/json"},
json={
"model": "minimax/h3/fal",
"prompt": "a paper airplane gliding over a city",
"resolution": "720p",
"aspect_ratio": "16:9",
"duration_secs": 8,
},
).json()
对于 veo-3.1/veo-3.1-fast,
resolution/aspect_ratio
只能在一小组已确认支持的档位中选择 — DeepInfra 与 SiliconFlow 两行会忽略这两个参数。对于
veo-3.1-fast,档位不同价格也会不同。
图生视频
传入 start_image_url —
一个公开的 https:// URL,或内联的
data:image/...;base64,... URI —
即可为起始帧添加动画。在大多数模型上,这与文生视频用的同一个公开模型 id — 省略
start_image_url 就是普通的文生视频,
传入之后模型就会为该帧添加动画:Fal
(fal/seedance-2.0、
fal/h3)、Atlas Cloud(例如
atlascloud/h3)、Replicate
(replicate/h3)、WaveSpeedAI(例如
wavespeed/h3),以及 MachGen
(machgen/minimax-h3)。有几个模型完全没有
文生视频模式,必须传入 start_image_url
(不传会返回 400):fal/happy-horse、
novita/wan2.6-i2v、
machgen/vidu-q3-pro-fast,以及
machgen/grok-imagine-video-1.5。其余所有模型
传入 start_image_url 都会返回 400。
import requests
job = requests.post(
"https://videorouter.sh/api/v1/videos",
headers={"Authorization": "Bearer llmr_sk_live_...", "Content-Type": "application/json"},
json={
"model": "bytedance/seedance-2.0/fal",
"prompt": "the subject turns and smiles, gentle camera push-in",
"start_image_url": "https://example.com/photo.jpg",
"duration_secs": 5,
"resolution": "720p",
"aspect_ratio": "16:9",
},
).json()
fal/happy-horse 的
prompt 是可选的 — 省略它,
图片就会在没有任何文本指导的情况下被添加动画。
end_image_url(末帧/关键帧生成)目前还没有任何模型支持 —
传入会直接返回 400,而不是被静默忽略。
上传文件
以上每一个图片/视频/音频字段 — start_image_url
以及下文每一条 input_references /
input_video_references /
input_audio_references —
都接受公开的 https:// URL 或内联的
data:image/...;base64,... URI,
所以如果你的文件已经托管在某处,或者你不介意内联 base64 编码,就不需要看下面的内容了。如果这两种方式都不合适 —
文件只存在本地,或者 base64 会让一个较大的图片/视频超出合理的请求体积 —
POST /v1/uploads 会替你把文件暂存起来,
并返回一个可以传入相应字段的 URL。
import requests
# 1. 上传文件,取回一个 URL
with open("photo.jpg", "rb") as f:
upload = requests.post(
"https://videorouter.sh/api/v1/uploads",
headers={"Authorization": "Bearer llmr_sk_live_..."},
files={"file": f},
).json()
# -> {"url": "https://...", "expires_in": 1800}
# 2. 直接把这个 URL 作为 start_image_url 使用(或作为 input_references 的一项)
job = requests.post(
"https://videorouter.sh/api/v1/videos",
headers={"Authorization": "Bearer llmr_sk_live_...", "Content-Type": "application/json"},
json={
"model": "bytedance/seedance-2.0/fal",
"prompt": "the subject turns and smiles, gentle camera push-in",
"start_image_url": upload["url"],
},
).json()
file 是一个
multipart/form-data 字段 — 支持任意
image/*、
video/* 或
audio/* 内容类型,最大 50 MB。
返回的 URL 是预签名的,30 分钟后过期 — 足够你把它直接传入紧接着的下一次
/v1/videos 或
/v1/images 调用,但它只是这一次调用的临时空间,
不是用来长期保存文件的地方 — 每个新任务都要重新上传。
参考生成视频
这与上面的图生视频不同 — 不只是它的加强版。部分模型
(bytedance/seedance-2.0/fal、
minimax/h3/fal、
minimax/h3/atlas-cloud)
可以在一次调用中组合多个、三种不同类型的参考文件:最多 9 张图片、3 段视频、
3 段音频(合计 12 个)— 和上面文生/图生视频用的是同一个 model id,具体模式由你传的字段自动判断,
不需要单独查一个带 "-reference" 后缀的 id。两个新的请求字段延续了
input_references 已经在用的
{"type", "<kind>_url": {"url"}}
约定,只是分别用于视频和音频:
import requests
job = requests.post(
"https://videorouter.sh/api/v1/videos",
headers={"Authorization": "Bearer llmr_sk_live_...", "Content-Type": "application/json"},
json={
"model": "bytedance/seedance-2.0/fal",
"prompt": "the cat from the reference image walks across the scene",
"input_references": [
{"type": "image_url", "image_url": {"url": "https://example.com/cat.jpg"}}
],
"input_video_references": [
{"type": "video_url", "video_url": {"url": "https://example.com/motion-ref.mp4"}}
],
"input_audio_references": [
{"type": "audio_url", "audio_url": {"url": "https://example.com/ambience.mp3"}}
],
"duration_secs": 5,
},
).json()
这三个数组各自都是可选的,但三者合计至少需要一个参考文件 — 三者都不传会返回 400
(如果只是想要普通文生视频,请改用不带任何参考的
prompt 调用
fal/seedance-2.0)。超出任一类型的单项上限,
或合计超过 12 个,同样会返回 400。
MachGen 的参考生成视频模型(machgen/vidu-q3、
machgen/minimax-h3-reference)能力更窄 —
只支持图片,最多 7 张,完全不支持
input_video_references/input_audio_references。
input_references 的传法相同,只需省略另外两个数组。
视频编辑
这与上面的参考生成视频不同 — 它修改的是已有片段,而不是指导一次全新的生成。传入
input_video_url(单个 URL,不是数组),
连同描述编辑内容的 prompt — 同一次调用中不能与
start_image_url/input_references/input_video_references
同时使用。
import requests
job = requests.post(
"https://videorouter.sh/api/v1/videos",
headers={"Authorization": "Bearer llmr_sk_live_...", "Content-Type": "application/json"},
json={
"model": "atlascloud/grok-imagine-video-edit",
"prompt": "Adjust the video style to an American comic book style.",
"input_video_url": "https://example.com/source-clip.mp4",
},
).json()
目前已接入:atlascloud/grok-imagine-video-edit
(xAI Grok Imagine,按输入片段的秒数计费 — 输出长度始终与输入一致,最长 8.7 秒)、
replicate/kling-v3-omni-video
(传入 input_video_url 而不是
input_video_references,可以把该模型从
参考/风格模式切换到真正的编辑模式)、
runway/aleph-2(Runway 的 Aleph 2.0,
输入最长 30 秒),以及 pika/pikadditions
(固定 $0.03/请求,插入物体风格的编辑)。
计费
全部费用在任务创建时一次性按请求的 duration_secs
计费 — GET /v1/videos/{id}
状态轮询不产生任何增量供应商成本,也不计费。和其他所有模式一样,该端点在供应商成本之上统一加收
2% 平台费 — 见 价格与账单。
例外情况:SiliconFlow 的两个 siliconflow/
前缀模型固定收取每段 $0.29,无论你请求的
duration_secs 是多少 —
SiliconFlow 自己的 API 会忽略时长参数,始终渲染约 5 秒的固定片段,因此这两个模型请求体中的
duration_secs 在我们这边也同样会被忽略。
尚未支持
视频编辑目前只接入了 4 个模型(见上文视频编辑)— 暂无视频延展/续接端点。视频作为对话输入也暂不支持。
图生视频已接入 Fal、Atlas Cloud、Replicate、WaveSpeedAI、Novita 与 MachGen。参考生成视频(同时使用多个图片/视频/音频输入) 已接入 Fal、Atlas Cloud 与 MachGen。Kling 与 Luma 在其上游各自都有图生视频能力,但尚未接入这个端点。