Discord

多模态

异步、基于任务 — 先创建任务,再轮询状态。创建时按请求的秒数计费;轮询状态免费。该端点没有 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 在其上游各自都有图生视频能力,但尚未接入这个端点。