字节跳动 Seedance 2.0 视频生成模型(含虚拟人 / 真人形象素材接口),通过 SalpX 统一 base_url 调用。固定时长按次计费、自动失败退款、OpenAI SDK 兼容。
Seedance 系列通过 SalpX 统一 base_url 调用,全部走视频接口 POST /v1/videos。大部分型号按秒计费(提交时必须传顶层整数字段 duration),特价 / 补贴版中的固定时长型号按次计费。
/v1/chat/completions 调用 seedance——对话接口不走视频链路,会直接返回 404。https://www.salpx.com/v1Authorization: Bearer <SalpX Token>POST /v1/videosGET /v1/videos/{task_id}GET /v1/videos/{task_id}/contenttask_id,需轮询查询状态下列为当前在售型号,价格单位为人民币。最终以模型广场实时价格为准。
duration,单位秒)| 模型 | 价格 | 最长时长 |
|---|---|---|
seedance-2 | ¥1.00 / 秒 | 15 秒 |
seedance-2-fast | ¥0.60 / 秒 | 15 秒 |
seedance-2-mini | ¥0.50 / 秒 | 15 秒 |
seedance-2-mini-720p | ¥0.50 / 秒 | 15 秒 |
seedance-2-mini-480p | ¥0.30 / 秒 | 15 秒 |
seedance-2-5 | ¥2.00 / 秒 | 30 秒 |
seedance-1-5-pro | ¥0.20 / 秒 | 15 秒 |
| 模型 | 计费方式 | 价格 | 时长 |
|---|---|---|---|
seedance-2-mini-特价版 | 按秒(传 seconds) | ¥0.20 / 秒 | 10 或 15 秒 |
seedance-2-fast-特价版 | 按次 | ¥2.10 / 次 | 固定 10 秒 |
seedance-2-5-补贴版 | 按次 | ¥30.00 / 次 | 固定 30 秒 |
特价 / 补贴版的完整用法(参考图、multipart 直传、轮询、取片)见 特价版文档 与 补贴版文档。
duration 都按固定价扣一次;按秒计费的型号缺少 duration 会直接返回 400,扣费 = 单价 × 秒数。curl https://www.salpx.com/v1/videos \ -H "Authorization: Bearer $KEY" \ -H "Content-Type: application/json" \ -d '{ "model": "seedance-2-fast", "duration": 10, "prompt": "一只蓝色果冻水母在霓虹海中游动,电影感", "aspect_ratio": "16:9" }'
返回:
{
"task_id": "task_BbdMw8n5VowzJLgQbZA1MRNB2qoDYCJS",
"object": "video",
"model": "seedance-2-fast",
"status": "",
"progress": 0,
"created_at": 1781705051
}curl https://www.salpx.com/v1/videos \ -H "Authorization: Bearer $KEY" \ -H "Content-Type: application/json" \ -d '{ "model": "seedance-2", "duration": 15, "prompt": "镜头从首帧平滑过渡到尾帧,光影摇曳", "metadata": { "content": [ {"type":"image_url","image_url":{"url":"https://your-cdn.com/first.jpg"},"role":"first_frame"}, {"type":"image_url","image_url":{"url":"https://your-cdn.com/last.jpg"},"role":"last_frame"} ] } }'
媒体一律放 metadata.content,每项带 role。图生视频 role:first_frame(首帧)/ last_frame(尾帧)。只做首帧图生视频则单张 first_frame 即可。文本必须放顶层 prompt,不要写进 content。
模型 seedance-1-5-pro:时长 duration 可指定 4–12 秒(按秒计费),分辨率 480p/720p/1080p@24fps,可加 "audio": true 生成原生音频(含 8 语种口型)。首尾帧结构与上面完全一致——放 metadata.content,用 first_frame / last_frame 标 role(不是 image_with_roles)。
curl https://www.salpx.com/v1/videos \ -H "Authorization: Bearer $KEY" \ -H "Content-Type: application/json" \ -d '{ "model": "seedance-1-5-pro", "prompt": "画面从白天渐变到夜晚,城市灯光逐盏亮起,电影感运镜", "duration": 8, "resolution": "1080p", "aspect_ratio": "9:16", "audio": true, "metadata": { "content": [ {"type":"image_url","image_url":{"url":"https://your-cdn.com/day.jpg"},"role":"first_frame"}, {"type":"image_url","image_url":{"url":"https://your-cdn.com/night.jpg"},"role":"last_frame"} ] } }'
只做首帧则单张 first_frame;duration 越大费用越高(按秒)。任务查询、报错处理与 Seedance 2.0 一致,见 3.5 / 3.7。
Seedance 2.0 可同时参考图片、视频、音频。全部放 metadata.content,role 用 reference_image / reference_video / reference_audio;提示词里用「图片1」「视频1」「音频1」引用(序号=同类素材出现顺序,从 1 起)。
curl https://www.salpx.com/v1/videos \ -H "Authorization: Bearer $KEY" \ -H "Content-Type: application/json" \ -d '{ "model": "seedance-2", "duration": 15, "prompt": "首帧用图片1,全程用视频1的运镜、音频1作背景乐……", "metadata": { "content": [ {"type":"image_url","image_url":{"url":"https://.../pic1.jpg"},"role":"reference_image"}, {"type":"video_url","video_url":{"url":"https://.../v1.mp4"},"role":"reference_video"}, {"type":"audio_url","audio_url":{"url":"https://.../a1.mp3"},"role":"reference_audio"} ], "generate_audio": true } }'
asset://<ASSET_ID>。素材由上游(火山方舟)下载并校验,不合规会返回 400 · InvalidParameter(原样透传)。常见硬性要求:
| 类型 | 要求 |
|---|---|
| 图片 最小边 | 宽、高均 ≥ 300px(实测:1073×152 因高度 152px<300 被拒 expected the height to be at least 300px) |
| 图片 宽高比 | 不要极端横幅/长条(如 7:1);建议贴近目标视频比例 16:9 / 9:16 / 1:1,可减少画面跳变 |
| 图片 格式 | 常见 JPEG / PNG / WEBP |
| URL | 需公网可直接下载(或用火山素材 asset://<ASSET_ID>);私有/需登录/防盗链的 URL 会下载失败 |
| 视频 / 音频 | 视频 ≤3 个、音频 ≤3 个;单个/总时长与格式限制以火山为准 |
curl https://www.salpx.com/v1/videos/<task_id> \ -H "Authorization: Bearer $KEY" # 完成时返回示例: { "task_id": "task_...", "status": "SUCCESS", "results": [ {"url": "https://video.example.com/20260921/abc.mp4"} ] }
约定:文本放顶层 prompt;媒体与火山参数放 metadata。
| 参数 | 位置 | 必填 | 说明 |
|---|---|---|---|
model | 顶层 | 是 | 模型名(决定时长 / 分辨率 / 是否 fast) |
prompt | 顶层 | 是 | 文本描述(中英文均可)。素材用「图片1/视频1/音频1」引用 |
metadata.content | metadata | 否 | 媒体数组:每项 {"type":"image_url|video_url|audio_url","<type>":{"url":"..."},"role":"..."}。role 见 3.2 / 3.3 |
metadata.ratio | metadata | 否 | 21:9 / 16:9 / 4:3 / 1:1 / 3:4 / 9:16 / adaptive |
metadata.generate_audio | metadata | 否 | 是否同步生成音轨(有声视频) |
metadata.watermark / metadata.seed | metadata | 否 | 水印 / 随机种子 |
callback_url | 顶层 | 否 | 异步完成回调(webhook) |
duration / resolution:由模型名锁定(如 -fast-480p-10s = 10 秒 + 480p)。传了会被服务端忽略。多模态组合非法时,SalpX 在转发火山前直接返回清晰中英 400,不会暴露火山原始报错:
| 命中情况 | code | 报错信息 |
|---|---|---|
| 参考图 > 9 | too_many_reference_images | 参考图最多 9 张 / at most 9 reference images |
| 参考视频 > 3 | too_many_reference_videos | 参考视频最多 3 个 / at most 3 reference videos |
| 参考音频 > 3 | too_many_reference_audios | 参考音频最多 3 个 / at most 3 reference audios |
| 纯音频 / 仅文本+音频 | invalid_audio_only_input | 音频须搭配至少一张参考图或一个参考视频 / audio must be accompanied by an image or video |
| HTTP | 含义 | 是否扣费 |
|---|---|---|
| 400 | 请求参数错误(模型名不存在、缺必填) | 不扣 |
| 401 | Token 无效 | 不扣 |
| 403 | 额度不足 | 不扣 |
| 500 | 上游连接层失败 | 已扣→自动退款 |
| 502 | 上游返回错误 / 异步任务 FAILED | 已扣→自动退款 |
| 504 | 异步任务超时(>20 分钟) | 已扣→自动退款 |
-10s / -15s 两个固定时长?SalpX 主线计费体系是"按次",TA 是"按秒"。为了避免按秒计费的额度复杂度,我们把每个模型拆分成 10 秒 / 15 秒两个 SKU,每次按 SKU 价格扣费。
-480p-* 比 -720p-* 便宜一半?TA 上游成本 480p ≈ 720p 的 50%。SalpX 价格沿用 "上游成本 × 1.2" 公式,所以 480p 卖价也大致是 720p 的一半。
seedance-2 不带后缀)?不能。SalpX 后台只识别带时长 / 分辨率后缀的 SKU,裸模型名会返回 404 model_not_found。
三种方式任选其一:
GET /v1/videos/{task_id} 看 statuscallback_url,任务完成 TA 自动 POST 通知TA 默认保留 7 天。强烈建议拿到 URL 后立刻下载入自己的 OSS,不要长期引用 TA URL。
# pip install openai requests import requests, time API = "https://www.salpx.com/v1" KEY = "sk-..." H = {"Authorization": f"Bearer {KEY}", "Content-Type": "application/json"} # 1. 提交任务 r = requests.post(f"{API}/videos", headers=H, json={ "model": "seedance-2-fast", "duration": 10, "prompt": "霓虹城市夜景", "aspect_ratio": "9:16", }) tid = r.json()["task_id"] print("submitted:", tid) # 2. 轮询 for _ in range(120): # 最多 10 分钟 time.sleep(5) s = requests.get(f"{API}/videos/{tid}", headers=H).json() if s.get("status") == "SUCCESS": print("video:", s["results"][0]["url"]) break if s.get("status") == "FAILED": raise RuntimeError(s)
批量定价 / 企业额度 / 私有部署 → 联系 SalpX 商务(控制台 → 个人设置 → 联系我们)。