@nodaro/prompts 1.12.0 → 1.14.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 +389 -194
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +244 -29
- package/dist/index.d.ts +244 -29
- package/dist/index.js +377 -196
- package/dist/index.js.map +1 -1
- package/package.json +2 -2
- package/src/__tests__/assemble-image-input-cap.test.ts +37 -13
- package/src/__tests__/assemble-image-input.test.ts +100 -19
- package/src/__tests__/assemble-video-input-cap.test.ts +101 -15
- package/src/__tests__/assemble-video-input.test.ts +167 -33
- package/src/__tests__/direction-hint-token-safety.test.ts +21 -0
- package/src/__tests__/multi-picker-spec.test.ts +21 -1
- package/src/__tests__/person-regional-aesthetic.test.ts +2 -1
- package/src/__tests__/prompt-style-section.test.ts +345 -0
- package/src/__tests__/provider-prompt-doctrine.test.ts +39 -0
- package/src/__tests__/style-section-boundary.test.ts +179 -0
- package/src/__tests__/subject-fold.test.ts +32 -13
- package/src/assemble-image-input.ts +51 -26
- package/src/assemble-video-input.ts +54 -34
- package/src/direction-registry.ts +108 -37
- package/src/gemini-omni-inputs.ts +11 -3
- package/src/held-prop.ts +1 -0
- package/src/hint-shedding.ts +23 -4
- package/src/index.ts +1 -0
- package/src/person.ts +4 -0
- package/src/picker-analyzer-registry.ts +37 -0
- package/src/prompt-builder.ts +84 -27
- package/src/prompt-hint-join.ts +9 -0
- package/src/prompt-style-section.ts +256 -0
- package/src/prompt-wizard-categories.ts +6 -0
- package/src/provider-prompt-doctrine.ts +51 -2
- package/src/setting.ts +1 -0
- package/src/style.ts +1 -0
- package/src/styling.ts +5 -1
- package/src/video-reference-resolver.ts +5 -2
package/dist/index.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { ANIMAL_SUBCATEGORY_LABELS, ANIMAL_SUBCATEGORY_ORDER, VEHICLE_SUBCATEGORY_LABELS, VEHICLE_SUBCATEGORY_ORDER, WEAPON_SUBCATEGORY_LABELS, WEAPON_SUBCATEGORY_ORDER, FURNITURE_SUBCATEGORY_LABELS, FURNITURE_SUBCATEGORY_ORDER,
|
|
1
|
+
import { ANIMAL_SUBCATEGORY_LABELS, ANIMAL_SUBCATEGORY_ORDER, VEHICLE_SUBCATEGORY_LABELS, VEHICLE_SUBCATEGORY_ORDER, WEAPON_SUBCATEGORY_LABELS, WEAPON_SUBCATEGORY_ORDER, FURNITURE_SUBCATEGORY_LABELS, FURNITURE_SUBCATEGORY_ORDER, SOCIAL_POST_NODE_TYPES, FURNITURE, WEAPONS, VEHICLES, ANIMALS, PASSTHROUGH_TYPES, registerCatalogSidecars, resetCatalogSidecars, pickIds, getAnimalPromptHint, getFurniture, getWeapon, getVehicle, DEFAULT_USAGE_MODE, usageModeDirective, DEFAULT_LOCATION_USAGE_MODE, imageReferenceLimit, knownImageSlugsFromRefs, findImageMentionTokens, knownEntitySlugsFromRefs, findEntityMentionTokens, findCharacterMentionTokens, findLocationMentionTokens, NATIVE_NEGATIVE_PROMPT_MODELS, getMaxNegativePromptChars, getMaxImagePromptChars, MODELS_WITH_REFERENCE_IMAGE_SUPPORT, getAnimalTerm, roleToPhrase, resolveDefaultRole, SEEDANCE_2_REF_LIMITS, NON_EN_LOCALE_IDS, readPromptAffixes, setRegisteredPersonPackFields, PLACEHOLDER_CHARACTER_NAME, REFERENCE_ROLE_PRESETS, imageMentionSlugForRef, entityMentionSlugForRef, defaultRoleForSource, locationReferencePhotoKindLabel, VIDEO_REF_LIMITS_BY_PROVIDER, resolveNodeRefs, normalizeRoleSlug } from '@nodaro/shared';
|
|
2
2
|
|
|
3
3
|
var __defProp = Object.defineProperty;
|
|
4
4
|
var __export = (target, all) => {
|
|
@@ -1764,7 +1764,8 @@ var STYLES = [
|
|
|
1764
1764
|
{ id: "pastel", label: "Pastel", description: "Degas-era soft chalk pastel", promptHint: "rendered as a soft chalk pastel drawing, dry powdery pigment laid in feathered strokes on tinted paper with luminous dusty colors, gently blended edges and the dreamy Degas-era atmosphere of dancers in stage light", term: "soft pastel drawing" },
|
|
1765
1765
|
{ id: "acrylic-paint", label: "Acrylic Paint", description: "Fast-drying opaque acrylic on canvas", promptHint: "rendered as an acrylic painting on canvas, fast-drying opaque pigment with crisp sharp edges, confident quick brush strokes, high-key saturated color and a flatter more graphic finish than traditional oil paint", term: "acrylic painting" },
|
|
1766
1766
|
{ id: "mixed-media", label: "Mixed Media", description: "Collage + paint + ink hybrid", promptHint: "rendered as a mixed-media artwork combining torn paper collage, acrylic paint, ink and graphite on a layered substrate, heterogeneous textures, visible tape and stitching, and an exuberant hand-assembled studio-art quality" },
|
|
1767
|
-
{ id: "manga", label: "Manga", description: "Inked B&W Japanese comic panel", promptHint: "rendered as inked manga panel art, crisp black ink on white with confident line weight variation, screen-tone dot patterns for shading, dramatic speed lines and the distinctly Japanese black-and-white comic aesthetic \u2014 separate from full-color anime" }
|
|
1767
|
+
{ id: "manga", label: "Manga", description: "Inked B&W Japanese comic panel", promptHint: "rendered as inked manga panel art, crisp black ink on white with confident line weight variation, screen-tone dot patterns for shading, dramatic speed lines and the distinctly Japanese black-and-white comic aesthetic \u2014 separate from full-color anime" },
|
|
1768
|
+
{ id: "early-color-photo", label: "Early Color Photo", description: "Prokudin-Gorsky / autochrome early-1900s color", promptHint: "rendered as an early-1900s color photograph in the Prokudin-Gorsky / autochrome tradition \u2014 soft three-colour-separation registration, muted dye-toned palette, fine grain and a gentle antique warmth", term: "early autochrome color photograph" }
|
|
1768
1769
|
];
|
|
1769
1770
|
var styleById = new Map(STYLES.map((s) => [s.id, s]));
|
|
1770
1771
|
function getStyle(id) {
|
|
@@ -1830,6 +1831,7 @@ var SETTINGS = [
|
|
|
1830
1831
|
{ id: "parking-lot", label: "Parking Lot", category: "urban", description: "Suburban parking lot at dusk", promptHint: "set in an empty suburban parking lot at dusk with sodium-vapor lamps casting orange pools, scattered shopping carts and painted lane lines" },
|
|
1831
1832
|
{ id: "penthouse", label: "Penthouse", category: "urban", description: "Luxury penthouse with skyline view", promptHint: "set in a luxury penthouse interior with panoramic skyline views, marble floors, modernist furniture and low warm ambient light" },
|
|
1832
1833
|
{ id: "gas-station", label: "Gas Station", category: "urban", description: "Lonely highway gas station at night", promptHint: "set at a lonely highway gas station at night with a fluorescent canopy, bug-swarmed sodium lamps and cracked asphalt" },
|
|
1834
|
+
{ id: "open-air-market", label: "Open-Air Market", category: "urban", description: "Bustling market of vendor stalls under canopies", term: "open-air market", promptHint: "set in a bustling open-air market \u2014 rows of vendor stalls under thatched and canvas canopies, produce piled high, warm dusty light and crowds moving between the stalls" },
|
|
1833
1835
|
// -------------------- Nature --------------------
|
|
1834
1836
|
{ id: "forest", label: "Forest Clearing", category: "nature", description: "Sunlit mossy clearing", promptHint: "set in a sunlit forest clearing with moss-covered stones, dappled light through tall trees and a soft carpet of fallen leaves" },
|
|
1835
1837
|
{ id: "beach", label: "Beach", category: "nature", description: "Wide sandy beach with surf", promptHint: "set on a wide sandy beach with gentle breaking surf, footprints in wet sand and a pastel horizon" },
|
|
@@ -2956,6 +2958,9 @@ var PEOPLE = [
|
|
|
2956
2958
|
{ id: "mumbai-bollywood", label: "Mumbai Bollywood", group: "Asia", dimension: "regional-aesthetic", description: "Mumbai Indian film-industry aesthetic", promptHint: "a Mumbai Bollywood aesthetic \u2014 Indian film-industry vibe, vibrant statement-glamour", term: "mumbai bollywood aesthetic" },
|
|
2957
2959
|
{ id: "south-india-traditional", label: "South India Traditional", group: "Asia", dimension: "regional-aesthetic", description: "Tamil / Kerala temple-town classical aesthetic", promptHint: "a South Indian traditional aesthetic \u2014 Tamil / Kerala temple-town vibe, classical refinement", term: "south indian traditional aesthetic" },
|
|
2958
2960
|
{ id: "bangkok-street", label: "Bangkok Street", group: "Asia", dimension: "regional-aesthetic", description: "Bangkok Thai night-market neon-urban aesthetic", promptHint: "a Bangkok street aesthetic \u2014 Thai night-market energy, neon-and-warmth urban vibe", term: "bangkok street aesthetic" },
|
|
2961
|
+
// ----- Central Asia -----
|
|
2962
|
+
{ id: "samarkand-silk-road", label: "Samarkand Silk Road", group: "Central Asia", dimension: "regional-aesthetic", description: "Uzbek Silk Road bazaar aesthetic (Samarkand / Bukhara)", promptHint: "a Central Asian Silk Road aesthetic \u2014 Samarkand / Bukhara bazaar vibe, ikat-and-suzani textiles, sun-baked adobe and blue-tiled madrasa mood", term: "samarkand silk road aesthetic" },
|
|
2963
|
+
{ id: "tashkent-modern", label: "Tashkent Modern", group: "Central Asia", dimension: "regional-aesthetic", description: "Contemporary Uzbek metropolitan Central Asian aesthetic", promptHint: "a modern Tashkent aesthetic \u2014 contemporary Uzbek metropolitan vibe, Soviet-modern-meets-Silk-Road blend, warm steppe-city confidence", term: "tashkent modern aesthetic" },
|
|
2959
2964
|
// ----- Latin America -----
|
|
2960
2965
|
{ id: "carioca-rio", label: "Carioca (Rio)", group: "Latin America", dimension: "regional-aesthetic", description: "Rio de Janeiro beach-and-favela-music Brazilian aesthetic", promptHint: "a Carioca aesthetic \u2014 Rio de Janeiro beach-and-favela-music vibe, sun-warmed Brazilian energy", term: "carioca aesthetic" },
|
|
2961
2966
|
{ id: "paulista", label: "Paulista (S\xE3o Paulo)", group: "Latin America", dimension: "regional-aesthetic", description: "S\xE3o Paulo metropolitan Brazilian creative-class aesthetic", promptHint: "a Paulista aesthetic \u2014 S\xE3o Paulo metropolitan vibe, urban-Brazilian creative-class polish", term: "paulista aesthetic" },
|
|
@@ -3796,6 +3801,9 @@ var STYLINGS = [
|
|
|
3796
3801
|
{ id: "outfit-fairy", label: "Fairy", dimension: "outfit", description: "Fantasy fairy: gauzy wings, flower crown, ethereal dress", promptHint: "wearing a fantasy fairy costume \u2014 gauzy translucent wings, a flower crown, and an ethereal flowing dress", term: "fairy costume with wings" },
|
|
3797
3802
|
{ id: "outfit-mermaid", label: "Mermaid", dimension: "outfit", description: "Fantasy mermaid: scaled tail/skirt, shell top, flowing hair", promptHint: "wearing a fantasy mermaid costume \u2014 a scaled tail or fitted scaled skirt, a shell top, and long flowing hair", term: "mermaid costume" },
|
|
3798
3803
|
{ id: "outfit-pharaoh", label: "Pharaoh Regalia", dimension: "outfit", description: "Ancient Egyptian royalty: usekh collar, pectoral, pleated kilt", promptHint: "wearing ancient Egyptian pharaoh regalia \u2014 a broad beaded usekh collar, a jeweled falcon pectoral, and a pleated linen shendyt kilt with golden arm cuffs" },
|
|
3804
|
+
{ id: "outfit-workwear-overalls", label: "Workwear Overalls", dimension: "outfit", description: "Denim bib overalls over a plaid flannel shirt", promptHint: "dressed in a farmer's workwear outfit \u2014 denim bib overalls over a checked plaid flannel shirt, sturdy and worn-in", term: "denim overalls and plaid shirt" },
|
|
3805
|
+
{ id: "outfit-chapan", label: "Chapan Robe", dimension: "outfit", description: "Central Asian long quilted ikat robe", promptHint: "dressed in a traditional Central Asian chapan \u2014 a long quilted robe with an ikat-striped weave, tied at the waist with a sash" },
|
|
3806
|
+
{ id: "outfit-caftan", label: "Caftan", dimension: "outfit", description: "Long flowing Middle-Eastern / North-African robe", promptHint: "dressed in a long flowing caftan robe, a full-length garment worn across the Middle East and North Africa" },
|
|
3799
3807
|
// -------------------- Top (upper-body garment) --------------------
|
|
3800
3808
|
{ id: "top-tshirt", label: "T-Shirt", dimension: "top", description: "Plain crewneck t-shirt", promptHint: "wearing a fitted plain crewneck t-shirt with short sleeves" },
|
|
3801
3809
|
{ id: "top-tank", label: "Tank Top", dimension: "top", description: "Scoop-neck tank top", promptHint: "wearing a fitted scoop-neck tank top with thin shoulder straps" },
|
|
@@ -3970,6 +3978,8 @@ var STYLING_FIELD_BY_DIMENSION = {
|
|
|
3970
3978
|
"wardrobe-state": "wardrobeState"
|
|
3971
3979
|
};
|
|
3972
3980
|
var MAX_SELECTED_BY_STYLING_DIMENSION = {
|
|
3981
|
+
headwear: 2,
|
|
3982
|
+
// a hat layered over a wrap/turban
|
|
3973
3983
|
jewelry: 3,
|
|
3974
3984
|
"wardrobe-state": 3,
|
|
3975
3985
|
"hair-state": 2
|
|
@@ -6324,7 +6334,8 @@ var HELD_PROPS = [
|
|
|
6324
6334
|
{ id: "flashlight", label: "Flashlight", category: "occupational", description: "Modern flashlight cutting a beam", promptHint: "holding a modern flashlight raised forward in one hand, a sharp white beam cutting through the darkness ahead and side-lighting the face", term: "holding a flashlight raised forward" },
|
|
6325
6335
|
{ id: "compass", label: "Compass", category: "occupational", description: "Vintage handheld nautical compass", promptHint: "holding a vintage brass nautical compass open in one cupped palm at chest height, the needle clearly visible as the eyes drift down to read the bearing", term: "holding an open brass nautical compass" },
|
|
6326
6336
|
{ id: "bow-and-arrow", label: "Bow and Arrow", category: "occupational", description: "Drawn archery bow with arrow nocked", promptHint: "holding an archery bow drawn at full tension with one hand on the grip and the other pulling the string back to the cheek, an arrow nocked and aimed forward", term: "drawing an archery bow with a nocked arrow" },
|
|
6327
|
-
{ id: "shield", label: "Shield", category: "occupational", description: "Handheld medieval shield", promptHint: "holding a medieval shield raised across the body with one arm strapped through the back, the front face angled forward in a defensive stance", term: "holding a raised medieval shield" }
|
|
6337
|
+
{ id: "shield", label: "Shield", category: "occupational", description: "Handheld medieval shield", promptHint: "holding a medieval shield raised across the body with one arm strapped through the back, the front face angled forward in a defensive stance", term: "holding a raised medieval shield" },
|
|
6338
|
+
{ id: "work-gloves", label: "Work Gloves", category: "occupational", description: "Worn leather work gloves held in hand", promptHint: "holding a worn pair of tan leather work gloves in both hands at waist height, the thick weathered leather clearly visible", term: "holding a pair of leather work gloves" }
|
|
6328
6339
|
];
|
|
6329
6340
|
var heldPropById = new Map(HELD_PROPS.map((p) => [p.id, p]));
|
|
6330
6341
|
function getHeldProp(id) {
|
|
@@ -10215,6 +10226,218 @@ function applyTemplate(template, vars) {
|
|
|
10215
10226
|
template
|
|
10216
10227
|
);
|
|
10217
10228
|
}
|
|
10229
|
+
|
|
10230
|
+
// src/prompt-hint-join.ts
|
|
10231
|
+
var PROMPT_HINT_SEPARATOR = ". ";
|
|
10232
|
+
function joinPromptHints(userPrompt, hints) {
|
|
10233
|
+
if (hints.length === 0) return userPrompt;
|
|
10234
|
+
return [userPrompt.trim(), ...hints].filter((p) => p.length > 0).join(PROMPT_HINT_SEPARATOR);
|
|
10235
|
+
}
|
|
10236
|
+
|
|
10237
|
+
// src/direction-registry.ts
|
|
10238
|
+
var perId = (full, compact) => (ids, mode) => {
|
|
10239
|
+
const out = [];
|
|
10240
|
+
for (const id of ids) {
|
|
10241
|
+
const frag = mode === "compact" ? compact(id) : full(id);
|
|
10242
|
+
if (frag.length > 0) out.push(frag);
|
|
10243
|
+
}
|
|
10244
|
+
return out;
|
|
10245
|
+
};
|
|
10246
|
+
var viaListBuilder = (build) => (ids, mode) => build(ids.length === 1 ? ids[0] : [...ids], mode).filter((s) => s.length > 0);
|
|
10247
|
+
var viaStringBuilder = (build) => (ids, mode) => {
|
|
10248
|
+
const s = build(ids.length === 1 ? ids[0] : [...ids], mode);
|
|
10249
|
+
return s.length > 0 ? [s] : [];
|
|
10250
|
+
};
|
|
10251
|
+
var viaMood = (ids, mode) => buildMoodHints({ mood: ids.length === 1 ? ids[0] : [...ids] }, mode).filter(
|
|
10252
|
+
(s) => s.length > 0
|
|
10253
|
+
);
|
|
10254
|
+
var framing = perId(getFramingPromptHint, getFramingTerm);
|
|
10255
|
+
var lighting = perId(getLightingPromptHint, getLightingTerm);
|
|
10256
|
+
var exposure = perId(getExposurePromptHint, getExposureTerm);
|
|
10257
|
+
var temporal = perId(getTemporalPromptHint, getTemporalTerm);
|
|
10258
|
+
var DIRECTION_FIELDS = [
|
|
10259
|
+
{ key: "cameraMotion", surface: "video", family: "motion", maxPicks: 1, render: perId(getCameraMotionPromptHint, getCameraMotionTerm) },
|
|
10260
|
+
// Composition (the Framing catalog, one row per category).
|
|
10261
|
+
{ key: "shotSize", surface: "both", family: "look", maxPicks: 1, render: framing },
|
|
10262
|
+
{ key: "angle", surface: "both", family: "look", maxPicks: 1, render: framing },
|
|
10263
|
+
{ key: "coverage", surface: "both", family: "look", maxPicks: 1, render: framing },
|
|
10264
|
+
{ key: "composition", surface: "both", family: "look", maxPicks: 2, render: framing },
|
|
10265
|
+
{ key: "vantage", surface: "both", family: "look", maxPicks: 1, render: framing },
|
|
10266
|
+
{ key: "pose", surface: "both", family: "look", maxPicks: 1, render: perId(getPosePromptHint, getPoseTerm) },
|
|
10267
|
+
{ key: "compositionEffect", surface: "both", family: "look", maxPicks: 1, render: perId(getCompositionEffectPromptHint, getCompositionEffectTerm) },
|
|
10268
|
+
// Camera.
|
|
10269
|
+
{ key: "cameraFormat", surface: "both", family: "look", styleGroup: "film", maxPicks: 1, render: perId(getCameraFormatPromptHint, getCameraFormatTerm) },
|
|
10270
|
+
{ key: "lens", surface: "both", family: "look", maxPicks: 1, render: perId(getLensPromptHint, getLensTerm) },
|
|
10271
|
+
// Exposure (stills only — a video's exposure rides its own temporal levers).
|
|
10272
|
+
{ key: "aperture", surface: "image", family: "look", maxPicks: 1, render: exposure },
|
|
10273
|
+
{ key: "shutterSpeed", surface: "image", family: "look", maxPicks: 1, render: exposure },
|
|
10274
|
+
{ key: "isoValue", surface: "image", family: "look", maxPicks: 1, render: exposure },
|
|
10275
|
+
// Light (the Lighting catalog, one row per category).
|
|
10276
|
+
{ key: "timeOfDay", surface: "both", family: "look", maxPicks: 1, render: lighting },
|
|
10277
|
+
{ key: "lightingStyle", surface: "both", family: "look", maxPicks: 2, render: lighting },
|
|
10278
|
+
{ key: "lightingDirection", surface: "both", family: "look", maxPicks: 1, render: lighting },
|
|
10279
|
+
{ key: "lightingRatio", surface: "both", family: "look", maxPicks: 1, render: lighting },
|
|
10280
|
+
{ key: "colorTemperature", surface: "both", family: "look", maxPicks: 1, render: lighting },
|
|
10281
|
+
{ key: "colorLook", surface: "both", family: "look", styleGroup: "film", maxPicks: 1, render: perId(getColorLookPromptHint, getColorLookTerm) },
|
|
10282
|
+
{ key: "atmosphere", surface: "both", family: "look", maxPicks: 2, render: viaListBuilder(buildAtmosphereHints) },
|
|
10283
|
+
{ key: "postProcess", surface: "image", family: "look", maxPicks: 2, render: viaListBuilder(buildPostProcessHints) },
|
|
10284
|
+
// Style.
|
|
10285
|
+
{ key: "style", surface: "both", family: "look", styleGroup: "film", maxPicks: 1, render: perId(getStylePromptHint, getStyleTerm) },
|
|
10286
|
+
{ key: "mood", surface: "both", family: "look", maxPicks: 2, render: viaMood },
|
|
10287
|
+
{ key: "aesthetic", surface: "both", family: "look", maxPicks: 2, render: viaStringBuilder(buildAestheticHints) },
|
|
10288
|
+
{ key: "photoGenre", surface: "image", family: "look", maxPicks: 1, render: perId(getPhotoGenrePromptHint, getPhotoGenreTerm) },
|
|
10289
|
+
{ key: "photographer", surface: "image", family: "look", maxPicks: 2, render: viaStringBuilder(buildPhotographerHints) },
|
|
10290
|
+
{ key: "renderQuality", surface: "image", family: "look", maxPicks: 1, render: perId(getRenderQualityPromptHint, getRenderQualityTerm) },
|
|
10291
|
+
// Scene.
|
|
10292
|
+
{ key: "setting", surface: "both", family: "look", maxPicks: 1, render: perId(getSettingPromptHint, getSettingTerm) },
|
|
10293
|
+
{ key: "era", surface: "both", family: "look", styleGroup: "film", maxPicks: 1, render: perId(getEraPromptHint, getEraTerm) },
|
|
10294
|
+
{ key: "backdrop", surface: "both", family: "look", maxPicks: 1, render: perId(getBackdropPromptHint, getBackdropTerm) },
|
|
10295
|
+
// Motion & time.
|
|
10296
|
+
{ key: "actionFx", surface: "video", family: "motion", maxPicks: 2, render: viaListBuilder(buildActionFxHints) },
|
|
10297
|
+
{ key: "temporalSpeed", surface: "video", family: "motion", maxPicks: 1, render: temporal },
|
|
10298
|
+
{ key: "temporalFreeze", surface: "video", family: "motion", maxPicks: 1, render: temporal },
|
|
10299
|
+
{ key: "temporalDirection", surface: "video", family: "motion", maxPicks: 1, render: temporal },
|
|
10300
|
+
{ key: "temporalShutter", surface: "video", family: "motion", maxPicks: 1, render: temporal },
|
|
10301
|
+
{ key: "transition", surface: "video", family: "motion", maxPicks: 2, render: perId(getTransitionPromptHint, getTransitionTerm) },
|
|
10302
|
+
{ key: "loopSubject", surface: "video", family: "motion", maxPicks: 1, render: perId(getLoopSubjectPromptHint, getLoopSubjectTerm) },
|
|
10303
|
+
// ── LEGACY BLOCK — see the table doc above. Placed LAST, in today's exact
|
|
10304
|
+
// `composePromptText` order, so every pre-registry caller is byte-identical.
|
|
10305
|
+
{ key: "framingId", surface: "both", family: "look", maxPicks: 1, render: framing },
|
|
10306
|
+
{ key: "framingAngleId", surface: "both", family: "look", maxPicks: 1, render: framing },
|
|
10307
|
+
{ key: "lightingId", surface: "both", family: "look", maxPicks: 1, render: lighting },
|
|
10308
|
+
{ key: "lensId", surface: "both", family: "look", maxPicks: 1, render: perId(getLensPromptHint, getLensTerm) },
|
|
10309
|
+
{ key: "cameraFormatId", surface: "both", family: "look", styleGroup: "film", maxPicks: 1, render: perId(getCameraFormatPromptHint, getCameraFormatTerm) }
|
|
10310
|
+
];
|
|
10311
|
+
var DIRECTION_SPECS = DIRECTION_FIELDS;
|
|
10312
|
+
var DIRECTION_KEYS = DIRECTION_FIELDS.map((f) => f.key);
|
|
10313
|
+
var FILM_STYLE_KEYS = DIRECTION_SPECS.filter(
|
|
10314
|
+
(f) => f.styleGroup === "film"
|
|
10315
|
+
).map((f) => f.key);
|
|
10316
|
+
var IMAGE_HINT_MODE_DEFAULT = "full";
|
|
10317
|
+
var VIDEO_HINT_MODE_DEFAULT = { look: "full", motion: "compact" };
|
|
10318
|
+
function modeForFamily(mode, family) {
|
|
10319
|
+
return typeof mode === "string" ? mode : family === "motion" ? mode.motion : mode.look;
|
|
10320
|
+
}
|
|
10321
|
+
var DIRECTION_ARRAY_CEILING = 8;
|
|
10322
|
+
var DIRECTION_ID_MAX_CHARS = 100;
|
|
10323
|
+
function normalizeDirectionIds(value, maxPicks) {
|
|
10324
|
+
const ids = [];
|
|
10325
|
+
if (typeof value === "string") {
|
|
10326
|
+
if (value) ids.push(value);
|
|
10327
|
+
} else if (Array.isArray(value)) {
|
|
10328
|
+
for (const v of value) {
|
|
10329
|
+
if (ids.length >= maxPicks) break;
|
|
10330
|
+
if (typeof v === "string" && v && !ids.includes(v)) ids.push(v);
|
|
10331
|
+
}
|
|
10332
|
+
}
|
|
10333
|
+
return ids.slice(0, maxPicks);
|
|
10334
|
+
}
|
|
10335
|
+
function directionFieldsForSurface(surface) {
|
|
10336
|
+
return DIRECTION_SPECS.filter((f) => f.surface === "both" || f.surface === surface);
|
|
10337
|
+
}
|
|
10338
|
+
function renderDirectionHintClauses(direction, opts) {
|
|
10339
|
+
if (!direction) return [];
|
|
10340
|
+
const mode = opts.mode ?? "full";
|
|
10341
|
+
const out = [];
|
|
10342
|
+
const seen = /* @__PURE__ */ new Set();
|
|
10343
|
+
for (const spec of DIRECTION_SPECS) {
|
|
10344
|
+
if (spec.surface !== "both" && spec.surface !== opts.surface) continue;
|
|
10345
|
+
const ids = normalizeDirectionIds(
|
|
10346
|
+
direction[spec.key],
|
|
10347
|
+
spec.maxPicks
|
|
10348
|
+
);
|
|
10349
|
+
if (ids.length === 0) continue;
|
|
10350
|
+
for (const hint of spec.render(ids, modeForFamily(mode, spec.family))) {
|
|
10351
|
+
if (hint.length > 0 && !seen.has(hint)) {
|
|
10352
|
+
seen.add(hint);
|
|
10353
|
+
out.push({
|
|
10354
|
+
key: spec.key,
|
|
10355
|
+
family: spec.family,
|
|
10356
|
+
...spec.styleGroup !== void 0 ? { styleGroup: spec.styleGroup } : {},
|
|
10357
|
+
text: hint
|
|
10358
|
+
});
|
|
10359
|
+
}
|
|
10360
|
+
}
|
|
10361
|
+
}
|
|
10362
|
+
return out;
|
|
10363
|
+
}
|
|
10364
|
+
function renderDirectionHints(direction, opts) {
|
|
10365
|
+
return renderDirectionHintClauses(direction, opts).map((c) => c.text);
|
|
10366
|
+
}
|
|
10367
|
+
|
|
10368
|
+
// src/prompt-style-section.ts
|
|
10369
|
+
var STYLE_SECTION_HEADER = "[style]:";
|
|
10370
|
+
var STYLE_SECTION_GAP = "\n\n";
|
|
10371
|
+
var STYLE_SECTION_OPENING = `${STYLE_SECTION_GAP}${STYLE_SECTION_HEADER}
|
|
10372
|
+
`;
|
|
10373
|
+
function splitStyleSection(prompt) {
|
|
10374
|
+
const at = prompt.lastIndexOf(STYLE_SECTION_OPENING);
|
|
10375
|
+
if (at >= 0) {
|
|
10376
|
+
return { body: prompt.slice(0, at), section: prompt.slice(at + STYLE_SECTION_GAP.length) };
|
|
10377
|
+
}
|
|
10378
|
+
return prompt.startsWith(`${STYLE_SECTION_HEADER}
|
|
10379
|
+
`) ? { body: "", section: prompt } : { body: prompt, section: "" };
|
|
10380
|
+
}
|
|
10381
|
+
function insertBeforeStyleSection(prompt, lines) {
|
|
10382
|
+
if (lines.length === 0) return prompt;
|
|
10383
|
+
const block = lines.join("\n");
|
|
10384
|
+
const { body, section } = splitStyleSection(prompt);
|
|
10385
|
+
if (section.length === 0) return `${prompt}
|
|
10386
|
+
${block}`;
|
|
10387
|
+
return `${body.length > 0 ? `${body}
|
|
10388
|
+
${block}` : block}${STYLE_SECTION_GAP}${section}`;
|
|
10389
|
+
}
|
|
10390
|
+
function endsInsideStyleSection(prompt) {
|
|
10391
|
+
const at = prompt.lastIndexOf(STYLE_SECTION_GAP);
|
|
10392
|
+
const lastBlock = at >= 0 ? prompt.slice(at + STYLE_SECTION_GAP.length) : prompt;
|
|
10393
|
+
return lastBlock.startsWith(`${STYLE_SECTION_HEADER}
|
|
10394
|
+
`);
|
|
10395
|
+
}
|
|
10396
|
+
function styleSlotFor(row) {
|
|
10397
|
+
if (row.family === "motion") return "body";
|
|
10398
|
+
return row.styleGroup === "film" ? "film" : "scene";
|
|
10399
|
+
}
|
|
10400
|
+
function asBodyClauses(texts) {
|
|
10401
|
+
return texts.map((text) => ({ text, slot: "body" }));
|
|
10402
|
+
}
|
|
10403
|
+
function partitionStyleClauses(direction, opts) {
|
|
10404
|
+
return renderDirectionHintClauses(direction, opts).map((clause) => ({
|
|
10405
|
+
text: clause.text,
|
|
10406
|
+
slot: styleSlotFor(clause)
|
|
10407
|
+
}));
|
|
10408
|
+
}
|
|
10409
|
+
function styleSectionFromClauses(clauses) {
|
|
10410
|
+
const line = (slot) => clauses.filter((c) => c.slot === slot).map((c) => c.text).join(PROMPT_HINT_SEPARATOR);
|
|
10411
|
+
const lines = [line("film"), line("scene")].filter((l) => l.length > 0);
|
|
10412
|
+
return lines.length === 0 ? "" : `${STYLE_SECTION_HEADER}
|
|
10413
|
+
${lines.join("\n")}`;
|
|
10414
|
+
}
|
|
10415
|
+
function renderStyleSection(direction, opts) {
|
|
10416
|
+
return styleSectionFromClauses(partitionStyleClauses(direction, opts));
|
|
10417
|
+
}
|
|
10418
|
+
function composeSectionedPrompt(userPrompt, clauses, structuredFragment) {
|
|
10419
|
+
const bodyHints = [
|
|
10420
|
+
...clauses.filter((c) => c.slot === "body").map((c) => c.text),
|
|
10421
|
+
structuredFragment
|
|
10422
|
+
].filter((p) => p.length > 0);
|
|
10423
|
+
const section = styleSectionFromClauses(clauses);
|
|
10424
|
+
if (section.length === 0) {
|
|
10425
|
+
return bodyHints.length === 0 ? userPrompt : joinPromptHints(userPrompt ?? "", bodyHints);
|
|
10426
|
+
}
|
|
10427
|
+
const body = bodyHints.length > 0 ? joinPromptHints(userPrompt ?? "", bodyHints) : (userPrompt ?? "").trim();
|
|
10428
|
+
return body.length > 0 ? `${body}${STYLE_SECTION_GAP}${section}` : section;
|
|
10429
|
+
}
|
|
10430
|
+
function sectionedClauseCosts(userPrompt, clauses, structuredFragment) {
|
|
10431
|
+
const lengthAt = (kept) => composeSectionedPrompt(userPrompt, clauses.slice(0, kept), structuredFragment)?.length ?? 0;
|
|
10432
|
+
const costs = [];
|
|
10433
|
+
let below = lengthAt(0);
|
|
10434
|
+
for (let i = 0; i < clauses.length; i++) {
|
|
10435
|
+
const at = lengthAt(i + 1);
|
|
10436
|
+
costs.push(at - below);
|
|
10437
|
+
below = at;
|
|
10438
|
+
}
|
|
10439
|
+
return costs;
|
|
10440
|
+
}
|
|
10218
10441
|
function composeIdentityDescPart(subject, canonicalDesc, elementInjection) {
|
|
10219
10442
|
const parts = [];
|
|
10220
10443
|
const c = canonicalDesc?.trim();
|
|
@@ -10904,6 +11127,12 @@ function reconcileBodySegments(body, bodySegments) {
|
|
|
10904
11127
|
}
|
|
10905
11128
|
return [{ text: body, origin: "user" }];
|
|
10906
11129
|
}
|
|
11130
|
+
function controlSuffixes(body, styleLine, avoidLine) {
|
|
11131
|
+
const separator = (text) => endsInsideStyleSection(text) ? STYLE_SECTION_GAP : "\n";
|
|
11132
|
+
const styleSuffix = styleLine ? `${separator(body)}${styleLine}` : "";
|
|
11133
|
+
const avoidSuffix = avoidLine ? `${separator(body + styleSuffix)}${avoidLine}` : "";
|
|
11134
|
+
return { styleSuffix, avoidSuffix };
|
|
11135
|
+
}
|
|
10907
11136
|
function buildImagePrompt(config2) {
|
|
10908
11137
|
return buildImagePromptInternal(config2);
|
|
10909
11138
|
}
|
|
@@ -11180,9 +11409,7 @@ ${promptForNext}`;
|
|
|
11180
11409
|
const lockBlock = allLockLines.length > 0 ? `${allLockLines.join("\n")}
|
|
11181
11410
|
|
|
11182
11411
|
` : "";
|
|
11183
|
-
|
|
11184
|
-
${trailingLines.join("\n")}` : "";
|
|
11185
|
-
promptForNext = `${lockBlock}${promptForNext}${trailingBlock}`;
|
|
11412
|
+
promptForNext = `${lockBlock}${insertBeforeStyleSection(promptForNext, trailingLines)}`;
|
|
11186
11413
|
}
|
|
11187
11414
|
config2 = {
|
|
11188
11415
|
...config2,
|
|
@@ -11230,9 +11457,7 @@ ${trailingLines.join("\n")}` : "";
|
|
|
11230
11457
|
...locCanon.elementDirectives,
|
|
11231
11458
|
...objCanon.elementDirectives
|
|
11232
11459
|
];
|
|
11233
|
-
const
|
|
11234
|
-
${canonTrailingLines.join("\n")}` : "";
|
|
11235
|
-
const composedScene = `${canonLockBlock}${scene}${canonTrailingBlock}`;
|
|
11460
|
+
const composedScene = `${canonLockBlock}${insertBeforeStyleSection(scene, canonTrailingLines)}`;
|
|
11236
11461
|
prompt2 = config2.referenceLockSnippet ? `${config2.referenceLockSnippet}
|
|
11237
11462
|
${composedScene}` : composedScene;
|
|
11238
11463
|
if (marks) marks.directivesPrefix = "";
|
|
@@ -11258,29 +11483,29 @@ ${directives}`;
|
|
|
11258
11483
|
}
|
|
11259
11484
|
}
|
|
11260
11485
|
const styleText2 = style?.trim();
|
|
11261
|
-
const
|
|
11262
|
-
Style: ${getStylePromptHint(styleText2) || styleText2}` : "";
|
|
11486
|
+
const styleLine2 = styleText2 ? `Style: ${getStylePromptHint(styleText2) || styleText2}` : "";
|
|
11263
11487
|
const negPrompt2 = negativePrompt?.trim();
|
|
11264
11488
|
let nativeNegativePrompt2;
|
|
11265
|
-
let
|
|
11489
|
+
let avoidLine2 = "";
|
|
11266
11490
|
if (negPrompt2) {
|
|
11267
11491
|
if (NATIVE_NEGATIVE_PROMPT_MODELS.has(provider)) {
|
|
11268
11492
|
nativeNegativePrompt2 = negPrompt2.slice(0, getMaxNegativePromptChars(provider));
|
|
11269
11493
|
} else {
|
|
11270
|
-
|
|
11271
|
-
Avoid: ${negPrompt2}`;
|
|
11494
|
+
avoidLine2 = `Avoid: ${negPrompt2}`;
|
|
11272
11495
|
}
|
|
11273
11496
|
}
|
|
11274
|
-
if (marks) {
|
|
11275
|
-
marks.styleSuffix = styleSuffix2;
|
|
11276
|
-
marks.avoidSuffix = avoidSuffix2;
|
|
11277
|
-
}
|
|
11278
11497
|
const maxLen2 = getMaxImagePromptChars(provider);
|
|
11279
|
-
const
|
|
11498
|
+
const preCut2 = controlSuffixes(prompt2, styleLine2, avoidLine2);
|
|
11499
|
+
const reserved2 = preCut2.styleSuffix.length + preCut2.avoidSuffix.length;
|
|
11280
11500
|
if (prompt2.length + reserved2 > maxLen2) {
|
|
11281
11501
|
if (marks) marks.overflowChars += prompt2.length + reserved2 - maxLen2;
|
|
11282
11502
|
prompt2 = prompt2.slice(0, Math.max(0, maxLen2 - reserved2 - 3)) + "...";
|
|
11283
11503
|
}
|
|
11504
|
+
const { styleSuffix: styleSuffix2, avoidSuffix: avoidSuffix2 } = controlSuffixes(prompt2, styleLine2, avoidLine2);
|
|
11505
|
+
if (marks) {
|
|
11506
|
+
marks.styleSuffix = styleSuffix2;
|
|
11507
|
+
marks.avoidSuffix = avoidSuffix2;
|
|
11508
|
+
}
|
|
11284
11509
|
if (marks) marks.bodyBeforeSuffixes = prompt2.slice(marks.directivesPrefix.length);
|
|
11285
11510
|
prompt2 = prompt2 + styleSuffix2 + avoidSuffix2;
|
|
11286
11511
|
if (prompt2.length > maxLen2) {
|
|
@@ -11332,35 +11557,37 @@ Avoid: ${negPrompt2}`;
|
|
|
11332
11557
|
let prompt = config2.prompt;
|
|
11333
11558
|
if (charDescs.length > 0) {
|
|
11334
11559
|
const wrapperTemplate = resolveTemplate("generate-image-wrapper", userTemplates, flowTemplates);
|
|
11335
|
-
|
|
11336
|
-
|
|
11560
|
+
const { body, section } = splitStyleSection(prompt);
|
|
11561
|
+
const wrapped = applyTemplate(wrapperTemplate, {
|
|
11562
|
+
userPrompt: body,
|
|
11337
11563
|
assetDescriptions: charDescs.join(" ")
|
|
11338
11564
|
});
|
|
11565
|
+
prompt = section.length > 0 ? `${wrapped}${STYLE_SECTION_GAP}${section}` : wrapped;
|
|
11339
11566
|
}
|
|
11340
11567
|
const styleText = style?.trim();
|
|
11341
|
-
const
|
|
11342
|
-
Style: ${getStylePromptHint(styleText) || styleText}` : "";
|
|
11568
|
+
const styleLine = styleText ? `Style: ${getStylePromptHint(styleText) || styleText}` : "";
|
|
11343
11569
|
const negPrompt = negativePrompt?.trim();
|
|
11344
11570
|
let nativeNegativePrompt;
|
|
11345
|
-
let
|
|
11571
|
+
let avoidLine = "";
|
|
11346
11572
|
if (negPrompt) {
|
|
11347
11573
|
if (NATIVE_NEGATIVE_PROMPT_MODELS.has(provider)) {
|
|
11348
11574
|
nativeNegativePrompt = negPrompt.slice(0, getMaxNegativePromptChars(provider));
|
|
11349
11575
|
} else {
|
|
11350
|
-
|
|
11351
|
-
Avoid: ${negPrompt}`;
|
|
11576
|
+
avoidLine = `Avoid: ${negPrompt}`;
|
|
11352
11577
|
}
|
|
11353
11578
|
}
|
|
11354
|
-
if (marks) {
|
|
11355
|
-
marks.styleSuffix = styleSuffix;
|
|
11356
|
-
marks.avoidSuffix = avoidSuffix;
|
|
11357
|
-
}
|
|
11358
11579
|
const maxLen = getMaxImagePromptChars(provider);
|
|
11359
|
-
const
|
|
11580
|
+
const preCut = controlSuffixes(prompt, styleLine, avoidLine);
|
|
11581
|
+
const reserved = preCut.styleSuffix.length + preCut.avoidSuffix.length;
|
|
11360
11582
|
if (prompt.length + reserved > maxLen) {
|
|
11361
11583
|
if (marks) marks.overflowChars += prompt.length + reserved - maxLen;
|
|
11362
11584
|
prompt = prompt.slice(0, Math.max(0, maxLen - reserved - 3)) + "...";
|
|
11363
11585
|
}
|
|
11586
|
+
const { styleSuffix, avoidSuffix } = controlSuffixes(prompt, styleLine, avoidLine);
|
|
11587
|
+
if (marks) {
|
|
11588
|
+
marks.styleSuffix = styleSuffix;
|
|
11589
|
+
marks.avoidSuffix = avoidSuffix;
|
|
11590
|
+
}
|
|
11364
11591
|
if (marks) marks.bodyBeforeSuffixes = prompt;
|
|
11365
11592
|
prompt = prompt + styleSuffix + avoidSuffix;
|
|
11366
11593
|
if (prompt.length > maxLen) {
|
|
@@ -11587,7 +11814,12 @@ function capitalizeLineInitial(line) {
|
|
|
11587
11814
|
return line.replace(/[a-zA-Z]/, (c) => c.toUpperCase());
|
|
11588
11815
|
}
|
|
11589
11816
|
function buildHybridScene(prompt, refs, finalIndexByUrl) {
|
|
11590
|
-
|
|
11817
|
+
const lines = prompt.split("\n");
|
|
11818
|
+
const sectionAt = lines.indexOf(STYLE_SECTION_HEADER);
|
|
11819
|
+
return lines.map((line, i) => {
|
|
11820
|
+
const expanded = expandImageRefTokensHybrid(line, refs, finalIndexByUrl);
|
|
11821
|
+
return sectionAt >= 0 && i >= sectionAt ? expanded : capitalizeLineInitial(expanded);
|
|
11822
|
+
}).join("\n");
|
|
11591
11823
|
}
|
|
11592
11824
|
function buildIdentityDirectives(prompt, refs, meta3 = [], suppressedCanonicalLocationIds) {
|
|
11593
11825
|
return collectIdentities(prompt, refs, meta3).map((id) => buildIdentityDirective(id, suppressedCanonicalLocationIds)).filter((s) => s.length > 0).join("\n");
|
|
@@ -11805,125 +12037,6 @@ function renderLens(l) {
|
|
|
11805
12037
|
if (l.aperture) bits.push(`f/${l.aperture}`);
|
|
11806
12038
|
return bits.length > 0 ? `Lens: ${bits.join(", ")}.` : "";
|
|
11807
12039
|
}
|
|
11808
|
-
|
|
11809
|
-
// src/direction-registry.ts
|
|
11810
|
-
var perId = (full, compact) => (ids, mode) => {
|
|
11811
|
-
const out = [];
|
|
11812
|
-
for (const id of ids) {
|
|
11813
|
-
const frag = mode === "compact" ? compact(id) : full(id);
|
|
11814
|
-
if (frag.length > 0) out.push(frag);
|
|
11815
|
-
}
|
|
11816
|
-
return out;
|
|
11817
|
-
};
|
|
11818
|
-
var viaListBuilder = (build) => (ids, mode) => build(ids.length === 1 ? ids[0] : [...ids], mode).filter((s) => s.length > 0);
|
|
11819
|
-
var viaStringBuilder = (build) => (ids, mode) => {
|
|
11820
|
-
const s = build(ids.length === 1 ? ids[0] : [...ids], mode);
|
|
11821
|
-
return s.length > 0 ? [s] : [];
|
|
11822
|
-
};
|
|
11823
|
-
var viaMood = (ids, mode) => buildMoodHints({ mood: ids.length === 1 ? ids[0] : [...ids] }, mode).filter(
|
|
11824
|
-
(s) => s.length > 0
|
|
11825
|
-
);
|
|
11826
|
-
var framing = perId(getFramingPromptHint, getFramingTerm);
|
|
11827
|
-
var lighting = perId(getLightingPromptHint, getLightingTerm);
|
|
11828
|
-
var exposure = perId(getExposurePromptHint, getExposureTerm);
|
|
11829
|
-
var temporal = perId(getTemporalPromptHint, getTemporalTerm);
|
|
11830
|
-
var DIRECTION_FIELDS = [
|
|
11831
|
-
{ key: "cameraMotion", surface: "video", family: "motion", maxPicks: 1, render: perId(getCameraMotionPromptHint, getCameraMotionTerm) },
|
|
11832
|
-
// Composition (the Framing catalog, one row per category).
|
|
11833
|
-
{ key: "shotSize", surface: "both", family: "look", maxPicks: 1, render: framing },
|
|
11834
|
-
{ key: "angle", surface: "both", family: "look", maxPicks: 1, render: framing },
|
|
11835
|
-
{ key: "coverage", surface: "both", family: "look", maxPicks: 1, render: framing },
|
|
11836
|
-
{ key: "composition", surface: "both", family: "look", maxPicks: 2, render: framing },
|
|
11837
|
-
{ key: "vantage", surface: "both", family: "look", maxPicks: 1, render: framing },
|
|
11838
|
-
{ key: "pose", surface: "both", family: "look", maxPicks: 1, render: perId(getPosePromptHint, getPoseTerm) },
|
|
11839
|
-
{ key: "compositionEffect", surface: "both", family: "look", maxPicks: 1, render: perId(getCompositionEffectPromptHint, getCompositionEffectTerm) },
|
|
11840
|
-
// Camera.
|
|
11841
|
-
{ key: "cameraFormat", surface: "both", family: "look", maxPicks: 1, render: perId(getCameraFormatPromptHint, getCameraFormatTerm) },
|
|
11842
|
-
{ key: "lens", surface: "both", family: "look", maxPicks: 1, render: perId(getLensPromptHint, getLensTerm) },
|
|
11843
|
-
// Exposure (stills only — a video's exposure rides its own temporal levers).
|
|
11844
|
-
{ key: "aperture", surface: "image", family: "look", maxPicks: 1, render: exposure },
|
|
11845
|
-
{ key: "shutterSpeed", surface: "image", family: "look", maxPicks: 1, render: exposure },
|
|
11846
|
-
{ key: "isoValue", surface: "image", family: "look", maxPicks: 1, render: exposure },
|
|
11847
|
-
// Light (the Lighting catalog, one row per category).
|
|
11848
|
-
{ key: "timeOfDay", surface: "both", family: "look", maxPicks: 1, render: lighting },
|
|
11849
|
-
{ key: "lightingStyle", surface: "both", family: "look", maxPicks: 2, render: lighting },
|
|
11850
|
-
{ key: "lightingDirection", surface: "both", family: "look", maxPicks: 1, render: lighting },
|
|
11851
|
-
{ key: "lightingRatio", surface: "both", family: "look", maxPicks: 1, render: lighting },
|
|
11852
|
-
{ key: "colorTemperature", surface: "both", family: "look", maxPicks: 1, render: lighting },
|
|
11853
|
-
{ key: "colorLook", surface: "both", family: "look", maxPicks: 1, render: perId(getColorLookPromptHint, getColorLookTerm) },
|
|
11854
|
-
{ key: "atmosphere", surface: "both", family: "look", maxPicks: 2, render: viaListBuilder(buildAtmosphereHints) },
|
|
11855
|
-
{ key: "postProcess", surface: "image", family: "look", maxPicks: 2, render: viaListBuilder(buildPostProcessHints) },
|
|
11856
|
-
// Style.
|
|
11857
|
-
{ key: "style", surface: "both", family: "look", maxPicks: 1, render: perId(getStylePromptHint, getStyleTerm) },
|
|
11858
|
-
{ key: "mood", surface: "both", family: "look", maxPicks: 2, render: viaMood },
|
|
11859
|
-
{ key: "aesthetic", surface: "both", family: "look", maxPicks: 2, render: viaStringBuilder(buildAestheticHints) },
|
|
11860
|
-
{ key: "photoGenre", surface: "image", family: "look", maxPicks: 1, render: perId(getPhotoGenrePromptHint, getPhotoGenreTerm) },
|
|
11861
|
-
{ key: "photographer", surface: "image", family: "look", maxPicks: 2, render: viaStringBuilder(buildPhotographerHints) },
|
|
11862
|
-
{ key: "renderQuality", surface: "image", family: "look", maxPicks: 1, render: perId(getRenderQualityPromptHint, getRenderQualityTerm) },
|
|
11863
|
-
// Scene.
|
|
11864
|
-
{ key: "setting", surface: "both", family: "look", maxPicks: 1, render: perId(getSettingPromptHint, getSettingTerm) },
|
|
11865
|
-
{ key: "era", surface: "both", family: "look", maxPicks: 1, render: perId(getEraPromptHint, getEraTerm) },
|
|
11866
|
-
{ key: "backdrop", surface: "both", family: "look", maxPicks: 1, render: perId(getBackdropPromptHint, getBackdropTerm) },
|
|
11867
|
-
// Motion & time.
|
|
11868
|
-
{ key: "actionFx", surface: "video", family: "motion", maxPicks: 2, render: viaListBuilder(buildActionFxHints) },
|
|
11869
|
-
{ key: "temporalSpeed", surface: "video", family: "motion", maxPicks: 1, render: temporal },
|
|
11870
|
-
{ key: "temporalFreeze", surface: "video", family: "motion", maxPicks: 1, render: temporal },
|
|
11871
|
-
{ key: "temporalDirection", surface: "video", family: "motion", maxPicks: 1, render: temporal },
|
|
11872
|
-
{ key: "temporalShutter", surface: "video", family: "motion", maxPicks: 1, render: temporal },
|
|
11873
|
-
{ key: "transition", surface: "video", family: "motion", maxPicks: 2, render: perId(getTransitionPromptHint, getTransitionTerm) },
|
|
11874
|
-
{ key: "loopSubject", surface: "video", family: "motion", maxPicks: 1, render: perId(getLoopSubjectPromptHint, getLoopSubjectTerm) },
|
|
11875
|
-
// ── LEGACY BLOCK — see the table doc above. Placed LAST, in today's exact
|
|
11876
|
-
// `composePromptText` order, so every pre-registry caller is byte-identical.
|
|
11877
|
-
{ key: "framingId", surface: "both", family: "look", maxPicks: 1, render: framing },
|
|
11878
|
-
{ key: "framingAngleId", surface: "both", family: "look", maxPicks: 1, render: framing },
|
|
11879
|
-
{ key: "lightingId", surface: "both", family: "look", maxPicks: 1, render: lighting },
|
|
11880
|
-
{ key: "lensId", surface: "both", family: "look", maxPicks: 1, render: perId(getLensPromptHint, getLensTerm) },
|
|
11881
|
-
{ key: "cameraFormatId", surface: "both", family: "look", maxPicks: 1, render: perId(getCameraFormatPromptHint, getCameraFormatTerm) }
|
|
11882
|
-
];
|
|
11883
|
-
var DIRECTION_KEYS = DIRECTION_FIELDS.map((f) => f.key);
|
|
11884
|
-
var IMAGE_HINT_MODE_DEFAULT = "full";
|
|
11885
|
-
var VIDEO_HINT_MODE_DEFAULT = { look: "full", motion: "compact" };
|
|
11886
|
-
function modeForFamily(mode, family) {
|
|
11887
|
-
return typeof mode === "string" ? mode : family === "motion" ? mode.motion : mode.look;
|
|
11888
|
-
}
|
|
11889
|
-
var DIRECTION_ARRAY_CEILING = 8;
|
|
11890
|
-
var DIRECTION_ID_MAX_CHARS = 100;
|
|
11891
|
-
function normalizeDirectionIds(value, maxPicks) {
|
|
11892
|
-
const ids = [];
|
|
11893
|
-
if (typeof value === "string") {
|
|
11894
|
-
if (value) ids.push(value);
|
|
11895
|
-
} else if (Array.isArray(value)) {
|
|
11896
|
-
for (const v of value) {
|
|
11897
|
-
if (ids.length >= maxPicks) break;
|
|
11898
|
-
if (typeof v === "string" && v && !ids.includes(v)) ids.push(v);
|
|
11899
|
-
}
|
|
11900
|
-
}
|
|
11901
|
-
return ids.slice(0, maxPicks);
|
|
11902
|
-
}
|
|
11903
|
-
function directionFieldsForSurface(surface) {
|
|
11904
|
-
return DIRECTION_FIELDS.filter((f) => f.surface === "both" || f.surface === surface);
|
|
11905
|
-
}
|
|
11906
|
-
function renderDirectionHints(direction, opts) {
|
|
11907
|
-
if (!direction) return [];
|
|
11908
|
-
const mode = opts.mode ?? "full";
|
|
11909
|
-
const out = [];
|
|
11910
|
-
const seen = /* @__PURE__ */ new Set();
|
|
11911
|
-
for (const spec of DIRECTION_FIELDS) {
|
|
11912
|
-
if (spec.surface !== "both" && spec.surface !== opts.surface) continue;
|
|
11913
|
-
const ids = normalizeDirectionIds(
|
|
11914
|
-
direction[spec.key],
|
|
11915
|
-
spec.maxPicks
|
|
11916
|
-
);
|
|
11917
|
-
if (ids.length === 0) continue;
|
|
11918
|
-
for (const hint of spec.render(ids, modeForFamily(mode, spec.family))) {
|
|
11919
|
-
if (hint.length > 0 && !seen.has(hint)) {
|
|
11920
|
-
seen.add(hint);
|
|
11921
|
-
out.push(hint);
|
|
11922
|
-
}
|
|
11923
|
-
}
|
|
11924
|
-
}
|
|
11925
|
-
return out;
|
|
11926
|
-
}
|
|
11927
12040
|
var viaFragmentBuilder = (build) => (subject, mode) => {
|
|
11928
12041
|
const clause = build(subject, mode).filter((s) => s.length > 0).join(", ");
|
|
11929
12042
|
return clause.length > 0 ? [clause] : [];
|
|
@@ -12048,20 +12161,13 @@ function renderSubjectHints(subject, opts) {
|
|
|
12048
12161
|
return out;
|
|
12049
12162
|
}
|
|
12050
12163
|
|
|
12051
|
-
// src/prompt-hint-join.ts
|
|
12052
|
-
var PROMPT_HINT_SEPARATOR = ". ";
|
|
12053
|
-
function joinPromptHints(userPrompt, hints) {
|
|
12054
|
-
if (hints.length === 0) return userPrompt;
|
|
12055
|
-
return [userPrompt.trim(), ...hints].filter((p) => p.length > 0).join(PROMPT_HINT_SEPARATOR);
|
|
12056
|
-
}
|
|
12057
|
-
|
|
12058
12164
|
// src/hint-shedding.ts
|
|
12059
|
-
function keepableDirectionHints(hintClauses, kept, deficit) {
|
|
12165
|
+
function keepableDirectionHints(hintClauses, kept, deficit, clauseCosts) {
|
|
12060
12166
|
let remaining = deficit;
|
|
12061
12167
|
let next = kept;
|
|
12062
12168
|
while (next > 0 && remaining > 0) {
|
|
12063
12169
|
next -= 1;
|
|
12064
|
-
remaining -= hintClauses[next].length + PROMPT_HINT_SEPARATOR.length;
|
|
12170
|
+
remaining -= clauseCosts?.[next] ?? hintClauses[next].length + PROMPT_HINT_SEPARATOR.length;
|
|
12065
12171
|
}
|
|
12066
12172
|
return next;
|
|
12067
12173
|
}
|
|
@@ -12415,9 +12521,7 @@ function resolveVideoReferenceCore(args) {
|
|
|
12415
12521
|
const lockBlock = lockLines.length > 0 ? `${lockLines.join("\n")}
|
|
12416
12522
|
|
|
12417
12523
|
` : "";
|
|
12418
|
-
|
|
12419
|
-
${trailingLines.join("\n")}` : "";
|
|
12420
|
-
finalPrompt = `${lockBlock}${finalPrompt}${trailingBlock}`;
|
|
12524
|
+
finalPrompt = `${lockBlock}${insertBeforeStyleSection(finalPrompt, trailingLines)}`;
|
|
12421
12525
|
} else {
|
|
12422
12526
|
const allFallbackLines = [...fallbackDirectiveLines, ...extraDirectiveLines];
|
|
12423
12527
|
if (allFallbackLines.length > 0) {
|
|
@@ -12654,24 +12758,26 @@ function assembleSunoInput(input) {
|
|
|
12654
12758
|
function renderImageHintPieces(subject, direction, structured) {
|
|
12655
12759
|
return {
|
|
12656
12760
|
hintClauses: [
|
|
12657
|
-
...
|
|
12658
|
-
|
|
12659
|
-
|
|
12660
|
-
|
|
12661
|
-
|
|
12761
|
+
...asBodyClauses(
|
|
12762
|
+
renderSubjectHints(subject, {
|
|
12763
|
+
surface: "image",
|
|
12764
|
+
mode: SUBJECT_IMAGE_HINT_MODE_DEFAULT
|
|
12765
|
+
})
|
|
12766
|
+
),
|
|
12767
|
+
...partitionStyleClauses(direction, {
|
|
12662
12768
|
surface: "image",
|
|
12663
12769
|
mode: IMAGE_HINT_MODE_DEFAULT
|
|
12664
12770
|
})
|
|
12665
|
-
].filter((
|
|
12771
|
+
].filter((c) => c.text.length > 0),
|
|
12666
12772
|
structuredFragment: structured ? renderStructuredFields(structured) : ""
|
|
12667
12773
|
};
|
|
12668
12774
|
}
|
|
12669
12775
|
function composePromptText(userPrompt, pieces, keptHintClauses) {
|
|
12670
|
-
|
|
12671
|
-
|
|
12776
|
+
return composeSectionedPrompt(
|
|
12777
|
+
userPrompt,
|
|
12778
|
+
pieces.hintClauses.slice(0, keptHintClauses),
|
|
12672
12779
|
pieces.structuredFragment
|
|
12673
|
-
|
|
12674
|
-
return joinPromptHints(userPrompt, hints);
|
|
12780
|
+
);
|
|
12675
12781
|
}
|
|
12676
12782
|
function assembleImageInput(input) {
|
|
12677
12783
|
const pieces = renderImageHintPieces(input.subject, input.direction, input.structured);
|
|
@@ -12701,9 +12807,17 @@ function assembleImageInput(input) {
|
|
|
12701
12807
|
});
|
|
12702
12808
|
let kept = pieces.hintClauses.length;
|
|
12703
12809
|
let fitted = assembleWith(kept);
|
|
12704
|
-
|
|
12705
|
-
|
|
12706
|
-
|
|
12810
|
+
if (fitted.overflowChars > 0) {
|
|
12811
|
+
const costs = sectionedClauseCosts(
|
|
12812
|
+
input.userPrompt,
|
|
12813
|
+
pieces.hintClauses,
|
|
12814
|
+
pieces.structuredFragment
|
|
12815
|
+
);
|
|
12816
|
+
const texts = pieces.hintClauses.map((c) => c.text);
|
|
12817
|
+
while (fitted.overflowChars > 0 && kept > 0) {
|
|
12818
|
+
kept = keepableDirectionHints(texts, kept, fitted.overflowChars, costs);
|
|
12819
|
+
fitted = assembleWith(kept);
|
|
12820
|
+
}
|
|
12707
12821
|
}
|
|
12708
12822
|
const { overflowChars, ...result } = fitted;
|
|
12709
12823
|
if (input.throwOnEmpty && !result.prompt.trim()) {
|
|
@@ -12717,31 +12831,30 @@ function assembleImageInput(input) {
|
|
|
12717
12831
|
// src/assemble-video-input.ts
|
|
12718
12832
|
function composeVideoPromptText(userPrompt, direction, structured, opts) {
|
|
12719
12833
|
const hintClauses = [
|
|
12720
|
-
...
|
|
12721
|
-
|
|
12722
|
-
|
|
12723
|
-
|
|
12724
|
-
|
|
12834
|
+
...asBodyClauses(
|
|
12835
|
+
renderSubjectHints(opts?.subject, {
|
|
12836
|
+
surface: "video",
|
|
12837
|
+
mode: opts?.subjectHintMode ?? SUBJECT_VIDEO_HINT_MODE_DEFAULT
|
|
12838
|
+
})
|
|
12839
|
+
),
|
|
12840
|
+
...partitionStyleClauses(direction, {
|
|
12725
12841
|
surface: "video",
|
|
12726
12842
|
mode: opts?.hintMode ?? VIDEO_HINT_MODE_DEFAULT
|
|
12727
12843
|
})
|
|
12728
|
-
].filter((
|
|
12844
|
+
].filter((c) => c.text.length > 0);
|
|
12729
12845
|
const structuredFragment = structured ? renderStructuredFields(structured) : "";
|
|
12730
|
-
const composeWith = (kept2) =>
|
|
12731
|
-
const hints = [...hintClauses.slice(0, kept2), structuredFragment].filter(
|
|
12732
|
-
(p) => p.length > 0
|
|
12733
|
-
);
|
|
12734
|
-
if (hints.length === 0) return userPrompt;
|
|
12735
|
-
return joinPromptHints(userPrompt ?? "", hints);
|
|
12736
|
-
};
|
|
12846
|
+
const composeWith = (kept2) => composeSectionedPrompt(userPrompt, hintClauses.slice(0, kept2), structuredFragment);
|
|
12737
12847
|
const cap = opts?.cap;
|
|
12738
12848
|
if (cap === void 0) return composeWith(hintClauses.length);
|
|
12739
12849
|
const frame = opts?.frame ?? ((body2) => body2);
|
|
12740
12850
|
let kept = hintClauses.length;
|
|
12741
12851
|
let body = composeWith(kept);
|
|
12742
12852
|
let framedLength = frame(body)?.length ?? 0;
|
|
12853
|
+
if (framedLength <= cap) return body;
|
|
12854
|
+
const costs = sectionedClauseCosts(userPrompt, hintClauses, structuredFragment);
|
|
12855
|
+
const texts = hintClauses.map((c) => c.text);
|
|
12743
12856
|
while (framedLength > cap && kept > 0) {
|
|
12744
|
-
kept = keepableDirectionHints(
|
|
12857
|
+
kept = keepableDirectionHints(texts, kept, framedLength - cap, costs);
|
|
12745
12858
|
body = composeWith(kept);
|
|
12746
12859
|
framedLength = frame(body)?.length ?? 0;
|
|
12747
12860
|
}
|
|
@@ -12918,10 +13031,13 @@ function resolveSeedance2Inputs(args) {
|
|
|
12918
13031
|
droppedRefImages
|
|
12919
13032
|
};
|
|
12920
13033
|
}
|
|
12921
|
-
var
|
|
13034
|
+
var DEFAULT_GEMINI_OMNI_PROVIDER = "gemini-omni-video";
|
|
13035
|
+
function geminiOmniInputSlots(provider) {
|
|
13036
|
+
return VIDEO_REF_LIMITS_BY_PROVIDER[provider ?? DEFAULT_GEMINI_OMNI_PROVIDER]?.images ?? 7;
|
|
13037
|
+
}
|
|
12922
13038
|
function resolveGeminiOmniI2vInputs(args) {
|
|
12923
13039
|
const refs = (args.refImageUrls ?? []).filter((u) => typeof u === "string" && u.length > 0);
|
|
12924
|
-
const slots =
|
|
13040
|
+
const slots = geminiOmniInputSlots(args.provider) - (args.videoConnected ? 2 : 0);
|
|
12925
13041
|
const refSlots = Math.max(0, slots - 1);
|
|
12926
13042
|
const kept = refs.slice(0, refSlots);
|
|
12927
13043
|
const droppedRefImages = refs.length - kept.length;
|
|
@@ -27760,6 +27876,23 @@ var GAPS_SCHEMA = external_exports.object({
|
|
|
27760
27876
|
).max(8).default([])
|
|
27761
27877
|
}).default({ missingItems: [], missingCategories: [] });
|
|
27762
27878
|
var MULTI_CACHE = /* @__PURE__ */ new Map();
|
|
27879
|
+
function pickerDisplayName(type) {
|
|
27880
|
+
return type.split("-").map((w) => w.length > 0 ? w[0].toUpperCase() + w.slice(1) : w).join(" ");
|
|
27881
|
+
}
|
|
27882
|
+
function buildOtherPickersLegend(sorted) {
|
|
27883
|
+
const otherTypes = PICKER_TYPES.filter((t) => !sorted.includes(t));
|
|
27884
|
+
if (otherTypes.length === 0) return "";
|
|
27885
|
+
const lines = otherTypes.map((type) => {
|
|
27886
|
+
const descriptor = PICKER_ANALYZER_REGISTRY[type];
|
|
27887
|
+
if (descriptor.kind === "flat") {
|
|
27888
|
+
return `- ${type}: ${descriptor.label}`;
|
|
27889
|
+
}
|
|
27890
|
+
const dims = descriptor.order.map((k) => descriptor.labels[k]).filter(Boolean).join(", ");
|
|
27891
|
+
return `- ${type}: ${pickerDisplayName(type)}${dims ? ` \u2014 ${dims}` : ""}`;
|
|
27892
|
+
});
|
|
27893
|
+
return `Non-wired pickers \u2014 use one of these keys in a gap's \`picker\` when an attribute belongs to it:
|
|
27894
|
+
${lines.join("\n")}`;
|
|
27895
|
+
}
|
|
27763
27896
|
function buildMultiPickerAnalyzerSpec(types) {
|
|
27764
27897
|
const sorted = [...new Set(types)].sort();
|
|
27765
27898
|
const key = sorted.join(",");
|
|
@@ -27777,7 +27910,8 @@ ${buildPickerLegend(spec)}`);
|
|
|
27777
27910
|
const result = {
|
|
27778
27911
|
schema: external_exports.object(shape).strict(),
|
|
27779
27912
|
toolName: "emit_pickers",
|
|
27780
|
-
legend: legendParts.join("\n\n")
|
|
27913
|
+
legend: legendParts.join("\n\n"),
|
|
27914
|
+
otherPickersLegend: buildOtherPickersLegend(sorted)
|
|
27781
27915
|
};
|
|
27782
27916
|
MULTI_CACHE.set(key, result);
|
|
27783
27917
|
return result;
|
|
@@ -28183,8 +28317,8 @@ Sources: Google Cloud "Ultimate prompting guide for Veo 3.1"
|
|
|
28183
28317
|
KIE VEO API docs (docs.kie.ai/veo3-api/generate-veo-3-video). Captured 2026-08-09.`
|
|
28184
28318
|
};
|
|
28185
28319
|
var GEMINI_OMNI_DOCTRINE = {
|
|
28186
|
-
providers: ["gemini-omni-video"],
|
|
28187
|
-
heading: "Gemini Omni
|
|
28320
|
+
providers: ["gemini-omni-video", "gemini-omni-flash"],
|
|
28321
|
+
heading: "Gemini Omni (gemini-omni-video, gemini-omni-flash)",
|
|
28188
28322
|
tips: [
|
|
28189
28323
|
"Multimodal Google video with native audio: text-to-video, image-to-video, and video-edit through the same prompt surface. 4/6/8/10s; 720p/1080p or 4K tier.",
|
|
28190
28324
|
"Structure like the platform default: subject \u2192 action \u2192 scene \u2192 lighting \u2192 camera \u2192 style. Quote dialogue lines to have them spoken; describe SFX/ambience plainly in the prompt.",
|
|
@@ -28206,6 +28340,7 @@ subject \u2192 action \u2192 scene/environment \u2192 lighting \u2192 camera mov
|
|
|
28206
28340
|
|
|
28207
28341
|
**Duration & tiers**
|
|
28208
28342
|
- 4 / 6 / 8 / 10 seconds. 720p/1080p tier or the pricier 4K tier \u2014 pick 4K only when the deliverable needs it (nearly 2\xD7 the credits).
|
|
28343
|
+
- gemini-omni-flash is the faster/cheaper tier with the identical request surface \u2014 same 4/6/8/10s, same 720p/1080p and 4K tiers, same video-edit path. Everything above applies verbatim.
|
|
28209
28344
|
|
|
28210
28345
|
Source: KIE gemini-omni-video market contract (parameters + live behavior probed for the
|
|
28211
28346
|
aspect-ratio hard-reject, see providers/kie/video.ts). Captured 2026-08-09.`
|
|
@@ -28275,6 +28410,45 @@ push-in (intimacy/tension), pull-out (scale/isolation), tracking shot, orbit, fi
|
|
|
28275
28410
|
Source: Alibaba Cloud Model Studio \u2014 "Text-to-video / image-to-video prompt guide"
|
|
28276
28411
|
(alibabacloud.com/help/en/model-studio/text-to-video-prompt). Captured 2026-08-09.`
|
|
28277
28412
|
};
|
|
28413
|
+
var WAN_3_DOCTRINE = {
|
|
28414
|
+
providers: ["wan-3", "wan-3-prime"],
|
|
28415
|
+
heading: "Wan 3.0 (wan-3, wan-3-prime)",
|
|
28416
|
+
tips: [
|
|
28417
|
+
"Two INPUT MODES, exclusive on the wire: first/last frame, OR reference mode (images + videos + audio). With any reference wired the platform folds the frame into the references and names it in the prompt.",
|
|
28418
|
+
`References bind by ordinal token in array order: Image1, Image2, Video1, Audio1 \u2014 no space, unlike Wan 2.x's "Image 1". Name every wired asset or it may be ignored.`,
|
|
28419
|
+
"Reference caps: 10 images / 5 videos / 5 audio clips; each video and each audio clip 1-15s, with \u226415s combined per array. With reference videos, input seconds + output duration \u2264 30.",
|
|
28420
|
+
"2-30 seconds (default 5); 480p/720p/1080p; aspect adaptive (default, matches the input media) or 16:9 / 4:3 / 1:1 / 3:4 / 9:16. Prompt cap 20,000 chars \u2014 excess is truncated silently.",
|
|
28421
|
+
'`audio` is a boolean, ON by default: the clip comes back with an ambient/SFX track. Cue the sound you want in the prompt, or state the exclusion ("no music") \u2014 it is not a dialogue guarantee.',
|
|
28422
|
+
"wan-3-prime is the HIGH-SPEED tier: identical surface and limits, faster turnaround at a higher per-second rate. It is not a quality upgrade \u2014 choose it for latency, not for looks."
|
|
28423
|
+
],
|
|
28424
|
+
doctrine: `Prompt structure (no public Wan 3.0 prompt guide exists \u2014 the KIE API contract is the
|
|
28425
|
+
doctrine source, like MiniMax H3 and HappyHorse; platform-standard structure applies):
|
|
28426
|
+
subject \u2192 action \u2192 scene/environment \u2192 lighting \u2192 camera movement \u2192 style \u2192 constraints.
|
|
28427
|
+
|
|
28428
|
+
**Modes (mutually exclusive at the provider)**
|
|
28429
|
+
- Frame mode: first_frame_url, optionally with last_frame_url, and NO references \u2014 the frames anchor the shot exactly, so describe MOTION and camera, not the still.
|
|
28430
|
+
- Reference mode: image / video / audio reference arrays. The provider CANNOT take these together with the first/last frame parameters, so when both are wired the platform folds \u2014 the frame is appended to the reference images (after the caller's own, ordinals unchanged) and bound in the prompt as the opening/closing frame. Write for reference mode whenever a reference is attached.
|
|
28431
|
+
- Text-only runs are supported and are the model's default mode.
|
|
28432
|
+
|
|
28433
|
+
**Reference binding**
|
|
28434
|
+
- Assets bind by ORDINAL TOKEN in array order: Image1, Image2, \u2026, Video1, \u2026, Audio1, \u2026. Note the format has NO space \u2014 Wan 2.x's "Image 1" is a different generation and does not apply here.
|
|
28435
|
+
- Write the binding into the prompt explicitly ("Image1 walks into the room described in Image2"); an unnamed reference may simply be ignored.
|
|
28436
|
+
- Caps: up to 10 images, 5 videos, 5 audio clips. Each video and each audio clip must be 1-15s with \u226415s combined per array. Audio should not be the only media input \u2014 pair it with an image or a video.
|
|
28437
|
+
|
|
28438
|
+
**Duration, resolution, aspect**
|
|
28439
|
+
- 2-30 seconds (provider default 5). With reference videos there is an extra ceiling: input video duration + output duration \u2264 30 seconds.
|
|
28440
|
+
- 480p / 720p / 1080p. Aspect "adaptive" (the default \u2014 the model selects the ratio from the input media and intent) or 16:9 / 4:3 / 1:1 / 3:4 / 9:16. There is no 21:9.
|
|
28441
|
+
- Prompts accept Chinese and English, up to 20,000 characters; anything beyond is truncated silently, so front-load the load-bearing content.
|
|
28442
|
+
|
|
28443
|
+
**Audio**
|
|
28444
|
+
- The "audio" boolean defaults ON and produces an ambient/SFX track with the clip. Describe the soundscape you want plainly ("rain on glass, distant traffic"), or state the exclusion, or turn the toggle off. The contract documents no lip-synced dialogue guarantee \u2014 plan spoken lines as a separate TTS + lip-sync pass.
|
|
28445
|
+
|
|
28446
|
+
**Tiers**
|
|
28447
|
+
- wan-3 and wan-3-prime take identical inputs. Prime trades a higher per-second rate for faster turnaround; it is not documented as a quality tier.
|
|
28448
|
+
|
|
28449
|
+
Source: KIE Wan 3.0 market contract (docs.kie.ai/market/wan/3-0-video,
|
|
28450
|
+
docs.kie.ai/market/wan/3-0-video-prime). Captured 2026-09-01.`
|
|
28451
|
+
};
|
|
28278
28452
|
var HAPPYHORSE_DOCTRINE = {
|
|
28279
28453
|
providers: ["happyhorse", "happyhorse-i2v", "happyhorse-ref2v", "happyhorse-edit"],
|
|
28280
28454
|
heading: "HappyHorse 1.1 (happyhorse, happyhorse-i2v, happyhorse-ref2v)",
|
|
@@ -28330,6 +28504,7 @@ var PROVIDER_PROMPT_DOCTRINES = [
|
|
|
28330
28504
|
GEMINI_OMNI_DOCTRINE,
|
|
28331
28505
|
GROK_IMAGINE_DOCTRINE,
|
|
28332
28506
|
WAN_DOCTRINE,
|
|
28507
|
+
WAN_3_DOCTRINE,
|
|
28333
28508
|
HAPPYHORSE_DOCTRINE,
|
|
28334
28509
|
RUNWAY_KIE_DOCTRINE
|
|
28335
28510
|
];
|
|
@@ -28554,6 +28729,9 @@ var PROVIDER_CAPABILITIES = {
|
|
|
28554
28729
|
"ltx-2.3-pro": "Lightricks LTX 2.3 Pro \u2014 text/image/audio\u2192video, 6\u201310s, up to 4K",
|
|
28555
28730
|
"ltx-2.3-fast": "Lightricks LTX 2.3 Fast \u2014 text/image\u2192video, 6\u201320s, up to 4K",
|
|
28556
28731
|
"gemini-omni-video": "Google Gemini Omni \u2014 multimodal video with native audio, 4\u201310s, up to 4K.",
|
|
28732
|
+
"gemini-omni-flash": "Google Gemini Omni Flash \u2014 faster, cheaper Omni tier; multimodal video with native audio, 4\u201310s, up to 4K.",
|
|
28733
|
+
"wan-3": "Wan 3.0 \u2014 multimodal refs (10 images / 5 videos / 5 audio) or first+last frame, native audio, 2\u201330s, 480p/720p/1080p",
|
|
28734
|
+
"wan-3-prime": "Wan 3.0 Prime \u2014 high-speed Wan 3.0 tier; same surface, faster turnaround at a higher rate",
|
|
28557
28735
|
"grok-imagine-video-1.5": "Grok Imagine 1.5 \u2014 image-to-video only; requires an input image"
|
|
28558
28736
|
},
|
|
28559
28737
|
"image-to-video": {
|
|
@@ -28587,6 +28765,9 @@ var PROVIDER_CAPABILITIES = {
|
|
|
28587
28765
|
"ltx-2.3-pro": "Lightricks LTX 2.3 Pro \u2014 start/end frame i2v + audio\u2192video, 6\u201310s, up to 4K",
|
|
28588
28766
|
"ltx-2.3-fast": "Lightricks LTX 2.3 Fast \u2014 start/end frame i2v, 6\u201320s, up to 4K",
|
|
28589
28767
|
"gemini-omni-video": "Google Gemini Omni \u2014 multimodal video with native audio, 4\u201310s, up to 4K.",
|
|
28768
|
+
"gemini-omni-flash": "Google Gemini Omni Flash \u2014 faster, cheaper Omni tier; multimodal video with native audio, 4\u201310s, up to 4K.",
|
|
28769
|
+
"wan-3": "Wan 3.0 \u2014 multimodal refs (10 images / 5 videos / 5 audio) or first+last frame, native audio, 2\u201330s, 480p/720p/1080p",
|
|
28770
|
+
"wan-3-prime": "Wan 3.0 Prime \u2014 high-speed Wan 3.0 tier; same surface, faster turnaround at a higher rate",
|
|
28590
28771
|
"grok-imagine-video-1.5": "Grok Imagine 1.5 \u2014 stylized animation, 1\u201315s, 480p/720p (image required)"
|
|
28591
28772
|
},
|
|
28592
28773
|
"video-to-video": {
|
|
@@ -34059,6 +34240,6 @@ function buildSurroundFillPrompt(direction, userPrompt) {
|
|
|
34059
34240
|
return `${scene}This is a partial frame: the ${carried} portion contains real, finished pixels and the ${painted} portion is flat gray that MUST be painted in. Paint ONLY the ${painted} gray region as a natural, seamless continuation of the ${carried} portion \u2014 same scene, same perspective, continuing the horizon, geometry, and content across the boundary with no break. Keep the ${carried} portion completely unchanged. CRITICAL: do NOT change the lighting, exposure, white balance, or time of day. Match the ${carried} portion's EXACT light, color temperature, and contrast across the whole frame \u2014 if it is flat overcast daylight, keep flat overcast daylight. No golden hour, no sunset, no warm relight, no cinematic regrade. The seam between the ${carried} and ${painted} portions must be invisible. No people, no text, no labels, no watermarks.`;
|
|
34060
34241
|
}
|
|
34061
34242
|
|
|
34062
|
-
export { ACTION_FX, ACTION_FX_CATEGORY_LABELS, ACTION_FX_CATEGORY_ORDER, ACTION_FX_IDS, AESTHETICS, AESTHETIC_CATEGORY_LABELS, AESTHETIC_CATEGORY_ORDER, AESTHETIC_IDS, ALL_PICKER_WIRING, ANALYZABLE_PICKER_TYPES, ANGLE_LABELS, ASPECT_RATIO_LABELS, ATMOSPHERES, ATMOSPHERE_IDS, AUDIO_WIZARD_CATEGORIES, BACKDROPS, BACKDROP_CATEGORY_LABELS, BACKDROP_CATEGORY_ORDER, BACKDROP_IDS, BRAND_PRESETS, BRAND_PRESET_IDS, BRAND_PRESET_META, CAMERA_FORMATS, CAMERA_FORMAT_IDS, CAMERA_MOTIONS, CAMERA_MOTION_CATEGORY_LABELS, CAMERA_MOTION_CATEGORY_ORDER, CAMERA_MOTION_IDS, CHARACTER_FX, CHARACTER_FX_CATEGORY_LABELS, CHARACTER_FX_CATEGORY_ORDER, CHARACTER_FX_DURATIONS, CHARACTER_FX_IDS, CHARACTER_FX_INTENSITIES, CHARACTER_FX_POSITIONS, CINEMATIC_LOOK_TAIL, COLOR_LOOKS, COLOR_LOOK_CATEGORY_LABELS, COLOR_LOOK_CATEGORY_ORDER, COLOR_LOOK_IDS, COMPOSITION_EFFECTS, COMPOSITION_EFFECT_IDS, DEFAULT_IDENTITY_LOCK, DEFAULT_TEMPLATES, DIRECTION_ARRAY_CEILING, DIRECTION_FIELDS, DIRECTION_ID_MAX_CHARS, DIRECTION_KEYS, ERAS, ERA_CATEGORY_LABELS, ERA_CATEGORY_ORDER, ERA_IDS, EXPOSURE_CATEGORY_LABELS, EXPOSURE_CATEGORY_ORDER, EXPOSURE_FIELD_BY_CATEGORY, EXPOSURE_IDS, EXPOSURE_SETTINGS, FACTORY_PRESETS, FACTORY_SNIPPETS, FILM_STILL_PREFIX, FRAMINGS, FRAMING_CATEGORY_LABELS, FRAMING_CATEGORY_ORDER, FRAMING_FIELD_BY_CATEGORY, FRAMING_IDS, GAPS_SCHEMA, HELD_PROPS, HELD_PROP_CATEGORY_LABELS, HELD_PROP_CATEGORY_ORDER, HELD_PROP_IDS, IMAGE_HINT_MODE_DEFAULT, IMAGE_REFERENCE_PROMPT_DOCTRINE, IMAGE_WIZARD_CATEGORIES, INSTRUMENTATION_DEFAULT_DATA, INSTRUMENTS, INSTRUMENT_CATEGORY_LABELS, INSTRUMENT_CATEGORY_ORDER, LENSES, LENS_IDS, LIGHTINGS, LIGHTING_CATEGORY_LABELS, LIGHTING_CATEGORY_ORDER, LIGHTING_FIELD_BY_CATEGORY, LIGHTING_IDS, LLM_CHAT_WIZARD_CATEGORIES, LOOP_SUBJECTS, LOOP_SUBJECT_CATEGORY_LABELS, LOOP_SUBJECT_CATEGORY_ORDER, MATERIALS, MATERIAL_CATEGORY_LABELS, MATERIAL_CATEGORY_ORDER, MATERIAL_IDS, MAX_SELECTED_BY_DIMENSION, MAX_SELECTED_BY_FRAMING_CATEGORY, MAX_SELECTED_BY_STYLING_DIMENSION, MAX_SUBJECT_KEYS, MOODS, MOOD_CATEGORY_LABELS, MOOD_CATEGORY_ORDER, MOOD_IDS, MOVEMENT_LABELS, MULTI_PICKER_WIRING, MUSIC_EMOTIONS, MUSIC_ENERGIES, MUSIC_ERAS, MUSIC_GENRES, MUSIC_GENRE_CATEGORY_LABELS, MUSIC_GENRE_CATEGORY_ORDER, MUSIC_GENRE_DEFAULT_DATA, MUSIC_MOOD_DEFAULT_DATA, MUSIC_VIBES, MUSIC_WIZARD_CATEGORIES, NODE_PROMPT_CANDIDATE_FIELDS, NODE_PROMPT_FIELDS, OBJECT_ANGLE_PRESETS, OBJECT_ANGLE_PROMPTS, OBJECT_ASSET_PRESETS, OBJECT_ASSET_PROMPTS, OBJECT_MATERIAL_PRESETS, OBJECT_MATERIAL_PROMPTS, OBJECT_VARIATION_PRESETS, OBJECT_VARIATION_PROMPTS, PEOPLE, PERSON_DIMENSION_LABELS, PERSON_DIMENSION_ORDER, PERSON_DIMENSION_SECTIONS, PERSON_FIELD_BY_DIMENSION, PERSON_IDS, PHOTOGRAPHERS, PHOTOGRAPHER_CATEGORY_LABELS, PHOTOGRAPHER_CATEGORY_ORDER, PHOTOGRAPHER_IDS, PHOTO_GENRES, PHOTO_GENRE_CATEGORY_LABELS, PHOTO_GENRE_CATEGORY_ORDER, PHOTO_GENRE_IDS, PICKER_ANALYZER_FAMILIES, PICKER_ANALYZER_REGISTRY, PICKER_CATALOGS, PICKER_TYPES, POSES, POSE_CATEGORY_LABELS, POSE_CATEGORY_ORDER, POSE_IDS, POST_PROCESS_EFFECTS, POST_PROCESS_EFFECT_IDS, PRODUCTION_STYLES, PROMPT_AFFIX_CORE_FIELD_OVERRIDES, PROMPT_AFFIX_NODE_TYPES, PROMPT_HINT_SEPARATOR, PROVIDER_CAPABILITIES, PROVIDER_PROMPT_DOCTRINES, REFERENCE_IMAGE_ROLES, REFERENCE_RULES, REFERENCE_RULES_MULTI_PERSON, REF_BINDING, RENDER_QUALITIES, RENDER_QUALITY_IDS, SCENE_FRAME_RULE, SCENE_PROMPT_MAX_LENGTH, SETTINGS, SETTING_CATEGORY_LABELS, SETTING_IDS, SHOT_LABELS, SINGING_STYLES, SINGLE_PICKER_WIRING, SNIPPET_MEDIA_VALUES, STYLES, STYLE_IDS, STYLE_PRESETS, STYLINGS, STYLING_DIMENSION_LABELS, STYLING_DIMENSION_ORDER, STYLING_FIELD_BY_DIMENSION, STYLING_IDS, SUBJECT_ARRAY_CEILING, SUBJECT_CUSTOM_AGE_KEY, SUBJECT_FIELDS, SUBJECT_FOLD_KEYS, SUBJECT_ID_MAX_CHARS, SUBJECT_IMAGE_HINT_MODE_DEFAULT, SUBJECT_KEYS, SUBJECT_KEY_MAX_CHARS, SUBJECT_VIDEO_HINT_MODE_DEFAULT, TEMPORALS, TEMPORAL_CATEGORY_LABELS, TEMPORAL_CATEGORY_ORDER, TEMPORAL_FIELD_BY_CATEGORY, TEMPORAL_IDS, TERM_MAX_CHARS, TEXT_WIZARD_CATEGORIES, TRANSITIONS, TRANSITION_CATEGORY_LABELS, TRANSITION_CATEGORY_ORDER, TRANSITION_DURATIONS, TRANSITION_IDS, TRANSITION_INTENSITIES, TRANSITION_POSITIONS, VIDEO_HINT_MODE_DEFAULT, VIDEO_WIZARD_CATEGORIES, VOCAL_PRESENCE, VOCAL_PRESENCE_INSTRUMENTAL_ID, VOICE_ACCENTS, VOICE_AGES, VOICE_ARCHETYPES, VOICE_CHARACTER_DEFAULT_DATA, VOICE_DELIVERY_DEFAULT_DATA, VOICE_EMOTIONS, VOICE_GENDERS, VOICE_LANGUAGES, VOICE_PACES, VOICE_TIMBRES, WARDROBE, WARDROBE_CATEGORY_LABELS, WARDROBE_DIMENSION_ORDER, WARDROBE_FIELD_BY_DIMENSION, appendField, appendMusicMeta, applyPickerJson, applyPromptAffixes, applyReferenceOrderToVideo, applyTemplate, assembleImageInput, assembleSunoInput, buildActionFxHints, buildActionFxTerms, buildAestheticHints, buildAestheticTerms, buildAgeHint, buildAtmosphereHints, buildAtmosphereTerms, buildCharacterPrompt, buildCreaturePrompt, buildExposureHints, buildExposureTerms, buildFaceTemplateInputs, buildFramingHints, buildFramingTerms, buildHeldPropHints, buildHeldPropTerms, buildIdentityDirectives, buildIdentityLockLine, buildImagePrompt, buildImagePromptSegments, buildImagePromptWithOverflow, buildInstrumentationHints, buildInstrumentationTerms, buildLightingHints, buildLightingTerms, buildLocationMotionPrompt, buildLocationPrompt, buildLocationRefinePrompt, buildMaterialHints, buildMaterialTerms, buildMoodHints, buildMoodTerms, buildMotionPrompt, buildMultiPickerAnalyzerSpec, buildMusicGenreHints, buildMusicGenreTerms, buildMusicMoodHints, buildMusicMoodTerms, buildObjectMotionPrompt, buildObjectPrompt, buildPersonHints, buildPersonTerms, buildPhotographerHints, buildPhotographerTerms, buildPickerAnalyzerSpec, buildPickerLegend, buildPickerZodSchema, buildPoseHints, buildPoseTerms, buildPostProcessHints, buildPostProcessTerms, buildReferenceBlocks, buildScenePrompt, buildStylingHints, buildStylingTerms, buildSurroundFillPrompt, buildTemporalHints, buildTemporalTerms, buildVoiceCharacterHints, buildVoiceCharacterTerms, buildVoiceDeliveryHints, buildVoiceDeliveryTerms, buildWardrobeHints, catalogPacksVersion, characterLockToRefLock, collectIdentityLockClause, composeCameraMotionHintFromConnections, composeCameraMotionTermFromConnections, composeCharacterFxHintFromConnections, composeNegative, composePickerCatalogs, composeSoundHintFromConnections, composeTransitionHintFromConnections, composeVideoPromptText, computeLlmChatFields, computeNodePrompt, computePackSidecarCoverage, deriveTerm, directionFieldsForSurface, expandImagePositionRefs, expandImageRefTokens, filmStillPrefix, getActionFx, getActionFxLabel, getActionFxPromptHint, getActionFxTerm, getAesthetic, getAestheticLabel, getAestheticPromptHint, getAestheticTerm, getAtmosphere, getAtmosphereLabel, getAtmospherePromptHint, getAtmosphereTerm, getBackdrop, getBackdropLabel, getBackdropPromptHint, getBackdropTerm, getCameraFormat, getCameraFormatLabel, getCameraFormatPromptHint, getCameraFormatTerm, getCameraMotion, getCameraMotionLabel, getCameraMotionPromptHint, getCameraMotionTerm, getCategoriesForNodeType, getCharacterFx, getCharacterFxLabel, getCharacterFxPromptHint, getCharacterFxTerm, getColorLook, getColorLookLabel, getColorLookPromptHint, getColorLookTerm, getCompositionEffect, getCompositionEffectLabel, getCompositionEffectPromptHint, getCompositionEffectTerm, getEffectiveSunoCustomMode, getEra, getEraLabel, getEraPromptHint, getEraTerm, getExposure, getExposureLabel, getExposurePromptHint, getExposureTerm, getFactoryPresets, getFactorySnippets, getFraming, getFramingCategoryLimit, getFramingLabel, getFramingPromptHint, getFramingTerm, getHeldProp, getHeldPropLabel, getHeldPropPromptHint, getHeldPropTerm, getIdentityLockClause, getInstrument, getInstrumentTerm, getLens, getLensLabel, getLensPromptHint, getLensTerm, getLighting, getLightingLabel, getLightingPromptHint, getLightingTerm, getLoopSubject, getLoopSubjectLabel, getLoopSubjectPromptHint, getLoopSubjectTerm, getMaterial, getMaterialLabel, getMaterialPromptHint, getMaterialTerm, getMood, getMoodLabel, getMoodPromptHint, getMoodTerm, getMusicEmotion, getMusicEmotionTerm, getMusicEnergy, getMusicEnergyTerm, getMusicEra, getMusicEraTerm, getMusicGenre, getMusicGenreLabel, getMusicGenreTerm, getMusicSubgenre, getMusicSubgenreTerm, getMusicVibe, getMusicVibeTerm, getParameterPromptHint, getPerson, getPersonDimensionLimit, getPersonLabel, getPersonPromptHint, getPersonTerm, getPhotoGenre, getPhotoGenreLabel, getPhotoGenrePromptHint, getPhotoGenreTerm, getPhotographer, getPhotographerLabel, getPhotographerPromptHint, getPhotographerTerm, getPickerAnalyzer, getPickerCatalog, getPickerWiring, getPose, getPoseLabel, getPosePromptHint, getPoseTerm, getPostProcessEffect, getPostProcessEffectLabel, getPostProcessEffectPromptHint, getPostProcessEffectTerm, getProductionStyle, getProductionStyleTerm, getPromptDoctrine, getPromptFields, getPromptTips, getRegisteredCatalogPacks, getRegisteredPeople, getRegisteredPersonDimensionLabels, getRegisteredPersonDimensionOrder, getRegisteredPersonFieldByDimension, getRegisteredPickerCatalogs, getRegisteredSubjectKeys, getRenderQuality, getRenderQualityLabel, getRenderQualityPromptHint, getRenderQualityTerm, getSetting, getSettingLabel, getSettingPromptHint, getSettingTerm, getSingingStyle, getSingingStyleTerm, getSnippetMedia, getStyle, getStyleLabel, getStylePreset, getStylePromptHint, getStyleTerm, getStyling, getStylingDimensionLimit, getStylingLabel, getStylingPromptHint, getStylingTerm, getTemporal, getTemporalLabel, getTemporalPromptHint, getTemporalTerm, getTransition, getTransitionLabel, getTransitionPromptHint, getTransitionTerm, getVocalPresence, getVocalPresenceTerm, getVoiceAccent, getVoiceAccentTerm, getVoiceAge, getVoiceAgeTerm, getVoiceArchetype, getVoiceArchetypeTerm, getVoiceEmotion, getVoiceEmotionTerm, getVoiceGender, getVoiceGenderTerm, getVoiceLanguage, getVoiceLanguageTerm, getVoicePace, getVoicePaceTerm, getVoiceTimbre, getVoiceTimbreTerm, getWardrobeEntriesByDimension, getWardrobeEntry, getWardrobePromptHint, groupFactoryPresets, hasUpstreamCharacter, identityRefsSentence, isAnalyzablePicker, isInstrumentalVocal, isSuspiciousDerivedTerm, isVantageFraming, isWizardSupported, joinPromptHints, joinPromptParts, keepableDirectionHints, listPickerCatalogs, migratePersonValue, modeForFamily, nodeHasInlinePrompt, nodeHasPromptField, nodeSupportsPromptAffixes, normalizeSubjectFields, personPacksVersion, pickerFanoutTargets, projectAllCatalogs, projectPickerCatalog, promptAffixCoreField, promptBindsFirstFrame, promptFieldCarriesAffixes, promptPartSeparator, readDirectionFields, readStructuredFields, readSubjectFields, referenceRulesBlock, registerCatalogPack, registerPersonPack, renderDirectionHints, renderStructuredFields, renderSubjectHints, resetCatalogPacks, resetPersonPacks, resolveBrandInput, resolveCharacterMentions, resolveGeminiOmniI2vInputs, resolveLocationMentions, resolvePrompt, resolveRefIdTokens, resolveReferenceTokens, resolveSeedance2Inputs, resolveTemplate, resolveTerm, resolveVeoI2vInputs, resolveVideoReferenceCore, subjectFieldsForSurface, summarizePickerCatalogs, toIdentityLockMode, truncateForField, truncateText, withForcedIdentityLock };
|
|
34243
|
+
export { ACTION_FX, ACTION_FX_CATEGORY_LABELS, ACTION_FX_CATEGORY_ORDER, ACTION_FX_IDS, AESTHETICS, AESTHETIC_CATEGORY_LABELS, AESTHETIC_CATEGORY_ORDER, AESTHETIC_IDS, ALL_PICKER_WIRING, ANALYZABLE_PICKER_TYPES, ANGLE_LABELS, ASPECT_RATIO_LABELS, ATMOSPHERES, ATMOSPHERE_IDS, AUDIO_WIZARD_CATEGORIES, BACKDROPS, BACKDROP_CATEGORY_LABELS, BACKDROP_CATEGORY_ORDER, BACKDROP_IDS, BRAND_PRESETS, BRAND_PRESET_IDS, BRAND_PRESET_META, CAMERA_FORMATS, CAMERA_FORMAT_IDS, CAMERA_MOTIONS, CAMERA_MOTION_CATEGORY_LABELS, CAMERA_MOTION_CATEGORY_ORDER, CAMERA_MOTION_IDS, CHARACTER_FX, CHARACTER_FX_CATEGORY_LABELS, CHARACTER_FX_CATEGORY_ORDER, CHARACTER_FX_DURATIONS, CHARACTER_FX_IDS, CHARACTER_FX_INTENSITIES, CHARACTER_FX_POSITIONS, CINEMATIC_LOOK_TAIL, COLOR_LOOKS, COLOR_LOOK_CATEGORY_LABELS, COLOR_LOOK_CATEGORY_ORDER, COLOR_LOOK_IDS, COMPOSITION_EFFECTS, COMPOSITION_EFFECT_IDS, DEFAULT_IDENTITY_LOCK, DEFAULT_TEMPLATES, DIRECTION_ARRAY_CEILING, DIRECTION_FIELDS, DIRECTION_ID_MAX_CHARS, DIRECTION_KEYS, ERAS, ERA_CATEGORY_LABELS, ERA_CATEGORY_ORDER, ERA_IDS, EXPOSURE_CATEGORY_LABELS, EXPOSURE_CATEGORY_ORDER, EXPOSURE_FIELD_BY_CATEGORY, EXPOSURE_IDS, EXPOSURE_SETTINGS, FACTORY_PRESETS, FACTORY_SNIPPETS, FILM_STILL_PREFIX, FILM_STYLE_KEYS, FRAMINGS, FRAMING_CATEGORY_LABELS, FRAMING_CATEGORY_ORDER, FRAMING_FIELD_BY_CATEGORY, FRAMING_IDS, GAPS_SCHEMA, HELD_PROPS, HELD_PROP_CATEGORY_LABELS, HELD_PROP_CATEGORY_ORDER, HELD_PROP_IDS, IMAGE_HINT_MODE_DEFAULT, IMAGE_REFERENCE_PROMPT_DOCTRINE, IMAGE_WIZARD_CATEGORIES, INSTRUMENTATION_DEFAULT_DATA, INSTRUMENTS, INSTRUMENT_CATEGORY_LABELS, INSTRUMENT_CATEGORY_ORDER, LENSES, LENS_IDS, LIGHTINGS, LIGHTING_CATEGORY_LABELS, LIGHTING_CATEGORY_ORDER, LIGHTING_FIELD_BY_CATEGORY, LIGHTING_IDS, LLM_CHAT_WIZARD_CATEGORIES, LOOP_SUBJECTS, LOOP_SUBJECT_CATEGORY_LABELS, LOOP_SUBJECT_CATEGORY_ORDER, MATERIALS, MATERIAL_CATEGORY_LABELS, MATERIAL_CATEGORY_ORDER, MATERIAL_IDS, MAX_SELECTED_BY_DIMENSION, MAX_SELECTED_BY_FRAMING_CATEGORY, MAX_SELECTED_BY_STYLING_DIMENSION, MAX_SUBJECT_KEYS, MOODS, MOOD_CATEGORY_LABELS, MOOD_CATEGORY_ORDER, MOOD_IDS, MOVEMENT_LABELS, MULTI_PICKER_WIRING, MUSIC_EMOTIONS, MUSIC_ENERGIES, MUSIC_ERAS, MUSIC_GENRES, MUSIC_GENRE_CATEGORY_LABELS, MUSIC_GENRE_CATEGORY_ORDER, MUSIC_GENRE_DEFAULT_DATA, MUSIC_MOOD_DEFAULT_DATA, MUSIC_VIBES, MUSIC_WIZARD_CATEGORIES, NODE_PROMPT_CANDIDATE_FIELDS, NODE_PROMPT_FIELDS, OBJECT_ANGLE_PRESETS, OBJECT_ANGLE_PROMPTS, OBJECT_ASSET_PRESETS, OBJECT_ASSET_PROMPTS, OBJECT_MATERIAL_PRESETS, OBJECT_MATERIAL_PROMPTS, OBJECT_VARIATION_PRESETS, OBJECT_VARIATION_PROMPTS, PEOPLE, PERSON_DIMENSION_LABELS, PERSON_DIMENSION_ORDER, PERSON_DIMENSION_SECTIONS, PERSON_FIELD_BY_DIMENSION, PERSON_IDS, PHOTOGRAPHERS, PHOTOGRAPHER_CATEGORY_LABELS, PHOTOGRAPHER_CATEGORY_ORDER, PHOTOGRAPHER_IDS, PHOTO_GENRES, PHOTO_GENRE_CATEGORY_LABELS, PHOTO_GENRE_CATEGORY_ORDER, PHOTO_GENRE_IDS, PICKER_ANALYZER_FAMILIES, PICKER_ANALYZER_REGISTRY, PICKER_CATALOGS, PICKER_TYPES, POSES, POSE_CATEGORY_LABELS, POSE_CATEGORY_ORDER, POSE_IDS, POST_PROCESS_EFFECTS, POST_PROCESS_EFFECT_IDS, PRODUCTION_STYLES, PROMPT_AFFIX_CORE_FIELD_OVERRIDES, PROMPT_AFFIX_NODE_TYPES, PROMPT_HINT_SEPARATOR, PROVIDER_CAPABILITIES, PROVIDER_PROMPT_DOCTRINES, REFERENCE_IMAGE_ROLES, REFERENCE_RULES, REFERENCE_RULES_MULTI_PERSON, REF_BINDING, RENDER_QUALITIES, RENDER_QUALITY_IDS, SCENE_FRAME_RULE, SCENE_PROMPT_MAX_LENGTH, SETTINGS, SETTING_CATEGORY_LABELS, SETTING_IDS, SHOT_LABELS, SINGING_STYLES, SINGLE_PICKER_WIRING, SNIPPET_MEDIA_VALUES, STYLES, STYLE_IDS, STYLE_PRESETS, STYLE_SECTION_GAP, STYLE_SECTION_HEADER, STYLINGS, STYLING_DIMENSION_LABELS, STYLING_DIMENSION_ORDER, STYLING_FIELD_BY_DIMENSION, STYLING_IDS, SUBJECT_ARRAY_CEILING, SUBJECT_CUSTOM_AGE_KEY, SUBJECT_FIELDS, SUBJECT_FOLD_KEYS, SUBJECT_ID_MAX_CHARS, SUBJECT_IMAGE_HINT_MODE_DEFAULT, SUBJECT_KEYS, SUBJECT_KEY_MAX_CHARS, SUBJECT_VIDEO_HINT_MODE_DEFAULT, TEMPORALS, TEMPORAL_CATEGORY_LABELS, TEMPORAL_CATEGORY_ORDER, TEMPORAL_FIELD_BY_CATEGORY, TEMPORAL_IDS, TERM_MAX_CHARS, TEXT_WIZARD_CATEGORIES, TRANSITIONS, TRANSITION_CATEGORY_LABELS, TRANSITION_CATEGORY_ORDER, TRANSITION_DURATIONS, TRANSITION_IDS, TRANSITION_INTENSITIES, TRANSITION_POSITIONS, VIDEO_HINT_MODE_DEFAULT, VIDEO_WIZARD_CATEGORIES, VOCAL_PRESENCE, VOCAL_PRESENCE_INSTRUMENTAL_ID, VOICE_ACCENTS, VOICE_AGES, VOICE_ARCHETYPES, VOICE_CHARACTER_DEFAULT_DATA, VOICE_DELIVERY_DEFAULT_DATA, VOICE_EMOTIONS, VOICE_GENDERS, VOICE_LANGUAGES, VOICE_PACES, VOICE_TIMBRES, WARDROBE, WARDROBE_CATEGORY_LABELS, WARDROBE_DIMENSION_ORDER, WARDROBE_FIELD_BY_DIMENSION, appendField, appendMusicMeta, applyPickerJson, applyPromptAffixes, applyReferenceOrderToVideo, applyTemplate, asBodyClauses, assembleImageInput, assembleSunoInput, buildActionFxHints, buildActionFxTerms, buildAestheticHints, buildAestheticTerms, buildAgeHint, buildAtmosphereHints, buildAtmosphereTerms, buildCharacterPrompt, buildCreaturePrompt, buildExposureHints, buildExposureTerms, buildFaceTemplateInputs, buildFramingHints, buildFramingTerms, buildHeldPropHints, buildHeldPropTerms, buildIdentityDirectives, buildIdentityLockLine, buildImagePrompt, buildImagePromptSegments, buildImagePromptWithOverflow, buildInstrumentationHints, buildInstrumentationTerms, buildLightingHints, buildLightingTerms, buildLocationMotionPrompt, buildLocationPrompt, buildLocationRefinePrompt, buildMaterialHints, buildMaterialTerms, buildMoodHints, buildMoodTerms, buildMotionPrompt, buildMultiPickerAnalyzerSpec, buildMusicGenreHints, buildMusicGenreTerms, buildMusicMoodHints, buildMusicMoodTerms, buildObjectMotionPrompt, buildObjectPrompt, buildPersonHints, buildPersonTerms, buildPhotographerHints, buildPhotographerTerms, buildPickerAnalyzerSpec, buildPickerLegend, buildPickerZodSchema, buildPoseHints, buildPoseTerms, buildPostProcessHints, buildPostProcessTerms, buildReferenceBlocks, buildScenePrompt, buildStylingHints, buildStylingTerms, buildSurroundFillPrompt, buildTemporalHints, buildTemporalTerms, buildVoiceCharacterHints, buildVoiceCharacterTerms, buildVoiceDeliveryHints, buildVoiceDeliveryTerms, buildWardrobeHints, catalogPacksVersion, characterLockToRefLock, collectIdentityLockClause, composeCameraMotionHintFromConnections, composeCameraMotionTermFromConnections, composeCharacterFxHintFromConnections, composeNegative, composePickerCatalogs, composeSectionedPrompt, composeSoundHintFromConnections, composeTransitionHintFromConnections, composeVideoPromptText, computeLlmChatFields, computeNodePrompt, computePackSidecarCoverage, deriveTerm, directionFieldsForSurface, endsInsideStyleSection, expandImagePositionRefs, expandImageRefTokens, filmStillPrefix, getActionFx, getActionFxLabel, getActionFxPromptHint, getActionFxTerm, getAesthetic, getAestheticLabel, getAestheticPromptHint, getAestheticTerm, getAtmosphere, getAtmosphereLabel, getAtmospherePromptHint, getAtmosphereTerm, getBackdrop, getBackdropLabel, getBackdropPromptHint, getBackdropTerm, getCameraFormat, getCameraFormatLabel, getCameraFormatPromptHint, getCameraFormatTerm, getCameraMotion, getCameraMotionLabel, getCameraMotionPromptHint, getCameraMotionTerm, getCategoriesForNodeType, getCharacterFx, getCharacterFxLabel, getCharacterFxPromptHint, getCharacterFxTerm, getColorLook, getColorLookLabel, getColorLookPromptHint, getColorLookTerm, getCompositionEffect, getCompositionEffectLabel, getCompositionEffectPromptHint, getCompositionEffectTerm, getEffectiveSunoCustomMode, getEra, getEraLabel, getEraPromptHint, getEraTerm, getExposure, getExposureLabel, getExposurePromptHint, getExposureTerm, getFactoryPresets, getFactorySnippets, getFraming, getFramingCategoryLimit, getFramingLabel, getFramingPromptHint, getFramingTerm, getHeldProp, getHeldPropLabel, getHeldPropPromptHint, getHeldPropTerm, getIdentityLockClause, getInstrument, getInstrumentTerm, getLens, getLensLabel, getLensPromptHint, getLensTerm, getLighting, getLightingLabel, getLightingPromptHint, getLightingTerm, getLoopSubject, getLoopSubjectLabel, getLoopSubjectPromptHint, getLoopSubjectTerm, getMaterial, getMaterialLabel, getMaterialPromptHint, getMaterialTerm, getMood, getMoodLabel, getMoodPromptHint, getMoodTerm, getMusicEmotion, getMusicEmotionTerm, getMusicEnergy, getMusicEnergyTerm, getMusicEra, getMusicEraTerm, getMusicGenre, getMusicGenreLabel, getMusicGenreTerm, getMusicSubgenre, getMusicSubgenreTerm, getMusicVibe, getMusicVibeTerm, getParameterPromptHint, getPerson, getPersonDimensionLimit, getPersonLabel, getPersonPromptHint, getPersonTerm, getPhotoGenre, getPhotoGenreLabel, getPhotoGenrePromptHint, getPhotoGenreTerm, getPhotographer, getPhotographerLabel, getPhotographerPromptHint, getPhotographerTerm, getPickerAnalyzer, getPickerCatalog, getPickerWiring, getPose, getPoseLabel, getPosePromptHint, getPoseTerm, getPostProcessEffect, getPostProcessEffectLabel, getPostProcessEffectPromptHint, getPostProcessEffectTerm, getProductionStyle, getProductionStyleTerm, getPromptDoctrine, getPromptFields, getPromptTips, getRegisteredCatalogPacks, getRegisteredPeople, getRegisteredPersonDimensionLabels, getRegisteredPersonDimensionOrder, getRegisteredPersonFieldByDimension, getRegisteredPickerCatalogs, getRegisteredSubjectKeys, getRenderQuality, getRenderQualityLabel, getRenderQualityPromptHint, getRenderQualityTerm, getSetting, getSettingLabel, getSettingPromptHint, getSettingTerm, getSingingStyle, getSingingStyleTerm, getSnippetMedia, getStyle, getStyleLabel, getStylePreset, getStylePromptHint, getStyleTerm, getStyling, getStylingDimensionLimit, getStylingLabel, getStylingPromptHint, getStylingTerm, getTemporal, getTemporalLabel, getTemporalPromptHint, getTemporalTerm, getTransition, getTransitionLabel, getTransitionPromptHint, getTransitionTerm, getVocalPresence, getVocalPresenceTerm, getVoiceAccent, getVoiceAccentTerm, getVoiceAge, getVoiceAgeTerm, getVoiceArchetype, getVoiceArchetypeTerm, getVoiceEmotion, getVoiceEmotionTerm, getVoiceGender, getVoiceGenderTerm, getVoiceLanguage, getVoiceLanguageTerm, getVoicePace, getVoicePaceTerm, getVoiceTimbre, getVoiceTimbreTerm, getWardrobeEntriesByDimension, getWardrobeEntry, getWardrobePromptHint, groupFactoryPresets, hasUpstreamCharacter, identityRefsSentence, insertBeforeStyleSection, isAnalyzablePicker, isInstrumentalVocal, isSuspiciousDerivedTerm, isVantageFraming, isWizardSupported, joinPromptHints, joinPromptParts, keepableDirectionHints, listPickerCatalogs, migratePersonValue, modeForFamily, nodeHasInlinePrompt, nodeHasPromptField, nodeSupportsPromptAffixes, normalizeSubjectFields, partitionStyleClauses, personPacksVersion, pickerFanoutTargets, projectAllCatalogs, projectPickerCatalog, promptAffixCoreField, promptBindsFirstFrame, promptFieldCarriesAffixes, promptPartSeparator, readDirectionFields, readStructuredFields, readSubjectFields, referenceRulesBlock, registerCatalogPack, registerPersonPack, renderDirectionHintClauses, renderDirectionHints, renderStructuredFields, renderStyleSection, renderSubjectHints, resetCatalogPacks, resetPersonPacks, resolveBrandInput, resolveCharacterMentions, resolveGeminiOmniI2vInputs, resolveLocationMentions, resolvePrompt, resolveRefIdTokens, resolveReferenceTokens, resolveSeedance2Inputs, resolveTemplate, resolveTerm, resolveVeoI2vInputs, resolveVideoReferenceCore, sectionedClauseCosts, splitStyleSection, styleSectionFromClauses, styleSlotFor, subjectFieldsForSurface, summarizePickerCatalogs, toIdentityLockMode, truncateForField, truncateText, withForcedIdentityLock };
|
|
34063
34244
|
//# sourceMappingURL=index.js.map
|
|
34064
34245
|
//# sourceMappingURL=index.js.map
|