视频生成 API 接入说明

一把 sk-omni-… 的 Key,一个异步 HTTP 接口:提交 → 轮询 → 取片。 接口形态与 OpenAI / 火山方舟的异步视频接口一致,官方 content[] 写法可直接复用。

基址 https://api.123all.cn(原 api.qiliqiji.com) 鉴权 Bearer sk-omni-… 异步作业式 3 条通道 5 档分辨率 × 6 档画幅 45 种画风

版本 2026-11-05。标注 实测 的条目为生产环境跑通所得并注明日期; 标注 规格 的为服务端契约声明(取值范围)。两者不一致时以实测为准并请反馈。 本页与 docs/api-qiliqiji-video.md 同步维护:md 是事实源,本页多出的是 2026-11-05 的真实样例与五处勘误(见 附录 B.5)。

060 秒判断

提交作业
POST /v1/videos
0.2 秒内返回作业 id,不出片
查询进度
GET /v1/videos/{id}
5–10 秒一次,只看终态
取片
GET …/{id}/content
带鉴权,直接是文件流
超时设定
≥ 6 分钟
不是 60 秒(见 §3.4)

三条会改变你代码写法的硬事实

  1. 终态有四个,不是一个。 completed / failed / qc_failed / cancelled。 漏掉 qc_failed 会让轮询循环永远跑下去(它不交付、不计费)。见 §7。
  2. 建单 200 ≠ 参数合法。 大量参数问题会在建单时 400(2026-11-03 起提前判定), 但素材层面的问题仍要拿到素材才能判,表现为「建单 200 → 数秒后 failed」。判据是终态,不是建单 HTTP 码。见 §10.4。
  3. 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 字节
—ffprobe864×480 · h264 · 124 帧 · 5.166667 s · 24 fps · AAC 双声道
这次一个作业 98.1 秒,是不是比文里的「52 秒」慢?

本次是三单并发提交(见下表),排队会把每一单都拉长。单发时的参考值见 §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-hyper
480p / 16:9 / 4 s
98.1 s(18 次轮询) completed / Pass 864×480 · 124 帧 · 5.1667 s 4,035,364 B
minimax-h3-vdn
480p / 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:<你的代理商>"
}
字段含义怎么用
activeKey 是否可用(停用 / 过期都变 false)false 就别重试,找我们
scopes能力作用域。出片必须有 video:generate只看这一个,别的条目与本接口无关
quota / consumed配额上限与已用(只计交付的作业)quota=0 表示「不限次、按量后付」,不是「不能用」
bound_account_id这把 Key 归属的账户(计费落在这里)对账、开票时用

consumed 是最终一致的:作业交付时累加,同步有延迟。 它适合看「Key 还能不能用」,不适合当精确用量 —— 精确用量请找我们对账。

2.3 两种 401,原文不一样

没带 Authorization
401
{"code":"modality.key.denied",
 "params":{"detail":"出片接口需要有效凭据:license JWT / 登录态 JWT / 未过期且未超额的 sk-omni API key"},
 "message":"出片接口需要有效凭据:…"}
Key 错 / 停用 / 超额
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)需要节点基底
480p864×480864×480480(VDN_LATENT=30x54)
768p(默认)864×4801382×768(超分)480
768p_native1344×7681344×768768(VDN_LATENT=48x84)
1080p1344×7681890×1080(超分)768
2k1344×7682688×1536(超分)768

所以 768p 与 768p_native 的耗时差(73 s vs 143 s)来自生成分辨率不同, 不是超分。传了不在列表里的档,建单时同步 400 并列出可用清单(真实原文见 §10.3)。

3.3 resolution × ratio 的成片尺寸(承诺值)

六档画幅全部开放(2026-11-03 起)。不传 ratio 就是 16:9。 下面这张表是逐像素核对过的承诺值:按它排版、裁切不会差像素。

resolution16:921:94:31:13:49:16
480p864×480992×416640×480480×480480×640480×864
768p(默认)1382×7681832×7681024×768768×768768×1024768×1382
768p_native1344×7681536×6721024×768768×768768×1024768×1344
1080p1890×10802468×10801440×10801080×10801080×14401080×1890
2k2688×15363510×15362048×15361536×15361536×20481536×2688

2026-11-05 复验:vdn + 480p + 9:16 实得 480×864, 与表中一致(ffprobe 读的是成片,不是响应)。

1382×768
1.06 MP
竖屏(9:16 / 3:4)比横屏略慢 10–20%(超分要处理的行数更多),但超时仍按 ≥6 分钟设。

3.4 耗时:分「准备好了」和「要准备」两档

① 全档复测 实测 2026-10-22(同一把 Key、公网域名、duration=4、ratio=16:9、 seed=4242、轮询 5 秒)。「墙钟」= 建单到成片落盘,含排队;建单本身 0.3–1.6 秒返回 queued。

minimax-h3-vdn

任务档位交付墙钟体积
文生480p864×48063 s370 KB
文生768p1382×76873 s1.22 MB
文生768p_native1344×768143 s851 KB
文生2k2688×1536154 s4.86 MB
首帧480p864×48065 s532 KB
尾帧480p864×48074 s—
首尾帧480p864×48074 s621 KB
参考素材480p864×480215 s643 KB

minimax-h3-hyper

任务档位交付墙钟体积
文生480p864×48052 s472 KB
文生768p1382×76895 s1.72 MB
首帧480p864×48053 s467 KB
参考图480p864×48073 s360 KB
同步模式480p864×48084 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
因此:客户端超时请设 ≥6 分钟

公网上最常见的失败不是出片失败,而是客户端 60 秒超时 → 自动重投 → 队列里多一条同样的作业。 重投不会更快,只会让后面更慢。正确做法:超时 ≥6 分钟、轮询 5–10 秒、只在终态结束。

画幅对耗时的影响 实测 2026-11-03 · 节点直测(不含排队)

resolution16:921:94:31:13:49:16
480p95 s85 s75 s70 s80 s90 s
768p110 s105 s95 s85 s95 s110 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 通用参数

参数类型必填说明
modelstring✅见 §3.1。缺这个字段返回 422。
promptstring文本提示词。可以不给 —— 只要 content[] 里有非空 text 项。两者都空返回 400。 反过来也成立:只给扁平 prompt、content[] 里只放素材(一个 text 都不放)是合法的。
contentarray多模态入参,见 §4.2。空数组等于没给。
durationnumber秒。minimax-h3-* 收 4–15;doubao-seedance-2.5 收 4–30、2.0 系列 4–15。 是「至少」不是「正好」(见 §4.5)。与 num_frames 二选一。
num_framesint帧数(24 fps)。合法区间 124–362,且只吃 17n+5。 给了不合规的数不报错:服务端对齐到最近合法值并在响应里如实回报(100 → 回报 124 / 5.17)。
resolutionenum480p / 768p(默认)/ 768p_native / 1080p / 2k。 传别的值建单时 400 并列出可用档位。逐通道上限见 §4.4。
ratioenum16:9(默认)/ 21:9 / 4:3 / 1:1 / 3:4 / 9:16; adaptive 按 16:9 处理。协议外的值建单即 400。
seedint复现抓手,见 §3.5。
lorasarray画风,最多 3 件:[{"id":"style_sumi_ink","scale":0.9}]。只收 id,不接受 path / URL。见 §6。
stylestring / objectloras 的单件简写:"style":"style_sumi_ink" 或 {"id":…,"strength":0.8}。 不要和 loras 同时给。
backgroundboolfalse = 同步等到出片再返回(响应体换成 {"model":…,"data":[…]})。 不传 = 默认异步。与「画面背景」无关。公网请用默认异步。
generate_audio / watermarkbool仅 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必带字段说明
texttext描述文本。空串会被拒(400);单个 text ≤ 7000 字符。
image_urlimage_url + 可选 role image_url 可以是 {"url":"…"} 对象或裸字符串。 role 只能是 first_frame / last_frame / reference_image,省略即 first_frame。
video_urlvideo_url + 可选 role: reference_video参考视频;省略 role 即按参考视频算。
audio_urlaudio_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_imagerole=first_frame / role=last_frame 的图
reference_image / reference_imagesrole=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-hyperminimax-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 MB50 MB200 MB ← 差 4 倍
视频格式 / 帧率H.264/AVC、H.265/HEVC;内嵌音频 AAC / MP3mp4 / mov;23.976–60 fps24–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 实际只有几十 KB

2026-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 MBnginx,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.0scale: 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 只有这几种)

queued→ in_progress→ completed /failed /qc_failed /cancelled
status额外字段含义计费 / 配额
completedurl;通过质检时带 qc出片并交付记 1 次
failederror:"[<上游HTTP码>] <原因>",H3 通道还会带 (stage=…) 出片失败(上游拒了 / 超时 / 服务端内部出错 / 质检未过)不计
qc_failederror(可能为空)+ 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 轮询建议

间隔
5–10 s
别 1–2 秒打
总窗口
≥ 6 min
参考素材 8–9.5 分钟
终止
4 个终态
completed / failed / qc_failed / cancelled

不要在客户端做忙等。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 小时失效

三条纪律:

  1. 优先用 /content:形态统一、长期有效、带你自己的鉴权。
  2. 若图省事直接用 url,请当天转存到自己的存储,别把链接存进数据库长期用。
  3. 无论如何,拿到片子就转存,不要长期依赖我们这侧的链接。

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_foundid 不存在(或不属于这把 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

三条使用建议:

  1. 撤单成功后请以 GET 的 status 为准,不要假定就是 cancelled(可能已经 completed)。
  2. 撤单幂等:同一个 id 反复撤都是 200,重试不会报错。
  3. 撤单不回滚已交付的片子:如果 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 实测总表(公网域名,逐条投出来的)

场景HTTPcode耗时
没带 Authorization401modality.key.denied141 ms
Key 错 / 停用 / 超额401modality.key.invalid143 ms
少 model 字段422request.missing_field188 ms
prompt 与 content[] 都空(含 content: [])400modality.content.prompt_empty154 ms
content[] 有图 + 扁平 first_frame_image400modality.content.mixed_forms137 ms
resolution: "999p"400modality.resolution.unknown142 ms
ratio: "2:1"(协议外)400modality.video.param_invalid171 ms
ratio: "5:4"(协议外)400modality.video.param_invalid156 ms
loras 给了 4 件400modality.video.param_invalid163 ms
loras[] 带 path400modality.video.param_invalid158 ms
loras[] 的 scale: 3400modality.video.param_invalid168 ms
image_url + role: reference_video400modality.video.param_invalid190 ms
duration: 16400modality.duration.out_of_range156 ms
任何 gen(含拼错的键)400modality.field.unimplemented143–161 ms
callback_url400modality.field.unimplemented143 ms
写官方模型名 MiniMax-H3403modality.key.model_not_allowed163 ms
查不存在的作业404modality.job.not_found145 ms
代理商余额不足(见 §10.6)402agency.precheck.payment_required260 ms
引用已删除 / 不存在的 asset://200 → failed作业 error 里的 modality.asset.parse_failed3.1 s
素材 URL 抓不到(本次给的是不存在的音频)200 → failed作业 error:取素材失败 … HTTP Error 4044.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:代理商余额预检(本页新增)

这是 2026-11-05 复测发现的、此前文档未记载的一档

用代理商绑定的 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 把官方样例迁过来的三步

  1. base_url → https://api.123all.cn;Authorization 用发给你的 sk-omni-…。
  2. model → minimax-h3-hyper(快)或 minimax-h3-vdn(画质/参考素材)。
  3. 删掉 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名称分类触发词(自动前置)推荐强度建议区间装有它的服务器
1style_80s_retroanime80s Retro-Futuristic Anime动画 / 赛璐璐retroanime80sstyle1.11.1–1.13
2style_anime_irlAnime IRL动画 / 赛璐璐ANIRL, anime-rendered face and hair1.01.0–1.03
3style_anime_shiftAnime Shift动画 / 赛璐璐The style switch to anime1.11.0–1.23
4style_cel_shadingCel Shading动画 / 赛璐璐Cel Shading Style0.90.8–1.03
5style_cutesy_pixelCutesy Anime Pixel动画 / 赛璐璐cutesy anime pixel art0.90.8–1.03
6style_hanafudaHanafuda Anime动画 / 赛璐璐retro anime style including signature art style from thefoodmage hanafuda 2D0.90.8–1.03
7style_jp_anime_transitionJapanese Anime Transition动画 / 赛璐璐convert this image to Japanese anime style0.90.8–1.03
8style_pbrStylized PBR动画 / 赛璐璐PBRSty1e0.90.8–1.03
9style_sketch_irlSketch IRL动画 / 赛璐璐SKETCHIRL, hand-drawn1.01.0–1.03
10style_25d2.5D Style插画 / 绘画2.5d0.850.7–1.03
11style_astrowitchAstroWitch Comic插画 / 绘画ASTROWITCHV01H30.90.8–1.03
12style_crayonCrayon Drawings插画 / 绘画crayonstyle1.11.1–1.13
13style_dan_moraDan Mora Chavez插画 / 绘画In the style of Dan Mora0.90.8–1.03
14style_digital_artDigital Art插画 / 绘画flat cel shading, bold outlines, multi colors0.90.8–1.03
15style_kreasammelinKreaSammelin Ligne-Claire插画 / 绘画kreasammelinstyle1.11.1–1.13
16style_pc98PC-98 Pixel插画 / 绘画Pixel-art, PC-98, anime-style0.90.8–1.03
17style_sam_yangSam Yang插画 / 绘画In the art style of Sam Yang0.90.8–1.03
18style_sumi_inkSumi-e Ink Wash插画 / 绘画A sumiink painting style animation0.90.8–1.03
19film_16mm_footage16mm Found Footage胶片 / 影调foundfootage160.90.8–1.03
20film_90s_wuxia90s Hong Kong Wuxia胶片 / 影调90s_wuxia_style0.60.6–0.63
21style_afterlightAfterlight胶片 / 影调Afterlight Style1.01.0–1.03
22style_authentic_cinematicAuthentic Cinematic Texture胶片 / 影调DY0.60.5–0.73
23style_cinematic_astroCinematic (ASTRO)胶片 / 影调ASTROCINEMAV01K2T, K2T0.90.8–1.03
24style_cinematic_lookCinematic Look胶片 / 影调DY0.60.5–0.73
25style_minidvMiniDV Nostalgia胶片 / 影调y2km1n1dv0.90.8–1.03
26style_cinematic_fantasyCinematic Fantasy类型片质感cinematic fantasy0.90.8–1.03
27style_creepy_cuteCreepy Cute Magical类型片质感CreepyCuteMagical1.00.5–1.53
28style_fallout4_enbFallout 4 ENB类型片质感FO4ENB0.90.8–1.03
29style_film_noir_selectiveFilm Noir Selective Color类型片质感film noir style black and white with selective red0.90.8–1.03
30style_neon_decayCyberpunk Neon Decay类型片质感neon-decay0.90.8–1.03
31style_strange_reverieStrange Reverie类型片质感StrangeDaal1.00.5–1.53
32motion_bullet_timeBullet Time运镜 / 动作bullet-time1.01.0–1.03
33motion_cameraCamera Motion运镜 / 动作camera motion0.90.8–1.03
34motion_weapon_combatWeapon Combat运镜 / 动作BUNNY0.90.8–1.03
35motion_wushuWushu Action运镜 / 动作kungfu combat0.90.8–1.03
36style_colordreamsColordreams综合画风colorful dreamlike0.90.8–1.03
37style_plusheePlushee World综合画风PLUSH330.90.8–1.03
38ugc_igtiktokIG/TikTok Aesthetics社交平台质感tiktok aesthetic0.8750.75–1.03
39ugc_instapicInstaPic Ultrareal社交平台质感instapic1.00.8–1.23
40util_motion_repairMotion Continuity Repair实用工具bunny_crisp_motion0.80.6–1.03
41util_person_removerPerson Remover实用工具person remover0.90.8–1.03
42detail_realism_peopleRealism People细节增强present0.850.7–1.03
43style_dark_moodyDark and Moody Lighting打光Dark_and_Moody0.850.7–1.03
44vr_equi360Equirect 360全景equirect3600.90.8–1.03
45anime2d2D Anime Cel-shading基础2danime0.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 位
1minimax-h3-hyper
480p · 16:9 · duration=4
video_3f9371a03b7747ecb63f73f9e4a33a2d98.1 scompleted / Pass 864×480 · 124 帧 · 5.166667 s · 24 fps · AAC4,035,364 B / 562ff3b9ff4f10d4
2minimax-h3-vdn
480p · 9:16 · duration=4
video_203ca3f5492545c6b77d924c51653fd6105.7 scompleted / Pass 480×864 · 124 帧 · 5.166667 s · 24 fps · AAC4,829,051 B / e988b3d62768c235
3minimax-h3-hyper + loras:[{id:"style_sumi_ink",scale:0.9}]
480p · 16:9 · duration=4
video_3dd972af970649edac31e6e61c7490c7216.5 scompleted / Pass 864×480 · 124 帧 · 5.166667 s · 24 fps · AAC4,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)
2role 与 type 不搭 = 「200 → 约 5.5 秒 failed」建单同步 400(modality.video.param_invalid,190 ms) 这类不会再产生 job id(§10.2)
3loras 给 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 版一致,未改动;尺寸表、档位表、官方口径对照逐条复核过。