1. 先记住这三件事
- Seedance 不使用
/v1/responses。 该路径进入 Responses 转发链路,不会进入 Seedance 的异步视频任务适配器。 - 提交接口是
POST /v1/video/generations。 提交成功后会立即返回任务 ID,不会同步等待视频生成完成。 - 任务完成后再轮询。 使用
GET /v1/video/generations/{task_id}查询状态和结果。
/v1/videos 路径,但它仍然是视频任务接口,不是 Responses API。首次接入建议使用下面教程中的 JSON 接口。
2. 调用前准备
调用前需要先确认以下信息:- 本站访问地址:
https://teio.me; - 可用的 API Token;
- Token 所属分组是否允许访问目标模型;
- 目标模型名称,例如
doubao-seedance-2-0-260128;
3. 一次完整调用的流程
第一步:提交任务
id 和 task_id 在本站的视频提交响应中通常是同一个公开任务 ID。
第二步:轮询任务状态
建议轮询间隔为 2 至 5 秒,并设置最大等待时间。不要高频并发轮询同一个任务。
第三步:读取视频
任务成功后,优先使用响应中的result_url。是否允许代理下载以及结果 URL 的有效期,取决于上游返回策略。下游应及时下载或转存视频,不要长期依赖上游临时 URL。
4. 请求参数
4.1 顶层参数
prompt 是必填项,即使请求里有参考图片、参考视频或参考音频,也应把文字描述放在顶层 prompt 中。
4.2 metadata 中的常用字段
Seedance 上游字段通过 metadata 透传。常用字段如下:
上游对具体模型的参数范围可能更严格。例如某个模型只允许若干种时长或分辨率时,即使本站网关接受了字段,上游仍可能返回参数错误。
4.3 重要规则:文字放 prompt,媒体放 metadata.content
本站会自动把顶层 prompt 转成上游的文本内容。metadata.content 中的文字项会被网关移除,因此不要依赖下面这种写法:
5. 输入图片、视频和音频
参考媒体 URL 应能被上游服务器访问。生产环境建议使用稳定的 HTTPS 公网 URL,并确保 URL 在任务排队和执行期间不会过期。5.1 文生视频
5.2 图生视频
单图可以使用顶层image 简写:
metadata.content:
5.3 视频生视频或参考视频
参考视频必须放在metadata.content 中,并使用 type: "video_url":
video_url 的内容才会被计为“含视频输入”。 把视频 URL 塞进 prompt、普通字符串字段或未识别的自定义字段,不会触发含视频输入价格。
5.4 参考音频
metadata.content。每个内容项都应包含对应的 type 和 URL 对象:
image_url、video_url 和 audio_url。role 用于告诉上游媒体的用途,例如 reference_image、reference_video 或 reference_audio。
6. 视频计费规则
6.1 计费由四个因素共同决定
Seedance 的视频定价不是简单的“调用一次固定扣费”,主要由以下因素决定:- 实际消耗的
total_tokens:任务完成后由上游返回; - 是否有视频输入:本站从
metadata.content是否包含video_url判断; - 输出分辨率:本站优先使用上游任务结果中的实际
resolution; - 用户分组倍率:管理员可以对不同用户分组设置不同倍率。
metadata.content 中包含 video_url。所有请求最终都会生成视频,但“生成了视频”本身不等于“含视频输入”;只有图片或音频输入也不会触发含视频输入价格。
6.2 最终结算公式
本站内部使用额度(quota)记账。最终视频额度大致按下面的公式计算:
例如:
- 实际消耗
50,638Token; - 输出分辨率为
480P; - 不含参考视频;
- 单价为
46 / 百万 Token; - 分组倍率为
1。
28 / 百万 Token 计算:
total_tokens、实际输出分辨率和管理员配置可能不同。
6.3 预扣费和最终结算
视频是异步任务。为了防止用户提交任务后余额被其他请求消耗,本站会在提交时先预留一部分额度,再在任务完成后按实际用量结算差额。 预扣估算通常使用:50,000,预扣额度约为:
- 实际 Token 少于预估值时,差额会在结算时退回;
- 实际 Token 多于预估值时,结算时会补扣差额;
- 任务失败时,本站按异步任务退款流程处理已预留额度;
- 上游没有返回有效 Token 时,系统无法进行精确 Token 重算,可能保留预扣结果,具体以消费日志为准。
duration 和 resolution,这样预扣估算会更接近真实任务。
6.5 哪些数据是最终计费依据
提交时的请求字段用于预扣估算,任务完成时的上游结果用于最终结算:
如果请求写的是
720P,但上游最终返回 1080P,最终结算会优先使用上游返回的实际分辨率。
7. 完整调用示例
示例一:无参考视频的文生视频
video_url,因此不会触发含视频输入价格。
示例二:包含参考视频和参考图片
metadata.content 中包含 type: "video_url",本站会将本次任务识别为“含视频输入”。在当前默认配置下,1080P 的含视频输入单价是 31 / 百万 Token。
示例三:轮询脚本
下面示例使用jq 读取任务 ID 和状态:
8. 常见问题
Q1:为什么不能直接调用 /v1/responses?
/v1/responses 会进入对话 Responses 处理流程,而 Seedance 需要提交异步视频任务、保存任务状态、轮询上游和结算视频 Token。两者的请求体、上游 URL、响应结构和计费生命周期都不同。
Q2:把视频 URL 放到 image 里可以享受含视频输入价格吗?
不可以。image 和 images 会被识别为图片输入。要触发含视频输入判断,应在 metadata.content 中使用 type: "video_url"。
Q3:只填写 metadata.resolution,不填写 duration 可以吗?
可以,但不建议。缺少时长时,预扣估算默认按 5 秒处理;上游实际任务可能有自己的默认时长或直接拒绝请求。为了让预扣更准确,建议显式填写 duration。
Q4:请求中写了 720P,为什么最后价格不是 720P 的价格?
最终结算以任务完成后上游返回的实际 resolution 为准。如果上游返回了其他分辨率,或者没有返回可识别的分辨率,系统会按实际可匹配的价格回退规则处理。
Q5:为什么提交成功后余额马上减少?
这是异步任务的预扣。任务完成后系统会读取上游usage.total_tokens,再进行差额结算;任务失败则按失败退款流程处理。提交时看到的扣减不一定是最终费用。
Q6:返回“余额不足”,但我估计的最终费用并不高?
预扣需要先覆盖一笔基于时长、分辨率和视频输入的估算额度。请检查:- 是否填写了过大的
duration; - 是否选择了更高价格的输出分辨率;
- 是否包含了参考视频;
- 当前用户分组是否有额外倍率;
- 账户或 Token 额度是否足够支付预扣。
Q7:任务一直处于 QUEUED 或 IN_PROGRESS 怎么办?
先确认轮询 URL 使用的是本站返回的公开 task_id,再按 2 至 5 秒间隔轮询。长时间没有变化时,查看本站任务日志和上游渠道状态,不要通过重复提交来“重试”同一个任务,以免产生多个任务和多笔预扣。
10. 接入检查清单
上线前建议逐项确认:- 使用
/v1/video/generations,没有把 Seedance 请求发到/v1/responses; -
model和prompt位于顶层; - 参考图片、视频、音频位于
metadata.content; - 参考视频项使用
type: "video_url"; - 已显式填写
duration和metadata.resolution; - 轮询使用提交响应中的公开
task_id; - 只在
SUCCESS状态读取result_url; - 已处理
FAILURE、超时、余额不足和上游参数错误; - 已记录任务 ID,便于查询消费日志和排查计费差异;
- 生产环境使用稳定、可被上游访问的媒体 URL。