将下方平台地址替换 OpenAI 的
base_url,使用平台颁发的令牌作为
api_key,即可开始调用。
该地址为平台统一接入地址,兼容 OpenAI 协议;以下示例中的地址均自动取自此处。
sk- 开头的密钥
api_key 填入客户端或代码中
操练场是内置的在线测试工具,无需编写代码即可直接与模型对话,适合快速验证令牌是否可用。
/console/playground)
from openai import OpenAI
client = OpenAI(
api_key="sk-xxxxxxxxxxxxxxxx", # 平台颁发的令牌
base_url="…"
)
response = client.chat.completions.create(
model="gpt-4o",
messages=[{"role": "user", "content": "Hello!"}]
)
print(response.choices[0].message.content)
curl …/messages \
-H "x-api-key: sk-xxxxxxxx" \
-H "anthropic-version: 2023-06-01" \
-H "content-type: application/json" \
-d '{"model": "claude-3-5-sonnet-20241022", "max_tokens": 1024,
"messages": [{"role": "user", "content": "Hello"}]}'
curl "…/v1beta/models/gemini-1.5-pro:generateContent?key=sk-xxxxxxxx" \
-H "Content-Type: application/json" \
-d '{"contents": [{"parts": [{"text": "Hello"}]}]}'
| 接口 | 方法 | 路径 | 说明 |
|---|---|---|---|
| 聊天补全 | POST | /v1/chat/completions | 对话生成,支持流式输出 |
| 文本补全 | POST | /v1/completions | 传统补全接口 |
| 向量嵌入 | POST | /v1/embeddings | 文本向量化 |
| 图像生成 | POST | /v1/images/generations | 文生图 |
| 图像编辑 | POST | /v1/images/edits | 图像编辑 |
| 语音转文字 | POST | /v1/audio/transcriptions | Whisper 等 |
| 文字转语音 | POST | /v1/audio/speech | TTS |
| 重排序 | POST | /v1/rerank | 文档重排序 |
| Responses API | POST | /v1/responses | OpenAI Responses 格式 |
| 实时对话 | GET | /v1/realtime(WebSocket) | OpenAI Realtime API |
| 模型列表 | GET | /v1/models | 查询可用模型 |
| 视频生成 | POST | /v1/videos | 创建视频任务,见下方「视频生成模型」 |
| 视频任务查询 | GET | /v1/videos/{task_id} | 轮询视频任务状态 |
视频生成接口采用异步任务模型:先调用生成接口创建任务获得
task_id,再循环轮询状态接口直到任务完成(data.status
为 SUCCESS),从
data.result_url 取出视频下载地址。
两套地址均可使用,请求参数与返回结构完全相同(统一返回
{code, message, data} 规范结构)。
| 方法 | 路径 | 说明 |
|---|---|---|
| POST | /v1/videos | 创建视频生成任务(OpenAI 兼容格式) |
| GET | /v1/videos/{task_id} | 查询任务状态(OpenAI 兼容格式) |
| GET | /v1/videos/{task_id}/content | 直接获取视频内容(代理下载) |
| POST | /v1/video/generations | 创建视频任务(平台原生格式) |
| GET | /v1/video/generations/{task_id} | 查询任务状态(平台原生格式) |
POST /v1/videos 与 POST
/v1/video/generations 请求体相同(JSON):
| 字段 | 类型 | 必填 | 说明 |
|---|---|---|---|
| model | string | 是 |
视频模型名称,如
doubao-seedance-2.0、happyhorse-1.1-t2v
|
| prompt | string | 条件必填 |
视频生成提示词(≤20000 字符);与
content 中
type:text
的文本至少提供其一。两者同时提供时以本字段为准
|
| duration | int | 视模型 |
视频时长(秒),如 4-15;Seedance 2.5 的
edit 场景传
-1(时长由参考视频决定)
|
| seconds | int/string | 否 |
原生时长字段(秒);传
duration 时自动补写,一般无需直接传
|
| resolution | string | 视模型 |
分辨率:480p /
720p /
1080p /
4k
|
| ratio | string | 否 |
宽高比:16:9 /
9:16 /
1:1 等,首帧 / 首尾帧 / 编辑 /
延长场景常用 adaptive
|
| image | string | 否 | 首帧参考图(公网 HTTPS URL) |
| image_urls | array[string] | 否 | 参考图列表;第 1 张首帧,第 2 张尾帧 |
| video | string | 否 | 单个参考视频(公网 HTTPS) |
| video_urls | array[string] | 否 | 参考视频列表 |
| input_reference | file/string | 否 | 参考图文件(multipart 文件上传)或 URL |
| content | json数组 | 条件必填 |
原生内容数组:type:text 承载文本,
type:image_url /
video_url /
audio_url
携带素材,并通过
role
指定素材角色(first_frame /
last_frame /
reference_image /
reference_video /
reference_audio)。未指定
role
的图片按参考图处理。各模型对素材角色与数量的要求不同,见下方
「万相 3.0」与「HappyHorse」章节
|
| callback_url | string | 否 | 任务终态回调地址(公网 HTTPS) |
| watermark | bool | 否 | 是否添加水印,默认 false |
| seed | int | 否 | 随机种子 [0, 2147483647] |
| generate_audio | bool | 否 | 是否生成同步音频(仅部分模型) |
| return_last_frame | bool | 否 | 是否返回尾帧图像(仅部分模型) |
| omni_reference_task_type | string | 否 |
全模态参考生视频任务类型(Seedance 2.5 专属):auto(默认,模型自动判定)/
reference(参考生视频)/
edit(视频编辑)/
extend(视频延长)。指定
edit /
extend
时有前置校验与异步校验,见下方「Seedance 2.5
全模态参考任务类型」
|
不同模型支持的参数范围不同,请以控制台「视频模型」页面为准。例如
doubao-seedance-2.0 要求
duration 与
resolution 必填;视频编辑类模型不接受
duration 和
ratio。
omni_reference_task_type 用于引导 Seedance
2.5 的全模态参考生视频任务类型,取值如下:
| 取值 | 含义 | 说明 |
|---|---|---|
| auto | 自动判定 | 默认值,由模型根据提示词与参考素材自动判定任务类型;意图不明确时推荐保持默认 |
| reference | 参考生视频 | 以参考图 / 参考视频为依据生成新视频 |
| edit | 视频编辑 | 显式指定时提交即做前置校验(见下) |
| extend | 视频延长 | 显式指定时提交即做前置校验(见下) |
仅当显式指定 edit 或
extend
时生效:不符合会立即返回参数错误、任务不会创建。auto
/ reference 不做该校验。
| 任务类型 | 校验要求 |
|---|---|
| edit |
ratio /
aspect_ratio 必须为
adaptive;duration
必须为 -1;参考视频时长 4~30 秒
|
| extend |
ratio /
aspect_ratio 必须为
adaptive
|
声明的任务类型与提示词意图不一致时,提交仍会成功、任务正常创建,但任务启动后会异步失败,错误码为
InvalidParameter.TaskTypeMismatch。此时请检查
omni_reference_task_type
与提示词描述是否吻合,或改用
auto 由模型自行判定。
计费:显式 duration 按该时长预扣;传
-1(edit / extend
等时长未知场景)时按参考视频时长预扣,任务完成后按实际产出时长多退少补。
HappyHorse 系列为阿里云百炼新一代视频模型,输出物理真实、运动流畅的视频,支持文生视频、图生视频(首帧)、参考生视频、视频编辑四种形态。调用方式与上方统一视频接口完全一致,仅模型名称与输入素材不同。
文本与素材同样可以通过 content
传入:type:text 作提示词,image_url
/
video_url
按模型形态自动归位(i2v 取第 1 张图、r2v 取全部图片、video-edit
取输入视频),无需拆成扁平字段。
| 模型 | 能力 | 输入要求 |
|---|---|---|
| happyhorse-1.1-t2v / happyhorse-1.0-t2v | 文生视频 | prompt 必填(≤2500 中文字符) |
| happyhorse-1.1-i2v / happyhorse-1.0-i2v | 图生视频(首帧) |
image_urls 有且仅有 1
张首帧图;prompt
可选;宽高比自动跟随首帧,不支持
ratio
|
| happyhorse-1.1-r2v / happyhorse-1.0-r2v | 参考生视频 |
prompt +
image_urls 1~9 张参考图;prompt 中用
[Image 1]、[Image 2]… 按顺序指代参考图中的对象
|
| happyhorse-1.0-video-edit | 视频编辑 |
prompt(编辑指令)+
video_urls 有且仅有 1
个输入视频(MP4/MOV,3~60 秒)+
image_urls 0~5 张参考图
|
| 字段 | 说明 |
|---|---|
| duration | 3-15 秒整数,默认 5。视频编辑不接受该参数:输出时长跟随输入视频(输入 ≤15 秒时与输入一致,否则自动截取前 15 秒) |
| resolution |
480p /
720p /
1080p,默认
1080p;视频编辑仅支持
720p /
1080p
|
| ratio |
仅文生视频 / 参考生视频支持:16:9(默认)/ 9:16 /
1:1 /
4:3 /
3:4 /
4:5 /
5:4 /
9:21 /
21:9
|
| watermark |
默认 false(不添加水印);设为
true 时右下角添加 “Happy Horse” 水印
|
| seed | [0, 2147483647],固定 seed 可提升结果可复现性 |
HappyHorse 按产出视频时长(秒)× 分辨率档位单价计费:创建任务时按请求时长预扣;视频编辑因输出时长未知按 15 秒上限预扣,任务完成后按实际产出时长多退少补。
# 文生视频(16:9、720p、5 秒) curl …/videos \ -H "Authorization: Bearer sk-xxxxxxxx" \ -H "Content-Type: application/json" \ -d '{ "model": "happyhorse-1.1-t2v", "prompt": "一座由硬纸板和瓶盖搭建的微型城市,在夜晚焕发出生机", "duration": 5, "resolution": "720p", "ratio": "16:9" }' # 图生视频(首帧驱动,宽高比跟随首帧) curl …/videos \ -H "Authorization: Bearer sk-xxxxxxxx" \ -H "Content-Type: application/json" \ -d '{ "model": "happyhorse-1.1-i2v", "prompt": "一只猫在草地上奔跑", "image_urls": ["https://example.com/first-frame.png"], "duration": 5, "resolution": "720p" }' # 参考生视频(prompt 中以 [Image N] 指代参考图) curl …/videos \ -H "Authorization: Bearer sk-xxxxxxxx" \ -H "Content-Type: application/json" \ -d '{ "model": "happyhorse-1.1-r2v", "prompt": "[Image 1]中身着红色旗袍的女性,轻抬玉手展开[Image 2]中的折扇", "image_urls": ["https://example.com/girl.jpg", "https://example.com/fan.jpg"], "duration": 5, "resolution": "720p", "ratio": "16:9" }' # 视频编辑(指令 + 输入视频,可选参考图) curl …/videos \ -H "Authorization: Bearer sk-xxxxxxxx" \ -H "Content-Type: application/json" \ -d '{ "model": "happyhorse-1.0-video-edit", "prompt": "让视频中的角色穿上图片中的条纹毛衣", "video_urls": ["https://example.com/input.mp4"], "image_urls": ["https://example.com/sweater.webp"], "resolution": "720p" }'
轮询与结果获取方式与其他视频模型完全相同:两条 API
均返回统一结构,成功时从
data.result_url(或
data.metadata.url)取视频地址;视频链接有效期 24 小时,请及时下载转存。
万相 3.0 是全能参考视频生成模型(All-in-One),统一支持文生视频、图生视频(首帧 / 首尾帧)、参考生视频、视频编辑与视频延长。模型名称:wan3.0-video(标准版)、wan3.0-video-prime(高速版,能力对齐标准版)。
prompt 与素材至少提供其一:文生视频只传提示词;其余形态通过
content 携带素材,平台会把每个素材部件的
role 原样映射为素材类型。
| role / 素材类型 | 能力 | 输入要求 |
|---|---|---|
| first_frame | 首帧生视频 | 最多 1 张,严格作为视频第一帧 |
| last_frame | 首尾帧生视频 | 最多 1 张,与 first_frame 配合使用 |
| reference_image | 参考生视频 | 最多 10 张;prompt 中用「图1」「图2」按顺序指代 |
| reference_video | 参考 / 视频编辑 / 视频延长 | 最多 5 段,总时长 ≤15 秒;prompt 中用「视频1」按顺序指代 |
| reference_audio | 参考音频 | 最多 5 段,总时长 ≤15 秒;prompt 中用「音频1」按顺序指代 |
素材组合规则:first_frame /
last_frame 与
reference_image /
reference_video /
reference_audio
互斥,不能在同一请求中混用;参考类素材之间可自由组合。使用扁平字段时,
image_urls
单图按首帧、多图按参考图处理。
| 字段 | 说明 |
|---|---|
| duration |
默认 5 秒;无视频输入时取值 2-30;有视频输入时「输入视频总时长 +
输出时长」≤30 秒;传 -1
进入智能时长模式,由模型根据提示词与素材推荐时长
|
| resolution |
480p /
720p /
1080p,默认
1080p
|
| ratio |
adaptive(默认)/ 21:9
/ 16:9 /
4:3 /
1:1 /
3:4 /
9:16;视频延长必须为
adaptive
|
| generate_audio |
是否输出音轨,默认 true;传
false
输出无声视频,开关声音价格相同
|
| watermark |
默认 false;传
true 添加水印
|
| seed | -1 或 [0, 2147483647];-1 表示由系统随机生成 |
计费:按产出视频时长(秒)× 分辨率档位单价计费;未指定分辨率按上游默认 1080p
档位计价。duration=-1
时按上限预扣,任务完成后按实际产出时长多退少补。
# 参考生视频(文本走 content,图片角色 reference_image) curl …/videos \ -H "Authorization: Bearer sk-xxxxxxxx" \ -H "Content-Type: application/json" \ -d '{ "model": "wan3.0-video", "duration": 5, "resolution": "480p", "ratio": "16:9", "generate_audio": true, "content": [ { "type": "text", "text": "图1中的机器人在赛博朋克街头行走" }, { "type": "image_url", "image_url": { "url": "https://example.com/robot.jpg" }, "role": "reference_image" } ] }' # 首尾帧生视频(role 为 first_frame / last_frame) curl …/videos \ -H "Authorization: Bearer sk-xxxxxxxx" \ -H "Content-Type: application/json" \ -d '{ "model": "wan3.0-video", "duration": 5, "resolution": "720p", "ratio": "adaptive", "content": [ { "type": "text", "text": "从首帧平滑过渡到尾帧" }, { "type": "image_url", "image_url": { "url": "https://example.com/first.png" }, "role": "first_frame" }, { "type": "image_url", "image_url": { "url": "https://example.com/last.png" }, "role": "last_frame" } ] }'
HTTP 200。两个创建地址(/v1/videos 与
/v1/video/generations)返回相同的统一结构
{code, message, data},任务初始为
NOT_START(或排队态):
{
"code": "success",
"message": "",
"data": {
"task_id": "task_xxxxxxxxxxxx",
"action": "generate",
"status": "NOT_START",
"fail_reason": "",
"submit_time": 1790742666,
"start_time": 0,
"finish_time": 0,
"progress": "0%",
"model": "doubao-seedance-2-0",
"metadata": { "url": null, "resolution": "480p", "duration": 4, "ratio": "16:9" },
"usage": { "total_tokens": null, "completion_tokens": null }
}
}
其中 data.task_id 用于后续轮询。
GET /v1/videos/{task_id} 与 GET
/v1/video/generations/{task_id}
返回完全相同的统一结构
{code, message, data},字段随任务推进而更新:
| 字段(data 内) | 说明 |
|---|---|
| task_id | 任务 ID |
| action | 任务动作,如 generate |
| status | 任务状态,见下方状态码表 |
| progress |
进度字符串,如 "0%" /
"50%" /
"100%"
|
| model | 视频模型名称 |
| result_url | 视频下载地址(仅 status=SUCCESS 时给出) |
| fail_reason | 失败原因(status=FAILURE 时给出) |
| submit_time / start_time / finish_time | 提交 / 开始 / 完成时间戳(秒) |
| metadata.url | 视频下载地址(未产出为 null,等同 result_url) |
| metadata.resolution | 输出分辨率,如 480p |
| metadata.duration | 输出时长(秒) |
| metadata.ratio | 画幅比,如 16:9 |
| usage.total_tokens / usage.completion_tokens | 实际 token 消耗(未产出为 null) |
生成成功响应示例:
{
"code": "success",
"message": "",
"data": {
"task_id": "task_xxxxxxxxxxxx",
"action": "generate",
"status": "SUCCESS",
"fail_reason": "",
"result_url": "https://example.com/video.mp4",
"submit_time": 1790747575,
"start_time": 1790747717,
"finish_time": 1790747882,
"progress": "100%",
"model": "doubao-seedance-2-0",
"usage": { "total_tokens": 40594, "completion_tokens": 40594 },
"metadata": { "url": "https://example.com/video.mp4", "resolution": "480p", "duration": 4, "ratio": "16:9" }
}
}
出于简洁与账号安全,统一结构不包含
user_id /
channel_id /
quota /
group /
platform
等内部字段;渠道原始返回仅保留在服务端日志中。视频链接有效期 24
小时,请及时下载转存。
| 状态 | 说明 |
|---|---|
| NOT_START / SUBMITTED / QUEUED | 已创建,排队中 |
| IN_PROGRESS | 生成中 |
| SUCCESS | 生成成功,可取 result_url |
| FAILURE | 生成失败,查看 fail_reason |
平台原生格式(/v1/video/generations)与
OpenAI 兼容格式(/v1/videos)现返回完全相同的统一结构,参见上方「状态查询响应」,不再单列。
| 状态码 | 说明 |
|---|---|
| 200 | 请求成功 |
| 400 |
参数错误或任务不存在(code 如
invalid_duration、invalid_resolution、unsupported_model、task_not_exist)
|
| 401 | 令牌无效或过期 |
| 403 | 额度不足(预扣费失败) |
| 429 | 当前分组负载饱和,请稍后再试 |
| 500 | 内部错误 |
错误响应体格式:{"code": "错误码", "message": "错误描述", "data": null}。
from openai import OpenAI
import time
client = OpenAI(
api_key="sk-xxxxxxxxxxxxxxxx",
base_url="…"
)
# 1. 创建视频任务
resp = client.post(
"/videos",
body={
"model": "doubao-seedance-2.0",
"prompt": "一只猫在草地上奔跑",
"duration": 5,
"resolution": "720p"
},
cast_to=object
)
task_id = resp["data"]["task_id"]
print(f"Task created: {task_id}")
# 2. 轮询状态直到完成
while True:
time.sleep(10)
status_resp = client.get(f"/videos/{task_id}", cast_to=object)
data = status_resp["data"]
status = data["status"]
print(f"Status: {status}")
if status == "SUCCESS":
video_url = data["result_url"]
print(f"Video URL: {video_url}")
break
elif status == "FAILURE":
print(f"Failed: {data.get('fail_reason')}")
break
# 创建任务 curl …/videos \ -H "Authorization: Bearer sk-xxxxxxxx" \ -H "Content-Type: application/json" \ -d '{ "model": "doubao-seedance-2.0", "prompt": "一只猫在草地上奔跑", "duration": 5, "resolution": "720p" }' # 轮询状态(将 {task_id} 替换为实际值) curl …/videos/{task_id} \ -H "Authorization: Bearer sk-xxxxxxxx"
import requests, time
BASE = "…"
HEADERS = {"Authorization": "Bearer sk-xxxxxxxx", "Content-Type": "application/json"}
# 1. 创建任务
resp = requests.post(f"{BASE}/video/generations", headers=HEADERS, json={
"model": "doubao-seedance-2.0",
"prompt": "一只猫在草地上奔跑",
"duration": 5,
"resolution": "720p"
}).json()
task_id = resp["data"]["task_id"]
print(f"Task created: {task_id}")
# 2. 轮询状态直到 SUCCESS
while True:
time.sleep(10)
data = requests.get(f"{BASE}/video/generations/{task_id}",
headers=HEADERS).json()["data"]
print(f"Status: {data['status']}")
if data["status"] == "SUCCESS":
print(f"Video URL: {data['result_url']}")
break
elif data["status"] == "FAILURE":
print(f"Failed: {data['fail_reason']}")
break