视频生成 API 接入说明
一把 sk-omni-… 的 Key,一个异步 HTTP 接口:提交 → 轮询 → 取片。
接口形态与 OpenAI / 火山方舟的异步视频接口一致,官方 content[] 写法可直接复用。
版本 2026-11-05。标注 实测 的条目为生产环境跑通所得并注明日期;
标注 规格 的为服务端契约声明(取值范围)。两者不一致时以实测为准并请反馈。
本页与 docs/api-qiliqiji-video.md 同步维护:md 是事实源,本页多出的是 2026-11-05 的真实样例与五处勘误(见 附录 B.5)。
060 秒判断
三条会改变你代码写法的硬事实
- 终态有四个,不是一个。
completed/failed/qc_failed/cancelled。 漏掉qc_failed会让轮询循环永远跑下去(它不交付、不计费)。见 §7。 - 建单 200 ≠ 参数合法。 大量参数问题会在建单时 400(2026-11-03 起提前判定), 但素材层面的问题仍要拿到素材才能判,表现为「建单 200 → 数秒后 failed」。判据是终态,不是建单 HTTP 码。见 §10.4。
duration是「至少」不是「正好」。 传duration: 4出的片子是 124 帧 / 5.1667 秒 (实测,见 §1);响应里的duration_secs仍回你请求的4.0。要精确控时长用num_frames。
一分钟自检你手上的 Key
curl -s "https://api.123all.cn/api/v1/reseller/tokens/verify?key=sk-omni-xxxxxxxx"
# 期望:{"active":true, ... } —— active=false 就别往下试了
真实响应与字段解释见 §2;两种 401 的原文也在那里。
1快速开始(2026-11-05 真实跑通)
下面三段不是示意,是 2026-11-05 14:47(+08:00)在公网域名 api.123all.cn 上真跑的一条请求:
提交 → 轮询 → 取片,附完整响应、耗时、字节数与 ffprobe 结果。
第 1 步 · 提交作业(181 毫秒返回)
curl -s -X POST https://api.123all.cn/v1/videos \
-H "Authorization: Bearer $KEY" \
-H "Content-Type: application/json" \
-d '{"model":"minimax-h3-hyper",
"prompt":"海边日落,海浪拍岸,电影感,镜头缓慢推进",
"duration":4,"resolution":"480p","ratio":"16:9"}'
HTTP/1.1 200 OK (实测 181 ms)
{"id":"video_3f9371a03b7747ecb63f73f9e4a33a2d","object":"video",
"status":"queued","model":"minimax-h3-hyper","created_at":1793861261}
id,但别拿它当幂等键重试重投会真的再出一段片、再计一次费。请求超时后先按 id 查一次状态,再决定要不要重投。
第 2 步 · 轮询(5–10 秒一次,只在终态结束)
curl -s https://api.123all.cn/v1/videos/$ID -H "Authorization: Bearer $KEY"
{"id":"video_3f9371a03b7747ecb63f73f9e4a33a2d","object":"video","status":"completed",
"model":"minimax-h3-hyper","created_at":1793861261,
"qc":{"verdict":"Pass","sobel_mean":13.2217,"blank_frac":0.0,"freeze_diff":16.3814,
"lap_var":917.1292,"soft":false,"frames_sampled":8,"clipped_samples":0,
"clipped_ratio":0.0,"notes":[]},
"url":"/v1/videos/video_3f9371a03b7747ecb63f73f9e4a33a2d/content"}
这条作业的完整时间线(轮询间隔 5 秒,共 18 次):
| t(秒) | 观测 | 值 |
|---|---|---|
| 0.000 | 建单 | 200 · 181 ms · status=queued |
| 5.7 | 第 1 次轮询 | in_progress(排队段很短,时间几乎都在生成) |
| 6.4 → 92.7 | 第 2–17 次轮询 | 一直是 in_progress |
| 98.1 | 第 18 次轮询 | completed · qc.verdict=Pass · 带 url |
| +2.33 | 取片 | 200 · video/mp4 · 4,035,364 字节 |
| — | ffprobe | 864×480 · h264 · 124 帧 · 5.166667 s · 24 fps · AAC 双声道 |
本次是三单并发提交(见下表),排队会把每一单都拉长。单发时的参考值见 §3.4, 并发不会更快,只会把队列排长——这正是我们建议客户端自己限并发的理由。
第 3 步 · 取片(这一步最容易踩)
curl -fL -o out.mp4 "https://api.123all.cn/v1/videos/$ID/content" \
-H "Authorization: Bearer $KEY"
file out.mp4 # 期望:ISO Media, MP4 v2
ls -l out.mp4 # 期望:4035364
HTTP/1.1 200 OK
Content-Type: video/mp4
Content-Length: 4035364
-f 不能省,落盘后要核内容不加 -f 时 curl -o 会把 任何 4xx/5xx 的响应体原样写进 out.mp4 并返回 0 ——
你会得到一个「内容是 JSON 错误体」的 .mp4。2026-10-14 实测复现过:
$KEY 没设置时 header 退化成 Bearer ,服务端回 401 + JSON,-o 把它整段写进文件。
判据是「文件里是不是片子」(Content-Type: video/mp4 / file 报 MP4),不是「命令有没有报错」。
详见 §8.3。
同一批次的另外两单(2026-11-05 实测)
| 请求 | 端到端(建单→终态) | 成片 | ffprobe | 体积 |
|---|---|---|---|---|
minimax-h3-hyper480p / 16:9 / 4 s |
98.1 s(18 次轮询) | completed / Pass |
864×480 · 124 帧 · 5.1667 s | 4,035,364 B |
minimax-h3-vdn480p / 9:16 / 4 s |
105.7 s(19 次) | completed / Pass |
480×864 · 124 帧 · 5.1667 s | 4,829,051 B |
minimax-h3-hyper + loras:[{id:"style_sumi_ink",scale:0.9}]480p / 16:9 / 4 s |
216.5 s(40 次) | completed / Pass |
864×480 · 124 帧 · 5.1667 s | 4,645,960 B |
三单同一秒提交、同一条通道池排队。竖屏那单走的是 vdn,交付 480×864 ——
与 §3.2 那张尺寸表逐像素一致(承诺值)。带画风那单比另外两单多等了一倍,
因为画风要单独准备资源(§6.5),且当时排在前两单后面。
如果你只想先跑通一次
export KEY=sk-omni-xxxxxxxx # 换成发给你的 Key
export BASE=https://api.123all.cn
JOB=$(curl -s -X POST $BASE/v1/videos \
-H "Authorization: Bearer $KEY" -H 'Content-Type: application/json' \
-d '{"model":"minimax-h3-hyper","prompt":"海边日落,海浪拍岸","duration":4,"resolution":"480p"}' \
| python3 -c 'import sys,json;print(json.load(sys.stdin)["id"])')
echo "job=$JOB"
while :; do
S=$(curl -s "$BASE/v1/videos/$JOB" -H "Authorization: Bearer $KEY")
ST=$(printf '%s' "$S" | python3 -c 'import sys,json;print(json.load(sys.stdin)["status"])')
echo "status=$ST"
case "$ST" in completed|failed|qc_failed|cancelled) break;; esac
sleep 6
done
case "$ST" in
completed) curl -fL -o out.mp4 "$BASE/v1/videos/$JOB/content" -H "Authorization: Bearer $KEY"
file out.mp4 ;;
*) printf '%s\n' "$S" ;; # 把 error / qc 原样打出来
esac
2认证与自检
2.1 请求头
Authorization: Bearer sk-omni-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
Key 的格式是 sk-omni- + 32 位十六进制。它是密文:不要贴进前端代码、公开仓库或工单。
服务端不会再有第二处能读到明文;列表接口只回掩码。
- 一把 Key 绑一个账户:用量、配额、账目互不串。要分账就分 Key。
- Key 的模型白名单是逐把配的(默认
minimax-h3-*,doubao-seedance-*)。 - 配额用尽 / 停用 / 过期都会让
active变false,调用随即401。
2.2 先自检这把 Key(不需要任何其它凭据)
curl "https://api.123all.cn/api/v1/reseller/tokens/verify?key=sk-omni-xxxxxxxx"
真实响应 实测 2026-11-05 · 46 ms(账户字段已脱敏):
{
"active": true,
"scopes": ["video:generate", "chat:completion", "mcp:tool"],
"quota": 0.0,
"consumed": 35.0,
"bound_account_id": "agency:<你的代理商>"
}
| 字段 | 含义 | 怎么用 |
|---|---|---|
active | Key 是否可用(停用 / 过期都变 false) | false 就别重试,找我们 |
scopes | 能力作用域。出片必须有 video:generate | 只看这一个,别的条目与本接口无关 |
quota / consumed | 配额上限与已用(只计交付的作业) | quota=0 表示「不限次、按量后付」,不是「不能用」 |
bound_account_id | 这把 Key 归属的账户(计费落在这里) | 对账、开票时用 |
consumed 是最终一致的:作业交付时累加,同步有延迟。
它适合看「Key 还能不能用」,不适合当精确用量 —— 精确用量请找我们对账。
2.3 两种 401,原文不一样
401
{"code":"modality.key.denied",
"params":{"detail":"出片接口需要有效凭据:license JWT / 登录态 JWT / 未过期且未超额的 sk-omni API key"},
"message":"出片接口需要有效凭据:…"}
401
{"code":"modality.key.invalid",
"params":{},
"message":"API key 无效、已停用、已过期或已超额"}
两条都是 实测 2026-11-05(141 ms / 143 ms)。
写客户端时按 code 分支,别匹配 message —— 那是给人读的中文,会改。
3模型 / 档位 / 画幅
3.1 三条通道,能力不一样
| 通道 | 模型名 | 支持的任务 | 单发参考耗时(4 秒片) |
|---|---|---|---|
| Hyper | minimax-h3-hyper |
文生 / 首帧 / 尾帧 / 首尾帧 / 参考素材(图·视频·音频) | 480p 52 s · 768p 95 s · 首帧 53 s · 参考图 73 s |
| VDN | minimax-h3-vdn |
文生 / 首帧 / 尾帧 / 首尾帧 / 参考素材 | 480p 63 s · 768p 73 s · 768p_native 143 s · 2k 154 s · 参考素材 215 s |
| Seedance(转售) | doubao-seedance-2.0 / 2.0-fast / 2.0-mini / 2.5 |
文生 / 首帧 / 首尾帧 / 多模态参考 | 2.0 端到端 156 s(2026-09-24 基线;2026-10-22 复测时上游账号不可用,无法复测) |
参数集合、档位、能收哪几种素材、url 的形态、错误体,逐条不同。
唯一的用法统一是:model 名就是契约 —— 换 model 就按那一列读文档。
3.2 档位由「节点画布」决定,不是模型本身
自有引擎(minimax-h3-*)的五档分两组,一台节点只提供其中一组 ——
档位名相同但生成几何不同。这是很多人第一次接会踩的地方:
| 档位 | 生成几何 | 交付几何(16:9) | 需要节点基底 |
|---|---|---|---|
480p | 864×480 | 864×480 | 480(VDN_LATENT=30x54) |
768p(默认) | 864×480 | 1382×768(超分) | 480 |
768p_native | 1344×768 | 1344×768 | 768(VDN_LATENT=48x84) |
1080p | 1344×768 | 1890×1080(超分) | 768 |
2k | 1344×768 | 2688×1536(超分) | 768 |
所以 768p 与 768p_native 的耗时差(73 s vs 143 s)来自生成分辨率不同,
不是超分。传了不在列表里的档,建单时同步 400 并列出可用清单(真实原文见 §10.3)。
3.3 resolution × ratio 的成片尺寸(承诺值)
六档画幅全部开放(2026-11-03 起)。不传 ratio 就是 16:9。
下面这张表是逐像素核对过的承诺值:按它排版、裁切不会差像素。
resolution | 16:9 | 21:9 | 4:3 | 1:1 | 3:4 | 9:16 |
|---|---|---|---|---|---|---|
480p | 864×480 | 992×416 | 640×480 | 480×480 | 480×640 | 480×864 |
768p(默认) | 1382×768 | 1832×768 | 1024×768 | 768×768 | 768×1024 | 768×1382 |
768p_native | 1344×768 | 1536×672 | 1024×768 | 768×768 | 768×1024 | 768×1344 |
1080p | 1890×1080 | 2468×1080 | 1440×1080 | 1080×1080 | 1080×1440 | 1080×1890 |
2k | 2688×1536 | 3510×1536 | 2048×1536 | 1536×1536 | 1536×2048 | 1536×2688 |
2026-11-05 复验:vdn + 480p + 9:16 实得 480×864,
与表中一致(ffprobe 读的是成片,不是响应)。
3.4 耗时:分「准备好了」和「要准备」两档
① 全档复测 实测 2026-10-22(同一把 Key、公网域名、duration=4、ratio=16:9、
seed=4242、轮询 5 秒)。「墙钟」= 建单到成片落盘,含排队;建单本身 0.3–1.6 秒返回 queued。
minimax-h3-vdn
| 任务 | 档位 | 交付 | 墙钟 | 体积 |
|---|---|---|---|---|
| 文生 | 480p | 864×480 | 63 s | 370 KB |
| 文生 | 768p | 1382×768 | 73 s | 1.22 MB |
| 文生 | 768p_native | 1344×768 | 143 s | 851 KB |
| 文生 | 2k | 2688×1536 | 154 s | 4.86 MB |
| 首帧 | 480p | 864×480 | 65 s | 532 KB |
| 尾帧 | 480p | 864×480 | 74 s | — |
| 首尾帧 | 480p | 864×480 | 74 s | 621 KB |
| 参考素材 | 480p | 864×480 | 215 s | 643 KB |
minimax-h3-hyper
| 任务 | 档位 | 交付 | 墙钟 | 体积 |
|---|---|---|---|---|
| 文生 | 480p | 864×480 | 52 s | 472 KB |
| 文生 | 768p | 1382×768 | 95 s | 1.72 MB |
| 首帧 | 480p | 864×480 | 53 s | 467 KB |
| 参考图 | 480p | 864×480 | 73 s | 360 KB |
| 同步模式 | 480p | 864×480 | 84 s(单次 HTTP 挂住) | 459 KB |
② 会明显更慢的四类请求 实测 2026-10-31(4 秒片 / 480p):
| 情况 | 耗时 | 说明 |
|---|---|---|
| 常规请求 | 约 50–75 秒 | 与上表同量级 |
| 第一次用某个「没跑过的组合」 | 约 3–4 分钟 | 服务端要为这次请求准备资源,准备时间算在这一单里 |
带参考素材(ref2va) | 约 4–5 分钟 | 参考素材要先完整读进模型 |
| 刚出过参考素材、紧接着投普通单 | 也可能 3–4 分钟 | 上一单与本单「形态不同」就要重新准备 |
挂风格画风(loras) | +30 秒起,并发时更长 | 2026-11-05 实测:三单并发时带画风那单 216.5 s |
公网上最常见的失败不是出片失败,而是客户端 60 秒超时 → 自动重投 → 队列里多一条同样的作业。 重投不会更快,只会让后面更慢。正确做法:超时 ≥6 分钟、轮询 5–10 秒、只在终态结束。
画幅对耗时的影响 实测 2026-11-03 · 节点直测(不含排队)
resolution | 16:9 | 21:9 | 4:3 | 1:1 | 3:4 | 9:16 |
|---|---|---|---|---|---|---|
480p | 95 s | 85 s | 75 s | 70 s | 80 s | 90 s |
768p | 110 s | 105 s | 95 s | 85 s | 95 s | 110 s |
1080p | — | 205 s | — | — | — | 190 s |
换画幅不改生成面积,所以耗时同量级(±20%)。竖屏长边更长,超分多处理些行,略慢。
hyper 同口径:480p 竖屏 90 s / 方屏 85 s;768p 方屏 95 s / 竖屏 115 s。
3.5 复现:seed 是抓手,不是缓存键
- 不传
seed时服务端用固定默认值 ⇒ 同一 prompt 反复投会得到同一条片(看起来像缓存,其实是确定性生成)。 - 要每次不同:每次传不同的
seed。要复现某条:把当时的seed记下来再传。 - 同
seed重投,画面内容一致,但像素级可能有约 1% 差异(不同服务实例的计算细节不同)。 需要逐字节相同(素材比对、算 diff)请事先联系我们,默认做不到。
4请求参数
POST /v1/videos
Content-Type: application/json
Authorization: Bearer sk-omni-…
4.1 通用参数
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
model | string | ✅ | 见 §3.1。缺这个字段返回 422。 |
prompt | string | 文本提示词。可以不给 —— 只要 content[] 里有非空 text 项。两者都空返回 400。
反过来也成立:只给扁平 prompt、content[] 里只放素材(一个 text 都不放)是合法的。 | |
content | array | 多模态入参,见 §4.2。空数组等于没给。 | |
duration | number | 秒。minimax-h3-* 收 4–15;doubao-seedance-2.5 收 4–30、2.0 系列 4–15。
是「至少」不是「正好」(见 §4.5)。与 num_frames 二选一。 | |
num_frames | int | 帧数(24 fps)。合法区间 124–362,且只吃 17n+5。
给了不合规的数不报错:服务端对齐到最近合法值并在响应里如实回报(100 → 回报 124 / 5.17)。 | |
resolution | enum | 480p / 768p(默认)/ 768p_native / 1080p / 2k。
传别的值建单时 400 并列出可用档位。逐通道上限见 §4.4。 | |
ratio | enum | 16:9(默认)/ 21:9 / 4:3 / 1:1 / 3:4 / 9:16;
adaptive 按 16:9 处理。协议外的值建单即 400。 | |
seed | int | 复现抓手,见 §3.5。 | |
loras | array | 画风,最多 3 件:[{"id":"style_sumi_ink","scale":0.9}]。只收 id,不接受 path / URL。见 §6。 | |
style | string / object | loras 的单件简写:"style":"style_sumi_ink" 或 {"id":…,"strength":0.8}。
不要和 loras 同时给。 | |
background | bool | false = 同步等到出片再返回(响应体换成 {"model":…,"data":[…]})。
不传 = 默认异步。与「画面背景」无关。公网请用默认异步。 | |
generate_audio / watermark | bool | 仅 doubao-seedance-*(默认 true / false)。
minimax-h3-* 上不认这些键,既不报错也不生效。 | |
gen / steps / video_shift / audio_shift / sigma_grid / f32_compute | — | ❌ |
节点侧调参,对外通道不转发 ⇒ 传了当场 400(modality.field.unimplemented)。
2026-11-05 实测:gen 里哪怕只有一个拼错的键,也整块被拒,不会静默丢弃。见 §10.5。 |
4.2 content[]:四种元素
type | 必带字段 | 说明 |
|---|---|---|
text | text | 描述文本。空串会被拒(400);单个 text ≤ 7000 字符。 |
image_url | image_url + 可选 role |
image_url 可以是 {"url":"…"} 对象或裸字符串。
role 只能是 first_frame / last_frame / reference_image,省略即 first_frame。 |
video_url | video_url + 可选 role: reference_video | 参考视频;省略 role 即按参考视频算。 |
audio_url | audio_url + 可选 role: reference_audio |
参考音频。不能单独给 —— 要与至少一件参考图或参考视频一起。 |
三种媒体的地址也支持 asset://<素材ID>(先上传到素材库,见 §5.5)。
值的两种形态
{"type":"image_url","image_url":{"url":"https://…/a.png"},"role":"reference_image"} // 对象形态(官方写法)
{"type":"image_url","image_url":"https://…/a.png","role":"reference_image"} // 字符串形态(同样收)
4.3 图片的另一种写法:扁平字段(与 content[] 二选一)
| 扁平字段 | 等价于 |
|---|---|
first_frame_image / last_frame_image | role=first_frame / role=last_frame 的图 |
reference_image / reference_images | role=reference_image(可多张) |
同时给 content[] 里的图和 first_frame_image 这类扁平字段,建单时 400。
这是刻意的:不然一半入参会静默失效。真实原文(实测 2026-11-05):
400
{"code":"modality.content.mixed_forms","params":{},
"message":"content[] 里已经有图片,同时又给了 first_frame_image 这类扁平字段 —— 只用一种写法(挑一个会让另一半静默失效)"}
只给 content[] 的文本项 + 扁平条件图是允许的(无歧义,可叠加)。
4.4 任务是从素材形状「推」出来的(不是参数)
没有 task 字段 —— 照抄方舟:任务类型由 content[] 的形状决定。
content[] 形状 | 任务 | 引擎侧代号 |
|---|---|---|
[text] | 文生视频 | t2va |
[text?, image(first_frame)](role 省略也是它) | 图生视频·首帧 | i2va |
[text?, image(last_frame)] | 图生视频·只给尾帧 | l2va |
[text?, image(first_frame), image(last_frame)] | 首尾帧 | fl2va |
[text?, image(reference_image)×N, video(reference_video)×N, audio(reference_audio)×N] | 多模态参考 | ref2va |
first_frame / last_frame 是一类(定几何与首尾);
reference_image / reference_video / reference_audio 是另一类(全模态参考,三者可共存)。
混用会被拒(400,或拿到素材后数秒 failed)。参考图走的是另一个模型分支,混着传没有语义可落地。
参考配额(逐通道不同,别照搬)
| 入参 | doubao-seedance-* | minimax-h3-hyper | minimax-h3-vdn |
|---|---|---|---|
role: first_frame / last_frame | ✅ | ✅ | ✅(i2va/l2va/fl2va) |
role: reference_image | ✅(2.5 收 1–30;2.0 系列 1–9) | ✅ 1–9 张 | ✅ 1–9 张 |
role: reference_video | ✅(2.5 ≤10 段;2.0 ≤3 段) | ✅ 1–3 段 | ✅ 1–3 段 |
role: reference_audio | ✅(同上;不可单独给) | ✅ 1–3 段(不可单独给) | ✅ 1–3 段(不可单独给) |
| 合计 | — | 三类合计 ≤12 件 | 三类合计 ≤12 件 |
「音频不能单独给」是上游契约:音频决定音色 / 语速,画面仍需要一张图或一段视频当主体。
它不在建单时拒(实测 2026-11-05:200 queued,4.3 秒后 failed,原文见 §10.4)。
4.5 时长:duration 是「至少」
| 你要的 | 会发生什么 |
|---|---|
duration: 4 | 服务端把 96 帧抬到最低合法 124 帧 ⇒ 成片 5.1667 秒(实测 2026-11-05,ffprobe)。
响应里的 duration_secs 仍回 4.0。 |
num_frames: 124 | 精确 124 帧(≈5.17 s)。要「正好」就用这个,须落在 17n+5。 |
| 两个都不给 | minimax-h3-* 上兜底 345 帧 ≈14.38 秒,按实际时长计费。
doubao-seedance-* 由上游按内容自行选时长(我们不替你填默认值)。请总是显式给。 |
duration 超过本模型上限 | 建单时 400(modality.duration.out_of_range),拿不到 job id。 |
5素材与素材库
5.1 素材规格:逐通道对照(含官方口径)
两家的数不一样,别互相代入。这不是我们分两套,而是上游各自的官方限制本来就不同 —— 最典型的是「参考视频多大」:方舟 200 MB,MiniMax H3 50 MB,差 4 倍。
| 项 | 官方 MiniMax H3 (开放平台手册) | 我们 minimax-h3-* | doubao-seedance-*(火山方舟) |
|---|---|---|---|
| 图片单件 | ≤ 30 MB | ≤ 30 MB | < 30 MB |
| 图片格式 | JPG / JPEG / PNG / WEBP / HEIC / HEIF | 同上,另收 GIF / BMP(是超集,不是少收) | jpeg / png / webp / bmp / tiff / gif(2.0 系列起另加 heic / heif) |
| 图片尺寸 | 单边 256–5760 px;比例 5:2 ~ 2:5 | 同官方(比例即 0.4–2.5) | 单边 300–6000 px;比例 0.4–2.5 |
| 视频单件 | 50 MB | 50 MB | 200 MB ← 差 4 倍 |
| 视频格式 / 帧率 | H.264/AVC、H.265/HEVC;内嵌音频 AAC / MP3 | mp4 / mov;23.976–60 fps | 24–60 fps;总像素 407,696–8,295,044 |
| 视频时长 / 条数 | 单段 2–15 s;≤3 段;总 ≤15 s | 同官方 | 2.5:单段 2–30 s、≤10 段、总 ≤30 s;2.0:单段 2–15 s、≤3 段、总 ≤15 s |
| 音频单件 / 格式 | ≤ 15 MB;WAV / MP3 | 同官方 | ≤ 15 MB |
| 音频条数 | ≤3 段;2–15 s;总 ≤15 s;必须配图或视频,不能单独给 | 同官方 | 2.5:≤10 段、总 ≤30 s;2.0:≤3 段、总 ≤15 s;不可单独给 |
| 参考件数 | 图 ≤9 / 视频 ≤3 / 音频 ≤3,合计 ≤12 | 同官方(在入口逐条判) | 图 1–30(2.5)/ 1–9(2.0);视频 ≤10(2.5)/ ≤3;音频 ≤10(2.5)/ ≤3 |
| 提示词长度 | ≤ 7000 字符 | 单个 text ≤ 7000 字符 | 以方舟为准 |
| 内联(base64)可用量 | 请求体 64 MB(官方建议大文件走 URL) | ≤ 64 MB(量的是所有 data URL 的 base64 正文之和) | ⚠ 实际仅 ≈64 KB(见 §5.2) |
官方手册还写明:输出 4–15 秒、24 fps、全部带声音(原生双声道);768p 档短边 768,
16:9~9:16 之外按“约 1M 像素”重算(例如 21:9 = 1536×672)—— 与我们的 768p_native 行一致。
5.2 素材怎么给:优先公网 URL
| 方式 | doubao-seedance-* | minimax-h3-* |
|---|---|---|
公网 http(s):// URL | ✅ 推荐 | ✅ 推荐 |
内联 data:…;base64,… | ⚠ 实际仅 ≈64 KB | ✅ 单件 30 MB / 合计 64 MB |
asset://(素材库) | ✅ | ✅ |
doubao-seedance-* 上,内联 base64 实际只有几十 KB2026-09-24 二分实测(判据取建单后几秒的终态,不是建单 HTTP 码):
61.9 KB → 过 64.5 KB → 不过 ← 正对上游那个 65,535 字节的字段上限
0.25 MB → 也不过 4.74 MB → 也不过
上限是整个请求体(与你给几张图无关):一张 0.25 MB 的图和两张合计 0.25 MB 一样过不去。
超了的表现不是我们报错,而是终态 failed:
{"status":"failed","error":"[502 Bad Gateway] Upstream error [500]:
AI Gate CreateTask 返回 500 Internal Server Error: {…\"message\":\"Data too long for column 'form' at row 1\"}"}
结论:这条通道上一律给公网 URL。真正的大素材(官方允许到 30 MB 的图、200 MB 的视频)本来也只有 URL 一条路。
5.3 三层请求体上限(谁拦你,含义不同)
| 层 | 上限 | 超了谁答 |
|---|---|---|
| 我们的契约闸(内联素材总量) | 64 MB | 我们,400 并说明超了多少、建议改用公网 URL |
| 服务端的请求体 | 72 MB | 我们,413 并说明内联总量上限(留 8 MB 给 JSON 结构) |
| 边缘 nginx(全站) | 96 MB | nginx,413(几乎撞不到) |
30 MB 管「这一张合不合法」,64 MB 管「这一次一共要了多少」——
少了后者,30 张满档图每张单独都合法、合起来却能压垮请求。两层都要有,各报各的错。
5.4 引用协议:asset:// 与 mm_file://
我们收两个名字。判据落在 ID 前缀上,不在协议名上 —— 从官方文档抄来的
mm_file:// 代码,我们照样收。
| 形态 | 谁的库 | 我们怎么处理 |
|---|---|---|
asset://asset-omni-… | 我们的(§5.5) | 建单时本地解析成公网 URL 再交上游 |
mm_file://asset-omni-… | 我们的(官方协议名) | 同上 —— 协议名不影响归属判定 |
asset://asset-…(别的形态) | 上游的 | 原样透传给上游,由它解析 |
mm_file://file-…(平台 ID) | 上游平台 | 提交后 failed(约 2–6 秒):image_url.url 认不出 |
asset://asset-omni-…(我方前缀、库里没有) | — | 提交后 failed:modality.asset.parse_failed(见下) |
5.5 素材库:传一次,用多次
同一张参考图/视频要用在很多个作业上时,不要每次重传 base64(会把请求体撑大、也拖慢建单)。
先传上来拿一个 ID,之后每个作业里写 asset://<ID>。
上传 · 实测 2026-11-05 · 200
POST /v1/assets
{"name":"样例-1x1.png","data":"data:image/png;base64,iVBORw0KGgo…"}
{"id":"asset-omni-f5251062c1f64373a87903e8b59b8a9d",
"uri":"asset://asset-omni-f5251062c1f64373a87903e8b59b8a9d",
"kind":"image","name":"样例-1x1.png","content_type":"image/png","bytes":75,
"sha256":"ebda4d4ace3059d20d30b04f8fb1a9390f9e8bd8cd2117fca38db09ba2efa1a0",
"created_at":1793861514,
"public_url":"http://<素材主机>/v1/artifacts/assets/20261105/asset-omni-f525….png"}
| 字段 | 说明 |
|---|---|
data(请求) | 必填。data: URL 形式的 base64;也接受裸 base64(此时必须给 kind,否则无法判型) |
kind(请求) | image / video / audio。不给就从 data: 的 MIME 推 |
uri | 就是你在建单请求里写的那串:image_url.url / video_url.url / audio_url.url |
public_url | 不要写进你的请求。它只是给你自己 curl 一下确认上游取得到(实测不带鉴权也能取,200 + 正确 Content-Type) |
sha256 | 核对「传上来的字节有没有变」 |
管理自己的素材
| 端点 | 说明 | 实测 |
|---|---|---|
GET /v1/assets | 列出你归属账户的素材:{"object":"list","data":[…]} | 200 |
GET /v1/assets/{id} | 单条元数据 | 200 |
DELETE /v1/assets/{id} | 删除(登记与字节一起删):{"id":"…","deleted":true} | 200 |
| 删除后再查 | {"code":"assets.not_found", …,"素材 … 不存在"} | 404 |
按「归属账户」隔离:别人的素材 ID 在你这儿一律 404,答复与「不存在」刻意不区分
(否则就能靠错误文案枚举别人有哪些素材)。删掉之后再用那个 asset:// 建单,建单 200、3.1 秒后 failed:
{"id":"video_3a8d4fb6e58b4d729bed44c61b30196b","object":"video","status":"failed", …,
"error":"[400 Bad Request] {\"code\":\"modality.asset.parse_failed\",
\"params\":{\"code\":\"modality.invalid_request\",\"detail\":\"asset not found: asset-omni-f525…\"},
\"message\":\"素材引用解析失败:asset not found: …\"}"}
素材库的限制(它是「内联」,不是「大文件托管」)
| 项 | 值 |
|---|---|
| 单件上限 | 逐类型:图 30 MB / 视频 50 MB / 音频 15 MB(base64 解码后的字节数) |
| 请求体上限 | 72 MB(base64 比原文件大约 1/3,由「最大单件 50 MB」推出) |
| 超限表现 | 413(正文为空)—— 是请求体上限挡下的,不是业务错误 |
| 判型 | 按内容魔数,不按文件名后缀。伪装后缀会被拒 |
注意 72 MB ≠ 官方那个 64 MB:官方的 64 MB 管的是「生成请求里内联素材总量」; 本接口的请求体里只有一件素材,所以它的上限由「最大单件」推出来。混用一个数会让 50 MB 的视频永远传不上来(它的 base64 是 66.7 MB)。
5.6 三条已知边界(挑素材前先知道)
- 真人像会被上游拒:
InputImageSensitiveContentDetected.PrivacyInformation(“may contain real person”)。 真人素材必须用上游授权的素材库,URL 绕不过这道闸。 - 要位图格式:SVG 返
InvalidParameter.UnsupportedImageFormat。 - URL 必须上游抓得到:抓不到的表现是
resource download failed。先在你自己的机器上curl一遍确认可达,再提交。
真实样本:URL 抓不到时,作业长什么样(2026-11-05)
# 请求:content 里给了一个不存在的音频 URL
POST /v1/videos → 200 queued (187 ms,拿到了 job id)
# 4.3 秒后 GET
{"id":"video_7d5538fa64014f3cbfb32ad3d7986c89","object":"video","status":"failed",
"model":"minimax-h3-hyper","created_at":1793861235,
"error":"[400 Bad Request] Upstream error [400]: 远端 H3 拒绝提交 HTTP 400 Bad Request:
{\"error\": {\"message\": \"取素材失败 https://example.com/a.mp3:HTTP Error 404: Not Found\"}}"}
这也是「音频不能单独给」那条限制没有被建单拦住的证据:请求先过了网关,到节点取素材时才失败。 换成真实可达的音频后,节点才会判「音频不能单独给」。
6风格画风(loras)
一次请求可以让成片带上某种画风 —— 赛璐璐、水墨、90 年代港片、霓虹赛博、像素、子弹时间……
而不用改提示词。做法是在建单请求里加一个 loras 数组。目前 45 种(清单见 附录 A)。
6.1 形状
{
"model": "minimax-h3-vdn",
"prompt": "一只橘猫在阳光下的花园里奔跑,电影感",
"duration": 4,
"resolution": "480p",
"ratio": "16:9",
"loras": [{"id": "style_sumi_ink", "scale": 0.9}]
}
| 字段 | 必填 | 说明 |
|---|---|---|
loras | — | 数组,最多 3 件。每项 {"id": "…", "scale": …} |
loras[].id | ✅ | 画风 ID,必须在附录 A 清单里(或先查 GET /v1/loras)。只收 id |
loras[].scale | — | 强度 0.0–2.0。不传用该画风的推荐值(多数 0.9–1.1)。0 = 不挂 |
path / url | ❌ | 一律拒绝:只接受 id,不接受任何外部地址或文件路径。要新增画风请联系我们 |
style(单件简写) | — | "style":"style_sumi_ink" 或 {"id":…,"strength":0.8},与 loras 等价。不要两个一起给 |
6.2 目录:GET /v1/loras(公开,不需要 Key)
curl -s https://api.123all.cn/v1/loras # 可加 ?model=minimax-h3-vdn 只看某条通道能用的
{
"object": "list",
"max_loras": 3,
"data": [
{"id": "anime2d", "name": "2D Anime Cel-shading", "trigger": "2danime",
"prepend_trigger": true, "strength": 0.9, "base": "minimax-h3-fl2va", "available_on": 3},
{"id": "style_sumi_ink", "name": "Sumi-e Ink Wash", "category": "illustration",
"trigger": "A sumiink painting style animation", "prepend_trigger": true,
"strength": 0.9, "strength_range": [0.5, 1.3], "base": "minimax-h3-fl2va", "available_on": 3}
…
]
}
实测 2026-11-05 · 395 ms · 45 条 该接口实测 < 1 秒,可放心在选风格时实时调用。
available_on 是有几台服务器装了这个画风 —— 不是每台都有,下单前用它判断更稳。
| 字段 | 含义 |
|---|---|
id / name / category | 就是 loras[].id;名称与分类便于做选择界面 |
strength | 推荐强度 —— 不传 scale 时用它 |
strength_range | 建议区间(一般 0.5–1.5;最终允许 0.0–2.0) |
trigger / prepend_trigger | 绑定这个词画风才明显生效;服务端会自动前置到你的 prompt,你不用写 |
base | 该画风面向哪个视频模型,一般不用管 |
max_loras | 一次请求最多几件(当前 3) |
6.3 会慢多少(这决定你的超时)
| 情况 | 4 秒片 / 480p |
|---|---|
| 不带画风 | 约 50–75 秒 |
| 带 1 种画风(单发参考) | 约 80 秒(2026-10-31 实测) |
带 1 种画风(style 简写,与另外 3 单同时提交) | 113.7 秒(2026-11-05 实测) |
| 带 1 种画风(2026-11-05,三单并发) | 216.5 秒 —— 排在前两单后面,说明排队占了大头 |
| 带 2–3 种画风 | 更久;按 ≥6 分钟设超时 |
不要按无画风那条数设 60 秒超时,否则会超时重投、把队列排得更长(§3.4)。
6.4 不会因为「画风鲜艳」被判成坏片
出库质检只拦「画面真的坏了」(结构破损、音频静音/爆音、片头未收敛等),不会因为画风饱和度高就拒付。 已实测:水墨、赛璐璐、以及 2 件叠加都正常交付。
「画面偏蓝/偏暗」这类内容本身也不会被判失败(2026-11-03 起):判据比的是这条片自己的底色 ——
只有「某几帧明显比全片更蓝」(解码分块写坏)或「整段色彩崩塌」才拦。水下、夜空正常交付(实测 blue_excess 33.9 也放行),
只在 qc 里留一条告警。
6.5 支持范围与限制
| 项 | 说明 | 2026-11-05 实测 |
|---|---|---|
| 哪些通道能用 | 两条 minimax-h3-* 都能;doubao-seedance-* 不支持 | — |
| 同时几件 | 最多 3 件 | 4 件 → 建单 400「最多 3 个 LoRA(收到 4 个)」 |
| 强度范围 | 0.0–2.0 | scale: 3 → 建单 400「scale=3 越界(0.0–2)」 |
| 只收 id | 给 path / URL 一律拒 | 建单 400「loras 只接受 `id`(节点已安装的风格);任意 URL/路径一律拒绝」 |
| id 不存在 | 可用清单随上线变化 | 建单 200 → 6.2 秒后 failed:{"code":"LORA_UNKNOWN","message":"本节点没有 'style_not_exist'(已安装:anime2d, …)"}(先查 GET /v1/loras) |
style 与 loras 同时给 | 文档要求只给一种 | 建单 200(不会拒),这条最后因片头未收敛没过质检 —— 组合语义未背书,别依赖 |
| 与其它参数 | 与分辨率、画幅、时长、首尾帧、参考素材都不冲突,可一起用 | — |
scale 先按推荐值单件的效果最可预期。2–3 件叠加只做过「跑通 + 过闸」,没做过审美评估,组合可能互相抵消或过饱和;
叠加时建议每件 0.6–0.8。附录 A 里每个画风的预览样片是原作者用别的工具跑的,
拿来选风格有用,但不要期待我们的成片与它逐帧一致。
7作业与状态机
7.1 状态机(status 只有这几种)
status | 额外字段 | 含义 | 计费 / 配额 |
|---|---|---|---|
completed | url;通过质检时带 qc | 出片并交付 | 记 1 次 |
failed | error:"[<上游HTTP码>] <原因>",H3 通道还会带 (stage=…) |
出片失败(上游拒了 / 超时 / 服务端内部出错 / 质检未过) | 不计 |
qc_failed | error(可能为空)+ qc | 片子出来了,但出库质检不放行 ⇒ 不交付 | 不计 |
cancelled | — | 你自己撤的单 | 不计 |
qc_failed 是终态,必须算进轮询终止条件它不是「出错了」,而是「这条片没过我们的出库闸门、我们不交付给你」。不计费、不吃配额,重投是合理的(换种子 / 换参考素材)。
只认 completed / failed 两个终态的客户端,会在 qc_failed 上一直轮询到超时。
7.2 一个真实的 completed 作业对象
{"id":"video_3f9371a03b7747ecb63f73f9e4a33a2d","object":"video","status":"completed",
"model":"minimax-h3-hyper","created_at":1793861261,
"qc":{"verdict":"Pass","sobel_mean":13.221747935070395,"blank_frac":0.0,
"freeze_diff":16.381418099647266,"lap_var":917.1291633923171,
"soft":false,"frames_sampled":8,"clipped_samples":0,"clipped_ratio":0.0,"notes":[]},
"url":"/v1/videos/video_3f9371a03b7747ecb63f73f9e4a33a2d/content"}
这就是 2026-11-05 那条 hyper/480p/16:9 的作业,原样拷贝(只折了行)。
7.3 qc 字段的含义(别拿错指标做判据)
| 字段 | 含义 | 参与判定? |
|---|---|---|
verdict | "Pass" / "Fail" | — |
blank_frac | 采样帧里「整帧空白(纯色/黑屏)」的占比 | ✅ 超 0.5 ⇒ Fail |
freeze_diff | 相邻采样帧的平均绝对差(越小越像冻结) | ✅ < 1.0 ⇒ Fail |
clipped_ratio / clipped_samples | 音频满幅样本占比 / 计数 | ✅ 超 0.06 ⇒ Fail |
lap_var / soft | 画面软硬;soft=true 只表示「偏软」 | ❌ 只告警 |
sobel_mean | 全帧平均梯度(历史指标,仅为连续性保留) | ❌ 不参与 |
frames_sampled / notes | 采样帧数 / 人可读备注 | — |
不要拿 sobel_mean 做自己的判据(它不决定 Pass/Fail),也别把 soft=true 当成「片子不合格」——
它只是提示「细节偏软,建议目检」。
7.4 failed 的 error 怎么读
- 以
[数字]开头,那个数字是上游 HTTP 码:[400]上游拒收、[502]服务端临时故障、[504]上游超时。分支判这个前缀,别匹配后面的中文。 - H3 出片链失败时,末尾会带
(stage=…),值可能是generating/upscaling/quality/ref2va_prep/delivered。 它只是诊断用,别按它分支——我们会加新值。 - 同一句里的中文阈值(如
0.6014 < 0.8)是当次判据的现场值,不是契约。
真实样本:质检不放行(qc_failed)长什么样(2026-11-05)
{"id":"video_1916d5c5278047c99d3ce76e9be11d54","object":"video","status":"qc_failed",
"model":"minimax-h3-hyper","created_at":1793861658,
"error":"[502 Bad Gateway] Upstream error [503]: 远端 H3 出片失败(stage=quality):
出库质检未过:edge_luma_ratio=0.011 < 0.4(片头亮度只有片尾的 1%:从近黑爬出/整片未收敛)"}
这条跑了 372.3 秒才判 qc_failed —— 再次说明超时窗口要按分钟级设。
它不交付、不计费、不吃配额;重投(换种子/换参考素材)是合理动作。
真实样本:质检不放行的 failed 长什么样(2026-10-22)
[502 Bad Gateway] Upstream error [503]: 远端 H3 出片失败(stage=quality):
出库质检未过:tail_over_mid_norm=0.1782 < 0.8(对比度归一化后的尾/中清晰度;原始 tail/mid=0.11)
质检不放行的原因有四族:清晰度类、片头未收敛类(edge_luma_ratio)、分块解码损坏类(grid_blockiness_p95)、
音频类(audio_rms / audio_clip_frac)。四类都是「这条片我们不交付」,重投(换种子/换参考素材)是合理动作。
7.5 轮询建议
不要在客户端做忙等。queued 阶段可能持续数十秒,但慢的是生成段,不是排队。
参考类作业建议同时只留 1 个在途(与其它形态交替会更慢,§3.4)。
8取片
GET /v1/videos/{id}/content
Authorization: Bearer sk-omni-…
| 返回 | 含义 |
|---|---|
200 + video/mp4 | ✅ 直接是文件流 |
307 → 200 video/mp4 | ✅ Location 指向一个带签名的地址,跟随即可(外购通道) |
409 | 还没出片:作业 <id> 还没有产物(当前状态 in_progress) |
404 | 没有这个视频作业: <id> |
401 | 没带 / 带错 Key(正文是 JSON,见 §2.3) |
真实响应头 实测 2026-11-05:
HTTP/1.1 200 OK
Content-Type: video/mp4
Content-Length: 4035364
8.1 url 字段的两种形态(别当长期地址)
| 模型 | url 长什么样 | 怎么用 |
|---|---|---|
minimax-h3-* | 相对路径 /v1/videos/<id>/content | 要带鉴权头请求;本质就是 /content 那条路 |
doubao-seedance-* | 带签名的临时链接(…tos-cn-beijing.volces.com/….mp4?X-Tos-Signature=…) | 直取 200 / video/mp4,约 24 小时失效 |
三条纪律:
- 优先用
/content:形态统一、长期有效、带你自己的鉴权。 - 若图省事直接用
url,请当天转存到自己的存储,别把链接存进数据库长期用。 - 无论如何,拿到片子就转存,不要长期依赖我们这侧的链接。
8.2 同步模式(background:false)的响应是另一种形状
{"model":"minimax-h3-hyper",
"data":[{"url":"http://<成片主机>/v1/artifacts/video/2026-09-23/video_76278e….mp4",
"duration_secs":4.0,
"thumbnail_url":null}]}
- 没有作业 id —— 同步模式一次性把结果给你,之后无法用
/v1/videos/{id}查或/content取。 url是直链,主机是IP:端口(在对客域名之外),境内客户不一定连得上。 把路径接到对客域名上即可:https://api.123all.cn/v1/artifacts/video/…/xxx.mp4(实测 200 /video/mp4)。- 一次请求是一条挂住的长连接(实测 84 秒 /
hyper+480p;慢档 3 分钟以上)。除脚本化场景外请用默认异步。
8.3 ⛔ 最常见的坑:把错误体当成片子写进文件
curl -o out.mp4 "…/content"
# 401 时:文件写成功、退出码 0
# out.mp4 内容是:
# {"code":"modality.key.denied",…}
curl -fL -o out.mp4 "…/content" -H "Authorization: Bearer $KEY"
# 出错时 curl 退出 22,一个字节都不落盘
file out.mp4 # ISO Media / MP4
根因:curl -o(不加 -f)会把任何 4xx/5xx 的响应体原样写进目标文件并返回 0。
2026-10-14 实测复现:$KEY 未设置时 header 退化成 Bearer (等同空)⇒ 服务端回 401 + JSON
({"code":"modality.key.denied",…}),-o 把它整段写进文件。
核 Content-Type: video/mp4(或 file 报 MP4 / ftyp),别把「有文件了」当成「拿到片子了」。
客户端在写盘前应该同时核 状态码与 Content-Type。
8.4 成果物直链是「知道就能下」的
实测把 url 的路径直接拼到对客域名上(https://api.123all.cn/v1/artifacts/…),
不带任何鉴权头也是 200。链接里是一段随机 ID,别人猜不到,但你把它外发出去就等于把片子外发出去。
需要「只有我能取」的效果,请用 /content(它要你的 Key)。
8.5 附:列出自己的作业(实测可用)
GET /v1/videos?limit=3 # limit 1–100,默认 20;只返回这把 Key 归属的作业,最新在前
→ {"object":"list","data":[{…作业对象…}],"count":3}
2026-11-05 实测 200。用途:客户端崩了/重启后,按它核对「我到底建了哪些作业」, 不用逐 id 盲查。作业记录会落盘保留(没有官方的 7 天窗口),但也别当长期存储 —— 片子请及时取走。
9取消作业
DELETE /v1/videos/{id}
| 返回 | 含义 | 计费 |
|---|---|---|
200 + status:"cancelled" | 撤单成功。排队中与出片中都能撤 | 不计费、不吃配额 |
200 + status 原样(如 "completed") | 作业已经终结,撤单是幂等的空操作(回显当前状态,不会改成 cancelled) | 按原终态 |
404 modality.job.not_found | id 不存在(或不属于这把 Key) | — |
503 / 502 | 撤单请求发不到出片节点(网络/重启窗口)。作业可能仍在跑,稍后重试同一个 DELETE | — |
真实样本:对一个已完成的作业撤单(2026-11-05)
DELETE /v1/videos/video_3f9371a03b7747ecb63f73f9e4a33a2d → 200
{"id":"video_3f9371a03b7747ecb63f73f9e4a33a2d","object":"video","status":"completed",
"model":"minimax-h3-hyper","created_at":1793861261,
"qc":{…},"url":"/v1/videos/video_3f9371a03b7747ecb63f73f9e4a33a2d/content"}
没有把它改成 cancelled,也没有因此扣费 —— 这就是幂等。
9.1 撤单是真的会停 实测 2026-11-03
| 时机 | 服务端做什么 | 实测 |
|---|---|---|
| 还在排队 | 直接从队列摘掉,永远不派发 | 撤完 2 秒后 GET 就是 cancelled |
| 已经开始出片 | 通知出片节点杀掉引擎进程树(不是只标记) | 撤单后 ≤1 秒进程消失、队列清零;GET 回 cancelled |
| 已经终结 | 幂等:回显原状态 | 已完成单撤两次都是 200 + completed |
三条使用建议:
- 撤单成功后请以
GET的status为准,不要假定就是cancelled(可能已经completed)。 - 撤单幂等:同一个 id 反复撤都是
200,重试不会报错。 - 撤单不回滚已交付的片子:如果
GET已经是completed,/content照样能取 —— 那是你付过的那一单。
10错误码
错误分两类,形状不同。先说这条,因为它比下面任何一张表都更常踩: 只判「建单 200」会把全部异步失败漏掉。
HTTP 状态码不是 200,正文是结构化的
{"code":"modality.…","params":{…},"message":"…"}。
code 是稳定标识(用它分支),message 是给人读的中文(会改)。
建单拿到的是 200 + status:"queued",失败发生在后面。
HTTP 早就结束了,结论落在作业对象的 status / error / qc 上。
10.1 2026-11-05 实测总表(公网域名,逐条投出来的)
| 场景 | HTTP | code | 耗时 |
|---|---|---|---|
没带 Authorization | 401 | modality.key.denied | 141 ms |
| Key 错 / 停用 / 超额 | 401 | modality.key.invalid | 143 ms |
少 model 字段 | 422 | request.missing_field | 188 ms |
prompt 与 content[] 都空(含 content: []) | 400 | modality.content.prompt_empty | 154 ms |
content[] 有图 + 扁平 first_frame_image | 400 | modality.content.mixed_forms | 137 ms |
resolution: "999p" | 400 | modality.resolution.unknown | 142 ms |
ratio: "2:1"(协议外) | 400 | modality.video.param_invalid | 171 ms |
ratio: "5:4"(协议外) | 400 | modality.video.param_invalid | 156 ms |
loras 给了 4 件 | 400 | modality.video.param_invalid | 163 ms |
loras[] 带 path | 400 | modality.video.param_invalid | 158 ms |
loras[] 的 scale: 3 | 400 | modality.video.param_invalid | 168 ms |
image_url + role: reference_video | 400 | modality.video.param_invalid | 190 ms |
duration: 16 | 400 | modality.duration.out_of_range | 156 ms |
任何 gen(含拼错的键) | 400 | modality.field.unimplemented | 143–161 ms |
callback_url | 400 | modality.field.unimplemented | 143 ms |
写官方模型名 MiniMax-H3 | 403 | modality.key.model_not_allowed | 163 ms |
| 查不存在的作业 | 404 | modality.job.not_found | 145 ms |
| 代理商余额不足(见 §10.6) | 402 | agency.precheck.payment_required | 260 ms |
引用已删除 / 不存在的 asset:// | 200 → failed | 作业 error 里的 modality.asset.parse_failed | 3.1 s |
| 素材 URL 抓不到(本次给的是不存在的音频) | 200 → failed | 作业 error:取素材失败 … HTTP Error 404 | 4.3 s |
10.2 建单即拒(A 类)· 原文逐条
下面每一条都是 实测 2026-11-05 的原样正文(只做了换行)。拿不到 job id 的都是这一类。
401 / 403 / 422
# 没带 Authorization
{"code":"modality.key.denied","params":{"detail":"出片接口需要有效凭据:license JWT / 登录态 JWT / 未过期且未超额的 sk-omni API key"},"message":"出片接口需要有效凭据:…"}
# Key 错
{"code":"modality.key.invalid","params":{},"message":"API key 无效、已停用、已过期或已超额"}
# 写了官方模型名
{"code":"modality.key.model_not_allowed","params":{"model":"MiniMax-H3","allow":"minimax-h3-*,doubao-seedance-*"},"message":"该 API key 不允许使用模型 MiniMax-H3(白名单:minimax-h3-*,doubao-seedance-*)"}
# 少 model
{"code":"request.missing_field","params":{"field":"model"},"message":"Failed to deserialize the JSON body into the target type: missing field `model` at line 1 column 38"}
400 · 文本 / 图入参 / 档位 / 画幅
# prompt 空且 content[] 也空(content: [] 等于没给)
{"code":"modality.content.prompt_empty","params":{},"message":"prompt 为空且没有 content[] —— 用 prompt 给文本,或走 ark 风格的 content[](文本放在 text 项里)。空提示词只会生成噪声"}
# 图两种写法混用
{"code":"modality.content.mixed_forms","params":{},"message":"content[] 里已经有图片,同时又给了 first_frame_image 这类扁平字段 —— 只用一种写法(挑一个会让另一半静默失效)"}
# 档位不在枚举里
{"code":"modality.resolution.unknown","params":{"raw":"999p","available":"480p, 768p, 768p_native, 1080p, 2k","suggestion":"768p"},"message":"未知出片档 resolution=999p。可用:480p, 768p, 768p_native, 1080p, 2k(建议 768p;如需 999p 请等上游开闸后重试)"}
# 画幅协议外
{"code":"modality.video.param_invalid","params":{"model":"minimax-h3-hyper"},"message":"未知画幅 ratio=2:1。可用:16:9, 21:9, 4:3, 1:1, 3:4, 9:16(adaptive 按 16:9 处理)"}
400 · loras / role / duration
{"code":"modality.video.param_invalid","params":{"model":"minimax-h3-hyper"},"message":"最多 3 个 LoRA(收到 4 个)"}
{"code":"modality.video.param_invalid","params":{"model":"minimax-h3-hyper"},"message":"loras 只接受 `id`(节点已安装的风格);任意 URL/路径一律拒绝"}
{"code":"modality.video.param_invalid","params":{"model":"minimax-h3-hyper"},"message":"style_sumi_ink: scale=3 越界(0.0–2)"}
{"code":"modality.video.param_invalid","params":{"model":"minimax-h3-hyper"},"message":"content[0] 的 role=reference_video 不认。可用:first_frame, last_frame, reference_image"}
{"code":"modality.duration.out_of_range","params":{"model":"minimax-h3-hyper","lo":4.0,"hi":15.0,"secs":16.0},"message":"minimax-h3-hyper 的成片时长必须在 4–15 秒之间,收到 16"}
400 · 官方有、我们不做(gen / callback_url / aigc_watermark / extra)
{"code":"modality.field.unimplemented",
"params":{"fields":"`gen`(`steps` / `video_shift` / `audio_shift` / `sigma_grid` / `lora_schedule` / `f32_compute`):这些是**节点侧调参**,对外通道不转发 —— 收下只会让它静默不生效。画质档位请用 `resolution` + `loras`;确有需要请找我们开专用通道"},
"message":"请求里有官方支持、但本平台不实现的字段,所以不能收下当没看见:\n - `gen`(…):…\n(这些字段原先会被静默丢弃 —— 你那边看到 200、结果却不对。删掉它们重投即可。)"}
实测:gen 里只放一个拼错的键(steps_typo)也整块被拒,不会静默丢弃。
callback_url 的 fields 会换成它自己的说明(本平台不推送回调,请轮询)。
10.3 三个容易误判的细节
- 白名单先判:写官方模型名
MiniMax-H3会先撞白名单(403),不会走到「400 并列出本机名字」。 - 档位/时长越界是建单同步 400,不会「200 之后 failed」——拿不到 job id,所以重试逻辑别写成「建单成功后轮询到 failed」。
- 404 有两种原因,刻意不区分:① id 写错;② 作业在途时赶上我们升级重启(在途作业表在内存里,重启即丢)。 后者不计费、不吃配额,重新提交即可。拿不准就把 id 给我们查。
10.4 建单 200 → 数秒 failed(B 类):剩下这两族
2026-11-03 起,网关在排队之前先跑一遍 provider 的参数解析(content[] 形状 → 提示词/帧数 → 档位 → 画幅 → 画风)。
所以参数层面的错误全都提前成同步 400 了。仍然会走到「200 → failed」的,是必须拿到素材才能判的那两族:
| 族 | 典型场景 | 实测 | 终态 error |
|---|---|---|---|
| 素材解析 | asset:// 不存在 / 已删除 / 前缀写错;URL 上游抓不到 |
3.1 s / 4.3 s | [400 Bad Request] …取素材失败 …404 或 modality.asset.parse_failed |
| 模态组合 | 只有参考音频、没有图/视频;首尾帧与参考混用;参考素材超配额 | 数秒(本次因素材先取不到而未走到这一步) | [400] …参考音频不能单独给… / …不能与 first_frame / last_frame 混用… |
旧版文档把「role 与 type 不搭」也归在这一类(200 → 5.5 秒 failed)。2026-11-05 复测:它现在是建单同步 400
(见 §10.2 的原文)。所以判断方式仍是那一句:看终态;但别再用「建单 200 = 参数没问题」去推 B 类。
10.5 gen 与「官方有、我们不做」的字段
这条值得单独说,因为它从「静默忽略」改成了「当场 400」,而且理由与客户直接相关:
为什么不收下当没看见:这些值确实会改变采样网格 / 画质 / 时长语义。收下当没看见的表现是
「我明明传了 steps=12,出片却按 8 步跑」—— 客户没有任何线索知道参数没生效,只会觉得「这参数没用」。
同理,收下 callback_url 会让客户白等一个永远不来的回调。
| 字段 | 我们 | 说明 |
|---|---|---|
gen(steps / sigma_grid / lora_schedule / f32_compute / video_shift / audio_shift) |
❌ 400 | 节点侧调参,对外通道不转发。要调画质请用 resolution + loras |
同族顶层简写(steps / video_shift / …) | ❌ 400 | 同上 |
callback_url | ❌ 400 | 本平台不推送状态回调(官方那条还带 challenge 握手)。请轮询 |
aigc_watermark | ❌ 400(传 false 可以) | 我们不在成片里加水印;标识请在拿到成片后自行叠加 |
extra(提示词扩写) | ❌ 400 | 本平台不做提示词扩写 |
其余完全没声明的键(客户自带的元数据)仍按「不报错也不生效」处理 —— 这一类我们不做判断。
10.6 402:代理商余额预检(本页新增)
用代理商绑定的 Key 建单时,网关会先问一次权威「这家代理商还付得起吗」。付不起就在建单时直接 402,
不建作业、不计费、也不吃配额。此时 verify 仍然回 active:true —— 402 不代表 Key 无效。
HTTP/1.1 402 Payment Required
{"code":"agency.precheck.payment_required",
"params":{"reason":"代理商 <你的代理商> 余额 … CP,未结欠账 … CP,结清后不足以出一片(下限约 200 CP),请上级充值"},
"message":"…(与 reason 同文)"}
它发生在参数校验之前(实测:同一把 Key 下 resolution:"999p" 得到的是 402 而不是 400;
而 content[] 与扁平字段混用这种基础形状校验仍会先报 400)。所以排障顺序是:
先看余额/欠账,再看参数。
- 处置:联系上级充值 / 结清欠账;或改用平台预付费配额(
quota > 0的 Key)。 - 不要重试 —— 重试不会改变余额。
10.7 code 的命名族(按前缀分支,不要逐个硬编码)
code 是稳定的,message 会改 —— 按前缀族写,我们加新码时你的逻辑不会漏。
| 前缀 | 含义 | 你的处置 |
|---|---|---|
modality.key. | Key 无效 / 停用 / 模型不在白名单 / 缺 scope | 别重试,查 Key 或找我们开白名单 |
modality.content. / modality.field. | content[] 与扁平字段的写法问题;不实现的字段 | 别重试,照 message 改请求 |
modality.duration. / modality.resolution. | 时长 / 档位越界或不支持 | 别重试,改参数(message 里点了具体值) |
modality.video.param_invalid | 画幅 / 画风 / role 等参数形状问题 | 别重试,照原文改 |
modality.asset. | 素材库条目不存在 / 不是你 / 解析失败 | 别重试,先确认素材 |
modality.job. | not_found(不存在或重启丢了)/ no_artifact(还没好,配 409) | 视情况重投;no_artifact 继续轮询 |
modality.provider. | 本部署没有出片能力 / 对应方拿不到产物 | 别重试,找我们 |
agency.precheck. | 代理商余额/欠账不足(§10.6) | 充值/结清,别重试 |
LORA_* | 画风相关(不带 modality. 前缀)。形状错误已提前成建单 400;LORA_UNKNOWN 等仍在作业 error 里 | 先查 GET /v1/loras |
modality.cluster. / modality.vram. / modality.model.fused | 内部码(集群鉴权 / 资源 / 模型熔断) | 不该出现在你的响应里 —— 出现即找我们 |
10.8 重试原则
| 类别 | 可重试? | 做法 |
|---|---|---|
502 / 504(上游临时故障、升级窗口) | ✅ | 退避重试。遇 502 先等十几秒再重投,别在重启窗口里连打 |
400 / 403 / 404 / 422 | ❌ | 请求本身的问题,重试没有意义 |
401 | ❌ | 先查 Key(§2.2) |
402 | ❌ | 余额/欠账(§10.6) |
409 还没有产物 | ⏳ | 继续轮询 |
别拿高频重试当兜底 —— 它会把队列顶长,让包括你在内的所有单都更慢。
11配额与计费
11.1 配额:每把 Key 200 次(按终态计)
| 终态 | 计数 | 计费 |
|---|---|---|
completed | 记 1 次 | 按秒、按档位 |
failed | 不记 | cost=0 |
cancelled | 不记 | cost=0 |
qc_failed | 不记 | 没有交付 ⇒ 不计 |
- 在途不计数 ⇒ 并发提交会短暂超发:在途的不占额度,等它们各自进终态才一起记上。需要硬性瞬时限流请告诉我们(当前实现做不到)。
- 既然失败不吃次数,别拿配额当防护网去挡垃圾请求 —— 挡不住,那是限流该干的事。
- 配额用尽后,调用返回
401 API key 无效、已停用、已过期或已超额。 quota: 0在verify里的含义是不限次、按量后付(走代理商钱包),不是「不能用」。
11.2 计费:两个最容易踩的点
落在 bound_account_id 那个账户上,只对真正出片的作业计费。费率按秒、逐通道逐档不同,以费率卡为准。
minimax-h3-* 没有 480p 档 —— 传 480p 按 768p 档计费例:minimax-h3-hyper 4 秒 / 480p = ¥0.50/秒 × 4 = ¥2.00。
写一个新的分辨率之前,先问我们会落到哪一档 —— 不写清会让按 ¥0.02 做预算的客户收到 ¥2.00 的账单。
本文件 2026-09-24 版在这里写过一个「4 秒 / 480p = 2 CP(≈¥0.02)」的示例,那是错的(差了 100 倍)。 2026-10-10 已按费率卡更正为上式,并把「480p 落 768p 档」写明。
verify 的 consumed 可以看大概进度:它最终一致(同步有延迟),别拿它当精确对账依据。
要精确用量请找我们对账。
12与官方 MiniMax H3 API 对照
我们的两条 minimax-h3-* 通道逐字段对齐官方《创建视频生成任务》/《查询任务》,
但有四处刻意不同(下面每处都写了为什么)。照着官方样例代码改,通常只改 model 名与 base_url 就能跑。
官方参考: MiniMax 开放平台 · 视频生成 · 火山方舟 · 视频生成(seedance 那条通道的上游)。
12.1 官方口径速查(摘自官方《MiniMax H3 模型使用手册》)
- 时长 4–15 秒;帧率 24 fps
- 所有结果全部带声音(原生双声道)
- 768p 档:短边 768;16:9~9:16 之外按“约 1M 像素”重算(21:9 = 1536×672)
- 1440p 档同理(21:9 = 2976×1248)
- 官方手册用「768p / 1440p 两种模式」描述;我们的档位名是
480p/768p/768p_native/1080p/2k(§3.2),两套名字不要混用,按本页表取档
- 首/尾帧:图 0–2 张;单边 256–5760 px
- 全能参考:图 ≤9、视频 ≤3、音频 ≤3,合计 ≤12
- 视频单段 2–15 s、总 ≤15 s;音频同理,且必须配图或视频
- 单个素材上限:视频 50 MB / 图 30 MB / 音频 15 MB
- 提示词 ≤ 7000 字符;API 请求体 64 MB(官方建议素材用 URL)
12.2 逐字段对照(请求体 / 查询体 / 错误体)
| 官方字段 | 我们 | 说明 |
|---|---|---|
model | ⚠ 名字不同 | 官方 MiniMax-H3 / MiniMax-H3-Max;我们按出片档命名 minimax-h3-vdn / -hyper。
写官方名字先撞白名单(403),不会静默换档出片。 |
content[] | ✅ | text / image_url / video_url / audio_url 四种元素与 role 枚举逐字一致 |
content[].text | ✅ | 单个 ≤7000 字符;必须有一个非空 text(或等价的扁平 prompt) |
image_url.url | ✅ | 公网 URL / data:image/<fmt>;base64, / mm_file://<我方素材ID> |
video_url.url / audio_url.url | ✅ | 同上三种形态(data:video/mp4;…、data:audio/…) |
| 图片规格 | ✅ + 超集 | 官方六种格式,我们另收 gif / bmp;≤30 MB;单边 256–5760;比例 0.4–2.5 |
| 视频规格 | ✅ | mp4 / mov;≤50 MB;单段 2–15 s 且总 ≤15 s;单边 256–5760;比例 0.4–2.5;23.976–60 fps |
| 音频规格 | ✅ | wav / mp3;≤15 MB;单段 2–15 s 且总 ≤15 s |
| 参考配额 | ✅ | 图 ≤9 / 视频 ≤3 / 音频 ≤3,合计 ≤12;音频不能单独给 |
| 首尾帧与参考互斥 | ✅ | 出现任一 reference_* 就不能再出现 first_frame / last_frame |
| 请求体总量 | ✅ | 内联(data URL)总量 ≤64 MB,超出请改用公网 URL |
resolution | ✅ 大小写不敏感 | 官方写 768P / 2K,我们表里写 768p / 2k,两种都收;另收 720p 作为 768p 别名。
我们多两个档:768p_native / 1080p。 |
| ↳ 官方按模型分档 | ⚠ 我们不分 | 官方把档位绑在模型上(H3 是 768P/2K,H3-Max 是 480P/768P、不支持 2K);
我们按通道分,两条通道都是完整五档 —— 所以「H3-Max 没有 2K」这条在我们这里不成立。 |
duration | ⚠ 有下限差 | 官方 4–15 s(H3-Max 是 5–15、不支持 4 s);我们两条通道都收 4–15。
但成片帧数下限 124(≈5.17 s),4–5.17 秒的请求会被抬到 5.17 s。响应里的 duration 是你要的那个数。 |
| ↳ 必填性 | ⚠ 我们更宽 | 官方必填四项:model / content / resolution / duration;
我们只要求 content 里有一个非空 text(或扁平 prompt)。但按实际时长计费,仍建议显式给 duration。 |
ratio | ✅ 六档 + adaptive |
官方 7 档;我们六档全开,adaptive 按 16:9 处理。
唯一差别:官方在图生视频里把 ratio 当 adaptive 忽略,我们不忽略(竖屏就出竖屏)。 |
callback_url | ❌ 400 点名 | 本平台不推送回调(官方那条还带 challenge 握手)—— 收下只会让你等一个永远不来的请求。请轮询 |
aigc_watermark | ❌ 400 点名 | 不在成片里加水印;传 false(官方默认值)可以 |
extra | ❌ 400 点名 | 官方给 H3-Max 的提示词扩写开关,本平台不做 |
响应 task_id | ⚠ 名字不同 | 官方回 {"task_id":"…"};我们回 {"id":"video_…","status":"queued",…}(多给了状态) |
查询体 task.{id,status,…} | ⚠ 形状不同 | 官方是 {"task":{…}} 包一层、状态枚举 queued/running/succeeded/failed/cancelled;
我们是平铺的作业对象、状态枚举 queued/in_progress/completed/failed/cancelled/qc_failed。 |
查询体 usage | ⚠ 尚未对客开放 | 我们已按官方口径算出({total,input,output}_seconds + input_image_count,有参考音频时再加 input_audio_seconds),
但当前作业对象还不回这个块。别照官方那样读 usage。 |
↳ total_tokens / prompt_tokens / completion_tokens | ❌ 不给 | 官方对视频任务是「按秒/按张折算」出来的,没公布折算比例。与其编一个对不上官方账的折算,不如空着。 |
| 查询窗口 | ⚠ 我们更长 | 官方只保留最近 7 天;我们作业记录落盘保留,老 id 仍查得到 —— 但别当长期存储,片子请及时取 |
| 错误体 | ⚠ 形状不同 | 官方是 {"type":"error","error":{…},"request_id"};我们是结构化 JSON(code/params/message,
见 §10.2 的原文)。两个例外是没有业务层的:边缘 nginx 的 413 与某些 404 是空正文。
按状态码 + code 接;code 缺失时再退化成读正文。 |
12.3 把官方样例迁过来的三步
base_url→https://api.123all.cn;Authorization用发给你的sk-omni-…。model→minimax-h3-hyper(快)或minimax-h3-vdn(画质/参考素材)。- 删掉
callback_url/aigc_watermark/extra,把「等回调」改成「轮询GET /v1/videos/{id}」。
content[] 的写法可以原样搬{"type":"image_url","image_url":{"url":"…"},"role":"first_frame"} 这类结构逐字一致 ——
包括 role 的枚举值。这也是我们收 mm_file:// 的原因:从官方文档抄来的代码不该改。
但注意素材地址只要我们能取到:官方平台的 file-… ID 我们这里无效(§5.4)。
12.4 我们刻意与官方不同的四处(以及为什么)
| 处 | 官方 | 我们 | 为什么 |
|---|---|---|---|
ratio 在图生视频里 | 恒为 adaptive,传别的被忽略 | 照你给的出 | 静默忽略会让你拿到一块与要求不符的画布,而且没有任何提示 |
duration 越低越好 | H3-Max 不支持 4 秒 | 两条通道都收 4 秒 | 但会被抬到 124 帧(5.17 s),见 §4.5 |
| 不实现的字段 | — | 400 点名 | 静默丢弃 = 你以为设上了,成片里什么都不会变 |
| 档位与模型的绑定 | 按模型分(H3-Max 无 2K) | 按通道分,两通道都五档 | 我们的通道背后是不同机器,不是不同「模型版本」 |
13代码示例
13.1 Python(requests,可直接跑)
import time, requests
BASE = "https://api.123all.cn"
KEY = "sk-omni-xxxxxxxx" # 换成你的 Key
H = {"Authorization": f"Bearer {KEY}", "Content-Type": "application/json"}
TERMINAL = {"completed", "failed", "cancelled", "qc_failed"} # qc_failed 也是终态
# ① 提交
r = requests.post(f"{BASE}/v1/videos", headers=H, timeout=60, json={
"model": "minimax-h3-hyper",
"prompt": "一只橘猫在阳光下的花园里奔跑,电影感,浅景深",
"duration": 4,
"resolution": "480p",
"ratio": "16:9", # 竖屏写 "9:16";尺寸见 §3.3
# "loras": [{"id": "style_sumi_ink", "scale": 0.9}],
})
if r.status_code == 402: # 代理商余额预检(§10.6)
raise SystemExit(f"余额不足:{r.text}")
r.raise_for_status()
job = r.json()["id"]
print("job:", job)
# ② 轮询
deadline = time.time() + 420 # ≥6 分钟,别按 60 秒
while True:
body = requests.get(f"{BASE}/v1/videos/{job}", headers=H, timeout=30).json()
st = body["status"]
print("status:", st, round(time.time() - (deadline - 420)), "s")
if st in TERMINAL:
break
if time.time() > deadline:
raise SystemExit(f"客户端超时(作业可能仍在跑):{job}")
time.sleep(6)
if st == "failed":
raise SystemExit(f"作业失败:{body.get('error')}")
if st == "qc_failed":
raise SystemExit(f"未过出库质检(不计费):{body.get('qc')}")
# ③ 取片:用 /content,requests 自动跟随 307
with requests.get(f"{BASE}/v1/videos/{job}/content", headers=H,
timeout=300, stream=True) as resp:
resp.raise_for_status()
ctype = resp.headers.get("Content-Type", "")
if not ctype.startswith("video/"): # 防「2xx 但回的是错误页/JSON」
raise SystemExit(f"取片失败:Content-Type={ctype!r},body 头={resp.text[:200]!r}")
with open("out.mp4", "wb") as f:
for chunk in resp.iter_content(65536):
f.write(chunk)
print("saved out.mp4")
13.2 Node 18+(内置 fetch)
const BASE = "https://api.123all.cn";
const KEY = process.env.OMNI_KEY; // 别把 Key 写进源码
const H = { "Authorization": `Bearer ${KEY}`, "Content-Type": "application/json" };
const TERMINAL = new Set(["completed", "failed", "cancelled", "qc_failed"]);
const created = await fetch(`${BASE}/v1/videos`, {
method: "POST", headers: H,
body: JSON.stringify({
model: "minimax-h3-vdn",
prompt: "夜市摊位,暖色灯光,镜头缓慢横移",
duration: 4, resolution: "480p", ratio: "9:16",
}),
});
if (!created.ok) throw new Error(`建单 ${created.status}: ${await created.text()}`);
const { id } = await created.json();
let job;
const t0 = Date.now();
while (true) {
job = await (await fetch(`${BASE}/v1/videos/${id}`, { headers: H })).json();
if (TERMINAL.has(job.status)) break;
if (Date.now() - t0 > 6 * 60 * 1000) throw new Error(`超时,作业 ${id} 可能仍在跑`);
await new Promise(r => setTimeout(r, 6000));
}
if (job.status !== "completed") throw new Error(`终态 ${job.status}: ${job.error ?? JSON.stringify(job.qc)}`);
const res = await fetch(`${BASE}/v1/videos/${id}/content`, { headers: H }); // 自动跟随 307
if (!res.ok) throw new Error(`取片 ${res.status}: ${await res.text()}`);
if (!res.headers.get("content-type")?.startsWith("video/")) throw new Error("回的不是视频");
const buf = Buffer.from(await res.arrayBuffer());
await require("node:fs/promises").writeFile("out.mp4", buf);
console.log("saved out.mp4", buf.length, "bytes");
13.3 客户端要自己限并发
- 普通
t2va之类:2–3 个在途;ref2va(参考素材):1 个在途。 - 轮询 5–10 秒一次,进终态立刻停。
- 队列是共享且串行的:并发不会更快,只会把队列排长、把每一单都拖慢(§3.4)。
14上线检查清单
- Key 只放在服务端环境变量里;前端/仓库/日志里没有明文(
verify只看active与scopes) - 轮询终止条件包含 4 个终态,特别是
qc_failed - HTTP 超时 ≥6 分钟;轮询间隔 5–10 秒;超时后先按 id 查状态再决定是否重投
- 取片用
/content+ 跟随重定向;写盘前核 状态码 与 Content-Type;curl带-f - 错误分支按
code前缀写;400/402/403/404/422不重试,502/504退避重试 - 素材优先公网 URL;
doubao-seedance-*上绝不用内联 base64 传大于几十 KB 的图 - 参考类作业同时只留 1 个在途;与普通作业交替提交会变慢,已排进超时预算
- 成片落自己存储(
/content或当天转存);没有把url//v1/artifacts/…存进数据库当长期地址 - 画风只用
GET /v1/loras里的id;叠加 2–3 件时scale取 0.6–0.8 - 合规:成片若要对客发布,记得自行叠加「AI 生成」标识(我们不加
aigc_watermark)
15常见问题
Q:响应里 url 是 volces.com 的链接,能直接用吗?
能。那是带签名的临时链接,实测 200 / video/mp4,约 24 小时后失效。
图省事可以用,但请当天转存。稳妥做法是一律用 /content。
Q:url 是 /v1/videos/… 这种半截路径?
那是另一种形态(minimax-h3-* 给这种),需要带鉴权头请求。同样建议直接用 /content。
Q:我下到的 out.mp4 打开是 JSON,内容是 {"code":"modality.key.denied",…}?
那不是片子,是你把 HTTP 错误体整段写进了文件。取片端点带鉴权,凭据缺失/为空时回 401 + JSON;
而 curl -o(不加 -f)会把任何 4xx/5xx 的响应体原样写进文件并返回 0。
修复两条:① 取片加 -f(出错时 curl 退 22 且不落盘);② 客户端写盘前核状态码 + Content-Type。
最常见的触发是 $KEY 没设置(header 退化成 Bearer )。
Q:我选了竖屏(ratio:"9:16"),出来的真是竖的吗?多大?
是,ratio 换的是画布本身。逐档尺寸见 §3.3(承诺值)。2026-11-05 实测:vdn+480p+9:16 交付 480×864。
三点:① 不接受的画幅现在建单就 400;② adaptive 按 16:9 处理;③ 图生视频时官方会忽略 ratio,我们不忽略。
Q:status 一直是 queued 很久?
排队。生成资源是共享的,高峰期排队可能比出片本身更久。轮询间隔 5–10 秒即可。
Q:status 变 failed 了,但建单时是 200?
这仍然可能发生(§10.4):素材解析失败、或在节点上才能判的模态组合。
请看 error 字段,它是原因原文;改完重新提交即可。失败不计费、也不占配额 ——
但仍建议先小样试参数:省的是你能拿到的片子,不是次数。
Q:为什么我的建单回了 402?
代理商余额/欠账预检没过(§10.6)。verify 仍是 active:true 不代表能出片 ——
请上级充值或结清欠账。不要重试。
Q:duration: 4,为什么成片是 5.17 秒?
合法帧数下限是 124 帧(24 fps ⇒ 5.17 s)。4 秒 = 96 帧低于下限,服务端抬到 124 帧。
响应里的 duration_secs 仍回 4.0。要精确控时长用 num_frames: 124(§4.5)。
Q:同一个 prompt 每次出的片不一样?
分情况:minimax-h3-* 不传 seed 时用固定默认种子,所以同一 prompt 反复提交会得到同一条片
(看起来像缓存,其实是确定性生成)。要每次不同请传变化的 seed;要复现就把当时的 seed 记下来。
但「像素级完全一致」不保证:同一 model 背后可能有多台服务器接单,画面内容一致、像素级约 1% 差异。
doubao-seedance-* 的 seed 同样支持,不传由上游决定。
Q:能不能并发提很多作业?
可以,但不建议敞开提:出片资源共享且串行,并发收益不在「更快」,而在「把队列排长」。 而且配额只在交付时计,在途不占额度 ⇒ 并发会短暂超发配额。 建议客户端限并发(普通 2–3、参考素材 1),轮询 5–10 秒。
Q:轮询着突然 404,可我确信刚提交过?
两种可能,我们刻意不区分:id 写错,或者这个作业在途时赶上了我们的升级重启(在途作业表在内存里,重启即丢)。 后者不计费、不吃配额,重投即可。2026-10-13 有一条就是这样丢的:服务端 23:02:07 重启,客户 23:02:08 拿到 502、23:02:14 拿到 404 —— 遇 502 立刻重试前,先等十几秒。
Q:api.123all.cn 和 gateway.123all.cn 有什么区别?
没有区别。 两个域名提供逐字相同的接口与数据:视频、素材、成果物、Key 自检四条路径都在。用哪个都一样。
(旧品牌 qiliqiji.com 在过渡期同样可用,路径与请求体不变。)
Q:素材库传上去的图/视频能复用多少次?限量吗?
不限次。素材是一份字节加一条登记,作业只是引用它。删掉素材之后:已引用它的作业不受影响(片子已经出了),
但新的作业再用那个 asset:// 会 404。
Q:参考视频/音频到底哪些模型收?
三条通道都收三类参考模态(逐条对照见 §4.4)。两条 minimax-h3-* 都收首帧/尾帧/首尾帧;
vdn 上参考素材走 ref2va。唯一不收的是「纯音频」:音频是陪衬(决定音色/语速),主体必须有一张图或一段视频。
Q:我想让片子带某种画风,要怎么写提示词?
不用写提示词 —— 建单时给 loras(最多 3 件),画风由 id 决定,
绑定它的触发词服务端会自动加到 prompt 前面。45 种 id 见 附录 A,用法见 §6。
Q:asset:// 怎么用?
先 POST /v1/assets 传一次(§5.5),拿到 asset://asset-omni-…,之后每个作业的三类素材字段里都能写它。
只用一次的大素材不必走素材库 —— 直接给公网 URL 更快。
Q:Key 泄了怎么办?
立刻联系我们停用并补发。active 会立刻变 false。
Q:从国内访问偶尔打不开?
这是接入侧按 IP/域名的登记状态问题(备案是按「域名 × 接入商」登记的,换接入商后要在新接入商做接入备案), 不是服务端故障。判断方法:我们这边与境外访问都正常,只有境内部分出口失败。遇到请把你的出口 IP 与时间发给我们。
A附录 A · 画风(loras)清单
id 就是 loras[].id。「推荐强度」是不传 scale 时的默认值,范围 0.0–2.0。
触发词由服务端自动前置,请求里不用写;这一列列出来只为让你知道画风是从哪来的。
数据来自 GET /v1/loras 的实时响应 2026-11-05 · 45 条。
| # | id | 名称 | 分类 | 触发词(自动前置) | 推荐强度 | 建议区间 | 装有它的服务器 |
|---|---|---|---|---|---|---|---|
| 1 | style_80s_retroanime | 80s Retro-Futuristic Anime | 动画 / 赛璐璐 | retroanime80sstyle | 1.1 | 1.1–1.1 | 3 |
| 2 | style_anime_irl | Anime IRL | 动画 / 赛璐璐 | ANIRL, anime-rendered face and hair | 1.0 | 1.0–1.0 | 3 |
| 3 | style_anime_shift | Anime Shift | 动画 / 赛璐璐 | The style switch to anime | 1.1 | 1.0–1.2 | 3 |
| 4 | style_cel_shading | Cel Shading | 动画 / 赛璐璐 | Cel Shading Style | 0.9 | 0.8–1.0 | 3 |
| 5 | style_cutesy_pixel | Cutesy Anime Pixel | 动画 / 赛璐璐 | cutesy anime pixel art | 0.9 | 0.8–1.0 | 3 |
| 6 | style_hanafuda | Hanafuda Anime | 动画 / 赛璐璐 | retro anime style including signature art style from thefoodmage hanafuda 2D | 0.9 | 0.8–1.0 | 3 |
| 7 | style_jp_anime_transition | Japanese Anime Transition | 动画 / 赛璐璐 | convert this image to Japanese anime style | 0.9 | 0.8–1.0 | 3 |
| 8 | style_pbr | Stylized PBR | 动画 / 赛璐璐 | PBRSty1e | 0.9 | 0.8–1.0 | 3 |
| 9 | style_sketch_irl | Sketch IRL | 动画 / 赛璐璐 | SKETCHIRL, hand-drawn | 1.0 | 1.0–1.0 | 3 |
| 10 | style_25d | 2.5D Style | 插画 / 绘画 | 2.5d | 0.85 | 0.7–1.0 | 3 |
| 11 | style_astrowitch | AstroWitch Comic | 插画 / 绘画 | ASTROWITCHV01H3 | 0.9 | 0.8–1.0 | 3 |
| 12 | style_crayon | Crayon Drawings | 插画 / 绘画 | crayonstyle | 1.1 | 1.1–1.1 | 3 |
| 13 | style_dan_mora | Dan Mora Chavez | 插画 / 绘画 | In the style of Dan Mora | 0.9 | 0.8–1.0 | 3 |
| 14 | style_digital_art | Digital Art | 插画 / 绘画 | flat cel shading, bold outlines, multi colors | 0.9 | 0.8–1.0 | 3 |
| 15 | style_kreasammelin | KreaSammelin Ligne-Claire | 插画 / 绘画 | kreasammelinstyle | 1.1 | 1.1–1.1 | 3 |
| 16 | style_pc98 | PC-98 Pixel | 插画 / 绘画 | Pixel-art, PC-98, anime-style | 0.9 | 0.8–1.0 | 3 |
| 17 | style_sam_yang | Sam Yang | 插画 / 绘画 | In the art style of Sam Yang | 0.9 | 0.8–1.0 | 3 |
| 18 | style_sumi_ink | Sumi-e Ink Wash | 插画 / 绘画 | A sumiink painting style animation | 0.9 | 0.8–1.0 | 3 |
| 19 | film_16mm_footage | 16mm Found Footage | 胶片 / 影调 | foundfootage16 | 0.9 | 0.8–1.0 | 3 |
| 20 | film_90s_wuxia | 90s Hong Kong Wuxia | 胶片 / 影调 | 90s_wuxia_style | 0.6 | 0.6–0.6 | 3 |
| 21 | style_afterlight | Afterlight | 胶片 / 影调 | Afterlight Style | 1.0 | 1.0–1.0 | 3 |
| 22 | style_authentic_cinematic | Authentic Cinematic Texture | 胶片 / 影调 | DY | 0.6 | 0.5–0.7 | 3 |
| 23 | style_cinematic_astro | Cinematic (ASTRO) | 胶片 / 影调 | ASTROCINEMAV01K2T, K2T | 0.9 | 0.8–1.0 | 3 |
| 24 | style_cinematic_look | Cinematic Look | 胶片 / 影调 | DY | 0.6 | 0.5–0.7 | 3 |
| 25 | style_minidv | MiniDV Nostalgia | 胶片 / 影调 | y2km1n1dv | 0.9 | 0.8–1.0 | 3 |
| 26 | style_cinematic_fantasy | Cinematic Fantasy | 类型片质感 | cinematic fantasy | 0.9 | 0.8–1.0 | 3 |
| 27 | style_creepy_cute | Creepy Cute Magical | 类型片质感 | CreepyCuteMagical | 1.0 | 0.5–1.5 | 3 |
| 28 | style_fallout4_enb | Fallout 4 ENB | 类型片质感 | FO4ENB | 0.9 | 0.8–1.0 | 3 |
| 29 | style_film_noir_selective | Film Noir Selective Color | 类型片质感 | film noir style black and white with selective red | 0.9 | 0.8–1.0 | 3 |
| 30 | style_neon_decay | Cyberpunk Neon Decay | 类型片质感 | neon-decay | 0.9 | 0.8–1.0 | 3 |
| 31 | style_strange_reverie | Strange Reverie | 类型片质感 | StrangeDaal | 1.0 | 0.5–1.5 | 3 |
| 32 | motion_bullet_time | Bullet Time | 运镜 / 动作 | bullet-time | 1.0 | 1.0–1.0 | 3 |
| 33 | motion_camera | Camera Motion | 运镜 / 动作 | camera motion | 0.9 | 0.8–1.0 | 3 |
| 34 | motion_weapon_combat | Weapon Combat | 运镜 / 动作 | BUNNY | 0.9 | 0.8–1.0 | 3 |
| 35 | motion_wushu | Wushu Action | 运镜 / 动作 | kungfu combat | 0.9 | 0.8–1.0 | 3 |
| 36 | style_colordreams | Colordreams | 综合画风 | colorful dreamlike | 0.9 | 0.8–1.0 | 3 |
| 37 | style_plushee | Plushee World | 综合画风 | PLUSH33 | 0.9 | 0.8–1.0 | 3 |
| 38 | ugc_igtiktok | IG/TikTok Aesthetics | 社交平台质感 | tiktok aesthetic | 0.875 | 0.75–1.0 | 3 |
| 39 | ugc_instapic | InstaPic Ultrareal | 社交平台质感 | instapic | 1.0 | 0.8–1.2 | 3 |
| 40 | util_motion_repair | Motion Continuity Repair | 实用工具 | bunny_crisp_motion | 0.8 | 0.6–1.0 | 3 |
| 41 | util_person_remover | Person Remover | 实用工具 | person remover | 0.9 | 0.8–1.0 | 3 |
| 42 | detail_realism_people | Realism People | 细节增强 | present | 0.85 | 0.7–1.0 | 3 |
| 43 | style_dark_moody | Dark and Moody Lighting | 打光 | Dark_and_Moody | 0.85 | 0.7–1.0 | 3 |
| 44 | vr_equi360 | Equirect 360 | 全景 | equirect360 | 0.9 | 0.8–1.0 | 3 |
| 45 | anime2d | 2D Anime Cel-shading | 基础 | 2danime | 0.9 | — | 3 |
1. 先单件、再叠加。 单件最可预期;2–3 件叠加只做过「跑通 + 过闸」,没做过审美评估,组合可能互相抵消。
2. scale 先按推荐值。 高相关度两件叠在一起(比如两种动画风)会把风格推到过饱和;叠加时每件 0.6–0.8。
B附录 B · 实测档案
本页所有「实测」条目都能查到原始记录。日期、条件、判据都写在每一段里 —— 没有写条件数字请不要拿来当容量规划。
B.1 三条成片(2026-11-05 14:47–14:52 +08:00)
| # | 模型 / 参数 | job id | 端到端 | 成片 | ffprobe | 体积 / sha256 前 16 位 |
|---|---|---|---|---|---|---|
| 1 | minimax-h3-hyper480p · 16:9 · duration=4 |
video_3f9371a03b7747ecb63f73f9e4a33a2d | 98.1 s | completed / Pass |
864×480 · 124 帧 · 5.166667 s · 24 fps · AAC | 4,035,364 B / 562ff3b9ff4f10d4 |
| 2 | minimax-h3-vdn480p · 9:16 · duration=4 |
video_203ca3f5492545c6b77d924c51653fd6 | 105.7 s | completed / Pass |
480×864 · 124 帧 · 5.166667 s · 24 fps · AAC | 4,829,051 B / e988b3d62768c235 |
| 3 | minimax-h3-hyper + loras:[{id:"style_sumi_ink",scale:0.9}]480p · 16:9 · duration=4 |
video_3dd972af970649edac31e6e61c7490c7 | 216.5 s | completed / Pass |
864×480 · 124 帧 · 5.166667 s · 24 fps · AAC | 4,645,960 B / a962f589aad32651 |
三单同一秒提交、同一条通道池排队。第 3 单明显更久,主要来自排队与画风资源准备 —— 这正是「并发不加速」的现场证据,不代表带画风的单发耗时(2026-10-31 单发实测约 80 秒)。
B.2 错误面(2026-11-05 14:40–14:52 逐条投出)
完整清单见 §10.1(20 条,另有 4 条画风/空文本类记在 B.4)。采集方式:同一入口、同一公网域名、逐条独立请求,记录状态码 / code / 耗时 / 原文。
建单即拒的那些没有产生 job id,也没有计费;两条「200 → failed」的作业同样不交付、不计费。
B.3 历史实测(引用,未重跑)
| 日期 | 内容 | 用在哪 |
|---|---|---|
| 2026-11-03 | 画幅六档全开 + 各档 × 各画幅尺寸逐像素核对;参数预检前移 | §3.3 / §9.1 / §10.4 |
| 2026-10-31 | 参考素材(ref2va)范围放开;画风上线;「要准备」那一档耗时 | §3.4 / §5 / §6.3 |
| 2026-10-22 | 全档复测(vdn/hyper 逐任务耗时与体积) | §3.4 |
| 2026-10-14 | 「错误体被写进 .mp4」复现(curl 不带 -f) | §8.3 / §1 |
| 2026-09-24 | 生产基线:hyper 103 s / 2,992,008 B;vdn 242 s / 1,757,783 B;seedance 156 s / 1,391,859 B | §3.1(旧基线) |
2026-09-24 那组数字别与 10-22 的混用:服务端之后更新过快的一版,排队与出片都更快了。
B.4 怎么复现(判据都在命令里)
# 0) 自检
curl -s "$BASE/api/v1/reseller/tokens/verify?key=$KEY"
# 1) 提交 → 2) 轮询到终态(脚本见 §1 / §13)
# 判据:GET 的 status ∈ {completed, failed, qc_failed, cancelled}
# 3) 取片并**核内容**
curl -fL -o out.mp4 "$BASE/v1/videos/$JOB/content" -H "Authorization: Bearer $KEY"
ffprobe -v error -show_entries stream=width,height,nb_frames,r_frame_rate:format=duration -of json out.mp4
# 4) 参数面(应全部同步 400,且拿不到 job id)
for body in \
'{"model":"minimax-h3-hyper","prompt":"x","resolution":"999p"}' \
'{"model":"minimax-h3-hyper","prompt":"x","ratio":"2:1"}' \
'{"model":"minimax-h3-hyper","prompt":"x","loras":[{"id":"style_sumi_ink"}],"style":"style_sumi_ink"}' \
; do
curl -s -o /dev/null -w '%{http_code} ' -X POST "$BASE/v1/videos" \
-H "Authorization: Bearer $KEY" -H 'Content-Type: application/json' -d "$body"
done; echo
最后一条(style 与 loras 同时给)2026-11-05 实测返回 200 —— 我们尚未把它列进 A 类。
那条作业跑了 372.3 秒,最后 qc_failed(edge_luma_ratio=0.011 < 0.4,片头未收敛)。
结论不变:只给一种;两个一起给不会报错,但组合语义没有背书。
同批还实测到:loras 里写不存在的 id ⇒ 建单 200、6.2 秒后 failed
(LORA_UNKNOWN,消息里列出本节点已安装的全部画风);只给一个空 text、无 prompt
⇒ 建单 200、6.6 秒后 failed(「没有文本提示词…」)。
B.5 本页对 md(2026-11-03 版)的五处勘误
| # | 旧文档写的 | 2026-11-05 实测 | 影响 |
|---|---|---|---|
| 1 | 错误码表里没有 402 | 代理商 Key 余额/欠账不足 → 建单 402 agency.precheck.payment_required,发生在参数校验之前 |
排障顺序:先看余额,再看参数(§10.6) |
| 2 | role 与 type 不搭 = 「200 → 约 5.5 秒 failed」 | 建单同步 400(modality.video.param_invalid,190 ms) |
这类不会再产生 job id(§10.2) |
| 3 | loras 给 4 件 / scale 越界 = 「200 → failed」 | 建单同步 400(最多 3 个 / scale 越界 0.0–2) | 同上 |
| 4 | §5.6 写的是节点侧码 GEN_STEPS_OFF_CONTRACT / GEN_F32_UNSUPPORTED |
经对外通道一律 400 modality.field.unimplemented(整块 gen 都不收) |
客户端只需处理这一条(§10.5) |
| 5 | §11.1「错误体」写「我们是纯文本正文 + 真实 HTTP 状态码」 | 实际是结构化 JSON(code/params/message);只有边缘 nginx 的 413 与某些 404 是空正文 |
可以(也应该)按 code 分支,不必解析中文 |
另:GET /v1/videos?limit=(列出自己的作业)实测可用,本文首次登记(§8.5)。
其余条目与 2026-11-03 版一致,未改动;尺寸表、档位表、官方口径对照逐条复核过。