视频生成
视频生成使用异步任务接口。提交成功后先保存响应中的视频 ID,再轮询任务状态;状态变为 completed 后下载 MP4 文件。
图生视频示例
下面的请求使用本地图片作为首个参考素材:
curl --fail-with-body https://relay.withrpm.org/v1/videos \
-H "Authorization: Bearer $SPEEDYRPM_API_KEY" \
-F "model=veo-3.1-i2v-fast" \
-F "prompt=镜头缓慢向前移动,保持主体外观一致" \
-F "input_reference=@./reference.jpg;type=image/jpeg" \
-F "seconds=8" \
-F "size=1280x720"veo-3.1-i2v 和 veo-3.1-i2v-fast 是图生视频模型,必须提供 input_reference,并使用 seconds=8。示例中的模型是否可用仍应以当前 API Key 调用 /v1/models 的结果为准。
这两个 Veo 模型仅支持固定 8 秒,不支持 6 秒或其他时长。传入非 8 秒值会返回 HTTP 400,并在 error.message 中说明固定时长要求;客户端应修正参数,不应按网关故障重试。
Hailuo 3.0 图生视频同样使用异步接口,例如:
curl --fail-with-body https://relay.withrpm.org/v1/videos \
-H "Authorization: Bearer $SPEEDYRPM_API_KEY" \
-F "model=hailuo-video-3.0-i2v" \
-F "prompt=镜头缓慢向前移动,保持主体外观一致" \
-F "input_reference=@./reference.jpg;type=image/jpeg" \
-F "seconds=4" \
-F "size=1280x768"提交成功会返回异步任务对象。字段可能随任务进度更新,客户端至少应保存 id 并检查 status:
{
"id": "<VIDEO_ID>",
"object": "video",
"model": "veo-3.1-i2v-fast",
"status": "in_progress",
"progress": 1,
"stage": "preparing",
"eta_seconds": null,
"progress_updated_at": 1787192104,
"seconds": "8",
"size": "1280x720"
}文生视频示例
不带参考素材的模型可以使用 multipart 表单提交文生视频任务:
curl --fail-with-body https://relay.withrpm.org/v1/videos \
-H "Authorization: Bearer $SPEEDYRPM_API_KEY" \
-F "model=seedance-2.0-mini" \
-F "prompt=清晨的海边,镜头沿着沙滩平稳前进" \
-F "seconds=4" \
-F "size=854x480"不同模型允许的时长、尺寸和参考素材不同。不要把一个模型的参数直接用于另一个模型。
模型档位
下表列出当前视频模型的固定约束。模型是否对某个 API Key 开放,仍以该 API Key 调用 /v1/models 的结果为准。
| 模型 | 输出时长 | 分辨率档位 | 参考素材 |
|---|---|---|---|
hailuo-video-3.0-t2v | 4–15 秒,按整秒设置 | 768p、1440p | 文生视频,无需参考素材 |
hailuo-video-3.0-i2v | 4–15 秒,按整秒设置 | 768p、1440p | 需要参考素材 |
hailuo-video-3.0-extend | 4–15 秒,按整秒设置 | 仅 1440p | 需要参考视频;参考视频时长参与计费 |
seedance-2.0 | 4–15 秒,按整秒设置 | 480p、720p、1080p、4K | 最多 12 个参考素材,其中参考视频最多 3 个;参考视频时长参与计费 |
seedance-2.0-fast | 4–15 秒,按整秒设置 | 480p、720p | 最多 12 个参考素材,其中参考视频最多 3 个;参考视频时长参与计费 |
seedance-2.0-mini | 4–15 秒,按整秒设置 | 480p、720p | 最多 12 个参考素材,其中参考视频最多 3 个;参考视频时长参与计费 |
veo-3.1-i2v | 固定 8 秒,不可调整 | 720p、1080p、4K | 需要参考图 |
veo-3.1-i2v-fast | 固定 8 秒,不可调整 | 720p、1080p、4K | 需要参考图 |
请求字段
| 字段 | 类型 | 必填 | 说明 |
|---|---|---|---|
model | string | 是 | /v1/models 返回的视频模型 ID |
prompt | string | 是 | 视频内容描述 |
input_reference | file | 图生视频必填 | 单张参考图片;示例使用 JPEG |
seconds | integer | 是 | 输出时长,取值由模型决定 |
size | string | 是 | 宽x高,例如 1280x720 |
参考素材总大小不能超过 50 MB。生产客户端还应为提交、轮询和下载分别设置超时。
查询任务
curl --fail-with-body \
-H "Authorization: Bearer $SPEEDYRPM_API_KEY" \
"https://relay.withrpm.org/v1/videos/<VIDEO_ID>"支持丰富进度的任务会在同一个查询响应中返回以下字段,不需要调用额外的进度接口:
{
"id": "<VIDEO_ID>",
"object": "video",
"status": "in_progress",
"progress": 47,
"stage": "generating",
"eta_seconds": 38,
"progress_updated_at": 1787192104
}| 字段 | 类型 | 说明 |
|---|---|---|
status | string | 任务状态;终态为 completed 或 failed |
progress | integer 或 null | 0–100 的进度百分比;不具备精确进度能力的渠道可能返回粗略值或 null |
stage | string,可选 | 当前阶段;支持值见下表 |
eta_seconds | integer 或 null,可选 | 预计剩余秒数;未知或预测已失效时为 null |
progress_updated_at | integer,可选 | 进度快照实际推进时的 Unix 秒时间戳,不是本次 HTTP 响应时间 |
丰富进度的阶段如下:
| 阶段 | 含义 |
|---|---|
preparing | 正在准备生成任务 |
generating | 正在生成视频 |
finalizing | 正在整理、下载或保存成品 |
completed | 成品已经可以下载 |
failed | 任务失败 |
客户端必须允许 stage、eta_seconds 和 progress_updated_at 缺失。没有数字进度时应显示不确定进度条,不要自行虚构百分比或 ETA。
下面是一个最小轮询示例:
async function waitForVideo(videoId, apiKey) {
let delayMs = 5000;
while (true) {
const response = await fetch(
`https://relay.withrpm.org/v1/videos/${encodeURIComponent(videoId)}`,
{ headers: { Authorization: `Bearer ${apiKey}` } },
);
if (!response.ok) {
throw new Error(`query failed: HTTP ${response.status}`);
}
const video = await response.json();
renderProgress({
status: video.status,
progress: video.progress ?? null,
stage: video.stage ?? null,
etaSeconds: video.eta_seconds ?? null,
updatedAt: video.progress_updated_at ?? null,
});
if (video.status === "completed") return video;
if (video.status === "failed") {
throw new Error(video.error?.message ?? "video generation failed");
}
await new Promise((resolve) => setTimeout(resolve, delayMs));
delayMs = Math.min(15000, Math.round(delayMs * 1.2));
}
}常见状态如下:
| 状态 | 含义 | 客户端处理 |
|---|---|---|
pending | 等待进入队列 | 继续轮询 |
queued | 已进入队列 | 继续轮询 |
in_progress | 正在生成或整理结果 | 继续轮询 |
completed | 已完成 | 下载视频 |
failed | 任务失败 | 读取 error,不要无限重试同一请求 |
建议从 5 秒轮询间隔开始,并逐步放慢到 10–15 秒;不要高频查询。连续响应的 progress_updated_at 相同表示尚无新进度快照,这不是错误。任务 ID 只允许创建它的 API Key 所属账户查询。
下载视频
任务状态变为 completed 后下载内容:
curl --fail-with-body -L \
-H "Authorization: Bearer $SPEEDYRPM_API_KEY" \
"https://relay.withrpm.org/v1/videos/<VIDEO_ID>/content" \
-o output.mp4下载接口返回 video/mp4。视频结果有保存期限,应用应在任务完成后及时下载到自己的存储中;在任务尚未完成时调用下载接口会返回错误。
失败与重试
参数错误使用统一的 OpenAI 风格响应。以下示例表示请求的 1 秒不在 Hailuo 3.0 支持的 4–15 秒范围内:
{
"error": {
"message": "hailuo-video-3.0-i2v 的 seconds 必须为 4–15 的整数,当前值为 1。",
"type": "invalid_request_error",
"param": "seconds",
"code": "invalid_video_duration"
}
}- 提交接口返回 4xx 时,先检查模型 ID、必填字段、时长、尺寸和参考图片格式。
- 提交接口没有返回视频 ID 时,不要开始轮询。
- 网络中断后可先根据已经保存的视频 ID 查询状态,避免重复提交和重复计费。
- 任务返回
failed时,以响应中的error.message为准;如需重新生成,应创建新任务。