使用 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 状态码

请求参数

参数类型必需说明
modelstring模型代码,如 wan2.1-t2v-turbo
promptstring文本提示词
imagestring | string[] | VideoURL | VideoURL[]参考图片
videostring | string[] | VideoURL | VideoURL[]参考视频
audiostring | string[] | VideoURL | VideoURL[]参考音频
ratiostring画幅比例:16:99:161:1
resolutionstring分辨率:480p720p1080p4k
upstream_optionsRecord<string, any>厂商私有参数
headersRecord<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_tokensSeedancecredits/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);
}

参考

视频生成 API · 错误处理 · 自定义请求头