@nodaro/prompts 1.34.0 → 1.36.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/dist/index.cjs CHANGED
@@ -23099,9 +23099,9 @@ function renderDescribedReferenceLines(refs) {
23099
23099
  }
23100
23100
  function renderReferenceCaptionLines(videoCaptions, audioCaptions, counts) {
23101
23101
  const lines = [];
23102
- const render = (captions, kind, cap) => {
23102
+ const render = (captions, kind, cap2) => {
23103
23103
  if (!captions) return;
23104
- for (let i = 0; i < captions.length && i < cap; i++) {
23104
+ for (let i = 0; i < captions.length && i < cap2; i++) {
23105
23105
  const text = captions[i]?.trim();
23106
23106
  if (!text) continue;
23107
23107
  lines.push(`@${kind}_${i + 1}: ${text}.`);
@@ -23155,6 +23155,16 @@ function applyTemplate(template, vars) {
23155
23155
  template
23156
23156
  );
23157
23157
  }
23158
+
23159
+ // src/unbound-reference-tokens.ts
23160
+ function unboundReferenceTokenText(label) {
23161
+ return label ?? "";
23162
+ }
23163
+ function tidyReferenceTokenGaps(prompt) {
23164
+ return prompt.replace(/[^\S\r\n]{2,}/g, " ").trim();
23165
+ }
23166
+
23167
+ // src/prompt-builder.ts
23158
23168
  function composeIdentityDescPart(subject, canonicalDesc, elementInjection) {
23159
23169
  const parts = [];
23160
23170
  const c = canonicalDesc?.trim();
@@ -24294,7 +24304,11 @@ ${directives}`;
24294
24304
  finalPrompt = reordered.prompt;
24295
24305
  }
24296
24306
  const refsToSend2 = supportsRefs2 && finalUrls.length > 0 ? finalUrls : void 0;
24297
- return { prompt: finalPrompt, nativeNegativePrompt: nativeNegativePrompt2, referenceImageUrls: refsToSend2 };
24307
+ const assembledPrompt = dropUnwiredImageTokens(
24308
+ finalPrompt,
24309
+ (n) => Boolean(tokenFinalSlot(n, nonCharacterRefs, finalIndexByUrl))
24310
+ );
24311
+ return { prompt: assembledPrompt, nativeNegativePrompt: nativeNegativePrompt2, referenceImageUrls: refsToSend2 };
24298
24312
  }
24299
24313
  const charDescs = characterDefs.filter((c) => c.type === "description" && c.description).map((c) => {
24300
24314
  let templateKey;
@@ -24362,6 +24376,7 @@ ${directives}`;
24362
24376
  const supportsRefs = shared.MODELS_WITH_REFERENCE_IMAGE_SUPPORT.has(provider);
24363
24377
  const refsToSend = supportsRefs && allRefs.length > 0 ? allRefs : void 0;
24364
24378
  prompt = expandImagePositionRefs(prompt, allRefs.length);
24379
+ prompt = dropUnwiredImageTokens(prompt, (n) => hasImageAt(n, allRefs.length));
24365
24380
  return { prompt, nativeNegativePrompt, referenceImageUrls: refsToSend };
24366
24381
  }
24367
24382
  function buildImagePromptSegments(config2, bodySegments) {
@@ -24386,6 +24401,22 @@ var STRICT_DEFAULT_SOURCES = /* @__PURE__ */ new Set([
24386
24401
  "wired-location"
24387
24402
  ]);
24388
24403
  var IMAGE_TOKEN_PATTERN = /\{image:(\d+)(?::([^}\n]+))?\}/gi;
24404
+ function tokenFinalSlot(n, refs, finalIndexByUrl) {
24405
+ const ref = refs[n - 1];
24406
+ return ref?.url ? finalIndexByUrl.get(ref.url) : void 0;
24407
+ }
24408
+ function hasImageAt(n, count) {
24409
+ return n >= 1 && n <= count;
24410
+ }
24411
+ function dropUnwiredImageTokens(prompt, isWired) {
24412
+ let dropped = false;
24413
+ const out = prompt.replace(IMAGE_TOKEN_PATTERN, (match, num, label) => {
24414
+ if (isWired(parseInt(num, 10))) return match;
24415
+ dropped = true;
24416
+ return unboundReferenceTokenText(label);
24417
+ });
24418
+ return dropped ? tidyReferenceTokenGaps(out) : prompt;
24419
+ }
24389
24420
  function defaultFidelityForSource(source) {
24390
24421
  if (!source) return "balanced";
24391
24422
  return STRICT_DEFAULT_SOURCES.has(source) ? "strict" : "balanced";
@@ -24543,9 +24574,7 @@ function expandImageRefTokens(prompt, imageCount) {
24543
24574
  }
24544
24575
  function expandImageRefTokensForRefs(prompt, refs, finalIndexByUrl) {
24545
24576
  return prompt.replace(IMAGE_TOKEN_PATTERN, (match, num, label) => {
24546
- const n = parseInt(num, 10);
24547
- const ref = refs[n - 1];
24548
- const finalIdx = ref?.url ? finalIndexByUrl.get(ref.url) : void 0;
24577
+ const finalIdx = tokenFinalSlot(parseInt(num, 10), refs, finalIndexByUrl);
24549
24578
  if (!finalIdx) return match;
24550
24579
  return label ? `Image ${finalIdx} (${label})` : `Image ${finalIdx}`;
24551
24580
  });
@@ -24560,9 +24589,7 @@ function hybridRolePhrase(label, letter) {
24560
24589
  function expandImageRefTokensHybrid(prompt, refs, finalIndexByUrl) {
24561
24590
  const splices = [];
24562
24591
  for (const m of prompt.matchAll(IMAGE_TOKEN_PATTERN)) {
24563
- const n = parseInt(m[1], 10);
24564
- const ref = refs[n - 1];
24565
- const finalIdx = ref?.url ? finalIndexByUrl.get(ref.url) : void 0;
24592
+ const finalIdx = tokenFinalSlot(parseInt(m[1], 10), refs, finalIndexByUrl);
24566
24593
  if (!finalIdx) continue;
24567
24594
  splices.push({
24568
24595
  offset: m.index ?? 0,
@@ -24594,7 +24621,7 @@ function buildIdentityDirectives(prompt, refs, meta3 = [], suppressedCanonicalLo
24594
24621
  function expandImagePositionRefs(prompt, imageCount, names) {
24595
24622
  return prompt.replace(IMAGE_TOKEN_PATTERN, (match, num, label) => {
24596
24623
  const n = parseInt(num, 10);
24597
- if (n < 1 || n > imageCount) return match;
24624
+ if (!hasImageAt(n, imageCount)) return match;
24598
24625
  if (label) return `Image ${n} (${label})`;
24599
24626
  if (names && names[n - 1]) return names[n - 1];
24600
24627
  return `Image ${n}`;
@@ -24994,13 +25021,15 @@ function resolveRefIdTokens(prompt, ctx) {
24994
25021
  var REFERENCE_TOKEN_RE = /\{(image|video|audio):(\d+)(?::([a-zA-Z0-9_ -]+))?\}/gi;
24995
25022
  function resolveReferenceTokens(prompt, counts) {
24996
25023
  if (!prompt) return prompt;
24997
- return prompt.replace(REFERENCE_TOKEN_RE, (_match, rawKind, nStr, label) => {
24998
- const kind = rawKind.toLowerCase();
24999
- const n = parseInt(nStr, 10);
25000
- if (n < 1 || n > counts[kind]) return label ?? "";
25001
- if (label) return REF_BINDING[kind](label, n);
25002
- return `@${kind}_${n}`;
25003
- }).replace(/[^\S\r\n]{2,}/g, " ").trim() || void 0;
25024
+ return tidyReferenceTokenGaps(
25025
+ prompt.replace(REFERENCE_TOKEN_RE, (_match, rawKind, nStr, label) => {
25026
+ const kind = rawKind.toLowerCase();
25027
+ const n = parseInt(nStr, 10);
25028
+ if (n < 1 || n > counts[kind]) return unboundReferenceTokenText(label);
25029
+ if (label) return REF_BINDING[kind](label, n);
25030
+ return `@${kind}_${n}`;
25031
+ })
25032
+ ) || void 0;
25004
25033
  }
25005
25034
  function resolveVideoCharacterMentionsHybrid(prompt, tokens, refs, offset) {
25006
25035
  const bySlug = /* @__PURE__ */ new Map();
@@ -25640,17 +25669,17 @@ function composeVideoPromptText(userPrompt, direction, structured, opts) {
25640
25669
  ].filter((c) => c.text.length > 0);
25641
25670
  const structuredFragment = structured ? renderStructuredFields(structured) : "";
25642
25671
  const composeWith = (kept2) => composeSectionedPrompt(userPrompt, hintClauses.slice(0, kept2), structuredFragment);
25643
- const cap = opts?.cap;
25644
- if (cap === void 0) return composeWith(hintClauses.length);
25672
+ const cap2 = opts?.cap;
25673
+ if (cap2 === void 0) return composeWith(hintClauses.length);
25645
25674
  const frame = opts?.frame ?? ((body2) => body2);
25646
25675
  let kept = hintClauses.length;
25647
25676
  let body = composeWith(kept);
25648
25677
  let framedLength = frame(body)?.length ?? 0;
25649
- if (framedLength <= cap) return body;
25678
+ if (framedLength <= cap2) return body;
25650
25679
  const costs = sectionedClauseCosts(userPrompt, hintClauses, structuredFragment);
25651
25680
  const texts = hintClauses.map((c) => c.text);
25652
- while (framedLength > cap && kept > 0) {
25653
- kept = keepableDirectionHints(texts, kept, framedLength - cap, costs);
25681
+ while (framedLength > cap2 && kept > 0) {
25682
+ kept = keepableDirectionHints(texts, kept, framedLength - cap2, costs);
25654
25683
  body = composeWith(kept);
25655
25684
  framedLength = frame(body)?.length ?? 0;
25656
25685
  }
@@ -40831,8 +40860,8 @@ ${buildPickerLegend(spec)}`);
40831
40860
  function buildPickerLegend(spec) {
40832
40861
  const lines = [];
40833
40862
  for (const d of spec.dimensions) {
40834
- const cap = d.limit > 1 ? `up to ${d.limit}` : "one";
40835
- lines.push(`## ${d.label} (key: "${d.dimension}", choose ${cap})`);
40863
+ const cap2 = d.limit > 1 ? `up to ${d.limit}` : "one";
40864
+ lines.push(`## ${d.label} (key: "${d.dimension}", choose ${cap2})`);
40836
40865
  for (const e of d.legend) {
40837
40866
  lines.push(`- ${e.id}: ${e.label}${e.description ? ` \u2014 ${e.description}` : ""}`);
40838
40867
  }
@@ -41152,7 +41181,7 @@ var KLING_AUDIO_DOCTRINE = {
41152
41181
  };
41153
41182
  var MINIMAX_H3_DOCTRINE = {
41154
41183
  providers: ["minimax-h3"],
41155
- heading: "MiniMax Hailuo 3 (minimax-h3)",
41184
+ heading: "MiniMax H3 (minimax-h3)",
41156
41185
  tips: [
41157
41186
  "Natural-language prompts up to 7000 chars. Front-load what matters: subject \u2192 action \u2192 scene/environment \u2192 lighting \u2192 camera move \u2192 style. One camera movement per shot.",
41158
41187
  "Output 2K (default) or 768P (cheaper tier). Aspect: pure text-to-video needs a concrete ratio (21:9/16:9/4:3/1:1/3:4/9:16); reference runs default to adaptive (match the input).",
@@ -41437,7 +41466,7 @@ var IMAGE_REFERENCE_PROMPT_DOCTRINE = {
41437
41466
 
41438
41467
  - \`{image:N:label}\` \u2192 expands server-side to \`Image N (label)\`, aligned with the numbered reference list sent to the provider.
41439
41468
  - \`{image:N}\` \u2192 \`Image N\` (no role named).
41440
- - A token whose N has no wired reference is left as literal text in the final prompt \u2014 visible on purpose, so fix the numbering instead of ignoring it.
41469
+ - A token whose N has no wired reference falls back to its label (\`{image:3:dog}\` \u2192 \`dog\`); a bare \`{image:N}\` is dropped. The prompt still runs but binds nothing at N, so check the numbering against what is wired.
41441
41470
 
41442
41471
  **How to compose**
41443
41472
  - The prompt should be little more than tokens plus glue words: \`{image:1:person} with {image:2:face}\`. The label tells the model what to TAKE from that image \u2014 \`person\`, \`face\`, \`background\`, \`settings\`, or a concrete garment/prop name (\`jacket\`).
@@ -41543,11 +41572,11 @@ function buildScene3DUnreferencedFiguresWarning(check2) {
41543
41572
  const figureWord = figures === 1 ? "figure" : "figures";
41544
41573
  const refWord = refs === 1 ? "character reference is" : "character references are";
41545
41574
  let message = `The layout reference shows ${figures} ${figureWord} but ${refs} ${refWord} attached. A figure without its own character reference takes the clay look of the layout reference. Attach one character reference per figure (${missing} more)`;
41546
- const cap = check2.imageReferenceCap;
41547
- if (typeof cap === "number" && Number.isFinite(cap) && cap > 0) {
41575
+ const cap2 = check2.imageReferenceCap;
41576
+ if (typeof cap2 === "number" && Number.isFinite(cap2) && cap2 > 0) {
41548
41577
  const seats = Math.max(0, Math.floor(check2.layoutReferenceImageSeats ?? 0));
41549
- const spare = cap - seats - figures;
41550
- message += spare >= SCENE3D_FREE_PLATE_SLOTS ? `; this model takes ${cap} image references, which leaves ${spare} for a location or style plate.` : `; this model takes ${cap} image references, so one per figure plus ${SCENE3D_FREE_PLATE_SLOTS} free slots for a location or style plate does not fit \u2014 reference the figures that matter most first.`;
41578
+ const spare = cap2 - seats - figures;
41579
+ message += spare >= SCENE3D_FREE_PLATE_SLOTS ? `; this model takes ${cap2} image references, which leaves ${spare} for a location or style plate.` : `; this model takes ${cap2} image references, so one per figure plus ${SCENE3D_FREE_PLATE_SLOTS} free slots for a location or style plate does not fit \u2014 reference the figures that matter most first.`;
41551
41580
  } else {
41552
41581
  message += ".";
41553
41582
  }
@@ -41664,6 +41693,7 @@ var PROVIDER_CAPABILITIES = {
41664
41693
  "seedream": "Artistic, painterly styles, creative interpretation",
41665
41694
  "seedream-5-lite": "Lighter Seedream, faster artistic generation",
41666
41695
  "seedream-5-pro": "Flagship Seedream \u2014 strongest instruction following, 2K via high quality",
41696
+ "seedream-5-flash": "Fast, low-cost Seedream 5 \u2014 quick drafts and iteration at 1K or 2K",
41667
41697
  "z-image": "Experimental, novel generation approaches",
41668
41698
  "wan-2.7": "Wan 2.7 T2I \u2014 1K/2K/4K, up to 9 ref images",
41669
41699
  "wan-2.7-pro": "Wan 2.7 Pro T2I \u2014 higher quality, 1K/2K/4K",
@@ -41688,6 +41718,7 @@ var PROVIDER_CAPABILITIES = {
41688
41718
  "seedream-edit": "Artistic style editing",
41689
41719
  "seedream-5-lite-i2i": "Light artistic transformation",
41690
41720
  "seedream-5-pro-i2i": "Pro-grade instruction-based edits, multi-reference",
41721
+ "seedream-5-flash-i2i": "Fast, low-cost Seedream edits \u2014 up to 10 input images",
41691
41722
  "flux-kontext": "Character-consistent edits with reference awareness",
41692
41723
  "flux-kontext-max": "Premium character-consistent editing",
41693
41724
  "kontext-multi": "Multi-image Kontext via Replicate \u2014 up to 4 refs, no safety filter",
@@ -41712,6 +41743,7 @@ var PROVIDER_CAPABILITIES = {
41712
41743
  "seedream-edit": "Artistic style editing",
41713
41744
  "seedream-5-lite-i2i": "Light artistic transformation",
41714
41745
  "seedream-5-pro-i2i": "Pro-grade instruction-based edits, multi-reference",
41746
+ "seedream-5-flash-i2i": "Fast, low-cost Seedream edits \u2014 up to 10 input images",
41715
41747
  "flux-kontext": "Character-consistent edits with reference awareness",
41716
41748
  "flux-kontext-max": "Premium character-consistent editing",
41717
41749
  "kontext-multi": "Multi-image Kontext via Replicate \u2014 up to 4 refs, no safety filter",
@@ -41735,7 +41767,7 @@ var PROVIDER_CAPABILITIES = {
41735
41767
  "seedance-2-fast": "Seedance 2.0 Fast \u2014 same multimodal + audio capabilities, cheaper and quicker",
41736
41768
  "seedance-2-mini": "Seedance 2.0 Mini \u2014 same multimodal + audio capabilities, budget tier, 480p/720p, 4-15s",
41737
41769
  "seedance-2-5": "Seedance 2.5 \u2014 up to 30s in ONE shot (no stitching), wider multimodal refs (30 images / 10 videos / 10 audio), native audio, 480p/720p/1080p",
41738
- "minimax-h3": "MiniMax Hailuo 3 \u2014 premium multimodal refs (9 images / 3 videos / 3 audio), always-on audio, 2K or 768P, 4-15s per-second pricing",
41770
+ "minimax-h3": "MiniMax H3 \u2014 premium multimodal refs (9 images / 3 videos / 3 audio), always-on audio, 2K or 768P, 4-15s per-second pricing",
41739
41771
  "wan": "Versatile, good for animations and transformations",
41740
41772
  "wan-turbo": "Faster Wan generation",
41741
41773
  "hailuo-standard": "Standard quality, cost-effective",
@@ -41766,7 +41798,7 @@ var PROVIDER_CAPABILITIES = {
41766
41798
  "seedance-2-fast": "Seedance 2.0 Fast \u2014 same capabilities, cheaper and quicker",
41767
41799
  "seedance-2-mini": "Seedance 2.0 Mini \u2014 same capabilities, budget tier, 480p/720p",
41768
41800
  "seedance-2-5": "Seedance 2.5 \u2014 start/end frame + wide multimodal refs, native audio, up to 30s, 480p/720p/1080p",
41769
- "minimax-h3": "MiniMax Hailuo 3 \u2014 first/last frame + multimodal refs, always-on audio, 2K or 768P, 4-15s",
41801
+ "minimax-h3": "MiniMax H3 \u2014 first/last frame + multimodal refs, always-on audio, 2K or 768P, 4-15s",
41770
41802
  "hailuo-2.3-pro": "Premium Hailuo animation",
41771
41803
  "hailuo-2.3": "Standard Hailuo animation",
41772
41804
  "hailuo-standard": "Cost-effective animation",
@@ -42053,6 +42085,19 @@ var PROMPT_AFFIX_NODE_TYPES = new Set(
42053
42085
  Object.entries(NODE_PROMPT_FIELDS).filter(([, s]) => s.affixes !== false).map(([t]) => t)
42054
42086
  );
42055
42087
 
42088
+ // src/realism-wording.ts
42089
+ var NEUTRAL_PERSON = { subject: "the person", possessive: "their" };
42090
+ var cap = (s) => s.length === 0 ? s : `${s[0].toUpperCase()}${s.slice(1)}`;
42091
+ var REALISM_SKIN = "Skin shows its real structure: visible pores that vary in size across the nose and cheeks, fine vellus hair catching the light, faint uneven pigmentation, a little redness around the nostrils, natural oil on the forehead.";
42092
+ var REALISM_FINISH = "The plain look of an everyday small-sensor snapshot: colour left as it was recorded, deep focus from the nearest shoulder to the background, a fine grain in the darker areas, bright areas that fade rather than clip.";
42093
+ var REALISM_PASS_INSTRUCTION = "Make this photo look like an unretouched everyday snapshot: skin that shows its pores, its fine hairs and the small changes in tone real skin has, colour left as it was recorded, everything sharp from the shoulders to the background, a little grain in the shadows. Take out anything that makes it look rendered \u2014 smoothed, waxy or airbrushed skin, a glow, over-sharpened edges \u2014 and add no text or icons. Otherwise it stays the same person in the same frame: the face and its proportions, hair, clothing, pose and background as they are.";
42094
+ function realismViewpoint(p) {
42095
+ return `${cap(p.subject)} is looking straight at the viewer from eye level, mid-sentence: ${p.possessive} face and shoulders close up, the framing loose and a little crooked, both arms relaxed and down out of the frame. The whole image is the photograph itself, edge to edge, with no text or icons anywhere.`;
42096
+ }
42097
+ function realismEmptyHands(p) {
42098
+ return `${cap(p.possessive)} hands are empty; ${p.subject} is holding nothing.`;
42099
+ }
42100
+
42056
42101
  // src/factory-presets/shared-image.ts
42057
42102
  var STYLIZED_SUBJECT = [
42058
42103
  {
@@ -42060,7 +42105,6 @@ var STYLIZED_SUBJECT = [
42060
42105
  name: "Cartoon Person, Real World",
42061
42106
  description: "Subject \u2192 3D cartoon, rest stays photoreal.",
42062
42107
  data: {
42063
- provider: "nano-banana-pro",
42064
42108
  promptPrefix: "Restyle ONLY the person in the reference image into a polished 3D animated character \u2014 Pixar/Disney sensibility: soft subsurface skin shading, expressive oversized eyes, smoothly stylized hair, clean rounded forms. Preserve their identity, exact pose, expression, and framing. Everything else stays untouched and fully photorealistic: keep the original background, props, clothing fabric and texture, and the scene's real lighting, shadows, and color grade. Composite the stylized figure into the real plate so it sits naturally \u2014 matched light direction, contact shadows, and depth.",
42065
42109
  negativePrompt: "changing the background, altering the unstylized parts, restyling clothing fabric or props, relighting the scene, distorting the subject, changing identity or pose, flat 2D look, extra limbs, deformed hands, warped face"
42066
42110
  }
@@ -42070,7 +42114,6 @@ var STYLIZED_SUBJECT = [
42070
42114
  name: "Caricature, Real Photo",
42071
42115
  description: "Exaggerated cartoon head on a real scene.",
42072
42116
  data: {
42073
- provider: "nano-banana-pro",
42074
42117
  promptPrefix: "Turn ONLY the person into a playful hand-illustrated caricature: enlarge the head, exaggerate their most recognizable features, and amplify expression with bold, confident linework and clean cel-style shading \u2014 while keeping them clearly identifiable. Leave everything else exactly as shot and photorealistic: the body proportions below the neck, the clothing, the background, props, and the scene's real lighting and shadows remain unchanged. Blend the caricature head onto the real photo seamlessly with matched lighting and a believable neckline.",
42075
42118
  negativePrompt: "changing the background, altering the unstylized parts, restyling the body or clothing, relighting the scene, distorting the subject beyond intent, losing likeness, photorealistic head, harsh seam at the neck, deformed features"
42076
42119
  }
@@ -42080,7 +42123,6 @@ var STYLIZED_SUBJECT = [
42080
42123
  name: "Anime Person, Real Background",
42081
42124
  description: "Subject \u2192 2D anime, real environment.",
42082
42125
  data: {
42083
- provider: "nano-banana-pro",
42084
42126
  promptPrefix: "Restyle ONLY the person as a crisp 2D anime character \u2014 clean ink outlines, flat cel shading with sharp shadow shapes, glossy stylized hair, and expressive anime eyes \u2014 while preserving their identity, pose, expression, and framing. Keep the real-world background, environment, props, and the original photographic lighting, shadows, and color completely untouched and photorealistic. Integrate the 2D figure into the live-action plate so the light direction and contact shadows read naturally.",
42085
42127
  negativePrompt: "changing the background, altering the unstylized parts, restyling the environment or props, relighting the scene, distorting the subject, 3D render look, photorealistic skin on the subject, extra fingers, warped anatomy, broken outlines"
42086
42128
  }
@@ -42090,7 +42132,6 @@ var STYLIZED_SUBJECT = [
42090
42132
  name: "Real Person, Cartoon World",
42091
42133
  description: "Inverse \u2014 real subject, stylized world.",
42092
42134
  data: {
42093
- provider: "nano-banana-pro",
42094
42135
  promptPrefix: "Inverse stylization: keep the PERSON completely photorealistic and unchanged \u2014 real skin, hair, clothing, identity, pose, and framing all preserved exactly. Restyle ONLY the surrounding world into a vibrant, hand-crafted cartoon environment: simplified painterly shapes, bold saturated colors, soft graphic shading, and whimsical stylized props and scenery. Light the real person to match the cartoon world's color and direction so they sit convincingly inside it, with believable contact shadows.",
42095
42136
  negativePrompt: "stylizing or cartoonifying the person, altering the subject's skin, face, hair or clothing, distorting the subject, changing the subject's pose, photorealistic background, flat lifeless scene, harsh cut-out edges around the person"
42096
42137
  }
@@ -42100,19 +42141,21 @@ var STYLIZED_SUBJECT = [
42100
42141
  name: "Claymation Figure, Real Set",
42101
42142
  description: "Subject \u2192 clay figure, real surroundings.",
42102
42143
  data: {
42103
- provider: "nano-banana-pro",
42104
42144
  promptPrefix: "Restyle ONLY the person into a tactile stop-motion claymation figure \u2014 molded plasticine surface with visible fingerprints, tool marks, subtle seams, and a soft matte sheen, in the handmade spirit of Aardman puppets \u2014 while keeping their identity, pose, expression, and framing. Everything else stays exactly as shot and photorealistic: the real background, set, props, and the scene's natural lighting and shadows are unchanged. Seat the clay figure into the real plate with matched light direction and grounded contact shadows.",
42105
42145
  negativePrompt: "changing the background or set, altering the unstylized parts, restyling props, relighting the scene, distorting the subject, smooth plastic toy look, glossy CGI surface, melted or deformed figure, missing fingerprints, extra limbs"
42106
42146
  }
42107
42147
  }
42108
42148
  ];
42149
+ function editProviderFor(nodeType) {
42150
+ return nodeType === "modify-image" ? "gpt-image-2-5-flare-i2i" : "gpt-image-2-5-flare";
42151
+ }
42109
42152
  function stylizedSubjectFor(nodeType) {
42110
42153
  return STYLIZED_SUBJECT.map((p) => ({
42111
42154
  id: `${nodeType}/${p.slug}`,
42112
42155
  name: p.name,
42113
42156
  description: p.description,
42114
42157
  group: "Stylized Subject",
42115
- data: p.data
42158
+ data: { provider: editProviderFor(nodeType), ...p.data }
42116
42159
  }));
42117
42160
  }
42118
42161
  var IMAGE_EDITS = [
@@ -42121,7 +42164,6 @@ var IMAGE_EDITS = [
42121
42164
  name: "Remove Background",
42122
42165
  description: "Cut out the subject on white.",
42123
42166
  data: {
42124
- provider: "nano-banana-pro",
42125
42167
  promptPrefix: "Cleanly cut the main subject out of the reference image and place it on a pure, solid white background. Trace a crisp, accurate edge \u2014 preserve fine detail like hair strands, fur, and translucent or wispy edges \u2014 with no leftover background pixels and no color fringing. Keep the subject itself completely unchanged: same pose, lighting, color, and full silhouette, nothing cropped.",
42126
42168
  negativePrompt: "fringing, color halo, cut-off subject, leftover background, jagged or rough edges, missing hair detail, semi-transparent matte, drop shadow, gray or off-white background, altering the subject"
42127
42169
  }
@@ -42131,7 +42173,6 @@ var IMAGE_EDITS = [
42131
42173
  name: "Replace Background",
42132
42174
  description: "Swap in a new scene.",
42133
42175
  data: {
42134
- provider: "nano-banana-pro",
42135
42176
  prompt: "Replace the background behind the subject with {scene || a sunlit Mediterranean terrace}. Keep the subject perfectly unchanged \u2014 identity, pose, edges, and proportions intact \u2014 and composite it into the new scene so it looks truly photographed there: relight the subject's rim and ambient tones to match the new environment, cast believable contact shadows, and match perspective, depth of field, and color grade.",
42136
42177
  negativePrompt: "altering the subject, changing the subject's pose or proportions, fringing, halo, floating subject, missing or wrong-direction shadows, mismatched lighting, flat composite, harsh cut-out edges, perspective mismatch"
42137
42178
  }
@@ -42141,7 +42182,6 @@ var IMAGE_EDITS = [
42141
42182
  name: "Colorize B&W Photo",
42142
42183
  description: "Natural color from grayscale.",
42143
42184
  data: {
42144
- provider: "nano-banana-pro",
42145
42185
  promptPrefix: "Colorize this black-and-white photograph with natural, historically plausible color. Give skin realistic, even tones, and assign believable hues to clothing, foliage, sky, and materials. Preserve every original detail, grain, contrast, and the exact composition \u2014 add color only, never invent or remove content.",
42146
42186
  negativePrompt: "oversaturated, anachronistic colors, neon or cartoon tones, color bleeding outside edges, blotchy or uneven skin, lost detail, altered composition, added or hallucinated objects, washed-out contrast"
42147
42187
  }
@@ -42151,7 +42191,6 @@ var IMAGE_EDITS = [
42151
42191
  name: "Restore Old Photo",
42152
42192
  description: "Repair scratches, denoise, sharpen.",
42153
42193
  data: {
42154
- provider: "nano-banana-pro",
42155
42194
  promptPrefix: "Restore this old, damaged photograph: remove scratches, dust, creases, stains, and noise, repair torn or missing areas by reconstructing what is plainly there, and gently recover sharpness and tonal detail. Keep the result authentic and true to the original \u2014 preserve identity, era, natural film grain, and composition. Repair only; do not beautify, restyle, or invent new features.",
42156
42195
  negativePrompt: "over-smoothed, plastic skin, waxy or airbrushed look, hallucinated details, invented faces or objects, changing identity or age, removing authentic grain, modern restyling, oversharpening halos, altered composition"
42157
42196
  }
@@ -42161,7 +42200,6 @@ var IMAGE_EDITS = [
42161
42200
  name: "Relight Scene",
42162
42201
  description: "New lighting, same subject.",
42163
42202
  data: {
42164
- provider: "nano-banana-pro",
42165
42203
  prompt: "Relight the image with {lighting style || soft golden-hour key light from the left}. Re-derive highlights, shadows, ambient fill, and color temperature consistently across the whole frame for a believable, physically plausible result. Keep the subject, pose, expression, materials, and composition completely unchanged \u2014 only the lighting changes.",
42166
42204
  negativePrompt: "changing the subject, pose, expression, or composition, altering materials or clothing, flat or inconsistent lighting, blown-out highlights, crushed shadows, color casts on skin, double or contradictory light directions, repositioning anything"
42167
42205
  }
@@ -42171,7 +42209,6 @@ var IMAGE_EDITS = [
42171
42209
  name: "Restyle (whole image)",
42172
42210
  description: "Apply an art style to everything.",
42173
42211
  data: {
42174
- provider: "nano-banana-pro",
42175
42212
  prompt: "Restyle the entire image in a {art style || soft watercolor illustration} look, applying the style consistently to the subject, background, and every element. Keep the composition, subject placement, and the subject clearly recognizable \u2014 reinterpret texture, color, and rendering, not the underlying content or layout.",
42176
42213
  negativePrompt: "changing the composition or layout, moving or removing the subject, losing recognizability, applying the style to only part of the image, photorealistic patches, added or hallucinated objects, distorted anatomy, inconsistent style across the frame"
42177
42214
  }
@@ -42181,7 +42218,6 @@ var IMAGE_EDITS = [
42181
42218
  name: "Doodle Overlay",
42182
42219
  description: "Hand-drawn marker doodles on top \u2014 photo stays untouched.",
42183
42220
  data: {
42184
- provider: "nano-banana-pro",
42185
42221
  promptPrefix: "Layer playful hand-drawn doodles ON TOP of the reference photo while keeping every pixel of the underlying photograph completely unchanged \u2014 same people, same colors, same lighting, same crop. Doodle style: wobbly hand-drawn felt-tip marker lines in white with a few yellow accents, like quick sketches on a printed photo. Add: loose outline traces hugging one or two key shapes, small sparkles and stars, a hand-drawn thought cloud or speech bubble with a short witty handwritten phrase that reacts to what is actually happening in the photo, and simple arrows or underlines pointing at fun details. Outlines only \u2014 never fill shapes with color. Never cover faces or the main focal point; place doodles in empty areas like sky, walls or margins. Keep it balanced: four to seven doodle elements total, charming and confident, not cluttered. The photo is the hero \u2014 the doodles are the seasoning.",
42186
42222
  negativePrompt: "altered photo, restyled or recolored scene, redrawn subject, covered faces, filled color shapes, digital sticker or emoji look, vector clipart, cluttered doodles, garbled or misspelled handwriting, watermark, blurry"
42187
42223
  }
@@ -42191,10 +42227,50 @@ var IMAGE_EDITS = [
42191
42227
  name: "Doodle Overlay \xB7 Expressive",
42192
42228
  description: "Looser free-form doodles \u2014 the model improvises.",
42193
42229
  data: {
42194
- provider: "nano-banana-pro",
42195
42230
  promptPrefix: "Decorate the reference photo with expressive hand-drawn doodles layered on top, keeping the underlying photograph itself completely unchanged. Free, confident hand-drawn marker linework \u2014 wobbly outlines, sparkles, squiggles, little flames or hearts where they fit the mood, and a short handwritten phrase that responds cleverly to the content of the photo (never a generic clich\xE9). Mix of white and one or two bright accent colors. Outline style only, no filled shapes. Compose the doodles around the subject \u2014 never on top of faces or the focal point \u2014 using empty areas and edges. Loose, playful, zine-like energy: it should feel like a bored genius doodled on a printed photo. Keep the original image pixels intact beneath the doodle layer.",
42196
42231
  negativePrompt: "altered photo, restyled or recolored scene, covered faces, filled color blocks, sticker or clipart look, clich\xE9 phrases, garbled or misspelled handwriting, cluttered composition, watermark, blurry"
42197
42232
  }
42233
+ },
42234
+ {
42235
+ slug: "add-skin-realism",
42236
+ name: "Add Skin Realism",
42237
+ description: "Brings back visible skin texture \u2014 same person, same photo.",
42238
+ data: { provider: "nano-banana-2-1", aspectRatio: "auto", resolution: "2K", promptPrefix: REALISM_PASS_INSTRUCTION }
42239
+ },
42240
+ {
42241
+ slug: "natural-photo-finish",
42242
+ name: "Natural Photo Finish",
42243
+ description: "Takes out a rendered-looking finish, keeps the photo.",
42244
+ data: {
42245
+ provider: "nano-banana-2-1",
42246
+ aspectRatio: "auto",
42247
+ resolution: "2K",
42248
+ promptPrefix: `Keep this photo as it is and take out only what makes it look rendered: smoothed, waxy or airbrushed skin, a glow, over-sharpened edges, hair too perfect to be real. ${REALISM_FINISH} Otherwise the same people, framing, pose and background.`
42249
+ }
42250
+ },
42251
+ {
42252
+ slug: "phone-camera-look",
42253
+ name: "Phone Camera Look",
42254
+ description: "Re-finishes a photo as an everyday snapshot.",
42255
+ data: {
42256
+ provider: "nano-banana-2-1",
42257
+ aspectRatio: "auto",
42258
+ resolution: "2K",
42259
+ promptPrefix: `Re-finish this photo, changing nothing in it: ${REALISM_FINISH} Same people, framing, pose and background.`
42260
+ }
42261
+ },
42262
+ {
42263
+ slug: "undo-beauty-filter",
42264
+ name: "Undo Beauty Filter",
42265
+ description: "Reverses smoothing and reshaping on a real photo.",
42266
+ data: {
42267
+ provider: "seedream-5-pro",
42268
+ // "auto" keeps the photo's shape: this model lists no native "auto", so on either node the
42269
+ // run takes its listed ratio nearest the connected photo.
42270
+ aspectRatio: "auto",
42271
+ quality: "high",
42272
+ promptPrefix: "Undo the beauty filter on this photo: bring back the person's real skin texture, the natural shape of the face, jaw, nose and eyes, and the real colour of skin and lips. Change nothing else: the same person, expression, hair, clothing, framing and background."
42273
+ }
42198
42274
  }
42199
42275
  ];
42200
42276
  function editsFor(nodeType) {
@@ -42203,11 +42279,14 @@ function editsFor(nodeType) {
42203
42279
  name: p.name,
42204
42280
  description: p.description,
42205
42281
  group: "Edits",
42206
- data: p.data
42282
+ data: { provider: editProviderFor(nodeType), ...p.data }
42207
42283
  }));
42208
42284
  }
42209
42285
 
42210
42286
  // src/factory-presets/generate-image.ts
42287
+ var sentences = (...parts) => parts.join(" ");
42288
+ var REALISM_MODEL = { provider: "gpt-image-2", resolution: "2K" };
42289
+ var SKIN_STUDY_MODEL = { provider: "seedream-5-pro", quality: "high" };
42211
42290
  var GENERATE_IMAGE_PRESETS = [
42212
42291
  // ── Reference Sheet ──────────────────────────────────────────────────────
42213
42292
  {
@@ -42216,7 +42295,7 @@ var GENERATE_IMAGE_PRESETS = [
42216
42295
  description: "Connect a sharp, well-lit photo \u2192 dense character sheet; reuse it as a reference for consistent shots.",
42217
42296
  group: "Reference Sheet",
42218
42297
  data: {
42219
- provider: "nano-banana-pro",
42298
+ provider: "gpt-image-2",
42220
42299
  aspectRatio: "16:9",
42221
42300
  resolution: "2K",
42222
42301
  promptPrefix: `Create a single high-resolution, densely packed character reference sheet titled "CHARACTER BOARD" using the attached photo of the person as the single source of truth for face, hair, beard, eyes, skin tone and body proportions. The same person must appear in every panel \u2014 same age, same features. Outfit identical to the attached photo across all panels. All on-image labels in ENGLISH. Editorial reference-board layout with a dark near-black background, thin yellow neon accent light, faint film-grain overlay, and production-grade character-design UI. The composition should feel organized but not rigidly locked: allow the main portrait, metadata, and supporting panels to shift position naturally within the board. The panel arrangement can vary from generation to generation while remaining readable, balanced, and premium. Design the board so it works cleanly in different aspect ratios without depending on a fixed left-column structure. Include: A large hero portrait or 3/4-length character image, accompanied by a detailed metadata block: NAME \xB7 AGE \xB7 HEIGHT \xB7 BUILD \xB7 HAIR \xB7 EYES \xB7 FEATURES \xB7 OUTFIT (describe the exact clothing from the attached photo) \xB7 CHARACTER \xB7 MOOD. Also include six content groupings \u2014 render ALL six panel headings exactly as written, never merging or omitting a panel: PANEL 01 \u2014 VIEWS (5 full-body shots, neutral pose, identical outfit and lighting, neutral tan backdrop): FRONT \xB7 3/4 LEFT \xB7 SIDE LEFT \xB7 BACK \xB7 3/4 RIGHT. PANEL 02 \u2014 EXPRESSIONS (5 tight headshots, same lighting): CALM \xB7 LAUGHING \xB7 INTENSE \xB7 CONTEMPLATIVE \xB7 CONFIDENT. PANEL 03 \u2014 DETAILS (3 macros): face/eyes close-up \xB7 hand close-up (showing ring, watch or cuff) \xB7 distinctive outfit detail. PANEL 04 \u2014 OUTFIT FLAT-LAYS (5 isolated product shots on dark background): outerwear \xB7 top \xB7 bottom \xB7 footwear \xB7 main accessory. PANEL 05 \u2014 LIGHTING / MOOD (4 same-pose portraits under different lighting): SOFT WINDOW LIGHT \xB7 GOLDEN HOUR \xB7 COOL BLUE NIGHT \xB7 DRAMATIC RIM-LIGHT. PANEL 06 \u2014 COLOR PALETTE: 6 swatches with HEX codes derived from the outfit and skin tones. Bottom caption: "Use this character board as a visual reference for consistent depiction of the character across all generations." Bottom-right tags: STYLE \xB7 Modern \xB7 Realistic \xB7 Cinematic.`,
@@ -42230,7 +42309,7 @@ var GENERATE_IMAGE_PRESETS = [
42230
42309
  description: "Connect a sharp photo \u2192 animation-ready pose & expression sheet; reuse it as a reference for consistent action.",
42231
42310
  group: "Reference Sheet",
42232
42311
  data: {
42233
- provider: "nano-banana-pro",
42312
+ provider: "gpt-image-2",
42234
42313
  aspectRatio: "16:9",
42235
42314
  resolution: "2K",
42236
42315
  promptPrefix: `Create a single high-resolution, densely packed pose reference sheet titled "POSE BOARD" using the attached photo of the person as the single source of truth for face, hair, eyes, skin tone, body proportions and outfit. The same person must appear in every panel \u2014 same age, same features, outfit identical to the attached photo across all panels. All on-image labels in ENGLISH. Editorial reference-board layout with a dark near-black background, thin yellow neon accent light, faint film-grain overlay, and production-grade animation-planning UI. The composition should feel organized but not rigidly locked: allow the hero figure, metadata, and supporting panels to shift position naturally within the board while remaining readable, balanced, and premium. Design the board to adapt cleanly to different aspect ratios without depending on a fixed left-column layout. Include a large full-body hero shot in a relaxed standing pose with a metadata block: NAME \xB7 AGE \xB7 BUILD \xB7 HEIGHT \xB7 OUTFIT \xB7 POSE LANGUAGE \xB7 CENTER OF GRAVITY \xB7 DOMINANT HAND \xB7 PURPOSE. Also include five content groupings \u2014 render ALL five panel headings exactly as written, never merging or omitting a panel: PANEL 01 \u2014 BASIC POSES (5 full-body shots, identical outfit and lighting, neutral tan backdrop): STANDING \xB7 SITTING \xB7 WALKING \xB7 RUNNING \xB7 JUMPING. PANEL 02 \u2014 ACTION POSES (5 dynamic full-body shots with clear silhouettes): FIGHT STANCE \xB7 THROW \xB7 DODGE \xB7 CLIMB \xB7 LAND. PANEL 03 \u2014 EXPRESSIONS (5 tight headshots, same lighting): NEUTRAL \xB7 LAUGHING \xB7 ANGRY \xB7 SAD \xB7 SURPRISED. PANEL 04 \u2014 ANGLE COVERAGE (4 chest-up portraits): FRONT \xB7 3/4 \xB7 SIDE \xB7 BACK. PANEL 05 \u2014 COLOR PALETTE: 6 swatches with HEX codes derived from the outfit and skin tones. Bottom caption: "Use this pose board as a visual reference for consistent posing of the character across all generations." Bottom-right tags: STYLE \xB7 Modern \xB7 Realistic \xB7 Cinematic.`,
@@ -42244,7 +42323,7 @@ var GENERATE_IMAGE_PRESETS = [
42244
42323
  description: "Connect a photo \u2192 dense location sheet; reuse it as a reference for consistent scenes.",
42245
42324
  group: "Reference Sheet",
42246
42325
  data: {
42247
- provider: "nano-banana-pro",
42326
+ provider: "gpt-image-2",
42248
42327
  aspectRatio: "16:9",
42249
42328
  resolution: "2K",
42250
42329
  promptPrefix: `Create a single high-resolution, densely packed location reference sheet titled "LOCATION BOARD" using the attached photo of the location as the single source of truth for its architecture, atmosphere, lighting, materials and color palette. The space must be identical across every panel \u2014 same place, same materials, same era. All on-image labels in ENGLISH. Editorial location-reference board layout with a dark near-black background, thin yellow neon accent light on the far left, faint film-grain overlay, subtle cinematic interface elements, and production-grade location-scout UI. The composition should feel structured but not rigidly fixed: allow the hero location view, metadata, environmental studies, and supporting panels to shift position naturally within the board. The arrangement may vary from generation to generation while remaining readable, balanced, and premium. Design the board so it adapts cleanly to different aspect ratios without depending on a fixed left-column layout. Include a prominent hero shot of the location, ideally a wide establishing or defining view, accompanied by a detailed metadata block: NAME \xB7 TYPE (street / interior / exterior / forest) \xB7 ERA \xB7 SCALE (intimate / vast) ARCHITECTURE: (key features) MATERIALS: (stone, brick, wood, glass, etc.) ATMOSPHERE: (busy / quiet / eerie / romantic) DEFAULT TIME \xB7 DEFAULT WEATHER \xB7 PURPOSE (e.g. chase sequence, dialogue scene). Also include six content groupings \u2014 render ALL six panel headings exactly as written, never merging or omitting a panel: PANEL 01 \u2014 VIEWS (5 same-location shots, identical lighting): WIDE \xB7 MID \xB7 TIGHT \xB7 ALT ANGLE \xB7 OVERHEAD. PANEL 02 \u2014 TIME OF DAY (4 same-angle shots): DAWN \xB7 NOON \xB7 DUSK \xB7 NIGHT. PANEL 03 \u2014 DETAILS (2 macros): material/texture close-up \xB7 distinctive architectural detail. PANEL 04 \u2014 SET DRESSING / PROPS (5 isolated prop or signage studies on dark background): 5 key props or signage elements from the location. PANEL 05 \u2014 WEATHER / MOOD (4 same-angle shots): CLEAR SUNNY \xB7 OVERCAST \xB7 RAIN-SOAKED \xB7 MISTY FOG. PANEL 06 \u2014 COLOR PALETTE: 6 swatches with HEX codes from the location's dominant tones. Bottom caption: "Use this location board as a visual reference for consistent depiction of the environment across all generations." Bottom-right tags: STYLE \xB7 Modern \xB7 Realistic \xB7 Cinematic.`,
@@ -42258,7 +42337,7 @@ var GENERATE_IMAGE_PRESETS = [
42258
42337
  description: "Connect a photo \u2192 dense product sheet; reuse it as a reference for consistent shots.",
42259
42338
  group: "Reference Sheet",
42260
42339
  data: {
42261
- provider: "nano-banana-pro",
42340
+ provider: "gpt-image-2",
42262
42341
  aspectRatio: "16:9",
42263
42342
  resolution: "2K",
42264
42343
  promptPrefix: `Create a single high-resolution, densely packed product reference sheet titled "PRODUCT BOARD" using the attached photo of the product as the single source of truth for its shape, materials, colorway, proportions, branding and finish. The same product must appear in every panel \u2014 identical model, identical colorway and markings. All on-image labels in ENGLISH. Editorial product-reference layout with a dark near-black background, thin yellow neon accent light, faint film-grain overlay, and production-grade industrial-design UI. The composition should feel organized but not rigidly locked: allow the hero shot, metadata, and supporting panels to shift position naturally within the board while remaining readable, balanced, and premium. Design the board to adapt cleanly to different aspect ratios without depending on a fixed left-column layout. Include a large hero product shot with a metadata block: NAME \xB7 CATEGORY \xB7 BRAND \xB7 DIMENSIONS \xB7 WEIGHT \xB7 MATERIALS \xB7 FINISH \xB7 KEY FEATURES \xB7 COLORWAY. Also include six content groupings \u2014 render ALL six panel headings exactly as written, never merging or omitting a panel: PANEL 01 \u2014 VIEWS (5 studio shots on a seamless background, identical lighting): FRONT \xB7 3/4 \xB7 SIDE \xB7 BACK \xB7 TOP. PANEL 02 \u2014 DETAILS (3 macros): material/texture close-up \xB7 seam/joint or mechanism \xB7 logo/branding detail. PANEL 03 \u2014 COLORWAYS (4 isolated shots of the same product in alternate finishes). PANEL 04 \u2014 SCALE (the product beside a common reference object, with a dimension callout). PANEL 05 \u2014 IN USE / CONTEXT (3 lifestyle shots in a real setting). PANEL 06 \u2014 COLOR PALETTE: 6 swatches with HEX codes from the product's materials and finish. Bottom caption: "Use this product board as a visual reference for consistent depiction of the product across all generations." Bottom-right tags: STYLE \xB7 Modern \xB7 Realistic \xB7 Studio.`,
@@ -42272,7 +42351,7 @@ var GENERATE_IMAGE_PRESETS = [
42272
42351
  description: "Connect a photo \u2192 dense wardrobe sheet; reuse it as a reference for consistent looks.",
42273
42352
  group: "Reference Sheet",
42274
42353
  data: {
42275
- provider: "nano-banana-pro",
42354
+ provider: "gpt-image-2",
42276
42355
  aspectRatio: "16:9",
42277
42356
  resolution: "2K",
42278
42357
  promptPrefix: `Create a single high-resolution, densely packed wardrobe reference sheet titled "OUTFIT BOARD" using the attached photo of the outfit as the single source of truth for its garments, fabrics, colorway, silhouette and styling. The same outfit must appear in every panel \u2014 identical garments, identical colors and trims. All on-image labels in ENGLISH. Editorial fashion-reference layout with a dark near-black background, thin yellow neon accent light, faint film-grain overlay, and production-grade stylist UI. The composition should feel organized but not rigidly locked: allow the hero look, metadata, and supporting panels to shift position naturally while remaining readable, balanced, and premium. Design the board to adapt cleanly to different aspect ratios without depending on a fixed left-column layout. Include a hero full-look shot with a metadata block: LOOK NAME \xB7 STYLE \xB7 SEASON \xB7 FABRICS \xB7 PALETTE \xB7 FIT \xB7 OCCASION. Also include six content groupings \u2014 render ALL six panel headings exactly as written, never merging or omitting a panel: PANEL 01 \u2014 ON-BODY VIEWS (5 full-length shots, identical lighting): FRONT \xB7 3/4 LEFT \xB7 SIDE \xB7 BACK \xB7 3/4 RIGHT. PANEL 02 \u2014 FLAT-LAYS (5 isolated garment shots on a dark surface): top \xB7 bottom \xB7 outerwear \xB7 footwear \xB7 headwear. PANEL 03 \u2014 FABRIC & DETAIL (3 macros): weave/texture close-up \xB7 stitching or hardware \xB7 print or trim detail. PANEL 04 \u2014 ACCESSORIES (4 isolated accessory studies: bag \xB7 jewelry \xB7 belt \xB7 eyewear). PANEL 05 \u2014 COLORWAYS (3 alternate colorways of the same look). PANEL 06 \u2014 COLOR PALETTE: 6 swatches with HEX codes from the garments. Bottom caption: "Use this outfit board as a visual reference for consistent depiction of the wardrobe across all generations." Bottom-right tags: STYLE \xB7 Modern \xB7 Editorial \xB7 Fashion.`,
@@ -42286,7 +42365,7 @@ var GENERATE_IMAGE_PRESETS = [
42286
42365
  description: "Connect a photo \u2192 set-dressing & props study; reuse it as a reference for consistent sets.",
42287
42366
  group: "Reference Sheet",
42288
42367
  data: {
42289
- provider: "nano-banana-pro",
42368
+ provider: "gpt-image-2",
42290
42369
  aspectRatio: "16:9",
42291
42370
  resolution: "2K",
42292
42371
  promptPrefix: `Create a single high-resolution, densely packed set-dressing reference sheet titled "SCENE BOARD" using the attached photo of the scene as the single source of truth for its props, set dressing, materials, signage and mood. The space and its contents must be consistent across every panel \u2014 same props, same materials, same era. All on-image labels in ENGLISH. Editorial set-decoration layout with a dark near-black background, thin yellow neon accent light, faint film-grain overlay, and production-grade art-department UI. The composition should feel organized but not rigidly locked: allow the hero shot, metadata, and supporting panels to shift position naturally while remaining readable, balanced, and premium. Design the board to adapt cleanly to different aspect ratios without depending on a fixed left-column layout. Include a hero establishing shot with a metadata block: SCENE NAME \xB7 TYPE \xB7 ERA \xB7 MOOD \xB7 KEY MATERIALS \xB7 PURPOSE. Also include six content groupings \u2014 render ALL six panel headings exactly as written, never merging or omitting a panel: PANEL 01 \u2014 KEY PROPS (5 isolated prop studies on a dark background). PANEL 02 \u2014 SIGNAGE / GRAPHICS (3 readable signage or printed-graphic elements from the scene). PANEL 03 \u2014 MATERIALS & TEXTURES (3 macros: surface \xB7 fabric/wood/metal \xB7 wear/patina). PANEL 04 \u2014 LAYOUT / BLOCKING (a simple top-down or wide diagram of where key elements sit). PANEL 05 \u2014 LIGHTING STATES (3 same-angle shots: day \xB7 practical-lit night \xB7 dramatic). PANEL 06 \u2014 COLOR PALETTE: 6 swatches with HEX codes from the scene's dominant tones. Bottom caption: "Use this scene board as a visual reference for consistent set dressing across all generations." Bottom-right tags: STYLE \xB7 Modern \xB7 Realistic \xB7 Cinematic.`,
@@ -42300,7 +42379,7 @@ var GENERATE_IMAGE_PRESETS = [
42300
42379
  description: "Connect a sharp photo \u2192 dense creature sheet; reuse it as a reference for consistent shots.",
42301
42380
  group: "Reference Sheet",
42302
42381
  data: {
42303
- provider: "nano-banana-pro",
42382
+ provider: "gpt-image-2",
42304
42383
  aspectRatio: "16:9",
42305
42384
  resolution: "2K",
42306
42385
  promptPrefix: `Create a single high-resolution, densely packed creature reference sheet titled "CREATURE BOARD" using the attached photo of the creature as the single source of truth for its anatomy, silhouette, coloration, textures and features. The same creature must appear in every panel \u2014 identical species, identical markings and proportions. All on-image labels in ENGLISH. Editorial creature-design layout with a dark near-black background, thin yellow neon accent light, faint film-grain overlay, and production-grade concept-design UI. The composition should feel organized but not rigidly locked: allow the hero render, metadata, and supporting panels to shift position naturally while remaining readable, balanced, and premium. Design the board to adapt cleanly to different aspect ratios without depending on a fixed left-column layout. Include a large hero full-body render with a metadata block: NAME \xB7 SPECIES \xB7 SIZE \xB7 BUILD \xB7 COLORATION \xB7 TEXTURES \xB7 TEMPERAMENT \xB7 FEATURES \xB7 MOVEMENT \xB7 VOCALIZATION. Also include six content groupings \u2014 render ALL six panel headings exactly as written, never merging or omitting a panel: PANEL 01 \u2014 VIEWS (5 full-body angles, neutral pose, identical lighting): FRONT \xB7 3/4 \xB7 SIDE \xB7 BACK \xB7 TOP-DOWN. PANEL 02 \u2014 POSES (4 dynamic full-body poses: idle \xB7 moving \xB7 alert \xB7 aggressive). PANEL 03 \u2014 DETAILS (3 macros): head/face close-up \xB7 hide/scale/fur texture \xB7 distinctive feature (claw, horn, fin). PANEL 04 \u2014 EXPRESSIONS (4 head studies showing temperament range). PANEL 05 \u2014 SCALE (the creature beside a human silhouette for size reference). PANEL 06 \u2014 COLOR PALETTE: 6 swatches with HEX codes from the creature's coloration. Bottom caption: "Use this creature board as a visual reference for consistent depiction of the creature across all generations." Bottom-right tags: STYLE \xB7 Modern \xB7 Realistic \xB7 Cinematic.`,
@@ -42314,7 +42393,7 @@ var GENERATE_IMAGE_PRESETS = [
42314
42393
  description: "Connect a photo \u2192 dense vehicle sheet; reuse it as a reference for consistent shots.",
42315
42394
  group: "Reference Sheet",
42316
42395
  data: {
42317
- provider: "nano-banana-pro",
42396
+ provider: "gpt-image-2",
42318
42397
  aspectRatio: "16:9",
42319
42398
  resolution: "2K",
42320
42399
  promptPrefix: `Create a single high-resolution, densely packed vehicle reference sheet titled "VEHICLE BOARD" using the attached photo of the vehicle as the single source of truth for its body shape, proportions, paintwork, trim, wheels and condition. The same vehicle must appear in every panel \u2014 identical model, identical colorway, markings and wear. All on-image labels in ENGLISH. Editorial vehicle-reference layout with a dark near-black background, thin yellow neon accent light, faint film-grain overlay, and production-grade transportation-design UI. The composition should feel organized but not rigidly locked: allow the hero shot, metadata, and supporting panels to shift position naturally while remaining readable, balanced, and premium. Design the board to adapt cleanly to different aspect ratios without depending on a fixed left-column layout. Include a large three-quarter hero shot with a metadata block: NAME \xB7 TYPE \xB7 ERA \xB7 SCALE \xB7 BODY & MATERIALS \xB7 FINISH \xB7 SEATS \xB7 TOP SPEED \xB7 SIGNATURE FEATURE \xB7 ROLE. Also include six content groupings \u2014 render ALL six panel headings exactly as written, never merging or omitting a panel: PANEL 01 \u2014 VIEWS (5 studio shots, identical lighting): FRONT \xB7 3/4 \xB7 SIDE \xB7 BACK \xB7 TOP-DOWN. PANEL 02 \u2014 INTERIOR / CABIN (4 close shots): cockpit through the window \xB7 dashboard detail \xB7 seats or cargo area \xB7 driver POV. PANEL 03 \u2014 DETAIL MACROS (4): headlight or light cluster \xB7 wheel and tire \xB7 badge or panel line \xB7 paint and wear close-up. PANEL 04 \u2014 IN MOTION (4 staged frames): driving straight \xB7 cornering \xB7 parked on an incline \xB7 night with headlights on. PANEL 05 \u2014 LIGHTING / MOOD (4 same-angle hero shots): DESERT MIDDAY \xB7 GOLDEN HOUR \xB7 STORMY OVERCAST \xB7 NIGHT NEON. PANEL 06 \u2014 COLOR PALETTE: 6 swatches with HEX codes from the paintwork and trim. Bottom caption: "Use this vehicle board as a visual reference for consistent depiction of the vehicle across all generations." Bottom-right tags: STYLE \xB7 Modern \xB7 Realistic \xB7 Cinematic.`,
@@ -42328,7 +42407,7 @@ var GENERATE_IMAGE_PRESETS = [
42328
42407
  description: "Connect a photo \u2192 dense dish sheet; reuse it as a reference for consistent food shots.",
42329
42408
  group: "Reference Sheet",
42330
42409
  data: {
42331
- provider: "nano-banana-pro",
42410
+ provider: "gpt-image-2",
42332
42411
  aspectRatio: "16:9",
42333
42412
  resolution: "2K",
42334
42413
  promptPrefix: `Create a single high-resolution, densely packed dish reference sheet titled "FOOD BOARD" using the attached photo of the dish as the single source of truth for its ingredients, plating, colors, textures and garnish. The same dish must appear in every panel \u2014 identical recipe, identical plating, bowl or plate, and props. All on-image labels in ENGLISH. Editorial culinary-reference layout with a dark near-black background, thin yellow neon accent light, faint film-grain overlay, and production-grade food-styling UI. The composition should feel organized but not rigidly locked: allow the hero shot, metadata, and supporting panels to shift position naturally while remaining readable, balanced, and premium. Design the board to adapt cleanly to different aspect ratios without depending on a fixed left-column layout. Include a large appetizing hero shot with a metadata block: DISH NAME \xB7 CUISINE \xB7 CATEGORY \xB7 KEY INGREDIENTS \xB7 TEXTURES \xB7 GARNISH \xB7 SERVED \xB7 AUDIENCE. Also include six content groupings \u2014 render ALL six panel headings exactly as written, never merging or omitting a panel: PANEL 01 \u2014 PLATING ANGLES (5 beauty shots, identical styling): TOP-DOWN \xB7 3/4 HERO \xB7 SIDE \xB7 EXTREME CLOSE-UP \xB7 IN HAND OR WITH UTENSIL. PANEL 02 \u2014 INGREDIENT BREAKDOWN (5 isolated ingredient studies on a dark background). PANEL 03 \u2014 DETAIL MACROS (4): surface texture \xB7 glaze or sauce sheen \xB7 steam or freshness cue \xB7 garnish detail. PANEL 04 \u2014 IN CONTEXT (4 staged frames): steam rising \xB7 utensil lifting a bite \xB7 sauce pour frozen mid-action \xB7 hands holding the dish. PANEL 05 \u2014 LIGHTING / MOOD (4 same-angle hero shots): WARM APPETIZING \xB7 COOL EDITORIAL \xB7 HARD COMMERCIAL \xB7 MOODY DRAMATIC. PANEL 06 \u2014 COLOR PALETTE: 6 swatches with HEX codes from the dish and plating. Bottom caption: "Use this food board as a visual reference for consistent depiction of the dish across all generations." Bottom-right tags: STYLE \xB7 Modern \xB7 Realistic \xB7 Commercial.`,
@@ -42342,7 +42421,7 @@ var GENERATE_IMAGE_PRESETS = [
42342
42421
  description: "Connect a mascot image \u2192 brand-character sheet with brand applications; reuse it for a consistent mascot.",
42343
42422
  group: "Reference Sheet",
42344
42423
  data: {
42345
- provider: "nano-banana-pro",
42424
+ provider: "gpt-image-2",
42346
42425
  aspectRatio: "16:9",
42347
42426
  resolution: "2K",
42348
42427
  promptPrefix: `Create a single high-resolution, densely packed mascot reference sheet titled "MASCOT BOARD" using the attached image of the mascot as the single source of truth for its design, proportions, colors, materials and personality. The same mascot must appear in every panel \u2014 identical design, identical colors and details \u2014 rendered in the mascot's native art style read from the attached image (illustrated, plush, costumed or 3D), never drifting between styles. All on-image labels in ENGLISH. Editorial brand-character layout with a dark near-black background, thin yellow neon accent light, faint film-grain overlay, and production-grade brand-design UI. The composition should feel organized but not rigidly locked: allow the hero pose, metadata, and supporting panels to shift position naturally while remaining readable, balanced, and premium. Design the board to adapt cleanly to different aspect ratios without depending on a fixed left-column layout. Include a large hero pose with a metadata block: MASCOT NAME \xB7 BRAND \xB7 CATEGORY \xB7 MATERIAL / STYLE \xB7 PERSONALITY \xB7 CATCHPHRASE \xB7 SIZE \xB7 USE CASES. Also include six content groupings \u2014 render ALL six panel headings exactly as written, never merging or omitting a panel: PANEL 01 \u2014 VIEWS (5 full-body angles, identical lighting): FRONT \xB7 3/4 LEFT \xB7 SIDE \xB7 BACK \xB7 3/4 RIGHT. PANEL 02 \u2014 EXPRESSIONS (6 head studies): HAPPY \xB7 WAVING \xB7 SHOCKED \xB7 WINKING \xB7 SLEEPY \xB7 CURIOUS. PANEL 03 \u2014 DETAIL MACROS (3): face detail \xB7 material or texture close-up \xB7 signature accessory. PANEL 04 \u2014 BRAND APPLICATIONS (4 mockups): on product packaging \xB7 on a storefront sign \xB7 in a print ad \xB7 on merch. PANEL 05 \u2014 POSES (4 action poses): GREETING \xB7 CELEBRATING \xB7 PRESENTING \xB7 THUMBS-UP. PANEL 06 \u2014 BRAND COLOR PALETTE: 6 swatches with HEX codes from the mascot's colors. Bottom caption: "Use this mascot board as a visual reference for consistent depiction of the mascot across all generations." Bottom-right tags: STYLE \xB7 Brand \xB7 Character \xB7 Consistent.`,
@@ -42356,7 +42435,7 @@ var GENERATE_IMAGE_PRESETS = [
42356
42435
  description: "Connect a sharp photo \u2192 dense pet sheet; reuse it as a reference for consistent shots.",
42357
42436
  group: "Reference Sheet",
42358
42437
  data: {
42359
- provider: "nano-banana-pro",
42438
+ provider: "gpt-image-2",
42360
42439
  aspectRatio: "16:9",
42361
42440
  resolution: "2K",
42362
42441
  promptPrefix: `Create a single high-resolution, densely packed pet reference sheet titled "PET BOARD" using the attached photo of the pet as the single source of truth for its species, breed, coat colors, markings, eyes and build. The same animal must appear in every panel \u2014 identical markings, identical proportions, identical collar or accessories. All on-image labels in ENGLISH. Editorial reference-board layout with a dark near-black background, thin yellow neon accent light, faint film-grain overlay, and production-grade character-design UI. The composition should feel organized but not rigidly locked: allow the hero portrait, metadata, and supporting panels to shift position naturally while remaining readable, balanced, and premium. Design the board to adapt cleanly to different aspect ratios without depending on a fixed left-column layout. Include a large hero portrait with a metadata block: NAME \xB7 SPECIES \xB7 BREED \xB7 AGE \xB7 SIZE \xB7 COAT & MARKINGS \xB7 EYES \xB7 COLLAR / ACCESSORIES \xB7 TEMPERAMENT \xB7 SIGNATURE BEHAVIOR. Also include six content groupings \u2014 render ALL six panel headings exactly as written, never merging or omitting a panel: PANEL 01 \u2014 VIEWS (5 full-body angles, neutral stance, identical lighting): FRONT \xB7 3/4 \xB7 SIDE \xB7 BACK \xB7 TOP-DOWN. PANEL 02 \u2014 EXPRESSIONS & MOODS (6 head studies): ALERT \xB7 CURIOUS \xB7 PLAYFUL \xB7 SLEEPY \xB7 GRUMPY \xB7 HAPPY. PANEL 03 \u2014 DETAIL MACROS (4): eye close-up \xB7 coat or fur texture \xB7 paw detail \xB7 collar tag or accessory. PANEL 04 \u2014 POSES (5 natural poses): SITTING \xB7 LYING DOWN \xB7 WALKING \xB7 PLAYING \xB7 CURLED ASLEEP. PANEL 05 \u2014 LIGHTING / MOOD (4 same-pose portraits): SOFT WINDOW LIGHT \xB7 GOLDEN HOUR \xB7 COOL BLUE NIGHT \xB7 DRAMATIC RIM-LIGHT. PANEL 06 \u2014 COLOR PALETTE: 6 swatches with HEX codes from the coat and accessories. Bottom caption: "Use this pet board as a visual reference for consistent depiction of the pet across all generations." Bottom-right tags: STYLE \xB7 Modern \xB7 Realistic \xB7 Cinematic.`,
@@ -42364,19 +42443,35 @@ var GENERATE_IMAGE_PRESETS = [
42364
42443
  negativePrompt: "illustration, cartoon, 3d render, garbled text, misspelled labels, watermark, deformed anatomy, inconsistent markings between panels, wrong breed, blurry, low resolution"
42365
42444
  }
42366
42445
  },
42446
+ {
42447
+ id: "generate-image/skin-detail-sheet",
42448
+ name: "Skin Detail Sheet",
42449
+ description: "Connect a sharp face photo \u2192 a six-panel skin reference.",
42450
+ group: "Reference Sheet",
42451
+ data: {
42452
+ ...SKIN_STUDY_MODEL,
42453
+ aspectRatio: "3:2",
42454
+ promptPrefix: sentences(
42455
+ 'Create a single skin detail reference sheet titled "SKIN DETAIL SHEET" from the attached photo of the person, the single source of truth for identity, skin tone and features. The same person, the same light and the same unretouched skin in every panel. Six panels \u2014 render ALL six panel headings exactly as written, never merging or omitting a panel: PANEL 01 \u2014 FULL FACE (front, eye level) \xB7 PANEL 02 \u2014 LEFT CHEEK & NOSE \xB7 PANEL 03 \u2014 RIGHT CHEEK & JAW \xB7 PANEL 04 \u2014 FOREHEAD & HAIRLINE \xB7 PANEL 05 \u2014 EYES & BROWS \xB7 PANEL 06 \u2014 LIPS & CHIN. In every panel:',
42456
+ REALISM_SKIN,
42457
+ "Flat, even daylight, neutral colour, everything sharp."
42458
+ ),
42459
+ promptSuffix: "Plain neutral grey background, thin white panel labels in English. Use this sheet as a visual reference for consistent skin detail of this person across generations."
42460
+ }
42461
+ },
42367
42462
  // ── Cast & Consistency (clean grids per the multi-character workflow:
42368
42463
  // sterile neutral-background reference grids built to be FED BACK as identity
42369
42464
  // anchors — unlike the editorial boards above, decoration here is noise.
42370
- // Nano Banana 2.1 (decided 2026-10-08 — it replaced Nano Banana 2, which the
42371
- // source guide recommended: cheaper/faster per attempt with strong practical
42372
- // consistency); 4K so panel faces stay sharp when reused as refs.) ──
42465
+ // GPT Image 2 (decided 2026-10-08 from the image model bake-off: it built the
42466
+ // best reference grid and kept both identities on the cast sheet); 4K so
42467
+ // panel faces stay sharp when reused as refs.) ──
42373
42468
  {
42374
42469
  id: "generate-image/character-reference-grid",
42375
42470
  name: "Character Reference Grid",
42376
42471
  description: "Connect a photo \u2192 clean 4-angle identity grid (no decorations) \u2014 the strongest consistency anchor.",
42377
42472
  group: "Cast & Consistency",
42378
42473
  data: {
42379
- provider: "nano-banana-2-1",
42474
+ provider: "gpt-image-2",
42380
42475
  aspectRatio: "3:4",
42381
42476
  resolution: "4K",
42382
42477
  promptPrefix: `Create a clean character reference grid using the attached photo of the person as the single source of truth for face, hair, eyes, skin tone, build and outfit. Four equal panels arranged in a tidy two-by-two grid on a single seamless neutral light-grey studio background: a tight front-facing portrait close-up, a 3/4-view portrait, a full-body shot from the front in a relaxed neutral stance, and a full-body shot from the back. The SAME person in every panel \u2014 identical age, features, hairstyle and outfit from the attached photo. Identical soft, even studio lighting in all four panels with no dramatic shadows. No decorations, no background props, no text, no UI elements \u2014 a sterile, production-neutral reference sheet built to be reused as an identity reference in later generations.`,
@@ -42390,7 +42485,7 @@ var GENERATE_IMAGE_PRESETS = [
42390
42485
  description: "Connect 2\u20134 character refs \u2192 one labeled cast sheet; then reference cast members by name in scenes.",
42391
42486
  group: "Cast & Consistency",
42392
42487
  data: {
42393
- provider: "nano-banana-2-1",
42488
+ provider: "gpt-image-2",
42394
42489
  aspectRatio: "3:4",
42395
42490
  resolution: "4K",
42396
42491
  prompt: `Create a clean multi-character cast reference sheet composed as horizontal strips stacked vertically in one image \u2014 one strip per character from the attached reference images, in the order they are attached, using exactly as many strips as there are attached characters. Each strip shows that character in four aligned studio panels: tight front portrait close-up \xB7 3/4 portrait \xB7 full body front \xB7 full body back, all in a relaxed neutral stance. Label each strip on the left edge with the character's name in clean bold lettering: {character names || ALEX \xB7 MAYA \xB7 SAM}. Every character must match their attached reference exactly \u2014 same face, hair, skin tone, build and outfit \u2014 with no identity blending between rows. Single seamless neutral light-grey studio background across the whole sheet, identical soft even lighting in every panel, consistent panel sizing and alignment. No decorations, no props, no UI elements beyond the row name labels. A sterile production casting sheet built to be reused as the single identity reference for this cast in later generations. Photorealistic, sharp focus, natural skin texture, true-to-life color.`,
@@ -42403,7 +42498,7 @@ var GENERATE_IMAGE_PRESETS = [
42403
42498
  description: "Connect a cast grid \u2192 stage a scene naming the characters; never re-describe their looks.",
42404
42499
  group: "Cast & Consistency",
42405
42500
  data: {
42406
- provider: "nano-banana-2-1",
42501
+ provider: "gpt-image-2",
42407
42502
  aspectRatio: "16:9",
42408
42503
  resolution: "2K",
42409
42504
  prompt: `Using the attached character reference sheet as the single source of truth for every named character's face, hair, build and outfit, generate one photorealistic scene: {scene || ALEX and MAYA share a quiet laugh at the counter of a sunlit ramen bar while SAM studies the menu}. Refer to the characters ONLY by the names labeled on the reference sheet and keep each one perfectly consistent with their reference row \u2014 do not invent new physical traits, do not blend identities, and do not alter outfits unless the scene says so. Stage them naturally in the environment with believable eye-lines, interactions and spacing. Cinematic photography, 35mm lens look with gentle depth of field, soft motivated lighting that matches the location, cohesive filmic color grade, natural skin texture, sharp detail on every character.`,
@@ -42487,7 +42582,7 @@ var GENERATE_IMAGE_PRESETS = [
42487
42582
  description: "Moody, shallow-depth portrait look.",
42488
42583
  group: "Photography & Cinematic",
42489
42584
  data: {
42490
- provider: "nano-banana-pro",
42585
+ provider: "gpt-image-2",
42491
42586
  aspectRatio: "9:16",
42492
42587
  prompt: "cinematic portrait of {subject || a pensive young man with stubble}, 85mm lens at f/1.8, shallow depth of field with creamy bokeh, soft key with warm rim separation against a moody low-key background, gentle film grain, filmic teal-and-amber grade, natural skin texture, tack-sharp eyes",
42493
42588
  negativePrompt: "flat lighting, deep focus, plastic skin, blown highlights, extra fingers, lowres, deformed, watermark, text"
@@ -42499,7 +42594,7 @@ var GENERATE_IMAGE_PRESETS = [
42499
42594
  description: "Film-grade scene, dramatic lighting.",
42500
42595
  group: "Photography & Cinematic",
42501
42596
  data: {
42502
- provider: "nano-banana-pro",
42597
+ provider: "gpt-image-2",
42503
42598
  aspectRatio: "16:9",
42504
42599
  prompt: "cinematic film still of {subject || a lone detective in a rain-slicked alley at night}, anamorphic lens at 40mm and f/2, shallow depth of field with oval bokeh and subtle horizontal flares, dramatic motivated key light with deep falloff, off-center framing with negative space, tense noir mood in a moody teal-and-amber grade, fine film grain, photoreal detail",
42505
42600
  negativePrompt: "flat lighting, deep focus, oversaturated, washed out, video-game render, lowres, deformed, watermark, text"
@@ -42523,7 +42618,7 @@ var GENERATE_IMAGE_PRESETS = [
42523
42618
  description: "Soft-lit 85mm studio headshot.",
42524
42619
  group: "Photography & Cinematic",
42525
42620
  data: {
42526
- provider: "nano-banana-pro",
42621
+ provider: "nano-banana-2-1",
42527
42622
  aspectRatio: "4:5",
42528
42623
  prompt: "studio portrait of {subject || a confident woman with sleek dark hair}, 85mm lens at f/2.8, shallow depth of field, soft octabox key with gentle fill and a subtle hair light, clean seamless gray backdrop, tight head-and-shoulders framing, polished editorial mood with a neutral true-to-life palette, natural skin texture, catchlights and tack-sharp eyes",
42529
42624
  negativePrompt: "harsh shadows, plastic skin, over-retouched, blown highlights, busy background, extra fingers, lowres, deformed, watermark, text"
@@ -42535,7 +42630,7 @@ var GENERATE_IMAGE_PRESETS = [
42535
42630
  description: "Clean professional headshot.",
42536
42631
  group: "Photography & Cinematic",
42537
42632
  data: {
42538
- provider: "nano-banana-pro",
42633
+ provider: "gpt-image-2",
42539
42634
  aspectRatio: "1:1",
42540
42635
  prompt: "professional corporate headshot of {subject || a friendly executive in a tailored navy blazer}, 85mm lens at f/4, soft even three-point lighting with a broad key and clean fill, smooth neutral gray-blue background, centered head-and-shoulders framing, approachable confident expression, crisp business mood with a clean neutral palette, sharp focus and natural skin texture",
42541
42636
  negativePrompt: "harsh shadows, busy background, casual snapshot, over-retouched, plastic skin, extra fingers, lowres, deformed, watermark, text"
@@ -42559,7 +42654,7 @@ var GENERATE_IMAGE_PRESETS = [
42559
42654
  description: "High-contrast editorial mono.",
42560
42655
  group: "Photography & Cinematic",
42561
42656
  data: {
42562
- provider: "nano-banana-pro",
42657
+ provider: "nano-banana-2-1",
42563
42658
  aspectRatio: "4:5",
42564
42659
  prompt: "black and white editorial portrait of {subject || a weathered old fisherman with a lined face}, 85mm lens at f/2, shallow depth of field, dramatic single-source chiaroscuro with deep falloff, tight off-center framing, timeless brooding mood with a rich high-contrast monochrome tonal range, deep blacks and luminous highlights, fine silver grain, sharp eyes and natural skin texture",
42565
42660
  negativePrompt: "color, muddy gray tones, flat lighting, low contrast, plastic skin, extra fingers, lowres, deformed, watermark, text"
@@ -42583,7 +42678,7 @@ var GENERATE_IMAGE_PRESETS = [
42583
42678
  description: "Appetizing 45\xB0 hero shot.",
42584
42679
  group: "Photography & Cinematic",
42585
42680
  data: {
42586
- provider: "nano-banana-pro",
42681
+ provider: "nano-banana-2-1",
42587
42682
  aspectRatio: "4:5",
42588
42683
  prompt: "appetizing hero food photograph of {dish || a rustic bowl of ramen with a soft-boiled egg}, 50mm lens at f/2.8, shallow depth of field, soft diffused window light from the side with a gentle fill, 45-degree angle on a weathered rustic surface, props and steam fading into a clean background, warm mouth-watering mood with natural color, fresh garnish, glistening textures and crisp focus on the hero",
42589
42684
  negativePrompt: "unappetizing, plastic look, fake glossy food, messy spills, dull colors, harsh flash, lowres, deformed, watermark, text"
@@ -42595,7 +42690,7 @@ var GENERATE_IMAGE_PRESETS = [
42595
42690
  description: "Overhead styled food spread.",
42596
42691
  group: "Photography & Cinematic",
42597
42692
  data: {
42598
- provider: "nano-banana-pro",
42693
+ provider: "gpt-image-2",
42599
42694
  aspectRatio: "1:1",
42600
42695
  prompt: "overhead flat-lay food photograph of {dish || a colorful brunch spread with coffee and pastries}, 35mm lens at f/5.6 with even focus, perfect top-down ninety-degree angle, soft diffused daylight casting gentle natural shadows, balanced styled arrangement with breathing room and scattered ingredients, fresh vibrant editorial mood with a clean color palette on a textured surface, crisp appetizing detail",
42601
42696
  negativePrompt: "cluttered, overcrowded, tilted angle, harsh shadows, plastic look, dull colors, lowres, deformed, watermark, text"
@@ -42632,7 +42727,7 @@ var GENERATE_IMAGE_PRESETS = [
42632
42727
  description: "Front / side / back, T-pose.",
42633
42728
  group: "Characters",
42634
42729
  data: {
42635
- provider: "nano-banana-pro",
42730
+ provider: "gpt-image-2",
42636
42731
  aspectRatio: "16:9",
42637
42732
  prompt: "full-body character turnaround model sheet of {character description || a rugged space mercenary with a scarred jaw and worn leather armor}, three matching views in a row \u2014 front, side profile, and back \u2014 held in a clean T-pose with a neutral expression, identical proportions and costume details across all three views, flat even studio lighting with no harsh shadows so every view reads the same, evenly spaced on a plain light-grey backdrop, crisp concept-art model-sheet style, clean line work and consistent color palette across panels",
42638
42733
  negativePrompt: "inconsistent design between views, mismatched proportions, extra limbs, deformed anatomy, dynamic pose, dramatic shadows, busy background, watermark, text"
@@ -42644,7 +42739,7 @@ var GENERATE_IMAGE_PRESETS = [
42644
42739
  description: "Four dynamic full-body poses.",
42645
42740
  group: "Characters",
42646
42741
  data: {
42647
- provider: "nano-banana-pro",
42742
+ provider: "gpt-image-2",
42648
42743
  aspectRatio: "16:9",
42649
42744
  prompt: "character action model sheet of {character description || a nimble rogue archer in a hooded green cloak}, four distinct full-body dynamic action poses in a row \u2014 running, leaping, attacking, landing \u2014 strictly consistent face, character design, and outfit across every pose, full-figure framing with confident gesture and clear silhouettes, even studio lighting that stays identical across all four poses, plain neutral backdrop, energetic concept-art model sheet, clean linework and matching color palette",
42650
42745
  negativePrompt: "inconsistent design between poses, changed outfit, deformed anatomy, extra limbs, fused figures, static stiff posture, busy background, watermark, text"
@@ -42656,7 +42751,7 @@ var GENERATE_IMAGE_PRESETS = [
42656
42751
  description: "6 emotions, 2 rows of 3.",
42657
42752
  group: "Characters",
42658
42753
  data: {
42659
- provider: "nano-banana-pro",
42754
+ provider: "nano-banana-2-1",
42660
42755
  aspectRatio: "4:3",
42661
42756
  prompt: "character expression model sheet of {character description || a cheerful freckled teen with messy red hair}, six head-and-shoulders portraits arranged in two even rows of three, labeled emotions in order \u2014 neutral, happy, angry, surprised, sad, determined \u2014 strictly consistent face, hairstyle, and features across every panel with only the expression changing, flat even portrait lighting identical in all six panels, evenly spaced on a plain neutral backdrop, clean concept-art model sheet, natural facial detail and matching color palette",
42662
42757
  negativePrompt: "inconsistent face, drifting features, changed hairstyle, deformed, asymmetrical eyes, uneven lighting, busy background, watermark, garbled text"
@@ -42668,7 +42763,7 @@ var GENERATE_IMAGE_PRESETS = [
42668
42763
  description: "4\xD74 emotion grid, one face.",
42669
42764
  group: "Characters",
42670
42765
  data: {
42671
- provider: "nano-banana-pro",
42766
+ provider: "nano-banana-2-1",
42672
42767
  aspectRatio: "1:1",
42673
42768
  prompt: "16-panel character expression grid of {character description || a stoic silver-haired knight with a faint scar}, evenly spaced 4x4 layout of head-and-shoulders portraits, sixteen distinct facial emotions ranging from calm to intense, strictly consistent face, hairstyle, and design across every cell with only the expression changing, flat even portrait lighting identical in all panels, plain neutral backdrop, clean concept-art model sheet, natural facial detail and matching color palette",
42674
42769
  negativePrompt: "inconsistent face, drifting features, changed hairstyle, deformed, asymmetrical eyes, uneven panels, uneven lighting, busy background, watermark, text"
@@ -42680,7 +42775,7 @@ var GENERATE_IMAGE_PRESETS = [
42680
42775
  description: "Same character, 4 outfits.",
42681
42776
  group: "Characters",
42682
42777
  data: {
42683
- provider: "nano-banana-pro",
42778
+ provider: "gpt-image-2",
42684
42779
  aspectRatio: "16:9",
42685
42780
  prompt: "outfit variation model sheet of {character description || a confident young woman with a sleek dark bob}, the same character shown full-body in four different complete outfits side by side \u2014 casual, formal, athletic, seasonal \u2014 strictly consistent face, body, and hairstyle across all four with only the wardrobe changing, full-figure framing in a relaxed standing pose, flat even studio lighting identical across every panel, evenly spaced on a plain neutral backdrop, clean concept-art model sheet, matching color palette and crisp fabric detail",
42686
42781
  negativePrompt: "inconsistent face, changed body or hairstyle, deformed, mismatched proportions, repeated identical outfit, busy background, watermark, text"
@@ -42704,7 +42799,7 @@ var GENERATE_IMAGE_PRESETS = [
42704
42799
  description: "Cute super-deformed poses.",
42705
42800
  group: "Characters",
42706
42801
  data: {
42707
- provider: "nano-banana-pro",
42802
+ provider: "nano-banana-2-1",
42708
42803
  aspectRatio: "1:1",
42709
42804
  prompt: "chibi character model sheet of {character description || a tiny brave knight with oversized armor}, adorable super-deformed proportions with a big head and small body, several cute mini full-body poses arranged across the sheet, strictly consistent design and color palette across every pose, soft even flat lighting identical across all poses, evenly spaced on a plain pastel backdrop, clean bold outlines and flat cel shading, charming concept-art model sheet",
42710
42805
  negativePrompt: "realistic proportions, inconsistent design, deformed, off-model, gritty shading, busy background, watermark, text"
@@ -42728,7 +42823,7 @@ var GENERATE_IMAGE_PRESETS = [
42728
42823
  description: "Dynamic full-body hero shot.",
42729
42824
  group: "Characters",
42730
42825
  data: {
42731
- provider: "nano-banana-pro",
42826
+ provider: "gpt-image-2-5-sunburst",
42732
42827
  aspectRatio: "2:3",
42733
42828
  prompt: "full-body hero shot of {character description || a heroic armored warrior with a flowing crimson cape}, cinematic character key art, confident dynamic power pose, dramatic rim lighting with a warm key and cool back-light carving the silhouette, low camera angle for an imposing heroic stance, softly blurred atmospheric background, bold dramatic color grade, intricately detailed costume and crisp material textures",
42734
42829
  negativePrompt: "flat lighting, static stiff pose, lowres, deformed, extra limbs, cropped feet, cluttered background, blurry, watermark, text"
@@ -42740,7 +42835,7 @@ var GENERATE_IMAGE_PRESETS = [
42740
42835
  description: "Concept creature, multi-angle.",
42741
42836
  group: "Characters",
42742
42837
  data: {
42743
- provider: "nano-banana-pro",
42838
+ provider: "gpt-image-2",
42744
42839
  aspectRatio: "16:9",
42745
42840
  prompt: "creature design model sheet of {creature description || a six-legged bioluminescent forest beast with mossy scales}, several full-body views from multiple angles plus inset anatomy and texture close-ups, strictly consistent species, markings, and proportions across every view, professional creature-concept art, flat even studio lighting identical across all views so the design reads clearly, neatly arranged on a plain neutral backdrop, detailed believable anatomy and crisp surface textures, cohesive color palette",
42746
42841
  negativePrompt: "inconsistent design between views, mismatched proportions, deformed anatomy, extra or missing limbs, dramatic shadows, busy background, watermark, text"
@@ -42752,7 +42847,7 @@ var GENERATE_IMAGE_PRESETS = [
42752
42847
  description: "Centered, bold, clean bg.",
42753
42848
  group: "Characters",
42754
42849
  data: {
42755
- provider: "nano-banana-pro",
42850
+ provider: "gpt-image-2",
42756
42851
  aspectRatio: "1:1",
42757
42852
  prompt: "stylized avatar profile picture of {character or subject || a friendly fox with bright amber eyes}, clean modern character illustration, bold thick outlines with smooth flat shading, soft even front lighting with a gentle glow, perfectly centered head-and-shoulders composition with comfortable margins, vibrant punchy color palette on a clean solid-color background, crisp friendly and instantly readable as a small icon",
42758
42853
  negativePrompt: "off-center, cropped face, busy background, lowres, deformed, muddy colors, harsh shadows, watermark, text"
@@ -42765,7 +42860,7 @@ var GENERATE_IMAGE_PRESETS = [
42765
42860
  description: "Clean e-commerce product photo on white.",
42766
42861
  group: "Product & Commerce",
42767
42862
  data: {
42768
- provider: "nano-banana-pro",
42863
+ provider: "gpt-image-2",
42769
42864
  aspectRatio: "1:1",
42770
42865
  prompt: "e-commerce studio product photograph of {product || a matte-black wireless headphone}, on a seamless pure-white background, 100mm lens at f/8 with deep focus, soft even high-key lighting from a large diffused softbox with gentle fill, perfectly centered with generous margins, clean catalog-ready mood with true-to-life color, crisp edges and accurate material texture",
42771
42866
  negativePrompt: "clutter, props, harsh shadows, blown highlights, color cast, reflections, tilted angle, lowres, deformed, watermark, text"
@@ -42789,7 +42884,7 @@ var GENERATE_IMAGE_PRESETS = [
42789
42884
  description: "Overhead styled arrangement.",
42790
42885
  group: "Product & Commerce",
42791
42886
  data: {
42792
- provider: "nano-banana-pro",
42887
+ provider: "gpt-image-2",
42793
42888
  aspectRatio: "1:1",
42794
42889
  prompt: "overhead flat-lay product photograph of {product || a leather travel wallet} surrounded by complementary props, 35mm lens at f/5.6 with even focus, perfect top-down ninety-degree angle, soft diffused daylight casting gentle natural shadows, balanced styled arrangement with breathing room around the hero, clean modern editorial mood with a cohesive palette on a textured surface, crisp material detail",
42795
42890
  negativePrompt: "cluttered, overcrowded, tilted angle, harsh shadows, dull colors, plastic look, lowres, deformed, watermark, text"
@@ -42801,7 +42896,7 @@ var GENERATE_IMAGE_PRESETS = [
42801
42896
  description: "Box / bottle / pouch render.",
42802
42897
  group: "Product & Commerce",
42803
42898
  data: {
42804
- provider: "nano-banana-pro",
42899
+ provider: "gpt-image-2",
42805
42900
  aspectRatio: "1:1",
42806
42901
  prompt: "photorealistic product packaging mockup of {product || an artisanal coffee brand}, presented as {format || a standing kraft pouch}, with a crisp accurately-printed label wrapping the form, 85mm lens at f/8 with deep focus, soft studio lighting with a subtle highlight and grounded contact shadow, centered hero composition on a clean seamless background, premium retail mood with true-to-life color, sharp legible label artwork and realistic material finish",
42807
42902
  negativePrompt: "distorted label, warped text, misspelled words, floating object, harsh shadows, clutter, lowres, deformed, watermark"
@@ -42825,7 +42920,7 @@ var GENERATE_IMAGE_PRESETS = [
42825
42920
  description: "Premium cosmetic hero shot.",
42826
42921
  group: "Product & Commerce",
42827
42922
  data: {
42828
- provider: "nano-banana-pro",
42923
+ provider: "nano-banana-2-1",
42829
42924
  aspectRatio: "4:5",
42830
42925
  prompt: "luxury beauty product hero shot of {product || a frosted-glass serum bottle with a gold dropper}, 100mm macro lens at f/8 with crisp focus, dramatic single-source key light with a soft gradient falloff and a bright specular edge, fresh water droplets beading on the surface, centered low hero angle on a premium glossy reflective surface, elegant high-end mood with a refined jewel-toned palette, immaculate detail and luminous reflections",
42831
42926
  negativePrompt: "cheap plastic look, fingerprints, dust, busy background, flat lighting, dull colors, lowres, deformed, watermark, text"
@@ -42972,7 +43067,7 @@ var GENERATE_IMAGE_PRESETS = [
42972
43067
  description: "Cinematic key art, title + tagline.",
42973
43068
  group: "Print & Posters",
42974
43069
  data: {
42975
- provider: "nano-banana-pro",
43070
+ provider: "gpt-image-2-5-sunburst",
42976
43071
  aspectRatio: "2:3",
42977
43072
  prompt: "theatrical movie poster for '{TITLE}', cinematic key art in a {genre || gritty sci-fi thriller} mood, dramatic vertical hero composition with a commanding central figure, moody atmospheric lighting with strong rim light and volumetric haze, rich filmic teal-and-amber color grade, bold title treatment along the bottom with a short tagline above it and a small billing-block strip, premium high-detail finish, legible correctly-spelled text",
42978
43073
  negativePrompt: "flat lighting, cluttered composition, amateurish layout, misspelled text, garbled letters, extra limbs, deformed faces, lowres, blurry, watermark"
@@ -42996,7 +43091,7 @@ var GENERATE_IMAGE_PRESETS = [
42996
43091
  description: "Genre cover, title + author.",
42997
43092
  group: "Print & Posters",
42998
43093
  data: {
42999
- provider: "nano-banana-pro",
43094
+ provider: "gpt-image-2-5-sunburst",
43000
43095
  aspectRatio: "2:3",
43001
43096
  prompt: "professional book cover for '{TITLE}' by {AUTHOR}, evocative {genre || literary thriller} mood and symbolic central imagery, vertical composition with a strong focal point, bold title typography across the top and the author name along the bottom with clear hierarchy, atmospheric lighting and a cohesive genre-appropriate color palette, refined bookstore-quality finish, legible correctly-spelled text",
43002
43097
  negativePrompt: "cluttered layout, clashing fonts, generic stock look, misspelled text, garbled letters, deformed faces, lowres, blurry, watermark"
@@ -43045,7 +43140,7 @@ var GENERATE_IMAGE_PRESETS = [
43045
43140
  description: "Cel-shaded anime look.",
43046
43141
  group: "Illustration & Art Styles",
43047
43142
  data: {
43048
- provider: "nano-banana-pro",
43143
+ provider: "gpt-image-2",
43049
43144
  aspectRatio: "16:9",
43050
43145
  style: "anime",
43051
43146
  prompt: "{scene or subject || a girl watching fireworks over a summer festival}, cel-shaded with crisp linework, expressive eyes, soft gradient sky, gentle bloom",
@@ -43058,7 +43153,7 @@ var GENERATE_IMAGE_PRESETS = [
43058
43153
  description: "Inked panel with action.",
43059
43154
  group: "Illustration & Art Styles",
43060
43155
  data: {
43061
- provider: "nano-banana-pro",
43156
+ provider: "gpt-image-2",
43062
43157
  aspectRatio: "4:3",
43063
43158
  style: "comic-book",
43064
43159
  prompt: "{scene || a caped hero landing on a rooftop at dusk}, dynamic comic panel composition, bold ink outlines, motion lines, clear space for a speech bubble",
@@ -43071,7 +43166,7 @@ var GENERATE_IMAGE_PRESETS = [
43071
43166
  description: "Screentone black-and-white.",
43072
43167
  group: "Illustration & Art Styles",
43073
43168
  data: {
43074
- provider: "nano-banana-pro",
43169
+ provider: "gpt-image-2",
43075
43170
  aspectRatio: "3:4",
43076
43171
  style: "manga",
43077
43172
  prompt: "{scene || a swordsman bracing against the wind}, black-and-white manga panel, crisp inking, screentone shading, dramatic low angle, speed lines",
@@ -43123,7 +43218,7 @@ var GENERATE_IMAGE_PRESETS = [
43123
43218
  description: "3/4 axonometric scene.",
43124
43219
  group: "Illustration & Art Styles",
43125
43220
  data: {
43126
- provider: "nano-banana-pro",
43221
+ provider: "gpt-image-2",
43127
43222
  aspectRatio: "1:1",
43128
43223
  style: "isometric",
43129
43224
  prompt: "isometric {building or scene || a cozy corner coffee shop}, true 3/4 axonometric angle, clean miniature game-art forms, soft even lighting, tidy modular detail",
@@ -43136,7 +43231,7 @@ var GENERATE_IMAGE_PRESETS = [
43136
43231
  description: "Retro low-res pixel grid.",
43137
43232
  group: "Illustration & Art Styles",
43138
43233
  data: {
43139
- provider: "nano-banana-pro",
43234
+ provider: "gpt-image-2",
43140
43235
  aspectRatio: "1:1",
43141
43236
  style: "pixel-art",
43142
43237
  prompt: "{subject || a hero exploring a torch-lit dungeon}, retro 16-bit pixel art, crisp pixel grid, limited dithered palette, hard-edged sprite detail",
@@ -43149,7 +43244,7 @@ var GENERATE_IMAGE_PRESETS = [
43149
43244
  description: "Polished CG character look.",
43150
43245
  group: "Illustration & Art Styles",
43151
43246
  data: {
43152
- provider: "nano-banana-pro",
43247
+ provider: "gpt-image-2",
43153
43248
  aspectRatio: "1:1",
43154
43249
  style: "pixar-3d",
43155
43250
  prompt: "{character or subject || a curious round-cheeked kid with big expressive eyes}, polished 3D animated render, soft subsurface skin, warm key light with gentle bounce, charming appeal",
@@ -43174,7 +43269,7 @@ var GENERATE_IMAGE_PRESETS = [
43174
43269
  description: "Bold linework, isolated.",
43175
43270
  group: "Illustration & Art Styles",
43176
43271
  data: {
43177
- provider: "nano-banana-pro",
43272
+ provider: "gpt-image-2-5-sunburst",
43178
43273
  aspectRatio: "2:3",
43179
43274
  prompt: "tattoo flash design of {subject || a roaring tiger with peony flowers} in {tattoo style || bold American traditional} style, confident clean linework with strong outlines, limited tattoo-ink palette, solid black fills and tasteful negative space, single centered motif isolated on a plain white sheet",
43180
43275
  negativePrompt: "photographic background, scene, soft gradients, photorealistic, fine grayscale shading, blurry, lowres, watermark, text"
@@ -43186,7 +43281,7 @@ var GENERATE_IMAGE_PRESETS = [
43186
43281
  description: "Painterly pre-production art.",
43187
43282
  group: "Illustration & Art Styles",
43188
43283
  data: {
43189
- provider: "nano-banana-pro",
43284
+ provider: "gpt-image-2",
43190
43285
  aspectRatio: "16:9",
43191
43286
  style: "concept-art",
43192
43287
  prompt: "concept art of {environment or subject || ancient ruins reclaimed by a glowing jungle}, sweeping sense of scale, atmospheric depth and haze, dramatic god-ray light",
@@ -43202,7 +43297,7 @@ var GENERATE_IMAGE_PRESETS = [
43202
43297
  description: "Plasticine stop-motion look, thumbprints included.",
43203
43298
  group: "Handmade & Stop-Motion",
43204
43299
  data: {
43205
- provider: "nano-banana-pro",
43300
+ provider: "gpt-image-2",
43206
43301
  aspectRatio: "16:9",
43207
43302
  prompt: "{scene || a tiny clay fisherman rowing across a stormy plasticine sea}, tactile stop-motion claymation scene \u2014 real plasticine clay characters and set with visible thumbprints, tool marks, seam lines and a soft matte sheen, miniature studio photography with shallow depth of field and warm practical lighting, handmade Aardman-quality charm. NOT digital CG, NOT a 3D render, NOT 2D illustration \u2014 a physically sculpted miniature scene photographed on a real stop-motion stage",
43208
43303
  negativePrompt: "smooth plastic CGI surface, digital 3d render, 2d illustration, cartoon shading, perfect seamless surfaces, real human actors, lowres, deformed, watermark, text"
@@ -43214,7 +43309,7 @@ var GENERATE_IMAGE_PRESETS = [
43214
43309
  description: "Fuzzy felted-wool miniature.",
43215
43310
  group: "Handmade & Stop-Motion",
43216
43311
  data: {
43217
- provider: "nano-banana-pro",
43312
+ provider: "gpt-image-2",
43218
43313
  aspectRatio: "1:1",
43219
43314
  prompt: "{subject || a round little fox curled in a mossy nest}, needle-felted wool sculpture \u2014 soft wool roving with visible fluffy fibers and a halo of stray strands, glass-bead eyes with a tiny sheen, embroidered nose and stitched details, handcrafted miniature photographed in a cozy diorama with soft window light, Laika-quality handmade charm. NOT digital CG, NOT a 3D render, NOT 2D illustration \u2014 real felted wool photographed up close",
43220
43315
  negativePrompt: "smooth plastic surface, digital 3d render, 2d illustration, real animal fur, photorealistic animal, hard CGI edges, lowres, deformed, watermark, text"
@@ -43226,7 +43321,7 @@ var GENERATE_IMAGE_PRESETS = [
43226
43321
  description: "Stitched-sock character on stage.",
43227
43322
  group: "Handmade & Stop-Motion",
43228
43323
  data: {
43229
- provider: "nano-banana-pro",
43324
+ provider: "gpt-image-2",
43230
43325
  aspectRatio: "4:3",
43231
43326
  prompt: "{character || a cheerful sock-puppet chef holding a tiny wooden spoon}, handmade sock puppet \u2014 thick cotton knit texture, stitched felt mouth, ping-pong-ball eyes with painted pupils, yarn hair, visible seams and hot-glue details, puppet-studio photography with soft even lighting and a simple stage backdrop, Henson-style handmade charm. NOT digital CG, NOT a 3D render, NOT 2D illustration \u2014 a real fabric puppet photographed on a puppet stage",
43232
43327
  negativePrompt: "smooth CGI fabric, digital 3d render, 2d illustration, human face, realistic skin, plastic toy look, lowres, deformed, watermark, text"
@@ -43238,7 +43333,7 @@ var GENERATE_IMAGE_PRESETS = [
43238
43333
  description: "Cut-cardboard craft set, tape & paint.",
43239
43334
  group: "Handmade & Stop-Motion",
43240
43335
  data: {
43241
- provider: "nano-banana-pro",
43336
+ provider: "gpt-image-2",
43242
43337
  aspectRatio: "16:9",
43243
43338
  prompt: "{scene || a rocket launching over a tiny cardboard city}, handmade cardboard-craft diorama \u2014 corrugated cardboard structures with visible cut edges, masking tape, hot-glue joints and hand-painted acrylic surfaces, hand-lettered signs, miniature set photography with warm practical lighting and gentle depth of field, Michel Gondry handmade-prop charm. NOT digital CG, NOT a 3D render, NOT 2D illustration \u2014 a real cardboard miniature set photographed in studio",
43244
43339
  negativePrompt: "clean vector shapes, digital 3d render, 2d illustration, smooth plastic surfaces, real buildings, photoreal city, lowres, deformed, watermark, garbled text"
@@ -43250,7 +43345,7 @@ var GENERATE_IMAGE_PRESETS = [
43250
43345
  description: "Hand-stitched thread on hooped linen.",
43251
43346
  group: "Handmade & Stop-Motion",
43252
43347
  data: {
43253
- provider: "nano-banana-pro",
43348
+ provider: "gpt-image-2",
43254
43349
  aspectRatio: "1:1",
43255
43350
  prompt: "{subject || a songbird on a blossoming branch} rendered as fine hand embroidery \u2014 visible individual thread stitches, satin-stitch fills and chain-stitch outlines, subtle thread sheen, slight fabric pucker around dense stitching, hooped natural linen background with a few loose thread tails, soft daylight craft photography, artisan needlework quality. NOT digital CG, NOT a 3D render, NOT 2D illustration, NOT a print \u2014 real stitched thread on real fabric",
43256
43351
  negativePrompt: "printed fabric, flat digital illustration, 3d render, smooth painted texture, photorealistic subject, lowres, deformed, watermark, text"
@@ -43262,7 +43357,7 @@ var GENERATE_IMAGE_PRESETS = [
43262
43357
  description: "Plasticine dish styled as a commercial.",
43263
43358
  group: "Handmade & Stop-Motion",
43264
43359
  data: {
43265
- provider: "nano-banana-pro",
43360
+ provider: "nano-banana-2-1",
43266
43361
  aspectRatio: "4:5",
43267
43362
  prompt: "{dish || a steaming bowl of ramen with a soft egg and curled noodles} sculpted entirely from plasticine modeling clay and styled as a glossy food commercial \u2014 visible sculpting tool marks, clear gloss varnish standing in for broth sheen, wool-tuft steam, clay ingredients with charming hand-modeled imperfection, miniature studio food-commercial lighting with a warm appetizing key, Aardman-quality handmade charm. NOT real food photography, NOT digital CG, NOT a 3D render, NOT 2D illustration \u2014 a physically sculpted clay dish photographed like a commercial",
43268
43363
  negativePrompt: "real food, photorealistic food, digital 3d render, 2d illustration, smooth plastic CGI, melted shapeless clay, unappetizing, lowres, watermark, text"
@@ -43311,7 +43406,7 @@ var GENERATE_IMAGE_PRESETS = [
43311
43406
  description: "Single cohesive aesthetic tile.",
43312
43407
  group: "Film & Storyboard",
43313
43408
  data: {
43314
- provider: "nano-banana-pro",
43409
+ provider: "gpt-image-2",
43315
43410
  aspectRatio: "1:1",
43316
43411
  prompt: "single cohesive mood-board tile capturing {aesthetic or theme || warm Scandinavian minimalism}, one unified evocative image \u2014 not a collage or grid, soft natural lighting with gentle texture and tactile materials, balanced editorial composition, restrained {color palette || muted oat, sage and terracotta} grade, calm atmospheric mood, crisp tasteful detail",
43317
43412
  negativePrompt: "collage, grid, split panels, multiple frames, text, labels, busy clutter, watermark, lowres"
@@ -43360,7 +43455,7 @@ var GENERATE_IMAGE_PRESETS = [
43360
43455
  description: "Bright, inviting listing shot.",
43361
43456
  group: "Architecture & Interiors",
43362
43457
  data: {
43363
- provider: "nano-banana-pro",
43458
+ provider: "gpt-image-2",
43364
43459
  aspectRatio: "16:9",
43365
43460
  prompt: "professional real estate photograph of {property || a bright open-concept living room with patio doors}, wide-angle architectural lens with straight true verticals and corrected perspective, bright airy natural daylight balanced with warm interior fill for a high-dynamic-range look, clean tasteful staging with uncluttered surfaces, welcoming aspirational mood with a fresh neutral palette, accurate geometry and crisp listing-ready detail",
43366
43461
  negativePrompt: "distorted geometry, warped perspective, bent verticals, fisheye bulge, dark, dingy, cluttered, lowres, watermark, text"
@@ -43385,7 +43480,7 @@ var GENERATE_IMAGE_PRESETS = [
43385
43480
  description: "Glossy RPG inventory icon.",
43386
43481
  group: "Icons, Game Assets & Textures",
43387
43482
  data: {
43388
- provider: "nano-banana-pro",
43483
+ provider: "gpt-image-2",
43389
43484
  aspectRatio: "1:1",
43390
43485
  prompt: "polished RPG inventory game icon of {item || a glowing enchanted health potion in a crystal vial}, rounded glossy 3D style with smooth beveled edges and a subtle inner glow, soft studio key light with a bright specular highlight and a faint magical rim, single object perfectly centered with generous margins, isolated on a clean dark gradient background, vibrant saturated game-art palette, crisp readable silhouette at small sizes",
43391
43486
  negativePrompt: "flat, 2d, lowres, cluttered background, multiple objects, busy scene, harsh shadows, watermark, text"
@@ -43397,7 +43492,7 @@ var GENERATE_IMAGE_PRESETS = [
43397
43492
  description: "Tileable PBR-style material.",
43398
43493
  group: "Icons, Game Assets & Textures",
43399
43494
  data: {
43400
- provider: "nano-banana-pro",
43495
+ provider: "gpt-image-2",
43401
43496
  aspectRatio: "1:1",
43402
43497
  prompt: "seamless tileable PBR-style surface texture of {material || weathered mossy cobblestone}, perfectly repeating with no visible seams, dead-flat top-down orthographic view, even diffuse flat lighting across the whole frame with no shadows or hotspots, edges that wrap cleanly when tiled, fine high-resolution material detail, true-to-life color, crisp uniform grain",
43403
43498
  negativePrompt: "visible seams, perspective, lighting gradient, shadows, vignette, hotspots, single object, foreground subject, lowres, watermark, text"
@@ -43421,7 +43516,7 @@ var GENERATE_IMAGE_PRESETS = [
43421
43516
  description: "Glossy 3D emoji variations.",
43422
43517
  group: "Icons, Game Assets & Textures",
43423
43518
  data: {
43424
- provider: "nano-banana-pro",
43519
+ provider: "gpt-image-2",
43425
43520
  aspectRatio: "1:1",
43426
43521
  prompt: "a set of glossy 3D emoji-style reaction icons of {subject || a round smiling yellow face}, several distinct expressions arranged in an even grid \u2014 happy, laughing, surprised, sad, angry, love \u2014 strictly consistent style, shading, and proportions across every icon with only the expression changing, smooth rounded inflatable forms with a candy-gloss finish, soft even studio lighting identical on each icon with a bright specular highlight, evenly spaced on a clean plain background, vibrant saturated palette, crisp and instantly readable at small sizes",
43427
43522
  negativePrompt: "inconsistent style, mismatched shading, off-model, realistic photo, flat 2d, muddy colors, cluttered background, lowres, watermark, text"
@@ -43433,7 +43528,7 @@ var GENERATE_IMAGE_PRESETS = [
43433
43528
  description: "Game-ready pixel sprite.",
43434
43529
  group: "Icons, Game Assets & Textures",
43435
43530
  data: {
43436
- provider: "nano-banana-pro",
43531
+ provider: "gpt-image-2",
43437
43532
  aspectRatio: "1:1",
43438
43533
  style: "pixel-art",
43439
43534
  prompt: "game-ready sprite of {character or item || a plucky knight with a tiny sword}, crisp clean pixels, bold readable silhouette, limited palette, centered on a plain background",
@@ -43447,7 +43542,7 @@ var GENERATE_IMAGE_PRESETS = [
43447
43542
  description: "Backlit subject, dramatic sky.",
43448
43543
  group: "Photography & Cinematic",
43449
43544
  data: {
43450
- provider: "nano-banana-pro",
43545
+ provider: "gpt-image-2",
43451
43546
  aspectRatio: "16:9",
43452
43547
  prompt: "dramatic silhouette of {subject || a lone figure on a hilltop with arms outstretched}, 50mm lens at f/8 with crisp deep focus, subject fully backlit against a vivid sunset sky and rendered as a clean dark shape with a glowing rim, low-angle composition with the figure off-center on the horizon, bold high-contrast mood in a fiery orange-to-purple gradient, smooth graded sky, minimal interior detail and clean recognizable outline",
43453
43548
  negativePrompt: "flat lighting, front lighting, visible face detail, washed-out sky, muddy tones, lowres, deformed, watermark, text"
@@ -43471,7 +43566,7 @@ var GENERATE_IMAGE_PRESETS = [
43471
43566
  description: "Fake-miniature selective blur.",
43472
43567
  group: "Photography & Cinematic",
43473
43568
  data: {
43474
- provider: "nano-banana-pro",
43569
+ provider: "gpt-image-2",
43475
43570
  aspectRatio: "16:9",
43476
43571
  prompt: "tilt-shift miniature photograph of {scene || a bustling city intersection with tiny cars and crowds}, tilt-shift lens with a narrow band of sharp focus and strong blur above and below, high elevated bird's-eye angle, tiny people and vehicles reading like toys, centered subject band, playful diorama mood with punchy high saturation and crisp clean detail in the focus zone",
43477
43572
  negativePrompt: "uniform sharp focus, eye-level angle, flat colors, dull lighting, realistic scale, lowres, deformed, watermark, text"
@@ -43484,7 +43579,7 @@ var GENERATE_IMAGE_PRESETS = [
43484
43579
  description: "Objects arranged at 90\xB0.",
43485
43580
  group: "Product & Commerce",
43486
43581
  data: {
43487
- provider: "nano-banana-pro",
43582
+ provider: "gpt-image-2",
43488
43583
  aspectRatio: "1:1",
43489
43584
  prompt: "knolling flat-lay photograph of {items || an everyday-carry kit \u2014 knife, pen, watch, wallet and keys}, every object precisely aligned at ninety-degree right angles and evenly spaced in a tidy grid, 35mm lens at f/8 with even edge-to-edge focus, perfect top-down ninety-degree angle, soft diffused overhead light with gentle even shadows, organized symmetrical composition with consistent gaps, satisfying orderly editorial mood with a clean palette on a smooth neutral surface, crisp product detail",
43490
43585
  negativePrompt: "cluttered, messy, overlapping objects, diagonal placement, uneven spacing, tilted angle, harsh shadows, lowres, deformed, watermark, text"
@@ -43496,7 +43591,7 @@ var GENERATE_IMAGE_PRESETS = [
43496
43591
  description: "Invisible-mannequin clothing shot.",
43497
43592
  group: "Product & Commerce",
43498
43593
  data: {
43499
- provider: "nano-banana-pro",
43594
+ provider: "nano-banana-2-1",
43500
43595
  aspectRatio: "4:5",
43501
43596
  prompt: "ghost-mannequin apparel photograph of {garment || a tailored wool blazer}, invisible-mannequin hollow three-dimensional effect with the garment holding its worn shape and a visible hollow neckline and cuffs, 85mm lens at f/8 with deep focus, soft even studio lighting from large diffusers with a subtle grounding shadow, centered front-facing composition on a clean pure-white background, crisp commercial e-commerce mood with true-to-life color, accurate fabric texture and sharp seams",
43502
43597
  negativePrompt: "visible mannequin, body, person, neck, hands, flat lifeless shape, wrinkles, color cast, lowres, deformed, watermark, text"
@@ -43515,14 +43610,14 @@ var GENERATE_IMAGE_PRESETS = [
43515
43610
  name: "Vaporwave",
43516
43611
  description: "80s neon pastel aesthetic.",
43517
43612
  group: "Illustration & Art Styles",
43518
- data: { provider: "nano-banana-pro", aspectRatio: "16:9", style: "vaporwave", prompt: "{subject || a marble bust beside a glowing palm tree}, neon pink-and-cyan glow, retro grid horizon, dreamy gradient sunset, subtle VHS haze", negativePrompt: "muted colors, photorealistic, dull, lowres, watermark, text" }
43613
+ data: { provider: "gpt-image-2", aspectRatio: "16:9", style: "vaporwave", prompt: "{subject || a marble bust beside a glowing palm tree}, neon pink-and-cyan glow, retro grid horizon, dreamy gradient sunset, subtle VHS haze", negativePrompt: "muted colors, photorealistic, dull, lowres, watermark, text" }
43519
43614
  },
43520
43615
  {
43521
43616
  id: "generate-image/cyberpunk-scene",
43522
43617
  name: "Cyberpunk Scene",
43523
43618
  description: "Neon-lit dystopian night.",
43524
43619
  group: "Illustration & Art Styles",
43525
- data: { provider: "nano-banana-pro", aspectRatio: "16:9", style: "cyberpunk", prompt: "{scene || a crowded neon market street}, rain-slicked night with glowing reflections, holographic signage, dense atmospheric haze, moody teal-and-magenta glow", negativePrompt: "daylight, flat lighting, washed out, lowres, deformed, watermark, text" }
43620
+ data: { provider: "gpt-image-2", aspectRatio: "16:9", style: "cyberpunk", prompt: "{scene || a crowded neon market street}, rain-slicked night with glowing reflections, holographic signage, dense atmospheric haze, moody teal-and-magenta glow", negativePrompt: "daylight, flat lighting, washed out, lowres, deformed, watermark, text" }
43526
43621
  },
43527
43622
  {
43528
43623
  id: "generate-image/pop-art",
@@ -43536,21 +43631,21 @@ var GENERATE_IMAGE_PRESETS = [
43536
43631
  name: "Low Poly",
43537
43632
  description: "Faceted geometric 3D.",
43538
43633
  group: "Illustration & Art Styles",
43539
- data: { provider: "nano-banana-pro", aspectRatio: "1:1", style: "low-poly", prompt: "{subject || a stylized mountain fox}, faceted triangular geometry, crisp flat-shaded polygons, clean gradient color blocking, soft studio light", negativePrompt: "smooth surfaces, rounded organic detail, photorealistic, lowres, watermark, text" }
43634
+ data: { provider: "gpt-image-2", aspectRatio: "1:1", style: "low-poly", prompt: "{subject || a stylized mountain fox}, faceted triangular geometry, crisp flat-shaded polygons, clean gradient color blocking, soft studio light", negativePrompt: "smooth surfaces, rounded organic detail, photorealistic, lowres, watermark, text" }
43540
43635
  },
43541
43636
  {
43542
43637
  id: "generate-image/paper-cut",
43543
43638
  name: "Paper Cut",
43544
43639
  description: "Layered cut-paper craft.",
43545
43640
  group: "Illustration & Art Styles",
43546
- data: { provider: "nano-banana-pro", aspectRatio: "1:1", style: "paper-cutout", prompt: "{subject || a fox in a layered forest}, layered cut-paper craft, stacked depth with soft drop shadows between layers, clean torn-and-cut edges, warm tactile palette", negativePrompt: "photorealistic, flat single-layer, smooth gradients, lowres, watermark, text" }
43641
+ data: { provider: "gpt-image-2", aspectRatio: "1:1", style: "paper-cutout", prompt: "{subject || a fox in a layered forest}, layered cut-paper craft, stacked depth with soft drop shadows between layers, clean torn-and-cut edges, warm tactile palette", negativePrompt: "photorealistic, flat single-layer, smooth gradients, lowres, watermark, text" }
43547
43642
  },
43548
43643
  {
43549
43644
  id: "generate-image/stained-glass",
43550
43645
  name: "Stained Glass",
43551
43646
  description: "Leaded colored-glass mosaic.",
43552
43647
  group: "Illustration & Art Styles",
43553
- data: { provider: "nano-banana-pro", aspectRatio: "2:3", style: "stained-glass", prompt: "{subject || a phoenix rising in flames}, bold black leading lines between glowing colored glass panes, luminous backlit jewel tones, symmetrical mosaic composition", negativePrompt: "photorealistic, flat, muddy colors, broken composition, lowres, watermark, text" }
43648
+ data: { provider: "gpt-image-2-5-sunburst", aspectRatio: "2:3", style: "stained-glass", prompt: "{subject || a phoenix rising in flames}, bold black leading lines between glowing colored glass panes, luminous backlit jewel tones, symmetrical mosaic composition", negativePrompt: "photorealistic, flat, muddy colors, broken composition, lowres, watermark, text" }
43554
43649
  },
43555
43650
  // ── Diagrams & Infographics ──────────────────────────────────────────────
43556
43651
  {
@@ -43600,7 +43695,7 @@ var GENERATE_IMAGE_PRESETS = [
43600
43695
  name: "X-Ray / See-Through",
43601
43696
  description: "Internal-structure radiograph look.",
43602
43697
  group: "Illustration & Art Styles",
43603
- data: { provider: "nano-banana-pro", aspectRatio: "4:3", prompt: "x-ray see-through render of {subject || a blooming flower}, translucent body revealing the internal structure and skeleton beneath, glowing luminous white-and-cyan lines on a deep black background, crisp radiograph aesthetic, centered specimen composition", negativePrompt: "opaque solid surface, full color, photorealistic skin, cluttered background, lowres, watermark, text" }
43698
+ data: { provider: "gpt-image-2", aspectRatio: "4:3", prompt: "x-ray see-through render of {subject || a blooming flower}, translucent body revealing the internal structure and skeleton beneath, glowing luminous white-and-cyan lines on a deep black background, crisp radiograph aesthetic, centered specimen composition", negativePrompt: "opaque solid surface, full color, photorealistic skin, cluttered background, lowres, watermark, text" }
43604
43699
  },
43605
43700
  // ── More Icons, Game Assets & Textures ───────────────────────────────────
43606
43701
  {
@@ -43608,7 +43703,7 @@ var GENERATE_IMAGE_PRESETS = [
43608
43703
  name: "3D Icon",
43609
43704
  description: "Glossy single 3D-rendered icon.",
43610
43705
  group: "Icons, Game Assets & Textures",
43611
- data: { provider: "nano-banana-pro", aspectRatio: "1:1", prompt: "a single glossy 3D rendered icon of {subject || a friendly chat bubble}, smooth rounded clay-like form with soft beveled edges, soft studio key light with a gentle gradient falloff, a bright specular highlight and a soft contact shadow, perfectly centered with generous padding, isolated on a clean plain background, vibrant cohesive palette, crisp and readable at small sizes", negativePrompt: "flat, 2d, multiple objects, cluttered background, harsh shadows, photographic scene, lowres, watermark, text" }
43706
+ data: { provider: "gpt-image-2", aspectRatio: "1:1", prompt: "a single glossy 3D rendered icon of {subject || a friendly chat bubble}, smooth rounded clay-like form with soft beveled edges, soft studio key light with a gentle gradient falloff, a bright specular highlight and a soft contact shadow, perfectly centered with generous padding, isolated on a clean plain background, vibrant cohesive palette, crisp and readable at small sizes", negativePrompt: "flat, 2d, multiple objects, cluttered background, harsh shadows, photographic scene, lowres, watermark, text" }
43612
43707
  },
43613
43708
  // ── More Architecture & Interiors ────────────────────────────────────────
43614
43709
  {
@@ -43627,7 +43722,7 @@ var GENERATE_IMAGE_PRESETS = [
43627
43722
  },
43628
43723
  // ── Portrait Transformations (identity-locked, from a connected reference photo) ──
43629
43724
  // Like Stylized Subject, these are TRANSFORM presets: connect a clean front-facing
43630
- // reference portrait and nano-banana-pro rebuilds it. The "Timeless Soul" age
43725
+ // reference portrait and GPT Image 2 rebuilds it. The "Timeless Soul" age
43631
43726
  // progression renders ONE person at several ages in a single studio composite — the
43632
43727
  // whole effect rides on the identity-lock clause (same eyes/brow/nose/ears/bone
43633
43728
  // structure), so it stays one person aging rather than several different people.
@@ -43637,7 +43732,7 @@ var GENERATE_IMAGE_PRESETS = [
43637
43732
  description: "One person at 5 ages, studio line-up. Needs a reference photo.",
43638
43733
  group: "Portrait Transformations",
43639
43734
  data: {
43640
- provider: "nano-banana-pro",
43735
+ provider: "gpt-image-2",
43641
43736
  aspectRatio: "3:4",
43642
43737
  promptPrefix: "Single photorealistic studio composite of the SAME person from the reference image at five stages of life, shoulder-to-shoulder left to right in a smooth age progression: a child around 7, a teen around 15, a young adult around 27, a mature adult around 45, and an elder around 70. Editorial portrait photography, 85mm lens at f/2.8, each figure framed chest-up, all facing camera with the same calm expression. CRITICAL identity lock \u2014 same eyes, eye color, brow, nose, ears, jawline and facial bone structure across every figure, unmistakably the same person; age ONLY via skin texture, fine lines and wrinkles, hairline, hair color (darker in youth, greying with age), and a slight shift in facial fullness. Age-appropriate wardrobe per stage. Even soft cinematic studio key with gentle rim separation, clean dark-grey gradient seamless backdrop, refined neutral grade, natural skin tones, tack-sharp facial detail; the five figures fill the frame.",
43643
43738
  negativePrompt: "different person, inconsistent face between figures, distorted features, identity drift across ages, wrong eye color, plastic skin, deformed, extra fingers, blurry, lowres, watermark, text"
@@ -43649,7 +43744,7 @@ var GENERATE_IMAGE_PRESETS = [
43649
43744
  description: "Same person at 3 ages (~10 / 40 / 75). Needs a reference photo.",
43650
43745
  group: "Portrait Transformations",
43651
43746
  data: {
43652
- provider: "nano-banana-pro",
43747
+ provider: "gpt-image-2",
43653
43748
  aspectRatio: "3:4",
43654
43749
  promptPrefix: "Single photorealistic studio composite of the SAME person from the reference image as a three-age triptych, shoulder-to-shoulder left to right: around age 10, around age 40, and around age 75. Editorial portrait photography, 85mm lens at f/2.8, each figure framed chest-up, facing camera with the same calm expression. CRITICAL identity lock \u2014 same eyes, eye color, brow, nose, ears, jawline and facial bone structure across all three, unmistakably the same person; age ONLY via skin texture, fine lines, hairline, hair color (darker in youth, greying with age), and a slight shift in facial fullness. Age-appropriate clothing per stage. Even soft cinematic studio key light with gentle rim separation, clean dark-grey gradient seamless backdrop, refined neutral grade, natural skin tones, tack-sharp facial detail; the three figures fill the frame.",
43655
43750
  negativePrompt: "different person, inconsistent face between figures, distorted features, identity drift across ages, wrong eye color, plastic skin, deformed, blurry, lowres, watermark, text"
@@ -43661,7 +43756,7 @@ var GENERATE_IMAGE_PRESETS = [
43661
43756
  description: "Monochrome age line-up. Needs a reference photo.",
43662
43757
  group: "Portrait Transformations",
43663
43758
  data: {
43664
- provider: "nano-banana-pro",
43759
+ provider: "gpt-image-2",
43665
43760
  aspectRatio: "3:4",
43666
43761
  promptPrefix: "Single black-and-white photorealistic studio composite of the SAME person from the reference image rendered at five stages of life, shoulder-to-shoulder left to right in a smooth age progression: around 7, 15, 27, 45, and 70. Fine-art monochrome portraiture, 85mm lens at f/2.8, chest-up framing, all facing camera with the same calm expression. CRITICAL identity lock \u2014 same eyes, brow, nose, ears, jawline and facial bone structure across every figure, unmistakably the same person; age ONLY via skin texture, fine lines, hairline, greying hair, and a slight shift in facial fullness. Age-appropriate clothing per stage. Even soft studio key light with gentle rim separation, clean dark-grey gradient backdrop. Deep tonal range from rich blacks to clean highlights, fine silver-gelatin film grain, tack-sharp facial detail; the five figures fill the frame.",
43667
43762
  negativePrompt: "color, color tint, different person, inconsistent face between figures, distorted features, identity drift across ages, plastic skin, deformed, blurry, lowres, watermark, text"
@@ -43673,7 +43768,7 @@ var GENERATE_IMAGE_PRESETS = [
43673
43768
  description: "Same person across the '80s\u20132020s. Needs a reference photo.",
43674
43769
  group: "Portrait Transformations",
43675
43770
  data: {
43676
- provider: "nano-banana-pro",
43771
+ provider: "gpt-image-2",
43677
43772
  aspectRatio: "3:4",
43678
43773
  promptPrefix: "Single photorealistic studio composite of the SAME person from the reference image across five decades, shoulder-to-shoulder left to right with a smooth age progression and period-accurate styling: a 1980s child, a 1990s teen, a 2000s young adult, a 2010s adult, and a 2020s mature adult. Editorial portrait photography, 85mm lens at f/2.8, chest-up framing, all facing camera with the same calm expression. CRITICAL identity lock \u2014 same eyes, eye color, brow, nose, ears, jawline and facial bone structure across every figure, unmistakably the same person; age ONLY via skin texture, fine lines, hairline, hair color, and a slight shift in facial fullness. Style each to its decade in hair and wardrobe with a subtle period-accurate film treatment per decade: 1980s bold colors and big hair, 1990s casual grunge, 2000s frosted tips, 2010s clean modern, 2020s contemporary. Even soft studio key with gentle rim separation, clean dark-grey gradient seamless backdrop, natural skin tones, tack-sharp facial detail; the five figures fill the frame.",
43679
43774
  negativePrompt: "different person, inconsistent face between figures, distorted features, identity drift across decades, anachronistic styling, plastic skin, deformed, blurry, lowres, watermark, text"
@@ -43685,7 +43780,7 @@ var GENERATE_IMAGE_PRESETS = [
43685
43780
  description: "Same person in spring / summer / autumn / winter. Needs a reference photo.",
43686
43781
  group: "Portrait Transformations",
43687
43782
  data: {
43688
- provider: "nano-banana-pro",
43783
+ provider: "gpt-image-2",
43689
43784
  aspectRatio: "3:4",
43690
43785
  promptPrefix: "Single photorealistic studio composite of the SAME person from the reference image in four seasonal looks, shoulder-to-shoulder left to right: spring, summer, autumn, and winter. Editorial portrait photography, 85mm lens at f/2.8, chest-up framing, all facing camera with the same calm expression, all at the SAME age as the reference \u2014 this is seasons, not aging. CRITICAL identity lock \u2014 same eyes, eye color, brow, nose, ears, jawline and facial bone structure across all four figures, unmistakably the same person; ONLY wardrobe, hair styling and a subtle seasonal color grade change. Spring: light pastel layers, fresh airy tone. Summer: light tee, warm sunny tone. Autumn: knit sweater, golden amber tone. Winter: coat and scarf, cool crisp tone. Even soft studio key light with a gentle seasonal color cast and rim separation per figure, clean dark-grey gradient seamless backdrop, natural skin tones, tack-sharp facial detail; the four figures fill the frame.",
43691
43786
  negativePrompt: "different person, inconsistent face between figures, distorted features, aging, age differences between figures, plastic skin, deformed, blurry, lowres, watermark, text"
@@ -43697,7 +43792,7 @@ var GENERATE_IMAGE_PRESETS = [
43697
43792
  description: "Same person at dawn / midday / golden hour / night. Needs a reference photo.",
43698
43793
  group: "Portrait Transformations",
43699
43794
  data: {
43700
- provider: "nano-banana-pro",
43795
+ provider: "gpt-image-2",
43701
43796
  aspectRatio: "3:4",
43702
43797
  promptPrefix: "Single photorealistic composite of the SAME person from the reference image across four times of day, shoulder-to-shoulder left to right: dawn, midday, golden hour, and night. Editorial portrait photography, 85mm lens at f/2.8, chest-up framing, all facing camera with the same calm expression, all at the SAME age as the reference. CRITICAL identity lock \u2014 same eyes, eye color, brow, nose, ears, jawline and facial bone structure across all four figures, unmistakably the same person; ONLY the lighting and color temperature change between figures. Dawn: soft cool blue light. Midday: bright neutral daylight. Golden hour: warm amber backlight with a gentle glow. Night: moody low light with a cool rim. Consistent chest-up framing and a clean dark-grey gradient seamless backdrop, natural skin tones, tack-sharp facial detail; the four figures fill the frame.",
43703
43798
  negativePrompt: "different person, inconsistent face between figures, distorted features, aging, age differences between figures, blown highlights, plastic skin, deformed, blurry, lowres, watermark, text"
@@ -43709,7 +43804,7 @@ var GENERATE_IMAGE_PRESETS = [
43709
43804
  description: "You in an oversized team jersey, studio editorial. Needs a reference photo.",
43710
43805
  group: "Portrait Transformations",
43711
43806
  data: {
43712
- provider: "nano-banana-pro",
43807
+ provider: "nano-banana-2-1",
43713
43808
  aspectRatio: "4:5",
43714
43809
  prompt: "Premium studio editorial portrait of the SAME person from the reference image wearing an oversized modern football jersey in the colors of {team || deep crimson and gold}. Sports-fashion editorial photography, 85mm lens at f/2, shallow depth of field with the subject tack-sharp against a softly blurred background. CRITICAL identity lock \u2014 same eyes, brow, nose, ears, jawline and facial bone structure, unmistakably the same person, exact skin tone preserved. Soft directional stadium-spotlight key with natural shadow depth and a subtle rim; gradient backdrop in the jersey colors with a faint geometric pattern and soft pitch markings; gentle atmospheric haze and light film grain. Confident, relaxed three-quarter pose, rich saturated grade. Crisp fabric weave and clean jersey graphics.",
43715
43810
  negativePrompt: "different person, inconsistent face, distorted features, altered skin tone, distorted or garbled logo, misspelled team name, deformed, extra fingers, blurry, lowres, watermark, text artifacts"
@@ -43717,10 +43812,99 @@ var GENERATE_IMAGE_PRESETS = [
43717
43812
  },
43718
43813
  // ── Stylized Subject + Edits (shared with the deprecating modify-image) ──
43719
43814
  // Transform patterns — work here when a reference image is connected
43720
- // (nano-banana-pro edits it while preserving untouched regions). The
43815
+ // (GPT Image 2.5 Flare edits it while preserving untouched regions). The
43721
43816
  // instruction lives in the prompt, not `style`.
43722
43817
  ...stylizedSubjectFor("generate-image"),
43723
- ...editsFor("generate-image")
43818
+ ...editsFor("generate-image"),
43819
+ // ── Realism & Authentic ──────────────────────────────────────────────────
43820
+ {
43821
+ id: "generate-image/unretouched-portrait",
43822
+ name: "Unretouched Portrait",
43823
+ description: "Straight-on head-and-shoulders portrait, real skin, everyday finish.",
43824
+ group: "Realism & Authentic",
43825
+ data: {
43826
+ ...REALISM_MODEL,
43827
+ aspectRatio: "3:4",
43828
+ prompt: sentences("{subject || An adult woman in her thirties with dark shoulder-length hair}, a straight-on head-and-shoulders portrait at eye level against a plain pale wall, soft daylight from one side.", REALISM_SKIN, REALISM_FINISH)
43829
+ }
43830
+ },
43831
+ {
43832
+ id: "generate-image/phone-selfie",
43833
+ name: "Phone Selfie",
43834
+ description: "Eye-level, arm's-length self-portrait look.",
43835
+ group: "Realism & Authentic",
43836
+ data: {
43837
+ ...REALISM_MODEL,
43838
+ aspectRatio: "3:4",
43839
+ prompt: sentences("{subject || An adult woman in her late twenties with her hair tied back}, {setting || on a couch at home, a cushion and a lamp behind}.", realismViewpoint(NEUTRAL_PERSON), realismEmptyHands(NEUTRAL_PERSON), REALISM_SKIN, REALISM_FINISH)
43840
+ }
43841
+ },
43842
+ {
43843
+ id: "generate-image/candid-snapshot",
43844
+ name: "Candid Phone Snapshot",
43845
+ description: "Caught mid-moment, an everyday snapshot.",
43846
+ group: "Realism & Authentic",
43847
+ data: {
43848
+ ...REALISM_MODEL,
43849
+ aspectRatio: "3:4",
43850
+ prompt: sentences("{subject || An adult man in his thirties} caught mid-moment, not posing, glancing away, the framing a little crooked, part of the scene cut by the edge, {setting || at a kitchen table at home}.", REALISM_SKIN, REALISM_FINISH)
43851
+ }
43852
+ },
43853
+ {
43854
+ id: "generate-image/mirror-selfie",
43855
+ name: "Mirror Selfie",
43856
+ description: "Mirror self-portrait, phone in hand.",
43857
+ group: "Realism & Authentic",
43858
+ data: {
43859
+ ...REALISM_MODEL,
43860
+ aspectRatio: "9:16",
43861
+ prompt: sentences("{subject || An adult woman in her twenties} photographs their reflection in a full-length mirror {setting || in a hallway at home}, a phone held at chest height with its back toward the mirror.", REALISM_SKIN, REALISM_FINISH)
43862
+ }
43863
+ },
43864
+ {
43865
+ id: "generate-image/creator-at-home",
43866
+ name: "Creator at Home \xB7 Waist-Up",
43867
+ description: "A waist-up reference of the same person \u2014 wire a face photo into the references.",
43868
+ group: "Realism & Authentic",
43869
+ data: {
43870
+ ...REALISM_MODEL,
43871
+ aspectRatio: "9:16",
43872
+ prompt: sentences("Waist-up photo of {image:1:person}, an adult, standing at home in front of a plain wall, arms relaxed, empty hands.", REALISM_SKIN, REALISM_FINISH)
43873
+ }
43874
+ },
43875
+ {
43876
+ id: "generate-image/video-call-frame",
43877
+ name: "Webcam / Video-Call Frame",
43878
+ description: "Chest-up video-call framing.",
43879
+ group: "Realism & Authentic",
43880
+ data: {
43881
+ ...REALISM_MODEL,
43882
+ aspectRatio: "16:9",
43883
+ prompt: sentences("{subject || An adult man in his forties}, chest-up, a little off-centre, slightly wide, seen from a fixed point just above eye level about an arm's length away, a softly lit room behind, flat even light from the front.", REALISM_FINISH)
43884
+ }
43885
+ },
43886
+ {
43887
+ id: "generate-image/macro-skin-study",
43888
+ name: "Macro Skin Study",
43889
+ description: "A close study of one area of skin.",
43890
+ group: "Realism & Authentic",
43891
+ data: {
43892
+ ...SKIN_STUDY_MODEL,
43893
+ aspectRatio: "1:1",
43894
+ prompt: sentences("{feature || the left cheek and the side of the nose} of {subject || an adult woman in her thirties}, filling the frame, everything sharp front to back, flat cool daylight, neutral colour, a plain study of the skin, not a glamour shot.", REALISM_SKIN)
43895
+ }
43896
+ },
43897
+ {
43898
+ id: "generate-image/product-in-hand",
43899
+ name: "Product in Hand \u2014 phone photo",
43900
+ description: "Wire a photo of the product into the references.",
43901
+ group: "Realism & Authentic",
43902
+ data: {
43903
+ ...REALISM_MODEL,
43904
+ aspectRatio: "3:4",
43905
+ prompt: sentences("{subject || An adult woman in her thirties} holds {image:1:product} at chest height toward the viewer, label facing out, {setting || in a bright room at home}.", REALISM_FINISH)
43906
+ }
43907
+ }
43724
43908
  ];
43725
43909
 
43726
43910
  // src/factory-presets/generate-video.ts
@@ -46179,6 +46363,16 @@ var IMAGE_TO_TEXT_PRESETS = [
46179
46363
  description: "Image \u2192 text-to-image prompt.",
46180
46364
  group: "Creative",
46181
46365
  data: { detailLevel: "detailed", customPrompt: "Describe this image as a detailed text-to-image generation prompt: subject, style, lighting, composition and lens. Return only the prompt." }
46366
+ },
46367
+ {
46368
+ id: "image-to-text/realism-audit",
46369
+ name: "Realism Audit",
46370
+ description: "Lists the signs an image was generated, with a count.",
46371
+ group: "Creative",
46372
+ data: {
46373
+ detailLevel: "structured",
46374
+ customPrompt: 'Check this image for signs that it was generated rather than photographed. Answer each question yes or no, with a few words why. 1. Is the skin smooth, waxy or airbrushed, with no visible pores? 2. Is the face unusually symmetrical, or are the teeth unnaturally even and white? 3. Are any hands or fingers malformed, merged or the wrong count? 4. Is any text, logo or sign garbled? 5. Is the background blurred far more than an everyday snapshot would be? 6. Are the catchlights in the eyes perfect rings, or identical in both eyes? 7. Is the hair uniformly perfect, with no flyaways? 8. Do edges look over-sharpened or haloed? 9. Is there a glow or bloom on the skin? 10. Do shadows or reflections disagree with the light? Finish with one line: "Tells found: N of 10".'
46375
+ }
46182
46376
  }
46183
46377
  ];
46184
46378
 
@@ -46824,12 +47018,17 @@ function groupFactoryPresets(presets) {
46824
47018
  }
46825
47019
 
46826
47020
  // src/factory-presets/index.ts
47021
+ function forModifyImage(p) {
47022
+ const provider = p.data.provider;
47023
+ const imageToImage = typeof provider === "string" ? shared.T2I_TO_I2I_VARIANT[provider] : void 0;
47024
+ return imageToImage ? { ...p, data: { ...p.data, provider: imageToImage } } : p;
47025
+ }
46827
47026
  var FACTORY_PRESETS = {
46828
47027
  "generate-image": GENERATE_IMAGE_PRESETS,
46829
47028
  // modify-image shares the Stylized Subject + Edits catalogs with generate-image
46830
47029
  // (single source of truth in STYLIZED_SUBJECT / IMAGE_EDITS). modify-image is
46831
47030
  // slated for deprecation in favor of generate-image — when removed, drop this key.
46832
- "modify-image": [...stylizedSubjectFor("modify-image"), ...editsFor("modify-image")],
47031
+ "modify-image": [...stylizedSubjectFor("modify-image"), ...editsFor("modify-image")].map(forModifyImage),
46833
47032
  "generate-video": GENERATE_VIDEO_PRESETS,
46834
47033
  "text-to-speech": TEXT_TO_SPEECH_PRESETS,
46835
47034
  "text-to-audio": TEXT_TO_AUDIO_PRESETS,
@@ -47479,23 +47678,23 @@ function planFrameDelivery(args) {
47479
47678
  ...requested === "reference" && !args.supportsReferenceImages ? { refusedReason: "no-reference-support" } : {}
47480
47679
  };
47481
47680
  }
47482
- const cap = shared.VIDEO_REF_LIMITS_BY_PROVIDER[args.provider ?? ""]?.images;
47483
- if (cap !== void 0 && userRefs.length + frames.length > cap) {
47681
+ const cap2 = shared.VIDEO_REF_LIMITS_BY_PROVIDER[args.provider ?? ""]?.images;
47682
+ if (cap2 !== void 0 && userRefs.length + frames.length > cap2) {
47484
47683
  return { delivery: "frame", referenceImageUrls: userRefs, promptSuffix: "", refusedReason: "image-cap" };
47485
47684
  }
47486
47685
  const referenceImageUrls = [...userRefs];
47487
- const sentences = [];
47686
+ const sentences2 = [];
47488
47687
  if (args.startFrameUrl) {
47489
47688
  referenceImageUrls.push(args.startFrameUrl);
47490
47689
  if (!promptBindsFirstFrame(args.prompt)) {
47491
- sentences.push(REF_BINDING.frame(referenceImageUrls.length, "opening"));
47690
+ sentences2.push(REF_BINDING.frame(referenceImageUrls.length, "opening"));
47492
47691
  }
47493
47692
  }
47494
47693
  if (args.endFrameUrl) {
47495
47694
  referenceImageUrls.push(args.endFrameUrl);
47496
- sentences.push(REF_BINDING.frame(referenceImageUrls.length, "closing"));
47695
+ sentences2.push(REF_BINDING.frame(referenceImageUrls.length, "closing"));
47497
47696
  }
47498
- return { delivery: "reference", referenceImageUrls, promptSuffix: sentences.join(" ") };
47697
+ return { delivery: "reference", referenceImageUrls, promptSuffix: sentences2.join(" ") };
47499
47698
  }
47500
47699
 
47501
47700
  // src/character-motion-diagnostics.ts
@@ -47779,6 +47978,7 @@ exports.MUSIC_GENRE_DEFAULT_DATA = MUSIC_GENRE_DEFAULT_DATA;
47779
47978
  exports.MUSIC_MOOD_DEFAULT_DATA = MUSIC_MOOD_DEFAULT_DATA;
47780
47979
  exports.MUSIC_VIBES = MUSIC_VIBES;
47781
47980
  exports.MUSIC_WIZARD_CATEGORIES = MUSIC_WIZARD_CATEGORIES;
47981
+ exports.NEUTRAL_PERSON = NEUTRAL_PERSON;
47782
47982
  exports.NODE_PROMPT_CANDIDATE_FIELDS = NODE_PROMPT_CANDIDATE_FIELDS;
47783
47983
  exports.NODE_PROMPT_FIELDS = NODE_PROMPT_FIELDS;
47784
47984
  exports.OBJECT_ANGLE_PRESETS = OBJECT_ANGLE_PRESETS;
@@ -47822,6 +48022,9 @@ exports.PROMPT_AFFIX_NODE_TYPES = PROMPT_AFFIX_NODE_TYPES;
47822
48022
  exports.PROMPT_HINT_SEPARATOR = PROMPT_HINT_SEPARATOR;
47823
48023
  exports.PROVIDER_CAPABILITIES = PROVIDER_CAPABILITIES;
47824
48024
  exports.PROVIDER_PROMPT_DOCTRINES = PROVIDER_PROMPT_DOCTRINES;
48025
+ exports.REALISM_FINISH = REALISM_FINISH;
48026
+ exports.REALISM_PASS_INSTRUCTION = REALISM_PASS_INSTRUCTION;
48027
+ exports.REALISM_SKIN = REALISM_SKIN;
47825
48028
  exports.REFERENCE_IMAGE_ROLES = REFERENCE_IMAGE_ROLES;
47826
48029
  exports.REFERENCE_RULES = REFERENCE_RULES;
47827
48030
  exports.REFERENCE_RULES_MULTI_PERSON = REFERENCE_RULES_MULTI_PERSON;
@@ -48274,6 +48477,8 @@ exports.readDirectionFields = readDirectionFields;
48274
48477
  exports.readStructuredFields = readStructuredFields;
48275
48478
  exports.readSubjectFields = readSubjectFields;
48276
48479
  exports.readTransitionOptionValues = readTransitionOptionValues;
48480
+ exports.realismEmptyHands = realismEmptyHands;
48481
+ exports.realismViewpoint = realismViewpoint;
48277
48482
  exports.referenceDescriptionLine = referenceDescriptionLine;
48278
48483
  exports.referenceRulesBlock = referenceRulesBlock;
48279
48484
  exports.registerCatalogPack = registerCatalogPack;