Seedance 2.0 程序接入文档
Seedance 2.0 程序接入文档
这篇文档给客户工程师、Codex、Claude Code 使用。目标是在现有程序里接入平台 Seedance 2.0 视频生成能力,完成“创建任务 -> 保存 task_id -> 轮询状态 -> 下载视频内容 -> 保存业务结果”的闭环。
接入结论
- 平台地址 / 工具 URL:
https://www.yuzhixiaolongxia.com - 代码调用 Base URL:
https://www.yuzhixiaolongxia.com/v1 - 创建任务:
POST /video/generations - 查询任务:
GET /video/generations/{task_id} - 下载视频:
GET /videos/{task_id}/content - 素材上传:
POST /v1/api/assets - 认证方式:
Authorization: Bearer <你的 API 令牌> - 接口类型:异步任务接口
- 公开模型 ID:
seedance-2.0-vision、seedance-2.0、seedance-2.0-vision-1080、seedance-2.0-1080、seedance-2.0-fast-vision、seedance-2.0-fast
接入前必须确认的三项
把这三项作为配置项暴露给业务,不要写死在代码深处:
| 配置项 | 推荐环境变量 | 说明 |
|---|---|---|
| Base URL | YZX_API_BASE_URL | 服务端代码填 https://www.yuzhixiaolongxia.com/v1;部分图形化工具填 https://www.yuzhixiaolongxia.com |
| API Key | YZX_API_KEY | 控制台创建的 API 令牌,只能放服务端 Secret |
| 模型名称 | SEEDANCE_MODEL | 从模型广场复制,例如 seedance-2.0-vision |
环境变量
建议新增:
YZX_API_BASE_URL=https://www.yuzhixiaolongxia.com/v1
YZX_API_KEY=替换成你的平台 API 令牌
SEEDANCE_MODEL=seedance-2.0-fast安全要求:
YZX_API_KEY只能放在服务端环境变量、部署平台 Secret 或密钥管理系统里。- 不要把 API Key 写进前端代码、移动端包、Git 仓库、日志、异常消息或埋点。
- 前端、移动端、小程序不要直接请求平台 API,统一由业务后端代调。
- 建议为 Seedance 视频单独创建令牌,并确认令牌分组支持要调用的 Seedance 模型。
人物素材规则
如果你的业务要生成人物类视频,优先使用已授权的虚拟角色、商品模特图或品牌自有人物素材。程序必须把本地素材先上传到本站素材接口,再把返回的 asset_uri 用在生成任务里:
- 本地路径、内网地址、需要登录的链接、临时图床链接不能直接进入生成请求。
- 如果客户上传了人物素材,业务侧应记录授权来源,并在前端明确提示不要上传未授权真人肖像。
- 已授权素材先调用素材上传接口,拿到
asset_uri后填进metadata.reference_images。 - 如果创建任务返回素材未就绪或素材注册失败,等待 2 到 5 秒后用同一个
asset_uri重试;不要改成直接传图片 URL。 - 如果你手里有已授权的自有角色素材,可以按合规要求接入;不要把可识别真人肖像当普通参考图直接上传。
模型选择与价格
价格以模型广场当前展示为准。文档里的元/秒和 15 秒估价用于预算预估;实际扣费按任务真实 tokens 计算。
| 需求 | API 模型 ID | 参考视频输入 | 输出分辨率 | 代理价格 | 零售价格 | 15 秒典型估价(代理 / 零售) |
|---|---|---|---|---|---|---|
| 有参考视频,正式质量 | seedance-2.0-vision | 支持 | 480P / 720P | ¥31.29 / 1M tokens 480P 0.52 元/秒 720P 1.13 元/秒 | ¥38.00 / 1M tokens 480P 0.64 元/秒 720P 1.37 元/秒 | 480P ¥7.87 / ¥9.56 720P ¥16.92 / ¥20.55 |
| 无参考视频,正式质量 | seedance-2.0 | 不支持 | 480P / 720P | ¥51.41 / 1M tokens 480P 0.52 元/秒 720P 1.12 元/秒 | ¥62.43 / 1M tokens 480P 0.63 元/秒 720P 1.36 元/秒 | 480P ¥7.83 / ¥9.50 720P ¥16.83 / ¥20.44 |
| 有参考视频,快速试稿 | seedance-2.0-fast-vision | 支持 | 480P / 720P | ¥24.59 / 1M tokens 480P 0.43 元/秒 720P 0.94 元/秒 | ¥29.86 / 1M tokens 480P 0.53 元/秒 720P 1.14 元/秒 | 480P ¥6.52 / ¥7.92 720P ¥14.03 / ¥17.03 |
| 无参考视频,快速试稿 | seedance-2.0-fast | 不支持 | 480P / 720P | ¥41.35 / 1M tokens 480P 0.42 元/秒 720P 0.90 元/秒 | ¥50.21 / 1M tokens 480P 0.51 元/秒 720P 1.10 元/秒 | 480P ¥6.29 / ¥7.64 720P ¥13.54 / ¥16.44 |
| 有参考视频,1080P 高清 | seedance-2.0-vision-1080 | 支持 | 1080P | ¥34.65 / 1M tokens 1080P 2.96 元/秒 | ¥42.07 / 1M tokens 1080P 3.60 元/秒 | 1080P ¥44.47 / ¥53.99 |
| 无参考视频,1080P 高清 | seedance-2.0-1080 | 不支持 | 1080P | ¥57.00 / 1M tokens 1080P 2.80 元/秒 | ¥69.21 / 1M tokens 1080P 3.40 元/秒 | 1080P ¥41.99 / ¥50.98 |
实测 token 消耗参考:
| 模型 ID | 480P | 720P | 1080P |
|---|---|---|---|
seedance-2.0 | 约 10,148 tokens/秒 | 约 21,825 tokens/秒 | - |
seedance-2.0-vision | 约 16,768 tokens/秒 | 约 36,060 tokens/秒 | - |
seedance-2.0-fast | 约 10,148 tokens/秒 | 约 21,825 tokens/秒 | - |
seedance-2.0-fast-vision | 约 17,682 tokens/秒 | 约 38,025 tokens/秒 | - |
seedance-2.0-1080 | - | - | 约 49,106 tokens/秒 |
seedance-2.0-vision-1080 | - | - | 约 85,556 tokens/秒 |
补充规则:
reference_images适用于全部 6 个模型。reference_videos只在需要视频参考时传;一旦传了,就必须使用带vision的模型。- 平台支持 3 个
vision模型在没有reference_videos、只有图片和提示词时直接提交。 fast模型不支持 1080p。- 如果只有图片,请先上传图片素材,再把返回的
asset_uri放入reference_images。 - 如果只想用图片做人物或角色视频,建议优先使用已授权素材,上传后再把
asset_uri放入reference_images。
程序里可以使用下面的选择函数:
type SeedanceModel =
| 'seedance-2.0-vision'
| 'seedance-2.0'
| 'seedance-2.0-vision-1080'
| 'seedance-2.0-1080'
| 'seedance-2.0-fast-vision'
| 'seedance-2.0-fast';
type SeedanceModelOptions = {
hasReferenceVideo?: boolean;
resolution?: 'standard' | '1080p';
fast?: boolean;
};
function chooseSeedanceModel(options: SeedanceModelOptions = {}): SeedanceModel {
const { hasReferenceVideo = false, resolution = 'standard', fast = false } = options;
if (fast && resolution === '1080p') {
throw new Error('fast models do not support 1080p; choose fast=false or resolution="standard"');
}
if (fast) {
return hasReferenceVideo ? 'seedance-2.0-fast-vision' : 'seedance-2.0-fast';
}
if (resolution === '1080p') {
return hasReferenceVideo ? 'seedance-2.0-vision-1080' : 'seedance-2.0-1080';
}
return hasReferenceVideo ? 'seedance-2.0-vision' : 'seedance-2.0';
}图片接入最小流程
- 服务端接收用户提示词和图片。
- 调用素材上传接口上传图片,获得
asset_uri。 - 创建 Seedance 任务,传入
prompt和metadata.reference_images。 - 保存
task_id。 - 后台轮询任务状态。
- 完成后下载视频并保存到业务存储。
客户只上传图片和提示词即可。默认可走非 vision 模型;如果业务上明确想用 vision 模型,当前也可以只传图片。不要让客户准备本地参考视频或处理视频格式。
接口契约
创建任务
POST https://www.yuzhixiaolongxia.com/v1/video/generations
Authorization: Bearer <YZX_API_KEY>
Content-Type: application/json平台公开的 seedance-2.0-1080、seedance-2.0-vision-1080 是面向客户的模型别名;程序接入时只使用本文档和模型广场展示的公开 ID,不要使用其他模型名。
请求体:
{
"model": "seedance-2.0-vision",
"prompt": "Use image 1 as the character and scene reference. Create a 4-second cinematic shot with a slow camera push-in, natural motion, realistic lighting, and stable facial details.",
"metadata": {
"reference_images": ["asset://dbsd_asset_xxx"],
"generate_audio": false,
"ratio": "16:9",
"duration": 4,
"resolution": "480p",
"watermark": false
}
}字段说明:
| 字段 | 类型 | 必填 | 说明 |
|---|---|---|---|
model | string | 是 | 六个公开模型 ID 之一 |
prompt | string | 是 | 视频描述 |
metadata | object | 是 | 视频参数对象 |
metadata 字段:
| 字段 | 类型 | 说明 |
|---|---|---|
reference_images | string[] | 参考图 asset_uri 列表,1 到 9 张;生成前先上传素材接口。 |
reference_videos | string[] | 参考视频 asset_uri 列表;需要视频参考时建议使用带 vision 的模型,生成前先上传素材接口。 |
reference_audios | string[] | 参考音频 asset_uri 列表;生成前先上传素材接口。 |
generate_audio | boolean | 是否生成同步音频。 |
ratio | string | 16:9、4:3、1:1、3:4、9:16、21:9、adaptive。 |
duration | number | 必须是 4 到 15 秒;不传默认 5 秒。3 秒不支持,程序要本地拦截。 |
resolution | string | 480p、720p、1080p。不传默认 720p;生成 480P 必须传 "480p";只有 1080P 模型可传 "1080p"。 |
seed | integer | 可选随机种子,范围 -1 到 4294967295。 |
watermark | boolean | 是否加水印。 |
素材约束:
- 图片:1 到 9 张,jpeg、png、webp、bmp、tiff、gif;宽高比 0.4 到 2.5;宽和高都在 300 到 6000 px。
- 参考视频:480p 或 720p;单个 2 到 15 秒,最多 3 个,总时长不超过 15 秒;宽高比 0.4 到 2.5,宽和高都在 300 到 6000 px。
- 参考音频:wav、mp3;单个 2 到 15 秒,最多 3 段,总时长不超过 15 秒;单个不超过 15 MB。
上传本地素材
如果图片、视频、音频在本地电脑或业务服务器上,先上传到本站素材接口,再把返回的 asset_uri 写入 metadata.reference_images、metadata.reference_videos 或 metadata.reference_audios。
curl -X POST "https://www.yuzhixiaolongxia.com/v1/api/assets" \
-H "Authorization: Bearer $YZX_API_KEY" \
-F "asset_type=image" \
-F "file=@./product.png"响应示例:
{
"asset_id": "dbsd_asset_xxx",
"asset_uri": "asset://dbsd_asset_xxx",
"url": "https://www.yuzhixiaolongxia.com/v1/api/assets/dbsd_asset_xxx/content?token=...",
"expires_at": 1714007200,
"file_name": "product.png",
"asset_type": "image",
"mime_type": "image/png",
"size": 123456
}素材接口适合临时生产素材。平台会在任务结束或素材过期后自动清理临时素材。
上传接口返回后,生成请求应使用 asset_uri,不要使用响应里的临时下载 URL。若立即创建任务时返回素材未就绪,等待几秒后用同一个 asset_uri 重试。
上传限制
- 单文件 100 MB;同一账户当前可用素材总量 300 MB;同一令牌 200 MB
- 上传后 2 小时内未绑定任务自动过期;已绑定的素材在任务结束 24 小时后清理
- 允许 MIME:
- 图片:
image/jpeg、image/png、image/webp、image/bmp、image/tiff、image/gif - 视频:
video/mp4、video/quicktime、video/webm - 音频:
audio/mpeg、audio/mp3、audio/wav、audio/wave、audio/x-wav
- 图片:
- 程序里要做参数校验:超过限制时平台会返回 4xx,错误消息里说明被拒原因,建议把错误体一起记录后再决定是否重试或提示用户换文件。
查询任务
GET https://www.yuzhixiaolongxia.com/v1/video/generations/{task_id}
Authorization: Bearer <YZX_API_KEY>状态机:
| 状态 | 本地状态 | 程序动作 |
|---|---|---|
queued / pending | 排队中 | 保存状态,稍后继续轮询 |
in_progress / processing | 生成中 | 保存状态,稍后继续轮询 |
completed / success | 已完成 | 保存完整响应,优先读取结果 URL,再下载或入库 |
unknown | 状态不确定 | 有结果 URL 就按完成处理;没有结果 URL 就继续轮询 |
failed / cancelled | 失败 | 保存错误信息,允许用户修改后重试 |
状态归一化时先把状态转成小写再判断;如果响应是信封结构,优先读取 data.status,其次读取顶层 status。如果返回大写 SUCCESS,按 success 处理;如果返回大写 FAILED,按 failed 处理。失败原因优先读取 data.fail_reason、fail_reason、error.message、message。
下载视频内容
GET https://www.yuzhixiaolongxia.com/v1/videos/{task_id}/content
Authorization: Bearer <YZX_API_KEY>结果 URL 可能出现在多个字段里,程序不要只认一个字段。推荐优先级:
data.result_urldata.data.content.video_urlresult_urlcontent.video_urlurlvideo_urloutput_urldownload_urlmetadata.url
如果查询响应里已经有可下载 URL,优先直接下载;没有结果 URL 时,再调用 GET /videos/{task_id}/content 兜底。
TypeScript 客户端封装
type SeedanceStatus =
| 'queued'
| 'pending'
| 'in_progress'
| 'processing'
| 'completed'
| 'success'
| 'unknown'
| 'failed'
| 'cancelled';
type SeedanceMetadata = {
reference_images?: string[];
reference_videos?: string[];
reference_audios?: string[];
generate_audio?: boolean;
ratio?: '16:9' | '4:3' | '1:1' | '3:4' | '9:16' | '21:9' | 'adaptive';
duration?: number;
resolution?: '480p' | '720p' | '1080p';
seed?: number;
watermark?: boolean;
};
type SeedanceTask = {
id?: string;
task_id?: string;
status?: SeedanceStatus;
error?: { message?: string; code?: string } | string;
data?: {
result_url?: string;
data?: {
content?: {
video_url?: string;
};
};
};
result_url?: string;
url?: string;
video_url?: string;
output_url?: string;
download_url?: string;
metadata?: { url?: string; [key: string]: unknown };
content?: { video_url?: string; [key: string]: unknown };
[key: string]: unknown;
};
const API_BASE_URL = process.env.YZX_API_BASE_URL ?? 'https://www.yuzhixiaolongxia.com/v1';
const API_KEY = process.env.YZX_API_KEY;
if (!API_KEY) {
throw new Error('Missing YZX_API_KEY');
}
function validateSeedanceRequest(input: {
model: SeedanceModel;
metadata: SeedanceMetadata;
}) {
if (input.metadata.duration !== undefined && (input.metadata.duration < 4 || input.metadata.duration > 15)) {
throw new Error('Seedance duration must be 4-15 seconds; 3s is not supported');
}
const hasReferenceVideo = Boolean(input.metadata.reference_videos?.length);
if (hasReferenceVideo && !input.model.includes('vision')) {
throw new Error('reference_videos requires a vision model');
}
if (input.model.includes('fast') && input.metadata.resolution === '1080p') {
throw new Error('fast models do not support 1080p');
}
if (input.model.includes('1080') && input.metadata.resolution !== '1080p') {
throw new Error('1080p models should set metadata.resolution to "1080p"');
}
}
function getSeedanceResultUrl(task: SeedanceTask): string | null {
return (
task.data?.result_url ||
task.data?.data?.content?.video_url ||
task.result_url ||
task.content?.video_url ||
task.url ||
task.video_url ||
task.output_url ||
task.download_url ||
task.metadata?.url ||
null
);
}Python 客户端封装
import os
import time
from typing import Any, Dict
import requests
API_BASE_URL = os.getenv("YZX_API_BASE_URL", "https://www.yuzhixiaolongxia.com/v1")
API_KEY = os.getenv("YZX_API_KEY")
if not API_KEY:
raise RuntimeError("Missing YZX_API_KEY")
def validate_seedance_request(model: str, metadata: Dict[str, Any]) -> None:
duration = metadata.get("duration")
if duration is not None and not (4 <= int(duration) <= 15):
raise RuntimeError("Seedance duration must be 4-15 seconds; 3s is not supported")
has_reference_video = bool(metadata.get("reference_videos"))
if has_reference_video and "vision" not in model:
raise RuntimeError("reference_videos requires a vision model")
if "fast" in model and metadata.get("resolution") == "1080p":
raise RuntimeError("fast models do not support 1080p")
if "1080" in model and metadata.get("resolution") != "1080p":
raise RuntimeError('1080p models should set metadata.resolution to "1080p"')
def get_seedance_result_url(task: Dict[str, Any]) -> str | None:
data = task.get("data") if isinstance(task.get("data"), dict) else {}
nested_data = data.get("data") if isinstance(data.get("data"), dict) else {}
nested_content = nested_data.get("content") if isinstance(nested_data.get("content"), dict) else {}
metadata = task.get("metadata") if isinstance(task.get("metadata"), dict) else {}
content = task.get("content") if isinstance(task.get("content"), dict) else {}
return (
data.get("result_url")
or nested_content.get("video_url")
or task.get("result_url")
or content.get("video_url")
or task.get("url")
or task.get("video_url")
or task.get("output_url")
or task.get("download_url")
or metadata.get("url")
)推荐的服务端流程
| 步骤 | 说明 |
|---|---|
| 1. 创建本地任务 | 你的系统先创建本地 video_job,状态为 queued。 |
| 2. 上传图片素材 | 如果客户上传了图片,先调用素材接口并保存 asset_uri。 |
| 3. 调平台创建任务 | 服务端调用 POST /video/generations。 |
| 4. 保存平台任务 ID | 保存 response.id 或 response.task_id。 |
| 5. 后台轮询 | Worker 每 10 秒查询一次,最多 30 次。 |
| 6. 下载视频内容 | 状态为 completed 后优先读取结果 URL;没有 URL 时请求 /videos/{task_id}/content。 |
| 7. 保存业务结果 | 保存完整 JSON、视频文件地址、完成时间。 |
给 Codex / Claude Code 的接入提示词
把下面整段交给 Codex 或 Claude Code,它应该能在当前项目里自动开始接入。
请在当前项目中接入平台的 Seedance 2.0 视频生成异步任务接口。
目标:
- 用户提交 prompt 和可选图片/视频/音频参考素材后,服务端创建视频生成任务。
- 服务端保存平台返回的 task_id,并提供本地任务查询能力。
- 后台轮询平台任务状态,状态为 completed/success 后下载视频内容并保存到业务存储。
- 前端不得持有或直接使用平台 API Key。
接口:
- API Base URL: https://www.yuzhixiaolongxia.com/v1
- API Key 环境变量: YZX_API_KEY
- 创建任务: POST /video/generations
- 查询任务: GET /video/generations/{task_id}
- 下载内容: GET /videos/{task_id}/content
- 素材上传: POST /v1/api/assets
- Header: Authorization: Bearer <YZX_API_KEY>
- Header: Content-Type: application/json
必须支持的模型与当前展示价格:
- seedance-2.0-vision:有参考视频正式版;480P 代理/零售 0.52/0.64 元/秒,720P 代理/零售 1.13/1.37 元/秒。
- seedance-2.0:无参考视频正式版;480P 代理/零售 0.52/0.63 元/秒,720P 代理/零售 1.12/1.36 元/秒。
- seedance-2.0-fast-vision:有参考视频快速版;480P 代理/零售 0.43/0.53 元/秒,720P 代理/零售 0.94/1.14 元/秒。
- seedance-2.0-fast:无参考视频快速版;480P 代理/零售 0.42/0.51 元/秒,720P 代理/零售 0.90/1.10 元/秒。
- seedance-2.0-vision-1080:有参考视频 1080P;代理/零售 2.96/3.60 元/秒。
- seedance-2.0-1080:无参考视频 1080P;代理/零售 2.80/3.40 元/秒。
模型选择规则:
- 无参考视频:seedance-2.0
- 无参考视频且 1080p:seedance-2.0-1080,并设置 metadata.resolution = "1080p"
- 无参考视频且快速试稿:seedance-2.0-fast
- 有参考视频:seedance-2.0-vision
- 有参考视频且 1080p:seedance-2.0-vision-1080,并设置 metadata.resolution = "1080p"
- 有参考视频且快速试稿:seedance-2.0-fast-vision
- fast 模型不支持 1080p;当 fast=true 且 resolution=1080p 时必须报错,不要静默降级。
- reference_images 适用于全部模型。
- reference_videos 仅在需要视频参考时传;一旦传了,就必须使用 vision 型号。
- 平台支持 3 个 vision 模型在没有 reference_videos、只有图片和提示词时直接提交。
- 如果客户只上传图片,请把图片上传到素材接口,然后把返回的 asset_uri 放入 metadata.reference_images。
- duration 必须是 4 到 15 秒;如果用户要求 3 秒,直接提示不支持并改为 4 秒后再提交。
- 生成 480P 必须设置 metadata.resolution = "480p";不传 resolution 会按默认 720P 处理。
请求体格式:
{
"model": "seedance-2.0-fast",
"prompt": "<用户提示词>",
"metadata": {
"reference_images": ["<可选图片 asset_uri>"],
"reference_videos": ["<仅 vision 模型可选视频 asset_uri>"],
"reference_audios": ["<可选音频 asset_uri>"],
"generate_audio": false,
"ratio": "16:9",
"duration": 5,
"resolution": "480p",
"watermark": false
}
}
实现要求:
1. 先扫描项目结构,找到已有配置系统、HTTP Client、任务表、队列/定时任务、后端路由和测试框架。
2. API Key 只从服务端环境变量或 Secret 读取,不写入前端、不写入日志、不提交到仓库。
3. 新增 Seedance client/service,至少包含 createTask、getTask、downloadContent 三个方法。
4. 创建任务成功后优先读取 response.id;没有 id 时读取 response.task_id;两者都没有要报错。
5. 状态兼容 queued/pending、in_progress/processing、completed/success、unknown、failed/cancelled;unknown 有结果 URL 时按完成处理,没有结果 URL 时继续轮询。
6. 轮询间隔 10 秒,最多 30 次;不要在用户 HTTP 请求里阻塞等待 5 分钟,优先用后台任务。
7. 完成后保存完整查询响应;优先从 data.result_url、data.data.content.video_url、result_url、content.video_url、url、video_url、output_url、download_url、metadata.url 取视频地址,没有结果地址时再调用 GET /videos/{task_id}/content。
8. 有 reference_videos 时必须使用带 vision 的模型;非 vision 模型不要发送 reference_videos。
9. 1080p 模型要设置 metadata.resolution = "1080p";fast 模型不允许设置 metadata.resolution = "1080p"。
10. 图片素材接入时,统一走素材上传接口,客户只负责上传提示词和图片;创建任务只使用返回的 asset_uri。
11. 创建和查询路径必须是 /video/generations;下载视频内容才使用 /videos/{task_id}/content。
12. 测试报告要记录:请求模型、请求分辨率、请求时长、实际提交时长、task_id、任务状态、查询响应里的 total_tokens、tokens/秒(total_tokens ÷ 实际时长)、任务前后 `/dashboard/billing/usage` 差值、实际扣费金额、元/秒(扣费 ÷ 实际时长)、视频文件路径、报告文件路径。
13. 增加测试覆盖:创建成功、响应缺 task_id、查询 completed/success、查询 unknown 无 URL、查询 unknown 有 URL、查询 failed、结果 URL 下载成功、兜底下载成功、下载失败、401、429、500、轮询超时、duration=3 本地拒绝、480P 必传 resolution、本地图片先上传并使用 asset_uri、素材未就绪等待重试、非 vision 模型传 reference_videos、fast 模型传 1080p 的校验。
验收标准:
- 本地 mock 测试能跑通 create + poll + completed + download 流程。
- 环境变量缺失时有明确错误。
- 代码中没有硬编码 API Key。
- 前端不会直接请求平台 API。
- 六个模型都在代码或配置中可选。
- 项目文档写明 YZX_API_BASE_URL、YZX_API_KEY、Seedance 模型选择规则。测试清单
| 用例 | 期望 |
|---|---|
| 创建任务成功 | 保存平台 task_id,本地任务进入排队或生成中 |
创建响应缺少 id 和 task_id | 报错并保留原始响应摘要 |
查询 queued / pending | 本地状态保持排队,继续轮询 |
查询 in_progress / processing | 本地状态改为生成中,继续轮询 |
查询 completed / success | 保存完整响应,优先读取结果 URL |
查询 unknown 且有结果 URL | 按完成处理,下载或入库 |
查询 unknown 且无结果 URL | 继续轮询,不判失败 |
| 下载内容成功 | 保存视频文件或写入业务存储 |
| 下载内容失败 | 保留完成状态,记录下载错误,允许重试下载 |
查询 failed / cancelled | 保存错误信息,停止轮询 |
| 401 | 提示 API Key 或令牌分组问题 |
| 429 | 做退避或稍后重试,不要立即创建大量新任务 |
| 5xx | 记录错误并按任务队列策略重试 |
| 轮询超时 | 本地标记超时,允许用户稍后刷新或人工重试 |
非 vision 模型传 reference_videos | 本地参数校验失败,提示改用 vision 模型 |
fast 模型传 metadata.resolution = "1080p" | 本地参数校验失败,提示改用 1080p 模型或取消 fast |
