视频生成

视频生成 API 文档

更新时间:2026-10-17。服务地址:https://103.42.182.232.nip.io:18443。 本文依据当前服务代码核对;示例中的 KEY、令牌、任务和代理 ID 均为占位符,不是真实凭据。

1. 鉴权与接口分类

用途 请求头 获取方式
视频 API Authorization: Bearer YOUR_API_KEY 客户门户的“我的密钥”
客户门户 X-Portal-Key: YOUR_PORTAL_TOKEN /api/portal/login 返回的 token
管理接口 X-Admin-Key: YOUR_ADMIN_TOKEN /api/admin/login 返回的 token

三类凭据不能混用。客户无需提供上游账号 CK 或代理密码。不要把密钥写入公开页面、公开仓库、截图或日志。令牌失效返回 401;重新登录获取令牌。运行环境和入口网关可能有额外请求体限制。

2. 快速开始

以下为 Bash/curl 示例。设置 BASE 为服务根地址,不带 /v1/videos。

export BASE='https://103.42.182.232.nip.io:18443'
export VIDEO_API_KEY='YOUR_API_KEY'

curl --fail-with-body "$BASE/v1/client" \
  -H "Authorization: Bearer $VIDEO_API_KEY"

curl --fail-with-body "$BASE/v1/videos" \
  -H "Authorization: Bearer $VIDEO_API_KEY" \
  -H 'Content-Type: application/json' \
  -d '{"prompt":"秋风落叶","model":"video-2.0-fast","duration":5,"ratio":"16:9"}'

提交成功返回 202 和任务 id,不表示视频生成成功。保存该 ID,查询原任务,不要反复提交。

export TASK_ID='REPLACE_WITH_RETURNED_ID'
curl --fail-with-body "$BASE/v1/videos/$TASK_ID" \
  -H "Authorization: Bearer $VIDEO_API_KEY"

仅在 status=completed 后下载:

curl --fail-with-body -L "$BASE/v1/videos/$TASK_ID/content" \
  -H "Authorization: Bearer $VIDEO_API_KEY" -o video.mp4

下载可能返回 307 重定向到对象存储签名地址;不要使用 --location-trusted,不要把本站凭据转发到其他主机。也可以使用任务返回的 video_url;以 / 开头时需拼接服务根地址。

可运行 Python 示例:example.py.txt(以文本提供下载,运行时文件名使用 example.py)。安装依赖:python -m pip install requests。先设置 VIDEO_BASE_URL 和 VIDEO_API_KEY,运行 python example.py。该脚本会真实提交一条任务,可能产生费用。

3. 视频 API

方法 路径 鉴权 返回
GET /v1/models 无 公共模型列表
GET /v1/client Bearer KEY 当前 KEY 的额度策略、使用量、并发策略、可用模型时长
POST /v1/videos Bearer KEY 202,异步提交
POST /v1/videos/generations Bearer KEY 同一受理逻辑,成功 HTTP 状态为 200
GET /v1/videos/{id} Bearer KEY 任务状态
GET /v1/videos?limit=20&offset=0 Bearer KEY 当前 KEY 的历史任务
GET /v1/videos/{id}/content Bearer KEY MP4 或 307 对象存储重定向
GET /api/portal/pricing 无 当前公开模型、时长和价格

提交参数

同时支持 JSON 和 multipart/form-data。推荐显式提供 model、duration、ratio。

字段 类型 必填 说明
prompt string 是 非空提示词;最大长度由服务配置决定,/v1/client.max_prompt_chars 可查
model string 否 video-2.0-fast / video-2.5;默认 2.0 fast
duration integer 否 秒;视频 API 未提供任何时长字段时默认 10。2.0 fast 标准档位 5/10/15;2.5 标准档位 5/10/15/30;以 KEY 策略和开放配置为准
seconds / duration_seconds integer 否 兼容时长字段;优先级 duration > seconds > duration_seconds
ratio string 否 建议显式传 16:9 / 9:16 / 1:1 / 4:3 / 3:4
reference_images string[] 否 公网图片 URL 或 base64 data URL
reference_videos string[] 否 公网视频 URL 或 base64 data URL
reference_audios string[] 否 公网音频 URL 或 base64 data URL

图片默认最多30张、单张15 MiB;参考视频默认最多10个、音频默认最多10段,视频/音频单文件32 MiB。图片格式 JPEG/PNG/WebP,视频 MP4/MOV,音频 MP3/WAV。这些是本服务配置的接收上限,不是上游保证支持的数量或素材组合;内容、编码和模型仍可能被上游拒绝。生产配置和入口网关可能限制更严,过大的 multipart/base64 请求不建议一次发送。

URL 必须可由服务器访问;内网、回环和保留地址不允许。不要传只能在本机访问的路径。未提供独立的文件预上传接口:文件与生成请求一起上传,或使用已有公网对象 URL。

curl --fail-with-body "$BASE/v1/videos" \
  -H "Authorization: Bearer $VIDEO_API_KEY" \
  -F 'prompt=秋风落叶' -F 'model=video-2.0-fast' -F 'duration=5' -F 'ratio=16:9' \
  -F 'image[]=@frame.jpg' -F 'video[]=@clip.mp4' -F 'audio[]=@track.mp3'

可重复 image[]、video[]、audio[] 字段提交多个文件。不要手写 multipart 的 Content-Type,客户端会自动生成 boundary。

响应与轮询

以下为字段结构示例,不是真实生成结果:

{
  "id": "video_EXAMPLE",
  "status": "queued",
  "model": "video-2.0-fast",
  "prompt": "秋风落叶",
  "video_url": null,
  "error": null,
  "progress": {
    "state": "queued",
    "position": 1,
    "ahead": 0,
    "running": 0,
    "workers": 0,
    "typical_seconds": 420,
    "eta_seconds": 0,
    "eta_text": "",
    "message": "等待符合条件的空闲账号",
    "blocker": {"code":"accounts_busy","message":"等待符合条件的空闲账号","retryable":true}
  }
}
status 含义 客户动作
queued 等待派发或生成前准备 查询原任务,不重复提交
processing 已开始处理,可能正在提交、等待上游或转存 继续查询
completed 本站任务已完成 保存 video_url 或下载 /content
failed 本站任务失败 停止轮询,查看 error
风控 兼容历史异常状态 按失败处理,联系管理员核查

建议每5–10秒查询一次,设定合理总等待时限。progress.message 是阶段说明,blocker 可能为 null;常见阻塞码包括 accounts_busy、client_concurrency、global_concurrency。ETA 仅为估算,不是承诺,workers=0 表示不设全局并发闸门,不代表没有服务器资源限制。HTTP 200、会话编号或心跳均不等于视频成功。

历史查询参数:limit 默认20,范围1–50;offset 默认0;status 可选上述状态。返回 total、limit、offset、tasks。只能读取当前 KEY 的任务,其他 KEY 的任务返回404。

HTTP 错误

错误通常返回 {"detail":"原因"};框架字段校验也可能返回结构化数组,网关错误可能不是 JSON。

HTTP 含义及处理
400 JSON、业务参数或分配计划不合法,修正后再请求
401 凭据缺失、失效或无权使用,检查鉴权类型
403 自助注册关闭、邀请码错误或当前操作禁止
404 任务/资源不存在或不属于当前身份
409 视频尚未就绪,或用户名冲突等资源状态冲突
413 请求体超过入口允许大小,缩小素材
422 参数、模型时长、素材或 KEY 时长策略校验失败
429 本站额度、请求限制或上游退避;若有 Retry-After,至少等待指定秒数
502/503 存储或服务容量暂不可用,先核对原任务是否已创建

提交接口没有承诺幂等键。POST 超时/断线后不能认定“未受理”,先查任务列表或联系管理员核对;不要立即重复提交,避免重复计费。GET 查询失败可以退避重试。

4. 客户注册、登录与密钥

方法 路径 请求体 / 说明
GET /api/portal/config 无鉴权;注册开关、密码长度、KEY 数量上限和模型配置
POST /api/portal/register {"username":"yourname","password":"YOUR_PASSWORD","email":"","invite":""};是否可注册以 config 为准,返回 token 与默认 key
POST /api/portal/login {"username":"yourname","password":"YOUR_PASSWORD"},返回门户 token
POST /api/portal/key-login {"key":"YOUR_API_KEY"},客户所属 KEY 换门户 token
GET /api/portal/me 携带 X-Portal-Key;账号、名下 KEY 与用量
POST /api/portal/keys 携带 X-Portal-Key;{"name":"业务服务"} 创建 KEY
PATCH /api/portal/keys/{key} 携带 X-Portal-Key;修改 name 或 enabled
POST /api/portal/keys/{key}/rotate 携带 X-Portal-Key;换新 KEY,旧值立即失效
DELETE /api/portal/keys/{key} 携带 X-Portal-Key;删除 KEY,受至少保留一把启用 KEY 约束
POST /api/portal/logout 携带 X-Portal-Key;注销门户会话

用户名格式与最小密码长度以 config 和校验返回为准。管理账号不能使用客户登录接口。密钥路径含敏感值,应避免记录完整 URL。

门户也可使用 POST /api/portal/generate 提交,以及 GET /api/portal/tasks、GET /api/portal/tasks/{id} 查询。使用 X-Portal-Key,不是 Bearer KEY;生成字段与上述一致,门户默认时长5秒,返回 {"ok":true,"quote":{},"task":{}} 结构,不是视频 API 的直接 TaskResponse。服务端集成优先使用 /v1/videos。

5. 管理员:静态 IP 按数量分配

管理员接口不是客户 KEY 权限。先登录取得 token:

curl --fail-with-body "$BASE/api/admin/login" \
  -H 'Content-Type: application/json' \
  -d '{"username":"YOUR_ADMIN_USERNAME","password":"YOUR_ADMIN_PASSWORD"}'

使用 X-Admin-Key: RETURNED_TOKEN 查询 GET /api/admin/accounts 和 GET /api/admin/proxies。使用返回的代理 id,不是 IP 地址作为 proxy_id。只允许选择已启用且 mode=static 的代理。

预览与应用

每条静态 IP 可保存自己的账号绑定上限。在管理面板的「代理管理 → 绑定数量」中设置,或调用:

PATCH /api/admin/proxies/PROXY_A_ID
X-Admin-Key: RETURNED_TOKEN
Content-Type: application/json

{"account_limit":20}

account_limit 是0-1000000的整数,0表示不限制;创建静态代理时也可传入。比如代理A设20、代理B设80,分别独立保存,服务重启后保留。保存上限本身不分配或解绑账号;要实际分配,使用下面的批量接口。

代理列表返回 account_count(已绑定数)、account_limit(上限)、account_slots(剩余名额;不限时为null)和 account_over_limit(已有绑定是否超限)。单号绑定、批量绑定及底层写入均检查静态代理容量;待应用绑定也预占名额。降低上限不会删除已有绑定,已绑账号可保留,但满额后不能新增。未设置过上限的旧代理默认为0,不改动旧绑定。

同批调整不会预先扣除即将迁出的账号,避免尚未生效的迁出让名额超卖。满额代理之间调换时,请先释放名额或临时调高上限。平均分配仍是均分本批账号,并非按容量加权,超限会明确报错。

POST /api/admin/accounts/allocate-static-proxies

字段 类型 默认 含义
names string[] [] 本批账号名,最多500个,不能为空或重复,必须已存在
mode string custom custom 指定数量;equal 平均分配
allocations object[] [] 顺序稳定的代理列表;proxy_id 唯一;count 为非负整数
preview boolean true true 只读预览;false 才写入绑定

指定数量示例:

{
  "names": ["acc1", "acc2", "acc3", "acc4", "acc5"],
  "mode": "custom",
  "allocations": [
    {"proxy_id": "PROXY_A_ID", "count": 1},
    {"proxy_id": "PROXY_B_ID", "count": 4}
  ],
  "preview": true
}

100个账号按20/80分配时,提交完整100个账号名,两个 count 分别填20和80。count 是本批分配数,account_limit 是该代理保存的总绑定上限。未在 names 中的账号不会更改或自动解绑;预览和应用时均会计入已有及待应用绑定,超过保存的上限会拒绝。

平均分配:mode=equal,allocations 只填各个 proxy_id 即可。100个号/2条代理为50/50;5个号/2条为3/2,余数按代理列表顺序分配。账号按 names 顺序分段,每个账号恰好分给一条代理,不会重复分配。

响应结构:

{
  "ok": true,
  "preview": true,
  "mode": "custom",
  "total": 5,
  "plan": [
    {"proxy_id":"PROXY_A_ID","proxy_name":"代理A","count":1,"names":["acc1"]},
    {"proxy_id":"PROXY_B_ID","proxy_name":"代理B","count":4,"names":["acc2","acc3","acc4","acc5"]}
  ],
  "updated": [],
  "queued": [],
  "failed": []
}

核对预览后,使用同一请求将 preview 改为 false 应用。接口重新校验账号和代理。updated 是立即生效账号;queued 是正在运行、等空闲后应用的账号;failed 是逐账号运行期失败列表。参数校验失败不写任何绑定;运行期失败允许部分成功,必须检查 failed,不能只看 HTTP 200。

分配不修改账号国家、调度开关、额度、限流状态,也不触发登录、探测或生成。静态代理配置不保证供应商实际公网出口固定、国家正确或账号不被限制。忙碌账号的待应用设置沿用现有内存队列,服务重启前未应用的设置不保证保留。应用前应保存原绑定快照,后续可用现有单号/批量代理接口恢复。

账号列表会返回待应用状态,可刷新检查;不要把“已提交待应用”误认为代理已经切换。