@slatesvideo/shared 0.6.10 → 0.7.0
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 +1 -1
- package/dist/auth.js +2 -2
- package/dist/clients/cloud.js +1 -1
- package/dist/index.d.ts +2 -1
- package/dist/index.js +4 -1
- package/dist/manual/content.d.ts +1 -1
- package/dist/manual/content.js +1 -1
- package/dist/operations/index.d.ts +817 -16
- package/dist/operations/index.js +1423 -372
- package/dist/operations/surface.d.ts +3 -1
- package/dist/operations/surface.js +37 -10
- package/dist/prompts/ad-presets.d.ts +77 -0
- package/dist/prompts/ad-presets.js +43 -0
- package/dist/prompts/agent-doctrine.js +5 -4
- package/dist/prompts/banned-tokens.d.ts +4 -29
- package/dist/prompts/banned-tokens.js +29 -204
- package/dist/prompts/craft-cards.js +2 -2
- package/dist/prompts/generation-policy.d.ts +41 -0
- package/dist/prompts/generation-policy.js +53 -0
- package/dist/prompts/guide-retrieval.d.ts +9 -0
- package/dist/prompts/guide-retrieval.js +53 -0
- package/dist/prompts/index.d.ts +1 -0
- package/dist/prompts/index.js +1 -0
- package/dist/prompts/model-capabilities.d.ts +18 -1
- package/dist/prompts/model-capabilities.js +72 -19
- package/dist/prompts/model-facts.d.ts +59 -0
- package/dist/prompts/model-facts.js +121 -15
- package/dist/prompts/partials.generated.js +8 -2
- package/dist/prompts/prompting-tips.d.ts +1 -1
- package/dist/prompts/prompting-tips.js +63 -18
- package/dist/prompts/reference-composer.d.ts +2 -0
- package/dist/prompts/reference-composer.js +51 -50
- package/dist/prompts/script-document.d.ts +165 -0
- package/dist/prompts/script-document.js +11 -0
- package/dist/prompts/shot-grammar.d.ts +4 -4
- package/dist/prompts/shot-grammar.js +3 -3
- package/dist/prompts/shot-spec.d.ts +13 -0
- package/dist/prompts/shot-spec.js +23 -5
- package/dist/skills/content.js +26 -23
- package/dist/update-check.d.ts +22 -0
- package/dist/update-check.js +109 -0
- package/exports/slates-chatgpt-images/generated/SKILL.md +107 -0
- package/exports/slates-chatgpt-images/generated/slates-chatgpt-images.skill +0 -0
- package/exports/slates-prompt-builder/generated/SKILL.md +3 -3
- package/exports/slates-prompt-builder/generated/reference-character.md +9 -1
- package/exports/slates-prompt-builder/generated/reference-kling.md +3 -3
- package/exports/slates-prompt-builder/generated/reference-nano-banana.md +22 -10
- package/exports/slates-prompt-builder/generated/reference-seedance.md +4 -4
- package/exports/slates-prompt-builder/generated/slates-prompt-builder-manifest.json +17 -17
- package/exports/slates-prompt-builder/generated/slates-prompt-builder.skill +0 -0
- package/package.json +10 -4
- package/skills/_partials/cinematic-card.md +8 -0
- package/skills/_partials/cinematic-routes-short.md +2 -0
- package/skills/_partials/cinematic-tips-short.md +2 -0
- package/skills/_partials/decision-log.md +1 -13
- package/skills/_partials/image-defaults.md +11 -0
- package/skills/_partials/lens-video-split.md +1 -0
- package/skills/_partials/reference-rules-core.md +1 -1
- package/skills/_partials/sheet-tool-defaults.md +6 -0
- package/skills/slates-character-identity.md +9 -1
- package/skills/slates-chatgpt-images.md +107 -0
- package/skills/slates-cinematic-look.md +237 -0
- package/skills/slates-cost-discipline.md +18 -12
- package/skills/slates-direct-response-ad.md +13 -53
- package/skills/slates-edit-and-iterate.md +1 -1
- package/skills/slates-model-selection.md +139 -133
- package/skills/slates-one-prompt-film.md +38 -95
- package/skills/slates-project-organization.md +7 -3
- package/skills/slates-prompting-flux-2-max.md +15 -4
- package/skills/slates-prompting-gpt-image-2-5.md +41 -28
- package/skills/slates-prompting-kling-v3.md +3 -3
- package/skills/slates-prompting-lip-sync.md +1 -1
- package/skills/slates-prompting-minimax-h3.md +30 -17
- package/skills/slates-prompting-motion-transfer.md +1 -1
- package/skills/slates-prompting-nano-banana-2.md +24 -11
- package/skills/slates-prompting-seedance-2-5.md +12 -12
- package/skills/slates-prompting-seedance.md +5 -5
- package/skills/slates-prompting-seedream-5-lite.md +14 -3
- package/skills/slates-prompting-veo-3.md +1 -1
- package/skills/slates-script-craft.md +45 -0
- package/skills/slates-shot-variety.md +11 -40
- package/skills/slates-storyboard-from-script.md +14 -66
- package/skills/slates-style-prompting.md +54 -54
- package/skills/slates-ugc-influencer-ad.md +32 -309
- package/skills/slates-vision-feedback-loop.md +2 -1
|
@@ -1,3 +1,9 @@
|
|
|
1
|
+
/** Connected host, not an API model: capabilities are checked at runtime. */
|
|
2
|
+
export const CHATGPT_IMAGE_HOST = {
|
|
3
|
+
id: 'chatgpt-account', label: 'ChatGPT',
|
|
4
|
+
note: 'Generate with your connected ChatGPT account',
|
|
5
|
+
usage: 'Uses your ChatGPT account limits',
|
|
6
|
+
};
|
|
1
7
|
// Per-model prompting facts — routing doctrine and the prompt formula, as
|
|
2
8
|
// KNOWLEDGE (for skills + lead-magnet + op descriptions).
|
|
3
9
|
//
|
|
@@ -26,6 +32,19 @@
|
|
|
26
32
|
// Relative cost claims STAY ("dearer than 2.0 at every shared tier") — that is
|
|
27
33
|
// routing. The figures go, because those are data.
|
|
28
34
|
import { MODEL_CAPABILITIES } from './model-capabilities.js';
|
|
35
|
+
import { DEFAULT_IMAGE_SEAT, TOOL_SEAT } from './generation-policy.js';
|
|
36
|
+
/** Authoring presets only: these do not claim hosted ChatGPT API capabilities. */
|
|
37
|
+
export const CHATGPT_FRAMING_RATIOS = MODEL_CAPABILITIES['gpt-image-2-5-sunburst'].aspectRatios;
|
|
38
|
+
export function composeChatGptFraming(prompt, aspectRatio) {
|
|
39
|
+
if (aspectRatio === undefined)
|
|
40
|
+
return prompt;
|
|
41
|
+
if (!CHATGPT_FRAMING_RATIOS.includes(aspectRatio)) {
|
|
42
|
+
throw new Error('Choose a supported ChatGPT framing preset');
|
|
43
|
+
}
|
|
44
|
+
// Reuse may contain our previous appended request. Replace only this exact suffix.
|
|
45
|
+
const base = prompt.replace(/\n\nRequested output framing: \d+:\d+ aspect ratio\.$/, '');
|
|
46
|
+
return `${base}\n\nRequested output framing: ${aspectRatio} aspect ratio.`;
|
|
47
|
+
}
|
|
29
48
|
/**
|
|
30
49
|
* Reference caps for a fact, read out of the capability SSOT.
|
|
31
50
|
*
|
|
@@ -69,14 +88,14 @@ export function multimodalRefSummary(id) {
|
|
|
69
88
|
return '';
|
|
70
89
|
const parts = [];
|
|
71
90
|
if (v > 0)
|
|
72
|
-
parts.push(`${v}
|
|
91
|
+
parts.push(`${v} video${v === 1 ? '' : 's'} (${f.maxReferenceVideoSeconds}s total)`);
|
|
73
92
|
if (a > 0)
|
|
74
|
-
parts.push(`${a}
|
|
75
|
-
const total = f.maxReferenceFilesTotal ? `, ${f.maxReferenceFilesTotal} files max
|
|
93
|
+
parts.push(`${a} audio clip${a === 1 ? '' : 's'} (${f.maxReferenceAudioSeconds}s total)`);
|
|
94
|
+
const total = f.maxReferenceFilesTotal ? `, ${f.maxReferenceFilesTotal} files max` : '';
|
|
76
95
|
const companion = f.audioRefNeedsCompanion
|
|
77
|
-
? '
|
|
78
|
-
: '
|
|
79
|
-
return `${f.label}: up to ${parts.join('
|
|
96
|
+
? '; audio needs an image or video alongside.'
|
|
97
|
+
: '; audio-only is allowed.';
|
|
98
|
+
return `${f.label}: up to ${parts.join(' + ')}${total}${companion}`;
|
|
80
99
|
}
|
|
81
100
|
/**
|
|
82
101
|
* The prompt words that make Seedance 2.5 reclassify a reference-carrying
|
|
@@ -120,6 +139,7 @@ export const MODEL_FACTS = [
|
|
|
120
139
|
{
|
|
121
140
|
id: 'nano-banana-2',
|
|
122
141
|
route: 'generate',
|
|
142
|
+
tier: 'specialist',
|
|
123
143
|
// Gemini 3.1 FLASH Image — verified against the runtime slug map in
|
|
124
144
|
// slate/src/main/api/google.ts. Nano Banana PRO is a different model
|
|
125
145
|
// (gemini-3-pro-image-preview); do not conflate them.
|
|
@@ -127,11 +147,12 @@ export const MODEL_FACTS = [
|
|
|
127
147
|
kind: 'image',
|
|
128
148
|
// 14 = 10 object-fidelity + 4 character-consistency; the categories don't trade.
|
|
129
149
|
...caps('nano-banana-2'),
|
|
130
|
-
notes: '
|
|
150
|
+
notes: 'The all-rounder and the only image seat with a headless path: holds many subjects coherently in one frame, and the start-frame for legible in-scene text. Knowledge cutoff Jan 2025: anything later needs reference images.',
|
|
131
151
|
},
|
|
132
152
|
{
|
|
133
153
|
id: 'nano-banana-2-lite',
|
|
134
154
|
route: 'generate',
|
|
155
|
+
tier: 'specialist',
|
|
135
156
|
label: 'Nano Banana 2 Lite',
|
|
136
157
|
kind: 'image',
|
|
137
158
|
...caps('nano-banana-2-lite'),
|
|
@@ -140,6 +161,7 @@ export const MODEL_FACTS = [
|
|
|
140
161
|
{
|
|
141
162
|
id: 'nano-banana-pro',
|
|
142
163
|
route: 'generate',
|
|
164
|
+
tier: 'specialist',
|
|
143
165
|
label: 'Nano Banana Pro',
|
|
144
166
|
kind: 'image',
|
|
145
167
|
...caps('nano-banana-pro'),
|
|
@@ -148,6 +170,7 @@ export const MODEL_FACTS = [
|
|
|
148
170
|
{
|
|
149
171
|
id: 'gpt-image-2-5-flare',
|
|
150
172
|
route: 'generate',
|
|
173
|
+
tier: 'specialist',
|
|
151
174
|
label: 'GPT Image 2.5 Flare',
|
|
152
175
|
kind: 'image',
|
|
153
176
|
...caps('gpt-image-2-5-flare'),
|
|
@@ -156,14 +179,16 @@ export const MODEL_FACTS = [
|
|
|
156
179
|
{
|
|
157
180
|
id: 'gpt-image-2-5-sunburst',
|
|
158
181
|
route: 'generate',
|
|
182
|
+
tier: 'default',
|
|
159
183
|
label: 'GPT Image 2.5 Sunburst',
|
|
160
184
|
kind: 'image',
|
|
161
185
|
...caps('gpt-image-2-5-sunburst'),
|
|
162
|
-
notes: 'THE QUALITY GPT IMAGE SEAT — OpenAI\'s most capable image model, higher quality than GPT Image 2, same price as Flare, deliberately SLOWER. Route here
|
|
186
|
+
notes: 'THE QUALITY GPT IMAGE SEAT — OpenAI\'s most capable image model, higher quality than GPT Image 2, same price as Flare, deliberately SLOWER. Route here unless speed is the point: finals, hero frames, photoreal people, and multi-reference edits where every reference must survive into one frame — its widest lead. Explore on Flare, finish on Sunburst.',
|
|
163
187
|
},
|
|
164
188
|
{
|
|
165
189
|
id: 'flux-2-max',
|
|
166
190
|
route: 'generate',
|
|
191
|
+
tier: 'specialist',
|
|
167
192
|
label: 'FLUX.2 Max',
|
|
168
193
|
kind: 'image',
|
|
169
194
|
...caps('flux-2-max'),
|
|
@@ -172,6 +197,7 @@ export const MODEL_FACTS = [
|
|
|
172
197
|
{
|
|
173
198
|
id: 'seedream-5-lite',
|
|
174
199
|
route: 'generate',
|
|
200
|
+
tier: 'specialist',
|
|
175
201
|
label: 'Seedream 5 Lite',
|
|
176
202
|
kind: 'image',
|
|
177
203
|
...caps('seedream-5-lite'),
|
|
@@ -180,25 +206,28 @@ export const MODEL_FACTS = [
|
|
|
180
206
|
{
|
|
181
207
|
id: 'seedance-2',
|
|
182
208
|
route: 'generate',
|
|
209
|
+
tier: 'specialist',
|
|
183
210
|
label: 'Seedance 2.0',
|
|
184
211
|
kind: 'video',
|
|
185
212
|
...caps('seedance-2'),
|
|
186
213
|
audioRefNeedsCompanion: true,
|
|
187
|
-
notes: '
|
|
214
|
+
notes: '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.',
|
|
188
215
|
},
|
|
189
216
|
{
|
|
190
217
|
id: 'seedance-2.5',
|
|
191
218
|
route: 'generate',
|
|
219
|
+
tier: 'default',
|
|
192
220
|
label: 'Seedance 2.5',
|
|
193
221
|
kind: 'video',
|
|
194
222
|
...caps('seedance-2.5'),
|
|
195
223
|
// No companion requirement — audio-only references are one of the things
|
|
196
224
|
// the second seat actually buys.
|
|
197
|
-
notes: '
|
|
225
|
+
notes: 'DEFAULT VIDEO MODEL — the strongest seat for physics, effects, scale and hero shots, and the only Seedance that takes long single takes, many references, audio-only references and integer-second timestamps. No 4K, and dearer than 2.0 at every shared resolution: go to 2.0 for 4K or the same resolution cheaper. LENGTH is the price dial — quote long takes first. VIDEO-ONLY. Timestamp grammar and the edit/extend words that make the provider reclassify and fail a generation are in slates-prompting-seedance-2-5.',
|
|
198
226
|
},
|
|
199
227
|
{
|
|
200
228
|
id: 'seedance-2.5-edit',
|
|
201
229
|
route: 'edit',
|
|
230
|
+
tier: 'specialist',
|
|
202
231
|
label: 'Seedance 2.5 Edit',
|
|
203
232
|
kind: 'video',
|
|
204
233
|
// 0 ingredients: prompt + source clip only on slates_edit_video.
|
|
@@ -208,15 +237,17 @@ export const MODEL_FACTS = [
|
|
|
208
237
|
{
|
|
209
238
|
id: 'kling-v3',
|
|
210
239
|
route: 'generate',
|
|
240
|
+
tier: 'specialist',
|
|
211
241
|
label: 'Kling 3.0',
|
|
212
242
|
kind: 'video',
|
|
213
243
|
// Family-level fact — caps are identical across std/pro/omni/omni-pro.
|
|
214
244
|
...caps('kling-v3.0-std'),
|
|
215
|
-
notes: '
|
|
245
|
+
notes: '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.',
|
|
216
246
|
},
|
|
217
247
|
{
|
|
218
248
|
id: 'kling-v3-edit',
|
|
219
249
|
route: 'edit',
|
|
250
|
+
tier: 'specialist',
|
|
220
251
|
label: 'Kling O3 Video Edit',
|
|
221
252
|
kind: 'video',
|
|
222
253
|
// Family-level fact; 4 = combined subject elements + style refs per edit.
|
|
@@ -226,15 +257,17 @@ export const MODEL_FACTS = [
|
|
|
226
257
|
{
|
|
227
258
|
id: 'veo-3.1',
|
|
228
259
|
route: 'generate',
|
|
260
|
+
tier: 'niche',
|
|
229
261
|
label: 'Veo 3.1',
|
|
230
262
|
kind: 'video',
|
|
231
263
|
// Family-level fact — fast and standard declare the same caps.
|
|
232
264
|
...caps('veo-3.1-fast'),
|
|
233
|
-
notes: 'NICHE, never the default — pick only when native synchronized audio must generate WITH the video in one pass, and the narrowest aspect-ratio and duration sets in the catalogue are acceptable. Otherwise
|
|
265
|
+
notes: 'NICHE, never the default — pick only when native synchronized audio must generate WITH the video in one pass, and the narrowest aspect-ratio and duration sets in the catalogue are acceptable. Otherwise Seedance 2.5 (the default) or Kling (cost-effective performance) win.',
|
|
234
266
|
},
|
|
235
267
|
{
|
|
236
268
|
id: 'omni-flash',
|
|
237
269
|
route: 'generate',
|
|
270
|
+
tier: 'specialist',
|
|
238
271
|
label: 'Gemini Omni Flash',
|
|
239
272
|
kind: 'video',
|
|
240
273
|
// 7 ref2v image_urls — mirrors Google's own reference limit.
|
|
@@ -244,6 +277,7 @@ export const MODEL_FACTS = [
|
|
|
244
277
|
{
|
|
245
278
|
id: 'omni-flash-edit',
|
|
246
279
|
route: 'edit',
|
|
280
|
+
tier: 'default',
|
|
247
281
|
label: 'Omni Flash Edit',
|
|
248
282
|
kind: 'video',
|
|
249
283
|
// 0: prompt + source clip ONLY — no element/style refs on this endpoint.
|
|
@@ -253,6 +287,7 @@ export const MODEL_FACTS = [
|
|
|
253
287
|
{
|
|
254
288
|
id: 'minimax-h3',
|
|
255
289
|
route: 'generate',
|
|
290
|
+
tier: 'specialist',
|
|
256
291
|
label: 'MiniMax H3',
|
|
257
292
|
kind: 'video',
|
|
258
293
|
...caps('minimax-h3'),
|
|
@@ -265,16 +300,36 @@ export const MODEL_FACTS = [
|
|
|
265
300
|
{
|
|
266
301
|
id: 'minimax-h3-max',
|
|
267
302
|
route: 'generate',
|
|
303
|
+
tier: 'specialist',
|
|
268
304
|
label: 'MiniMax H3 Max',
|
|
269
305
|
kind: 'video',
|
|
270
|
-
//
|
|
271
|
-
//
|
|
306
|
+
// References landed 2026-09-09 when the "h3-max/reference-to-video returns
|
|
307
|
+
// 404" claim was retired against the fetched schema (caps come from
|
|
308
|
+
// model-capabilities.ts; the rip is second-brain/business/projects/slates/
|
|
309
|
+
// provider-docs/fal-minimax-h3-openapi-schemas.md, section 6).
|
|
272
310
|
...caps('minimax-h3-max'),
|
|
273
|
-
|
|
311
|
+
// Quoted off THAT endpoint's reference_audio_urls description, not copied
|
|
312
|
+
// from the base row: "Audio cannot be the only reference input; provide at
|
|
313
|
+
// least one reference image or video with it."
|
|
314
|
+
audioRefNeedsCompanion: true,
|
|
315
|
+
notes: 'THE SPEED SEAT, and the DEARER one at the tier they share — never the cheap H3 and never the default. fal\'s post-train of the H3 weights: MEASURED 2026-08-27 at about 12x faster than base H3 on the same prompt and params, queue to finished file, plus a thin vendor-reported quality edge. It tops out at a 1080p refinement of its 768p render. It takes the same omni-reference set as base H3 and animates start and end frames — but not both in one call: its reference endpoint has no start/end-frame fields, where base H3\'s does. Never describe this row as taking no image or reference input. Route here when a fast turnaround on text-to-video or a start-frame shot is worth the premium.',
|
|
316
|
+
},
|
|
317
|
+
{
|
|
318
|
+
id: 'minimax-h3-max-turbo',
|
|
319
|
+
route: 'generate',
|
|
320
|
+
tier: 'specialist',
|
|
321
|
+
label: 'MiniMax H3 Max Turbo',
|
|
322
|
+
kind: 'video',
|
|
323
|
+
// Added 2026-09-29. No reference caps: fal publishes text-to-video and
|
|
324
|
+
// image-to-video for Turbo and its reference-to-video returns 404, so
|
|
325
|
+
// `caps()` returns nulls and the composer refuses references.
|
|
326
|
+
...caps('minimax-h3-max-turbo'),
|
|
327
|
+
notes: 'THE BUDGET SEAT of the MiniMax family: a second fal post-train of the H3 weights, billed at half H3 Max\'s rate at every tier. Its 1080p is a refinement of the native 768p render, not a native 1080p generation. INPUTS ARE FRAMES, NOT REFERENCES: text-to-video and start/end frames only, with no reference endpoint, so reference-driven consistency goes to H3 Max or base H3. Route here for drafts, volume and cheap coverage, then re-run the keeper on H3 Max or a hero seat.',
|
|
274
328
|
},
|
|
275
329
|
{
|
|
276
330
|
id: 'ltx-2-5',
|
|
277
331
|
route: 'generate',
|
|
332
|
+
tier: 'specialist',
|
|
278
333
|
label: 'LTX-2.5',
|
|
279
334
|
kind: 'video',
|
|
280
335
|
// No reference caps: fal publishes text-to-video and image-to-video for LTX
|
|
@@ -286,6 +341,7 @@ export const MODEL_FACTS = [
|
|
|
286
341
|
{
|
|
287
342
|
id: 'ltx-2-5-pro',
|
|
288
343
|
route: 'generate',
|
|
344
|
+
tier: 'specialist',
|
|
289
345
|
label: 'LTX-2.5 Pro',
|
|
290
346
|
kind: 'video',
|
|
291
347
|
...caps('ltx-2-5-pro'),
|
|
@@ -294,6 +350,7 @@ export const MODEL_FACTS = [
|
|
|
294
350
|
{
|
|
295
351
|
id: 'seed-audio',
|
|
296
352
|
route: 'generate',
|
|
353
|
+
tier: 'default',
|
|
297
354
|
label: 'Seed Audio 1.0',
|
|
298
355
|
kind: 'audio',
|
|
299
356
|
// ONE image XOR up to 3 audio clips — the two inputs are mutually exclusive.
|
|
@@ -303,6 +360,7 @@ export const MODEL_FACTS = [
|
|
|
303
360
|
{
|
|
304
361
|
id: 'eleven-sfx',
|
|
305
362
|
route: 'generate',
|
|
363
|
+
tier: 'specialist',
|
|
306
364
|
label: 'ElevenLabs Sound Effects v2',
|
|
307
365
|
kind: 'audio',
|
|
308
366
|
...caps('eleven-sfx'),
|
|
@@ -311,13 +369,61 @@ export const MODEL_FACTS = [
|
|
|
311
369
|
{
|
|
312
370
|
id: 'inworld-tts-2',
|
|
313
371
|
route: 'generate',
|
|
372
|
+
tier: 'specialist',
|
|
314
373
|
label: 'Inworld Realtime TTS-2',
|
|
315
374
|
kind: 'audio',
|
|
316
375
|
...caps('inworld-tts-2'),
|
|
317
376
|
notes: 'THE VOICE SEAT — one named voice saying one line, billed per CHARACTER not per second. Route here when WHO is speaking matters. NOT scene audio — that is seed-audio; a single effect is eleven-sfx.',
|
|
318
377
|
},
|
|
319
378
|
];
|
|
379
|
+
/**
|
|
380
|
+
* One default per lane, asserted where the data is declared. Two rows both
|
|
381
|
+
* reading "DEFAULT" is exactly the drift `tier` exists to make impossible, and
|
|
382
|
+
* a lane with no default leaves an agent (and slates-web) nothing to lead with.
|
|
383
|
+
*/
|
|
384
|
+
for (const kind of ['image', 'video', 'audio']) {
|
|
385
|
+
for (const route of ['generate', 'edit']) {
|
|
386
|
+
const lane = MODEL_FACTS.filter((f) => f.kind === kind && f.route === route);
|
|
387
|
+
if (lane.length === 0)
|
|
388
|
+
continue;
|
|
389
|
+
const defaults = lane.filter((f) => f.tier === 'default').map((f) => f.id);
|
|
390
|
+
if (defaults.length !== 1) {
|
|
391
|
+
throw new Error(`MODEL_FACTS: ${kind}/${route} must have exactly one tier: 'default' row, found ${defaults.length}` +
|
|
392
|
+
(defaults.length ? ` (${defaults.join(', ')})` : ''));
|
|
393
|
+
}
|
|
394
|
+
}
|
|
395
|
+
}
|
|
396
|
+
/**
|
|
397
|
+
* The one `default` seat for a kind on the generate route, READ from `tier`.
|
|
398
|
+
* Anything that needs "the default image model" calls this instead of naming
|
|
399
|
+
* one: the op surface and slates-web both hand-typed nano-banana-2 for six days
|
|
400
|
+
* after the app picker moved to Sunburst.
|
|
401
|
+
*/
|
|
402
|
+
export function defaultModelFor(kind) {
|
|
403
|
+
const fact = MODEL_FACTS.find((f) => f.kind === kind && f.route === 'generate' && f.tier === 'default');
|
|
404
|
+
if (!fact)
|
|
405
|
+
throw new Error(`MODEL_FACTS: no default ${kind} seat on the generate route`);
|
|
406
|
+
return fact.id;
|
|
407
|
+
}
|
|
408
|
+
/**
|
|
409
|
+
* The seat a built-in tool renders on when its caller names no model. Resolves
|
|
410
|
+
* `TOOL_SEAT` (generation-policy.ts, THE home): `'default-image'` follows the
|
|
411
|
+
* default image seat above, a model id pins the tool. The desktop resolves the
|
|
412
|
+
* same table through its generated mirror, so an op description, the skill
|
|
413
|
+
* partial and the handler that bills cannot name different models.
|
|
414
|
+
*/
|
|
415
|
+
export function toolModelFor(tool) {
|
|
416
|
+
const seat = TOOL_SEAT[tool];
|
|
417
|
+
return seat === DEFAULT_IMAGE_SEAT ? defaultModelFor('image') : seat;
|
|
418
|
+
}
|
|
320
419
|
const FACT_BY_ID = new Map(MODEL_FACTS.map((m) => [m.id, m]));
|
|
420
|
+
// A pinned tool seat must be a live image model, or the tool quotes and fires
|
|
421
|
+
// an id nothing can render. Asserted at load, like the one-default-per-kind rule.
|
|
422
|
+
for (const [tool, seat] of Object.entries(TOOL_SEAT)) {
|
|
423
|
+
if (seat !== DEFAULT_IMAGE_SEAT && FACT_BY_ID.get(seat)?.kind !== 'image') {
|
|
424
|
+
throw new Error(`TOOL_SEAT: ${tool} is pinned to "${seat}", which is not an image model in MODEL_FACTS`);
|
|
425
|
+
}
|
|
426
|
+
}
|
|
321
427
|
/**
|
|
322
428
|
* Routing prose for one lane, generated from the SSOT.
|
|
323
429
|
*
|
|
@@ -5,12 +5,18 @@
|
|
|
5
5
|
// per-model skills, so the TS consumers and the markdown consumers can
|
|
6
6
|
// no longer disagree. Edit the partial, not this file, not the skills.
|
|
7
7
|
export const PARTIALS = {
|
|
8
|
-
"
|
|
9
|
-
"
|
|
8
|
+
"cinematic-card": "**For a photographic look, use only what this frame needs.** Image models default to clean, evenly lit and fully exposed. Describe what the camera sees, not just gear or mood:\n- **Inspect every reference first.** Write its grade and imperfections in words: darkness, contrast, muddy or true blacks, colour, softness/noise, subject separation. Never grade cleaner or brighter than the look reference unless asked.\n- **One light system** — `low sun behind her`, `her face falls into deep shadow`, `no light in front of her`.\n- **Visible exposure** — `the sky burns out to white`, `dense, slightly crushed shadows`.\n- **Lens name plus effect** — `200mm telephoto`, `peaks loom huge behind her and melt into soft shapes`.\n- **Name every garment and close the foreground.** Omissions invite reference leakage or invented props.\nBind references inline. A scene reference owns the grade; for a look-only reference, write the new scene's light. References are optional. For owned-frame edits, describe only the change and what stays.\n<!-- slates-only -->Use `slates-cinematic-look` with a technique ID or section query for more.<!-- /slates-only -->",
|
|
9
|
+
"cinematic-routes-short": "Two routes: describe a new frame, or change a frame you own. For a new scene, name references where you use them, write the look reference's grade and imperfections in plain words, then describe one light system, visible exposure, lens plus effect, every garment and a closed foreground. Use only what the shot needs. For your own plate, sheet, photo, footage or Blender render, say only what changes and what stays. Never use a released film frame as the edit base; use it as an art-direction brief for a new scene.",
|
|
10
|
+
"cinematic-tips-short": "Image models tend toward clean, evenly lit, fully exposed pictures. For a filmed look, describe what you see: one light source and its effect, a face almost in silhouette, a sky burned white. Name the lens and its visible effect together. Look at every reference first and describe its own darkness, contrast, colour, softness, noise and subject separation. Keep muddy blacks muddy; never clean up or brighten the reference's grade unless that is the change you want. Name every garment and exactly what is in the foreground. Use only what the shot needs; references are optional.",
|
|
11
|
+
"decision-log": "Record production choices in the editable shot fields. Explain only consequential judgments the user did not specify and no field already records: for example, why a particular light or performance register supports the brief. Do not repeat the shot list in prose or turn this explanation into an approval gate. Follow the separate generation authorization policy before spending.",
|
|
12
|
+
"image-defaults": "**Image default:** gpt-image-2-5-sunburst, quality `high`, 3k. User overrides take priority. Without a project, generation uses the headless Nano Banana 2 seat.\n\n| Model | Default resolution |\n|---|---|\n| nano-banana-2 | 2k |\n| nano-banana-2-lite | 1k |\n| nano-banana-pro | 2k |\n| gpt-image-2-5-flare | 2k |\n| gpt-image-2-5-sunburst | 3k |\n| flux-2-max | 1k |\n| seedream-5-lite | 2k |",
|
|
13
|
+
"lens-video-split": "Named lenses, apertures, film stocks and camera bodies (`85mm f/1.4`, `Kodak Portra 400`, `ARRI Alexa 65`) are an image-model lever. On a video model, translate the look instead of pasting the gear list: `85mm f/1.4, Portra 400` becomes `close-up, shallow depth of field, warm natural colors, cinematic texture, film-grain texture`. ByteDance's Seedance 2.0 guide never mentions fps, shutter angle, f-stop or lens millimetres. Its Seedance 2.5 guide does, once: the visual-style line of its own storyboard example names one camera body and one 35 mm cinema lens. On 2.5 a single line like that is vendor-sanctioned; a stacked gear list still is not.",
|
|
14
|
+
"reference-rules-core": "Identity = a few flat-lit neutral angles; one reference per role, named inline; 2-4 refs not 12; describe environments instead of feeding a grid.\n\n1. **2-4 strong references beat both extremes.** Not 1 (warps toward itself), not 12 (averages worse). Start with 2-3 focused refs — each one adds context AND another variable to balance.\n2. **One reference per ROLE, named in the prompt** — identity / style-grade / environment. The model does **not** infer a reference's role from its position in the list; the inline name carries it. Same-role competitors drift (two \"identity\" refs of different people blend into a third face). Slates resolves `@mentions` / `#tags` into numbered citations. You can also bind references directly in scene prose, naming what each image supplies.\n3. **One identity sheet per character, named inline.** A character's identity is a single asset (dominant portrait + body panels), so attach that one asset rather than a pile of views: **fewer competing renderings of a face is better, because the model cannot tell which one is authoritative and averages them.** Slates cites it as `Marcus (image 1)`. **Do NOT hand-write a \"Reference Image Instructions\" block or role essays** (\"use for identity, ignore the outfit, render a neutral expression\") — that drags the sheet's studio lighting and wardrobe into a scene that asked for neither. The prompt leads; the user's words own wardrobe, expression, lighting, and action.\n4. **Flat-light identity refs.** Prep identity references with flat, even, shadowless lighting on a plain neutral background. A studio-lit or scene-lit character sheet bleeds its lighting into every generation — the failure looks like the subject was green-screen-pasted in front of the location. Reference prep beats prompting here.\n5. **Environment: describe it, don't feed a grid.** Default to describing the location in words and let the model build a space that fits the shot. Reserve an environment reference for a mandatory exact-match, and then use ONE clean establishing image with natural ambient light that reads as the location's real light — never a multi-panel grid fed whole.\n6. **Grids: explore, don't input.** Use grids to explore compositions cheaply, then pick a cell. Never feed a grid back in as a reference — the cells share a split detail budget and were generated jointly, so their flaws propagate.\n7. **Reuse the same refs across every shot** in a sequence. Lock a set and keep it; swapping references mid-sequence causes drift, because the model adapts each reference to the current prompt rather than copying it.\n8. **Legible in-shot text → bake it into a still start frame, never trust text-to-video.** Have an image model render the text, then animate from that locked frame. Video models smear type.\n9. **Working from existing media — describe ONLY what changes.** The source already carries its composition, motion, timing, and performance; re-describing them fights the model. Narrate the delta. (Video lane: restyle your own clip while keeping the performance; delayed-VFX on \"video one\"; marker-object insertion; video-as-reference for a series.)\n10. **Style transforms happen in natural language.** By default the source's artistic medium and visual style are inherited. To change it, add a plain-text instruction (\"anime → real person\"). There are no preset pickers, and there is no style slider.",
|
|
10
15
|
"reference-tips-short": "Name each reference inline; never write role essays. Slates does this for you: `@mention` a subject or environment and it composes `Marcus (image 1) in the cafe (image 2)`, citing them in the exact order it sends them. One canonical identity image avoids competing facial renderings; a \"Reference Image Instructions\" block drags reference lighting into your scene. Start with 2-3 focused refs.",
|
|
11
16
|
"references-read-literally": "> **The general law: the model reads a reference literally.**\n> A reference image is not a suggestion. Whatever is baked into it — lighting, medium, texture, symmetry, competing identities — is read as a **property of the subject** and reproduced downstream. A baked rim light tints every shot made from that sheet. A sheet that looks like a 3D game render gets animated like game footage. Two competing renderings of one face get averaged into a third face.\n\nEvery reference rule below is a corollary of that one sentence, which is why \"prep the reference\" beats \"prompt around the reference\" every time:\n\n- **Flat, plain identity refs** — because scene lighting in the sheet becomes scene lighting in the output (Slates' own receipt: a studio-lit sheet produced a subject that looked green-screen-pasted in front of mountains).\n- **One authoritative rendering per subject** — because the model cannot tell which panel is the real one. ByteDance documents this failure directly: multi-view character assets \"confuse the model's character recognition, causing it to generate duplicate characters of the same appearance.\"\n- **No 3D-game-render look in a reference** — the model recognizes the render mood and inherits its motion character, so the *animation* comes out looking like game footage. This is not a taste rule; it is the same literal-reading mechanism applied to the temporal layer.\n- **Break perfect symmetry** — mirrored faces and dead-square framing read as synthetic, and the model preserves that reading rather than correcting it.\n\n**What this means in practice:** when output is wrong in a way that tracks the *subject* rather than the *scene* — the lighting is wrong the same way in every shot, the face drifts, the material looks synthetic everywhere — fix the reference, not the prompt. Prompting around a baked-in property is the expensive way to lose.",
|
|
12
17
|
"seedance-25-timestamps": "**2.0 does not respond to timestamps and answers only to shot numbers. 2.5 responds to\ninteger-second timestamps.** That is ByteDance's own first line under \"Differences from Seedance\n2.0\", and it is why a 30-second take is usable at all: the length is only worth buying if you can\nsay *when* things happen inside it.\n\nBoth formats are valid on 2.5, and you can mix them — `Shot N` blocks for a storyboard whose\npacing you are happy to leave to the model, timestamps when a beat has to land at a moment.\n\n**Three ways to control time, all first-party:**\n\n| Form | Write it like |\n|---|---|\n| **Interval** | `0-3 seconds… 3-7 seconds… 7-15 seconds` or `[1s-4s]… [4s-8s]… [8s-12s]` |\n| **Time point** | *\"Quick left sideways transition at the 5-second mark.\"* |\n| **Relative** | *\"After 3 seconds, everyone around him shakes their head.\"* · *\"The frame freezes for 1 second after he presses the shutter.\"* |\n\n**The rules that come with them:**\n\n- **One second is the smallest unit.** Integers only — no `2.5s`, no frames.\n- **No gaps in the timeline.** `0-3s… 5-6s…` leaves 3-5s unspecified and the model fills it however\n it likes. Intervals must abut: `0-3s`, `3-7s`, `7-15s`.\n- **Budget the plot to the seconds.** Too little content in a range and the model improvises to\n fill it; too much and you get extra cuts or dropped beats. This is the actual craft of a 30s take.\n- **Never time-code a high-frequency action.** *\"Shake your head three times per second\"* is\n explicitly called out as a misuse — timestamps schedule beats, they don't choreograph frames.\n- **Transitions want both halves:** the moment AND the method — *\"At the 5-second mark, the camera\n transitions leftward with a left wipe into a natural dissolve.\"*\n- **Timestamps work on an EDIT too**, and that is where they earn the most: they scope a change in\n time as well as in content — *\"Change the man's action from drinking coffee to mopping the floor\n from 4-6 seconds in Video 1, and leave the rest of the content unchanged.\"* Without a range, a\n whole-clip instruction is applied to the whole clip.\n\nDo **not** carry this back to 2.0, and do not carry Veo's `[00:00-00:02]` bracket syntax into\neither — 2.0 ignores time entirely, and the cross-model syntax swap is its own known failure.",
|
|
13
18
|
"seedance-25-timestamps-short": "Seedance 2.0 ignores timing and answers only to \"Shot 1 / Shot 2\"; 2.5 acts on whole-second timestamps, and that is what makes a 30-second take controllable rather than just long. Three forms work: intervals (\"0-3 seconds…3-7 seconds\"), a point (\"at the 5-second mark\"), or relative (\"after 3 seconds\"). Whole seconds only, no gaps between intervals, and never to choreograph fast repeated motion. They work on edits too, where a range scopes the change: \"…from 4-6 seconds…\".",
|
|
19
|
+
"sheet-tool-defaults": "**What the sheet tools render on** (you do not pick these; omit `model`):\n\n- **Character identity sheet:** `gpt-image-2-5-sunburst` at 3k, quality `high`, one 16:9 image.\n- **Establishing image:** `gpt-image-2-5-sunburst` at 3k, quality `high`, one 16:9 image.\n\nPrice a sheet for that model at 16:9, with resolution and quality left at their defaults. **Never 4K** — no identity gain at sheet scale, wasted spend.",
|
|
14
20
|
"still-gate": "**A visible defect in the still is already a STOP.** Do not animate it. Fix the frame first, then move to motion — and go to motion only when the crop passes the still scan and you genuinely need movement to confirm an uncertain edge, reflection, or object.\n\nThis is a **cost** rule as much as a craft rule: a 1080p/10s premium video generation costs many multiples of an image re-roll, and video is where a defect stops being fixable. Anything wrong in the still gets worse in motion — soft geometry mushes, broken-but-plausible objects fall apart, oily textures start crawling. **Animating a known-bad frame is the single most expensive mistake in the pipeline.** Re-rolling the image is the cheap move; re-rolling the video is not.",
|
|
15
21
|
"thresholds": "<!-- GENERATED from @slatesvideo/shared — do not edit between the markers.\n Source: CONFIRM_CREDITS, DEVIATION_FACTOR and the audio bounds in\n packages/shared/src/operations/index.ts. Every number here is REFUSED by an\n op when a prompt gets it wrong, which is why none of them is typed by hand\n any more: this block replaced four claims that contradicted the code. -->\n\n**The thresholds, from the code that enforces them:**\n\n- **Confirm gate:** above **17 credits** an op returns `requires_confirm` and will not\n proceed until you re-call with `confirm: true`. Below it, announce the cost once and go.\n- **Deviation pause:** the desktop Studio Agent stops and re-asks when projected generation spend\n exceeds the approved plan by more than **20%**. You do not trigger this; the app does.\n- **Seed Audio duration:** **3–120 seconds.** There is no duration\n parameter on the model — the number you pass is written into the prompt AND is what the user is\n billed. Outside that range the op refuses rather than clamping.\n- **Sound Effects duration:** **1–22 seconds**, billed per second, never left for the\n model to pick.\n\nNever quote a credit figure from memory: `slates_estimate_generation_cost` returns the real one.",
|
|
16
22
|
};
|
|
@@ -16,7 +16,7 @@ export interface PromptingTipsEntry {
|
|
|
16
16
|
/** Footer callout paragraphs. */
|
|
17
17
|
footer?: string[];
|
|
18
18
|
}
|
|
19
|
-
export type PromptingTipsKey = 'seedance' | 'seedance-2-5' | 'seedance-2-5-edit' | 'kling' | 'kling-edit' | 'veo' | 'omni-flash' | 'omni-flash-edit' | 'minimax-h3' | 'ltx-2-5' | 'nano-banana' | 'nano-banana-lite' | 'seed-audio' | 'eleven-sfx' | 'inworld-tts-2';
|
|
19
|
+
export type PromptingTipsKey = 'seedance' | 'seedance-2-5' | 'seedance-2-5-edit' | 'kling' | 'kling-edit' | 'veo' | 'omni-flash' | 'omni-flash-edit' | 'minimax-h3' | 'ltx-2-5' | 'nano-banana' | 'nano-banana-lite' | 'gpt-image-2-5' | 'seed-audio' | 'eleven-sfx' | 'inworld-tts-2';
|
|
20
20
|
export declare const PROMPTING_TIPS: Record<PromptingTipsKey, PromptingTipsEntry>;
|
|
21
21
|
/** Null when no tips exist for the key — callers render an honest fallback. */
|
|
22
22
|
export declare function getPromptingTips(key: string): PromptingTipsEntry | null;
|
|
@@ -115,7 +115,7 @@ const SEEDANCE_25 = {
|
|
|
115
115
|
...SEEDANCE,
|
|
116
116
|
label: 'Seedance 2.5',
|
|
117
117
|
intro: [
|
|
118
|
-
'Seedance 2.5 is
|
|
118
|
+
'Seedance 2.5 is the default video model. Against 2.0 it buys one 30-second take instead of 15, up to 30 image references (plus 10 video and 10 audio), audio-only references and integer-second timestamps — and it gives up 4K. It runs at 480p, 720p or 1080p, and it costs more than 2.0 at every tier they share, so pick 2.0 when you want the same resolution cheaper or you want 4K.',
|
|
119
119
|
"ByteDance's official advanced formula has 8 slots: precise subject + action details + scene/environment + lighting & color tone + camera movement + visual style + image quality + constraints. Sweet spot 60-150 words for a single shot, longer for multi-shot.",
|
|
120
120
|
],
|
|
121
121
|
columns: [
|
|
@@ -137,7 +137,7 @@ const SEEDANCE_25 = {
|
|
|
137
137
|
[
|
|
138
138
|
{
|
|
139
139
|
heading: '720p is not the cheap one here',
|
|
140
|
-
example: '30s \u00b7 720p \u00b7 Face route =
|
|
140
|
+
example: '30s \u00b7 720p \u00b7 Face route = 489 credits\n15s \u00b7 1080p \u00b7 Seedance 2.0 Face = 411 credits',
|
|
141
141
|
note: 'Length is what moves the price, and 2.5 doubles the length ceiling — so a 30-second 720p clip can cost more than a 15-second 1080p one, against a 1,000-credit starting balance. Explore at short LENGTH rather than low resolution: cut the seconds to 4-8 while you are finding the shot, and stay at the resolution you actually want. A 480p pass does not de-risk a 720p render — generation is stochastic, so the 720p run is a different take, not the same shot rendered better. The Generate button always shows the exact number first.',
|
|
142
142
|
critical: true,
|
|
143
143
|
},
|
|
@@ -151,7 +151,7 @@ const SEEDANCE_25 = {
|
|
|
151
151
|
],
|
|
152
152
|
footer: [
|
|
153
153
|
'30 image references is a budget, not a target — 2-4 strong references still beat both extremes, one per role. ByteDance\'s own ceilings for 2.5: 1-8 subjects bound by image reference stay stable (9-12 works but needs re-rolls), 1-5 subjects bound by video or audio reference, and 5-10 seconds is the sweet spot for a reference clip. Unlike 2.0, a multi-view turnaround sheet can be a single subject reference here — past 5 subjects, go back to one view per image. The larger budget is for long multi-shot takes and for video plus audio references alongside images.',
|
|
154
|
-
'A reference VIDEO bills input seconds PLUS output seconds, and 2.5 accepts references up to 30s combined — so a 20-second reference driving a 20-second output bills 40 seconds. The Generate button shows the total.',
|
|
154
|
+
'A reference VIDEO bills input seconds PLUS output seconds, and 2.5 accepts references up to 30s combined — so a 20-second reference driving a 20-second output bills 40 seconds. On the AI-face route the reference counts as at least as long as the output: a 5-second reference on a 20-second output bills 40 seconds, not 25. The Generate button shows the total.',
|
|
155
155
|
...(SEEDANCE.footer ?? []).slice(0, 2),
|
|
156
156
|
'Frames and reference images stay mutually exclusive, and on a first/last-frame generation Seedance 2.5 chooses the aspect ratio itself — the ratio control shows "Adaptive" because the start frame decides the shape.',
|
|
157
157
|
],
|
|
@@ -190,7 +190,7 @@ const SEEDANCE_25_EDIT = {
|
|
|
190
190
|
[
|
|
191
191
|
{
|
|
192
192
|
heading: 'When to use it instead of the others',
|
|
193
|
-
note: 'Length is the reason: it is the only engine that accepts a clip over 15 seconds. Inside the others\' range, choose on fidelity — Omni Flash Edit is the prompt-only fidelity winner and the cheapest
|
|
193
|
+
note: 'Length is the reason: it is the only engine that accepts a clip over 15 seconds. Inside the others\' range, choose on fidelity — Omni Flash Edit is the prompt-only fidelity winner and the cheapest option, and Kling O3 Edit is the one that takes subject and style reference images.',
|
|
194
194
|
},
|
|
195
195
|
{
|
|
196
196
|
heading: 'It edits the audio too',
|
|
@@ -347,8 +347,8 @@ const OMNI_FLASH = {
|
|
|
347
347
|
note: 'No negative-prompt field — write what to avoid as a direct instruction.',
|
|
348
348
|
},
|
|
349
349
|
{
|
|
350
|
-
heading: 'Know its
|
|
351
|
-
note: 'Cheap drafts, iteration volume, and audio-in-one-gen at low cost. For hero shots,
|
|
350
|
+
heading: 'Know its role',
|
|
351
|
+
note: 'Cheap drafts, iteration volume, and audio-in-one-gen at low cost. For hero shots, Seedance 2.5 (the default) or Seedance 2.0 (4K, cheaper) still win.',
|
|
352
352
|
},
|
|
353
353
|
],
|
|
354
354
|
],
|
|
@@ -398,6 +398,45 @@ const OMNI_FLASH_EDIT = {
|
|
|
398
398
|
'Ship via segment-splice: edit only the seconds where the change happens (Trim / Split first), then splice back over the original on the timeline with the original audio underneath. Chain edits one change at a time — each edit saves as a new clip linked to its parent.',
|
|
399
399
|
],
|
|
400
400
|
};
|
|
401
|
+
const GPT_IMAGE_25 = {
|
|
402
|
+
label: 'GPT Image 2.5',
|
|
403
|
+
intro: [
|
|
404
|
+
'Two tiers at the same price: Flare is the faster one; Sunburst is the better-quality one, and slower. Explore on Flare, finish on Sunburst.',
|
|
405
|
+
'The photoreal front-runner for people, and the most reliable model for readable text, ordered panels and exact placement.',
|
|
406
|
+
],
|
|
407
|
+
columns: [
|
|
408
|
+
[
|
|
409
|
+
{
|
|
410
|
+
heading: 'Name each reference where it is used',
|
|
411
|
+
example: 'The woman from image 1 cooks on a rocky summit, lit and graded like image 2.',
|
|
412
|
+
note: PARTIALS['reference-tips-short'],
|
|
413
|
+
},
|
|
414
|
+
{
|
|
415
|
+
heading: 'Quote text that must render',
|
|
416
|
+
example: 'the word "SLATES" once in small plain letters on the left chest',
|
|
417
|
+
note: "Quoted strings render most reliably. Describe a font's feel, never its name, and keep on-image text under about 30 words.",
|
|
418
|
+
},
|
|
419
|
+
{
|
|
420
|
+
heading: 'Set the quality tier on purpose',
|
|
421
|
+
example: 'low · medium · high · xhigh · max',
|
|
422
|
+
note: 'High is the everyday tier and max costs about four times as much. Medium is cheap enough to draft on; go past high only when tiny type or a finished frame needs it.',
|
|
423
|
+
},
|
|
424
|
+
],
|
|
425
|
+
[
|
|
426
|
+
{
|
|
427
|
+
heading: 'The look: describe what the camera sees',
|
|
428
|
+
example: 'She is close to a silhouette: her face falls into deep shadow.\nThe sky around the sun burns out to white.',
|
|
429
|
+
note: PARTIALS['cinematic-tips-short'],
|
|
430
|
+
critical: true,
|
|
431
|
+
},
|
|
432
|
+
{
|
|
433
|
+
heading: 'Describe the frame, or swap into one you own',
|
|
434
|
+
example: 'Dark hiking trousers. The only things on the rock are the stove and the pan.\nTake image 1 and change only the character to the character in image 2.',
|
|
435
|
+
note: PARTIALS['cinematic-routes-short'],
|
|
436
|
+
},
|
|
437
|
+
],
|
|
438
|
+
],
|
|
439
|
+
};
|
|
401
440
|
const NANO_BANANA = {
|
|
402
441
|
label: 'Nano Banana 2',
|
|
403
442
|
intro: [
|
|
@@ -414,7 +453,7 @@ const NANO_BANANA = {
|
|
|
414
453
|
{
|
|
415
454
|
heading: 'Named lenses + apertures',
|
|
416
455
|
example: '85mm f/1.4 · 135mm f/2.8 · 50mm f/1.2 · 35mm f/2 · Panavision anamorphic · 400mm telephoto',
|
|
417
|
-
note: '
|
|
456
|
+
note: 'Describe the intended perspective, depth of field and texture alongside the lens. A model does not guarantee physical lens simulation.',
|
|
418
457
|
},
|
|
419
458
|
{
|
|
420
459
|
heading: 'Named film stocks (one per prompt)',
|
|
@@ -424,7 +463,7 @@ const NANO_BANANA = {
|
|
|
424
463
|
{
|
|
425
464
|
heading: "Don't carry lens + stock into a video prompt",
|
|
426
465
|
example: '85mm f/1.4, Portra 400\n→ close-up, shallow depth of field, warm natural colors, cinematic texture',
|
|
427
|
-
note: '
|
|
466
|
+
note: PARTIALS['lens-video-split'],
|
|
428
467
|
},
|
|
429
468
|
{
|
|
430
469
|
heading: 'Physics-based lighting',
|
|
@@ -434,14 +473,19 @@ const NANO_BANANA = {
|
|
|
434
473
|
{
|
|
435
474
|
heading: 'Imperfection vocabulary',
|
|
436
475
|
example: 'visible pores · peach fuzz · ISO noise · sweat beading · slight hyperpigmentation · unretouched raw photography',
|
|
437
|
-
note: 'Forces the model away from AI-clean skin. The default is too smooth — you have to ask for the imperfections that real photos have.',
|
|
476
|
+
note: 'Forces the model away from AI-clean skin. The default is too smooth — you have to ask for the imperfections that real photos have. Lead with the kind of photograph and the conditions on the skin; a bare list of flaw words reads as tokens.',
|
|
477
|
+
},
|
|
478
|
+
{
|
|
479
|
+
heading: 'The look: describe what the camera sees',
|
|
480
|
+
example: 'She is close to a silhouette: her face falls into deep shadow.\nThe sky around the sun burns out to white.',
|
|
481
|
+
note: PARTIALS['cinematic-tips-short'],
|
|
438
482
|
},
|
|
439
483
|
],
|
|
440
484
|
[
|
|
441
485
|
{
|
|
442
486
|
heading: '❌ The anti-list — avoid these',
|
|
443
487
|
example: '8k · masterpiece · hyperrealistic · ultra-detailed · trending on ArtStation · perfect skin · flawless · airbrushed · cinematic (alone)',
|
|
444
|
-
note: '
|
|
488
|
+
note: 'Generic quality tags do not specify an observable result. Describe the medium, light, exposure and texture the brief calls for.',
|
|
445
489
|
critical: true,
|
|
446
490
|
},
|
|
447
491
|
{
|
|
@@ -537,7 +581,7 @@ const SEED_AUDIO = {
|
|
|
537
581
|
note: 'Up to 3 audio clips (max 30s each), referenced as @Audio1–@Audio3 — OR one image to score what is in frame. Never both in the same generation.',
|
|
538
582
|
},
|
|
539
583
|
{
|
|
540
|
-
heading: 'Know its
|
|
584
|
+
heading: 'Know its role',
|
|
541
585
|
note: 'Scenes, beds, room tone and dialogue in one pass. For a single effect that has to land on a specific frame, use Sound Effects.',
|
|
542
586
|
},
|
|
543
587
|
],
|
|
@@ -579,7 +623,7 @@ const ELEVEN_SFX = {
|
|
|
579
623
|
note: 'Higher hugs your wording with less variation between takes; lower explores. Raise it when a re-roll keeps wandering off the brief.',
|
|
580
624
|
},
|
|
581
625
|
{
|
|
582
|
-
heading: 'Know its
|
|
626
|
+
heading: 'Know its role',
|
|
583
627
|
note: 'One precise effect on a known frame. Full rooms and layered scenes are cheaper and better in one Seed Audio pass.',
|
|
584
628
|
},
|
|
585
629
|
],
|
|
@@ -589,7 +633,7 @@ const MINIMAX_H3 = {
|
|
|
589
633
|
label: 'MiniMax H3',
|
|
590
634
|
intro: [
|
|
591
635
|
'MiniMax H3 generates picture and sound in one pass — 24fps, 32kHz stereo, 5-15 seconds, 11 stably-supported languages. It is the only video model in Slates where audio is AUTHORED rather than switched on: synchronised dialogue and action sounds go in the body of the prompt, ambience goes in a soundscape section, and audience-only music goes in a score section. Put a sound in the wrong section and it is dropped, doubled, or attributed to the wrong source.',
|
|
592
|
-
'
|
|
636
|
+
'Three models. Base H3 runs 480p / 768p / 2K / 4K; H3 Max is fal\'s faster post-train and runs 480p / 768p / 1080p, dearer than base H3 at the tier they share - a deliberate speed pick, never the cheap one; H3 Max Turbo has Max\'s ladder at half Max\'s rate and takes NO references. Base H3 and Max read up to 9 reference images plus 3 video and 3 audio clips (12 files total, and audio never travels alone); all three animate a start frame and an end frame. 768p is the default on all three because it is the tier the model natively generates; base H3\'s 2K and 4K are upscales of a 768p base, and 1080p on Max and Turbo is a refinement of it. Reference images past the free allowance are billed and the allowances DIFFER: 5 free on base H3, 4 on Max.',
|
|
593
637
|
],
|
|
594
638
|
columns: [
|
|
595
639
|
[
|
|
@@ -624,7 +668,7 @@ const MINIMAX_H3 = {
|
|
|
624
668
|
{
|
|
625
669
|
heading: 'Say how much of a reference survives',
|
|
626
670
|
example: 'Give the man in image 3 the weathered leather texture of the jacket in image 4.',
|
|
627
|
-
note: 'H3 is the only
|
|
671
|
+
note: 'H3 is the only model that understands transferring a characteristic onto a DIFFERENT subject. State each reference\'s job and how much of it should carry through — kept whole, kept in part, transferred, or a loose echo.',
|
|
628
672
|
},
|
|
629
673
|
{
|
|
630
674
|
heading: 'Reference images past the fifth cost extra',
|
|
@@ -650,7 +694,7 @@ const LTX_2_5 = {
|
|
|
650
694
|
label: 'LTX-2.5',
|
|
651
695
|
intro: [
|
|
652
696
|
'LTX-2.5 scores the picture on the same pass that draws it, so SOUND IS THE FIRST THING YOU WRITE, not the last. Lightricks ranks the six parts of a prompt in this order: sound, camera, character detail, shot type and scene, then scene dressing — and scene dressing is the first thing to cut when a prompt sprawls. Everything goes in ONE flowing paragraph, not a list of labelled sections.',
|
|
653
|
-
'Two
|
|
697
|
+
'Two models. Base LTX-2.5 is the distilled build: 720p / 1080p / 1440p / 4K and clips from 6 to 20 seconds, and it is the cheapest native 1080p second in Slates. LTX-2.5 Pro is the full diffusion build ("Diffusion Fidelity Rendering" spends extra compute on busy frames) but reaches a SHORTER ladder — 1080p and 10 seconds maximum — while costing about a third more. Pro is for a dense final render; base is for iteration, long takes and 4K.',
|
|
654
698
|
],
|
|
655
699
|
columns: [
|
|
656
700
|
[
|
|
@@ -706,14 +750,14 @@ const LTX_2_5 = {
|
|
|
706
750
|
],
|
|
707
751
|
footer: [
|
|
708
752
|
'Frames, not references. LTX takes a start frame and an optional end frame (which generates a transition between the two) — it has no reference endpoint at all, so identity, style and environment reference images are not available on this model. For character consistency across separate shots, use MiniMax H3 or Kling.',
|
|
709
|
-
'Aspect ratios are 16:9 and 9:16 only, and native audio is included free at every resolution — there is no sound surcharge on either
|
|
753
|
+
'Aspect ratios are 16:9 and 9:16 only, and native audio is included free at every resolution — there is no sound surcharge on either model.',
|
|
710
754
|
'In image-to-video, do not cut away from the opening frame too early: you have paid for that frame, so let it play before the first move.',
|
|
711
755
|
],
|
|
712
756
|
};
|
|
713
757
|
const INWORLD_TTS = {
|
|
714
758
|
label: 'Inworld TTS-2',
|
|
715
759
|
intro: [
|
|
716
|
-
'The voice
|
|
760
|
+
'The voice model: one named voice saying one line. Unlike every other surface in Slates, the prompt is not a description of what you want — it IS the words that get spoken, verbatim, and its length is what you are billed for.',
|
|
717
761
|
'A voice belongs to a character, the same way a face does. Build it once from a clip or a description, then send it lines.',
|
|
718
762
|
],
|
|
719
763
|
columns: [
|
|
@@ -761,7 +805,7 @@ const INWORLD_TTS = {
|
|
|
761
805
|
note: 'Numbers, dates and abbreviations are read literally. Write them as they should sound.',
|
|
762
806
|
},
|
|
763
807
|
{
|
|
764
|
-
heading: 'Know its
|
|
808
|
+
heading: 'Know its role',
|
|
765
809
|
note: 'One voice, cleanly. Dialogue mixed with effects and room tone in one pass is Seed Audio; a single non-speech sound is Sound Effects.',
|
|
766
810
|
},
|
|
767
811
|
],
|
|
@@ -780,6 +824,7 @@ export const PROMPTING_TIPS = {
|
|
|
780
824
|
'ltx-2-5': LTX_2_5,
|
|
781
825
|
'nano-banana': NANO_BANANA,
|
|
782
826
|
'nano-banana-lite': NANO_BANANA_LITE,
|
|
827
|
+
'gpt-image-2-5': GPT_IMAGE_25,
|
|
783
828
|
'seed-audio': SEED_AUDIO,
|
|
784
829
|
'eleven-sfx': ELEVEN_SFX,
|
|
785
830
|
'inworld-tts-2': INWORLD_TTS,
|