OpenAI 协议接入(视频)
New API 提供与 OpenAI Videos API 对齐的异步视频接口。一个接口覆盖所有走异步任务的视频模型: 提交任务拿到任务 ID,再用任务 ID 查询状态、取回文件。
本页字段与状态取值直接对应仓库实现,改动代码时请同步更新:
relay/common/relay_info.go(提交字段)、dto/openai_video.go(提交/查询响应的 OpenAI 形状)、dto/task.go(网关通用任务响应)、model/task.go(任务状态常量)、router/video-router.go(路由)。
端点一览
| 方法 | 路径 | 说明 |
|---|---|---|
POST | https://api.yu-yu.ai/v1/videos | 提交视频生成任务 |
POST | https://api.yu-yu.ai/v1/videos/{video_id}/remix | 基于已有视频再生成一版(video_id 为原任务 ID) |
GET | https://api.yu-yu.ai/v1/videos/{task_id} | 查询任务状态与结果 |
GET | https://api.yu-yu.ai/v1/videos/{task_id}/content | 取回视频文件本体(二进制流) |
同一个提交入口还有一条别名:POST https://api.yu-yu.ai/v1/video/generations,查询别名为 GET https://api.yu-yu.ai/v1/video/generations/{task_id}。两者与上表行为一致,选任一条都可以。
鉴权
所有端点都使用 API Key:
http
Authorization: Bearer sk-xxxxxxxxxxxxxxxx
Content-Type: application/jsonGET /v1/videos/{task_id}/content 额外允许控制台登录态直接访问(便于在浏览器里预览), 但用 API Key 调用时与其他端点完全一致。
提交任务
请求体字段
| 字段 | 类型 | 必填 | 说明 |
|---|---|---|---|
model | string | 是 | 模型名,取值见模型列表 |
prompt | string | 通常是 | 画面描述。部分模型以图生视频为主,可只传图不传提示词 |
image | string | 否 | 首帧参考图 URL(部分模型支持 Base64) |
images | string[] | 否 | 多张参考图,用于多图参考的模型 |
video_url | string | 否 | 输入视频 URL,用于视频改绘/超分这类任务 |
input_reference | string | 否 | OpenAI 协议的参考图字段,与 image 等价 |
size | string | 否 | 分辨率,如 720p、1080p、1920x1080;不传按模型默认值 |
duration | integer | string | 否 | 生成时长(秒)。数字与数字字符串都接受,"5" 与 5 等价 |
seconds | string | 否 | OpenAI 协议的时长字段,字符串形式,如 "8" |
generation_model | string | 否 | 指定底模(同一模型族内多底模时使用);也接受驼峰 generationModel |
mode | string | 否 | 生成模式标识,取值随模型而定(如文生视频/图生视频) |
metadata | object | string | 否 | 模型专用参数。对象或 JSON 字符串都接受;常用键见下表 |
metadata 里的常见键(是否生效取决于模型):
| 键 | 类型 | 说明 |
|---|---|---|
resolution | string | 分辨率,与 size 同义 |
ratio / aspect_ratio | string | 画幅比例,如 16:9、9:16 |
duration | number | 时长(秒),会被合并进顶层时长 |
seed | number | 随机种子,用于复现同一结果 |
negative_prompt | string | 负向提示词 |
watermark | boolean | 是否加模型方水印 |
callback_url | string | 任务终态回调地址,部分家族支持 |
请求示例
bash
curl -X POST 'https://api.yu-yu.ai/v1/videos' \
-H 'Authorization: Bearer sk-xxxxxxxxxxxxxxxx' \
-H 'Content-Type: application/json' \
-d '{
"model": "wan3.0-video",
"prompt": "一只橘猫坐在窗边打哈欠,清晨自然光,镜头缓慢推进",
"size": "720p",
"duration": 5
}'图生视频:
bash
curl -X POST 'https://api.yu-yu.ai/v1/videos' \
-H 'Authorization: Bearer sk-xxxxxxxxxxxxxxxx' \
-H 'Content-Type: application/json' \
-d '{
"model": "happyhorse-1.1-i2v",
"prompt": "镜头缓慢环绕",
"image": "https://your-oss-domain/path/first-frame.jpg",
"metadata": { "resolution": "1080p", "ratio": "16:9" }
}'提交响应
提交成功后立即返回任务对象,此时视频还没生成:
json
{
"id": "task_xxxxxxxxxxxxxxxx",
"task_id": "task_xxxxxxxxxxxxxxxx",
"object": "video",
"model": "wan3.0-video",
"status": "queued",
"progress": 0,
"created_at": 1767225600,
"upstream_task_id": ""
}| 字段 | 类型 | 说明 |
|---|---|---|
id | string | 任务 ID,后续查询/取回都用它 |
task_id | string | 与 id 同值,兼容早期接口(逐步废弃) |
object | string | 固定为 video |
model | string | 实际使用的模型名 |
status | string | 任务状态,提交阶段固定为 queued |
progress | integer | 进度百分比,0~100 |
created_at | integer | 创建时间(Unix 秒) |
completed_at | integer | 完成时间,未完成时不返回 |
expires_at | integer | 结果过期时间,部分协议返回 |
seconds | string | 实际时长,部分协议返回 |
size | string | 实际分辨率,部分协议返回 |
remixed_from_video_id | string | 重制任务的来源视频 ID,仅 remix 返回 |
upstream_task_id | string | 上游任务号,部分协议返回;无则为空串 |
error | object | 失败时的 { code, message } |
查询任务
bash
curl 'https://api.yu-yu.ai/v1/videos/task_xxxxxxxxxxxxxxxx' \
-H 'Authorization: Bearer sk-xxxxxxxxxxxxxxxx'返回体有两种形状,以你实际拿到的为准:
形状 A:OpenAI 视频对象(绝大多数模型走这条)
json
{
"id": "task_xxxxxxxxxxxxxxxx",
"task_id": "task_xxxxxxxxxxxxxxxx",
"object": "video",
"model": "wan3.0-video",
"status": "completed",
"progress": 100,
"created_at": 1767225600,
"completed_at": 1767225720,
"seconds": "5",
"size": "1280x720",
"upstream_task_id": "cgt-2026xxxx",
"metadata": { "url": "https://.../result.mp4" }
}形状 B:网关通用任务对象(任务刚提交、模型平台信息尚未回填等情况下出现)
json
{
"code": "success",
"message": "",
"data": {
"task_id": "task_xxxxxxxxxxxxxxxx",
"status": "SUCCESS",
"progress": "100%",
"result_url": "https://.../result.mp4",
"resolution": "1280x720",
"duration_seconds": 5,
"submit_time": 1767225600,
"start_time": 1767225610,
"finish_time": 1767225720,
"fail_reason": ""
}
}形状 B 的字段说明(data 内,来自网关任务对象):
| 字段 | 类型 | 说明 |
|---|---|---|
task_id | string | 任务 ID |
platform | string | 任务所属平台标识 |
action | string | 任务类型标识 |
status | string | 任务状态,见下表 |
progress | string | 进度文本,如 "35%"、"100%" |
result_url | string | 结果文件地址,成功时返回 |
resolution | string | 结果分辨率 |
duration_seconds | integer | 结果时长(秒) |
submit_time / start_time / finish_time | integer | 提交/开始/完成时间(Unix 秒) |
fail_reason | string | 失败原因,失败时返回 |
upstream_task_id | string | 上游任务号 |
状态取值
形状 A(小写)
| 状态 | 含义 |
|---|---|
queued | 排队中,尚未开始 |
in_progress | 生成中 |
completed | 已完成,可以取回结果 |
failed | 失败,看 error 字段 |
cancelled | 已取消 |
unknown | 状态未知(上游未返回可识别的状态) |
形状 B(大写)
| 状态 | 含义 |
|---|---|
NOT_START | 尚未开始 |
SUBMITTED | 已提交 |
QUEUED | 排队中 |
PREPARING_ASSETS | 正在准备素材(参考图/视频预处理) |
SUBMITTING | 正在向上游提交 |
IN_PROGRESS | 生成中 |
SUCCESS | 已完成 |
FAILURE | 失败 |
CANCELLED | 已取消 |
UNKNOWN | 状态未知 |
判断是否结束:形状 A 看 completed / failed / cancelled;形状 B 看 SUCCESS / FAILURE / CANCELLED。其余状态继续轮询。
取回视频文件
GET https://api.yu-yu.ai/v1/videos/{task_id}/content 返回视频二进制流(不是 JSON),响应头带内容类型。 适合直接给播放器或下载:
bash
curl -L 'https://api.yu-yu.ai/v1/videos/task_xxxxxxxxxxxxxxxx/content' \
-H 'Authorization: Bearer sk-xxxxxxxxxxxxxxxx' \
-o result.mp4任务还没完成时该端点不返回半成品,会按任务状态给出错误;也可以直接用 result_url / metadata.url。
轮询建议
任务耗时通常从十几秒到几分钟不等,建议:
- 首次查询延迟 5 秒以上,之后每次间隔 5 秒;单次任务轮询上限 10 次左右。
- 命中终态立即停止;连续查询失败不要重试到无限(网络类错误重试 2~3 次即可)。
- 长耗时模型(1080P、长时长)请放宽上限,或改用
callback_url回调。
错误响应
JSON 接口的错误体形如:
json
{
"error": {
"code": "task_not_exist",
"message": "task_not_exist"
}
}常见错误码:
| 错误码 | 触发条件 | 处理方式 |
|---|---|---|
task_not_exist | 任务 ID 不存在,或不属于当前 API Key | 检查任务 ID 是否来自同一个 Key 的提交 |
invalid_channel_id | 终态任务缺少可用的平台信息(数据异常) | 用控制台任务详情核对,必要时重新提交 |
not_implemented | 该模型所在接入方式不支持 OpenAI 视频查询格式 | 用该模型文档页给出的查询端点 |
quota_not_enough | 当前 API Key 的可用量不足 | 更换一个可用的 Key |
convert_to_openai_video_failed | 结果转换失败(上游返回异常) | 稍后重试;持续失败请提交任务详情 |
常见问题
- 提交返回
model不存在:确认模型名拼写,并用模型列表核对当前实例启用的模型。 duration传了字符串没生效:本接口同时接受数字与数字字符串,但不要传"5s"这类带单位的写法,只接受纯数字或纯数字字符串。- 图生视频提示图片不可访问:参考图必须是公网可访问的 URL;本地文件先上传到对象存储。
- remix 报任务不存在:路径里的
{video_id}必须是本 Key 自己提交成功过的任务 ID。 - 查询一直
in_progress:模型正在生成,或任务在排队。可用控制台任务页核对详细状态与进度。
