@slatesvideo/shared 0.6.11 → 0.7.1

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.
Files changed (83) hide show
  1. package/dist/auth.js +2 -2
  2. package/dist/clients/cloud.js +1 -1
  3. package/dist/index.d.ts +1 -1
  4. package/dist/index.js +1 -1
  5. package/dist/manual/content.d.ts +1 -1
  6. package/dist/manual/content.js +1 -1
  7. package/dist/operations/index.d.ts +817 -16
  8. package/dist/operations/index.js +1413 -360
  9. package/dist/operations/surface.d.ts +4 -1
  10. package/dist/operations/surface.js +41 -10
  11. package/dist/prompts/ad-presets.d.ts +77 -0
  12. package/dist/prompts/ad-presets.js +43 -0
  13. package/dist/prompts/agent-doctrine.js +27 -5
  14. package/dist/prompts/banned-tokens.d.ts +4 -29
  15. package/dist/prompts/banned-tokens.js +29 -204
  16. package/dist/prompts/craft-cards.js +2 -2
  17. package/dist/prompts/generation-policy.d.ts +41 -0
  18. package/dist/prompts/generation-policy.js +53 -0
  19. package/dist/prompts/guide-retrieval.d.ts +9 -0
  20. package/dist/prompts/guide-retrieval.js +53 -0
  21. package/dist/prompts/index.d.ts +1 -0
  22. package/dist/prompts/index.js +1 -0
  23. package/dist/prompts/model-capabilities.d.ts +18 -1
  24. package/dist/prompts/model-capabilities.js +72 -19
  25. package/dist/prompts/model-facts.d.ts +34 -2
  26. package/dist/prompts/model-facts.js +66 -5
  27. package/dist/prompts/partials.generated.js +8 -2
  28. package/dist/prompts/prompting-tips.d.ts +1 -1
  29. package/dist/prompts/prompting-tips.js +61 -16
  30. package/dist/prompts/reference-composer.d.ts +2 -0
  31. package/dist/prompts/reference-composer.js +51 -50
  32. package/dist/prompts/script-document.d.ts +165 -0
  33. package/dist/prompts/script-document.js +11 -0
  34. package/dist/prompts/shot-grammar.d.ts +4 -4
  35. package/dist/prompts/shot-grammar.js +3 -3
  36. package/dist/prompts/shot-spec.d.ts +13 -0
  37. package/dist/prompts/shot-spec.js +23 -5
  38. package/dist/skills/content.js +27 -24
  39. package/exports/slates-chatgpt-images/generated/SKILL.md +107 -0
  40. package/exports/slates-chatgpt-images/generated/slates-chatgpt-images.skill +0 -0
  41. package/exports/slates-prompt-builder/generated/SKILL.md +1 -1
  42. package/exports/slates-prompt-builder/generated/reference-character.md +9 -1
  43. package/exports/slates-prompt-builder/generated/reference-kling.md +3 -3
  44. package/exports/slates-prompt-builder/generated/reference-nano-banana.md +22 -10
  45. package/exports/slates-prompt-builder/generated/reference-seedance.md +4 -4
  46. package/exports/slates-prompt-builder/generated/slates-prompt-builder-manifest.json +17 -17
  47. package/exports/slates-prompt-builder/generated/slates-prompt-builder.skill +0 -0
  48. package/package.json +9 -3
  49. package/skills/_partials/cinematic-card.md +8 -0
  50. package/skills/_partials/cinematic-routes-short.md +2 -0
  51. package/skills/_partials/cinematic-tips-short.md +2 -0
  52. package/skills/_partials/decision-log.md +1 -13
  53. package/skills/_partials/image-defaults.md +11 -0
  54. package/skills/_partials/lens-video-split.md +1 -0
  55. package/skills/_partials/reference-rules-core.md +1 -1
  56. package/skills/_partials/sheet-tool-defaults.md +6 -0
  57. package/skills/slates-character-identity.md +9 -1
  58. package/skills/slates-chatgpt-images.md +107 -0
  59. package/skills/slates-cinematic-look.md +237 -0
  60. package/skills/slates-cost-discipline.md +18 -12
  61. package/skills/slates-direct-response-ad.md +13 -53
  62. package/skills/slates-edit-and-iterate.md +1 -1
  63. package/skills/slates-model-selection.md +20 -14
  64. package/skills/slates-one-prompt-film.md +19 -77
  65. package/skills/slates-project-organization.md +7 -3
  66. package/skills/slates-prompting-flux-2-max.md +15 -4
  67. package/skills/slates-prompting-gpt-image-2-5.md +41 -28
  68. package/skills/slates-prompting-inworld-tts.md +174 -174
  69. package/skills/slates-prompting-kling-v3.md +3 -3
  70. package/skills/slates-prompting-lip-sync.md +1 -1
  71. package/skills/slates-prompting-minimax-h3.md +30 -17
  72. package/skills/slates-prompting-motion-transfer.md +1 -1
  73. package/skills/slates-prompting-nano-banana-2.md +24 -11
  74. package/skills/slates-prompting-seedance-2-5.md +7 -6
  75. package/skills/slates-prompting-seedance.md +5 -5
  76. package/skills/slates-prompting-seedream-5-lite.md +14 -3
  77. package/skills/slates-prompting-veo-3.md +1 -1
  78. package/skills/slates-script-craft.md +45 -0
  79. package/skills/slates-shot-variety.md +11 -40
  80. package/skills/slates-storyboard-from-script.md +14 -66
  81. package/skills/slates-style-prompting.md +4 -4
  82. package/skills/slates-ugc-influencer-ad.md +32 -309
  83. package/skills/slates-vision-feedback-loop.md +2 -1
@@ -0,0 +1,107 @@
1
+ ---
2
+ name: slates-chatgpt-images
3
+ description: Generate images using a connected ChatGPT account or the desktop host's built-in image tool, preserving Slates project context, exact prompts and reference lineage. Use when the user requests ChatGPT generation rather than Slates credits.
4
+ ---
5
+
6
+ # ChatGPT images in Slates
7
+
8
+ Resolve the project with `slates_list_projects` and references with
9
+ `slates_get_selection` or `slates_list_assets`. Badge codes are project-specific.
10
+ Inspect the selected images before generating. Keep the ordered reference IDs
11
+ alongside the exact prompt submitted for every output.
12
+
13
+ Retrieve relevant craft with `slates_get_prompting_guide`: use `cinematic-look`
14
+ or `style-prompting` for those requests, with section/query retrieval when useful.
15
+ Do not apply another API model's settings or capabilities to the host generator.
16
+
17
+ ## Connected desktop path
18
+
19
+ This add-on is off by default. The user enables Settings → AI tools → ChatGPT images in
20
+ Slates before connecting. It requires an installed Codex host and an eligible
21
+ ChatGPT account; a subscription alone does not install or connect the host.
22
+ Settings offers installation instructions, Connect ChatGPT and Check again in
23
+ place, and reports the same connection state as the image picker.
24
+ Never install software or enable the add-on silently. Ordinary Slates use needs
25
+ neither this add-on nor Codex.
26
+
27
+ Call `slates_get_chatgpt_status`. If connected, use
28
+ `slates_generate_chatgpt_image` with projectId, a fresh UUID requestId, the prompt
29
+ and ordered referenceAssetIds. This is also the path used by Slates' prompt bar
30
+ and Studio Agent. Use background mode for long calls and inspect
31
+ `slates_get_generation_status` with the returned generationId.
32
+ The desktop bridge removes only its own temporary thread's original image after
33
+ saving and byte-verifying the project copy. Failed cleanup keeps the original.
34
+ This does not authorize deletion of files from ordinary host conversations or
35
+ files supplied to `slates_save_external_image`.
36
+
37
+ On timeout or an uncertain response, reuse the SAME requestId. Do not create
38
+ a new request to check the old one. Failed or unavailable connections preserve
39
+ the user's prompt and refs. Start sign-in with `slates_connect_chatgpt` only when
40
+ the user requests connecting; give the returned URL to the user to complete it.
41
+
42
+ ## Host-tool path
43
+
44
+ If this conversation exposes a built-in image generator and the user chooses
45
+ that host workflow, retrieve originals through `slates_get_asset_image` with
46
+ fullRes, or use the returned local paths when the host can read them. Inspect
47
+ local images using the host's image viewer before editing. Supply every selected
48
+ reference in its intended order using the generator's actual schema.
49
+
50
+ Use the built-in generator. No API key, paid API, browser automation, invented
51
+ model identifier, hidden quality setting or silent fallback. If unavailable,
52
+ report that limitation and retain the prepared prompt and references.
53
+
54
+ Save EACH returned image through `slates_save_external_image`, using its actual
55
+ filePath or image dataUrl, exact submitted prompt, observed generator label and
56
+ the IDs of the references actually sent. Omit model unless the host reports it.
57
+ Requested settings are requests, not output facts. Text-only images have no
58
+ references. Never substitute a screenshot of the result for the original bytes.
59
+
60
+ For an uncertain save, inspect the project's new assets and compare prompt,
61
+ lineage and output bytes before retrying. The external save operation is not
62
+ idempotent for new imports. Reuse assetId to annotate a confirmed existing
63
+ upload; do not import the same file again. If identification is ambiguous, stop
64
+ and report the uncertainty. A missing output or host failure saves nothing and
65
+ does not authorize another generation.
66
+
67
+ ## Framing and quality requests
68
+
69
+ The connected operation accepts optional `aspectRatio`, with presets supplied
70
+ by its schema. Slates appends that request in words through the same composer
71
+ used by the UI's What gets sent preview. Do not also append a second ratio
72
+ instruction yourself. Saved metadata preserves the original text, requested
73
+ ratio and exact submitted prompt; actual dimensions remain measured separately.
74
+
75
+ For a new prompt, choose only an aspect-ratio preset supported by the current
76
+ flagship GPT image model in Slates' capability SSOT. Resolve the current model
77
+ through `slates_list_available_models` and `slates_get_prompting_guide` for
78
+ model-selection; read the generated `slates_generate_image` aspectRatio schema
79
+ for its allowed presets. Do not call that paid operation. Do not maintain a
80
+ second hard-coded ratio list here. If the current presets cannot be retrieved,
81
+ retain the prepared prompt and resolve them before adding a framing request.
82
+ An explicit user request takes precedence; never silently rewrite their prompt.
83
+
84
+ State the chosen ratio and orientation in the submitted text. This is a prompt
85
+ request, not a host size parameter or an assertion of the host's limits. Measure
86
+ the returned file and report requested versus actual framing; never silently
87
+ crop or stretch it to make the numbers match.
88
+
89
+ Describe desired detail, legibility, materials and lighting concretely. Words
90
+ such as “higher quality” do not establish a quality enum or select a backend.
91
+ Only record an actual model or quality tier if the host reports it. The built-in
92
+ tool and App Server receipt inspected for this workflow do not expose those
93
+ fields. Preserve revisedPrompt separately when supplied.
94
+
95
+ OpenAI's [image prompting guide](https://developers.openai.com/api/docs/guides/image-prompting)
96
+ separates API parameters from prompt language. Its quality and pixel controls
97
+ are not automatically controls of the built-in tool. Product launch names and
98
+ the `chatgpt-image-latest` API alias are not per-result model receipts.
99
+
100
+ ## Verify the saved result
101
+
102
+ Read back the returned asset(s) and inspect the images. Report project, badge
103
+ code, generator, reference codes and measured dimensions. Distinguish submitted
104
+ prompt from any host-reported revised prompt. Do not claim a model/quality tier
105
+ from appearance. Reuse Prompt restores text and references; check the displayed
106
+ generation destination before another generation. No plugin publication or
107
+ directory listing is required for this workflow.
@@ -18,7 +18,7 @@ This portable skill is deliberately thin. Its reference files are generated dire
18
18
  |---|---|---|
19
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
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
- | **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` |
21
+ | **Nano Banana 2 (Gemini 3.1 Flash Image)** | 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. | `reference-nano-banana.md` |
22
22
  <!-- @end:model-routing -->
23
23
 
24
24
  If the user names a model, use it. Otherwise route by the generated table above.
@@ -52,7 +52,15 @@ If text only: generate from prompt-only — less consistent, so warn the user.
52
52
 
53
53
  ### Generate the sheet
54
54
 
55
- - Default to Nano Banana 2 at 2K. **Never 4K** — no identity gain at sheet scale, wasted spend.
55
+ <!-- @inject:sheet-tool-defaults -->
56
+ **What the sheet tools render on** (you do not pick these; omit `model`):
57
+
58
+ - **Character identity sheet:** `gpt-image-2-5-sunburst` at 3k, quality `high`, one 16:9 image.
59
+ - **Establishing image:** `gpt-image-2-5-sunburst` at 3k, quality `high`, one 16:9 image.
60
+
61
+ Price 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.
62
+ <!-- @end:sheet-tool-defaults -->
63
+
56
64
  - When the result returns inline, **evaluate it before binding**:
57
65
  - Is the portrait clearly the largest panel, and is it off-frontal?
58
66
  - **Is the front body panel cleanly headless** — an empty collar above a normally rendered body, no partial face, no floating jaw, no smeared neck stump? A botched crop is worse than no crop.
@@ -145,7 +145,7 @@ Every reference rule below is a corollary of that one sentence, which is why "pr
145
145
  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.
146
146
 
147
147
  1. **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.
148
- 2. **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 composes the naming for you from your `@mentions` / `#tags` — you never hand-write role labels.
148
+ 2. **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.
149
149
  3. **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.
150
150
  4. **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.
151
151
  5. **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.
@@ -167,11 +167,11 @@ Kling exposes `negative_prompt` on the fal endpoint (different from Seedance whi
167
167
 
168
168
  ```
169
169
  blurry, low quality, watermark, text overlay, distorted hands, extra fingers,
170
- duplicate limbs, unnatural skin texture, overly saturated colors, lens flare,
170
+ duplicate limbs, unnatural skin texture, overly saturated colors,
171
171
  floating objects, inconsistent shadows, jittery, flickering, morphing face
172
172
  ```
173
173
 
174
- Layer scene-specific suppressions on top.
174
+ Layer scene-specific suppressions on top, and never suppress something the prompt asks for. This block carried `lens flare` until 2026-09-15, which silently cancelled every flare a prompt described (`slates-cinematic-look` → `source-flare`); add it back only for a shot that must have none.
175
175
 
176
176
  ## Cinematic tactics
177
177
 
@@ -8,15 +8,21 @@
8
8
  **Card — Nano Banana 2 (Gemini 3.1 Flash Image).** Brief it like a creative director, not a tag list. Structure: `Film still from [director] [genre]. Shot on [camera] with [lens]. [Subject and action]. [3-5 specific visual details]. [Lighting — direction + quality]. [Color palette]. [Film stock]. [1-2 word tone].`
9
9
 
10
10
  **The five levers**
11
- 1. **Named lens + aperture** beats "shallow depth of field" — `85mm f/1.4`, `135mm f/2.8` (the cheat code for skin), `Panavision anamorphic`, `400mm telephoto`.
11
+ 1. **Named lens + aperture** beats "shallow depth of field" — `85mm f/1.4`, `135mm f/2.8`, `Panavision anamorphic`, `400mm telephoto`.
12
12
  2. **Light by direction and quality**, never "good lighting" — `hard sidelight from a single window, deep falloff`, `overcast north light`, `practical tungsten spill`.
13
13
  3. **A named film stock or sensor** carries a whole palette — `Kodak Portra 400`, `Cinestill 800T`, `ARRI Alexa 65`.
14
14
  4. **Composition as a shot** — `low angle`, `aerial view`, `rule of thirds with the subject camera-left`, `foreground occlusion`.
15
15
  5. **Positive framing only.** Describe what is there. "Empty street", never "no cars"; "unstaged documentary photography", never "not anime".
16
16
 
17
- **Examples**
18
- - `Film still from a Denis Villeneuve thriller. Shot on ARRI Alexa 65, 85mm f/1.4. A woman in a charcoal wool coat stands at a rain-slick bus stop, breath visible. Hard sodium light from a single overhead lamp, deep falloff into blue night. Kodak Vision3 500T. Isolated.`
19
- - `Editorial still life on seamless bone paper. 100mm macro, f/8. A cracked ceramic bowl holding three figs. Soft north light from camera-left, one gentle shadow. Muted earth palette. Portra 400 grain. Quiet.`
17
+ <!-- @inject:cinematic-card -->
18
+ **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:
19
+ - **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.
20
+ - **One light system** — `low sun behind her`, `her face falls into deep shadow`, `no light in front of her`.
21
+ - **Visible exposure** — `the sky burns out to white`, `dense, slightly crushed shadows`.
22
+ - **Lens name plus effect** — `200mm telephoto`, `peaks loom huge behind her and melt into soft shapes`.
23
+ - **Name every garment and close the foreground.** Omissions invite reference leakage or invented props.
24
+ Bind 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.
25
+ <!-- @end:cinematic-card -->
20
26
 
21
27
  **Hard constraint:** there is no `negativePrompt` field. Suppress by reframing positively, or inline `without` / `free of`. Knowledge cutoff January 2025 — anything later needs reference images.
22
28
  <!-- @card:end -->
@@ -46,12 +52,14 @@ Film still from [DIRECTOR] [GENRE]. Shot on [CAMERA] with [LENS]. [SUBJECT and a
46
52
 
47
53
  ## Photorealism positives — what consistently works
48
54
 
49
- > ⚠️ **This vocabulary is an IMAGE-model lever and a video-model anti-pattern — do not carry it across.**
50
- > Named lenses, apertures, film stocks and camera bodies (`85mm f/1.4`, `Kodak Portra 400`, `ARRI Alexa 65`) are correct and encouraged **here**. They are a **Seedance anti-pattern**: ByteDance's own guide uses shot sizes, camera moves, pacing words and its image-quality vocabulary throughout, and never once mentions fps, shutter angle, f-stop, or lens millimetres.
51
- > The leak happens in one specific way — you write an NB2 start frame, then write the video prompt to animate it and carry the look description straight across. **Translate instead of copying:** `85mm f/1.4, Portra 400` → `close-up, shallow depth of field, warm natural colors, cinematic texture, film-grain texture`. Full rule and the receipts: `reference-seedance.md` (Part 3, "Don't cross-pollinate image-model syntax").
55
+ ⚠️ **This vocabulary is correct here and does not carry into a video prompt.** The leak happens one way: you write an NB2 start frame, then carry its look description straight into the prompt that animates it.
56
+
57
+ <!-- @inject:lens-video-split -->
58
+ 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.
59
+ <!-- @end:lens-video-split -->
52
60
 
53
61
  **Named lenses + apertures** beat generic "shallow depth of field":
54
- - `85mm f/1.4`, `135mm f/2.8` (the cheat code for skin texture), `50mm f/1.2`, `35mm f/2`
62
+ - `85mm f/1.4`, `135mm f/2.8`, `50mm f/1.2`, `35mm f/2`
55
63
  - `Panavision anamorphic` for horizontal flares + cinematic width
56
64
  - `400mm telephoto` for compression + isolation
57
65
  - `24mm` for environmental interiors
@@ -76,6 +84,7 @@ Film still from [DIRECTOR] [GENRE]. Shot on [CAMERA] with [LENS]. [SUBJECT and a
76
84
  - `visible pores`, `natural skin grain`, `peach fuzz`, `slight hyperpigmentation`
77
85
  - `unretouched raw photography`, `ISO noise`, `sweat beading`
78
86
  - `crisp catchlights in the eyes`, `skin micro-detail`
87
+ - Lead with the kind of photograph and the conditions on the skin (sun, wind, sweat), then add one or two of these. A bare list of flaw words read as tokens and produced plastic skin on GPT Image 2 (2026-08-24).
79
88
 
80
89
  **Director references** (use when locking style):
81
90
  | Director | Tone | Visual signature |
@@ -103,6 +112,9 @@ These are Stable-Diffusion-era tag soup. The model treats them as low-signal noi
103
112
  - `cinematic` standing alone — always specify *which cinema* (director, lens, era, stock)
104
113
  - `not anime, not cartoon, not 3D` — negation tag soup, replace with a positive style cue
105
114
 
115
+ **Examples**
116
+ - `Film still from a Denis Villeneuve thriller. Shot on ARRI Alexa 65, 85mm f/1.4. A woman in a charcoal wool coat stands at a rain-slick bus stop, breath visible. Hard sodium light from a single overhead lamp, deep falloff into blue night. Kodak Vision3 500T. Isolated.`
117
+
106
118
  ## Negative prompting — there is no field
107
119
 
108
120
  Nano Banana 2 has **no `negativePrompt` parameter**. Three patterns to suppress unwanted content:
@@ -116,7 +128,7 @@ Default to #1. Reach for #2 only when positive framing can't suppress the unwant
116
128
  ## Reference images
117
129
 
118
130
  - **Hard limit: 14 images** (10 object-fidelity + 4 character-consistency). Categories don't trade — you can't use 14 object slots even if no characters are referenced.
119
- - **Name each reference inline — Slates does this for you.** When you `@mention` a subject/environment or `#mention` a style, Slates composes the prompt so each reference is named inline as "image N" — e.g. `Marcus (image 1) sits across from the woman (image 2) in the cafe (image 3)`, with a trailing `Render in the visual style of image 4.` The model does NOT infer a reference's role from its position; the NAME carries it. NB2's own consistency lever is literally **"assign a distinct name to each character/object"**. **Do NOT hand-write a "Reference Image Instructions" block or role essays** ("use for identity, ignore the outfit, render the scene's expression") — that drags the sheet's wardrobe + studio lighting into the scene. The prompt leads; the user's words own wardrobe, expression, lighting, and action.
131
+ - **Name each reference inline — Slates does this for you.** When you `@mention` a subject/environment or `#mention` a style, Slates composes the prompt so each reference is named inline as "image N" — e.g. `Marcus (image 1) sits across from the woman (image 2) in the cafe (image 3)`, or `lit and graded like image 4` where you placed the style mention. An unmentioned style attachment gets a short fallback clause The model does NOT infer a reference's role from its position; the NAME carries it. NB2's own consistency lever is literally **"assign a distinct name to each character/object"**. **Do NOT hand-write a "Reference Image Instructions" block or role essays** ("use for identity, ignore the outfit, render the scene's expression") — that drags the sheet's wardrobe + studio lighting into the scene. The prompt leads; the user's words own wardrobe, expression, lighting, and action.
120
132
 
121
133
  ### Reference rules (the verified ones)
122
134
 
@@ -138,7 +150,7 @@ Every reference rule below is a corollary of that one sentence, which is why "pr
138
150
  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.
139
151
 
140
152
  1. **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.
141
- 2. **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 composes the naming for you from your `@mentions` / `#tags` — you never hand-write role labels.
153
+ 2. **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.
142
154
  3. **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.
143
155
  4. **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.
144
156
  5. **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.
@@ -261,7 +261,7 @@ Every reference rule below is a corollary of that one sentence, which is why "pr
261
261
  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.
262
262
 
263
263
  1. **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.
264
- 2. **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 composes the naming for you from your `@mentions` / `#tags` — you never hand-write role labels.
264
+ 2. **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.
265
265
  3. **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.
266
266
  4. **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.
267
267
  5. **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.
@@ -332,9 +332,9 @@ One primary anchor + 2-3 supporting details, as the trailing paragraph (both off
332
332
 
333
333
  ## ⚠️ Don't cross-pollinate image-model syntax
334
334
 
335
- Named **lenses, apertures, film stocks, and camera bodies** — `85mm f/1.4`, `Kodak Portra 400`, `ARRI Alexa 65`, `shot on Sony A7S3` — are an **image-model lever** (correct and encouraged in `reference-nano-banana.md`) and a **Seedance anti-pattern**. ByteDance's guide uses shot sizes, camera moves, pacing words, and the image-quality/style vocabulary throughout, and never once mentions fps, shutter angle, f-stop, or lens millimetres.
336
-
337
- If you are carrying a look over from an NB2 start frame, translate it: `85mm f/1.4, Portra 400` → `close-up, shallow depth of field, warm natural colors, cinematic texture, film-grain texture`.
335
+ <!-- @inject:lens-video-split -->
336
+ 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.
337
+ <!-- @end:lens-video-split -->
338
338
 
339
339
  ## Negative prompting — inline only
340
340
 
@@ -8,19 +8,19 @@
8
8
  },
9
9
  {
10
10
  "path": "skills/slates-character-identity.md",
11
- "sha256": "87ede794637553db0074dd64ea9a9cb27bfc3afda52fdc6489702d81e7f94b53"
11
+ "sha256": "0f8d2a51ad2b8f1504d5e554384a97ad28e27603c1404dc27d234c73680e8b57"
12
12
  },
13
13
  {
14
14
  "path": "skills/slates-prompting-seedance.md",
15
- "sha256": "3f2d1f02096169a34da80a1f8a4ef70fb1b22d3dfc8f95cfbb40be908fc7e031"
15
+ "sha256": "426bd046a9ce8f2f0e466772e6f032d65ea773bbb96729e2161ac61c0d040135"
16
16
  },
17
17
  {
18
18
  "path": "skills/slates-prompting-kling-v3.md",
19
- "sha256": "81edd7b060648c97d914017101345b0f0e122660a2050389c80f58f24b48aa9c"
19
+ "sha256": "ca609eddaa82fbccf103e9fdf91f2c68f4c28e3d9aa8d1e073b9fc6c8d0fe0bd"
20
20
  },
21
21
  {
22
22
  "path": "skills/slates-prompting-nano-banana-2.md",
23
- "sha256": "9b746abb7bb3726e39d054a704e9a71f699e365e27e40ced14bca06f922f8a24"
23
+ "sha256": "1295e2be027cab84f0d96fd86d9cbcd6606e67c0537272ec916a8ed7c582ce3d"
24
24
  },
25
25
  {
26
26
  "path": "skills/slates-content-policy.md",
@@ -28,34 +28,34 @@
28
28
  },
29
29
  {
30
30
  "path": "src/prompts/model-facts.ts",
31
- "sha256": "4df3ac4b003ed29c2e1992a34519e01957e5292211a294bb2af0045daf9d4194"
31
+ "sha256": "92f42aa5befd60cc7f2aa058fcd50c720278008b4665a2bb14a6c7892db280a3"
32
32
  }
33
33
  ],
34
34
  "outputs": [
35
35
  {
36
36
  "path": "SKILL.md",
37
- "bytes": 4622,
38
- "sha256": "0c3f1982796fe668824067b06e8d76070aaae2d00d47a978ef5bd8b489b2a3da"
37
+ "bytes": 4630,
38
+ "sha256": "416dce585f5ff042f4f83107ac907b0b10d77db171e34e4c5d3c6dfc51e50d75"
39
39
  },
40
40
  {
41
41
  "path": "reference-character.md",
42
- "bytes": 10249,
43
- "sha256": "75853dcf6b793df82924bf96bee1795b0a33014bb8cc8a2d18543455c0232761"
42
+ "bytes": 10639,
43
+ "sha256": "cdf991fd220d5bf0240ae21f15acb238d8970c89a27c5e5434f034160732752d"
44
44
  },
45
45
  {
46
46
  "path": "reference-seedance.md",
47
- "bytes": 35043,
48
- "sha256": "de7e38a0e54b5c244c2c6be62b74fff0298d1ebf08a77727cc14b093a7487b34"
47
+ "bytes": 35163,
48
+ "sha256": "46a4d6ae707bf5dffe622d62dbcc385dd29e9d2ffb3e270b5f91db5fecd5940e"
49
49
  },
50
50
  {
51
51
  "path": "reference-kling.md",
52
- "bytes": 15908,
53
- "sha256": "99430d96af4461404bb55a6e56e1c3581a2cae817f0e337d0046cbee41dbb0bf"
52
+ "bytes": 16192,
53
+ "sha256": "964ca2bc79d4e1b5fb0902293780c9cb7e46a0b3fc7cbfc6e1998fa04661e768"
54
54
  },
55
55
  {
56
56
  "path": "reference-nano-banana.md",
57
- "bytes": 18239,
58
- "sha256": "7efcaed812a39ddb5a88ba6f7029f975640b5ccc166002d620324d214944125b"
57
+ "bytes": 19415,
58
+ "sha256": "2146e05141da197be429ff50cbf6b16bd31fe081cfb74a3a73ca12e450277447"
59
59
  },
60
60
  {
61
61
  "path": "reference-content-policy.md",
@@ -65,8 +65,8 @@
65
65
  ],
66
66
  "archive": {
67
67
  "path": "slates-prompt-builder.skill",
68
- "bytes": 40546,
69
- "sha256": "0760799f957aac866590768dd00bc74cd4c32525364455c0eab96dba334c4de4",
68
+ "bytes": 41393,
69
+ "sha256": "0d9310955ad7e869d1caf195edafc20802944d238fa2350a832290400985b174",
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.11",
3
+ "version": "0.7.1",
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",
@@ -30,6 +30,10 @@
30
30
  "./asset-label": {
31
31
  "types": "./dist/prompts/asset-label.d.ts",
32
32
  "default": "./dist/prompts/asset-label.js"
33
+ },
34
+ "./model-facts": {
35
+ "types": "./dist/prompts/model-facts.d.ts",
36
+ "default": "./dist/prompts/model-facts.js"
33
37
  }
34
38
  },
35
39
  "files": [
@@ -37,15 +41,17 @@
37
41
  "!dist/**/*.map",
38
42
  "skills",
39
43
  "exports/slates-prompt-builder/generated",
44
+ "exports/slates-chatgpt-images/generated",
40
45
  "README.md"
41
46
  ],
42
47
  "scripts": {
43
48
  "sync-partials": "node scripts/sync-partials.mjs",
44
49
  "build-prompt-builder": "node scripts/build-prompt-builder.mjs",
45
50
  "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 && node scripts/update-check-check.mjs",
51
+ "build-chatgpt-skill": "node scripts/build-chatgpt-skill.mjs",
52
+ "build": "node scripts/build-chatgpt-skill.mjs --check && 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
53
  "typecheck": "node scripts/sync-partials.mjs --check && node scripts/build-prompt-builder.mjs --check && node scripts/embed-skills.mjs && tsc --noEmit",
48
- "prepublishOnly": "npm run build",
54
+ "prepublishOnly": "npm run build && node ../../scripts/cinematic-catalogue-check.mjs && node ../../scripts/prompt-control-check.mjs",
49
55
  "render-partials": "node scripts/render-capability-partials.mjs"
50
56
  },
51
57
  "repository": {
@@ -0,0 +1,8 @@
1
+ **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:
2
+ - **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.
3
+ - **One light system** — `low sun behind her`, `her face falls into deep shadow`, `no light in front of her`.
4
+ - **Visible exposure** — `the sky burns out to white`, `dense, slightly crushed shadows`.
5
+ - **Lens name plus effect** — `200mm telephoto`, `peaks loom huge behind her and melt into soft shapes`.
6
+ - **Name every garment and close the foreground.** Omissions invite reference leakage or invented props.
7
+ Bind 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.
8
+ <!-- slates-only -->Use `slates-cinematic-look` with a technique ID or section query for more.<!-- /slates-only -->
@@ -0,0 +1,2 @@
1
+ <!-- consumer:ts -->
2
+ 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.
@@ -0,0 +1,2 @@
1
+ <!-- consumer:ts -->
2
+ 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.
@@ -1,13 +1 @@
1
- When you surface the plan, include a short **decision log** — one line per decision *you* made that the user did not specify **and that no row already records**:
2
-
3
- ```
4
- source phrase or declared default → what you wrote → what it resolves
5
- "in a diner" → warm, and the light is the reason → why the anchor was chosen, not what it is
6
- (no time of day) → late afternoon, low warm key → default; say the word and it changes
7
- ```
8
-
9
- 🚨 **Keep it to what is NOT already data — and almost everything now IS.** A Shot holds the references and their roles, the model, every param, the shot size, the camera, the prop, the action and the spoken line, and `slates_list_shots` reads the whole board back in order with its variety counts. Narrating any of those is retelling a row the user can open. **Write the Shot, and let the log carry only the judgement no field holds** — why this world, why this light, why this register.
10
-
11
- **Hard rule: never silently add weather, props, style, or camera movement.** Four of those are now FIELDS: put the value on the Shot (`prop`, `camera`, `shotSize`, `action`) so the user can read and change it, and put the *reason* in the log only when you invented it rather than being told it. The rule has not softened — it moved from narration into data, which is stronger, because a field can be corrected and a sentence in chat cannot.
12
-
13
- > ❌ **Do NOT turn this into a question gate.** Clarifying questions before optimizing directly fight the locked fast-path rule: *if intent is clear, generate immediately with sane defaults, don't ask questions; only ask for production intent, and batch every question into one message.* Log the decisions, then go. The log is an **output**, not an interrogation — surfaced alongside the plan, never as a separate ceremony, and never as a reason to wait.
1
+ 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.
@@ -0,0 +1,11 @@
1
+ **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.
2
+
3
+ | Model | Default resolution |
4
+ |---|---|
5
+ | nano-banana-2 | 2k |
6
+ | nano-banana-2-lite | 1k |
7
+ | nano-banana-pro | 2k |
8
+ | gpt-image-2-5-flare | 2k |
9
+ | gpt-image-2-5-sunburst | 3k |
10
+ | flux-2-max | 1k |
11
+ | seedream-5-lite | 2k |
@@ -0,0 +1 @@
1
+ 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.
@@ -1,7 +1,7 @@
1
1
  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.
2
2
 
3
3
  1. **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.
4
- 2. **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 composes the naming for you from your `@mentions` / `#tags` — you never hand-write role labels.
4
+ 2. **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.
5
5
  3. **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.
6
6
  4. **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.
7
7
  5. **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.
@@ -0,0 +1,6 @@
1
+ **What the sheet tools render on** (you do not pick these; omit `model`):
2
+
3
+ - **Character identity sheet:** `gpt-image-2-5-sunburst` at 3k, quality `high`, one 16:9 image.
4
+ - **Establishing image:** `gpt-image-2-5-sunburst` at 3k, quality `high`, one 16:9 image.
5
+
6
+ Price 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.
@@ -68,7 +68,15 @@ If text only: generate from prompt-only — less consistent, so warn the user.
68
68
  - Estimate cost first with `slates_estimate_generation_cost` and announce in **credits** — never quote a price from memory.
69
69
  <!-- /slates-only -->
70
70
 
71
- - Default to Nano Banana 2 at 2K. **Never 4K** — no identity gain at sheet scale, wasted spend.
71
+ <!-- @inject:sheet-tool-defaults -->
72
+ **What the sheet tools render on** (you do not pick these; omit `model`):
73
+
74
+ - **Character identity sheet:** `gpt-image-2-5-sunburst` at 3k, quality `high`, one 16:9 image.
75
+ - **Establishing image:** `gpt-image-2-5-sunburst` at 3k, quality `high`, one 16:9 image.
76
+
77
+ Price 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.
78
+ <!-- @end:sheet-tool-defaults -->
79
+
72
80
  - When the result returns inline, **evaluate it before binding**:
73
81
  - Is the portrait clearly the largest panel, and is it off-frontal?
74
82
  - **Is the front body panel cleanly headless** — an empty collar above a normally rendered body, no partial face, no floating jaw, no smeared neck stump? A botched crop is worse than no crop.
@@ -0,0 +1,107 @@
1
+ ---
2
+ name: slates-chatgpt-images
3
+ description: Generate images using a connected ChatGPT account or the desktop host's built-in image tool, preserving Slates project context, exact prompts and reference lineage. Use when the user requests ChatGPT generation rather than Slates credits.
4
+ ---
5
+
6
+ # ChatGPT images in Slates
7
+
8
+ Resolve the project with `slates_list_projects` and references with
9
+ `slates_get_selection` or `slates_list_assets`. Badge codes are project-specific.
10
+ Inspect the selected images before generating. Keep the ordered reference IDs
11
+ alongside the exact prompt submitted for every output.
12
+
13
+ Retrieve relevant craft with `slates_get_prompting_guide`: use `cinematic-look`
14
+ or `style-prompting` for those requests, with section/query retrieval when useful.
15
+ Do not apply another API model's settings or capabilities to the host generator.
16
+
17
+ ## Connected desktop path
18
+
19
+ This add-on is off by default. The user enables Settings → AI tools → ChatGPT images in
20
+ Slates before connecting. It requires an installed Codex host and an eligible
21
+ ChatGPT account; a subscription alone does not install or connect the host.
22
+ Settings offers installation instructions, Connect ChatGPT and Check again in
23
+ place, and reports the same connection state as the image picker.
24
+ Never install software or enable the add-on silently. Ordinary Slates use needs
25
+ neither this add-on nor Codex.
26
+
27
+ Call `slates_get_chatgpt_status`. If connected, use
28
+ `slates_generate_chatgpt_image` with projectId, a fresh UUID requestId, the prompt
29
+ and ordered referenceAssetIds. This is also the path used by Slates' prompt bar
30
+ and Studio Agent. Use background mode for long calls and inspect
31
+ `slates_get_generation_status` with the returned generationId.
32
+ The desktop bridge removes only its own temporary thread's original image after
33
+ saving and byte-verifying the project copy. Failed cleanup keeps the original.
34
+ This does not authorize deletion of files from ordinary host conversations or
35
+ files supplied to `slates_save_external_image`.
36
+
37
+ On timeout or an uncertain response, reuse the SAME requestId. Do not create
38
+ a new request to check the old one. Failed or unavailable connections preserve
39
+ the user's prompt and refs. Start sign-in with `slates_connect_chatgpt` only when
40
+ the user requests connecting; give the returned URL to the user to complete it.
41
+
42
+ ## Host-tool path
43
+
44
+ If this conversation exposes a built-in image generator and the user chooses
45
+ that host workflow, retrieve originals through `slates_get_asset_image` with
46
+ fullRes, or use the returned local paths when the host can read them. Inspect
47
+ local images using the host's image viewer before editing. Supply every selected
48
+ reference in its intended order using the generator's actual schema.
49
+
50
+ Use the built-in generator. No API key, paid API, browser automation, invented
51
+ model identifier, hidden quality setting or silent fallback. If unavailable,
52
+ report that limitation and retain the prepared prompt and references.
53
+
54
+ Save EACH returned image through `slates_save_external_image`, using its actual
55
+ filePath or image dataUrl, exact submitted prompt, observed generator label and
56
+ the IDs of the references actually sent. Omit model unless the host reports it.
57
+ Requested settings are requests, not output facts. Text-only images have no
58
+ references. Never substitute a screenshot of the result for the original bytes.
59
+
60
+ For an uncertain save, inspect the project's new assets and compare prompt,
61
+ lineage and output bytes before retrying. The external save operation is not
62
+ idempotent for new imports. Reuse assetId to annotate a confirmed existing
63
+ upload; do not import the same file again. If identification is ambiguous, stop
64
+ and report the uncertainty. A missing output or host failure saves nothing and
65
+ does not authorize another generation.
66
+
67
+ ## Framing and quality requests
68
+
69
+ The connected operation accepts optional `aspectRatio`, with presets supplied
70
+ by its schema. Slates appends that request in words through the same composer
71
+ used by the UI's What gets sent preview. Do not also append a second ratio
72
+ instruction yourself. Saved metadata preserves the original text, requested
73
+ ratio and exact submitted prompt; actual dimensions remain measured separately.
74
+
75
+ For a new prompt, choose only an aspect-ratio preset supported by the current
76
+ flagship GPT image model in Slates' capability SSOT. Resolve the current model
77
+ through `slates_list_available_models` and `slates_get_prompting_guide` for
78
+ model-selection; read the generated `slates_generate_image` aspectRatio schema
79
+ for its allowed presets. Do not call that paid operation. Do not maintain a
80
+ second hard-coded ratio list here. If the current presets cannot be retrieved,
81
+ retain the prepared prompt and resolve them before adding a framing request.
82
+ An explicit user request takes precedence; never silently rewrite their prompt.
83
+
84
+ State the chosen ratio and orientation in the submitted text. This is a prompt
85
+ request, not a host size parameter or an assertion of the host's limits. Measure
86
+ the returned file and report requested versus actual framing; never silently
87
+ crop or stretch it to make the numbers match.
88
+
89
+ Describe desired detail, legibility, materials and lighting concretely. Words
90
+ such as “higher quality” do not establish a quality enum or select a backend.
91
+ Only record an actual model or quality tier if the host reports it. The built-in
92
+ tool and App Server receipt inspected for this workflow do not expose those
93
+ fields. Preserve revisedPrompt separately when supplied.
94
+
95
+ OpenAI's [image prompting guide](https://developers.openai.com/api/docs/guides/image-prompting)
96
+ separates API parameters from prompt language. Its quality and pixel controls
97
+ are not automatically controls of the built-in tool. Product launch names and
98
+ the `chatgpt-image-latest` API alias are not per-result model receipts.
99
+
100
+ ## Verify the saved result
101
+
102
+ Read back the returned asset(s) and inspect the images. Report project, badge
103
+ code, generator, reference codes and measured dimensions. Distinguish submitted
104
+ prompt from any host-reported revised prompt. Do not claim a model/quality tier
105
+ from appearance. Reuse Prompt restores text and references; check the displayed
106
+ generation destination before another generation. No plugin publication or
107
+ directory listing is required for this workflow.