@slatesvideo/shared 0.6.9 → 0.6.11

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.
@@ -0,0 +1,22 @@
1
+ export declare const UPDATE_CACHE_FILE: string;
2
+ /** Numeric semver compare on the release segments; a prerelease suffix is ignored. */
3
+ export declare function compareVersions(a: string, b: string): number;
4
+ /** The newest version the last registry lookup recorded for `pkgName`. Sync, disk only. */
5
+ export declare function cachedLatestVersion(pkgName: string, cacheFile?: string): string | null;
6
+ /**
7
+ * Refresh the cached latest version from the npm registry when the entry is
8
+ * older than an hour. Bounded by FETCH_TIMEOUT_MS, never throws. Returns the
9
+ * latest version known after the call (fresh or cached), or null.
10
+ */
11
+ export declare function refreshLatestVersion(pkgName: string, options?: {
12
+ cacheFile?: string;
13
+ registryUrl?: string;
14
+ now?: number;
15
+ }): Promise<string | null>;
16
+ /**
17
+ * One sentence when `current` is behind `latest`, else null. `howToUpdate` is
18
+ * the surface-specific action: the MCP server's is a client restart, the CLI's
19
+ * is a reinstall.
20
+ */
21
+ export declare function updateNotice(pkgName: string, current: string, latest: string | null, howToUpdate: string): string | null;
22
+ //# sourceMappingURL=update-check.d.ts.map
@@ -0,0 +1,109 @@
1
+ // Version handshake for the two published entry points (@slatesvideo/mcp-server
2
+ // and @slatesvideo/cli).
3
+ //
4
+ // WHY THIS EXISTS (2026-09-13): a Discord user's agent reported "H3 isn't in
5
+ // the API tool, only Kling, Veo and Seedance are exposed" — a server older
6
+ // than 0.5.10 (2026-08-28). Nothing told him, and nothing told his agent. The
7
+ // install path is `npx -y @slatesvideo/mcp-server` with no version pinned, so
8
+ // a client RESTART is the whole update; the failure is a client that never
9
+ // restarts, a global install nobody re-runs, or skill files copied months ago.
10
+ //
11
+ // HOW IT WORKS. One small registry GET (`/<pkg>/latest`), cached on disk in
12
+ // ~/.slates/update-check.json and refreshed at most once an hour. Readers are
13
+ // SYNCHRONOUS and disk-only so the MCP server can put the notice into its
14
+ // `instructions` at construction time without delaying startup; the refresh
15
+ // runs in the background for the NEXT launch. The CLI awaits the refresh
16
+ // (bounded by FETCH_TIMEOUT_MS) because a CLI turn already pays for a network
17
+ // call. Every path is fail-silent: no network, no home dir, no registry —
18
+ // no notice, never an error.
19
+ import { mkdirSync, readFileSync, writeFileSync } from 'node:fs';
20
+ import { join } from 'node:path';
21
+ import { AGENT_DIR } from './auth.js';
22
+ export const UPDATE_CACHE_FILE = join(AGENT_DIR, 'update-check.json');
23
+ const REFRESH_AFTER_MS = 60 * 60 * 1000;
24
+ const FETCH_TIMEOUT_MS = 2500;
25
+ /** Numeric semver compare on the release segments; a prerelease suffix is ignored. */
26
+ export function compareVersions(a, b) {
27
+ const parse = (v) => v.replace(/^v/, '').split('-')[0].split('.').map((n) => Number.parseInt(n, 10) || 0);
28
+ const pa = parse(a);
29
+ const pb = parse(b);
30
+ for (let i = 0; i < Math.max(pa.length, pb.length); i++) {
31
+ const d = (pa[i] ?? 0) - (pb[i] ?? 0);
32
+ if (d !== 0)
33
+ return d;
34
+ }
35
+ return 0;
36
+ }
37
+ function readCache(file) {
38
+ try {
39
+ const parsed = JSON.parse(readFileSync(file, 'utf8'));
40
+ return parsed && typeof parsed === 'object' ? parsed : {};
41
+ }
42
+ catch {
43
+ return {};
44
+ }
45
+ }
46
+ function writeCache(file, cache) {
47
+ try {
48
+ mkdirSync(join(file, '..'), { recursive: true });
49
+ writeFileSync(file, JSON.stringify(cache, null, 2) + '\n', 'utf8');
50
+ }
51
+ catch {
52
+ // A read-only home is not a reason to fail a generation.
53
+ }
54
+ }
55
+ /** The newest version the last registry lookup recorded for `pkgName`. Sync, disk only. */
56
+ export function cachedLatestVersion(pkgName, cacheFile = UPDATE_CACHE_FILE) {
57
+ const entry = readCache(cacheFile)[pkgName];
58
+ return entry && typeof entry.latest === 'string' ? entry.latest : null;
59
+ }
60
+ /**
61
+ * Refresh the cached latest version from the npm registry when the entry is
62
+ * older than an hour. Bounded by FETCH_TIMEOUT_MS, never throws. Returns the
63
+ * latest version known after the call (fresh or cached), or null.
64
+ */
65
+ export async function refreshLatestVersion(pkgName, options = {}) {
66
+ const cacheFile = options.cacheFile ?? UPDATE_CACHE_FILE;
67
+ const now = options.now ?? Date.now();
68
+ const cache = readCache(cacheFile);
69
+ const entry = cache[pkgName];
70
+ if (entry && now - entry.checkedAt < REFRESH_AFTER_MS)
71
+ return entry.latest;
72
+ const registryUrl = options.registryUrl ?? 'https://registry.npmjs.org';
73
+ const controller = new AbortController();
74
+ const timer = setTimeout(() => controller.abort(), FETCH_TIMEOUT_MS);
75
+ // A stdio server exits when its client closes; a pending timer must not
76
+ // hold the process open for the rest of the timeout.
77
+ timer.unref?.();
78
+ try {
79
+ const res = await fetch(`${registryUrl}/${pkgName}/latest`, {
80
+ signal: controller.signal,
81
+ headers: { accept: 'application/json' },
82
+ });
83
+ if (!res.ok)
84
+ return entry?.latest ?? null;
85
+ const body = (await res.json());
86
+ if (typeof body.version !== 'string')
87
+ return entry?.latest ?? null;
88
+ cache[pkgName] = { latest: body.version, checkedAt: now };
89
+ writeCache(cacheFile, cache);
90
+ return body.version;
91
+ }
92
+ catch {
93
+ return entry?.latest ?? null;
94
+ }
95
+ finally {
96
+ clearTimeout(timer);
97
+ }
98
+ }
99
+ /**
100
+ * One sentence when `current` is behind `latest`, else null. `howToUpdate` is
101
+ * the surface-specific action: the MCP server's is a client restart, the CLI's
102
+ * is a reinstall.
103
+ */
104
+ export function updateNotice(pkgName, current, latest, howToUpdate) {
105
+ if (!latest || compareVersions(current, latest) >= 0)
106
+ return null;
107
+ return `UPDATE AVAILABLE: ${pkgName} v${current} is running; v${latest} is published. ${howToUpdate}`;
108
+ }
109
+ //# sourceMappingURL=update-check.js.map
@@ -16,8 +16,8 @@ This portable skill is deliberately thin. Its reference files are generated dire
16
16
  <!-- @generated:model-routing -->
17
17
  | Model | Canonical route | Guide |
18
18
  |---|---|---|
19
- | **Kling 3.0** | DEFAULT general-purpose video model — cost-effective, strong start-frame adherence (identity, layout, text), acting, dialogue, lip-sync, and the widest aspect-ratio set. Escalate to Seedance for physics. Kling is also the ONLY engine behind the Motion Transfer and Lip Sync tools. | `reference-kling.md` |
20
- | **Seedance 2.0** | PREMIUM video tier and the DEFAULT video model — route here the moment physics, effects, destruction or scale matter, and for hero shots. VIDEO-ONLY. Strong image-to-video and own-footage restyle. 4K is Pro-gated (base accounts get PRO_REQUIRED). Stays the default over 2.5: it is the only Seedance with native 4K and it is cheaper at every tier the two share. | `reference-seedance.md` |
19
+ | **Kling 3.0** | THE COST-EFFECTIVE SEAT — strong start-frame adherence (identity, layout, text), acting, dialogue, lip-sync and the widest aspect-ratio set; pick it when the budget matters and the shot is a performance or a start-frame animation. Kling is also the ONLY engine behind the Motion Transfer and Lip Sync tools. | `reference-kling.md` |
20
+ | **Seedance 2.0** | THE 4K AND VALUE SEAT beside the 2.5 default — the only Seedance with native 4K (Pro-gated; base accounts get PRO_REQUIRED) and cheaper than 2.5 at every resolution they share, with the same physics, effects and scale strengths; shorter takes, fewer references, no timestamps. VIDEO-ONLY. A bare "seedance" still resolves here for older CLIs that expect 4K. | `reference-seedance.md` |
21
21
  | **Nano Banana 2 (Gemini 3.1 Flash Image)** | DEFAULT image model and the all-rounder — route here unless another seat's speciality is the point. Best start-frame for legible in-scene text. Knowledge cutoff Jan 2025: anything later needs reference images. | `reference-nano-banana.md` |
22
22
  <!-- @end:model-routing -->
23
23
 
@@ -28,14 +28,14 @@
28
28
  },
29
29
  {
30
30
  "path": "src/prompts/model-facts.ts",
31
- "sha256": "63d6709c85d2f11d4244e46bd1a595094f1cf7066e2ac69c8a2b46783e4dc4b6"
31
+ "sha256": "4df3ac4b003ed29c2e1992a34519e01957e5292211a294bb2af0045daf9d4194"
32
32
  }
33
33
  ],
34
34
  "outputs": [
35
35
  {
36
36
  "path": "SKILL.md",
37
- "bytes": 4598,
38
- "sha256": "47cd166742efe1b15fb25603922695c5397ab9d24a839fb524d69cde426a6f89"
37
+ "bytes": 4622,
38
+ "sha256": "0c3f1982796fe668824067b06e8d76070aaae2d00d47a978ef5bd8b489b2a3da"
39
39
  },
40
40
  {
41
41
  "path": "reference-character.md",
@@ -65,8 +65,8 @@
65
65
  ],
66
66
  "archive": {
67
67
  "path": "slates-prompt-builder.skill",
68
- "bytes": 40497,
69
- "sha256": "6289a7827816f38fa6cf6c9afe8c6a0d9efa865861a4e732170a40b584edc8a7",
68
+ "bytes": 40546,
69
+ "sha256": "0760799f957aac866590768dd00bc74cd4c32525364455c0eab96dba334c4de4",
70
70
  "entries": [
71
71
  "SKILL.md",
72
72
  "reference-character.md",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@slatesvideo/shared",
3
- "version": "0.6.9",
3
+ "version": "0.6.11",
4
4
  "description": "Shared operations layer for the Slates MCP server and CLI: auth, cloud/desktop clients, and the single tool surface both consume. Most users want @slatesvideo/mcp-server or @slatesvideo/cli instead.",
5
5
  "license": "MIT",
6
6
  "type": "module",
@@ -43,7 +43,7 @@
43
43
  "sync-partials": "node scripts/sync-partials.mjs",
44
44
  "build-prompt-builder": "node scripts/build-prompt-builder.mjs",
45
45
  "check-prompt-builder": "node scripts/build-prompt-builder.mjs --check",
46
- "build": "node scripts/sync-partials.mjs --check && node scripts/build-prompt-builder.mjs --check && node scripts/embed-skills.mjs && tsc && node scripts/render-capability-partials.mjs --check",
46
+ "build": "node scripts/sync-partials.mjs --check && node scripts/build-prompt-builder.mjs --check && node scripts/embed-skills.mjs && tsc && node scripts/render-capability-partials.mjs --check && node scripts/update-check-check.mjs",
47
47
  "typecheck": "node scripts/sync-partials.mjs --check && node scripts/build-prompt-builder.mjs --check && node scripts/embed-skills.mjs && tsc --noEmit",
48
48
  "prepublishOnly": "npm run build",
49
49
  "render-partials": "node scripts/render-capability-partials.mjs"
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: slates-model-selection
3
- description: Which model to pick for a given job — the routing doctrine. Read BEFORE choosing any video or image model, before quoting a plan, and before defaulting anywhere. Kling 3.0 is the general-purpose video default; Seedance 2.0 is the premium tier for anything where physics, effects, or scale remotely matter; Seedance 2.5 is a SECOND SEAT beside 2.0 (30s takes, 30 references and timestamp control, but no 4K and dearer at every shared resolution — never an upgrade); MiniMax H3 is the AUTHORED-AUDIO seat (three directable sound layers in one pass, declared reference relationships, 480p-4K) with MiniMax H3 Max beside it as a faster 768p-capped, reference-free premium; Veo 3.1 is a narrow niche (native synced audio in one gen, 16:9 or 9:16, 4/6/8s) and never the default.
3
+ description: Which model to pick for a given job — the routing doctrine. Read BEFORE choosing any video or image model, before quoting a plan, and before defaulting anywhere. Seedance 2.5 is the DEFAULT video model (Eric, 2026-09-13: the best in the world — physics, effects, scale, 30s takes, 30 references, timestamps); Seedance 2.0 is the 4K seat and the cheaper one at every shared resolution; Kling 3.0 is the cost-effective seat for performances, start-frame animation and lip-sync; MiniMax H3 is the AUTHORED-AUDIO seat (three directable sound layers in one pass, declared reference relationships, 480p-4K) with MiniMax H3 Max beside it as a faster 768p-capped premium with omni-references; Veo 3.1 is a narrow niche (native synced audio in one gen, 16:9 or 9:16, 4/6/8s) and never the default.
4
4
  ---
5
5
 
6
6
  # Model selection — the routing doctrine
@@ -23,12 +23,12 @@ The tables below are a snapshot. This roster churns constantly (NB2 Lite, Omni F
23
23
 
24
24
  | Job | Model | Why |
25
25
  |---|---|---|
26
- | **General-purpose — the default for most shots** | **Kling 3.0 std** | Cost-effective workhorse. Strong image-to-video: preserves identity, layout, and text from the start frame. 16:9 / 9:16 / 1:1, 3–15s. |
26
+ | **General-purpose — the default for most shots** | **Seedance 2.5** | The strongest seat in the catalogue: physics, effects, scale and hero shots, 4–30s in one take, 30 image + 10 video + 10 audio references, audio-only refs, and the only Seedance seat that acts on timestamps. 480p / 720p / 1080p, no 4K. LENGTH is the price dial — quote any take over ~10s. |
27
+ | **Cost matters and the shot is a performance or a start-frame animation** | **Kling 3.0 std** | Cost-effective workhorse. Strong image-to-video: preserves identity, layout, and text from the start frame. 16:9 / 9:16 / 1:1, 3–15s. |
27
28
  | Higher visual polish, no physics demands | Kling 3.0 pro | Mid-price fidelity bump on the same strengths. |
28
29
  | Multi-character dialogue / audio co-generation | Kling 3.0 omni | Dialogue syntax, voice direction, language codes, `@element` refs. |
29
- | **Anything with remotely important physics** — effects, destruction, water/fire/smoke/cloth, creature motion, scale, complex simultaneous action | **Seedance 2.0** | The premium tier. Physics and effects are its whole edge; up to 9 ingredient refs, first+last frame, native 4K (4K video is Pro-only). |
30
- | The premium hero shot a piece hangs on | Seedance 2.0 | Spend where it shows. |
31
- | **One take longer than 15 seconds**, or a shot needing more than 9 image references, or an AUDIO-ONLY reference, or **beats that have to land at a named second** | **Seedance 2.5** | A SECOND SEAT beside 2.0, never an upgrade: 4–30s in one take, 30 image + 10 video + 10 audio references, audio-only refs, and the only Seedance seat that **acts on timestamps** (rules in `slates-prompting-seedance-2-5` § Timestamps) — 480p / 720p / 1080p, **no 4K**, and **dearer than 2.0 at every shared resolution** (720p $0.231/s vs $0.15/s, +54%). If you want 4K, or the same resolution cheaper, stay on 2.0. 🚨 Two live hazards: (a) with references attached, the words *add / remove / replace / change / extend / continue* make it reclassify the request as a video EDIT and fail AFTER the job queues — describe the finished frame, or use `seedance-2.5-edit`; (b) LENGTH is the price dial, not resolution — a 30s 720p face gen is 489 credits and a 30s 1080p faceless gen is 614, against a 1,000-credit welcome grant. Quote before any take over ~10s. |
30
+ | **4K delivery**, or the same resolution cheaper than 2.5 | **Seedance 2.0** | The only Seedance with native 4K (4K video is Pro-only) and cheaper than 2.5 at every shared resolution (720p $0.15/s vs $0.231/s). Same physics and effects strengths; 15s takes, 15 references, no timestamps. |
31
+ | **One take longer than 15 seconds**, more than 15 references, an AUDIO-ONLY reference, or **beats that have to land at a named second** | **Seedance 2.5** | Only 2.5 does these (rules in `slates-prompting-seedance-2-5` § Timestamps); it is the default anyway. 🚨 Two live hazards: (a) with references attached, the words *add / remove / replace / change / extend / continue* make it reclassify the request as a video EDIT and fail AFTER the job queues — describe the finished frame, or use `seedance-2.5-edit`; (b) LENGTH is the price dial, not resolution — a 30s 720p face gen is 489 credits and a 30s 1080p faceless gen is 614, against a 1,000-credit welcome grant. Quote before any take over ~10s. |
32
32
  | **The SOUND has to be directed, not just present** — a specific line delivered a specific way, scene sound that has to sit under it, and score that must stay out of the characters' world | **MiniMax H3** | The only seat where audio is authored in three separate layers in ONE pass (synchronised events in the body, ambience in a soundscape section, audience-only score in its own) rather than toggled on. 5–15s, 480p / 768p / 2K / 4K, 24fps, 32kHz stereo, 11 languages. Rules in `slates-prompting-minimax-h3`. |
33
33
  | **A reference has to keep a DECLARED amount of itself** — especially moving one subject's characteristic onto a *different* subject | **MiniMax H3** | The only seat that understands a stated retention relationship (kept whole / kept in part / transferred onto another subject / loose echo). 9 images + 3 video + 3 audio, 12 files total. 🚨 The first 5 reference images are free and every one after that costs 4 credits — pass `referenceImages` to `slates_estimate_generation_cost` before a reference-heavy job. |
34
34
  | **Turnaround is the requirement** on a text-to-video or start-frame shot at 480p/768p | **MiniMax H3 Max** | fal's self-hosted post-train of H3. **Measured 2026-08-27: a 5s 768p clip finished in 4.8s against 57s on base H3 — about 12x faster**, same prompt, queue to file. When turnaround is the requirement this is not a marginal win. 🚨 It is the PREMIUM seat, not a cheap H3 — $0.080/s at 768p against base H3's $0.060/s, 33% more, and it tops out at 768p. It still animates a start frame and an end frame — image-to-video is one of the two things it is for — and since 2026-09-09 it takes the full omni-reference set too (9 images + 3 video + 3 audio), so the seats now differ on ladder and price rather than on what they accept. Never the default; never reach for it to save money. |
@@ -77,11 +77,11 @@ Both tools are **Kling-only**. Every entry in them is a real Kling endpoint that
77
77
 
78
78
  **Rules:**
79
79
 
80
- - **Default video = Kling 3.0 std.** Escalate to Seedance the moment the shot has physics/effects weight or is the hero moment — and say why in the plan ("physics-heavy, routing to Seedance").
80
+ - **Default video = Seedance 2.5.** Route to Seedance 2.0 for 4K or when the same resolution must be cheaper, and to Kling 3.0 std when the budget matters and the shot is a performance or a start-frame animation — and say why in the plan ("4K delivery, routing to 2.0"; "budget dialogue shot, routing to Kling").
81
81
  - **Veo is never the default.** 16:9 or 9:16 only, 4/6/8s only (and 8s only at 1080p/4K, or with reference images), and it is not the quality pick — treat it as a single-purpose tool for native-synced-audio shots. If audio can be added after (Kling lip-sync, edit stage), prefer Kling or Seedance + audio in post.
82
82
  - **9:16 vertical → Kling or Seedance by preference**, not by necessity: Veo does take 9:16 on the route Slates uses. Route away from it because it is the niche seat, not because it can't.
83
83
  - **Ratios and durations are enforced before submit.** `slates_generate_video` validates the aspect ratio, resolution and duration against the model you picked and refuses out-of-set values with the legal list — it will not silently ignore or downgrade them. The authoritative per-model sets are in the op's own param descriptions, which are generated from the capability SSOT; prefer those over any list written in prose here.
84
- - **Image-to-video from an NB2 start frame** (the standard pipeline) → Kling by default, Seedance when the motion is physics-heavy. Not Veo.
84
+ - **Image-to-video from an NB2 start frame** (the standard pipeline) → Seedance 2.5 by default, Kling when the budget matters and the motion is a performance. Not Veo.
85
85
  - **User names a model explicitly → use it.** But if it's a mismatch for the job (crazy physics on Kling std, a 30s take on anything but Seedance 2.5, 4K on Seedance 2.5 which has none), say so in one line and offer the right route before generating.
86
86
 
87
87
  ## Image routing
@@ -64,9 +64,10 @@ Fork each bound frame's image Shot with `slates_duplicate_shot` (`model:` the vi
64
64
  ⚠️ **It runs SEQUENTIALLY and blocks until the last clip lands** — a 6-shot film is one long wait, and it will usually outlast the HTTP timeout while the run keeps going. When that happens, poll `slates_get_shot` for each Shot's `generationIds` and then `slates_get_generation_status`; **never re-fire, that double-spends.** (Concurrent batch firing needs a real queue — concurrency limiting, per-item failure isolation, partial-billing semantics — and is deliberately not built yet.)
65
65
 
66
66
  **Model mixing — route per `slates-model-selection`** (details in the per-model guides):
67
- - **Kling V3** (`slates-prompting-kling-v3`): the DEFAULT for most shots — 16:9 / 9:16 / 1:1, 3-15s, strong start-frame adherence; std is the workhorse, Omni for multi-character dialogue.
68
- - **Seedance 2** (`slates-prompting-seedance`): the PREMIUM tier — any shot where physics/effects/scale remotely matter, plus the hero shot; audio included, first+last frame guidance, native 4K (4K video is Pro-only).
69
- - **MiniMax H3** (`slates-prompting-minimax-h3`): route here when a shot's SOUND is part of the writing — a line delivered a particular way, scene sound under it, score that must stay outside the characters' world. It authors all three in one pass, which **collapses a shot's audio pass into its video pass** and removes the separate `slates_generate_audio` step for that shot. 5-15s, 480p/768p/2K/4K. Its sibling `minimax-h3-max` is faster, tops out at 1080p, takes the same references, and costs MORE at 768p — a deliberate speed pick, never a saving.
67
+ - **Seedance 2.5** (`slates-prompting-seedance-2-5`): the DEFAULT for most shots — physics, effects, scale and the hero shot; 4-30s takes, 30 image references, timestamps; 480p/720p/1080p, no 4K. LENGTH is the price dial.
68
+ - **Seedance 2** (`slates-prompting-seedance`): the 4K seat, cheaper than 2.5 at every shared resolution; audio included, first+last frame guidance, native 4K (4K video is Pro-only).
69
+ - **Kling V3** (`slates-prompting-kling-v3`): the cost-effective seat — 16:9 / 9:16 / 1:1, 3-15s, strong start-frame adherence; std is the workhorse, Omni for multi-character dialogue.
70
+ - **MiniMax H3** (`slates-prompting-minimax-h3`): route here when a shot's SOUND is part of the writing — a line delivered a particular way, scene sound under it, score that must stay outside the characters' world. It authors all three in one pass, which **collapses a shot's audio pass into its video pass** and removes the separate `slates_generate_audio` step for that shot. 5-15s, 480p/768p/2K/4K. Its sibling `minimax-h3-max` is faster, tops out at 768p, takes the same references, and costs MORE at 768p — a deliberate speed pick, never a saving.
70
71
  - **Veo 3.1** (`slates-prompting-veo-3`): niche, never the default — only when native synced audio must generate WITH the video in one gen; 16:9 or 9:16, 4/6/8s (8s only at 1080p/4K or with reference images).
71
72
 
72
73
  Failed gen? The run continues past it and **nothing is retried automatically**. Read the per-Shot error in the result, fix that Shot with `slates_update_shot`, and re-fire only it (a retry beyond the plan = announce the delta cost).
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: slates-prompting-minimax-h3
3
- description: How to prompt MiniMax H3 and MiniMax H3 Max. Read before calling slates_generate_video with model minimax-h3 or minimax-h3-max. H3 is the only Slates video seat where AUDIO IS AUTHORED rather than toggled — synchronised dialogue, scene sound and an audience-only score are three separate sections of the prompt, generated in one pass — and the only one where a reference carries a DECLARED RELATIONSHIP (kept whole, partly kept, transferred onto a different subject, or a loose echo). Base minimax-h3 runs 480p/768p/2K/4K and reads 9 images + 3 video + 3 audio references; minimax-h3-max is fal's faster post-train, capped at 768p, and costs MORE than base H3 at 768p — a deliberate speed pick, never the default and never the cheap one; it animates start and end frames AND takes the same 9+3+3 omni-reference set (corrected 2026-09-09), so the seats differ on ladder and price, not on what they accept. Two hazards live here: reference images past the free allowance are billed (5 free then +4 credits on base H3; 4 free then +1 on Max), and audio written into the wrong section is dropped or duplicated.
3
+ description: How to prompt MiniMax H3 and MiniMax H3 Max. Read before calling slates_generate_video with model minimax-h3 or minimax-h3-max. H3 is the only Slates video seat where AUDIO IS AUTHORED rather than toggled — synchronised dialogue, scene sound and an audience-only score are three separate sections of the prompt, generated in one pass — and the only one where a reference carries a DECLARED RELATIONSHIP (kept whole, partly kept, transferred onto a different subject, or a loose echo). Base minimax-h3 runs 480p/768p/2K/4K and reads 9 images + 3 video + 3 audio references; minimax-h3-max is fal's faster post-train, capped at 768p, and costs MORE than base H3 at 768p — a deliberate speed pick, never the default and never the cheap one; it animates start and end frames AND takes the same 9+3+3 omni-reference set (corrected 2026-09-09), so the seats differ on ladder and price, not on what they accept. Two hazards live here: reference images past the free allowance are billed (5 free then +4 credits on base H3; pooled media tokens on Max), and audio written into the wrong section is dropped or duplicated.
4
4
  ---
5
5
 
6
6
  # MiniMax H3 — prompting
@@ -28,7 +28,7 @@ description: How to prompt MiniMax H3 and MiniMax H3 Max. Read before calling sl
28
28
  - `A woman sits still at a kitchen table for a beat, then looks up. She says in English, "You said Tuesday." Scene sound: a fridge hum, a spoon set down on formica. Score: none.`
29
29
  - `Two mechanics either side of an open bonnet. The younger one wipes his hands, waits, then speaks in Spanish, "No es el alternador." Scene sound: a socket wrench, a radio two bays over. Score: a low sustained cello under the last three seconds, audience only.`
30
30
 
31
- **Hard constraint:** the two seats differ in what the ENDPOINT accepts, not in grammar. Base H3 reaches 2K/4K and takes references; `minimax-h3-max` tops out at 1080p rather than 4K, takes the same 9+3+3 references, and costs MORE at the tier they share — it is a speed pick, never the cheap one. H3's top two resolution tiers are UPSCALES of the native render: judge at native. Reference images past the free allowance are a paid dimension of the cost key (5 free on base, 4 on Max) — declare the count when quoting.
31
+ **Hard constraint:** the two seats differ in what the ENDPOINT accepts, not in grammar. Base H3 reaches 2K/4K and takes references; `minimax-h3-max` tops out at 768p rather than 4K, takes the same 9+3+3 references, and costs MORE at the tier they share — it is a speed pick, never the cheap one. H3's top two resolution tiers are UPSCALES of the native render: judge at native. Reference inputs affect the quote; include every attached modality when estimating.
32
32
  <!-- @card:end -->
33
33
 
34
34
  <!-- @banned:start -->
@@ -55,7 +55,7 @@ endpoint accepts:
55
55
 
56
56
  | | `minimax-h3` | `minimax-h3-max` |
57
57
  |---|---|---|
58
- | Resolution | 480p / 768p / **2K / 4K** | 480p / 768p / **1080p** |
58
+ | Resolution | 480p / 768p / **2K / 4K** | 480p / 768p |
59
59
  | References | 9 images + 3 video + 3 audio (12 files) | 9 images + 3 video + 3 audio (12 files) |
60
60
  | Frames | start and/or end | start and/or end |
61
61
  | Price at 768p | **$0.060/s** | $0.080/s |
@@ -262,11 +262,12 @@ with at least one image or video reference.
262
262
 
263
263
  ### 💸 Reference images past the free allowance are billed — and the two rows differ
264
264
 
265
- On `minimax-h3` the first **5** are free and each additional image adds **4 credits**. On
266
- `minimax-h3-max` the first **4** are free and each additional image adds **1 credit** — fal prices
267
- Max's references by token rather than per image, and Slates normalises every Max reference to
268
- 1024x1024 so that per-image number is exact. Both rows take **9** images, at every resolution and
269
- every length. Four extra images on a 10s
265
+ On `minimax-h3` the first **5** are free and each additional image adds **4 credits**.
266
+ Max pools image pixels, reference-video seconds and reference-audio seconds into one token
267
+ allowance. Include `referenceImages`, `videoRefSeconds` and `audioRefSeconds` when estimating;
268
+ character voices count as audio. The generation preflight resolves the actual attached media.
269
+
270
+ Four extra images on a 10s
270
271
  768p clip add 16 credits to a 30-credit generation: **more than half again**, for references that
271
272
  often make the output worse rather than better (see the 2–4 rule above).
272
273
 
@@ -300,9 +301,7 @@ dropping one side.
300
301
  | `minimax-h3` · 2K · 10s | 65 |
301
302
  | `minimax-h3` · 4K · 10s | 80 |
302
303
  | `minimax-h3-max` · 768p · 10s | 40 |
303
- | `minimax-h3-max` · 1080p · 10s | 80 |
304
304
  | `minimax-h3` — every reference image past the **fifth** | **+4** |
305
- | `minimax-h3-max` — every reference image past the **fourth** | **+1** |
306
305
 
307
306
  **768p is the default for a reason.** It is the tier the model natively generates.
308
307
 
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: slates-prompting-seedance-2-5
3
- description: How to prompt Seedance 2.5 and Seedance 2.5 Edit. Read before calling slates_generate_video with model seedance-2.5, or slates_edit_video with model seedance-2.5-edit. 2.5 is a SECOND SEAT next to 2.0, not an upgrade — it buys 30-second takes, 30 image references, audio-only references and INTEGER-SECOND TIMESTAMPS, and it gives up native 4K and costs more than 2.0 at every resolution they share. Timestamps are the one grammar difference that matters: 2.0 ignores them and answers only to shot numbers, 2.5 acts on them. Otherwise it shares 2.0's grammar (read slates-prompting-seedance for subject binding, camera and constraint vocabulary); this file covers what is different, plus the two hazards unique to 2.5 — the prompt-intent task classifier and the cost trap that comes with 30-second takes.
3
+ description: How to prompt Seedance 2.5 and Seedance 2.5 Edit. Read before calling slates_generate_video with model seedance-2.5, or slates_edit_video with model seedance-2.5-edit. 2.5 is the DEFAULT video model (Eric, 2026-09-13) — against 2.0 it buys 30-second takes, 30 image references, audio-only references and INTEGER-SECOND TIMESTAMPS, and it gives up native 4K and costs more than 2.0 at every resolution they share. Timestamps are the one grammar difference that matters: 2.0 ignores them and answers only to shot numbers, 2.5 acts on them. Otherwise it shares 2.0's grammar (read slates-prompting-seedance for subject binding, camera and constraint vocabulary); this file covers what is different, plus the two hazards unique to 2.5 — the prompt-intent task classifier and the cost trap that comes with 30-second takes.
4
4
  ---
5
5
 
6
6
  # Seedance 2.5 — prompting
@@ -28,7 +28,7 @@ description: How to prompt Seedance 2.5 and Seedance 2.5 Edit. Read before calli
28
28
  - `[0-6] Wide shot, <Subject_1>@<Image_1> crosses an empty car park toward a idling van, slow track right. [6-12] Medium, she stops as the driver's window comes down. [12-18] Close-up, she looks off past the lens and does not answer. Rich details, natural colors. Keep it subtitle-free.`
29
29
  - `[0-10] A single continuous handheld follow behind a courier climbing a fire escape, rain. [10-20] She reaches the landing, turns, and the city opens behind her. Cinematic texture, soft lighting.`
30
30
 
31
- **Hard constraint:** it is the EXPENSIVE seat and it has NO 4K — 480p/720p/1080p only, and dearer than 2.0 at every resolution they share. It is a second seat, never an upgrade. Long takes multiply cost linearly: quote a 30-second take before you fire it.
31
+ **Hard constraint:** it is the default AND the dearer seat, and it has NO 4K — 480p/720p/1080p only, dearer than 2.0 at every resolution they share. Long takes multiply cost linearly: quote a 30-second take before you fire it.
32
32
  <!-- @card:end -->
33
33
 
34
34
  <!-- @banned:start -->
@@ -70,11 +70,10 @@ So 2.5 does not replace 2.0; it sits beside it, and you pay for what it buys:
70
70
  | **Timestamps in the prompt** | **✗ — ignored; shot numbers only** | **✓ — integer seconds, acted on** |
71
71
  | Multi-view image as ONE subject reference | ✗ (not recommended) | **✓ (up to 5 subjects)** |
72
72
  | Video edit as its own task type | ✗ | **✓ (`seedance-2.5-edit`)** |
73
- | Default video model | **yes** | no |
73
+ | Default video model | no | **yes** (since 2026-09-13) |
74
74
 
75
- **Route to 2.5 when the shot needs LENGTH, MANY REFERENCES, or an audio-only reference.
76
- Route to 2.0 when resolution matters at all** — which, for anything a client will see full-screen,
77
- is most of the time.
75
+ **2.5 is the default. Route to 2.0 for 4K delivery, or when the same resolution has to be
76
+ cheaper** — its 720p is $0.15/s against 2.5's $0.231/s.
78
77
 
79
78
  ---
80
79