@nodaro/prompts 1.35.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}.`);
@@ -25669,17 +25669,17 @@ function composeVideoPromptText(userPrompt, direction, structured, opts) {
25669
25669
  ].filter((c) => c.text.length > 0);
25670
25670
  const structuredFragment = structured ? renderStructuredFields(structured) : "";
25671
25671
  const composeWith = (kept2) => composeSectionedPrompt(userPrompt, hintClauses.slice(0, kept2), structuredFragment);
25672
- const cap = opts?.cap;
25673
- if (cap === void 0) return composeWith(hintClauses.length);
25672
+ const cap2 = opts?.cap;
25673
+ if (cap2 === void 0) return composeWith(hintClauses.length);
25674
25674
  const frame = opts?.frame ?? ((body2) => body2);
25675
25675
  let kept = hintClauses.length;
25676
25676
  let body = composeWith(kept);
25677
25677
  let framedLength = frame(body)?.length ?? 0;
25678
- if (framedLength <= cap) return body;
25678
+ if (framedLength <= cap2) return body;
25679
25679
  const costs = sectionedClauseCosts(userPrompt, hintClauses, structuredFragment);
25680
25680
  const texts = hintClauses.map((c) => c.text);
25681
- while (framedLength > cap && kept > 0) {
25682
- kept = keepableDirectionHints(texts, kept, framedLength - cap, costs);
25681
+ while (framedLength > cap2 && kept > 0) {
25682
+ kept = keepableDirectionHints(texts, kept, framedLength - cap2, costs);
25683
25683
  body = composeWith(kept);
25684
25684
  framedLength = frame(body)?.length ?? 0;
25685
25685
  }
@@ -40860,8 +40860,8 @@ ${buildPickerLegend(spec)}`);
40860
40860
  function buildPickerLegend(spec) {
40861
40861
  const lines = [];
40862
40862
  for (const d of spec.dimensions) {
40863
- const cap = d.limit > 1 ? `up to ${d.limit}` : "one";
40864
- 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})`);
40865
40865
  for (const e of d.legend) {
40866
40866
  lines.push(`- ${e.id}: ${e.label}${e.description ? ` \u2014 ${e.description}` : ""}`);
40867
40867
  }
@@ -41181,7 +41181,7 @@ var KLING_AUDIO_DOCTRINE = {
41181
41181
  };
41182
41182
  var MINIMAX_H3_DOCTRINE = {
41183
41183
  providers: ["minimax-h3"],
41184
- heading: "MiniMax Hailuo 3 (minimax-h3)",
41184
+ heading: "MiniMax H3 (minimax-h3)",
41185
41185
  tips: [
41186
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.",
41187
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).",
@@ -41572,11 +41572,11 @@ function buildScene3DUnreferencedFiguresWarning(check2) {
41572
41572
  const figureWord = figures === 1 ? "figure" : "figures";
41573
41573
  const refWord = refs === 1 ? "character reference is" : "character references are";
41574
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)`;
41575
- const cap = check2.imageReferenceCap;
41576
- if (typeof cap === "number" && Number.isFinite(cap) && cap > 0) {
41575
+ const cap2 = check2.imageReferenceCap;
41576
+ if (typeof cap2 === "number" && Number.isFinite(cap2) && cap2 > 0) {
41577
41577
  const seats = Math.max(0, Math.floor(check2.layoutReferenceImageSeats ?? 0));
41578
- const spare = cap - seats - figures;
41579
- 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.`;
41580
41580
  } else {
41581
41581
  message += ".";
41582
41582
  }
@@ -41767,7 +41767,7 @@ var PROVIDER_CAPABILITIES = {
41767
41767
  "seedance-2-fast": "Seedance 2.0 Fast \u2014 same multimodal + audio capabilities, cheaper and quicker",
41768
41768
  "seedance-2-mini": "Seedance 2.0 Mini \u2014 same multimodal + audio capabilities, budget tier, 480p/720p, 4-15s",
41769
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",
41770
- "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",
41771
41771
  "wan": "Versatile, good for animations and transformations",
41772
41772
  "wan-turbo": "Faster Wan generation",
41773
41773
  "hailuo-standard": "Standard quality, cost-effective",
@@ -41798,7 +41798,7 @@ var PROVIDER_CAPABILITIES = {
41798
41798
  "seedance-2-fast": "Seedance 2.0 Fast \u2014 same capabilities, cheaper and quicker",
41799
41799
  "seedance-2-mini": "Seedance 2.0 Mini \u2014 same capabilities, budget tier, 480p/720p",
41800
41800
  "seedance-2-5": "Seedance 2.5 \u2014 start/end frame + wide multimodal refs, native audio, up to 30s, 480p/720p/1080p",
41801
- "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",
41802
41802
  "hailuo-2.3-pro": "Premium Hailuo animation",
41803
41803
  "hailuo-2.3": "Standard Hailuo animation",
41804
41804
  "hailuo-standard": "Cost-effective animation",
@@ -42085,6 +42085,19 @@ var PROMPT_AFFIX_NODE_TYPES = new Set(
42085
42085
  Object.entries(NODE_PROMPT_FIELDS).filter(([, s]) => s.affixes !== false).map(([t]) => t)
42086
42086
  );
42087
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
+
42088
42101
  // src/factory-presets/shared-image.ts
42089
42102
  var STYLIZED_SUBJECT = [
42090
42103
  {
@@ -42217,6 +42230,47 @@ var IMAGE_EDITS = [
42217
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.",
42218
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"
42219
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
+ }
42220
42274
  }
42221
42275
  ];
42222
42276
  function editsFor(nodeType) {
@@ -42230,6 +42284,9 @@ function editsFor(nodeType) {
42230
42284
  }
42231
42285
 
42232
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" };
42233
42290
  var GENERATE_IMAGE_PRESETS = [
42234
42291
  // ── Reference Sheet ──────────────────────────────────────────────────────
42235
42292
  {
@@ -42386,6 +42443,22 @@ var GENERATE_IMAGE_PRESETS = [
42386
42443
  negativePrompt: "illustration, cartoon, 3d render, garbled text, misspelled labels, watermark, deformed anatomy, inconsistent markings between panels, wrong breed, blurry, low resolution"
42387
42444
  }
42388
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
+ },
42389
42462
  // ── Cast & Consistency (clean grids per the multi-character workflow:
42390
42463
  // sterile neutral-background reference grids built to be FED BACK as identity
42391
42464
  // anchors — unlike the editorial boards above, decoration here is noise.
@@ -43742,7 +43815,96 @@ var GENERATE_IMAGE_PRESETS = [
43742
43815
  // (GPT Image 2.5 Flare edits it while preserving untouched regions). The
43743
43816
  // instruction lives in the prompt, not `style`.
43744
43817
  ...stylizedSubjectFor("generate-image"),
43745
- ...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
+ }
43746
43908
  ];
43747
43909
 
43748
43910
  // src/factory-presets/generate-video.ts
@@ -46201,6 +46363,16 @@ var IMAGE_TO_TEXT_PRESETS = [
46201
46363
  description: "Image \u2192 text-to-image prompt.",
46202
46364
  group: "Creative",
46203
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
+ }
46204
46376
  }
46205
46377
  ];
46206
46378
 
@@ -46846,12 +47018,17 @@ function groupFactoryPresets(presets) {
46846
47018
  }
46847
47019
 
46848
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
+ }
46849
47026
  var FACTORY_PRESETS = {
46850
47027
  "generate-image": GENERATE_IMAGE_PRESETS,
46851
47028
  // modify-image shares the Stylized Subject + Edits catalogs with generate-image
46852
47029
  // (single source of truth in STYLIZED_SUBJECT / IMAGE_EDITS). modify-image is
46853
47030
  // slated for deprecation in favor of generate-image — when removed, drop this key.
46854
- "modify-image": [...stylizedSubjectFor("modify-image"), ...editsFor("modify-image")],
47031
+ "modify-image": [...stylizedSubjectFor("modify-image"), ...editsFor("modify-image")].map(forModifyImage),
46855
47032
  "generate-video": GENERATE_VIDEO_PRESETS,
46856
47033
  "text-to-speech": TEXT_TO_SPEECH_PRESETS,
46857
47034
  "text-to-audio": TEXT_TO_AUDIO_PRESETS,
@@ -47501,23 +47678,23 @@ function planFrameDelivery(args) {
47501
47678
  ...requested === "reference" && !args.supportsReferenceImages ? { refusedReason: "no-reference-support" } : {}
47502
47679
  };
47503
47680
  }
47504
- const cap = shared.VIDEO_REF_LIMITS_BY_PROVIDER[args.provider ?? ""]?.images;
47505
- 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) {
47506
47683
  return { delivery: "frame", referenceImageUrls: userRefs, promptSuffix: "", refusedReason: "image-cap" };
47507
47684
  }
47508
47685
  const referenceImageUrls = [...userRefs];
47509
- const sentences = [];
47686
+ const sentences2 = [];
47510
47687
  if (args.startFrameUrl) {
47511
47688
  referenceImageUrls.push(args.startFrameUrl);
47512
47689
  if (!promptBindsFirstFrame(args.prompt)) {
47513
- sentences.push(REF_BINDING.frame(referenceImageUrls.length, "opening"));
47690
+ sentences2.push(REF_BINDING.frame(referenceImageUrls.length, "opening"));
47514
47691
  }
47515
47692
  }
47516
47693
  if (args.endFrameUrl) {
47517
47694
  referenceImageUrls.push(args.endFrameUrl);
47518
- sentences.push(REF_BINDING.frame(referenceImageUrls.length, "closing"));
47695
+ sentences2.push(REF_BINDING.frame(referenceImageUrls.length, "closing"));
47519
47696
  }
47520
- return { delivery: "reference", referenceImageUrls, promptSuffix: sentences.join(" ") };
47697
+ return { delivery: "reference", referenceImageUrls, promptSuffix: sentences2.join(" ") };
47521
47698
  }
47522
47699
 
47523
47700
  // src/character-motion-diagnostics.ts
@@ -47801,6 +47978,7 @@ exports.MUSIC_GENRE_DEFAULT_DATA = MUSIC_GENRE_DEFAULT_DATA;
47801
47978
  exports.MUSIC_MOOD_DEFAULT_DATA = MUSIC_MOOD_DEFAULT_DATA;
47802
47979
  exports.MUSIC_VIBES = MUSIC_VIBES;
47803
47980
  exports.MUSIC_WIZARD_CATEGORIES = MUSIC_WIZARD_CATEGORIES;
47981
+ exports.NEUTRAL_PERSON = NEUTRAL_PERSON;
47804
47982
  exports.NODE_PROMPT_CANDIDATE_FIELDS = NODE_PROMPT_CANDIDATE_FIELDS;
47805
47983
  exports.NODE_PROMPT_FIELDS = NODE_PROMPT_FIELDS;
47806
47984
  exports.OBJECT_ANGLE_PRESETS = OBJECT_ANGLE_PRESETS;
@@ -47844,6 +48022,9 @@ exports.PROMPT_AFFIX_NODE_TYPES = PROMPT_AFFIX_NODE_TYPES;
47844
48022
  exports.PROMPT_HINT_SEPARATOR = PROMPT_HINT_SEPARATOR;
47845
48023
  exports.PROVIDER_CAPABILITIES = PROVIDER_CAPABILITIES;
47846
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;
47847
48028
  exports.REFERENCE_IMAGE_ROLES = REFERENCE_IMAGE_ROLES;
47848
48029
  exports.REFERENCE_RULES = REFERENCE_RULES;
47849
48030
  exports.REFERENCE_RULES_MULTI_PERSON = REFERENCE_RULES_MULTI_PERSON;
@@ -48296,6 +48477,8 @@ exports.readDirectionFields = readDirectionFields;
48296
48477
  exports.readStructuredFields = readStructuredFields;
48297
48478
  exports.readSubjectFields = readSubjectFields;
48298
48479
  exports.readTransitionOptionValues = readTransitionOptionValues;
48480
+ exports.realismEmptyHands = realismEmptyHands;
48481
+ exports.realismViewpoint = realismViewpoint;
48299
48482
  exports.referenceDescriptionLine = referenceDescriptionLine;
48300
48483
  exports.referenceRulesBlock = referenceRulesBlock;
48301
48484
  exports.registerCatalogPack = registerCatalogPack;