身份验证
在请求头中携带当前账户生成的 Bearer API Key。
Authorization: Bearer YOUR_API_KEY
模型列表
GET
/v1/modelscurl /v1/models \
-H "Authorization: Bearer YOUR_API_KEY"
调用额度
GET
/v1/limits返回当前用户的并发上限、排队上限、进行中及排队数量,以及剩余视频额度。每次成功创建任务消耗 1 个额度;任务失败会返还。
创建视频
POST
/v1/videos先从模型列表选择可用模型。视频生成是异步任务,创建成功会返回 HTTP 202;保存返回的 id 或 task_id 后查询结果。参考素材可同时使用图片、视频和音频公网 URL;素材地址必须能被本服务访问,不能是本机路径或依赖登录 Cookie 的地址。
curl /v1/videos \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "YOUR_VIDEO_MODEL_ID",
"prompt": "参考图片中的产品、参考视频的镜头运动和参考音频的节奏,生成约 5 秒的产品视频",
"seconds": 5,
"size": "1080p",
"content": [
{ "type": "input_text", "text": "参考图片中的产品、参考视频的镜头运动和参考音频的节奏,生成约 5 秒的产品视频" },
{ "type": "input_image", "image_url": "https://example.com/reference.png" },
{ "type": "input_video", "video_url": "https://example.com/reference.mp4" },
{ "type": "input_audio", "audio_url": "https://example.com/reference.mp3" }
]
}'
本地 PNG、MP4 和 MP3/WAV
本地文件先转换为 data URL,再放入同一个 content 数组。MP3 使用 audio/mpeg,WAV 使用 audio/wav。
import { readFile } from "node:fs/promises";
const apiKey = process.env.VIDEO_API_KEY;
if (!apiKey) throw new Error("请设置 VIDEO_API_KEY");
async function dataUrl(path, mimeType) {
const bytes = await readFile(path);
return `data:${mimeType};base64,${bytes.toString("base64")}`;
}
const prompt = "参考图片、视频和音频生成约 5 秒的视频";
const body = {
model: "YOUR_VIDEO_MODEL_ID",
prompt,
seconds: 5,
size: "1080p",
content: [
{ type: "input_text", text: prompt },
{ type: "input_image", image_url: await dataUrl("./reference.png", "image/png") },
{ type: "input_video", video_url: await dataUrl("./reference.mp4", "video/mp4") },
{ type: "input_audio", audio_url: await dataUrl("./reference.mp3", "audio/mpeg") }
]
};
const response = await fetch("/v1/videos", {
method: "POST",
headers: {
authorization: `Bearer ${apiKey}`,
"content-type": "application/json"
},
body: JSON.stringify(body)
});
const result = await response.json();
if (!response.ok) throw new Error(result?.error?.message || JSON.stringify(result));
console.log("task_id:", result.task_id || result.id);
VIDEO_API_KEY="YOUR_API_KEY" node create-video.mjs
任务列表
GET
/v1/videoscurl /v1/videos \
-H "Authorization: Bearer YOUR_API_KEY"
查询任务
GET
/v1/videos/{task_id}创建成功后保存返回的 id 或 task_id,再轮询查询接口。queued 或 in_progress 时继续轮询;completed 时读取 video_url;failed 时读取 error。
curl /v1/videos/YOUR_TASK_ID \
-H "Authorization: Bearer YOUR_API_KEY"
OpenAI 兼容字段
图片使用 input_image.image_url,视频使用 input_video.video_url,音频使用 input_audio.audio_url。
| 字段 | 说明 |
|---|---|
model | 从 /v1/models 返回的可用视频模型 ID。 |
prompt | 视频生成提示词;也可在 content 中使用 input_text。建议不超过 20000 字符。 |
seconds | 期望视频时长。 |
size | 视频分辨率,例如 1080p;兼容旧字段 resolution。 |
duration | seconds 的兼容别名。 |
frame_mode | 可选画面模式;也可使用 frameMode。 |
content | 可同时包含 input_text、input_image、input_video 和 input_audio。 |
不要提交上游内部字段,例如 vid、audioVid、reference_images、reference_videos、reference_audios 或 input_reference。
注意事项
- JSON 请求应明确设置
Content-Type: application/json。 - 不要手动构造发往上游的 multipart boundary;保持 OpenAI 兼容的 JSON
content输入即可。 - 本地文件转成 Base64 后体积约增加三分之一。单个素材不能超过 30 MB,单个任务素材总量不能超过 60 MB,最多可提交 12 个参考素材。
- 各模型允许的图片、视频、音频数量和时长不同,应以
/v1/models返回的能力为准。 - MP3 推荐使用
audio/mpeg,WAV 使用audio/wav。
取消任务
POST
/v1/videos/{task_id}/cancel排队任务会直接从本地队列取消,不会提交到上游视频服务。
下载视频
GET
/v1/videos/{task_id}/content