@heyamiko/amiko-cli 0.16.2 → 0.16.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -879,16 +879,16 @@ Generate a video (Create Studio)
879
879
 
880
880
  | Flag | Default | Description |
881
881
  |---|---|---|
882
- | `--model <model>` | | Video model: MiniMax-Hailuo-02 (default for prompt-only; T2V+I2V), MiniMax-Hailuo-2.3-Fast (default with --first-frame; I2V only), MiniMax-Hailuo-2.3 (T2V+I2V), MiniMax-H3 (aliases h3, hailuo-03; T2V+I2V+reference-to-video, 768P\|2K, any 4–15s, billed per second), veo-3.1[-fast\|-lite]-generate-preview (Google; durations clamp to 4/6/8s), grok-imagine-video (xAI), dreamina-seedance-* (BytePlus). ONLY these — kling and other ids are not supported |
882
+ | `--model <model>` | | Video model: MiniMax-Hailuo-02 (default for prompt-only; T2V+I2V), MiniMax-Hailuo-2.3-Fast (default with --first-frame; I2V only), MiniMax-Hailuo-2.3 (T2V+I2V), S2V-01 (default with --subject-reference; the only MiniMax model that accepts subject_reference), MiniMax-H3 (aliases h3, hailuo-03; T2V+I2V+reference-to-video, 768P\|2K, any 4–15s, billed per second), veo-3.1[-fast\|-lite]-generate-preview (Google; durations clamp to 4/6/8s), grok-imagine-video (xAI), dreamina-seedance-2-5-260628 (BytePlus Seedance 2.5; any whole 4–30s, billed per token so a long 1080p clip runs into dollars — quote it), other dreamina-seedance-* (BytePlus, ≤15s). ONLY these — kling and other ids are not supported |
883
883
  | `--resolution <res>` | `768P` | 512P, 720P, 768P, 1080P (MiniMax, Grok, Seedance); 720p, 1080p, 4k (Veo); 768P or 2K (MiniMax-H3) |
884
- | `--seconds <n>` | `6` | Clip length: 6 or 10 (Hailuo), 4/6/8 (Veo), 4/6/8/10 (Grok, Seedance), any whole number 4–15 (MiniMax-H3) |
884
+ | `--seconds <n>` | `6` | Clip length: 6 or 10 (Hailuo), 4/6/8 (Veo), 4/6/8/10 (Grok, Seedance 2.0), any whole number 4–15 (MiniMax-H3), any whole number 4–30 (Seedance 2.5) |
885
885
  | `--aspect <ratio>` | | Aspect ratio (provider-dependent). MiniMax-H3 text-to-video needs a concrete ratio (21:9, 16:9, 4:3, 1:1, 3:4, 9:16); defaults to 16:9 when omitted |
886
886
  | `--first-frame <file|url>` | | Image-to-video: first frame — local file path, https URL, or data URI |
887
887
  | `--last-frame <file|url>` | | First-and-last-frame video: ending frame — local file path, https URL, or data URI. MiniMax-H3, Seedance and Veo only (Seedance/Veo also need --first-frame) |
888
- | `--reference-image <file|url>` | | Reference-to-video: local file path or https URL (repeatable). MiniMax-H3 / Seedance / Grok: max 9; Veo: max 3; Hailuo v1: NOT supported — use --subject-reference |
888
+ | `--reference-image <file|url>` | | Reference-to-video: local file path or https URL (repeatable). MiniMax-H3 / Seedance / Grok: max 9; Veo: max 3; Hailuo v1: NOT supported — use --model MiniMax-H3 |
889
889
  | `--reference-video <file|url>` | | Reference-to-video: local file path or https URL (repeatable, max 3). MiniMax-H3 and Seedance only; combined reference video+audio must be ≤15s, and H3 bills 15 input-seconds whenever any is attached |
890
890
  | `--reference-audio <file|url>` | | Reference-to-video: local file path or https URL (repeatable, max 3). MiniMax-H3 and Seedance only; needs an image or video reference alongside, H3 wants 2–15s per clip |
891
- | `--subject-reference <file|url>` | | MiniMax S2V / H3: subject/character reference image — local file path or https URL. Takes the place of --reference-image rather than adding to it |
891
+ | `--subject-reference <file|url>` | | Subject/character reference image — local file path or https URL. Takes the place of --reference-image rather than adding to it. Selects S2V-01 unless --model says otherwise; Hailuo 02/2.3/2.3-Fast reject it, use MiniMax-H3 for reference-to-video |
892
892
  | `--generate-audio` | | Seedance: generate audio in the output video |
893
893
  | `--no-generate-audio` | | Seedance: output silent video |
894
894
  | `--watermark` | | Seedance: burn in a watermark |
@@ -2617,6 +2617,21 @@ npm publish
2617
2617
 
2618
2618
  ## Changelog
2619
2619
 
2620
+ ### 0.16.4
2621
+
2622
+ - **`--subject-reference` now works at all.** MiniMax accepts `subject_reference` on **S2V-01 and nothing else**, so every job that used the flag was rejected upstream with `param 'subject_reference' is incompatible with model MiniMax-Hailuo-02` — including the CLI's own documented example, because with no `--model` the flag resolved to exactly that id. The flag now selects `S2V-01` on its own (checked before `--first-frame`: the model follows the reference, not the frame), and naming a Hailuo model beside it is refused **before the quote**, with an error that points at `--model S2V-01` or `--model MiniMax-H3`. This corrects the 0.16.1 note below, which said Hailuo v1 accepts the flag — it reads the field's *shape*, but MiniMax rejects the *pairing*.
2623
+ - **A permanently-invalid model/flag pairing answers 400, not 502.** It had no branch in the video error classifier, so it took the 502 default — which reads "transient, retry", and callers were resubmitting a request that can never succeed.
2624
+ - **`--seconds` help no longer cites the one table Seedance 2.5 isn't subject to.** It still read "4/6/8/10 (Grok, Seedance)" after 2.5 gained its 4–30s range. The README command reference is generated from that string, so both were wrong together.
2625
+ - **Reference video and audio counts are enforced, not just images.** The validator capped images at 9 but let any number of clips through. The CLI and the studio both apply 3/3, so only a direct API caller reached it — where BytePlus either rejects after the reservation is taken, or accepts, silently drops the extras, and bills for what it ran.
2626
+
2627
+ ### 0.16.3
2628
+
2629
+ - **Seedance 2.5 (`dreamina-seedance-2-5-260628`) is a supported `create video --model`**, and it is the only model that goes past 15s — any whole `--seconds` from **4 to 30**. The 4|6|8|10 set never applied to it, and neither does H3's 4–15 range, so `--seconds 22` is now accepted rather than rejected against a table it was never subject to.
2630
+ - **Over-long durations are an error, not a silent trim.** mpp clamped anything above 15s down to 15s before submitting. On a model that accepts 30s that meant a 30s request generated a 15s clip, billed in full, and said nothing about the substitution — the owner paid for a video that was not the one they asked for. The limit is now per model and exceeding it fails before the job is created.
2631
+ - **2.5 is priced at its own rate ($0.0107/1K tokens).** It was falling through to the 2.0 Pro rate, which under-quoted it by ~31%: the number shown at approval was not the number charged. The unknown-model fallback was also inverted — it used to quote at the *cheapest* published rate, so any future model id would under-quote by default; it now quotes at the dearest known rate and logs that it did.
2632
+ - **`Expensive generation:` warning above $0.50.** Seedance 2.5 bills per token, so cost tracks duration × resolution: roughly **5s 720p ≈ $1.16**, **10s 720p ≈ $2.31**, **30s 1080p ≈ $15.60** — about 156,000 credits, more than most balances hold. `Cost:` alone reads identically at $0.09 and at $15, so anything at or above $0.50 now gets its own stderr line naming the two levers (`--seconds`, `--resolution`) that caused it. Ordinary work — an image, a short Hailuo clip — stays quiet.
2633
+ - **The reference caps stay at 9/3/3.** 2.5 advertises up to 50 multimodal references upstream, but BytePlus has not published how the ≤15s combined-reference budget changes at that ceiling, and a cap that can't be verified locally is one that fails by generating and billing. 2.5's usable win today is duration, not reference count.
2634
+
2620
2635
  ### 0.16.2
2621
2636
 
2622
2637
  - **`--yes` now discloses the cost instead of hiding it.** The approval gate treated `--yes` as permission to skip the *prompt* and the *disclosure* together, so an agent that passed it generated media with the amount appearing nowhere in the output — the one path where money moves was the one path that said nothing about it. The quote has already been fetched by then, so `Cost: …` now prints on every approved paid run. It goes to **stderr**, because job ids and `--raw` JSON go to stdout and callers parse them; free outward actions (a chat message, a follow) still print nothing, so nothing reintroduces "the cost is 0" for an action that has no price.
package/dist/index.js CHANGED
@@ -29311,6 +29311,12 @@ var NON_H3_MAX_PROMPT_CHARS = 2000;
29311
29311
  var H3_MAX_REFERENCE_FILES = 12;
29312
29312
  var H3_DEFAULT_T2V_ASPECT = "16:9";
29313
29313
  var NON_H3_VIDEO_SECONDS = new Set([4, 6, 8, 10]);
29314
+ var SEEDANCE_25_MODEL = /^(dreamina-)?seedance-2-5(-|$)/i;
29315
+ var SEEDANCE_25_MIN_SECONDS = 4;
29316
+ var SEEDANCE_25_MAX_SECONDS = 30;
29317
+ function isSeedance25Model(model) {
29318
+ return SEEDANCE_25_MODEL.test(model);
29319
+ }
29314
29320
  function isH3VideoModel(model) {
29315
29321
  return H3_VIDEO_MODEL.test(model);
29316
29322
  }
@@ -29393,6 +29399,11 @@ var VIDEO_CAPS = {
29393
29399
  label: "MiniMax Hailuo"
29394
29400
  }
29395
29401
  };
29402
+ function acceptsSubjectReference(model) {
29403
+ if (videoFamily(model) !== "hailuo")
29404
+ return true;
29405
+ return /^S2V-/i.test(model);
29406
+ }
29396
29407
  function effectiveReferenceImageCount(input) {
29397
29408
  if (VIDEO_CAPS[videoFamily(input.model)].subjectReferenceNative) {
29398
29409
  return input.referenceImageUrls.length;
@@ -29405,8 +29416,11 @@ function validateVideoReferences(input) {
29405
29416
  const images = effectiveReferenceImageCount(input);
29406
29417
  const videos = input.referenceVideoUrls.length;
29407
29418
  const audio = input.referenceAudioUrls.length;
29419
+ if (input.subjectReference && !acceptsSubjectReference(input.model)) {
29420
+ return `${caps.label} rejects --subject-reference: MiniMax accepts subject_reference on S2V-01 only, and ${input.model} fails the submit with "param 'subject_reference' is incompatible with model ${input.model}". Use --model S2V-01, or --model MiniMax-H3 for reference-to-video, or --first-frame to start from an image.`;
29421
+ }
29408
29422
  if (input.referenceImageUrls.length > 0 && caps.referenceImages === 0) {
29409
- return `${caps.label} ignores --reference-image — mpp's ${family} branch never reads it, so the video would be generated and billed without it. Use --subject-reference for a single character image, or --model MiniMax-H3 for true reference-to-video.`;
29423
+ return `${caps.label} ignores --reference-image — mpp's ${family} branch never reads it, so the video would be generated and billed without it. Use --model S2V-01 with --subject-reference for a single character image, or --model MiniMax-H3 for true reference-to-video.`;
29410
29424
  }
29411
29425
  if (videos > 0 && caps.referenceVideos === 0) {
29412
29426
  return `${caps.label} ignores --reference-video — it would be dropped and the job billed anyway. Only MiniMax-H3 and Seedance read reference clips.`;
@@ -29719,6 +29733,7 @@ function mediaUrls(items) {
29719
29733
  }
29720
29734
 
29721
29735
  // src/commands/create.ts
29736
+ var HIGH_COST_USD = 0.5;
29722
29737
  var MUSIC_MAX_SECONDS = 300;
29723
29738
  var ETA = {
29724
29739
  IMAGE: "~15–60s",
@@ -29803,6 +29818,7 @@ async function submitCreateJob(opts) {
29803
29818
  }
29804
29819
  let costLine = payCredits ? "reserved from your Amiko account credits, captured on success (released on failure)" : "charged from your twin wallet on success (nothing on failure)";
29805
29820
  let quotedCostAmiko;
29821
+ let quotedCostUsd;
29806
29822
  let quoteFailed = false;
29807
29823
  try {
29808
29824
  const q = await amikoWebFetch(auth, "/api/create/quote", {
@@ -29811,6 +29827,7 @@ async function submitCreateJob(opts) {
29811
29827
  timeoutMs: 15000
29812
29828
  });
29813
29829
  if (q.cost_usd != null) {
29830
+ quotedCostUsd = q.cost_usd;
29814
29831
  costLine = payCredits ? `≈ ${Math.ceil(q.cost_usd * 1e4)} Amiko credits (≈ $${q.cost_usd.toFixed(4)}) — reserved on submit, captured only on success` : `${q.cost_amiko ?? "?"} AMIKO (≈ $${q.cost_usd.toFixed(4)}) — charged only on success`;
29815
29832
  }
29816
29833
  if (typeof q.cost_amiko === "string" && q.cost_amiko.trim() !== "") {
@@ -29825,6 +29842,12 @@ async function submitCreateJob(opts) {
29825
29842
  console.error(warn("Price quote failed — the amount below is unknown."));
29826
29843
  costLine = `unknown (quote failed) — ${costLine}`;
29827
29844
  }
29845
+ if (quotedCostUsd !== undefined && quotedCostUsd >= HIGH_COST_USD) {
29846
+ console.error("");
29847
+ console.error(warn(`Expensive generation: ≈ $${quotedCostUsd.toFixed(2)} (${Math.ceil(quotedCostUsd * 1e4).toLocaleString()} credits).`));
29848
+ console.error(dim(" Duration and resolution drive this almost linearly — halving either roughly halves the price."));
29849
+ console.error("");
29850
+ }
29828
29851
  const preferredToken = typeof jobBody.preferredToken === "string" ? jobBody.preferredToken.toUpperCase() : undefined;
29829
29852
  const chargeIsAmiko = !payCredits && (preferredToken === undefined || preferredToken === "AMIKO");
29830
29853
  const autoApprovable = payCredits || chargeIsAmiko;
@@ -29957,16 +29980,20 @@ function registerCreateCommand(create2) {
29957
29980
  }
29958
29981
  });
29959
29982
  });
29960
- create2.command("video <prompt>").description("Generate a video (Create Studio)").option("--model <model>", "Video model: MiniMax-Hailuo-02 (default for prompt-only; T2V+I2V), MiniMax-Hailuo-2.3-Fast (default with --first-frame; I2V only), MiniMax-Hailuo-2.3 (T2V+I2V), MiniMax-H3 (aliases h3, hailuo-03; T2V+I2V+reference-to-video, 768P|2K, any 4–15s, billed per second), veo-3.1[-fast|-lite]-generate-preview (Google; durations clamp to 4/6/8s), grok-imagine-video (xAI), dreamina-seedance-* (BytePlus). ONLY these — kling and other ids are not supported").option("--resolution <res>", "512P, 720P, 768P, 1080P (MiniMax, Grok, Seedance); 720p, 1080p, 4k (Veo); 768P or 2K (MiniMax-H3)", "768P").option("--seconds <n>", "Clip length: 6 or 10 (Hailuo), 4/6/8 (Veo), 4/6/8/10 (Grok, Seedance), any whole number 4–15 (MiniMax-H3)", "6").option("--aspect <ratio>", "Aspect ratio (provider-dependent). MiniMax-H3 text-to-video needs a concrete ratio (21:9, 16:9, 4:3, 1:1, 3:4, 9:16); defaults to 16:9 when omitted").option("--first-frame <file|url>", "Image-to-video: first frame — local file path, https URL, or data URI").option("--last-frame <file|url>", "First-and-last-frame video: ending frame — local file path, https URL, or data URI. MiniMax-H3, Seedance and Veo only (Seedance/Veo also need --first-frame)").option("--reference-image <file|url>", "Reference-to-video: local file path or https URL (repeatable). MiniMax-H3 / Seedance / Grok: max 9; Veo: max 3; Hailuo v1: NOT supported — use --subject-reference", collectOption, []).option("--reference-video <file|url>", "Reference-to-video: local file path or https URL (repeatable, max 3). MiniMax-H3 and Seedance only; combined reference video+audio must be ≤15s, and H3 bills 15 input-seconds whenever any is attached", collectOption, []).option("--reference-audio <file|url>", "Reference-to-video: local file path or https URL (repeatable, max 3). MiniMax-H3 and Seedance only; needs an image or video reference alongside, H3 wants 2–15s per clip", collectOption, []).option("--subject-reference <file|url>", "MiniMax S2V / H3: subject/character reference image — local file path or https URL. Takes the place of --reference-image rather than adding to it").option("--generate-audio", "Seedance: generate audio in the output video").option("--no-generate-audio", "Seedance: output silent video").option("--watermark", "Seedance: burn in a watermark").option("--no-watermark", "Seedance: no watermark").option("--camera-fixed", "Seedance: hold the camera still").option("--no-camera-fixed", "Seedance: allow camera movement").option("--prompt-optimizer", "MiniMax (H3 and Hailuo v1): let the model rewrite the prompt before generating").option("--no-prompt-optimizer", "MiniMax: use the prompt verbatim").option("--fast-pretreatment", "MiniMax Hailuo v1: faster input pre-processing (ignored by H3, Veo, Grok and Seedance)").option("--no-fast-pretreatment", "MiniMax Hailuo v1: standard input pre-processing").option("--token <symbol>", "Preferred charge token: AMIKO, USDC, USDT, SOL").option("--pay <method>", "Payment method: credits (Amiko account credits, default) or wallet (twin wallet)", "credits").option("--raw", "Output raw JSON").option("--yes", "Skip the pre-spend confirmation (required in non-interactive shells)").action(async (prompt, opts) => {
29961
- const model = opts.model ?? (opts.firstFrame ? "MiniMax-Hailuo-2.3-Fast" : "MiniMax-Hailuo-02");
29983
+ create2.command("video <prompt>").description("Generate a video (Create Studio)").option("--model <model>", "Video model: MiniMax-Hailuo-02 (default for prompt-only; T2V+I2V), MiniMax-Hailuo-2.3-Fast (default with --first-frame; I2V only), MiniMax-Hailuo-2.3 (T2V+I2V), S2V-01 (default with --subject-reference; the only MiniMax model that accepts subject_reference), MiniMax-H3 (aliases h3, hailuo-03; T2V+I2V+reference-to-video, 768P|2K, any 4–15s, billed per second), veo-3.1[-fast|-lite]-generate-preview (Google; durations clamp to 4/6/8s), grok-imagine-video (xAI), dreamina-seedance-2-5-260628 (BytePlus Seedance 2.5; any whole 4–30s, billed per token so a long 1080p clip runs into dollars — quote it), other dreamina-seedance-* (BytePlus, ≤15s). ONLY these — kling and other ids are not supported").option("--resolution <res>", "512P, 720P, 768P, 1080P (MiniMax, Grok, Seedance); 720p, 1080p, 4k (Veo); 768P or 2K (MiniMax-H3)", "768P").option("--seconds <n>", "Clip length: 6 or 10 (Hailuo), 4/6/8 (Veo), 4/6/8/10 (Grok, Seedance 2.0), any whole number 4–15 (MiniMax-H3), any whole number 4–30 (Seedance 2.5)", "6").option("--aspect <ratio>", "Aspect ratio (provider-dependent). MiniMax-H3 text-to-video needs a concrete ratio (21:9, 16:9, 4:3, 1:1, 3:4, 9:16); defaults to 16:9 when omitted").option("--first-frame <file|url>", "Image-to-video: first frame — local file path, https URL, or data URI").option("--last-frame <file|url>", "First-and-last-frame video: ending frame — local file path, https URL, or data URI. MiniMax-H3, Seedance and Veo only (Seedance/Veo also need --first-frame)").option("--reference-image <file|url>", "Reference-to-video: local file path or https URL (repeatable). MiniMax-H3 / Seedance / Grok: max 9; Veo: max 3; Hailuo v1: NOT supported — use --model MiniMax-H3", collectOption, []).option("--reference-video <file|url>", "Reference-to-video: local file path or https URL (repeatable, max 3). MiniMax-H3 and Seedance only; combined reference video+audio must be ≤15s, and H3 bills 15 input-seconds whenever any is attached", collectOption, []).option("--reference-audio <file|url>", "Reference-to-video: local file path or https URL (repeatable, max 3). MiniMax-H3 and Seedance only; needs an image or video reference alongside, H3 wants 2–15s per clip", collectOption, []).option("--subject-reference <file|url>", "Subject/character reference image — local file path or https URL. Takes the place of --reference-image rather than adding to it. Selects S2V-01 unless --model says otherwise; Hailuo 02/2.3/2.3-Fast reject it, use MiniMax-H3 for reference-to-video").option("--generate-audio", "Seedance: generate audio in the output video").option("--no-generate-audio", "Seedance: output silent video").option("--watermark", "Seedance: burn in a watermark").option("--no-watermark", "Seedance: no watermark").option("--camera-fixed", "Seedance: hold the camera still").option("--no-camera-fixed", "Seedance: allow camera movement").option("--prompt-optimizer", "MiniMax (H3 and Hailuo v1): let the model rewrite the prompt before generating").option("--no-prompt-optimizer", "MiniMax: use the prompt verbatim").option("--fast-pretreatment", "MiniMax Hailuo v1: faster input pre-processing (ignored by H3, Veo, Grok and Seedance)").option("--no-fast-pretreatment", "MiniMax Hailuo v1: standard input pre-processing").option("--token <symbol>", "Preferred charge token: AMIKO, USDC, USDT, SOL").option("--pay <method>", "Payment method: credits (Amiko account credits, default) or wallet (twin wallet)", "credits").option("--raw", "Output raw JSON").option("--yes", "Skip the pre-spend confirmation (required in non-interactive shells)").action(async (prompt, opts) => {
29984
+ const model = opts.model ?? (opts.subjectReference ? "S2V-01" : opts.firstFrame ? "MiniMax-Hailuo-2.3-Fast" : "MiniMax-Hailuo-02");
29962
29985
  const isH3 = isH3VideoModel(model);
29963
29986
  const seconds = Number(opts.seconds);
29964
29987
  if (isH3) {
29965
29988
  if (!Number.isInteger(seconds) || seconds < H3_MIN_SECONDS || seconds > H3_MAX_SECONDS) {
29966
29989
  failInput(`--seconds must be a whole number from ${H3_MIN_SECONDS} to ${H3_MAX_SECONDS} for MiniMax-H3.`);
29967
29990
  }
29991
+ } else if (isSeedance25Model(model)) {
29992
+ if (!Number.isInteger(seconds) || seconds < SEEDANCE_25_MIN_SECONDS || seconds > SEEDANCE_25_MAX_SECONDS) {
29993
+ failInput(`--seconds must be a whole number from ${SEEDANCE_25_MIN_SECONDS} to ${SEEDANCE_25_MAX_SECONDS} for Seedance 2.5.`);
29994
+ }
29968
29995
  } else if (!NON_H3_VIDEO_SECONDS.has(seconds)) {
29969
- failInput("--seconds must be 4, 6, 8, or 10 (Hailuo accepts 6 or 10; use --model MiniMax-H3 for any 4–15s).");
29996
+ failInput("--seconds must be 4, 6, 8, or 10 (Hailuo accepts 6 or 10; use --model MiniMax-H3 for any 4–15s, or --model dreamina-seedance-2-5-260628 for any 4–30s).");
29970
29997
  }
29971
29998
  let resolution = opts.resolution;
29972
29999
  if (isH3) {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@heyamiko/amiko-cli",
3
- "version": "0.16.2",
3
+ "version": "0.16.4",
4
4
  "description": "Amiko CLI — swap tokens, manage credits, bridge cross-chain, and call marketplace agents",
5
5
  "type": "module",
6
6
  "bin": {
package/skills/SKILL.md CHANGED
@@ -215,7 +215,9 @@ This twin has **two** optional TTS ids. They are **not** the same:
215
215
 
216
216
  - **HTTP 202 / `status: PENDING` / `PROCESSING` = success so far, NOT failure.** MPP logs like `POST /internal/create/video 202` mean the async job was **accepted and queued**. A single immediate `GET /internal/create/jobs/… 200` only means the job record exists — video still needs **~2–9 minutes**. **Never** tell the owner the render "failed" or "stalled" just because you saw 202 or polled once while still `PROCESSING`.
217
217
  - **Only call it failed when** `amiko create status <jobId>` returns `FAILED` (or the CLI exits non-zero with an error), **or** after the ETA you check again and it's still not `COMPLETED` **and** mpp logs show `[internal-create/video]` with an error.
218
- - **Do NOT invent video models.** `kling-v1.6`, `kling-*`, and other non-platform ids are **not supported** and will error. Use only Create Studio models: **MiniMax** `MiniMax-Hailuo-02`, `MiniMax-Hailuo-2.3`, `MiniMax-Hailuo-2.3-Fast`, `MiniMax-H3` (aliases `h3`, `hailuo-03` — v2 API: T2V + I2V + reference-to-video, `768P`|`2K`, any whole `--seconds` 4–15, **billed per second** so longer clips cost more; text-to-video needs a concrete `--aspect`, defaulting to `16:9`); **Google Veo** `veo-3.1-generate-preview`, `veo-3.1-fast-generate-preview`, `veo-3.1-lite-generate-preview` (durations clamp to 4/6/8s; lite is prompt-only/T2V, no first frame); **xAI** `grok-imagine-video`; **BytePlus Seedance** `dreamina-seedance-*` / `seedance-*`. Run `amiko create video --help` — do **not** bypass with `markets service call` to `/internal/create/video`.
218
+ - **Do NOT invent video models.** `kling-v1.6`, `kling-*`, and other non-platform ids are **not supported** and will error. Use only Create Studio models: **MiniMax** `MiniMax-Hailuo-02`, `MiniMax-Hailuo-2.3`, `MiniMax-Hailuo-2.3-Fast`, `MiniMax-H3` (aliases `h3`, `hailuo-03` — v2 API: T2V + I2V + reference-to-video, `768P`|`2K`, any whole `--seconds` 4–15, **billed per second** so longer clips cost more; text-to-video needs a concrete `--aspect`, defaulting to `16:9`); **Google Veo** `veo-3.1-generate-preview`, `veo-3.1-fast-generate-preview`, `veo-3.1-lite-generate-preview` (durations clamp to 4/6/8s; lite is prompt-only/T2V, no first frame); **xAI** `grok-imagine-video`; **BytePlus Seedance** `dreamina-seedance-2-5-260628` (2.5 — any whole `--seconds` **4–30**, the only model that goes past 15s) and the 2.0 family `dreamina-seedance-2-0-260128` / `-2-0-fast-260128` (≤15s). Run `amiko create video --help` — do **not** bypass with `markets service call` to `/internal/create/video`.
219
+
220
+ - **Seedance 2.5 is the expensive one — never submit it without quoting.** It bills per token, so cost scales with duration × resolution and runs roughly: **5s 720p ≈ $1.16**, **10s 720p ≈ $2.31**, **30s 1080p ≈ $15.60**. That last one is ~156,000 credits — more than most owners hold. Treat every 2.5 job as a job that needs the full propose → quote → generate flow, and say the dollar figure out loud, not just the credit count: "≈ $15.60" lands where "156,000 credits" does not. The CLI prints its own `Expensive generation:` warning above $0.50, which is every 2.5 clip — pass that warning on to the owner rather than swallowing it. If they want something cheaper, the levers are `--seconds` and `--resolution`, roughly linear in both.
219
221
  - **Cover art → motion (I2V):** pass the cover's Amiko URL as `--first-frame <url>` (from `amiko create status` on the image job or `amiko create media`). The default model is now **input-aware**: prompt-only video defaults to `MiniMax-Hailuo-02` (T2V), and `--first-frame` runs default to `MiniMax-Hailuo-2.3-Fast` (I2V) — so omitting `--model` is safe in both shapes. Explicit `--model` always wins; Fast alone still rejects prompt-only (it needs a reference image).
220
222
  - **Before giving up on video**, you must have: (1) submitted with `amiko create video … --yes`, (2) waited through the ETA, (3) run `amiko create status <jobId>` **or** `amiko create media --service video`. If `COMPLETED` + `assetUrl`, report success with the URL. If still `PROCESSING`, say it's still rendering — don't claim the pipeline is broken.
221
223
 
@@ -229,7 +231,7 @@ This twin has **two** optional TTS ids. They are **not** the same:
229
231
  | Image-to-video (single start frame) | `create image "cover art" --yes` → later `create status <jobId>` for URL → `create video "animate this" --first-frame <url> --yes` |
230
232
  | First + last frame | `create video "morph between frames" --first-frame <startUrl> --last-frame <endUrl> --yes` |
231
233
  | Seedance multimodal refs | `create video "dance to this beat" --model dreamina-seedance-2-0-fast-260128 --reference-image <url> --reference-audio ./beat.wav --generate-audio --yes` (repeat `--reference-image` up to 9×, `--reference-video`/`--reference-audio` up to 3×) |
232
- | MiniMax subject reference (S2V) | `create video "character walks forward" --subject-reference <portraitUrl> --yes` |
234
+ | MiniMax subject reference (S2V) | `create video "character walks forward" --model S2V-01 --subject-reference <portraitUrl> --yes` — **`S2V-01` is the only MiniMax model that accepts `subject_reference`**; passing `--subject-reference` alone now selects it for you, but naming any Hailuo model beside it is rejected up front |
233
235
  | MiniMax H3 long clip (per-second billing) | `create video "slow pan over dunes at dusk" --model MiniMax-H3 --seconds 12 --resolution 2K --aspect 21:9 --yes` — quote first; cost scales with `--seconds`, and 2K bills more per second than 768P |
234
236
  | MiniMax H3 reference-to-video | `create video "same character, now dancing" --model MiniMax-H3 --reference-image <url> --reference-video ./clip.mp4 --yes` — never mix `--first-frame`/`--last-frame` with reference flags on H3; the CLI/server reject the combination |
235
237
 
@@ -241,9 +243,12 @@ This twin has **two** optional TTS ids. They are **not** the same:
241
243
  | **Seedance** | 9 | 3 | 3 | both, `--last-frame` needs `--first-frame` | frames exclusive with image/video references; audio needs an image or video reference beside it; video+audio combined ≤15s |
242
244
  | **Veo 3.1** | 3 | — | — | both, `--last-frame` needs `--first-frame` | frames exclusive with references; `-lite` is prompt-only |
243
245
  | **Grok** | 9 | — | — | `--first-frame` only | |
244
- | **Hailuo v1** (02 / 2.3 / 2.3-Fast) | — | — | — | `--first-frame` only | `--reference-image` is silently dropped — use `--subject-reference`, which Hailuo does read |
246
+ | **Hailuo v1** (02 / 2.3 / 2.3-Fast) | — | — | — | `--first-frame` only | takes **no** reference media: `--reference-image` is silently dropped, and `--subject-reference` is rejected by MiniMax. Want a character reference? `--model S2V-01`, or `--model MiniMax-H3` for reference-to-video |
247
+ | **S2V-01** | — | — | — | `--subject-reference` only | the one MiniMax model with `subject_reference`; one portrait, no other reference media, no frames |
248
+
249
+ Seedance 2.5 advertises up to **50** multimodal references upstream, but the CLI, the studio and mpp all still cap it at 9/3/3 with the ≤15s reference budget — BytePlus has not published what the longer-reference rules become at that ceiling, and a cap we can't verify is one that fails by generating and billing. Don't promise the owner 50; 2.5's usable win today is **duration** (30s vs 15s), not reference count.
245
250
 
246
- `--subject-reference` **replaces** a reference-image slot rather than adding one (except on Hailuo v1, where it's a separate field). The ≤15s combined budget and H3's 2–15s per-clip audio window are checked from the **local file's bytes** — so they're verified for `.wav` / `.mp4` / `.mov` paths and skipped (allowed through) for https URLs and `.mp3`, where the server has the last word.
251
+ `--subject-reference` **replaces** a reference-image slot rather than adding one, and only `S2V-01` reads it — every other MiniMax model fails the submit with `param 'subject_reference' is incompatible with model …`. The CLI refuses that pairing before the quote, so it costs nothing; it's still the wrong flag to reach for on Hailuo 02/2.3/2.3-Fast. The ≤15s combined budget and H3's 2–15s per-clip audio window are checked from the **local file's bytes** — so they're verified for `.wav` / `.mp4` / `.mov` paths and skipped (allowed through) for https URLs and `.mp3`, where the server has the last word.
247
252
 
248
253
  **Provider toggles** (each has a `--no-…` form): `--generate-audio`, `--watermark`, `--camera-fixed` (Seedance); `--prompt-optimizer` (MiniMax H3 + Hailuo v1); `--fast-pretreatment` (Hailuo v1). Passing one to a model that ignores it is harmless — the server drops it.
249
254