使用 rb.video() 生成视频。所有视频生成均为异步模式——提交任务,然后轮询获取结果。SDK 的 .task() 方法已封装自动轮询。
快速开始
import { RouterBrain } from '@router-brain/sdk';
const rb = new RouterBrain('sk-your-api-key');
// 提交任务 + 自动轮询直到完成
const result = await rb.video({
model: 'wan2.1-t2v-turbo',
prompt: '夜晚城市街道的电影感推进镜头,霓虹灯,雨后反光',
resolution: '720p',
ratio: '16:9',
}).task({ pollInterval: 3000 });
console.log(result.task_status); // 'success'
console.log(result.data[0]?.url); // 生成的视频 URL
仅提交任务
如需自行处理轮询逻辑:
const created = await rb.video({
model: 'wan2.1-t2v-turbo',
prompt: '一只机器人在火星基地巡检',
resolution: '720p',
}).json();
console.log(created.task_id); // 通过 /video/v1/tasks/:task_id 轮询
多模态输入
rb.video() 支持文本、图片、视频和音频输入。字符串默认为 URL,对象使用 VideoURL 结构(含 type 角色字段)。
// 图生视频
const imageResult = await rb.video({
model: 'kling-v2-1-turbo',
prompt: '让图片中的人物转头微笑',
image: 'https://example.com/portrait.jpg',
resolution: '720p',
}).task();
// 视频参考输入(Seedance modality_tokens 计费会据此切换价格)
const videoResult = await rb.video({
model: 'doubao-seedance-1-0-pro-250528',
prompt: '基于参考视频生成续集,保持人物和场景一致',
video: { type: 'reference_video', url: 'https://example.com/clip.mp4' },
resolution: '720p',
}).task();
// 多参考图
const multiResult = await rb.video({
model: 'doubao-seedance-1-0-pro-250528',
prompt: '基于两张参考图生成平滑转场',
image: ['https://example.com/frame1.jpg', 'https://example.com/frame2.jpg'],
resolution: '720p',
}).task();
取消轮询
传入 AbortSignal 停止轮询。
const controller = new AbortController();
setTimeout(() => controller.abort(), 120000);
try {
const result = await rb.video({
model: 'wan2.1-t2v-turbo',
prompt: '...',
}).task({ signal: controller.signal });
} catch (err) {
console.error('Task aborted or failed:', (err as Error).message);
}
可用方法
| 方法 | 返回类型 | 说明 |
|---|---|---|
json() | Promise<VideoResponseJson> | 提交任务 —— 获取 task_id |
task(opts?) | Promise<VideoTaskResponseJson> | 提交 + 自动轮询直到成功、失败或取消 |
httpStatus() | Promise<number> | 检查 HTTP 状态码 |
请求参数
| 参数 | 类型 | 必需 | 说明 |
|---|---|---|---|
model | string | ✅ | 模型代码,如 wan2.1-t2v-turbo |
prompt | string | ✅ | 文本提示词 |
image | string | string[] | VideoURL | VideoURL[] | ❌ | 参考图片 |
video | string | string[] | VideoURL | VideoURL[] | ❌ | 参考视频 |
audio | string | string[] | VideoURL | VideoURL[] | ❌ | 参考音频 |
ratio | string | ❌ | 画幅比例:16:9、9:16、1:1 |
resolution | string | ❌ | 分辨率:480p、720p、1080p、4k |
upstream_options | Record<string, any> | ❌ | 厂商私有参数 |
headers | Record<string, string | string[]> | ❌ | 自定义 HTTP 请求头 |
驱动参数
Seedance (upstream_options)
const result = await rb.video({
model: 'doubao-seedance-1-0-pro-250528',
prompt: '...',
upstream_options: {
duration: 5,
watermark: false,
service_tier: 'default',
seed: 42,
generate_audio: true,
},
}).task();
百炼 (upstream_options)
const result = await rb.video({
model: 'kling-v2-1-turbo',
prompt: '...',
upstream_options: {
duration: 5,
watermark: false,
seed: 123,
},
}).task();
任务响应结构
interface VideoTaskResponseJson {
task_id: string;
task_status: 'pending' | 'running' | 'success' | 'failed' | 'cancelled';
model: string;
created: number | null; // 时间戳(毫秒)
updated: number | null; // 时间戳(毫秒)
completed: number | null; // 时间戳(毫秒)
data: VideoTaskData[]; // 成功时 [{ url: "..." }]
error: VideoTaskError | null; // 失败时 { code, message }
}
计费方式
| 方式 | 驱动 | 单位 |
|---|---|---|
duration | 百炼 | credits/输出视频秒数 |
modality_tokens | Seedance | credits/token,区分请求是否含视频输入 |
使用 rb.models('video') 和 rb.endpoints('video', code) 查看定价:
const models = await rb.models('video', { q: 'seedance' });
console.log(models.data[0].pricing);
const detail = await rb.endpoints('video', 'doubao-seedance-1-0-pro-250528');
for (const ep of detail.endpoints) {
console.log(ep.billing_method, ep.pricing);
}