studio-lumiere-cli 0.1.5 → 0.1.7

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.
@@ -1,13 +1,25 @@
1
- import { ETHNICITY_REGIONS, getRandomLuxuryInterior } from './constants.js';
2
- export const buildLLMPrompt = (template, detail, secondaryDetail, tertiaryDetail, quaternaryDetail, ethnicity, skinTone, hairColor, background, backgroundType, vibe, imageCount, occasion, isVariation = false, styleHint) => {
1
+ import { ETHNICITY_REGIONS, getRandomBackgroundValue, getRandomBackgroundTreatment, getRandomBlazerValue } from './constants.js';
2
+ export const buildLLMPrompt = (template, detail, secondaryDetail, tertiaryDetail, quaternaryDetail, quinaryDetail, ethnicity, skinTone, hairColor, background, backgroundType, vibe, photographyStyle, imageCount, occasion, styleHint, isBypassMode = false) => {
3
3
  const needsBothHands = template.id === 'hand_model' && imageCount >= 3;
4
+ const isEditorialMuse = template.id === 'half_body_muse';
4
5
  const quantityConstraint = imageCount > 1
5
6
  ? `The model is wearing ALL the provided pieces together. Do NOT add any other jewelry.${needsBothHands ? ' IMPORTANT: Show BOTH hands with the pieces distributed naturally and elegantly across both hands — do NOT cram all pieces onto a single hand.' : ''}`
6
7
  : 'The model is wearing ONLY the single piece of jewelry shown in the reference. Do NOT add matching earrings, necklaces, or other rings.';
7
8
  // Dynamic Base Concept
8
9
  let ethnicityLabel = (ethnicity && ethnicity.id !== 'none') ? ethnicity.name : "professional female";
10
+ const extraModelNotes = [];
11
+ const framingNotes = [];
12
+ if (isEditorialMuse) {
13
+ framingNotes.push('Framing: waist-up portrait with face, head, and shoulders visible. Hands may appear but must not be the primary subject. Do NOT crop to hands only.');
14
+ extraModelNotes.push('High-fashion beauty, not girl-next-door; unconventional, memorable, magazine-cover presence.');
15
+ }
16
+ if (isEditorialMuse && ethnicity?.id === 'african') {
17
+ ethnicityLabel = 'Black American (modern, cosmopolitan)';
18
+ extraModelNotes.push('Aesthetic: modern Black American editorial; cosmopolitan, upscale, contemporary.');
19
+ extraModelNotes.push('Avoid traditional/tribal styling, costumes, or regional stereotypes.');
20
+ }
9
21
  // Diversity Injection: Pick a specific region if available
10
- if (ethnicity && ethnicity.id && ETHNICITY_REGIONS[ethnicity.id]) {
22
+ if (ethnicity && ethnicity.id && ETHNICITY_REGIONS[ethnicity.id] && !(isEditorialMuse && ethnicity.id === 'african')) {
11
23
  const regions = ETHNICITY_REGIONS[ethnicity.id];
12
24
  const randomRegion = regions[Math.floor(Math.random() * regions.length)];
13
25
  ethnicityLabel = `${randomRegion} (${ethnicity.name})`;
@@ -16,22 +28,118 @@ export const buildLLMPrompt = (template, detail, secondaryDetail, tertiaryDetail
16
28
  basePrompt = basePrompt.replace(/\[ETHNICITY\]/g, ethnicityLabel);
17
29
  const hairColorLabel = (hairColor && hairColor.id !== 'none') ? hairColor.name.toLowerCase() : "natural colored";
18
30
  basePrompt = basePrompt.replace(/\[HAIR_COLOR\]/g, hairColorLabel);
19
- let instruction = `Write a highly detailed, structured photorealistic prompt for the specific jewelry shown in the attached images.
31
+ const sceneDetails = [];
32
+ const modelDetails = [];
33
+ if (!template.hasModel) {
34
+ if (detail && template.customizationLabel) {
35
+ const detailValue = detail.value.replace(/\[HAIR_COLOR\]/g, hairColorLabel);
36
+ sceneDetails.push(`${template.customizationLabel}: ${detailValue}`);
37
+ }
38
+ if (secondaryDetail && template.secondaryCustomizationLabel) {
39
+ sceneDetails.push(`${template.secondaryCustomizationLabel}: ${secondaryDetail.value}`);
40
+ }
41
+ if (tertiaryDetail && template.tertiaryCustomizationLabel) {
42
+ sceneDetails.push(`${template.tertiaryCustomizationLabel}: ${tertiaryDetail.value}`);
43
+ }
44
+ if (quaternaryDetail && template.quaternaryCustomizationLabel) {
45
+ sceneDetails.push(`${template.quaternaryCustomizationLabel}: ${quaternaryDetail.value}`);
46
+ }
47
+ if (quinaryDetail && template.quinaryCustomizationLabel) {
48
+ sceneDetails.push(`${template.quinaryCustomizationLabel}: ${quinaryDetail.value}`);
49
+ }
50
+ }
51
+ else {
52
+ if (ethnicity && ethnicity.id !== 'none') {
53
+ modelDetails.push(`Model Ethnicity: ${ethnicityLabel}`);
54
+ }
55
+ if (detail) {
56
+ // Replace [HAIR_COLOR] in the detail value (e.g. Hairstyle Context)
57
+ let detailValue = detail.value.replace(/\[HAIR_COLOR\]/g, hairColorLabel);
58
+ // Dynamic override for Blazer outfits to add variety
59
+ if (detail.id === 'outfit_blazer') {
60
+ detailValue = getRandomBlazerValue();
61
+ }
62
+ if (occasion && template.id === 'half_body_muse') {
63
+ detailValue = `${detailValue}. Adapt any outfit to the selected occasion while preserving the original silhouette and styling direction.`;
64
+ }
65
+ modelDetails.push(`${template.customizationLabel}: ${detailValue}`);
66
+ }
67
+ else if (template.customizationLabel?.toLowerCase().includes('makeup')) {
68
+ modelDetails.push(`${template.customizationLabel}: completely bare faced, no makeup, fresh natural skin`);
69
+ }
70
+ else if (template.customizationLabel?.toLowerCase().includes('nail')) {
71
+ modelDetails.push(`${template.customizationLabel}: natural unpainted nails with a clear healthy coat`);
72
+ }
73
+ if (secondaryDetail) {
74
+ modelDetails.push(`${template.secondaryCustomizationLabel}: ${secondaryDetail.value}`);
75
+ }
76
+ else if (template.secondaryCustomizationLabel?.toLowerCase().includes('makeup')) {
77
+ modelDetails.push(`${template.secondaryCustomizationLabel}: completely bare faced, no makeup, fresh natural skin`);
78
+ }
79
+ else if (template.secondaryCustomizationLabel?.toLowerCase().includes('nail')) {
80
+ modelDetails.push(`${template.secondaryCustomizationLabel}: natural unpainted nails with a clear healthy coat`);
81
+ }
82
+ if (tertiaryDetail) {
83
+ modelDetails.push(`${template.tertiaryCustomizationLabel}: ${tertiaryDetail.value}`);
84
+ }
85
+ else if (template.tertiaryCustomizationLabel?.toLowerCase().includes('makeup')) {
86
+ modelDetails.push(`${template.tertiaryCustomizationLabel}: completely bare faced, no makeup, fresh natural skin`);
87
+ }
88
+ else if (template.tertiaryCustomizationLabel?.toLowerCase().includes('nail')) {
89
+ modelDetails.push(`${template.tertiaryCustomizationLabel}: natural unpainted nails with a clear healthy coat`);
90
+ }
91
+ if (quaternaryDetail) {
92
+ modelDetails.push(`${template.quaternaryCustomizationLabel}: ${quaternaryDetail.value}`);
93
+ }
94
+ if (quinaryDetail) {
95
+ modelDetails.push(`${template.quinaryCustomizationLabel}: ${quinaryDetail.value}`);
96
+ }
97
+ if (skinTone && skinTone.id !== 'none' && !['flatlay_creative', 'floating_minimal', 'museum_exhibit', 'romantic_mood'].includes(template.id)) {
98
+ modelDetails.push(`Model Skin Tone: ${skinTone.value}`);
99
+ }
100
+ if (hairColor && hairColor.id !== 'none' && !['hand_model', 'flatlay_creative', 'floating_minimal', 'romantic_mood'].includes(template.id)) {
101
+ modelDetails.push(`Model Hair Color: ${hairColor.value}`);
102
+ }
103
+ if (extraModelNotes.length > 0) {
104
+ modelDetails.push(...extraModelNotes);
105
+ }
106
+ if (framingNotes.length > 0) {
107
+ modelDetails.push(...framingNotes);
108
+ }
109
+ }
110
+ const CAMERAS = [
111
+ 'Hasselblad X2D 100C, 120mm Macro lens, f/2.8',
112
+ 'Fujifilm GFX 100II, 110mm f/2 lens',
113
+ 'Leica M11, 75mm Noctilux lens, f/1.2',
114
+ 'Phase One XF, IQ4 150MP, 80mm Schneider Kreuznach lens'
115
+ ];
116
+ const randomCamera = CAMERAS[Math.floor(Math.random() * CAMERAS.length)];
117
+ const FILM_STOCKS = [
118
+ 'Kodak Portra 400',
119
+ 'Fuji Pro 400H',
120
+ 'Kodak Gold 200',
121
+ 'Kodak Ektar 100',
122
+ 'Ilford HP5 (if black and white)'
123
+ ];
124
+ const randomFilm = FILM_STOCKS[Math.floor(Math.random() * FILM_STOCKS.length)];
125
+ let instruction = `A highly detailed, photorealistic photograph featuring the specific jewelry shown in the attached reference images.
20
126
 
21
127
  ══════════════════════════════════
22
128
  📸 PHOTOGRAPHY SPECIFICATION
23
129
  ══════════════════════════════════
24
130
  Base Concept: ${basePrompt}
25
- Camera: Hasselblad X2D 100C, 120mm Macro lens, f/2.8
131
+ Camera: ${randomCamera}
132
+ Film Stock: ${randomFilm}
26
133
  Target: Authentic, high-end editorial photography. Cinematic, naturalistic, slightly imperfect.
27
134
 
28
135
  ══════════════════════════════════
29
136
  💎 SUBJECT & JEWELRY (HIGHEST PRIORITY)
30
137
  ══════════════════════════════════
31
138
  ${quantityConstraint}
32
- CRITICAL: Describe the jewelry EXACTLY as seen in the reference images. Preserve all details: metal type, stone cuts, chain style, settings, etc.
33
- Do NOT invent additional jewelry pieces or embellishments.
34
- Do NOT add sparkles, glitter, or magical glow effects.
139
+ - ${quantityConstraint}
140
+ - The jewelry matches the reference images EXACTLY in all details: metal type, stone cuts, chain style, settings, etc.
141
+ - No additional jewelry pieces or embellishments.
142
+ - No sparkles, glitter, or magical glow effects.
35
143
  `;
36
144
  // OCCASION CONTEXT - Give this prominence if selected
37
145
  if (occasion?.promptDetails) {
@@ -39,108 +147,78 @@ Do NOT add sparkles, glitter, or magical glow effects.
39
147
  ══════════════════════════════════
40
148
  🎭 OCCASION CONTEXT: ${occasion.name.toUpperCase()}
41
149
  ══════════════════════════════════
42
- ${occasion.description}
43
-
44
- 🏛️ SETTING & ENVIRONMENT:
45
- ${occasion.promptDetails.setting}
150
+ - ${occasion.description}
46
151
 
47
- ATMOSPHERE & MOOD:
48
- ${occasion.promptDetails.atmosphere}
49
-
50
- 🎨 COLOR PALETTE:
51
- ${occasion.promptDetails.colorPalette}
52
-
53
- 🌟 CULTURAL & THEMATIC ELEMENTS:
54
- ${occasion.promptDetails.culturalElements}
55
-
56
- 💄 MODEL STYLING & AESTHETIC:
57
- ${occasion.promptDetails.styling}
152
+ - 🌟 CULTURAL & THEMATIC ELEMENTS: ${occasion.promptDetails.culturalElements}
153
+ ${occasion.promptDetails.decor ? `- 🏛️ OCCASION DECOR: ${occasion.promptDetails.decor}` : ''}
58
154
  `;
59
155
  }
60
- // MODEL CUSTOMIZATIONS
61
- let modelDetails = [];
62
- if (ethnicity && ethnicity.id !== 'none') {
63
- modelDetails.push(`Model Ethnicity: ${ethnicityLabel}`);
64
- }
65
- if (detail) {
66
- // Replace [HAIR_COLOR] in the detail value (e.g. Hairstyle Context)
67
- const detailValue = detail.value.replace(/\[HAIR_COLOR\]/g, hairColorLabel);
68
- modelDetails.push(`${template.customizationLabel}: ${detailValue}`);
69
- }
70
- else if (template.customizationLabel?.toLowerCase().includes('makeup')) {
71
- modelDetails.push(`${template.customizationLabel}: completely bare faced, no makeup, fresh natural skin`);
72
- }
73
- else if (template.customizationLabel?.toLowerCase().includes('nail')) {
74
- modelDetails.push(`${template.customizationLabel}: natural unpainted nails with a clear healthy coat`);
75
- }
76
- if (secondaryDetail) {
77
- modelDetails.push(`${template.secondaryCustomizationLabel}: ${secondaryDetail.value}`);
78
- }
79
- else if (template.secondaryCustomizationLabel?.toLowerCase().includes('makeup')) {
80
- modelDetails.push(`${template.secondaryCustomizationLabel}: completely bare faced, no makeup, fresh natural skin`);
81
- }
82
- else if (template.secondaryCustomizationLabel?.toLowerCase().includes('nail')) {
83
- modelDetails.push(`${template.secondaryCustomizationLabel}: natural unpainted nails with a clear healthy coat`);
84
- }
85
- if (tertiaryDetail) {
86
- modelDetails.push(`${template.tertiaryCustomizationLabel}: ${tertiaryDetail.value}`);
87
- }
88
- else if (template.tertiaryCustomizationLabel?.toLowerCase().includes('makeup')) {
89
- modelDetails.push(`${template.tertiaryCustomizationLabel}: completely bare faced, no makeup, fresh natural skin`);
90
- }
91
- else if (template.tertiaryCustomizationLabel?.toLowerCase().includes('nail')) {
92
- modelDetails.push(`${template.tertiaryCustomizationLabel}: natural unpainted nails with a clear healthy coat`);
93
- }
94
- if (quaternaryDetail) {
95
- modelDetails.push(`${template.quaternaryCustomizationLabel}: ${quaternaryDetail.value}`);
96
- }
97
- if (skinTone && skinTone.id !== 'none' && !template.id.includes('flatlay')) {
98
- modelDetails.push(`Model Skin Tone: ${skinTone.value}`);
99
- }
100
- if (hairColor && hairColor.id !== 'none' && !['hand_model', 'flatlay_creative', 'floating_minimal'].includes(template.id)) {
101
- modelDetails.push(`Model Hair Color: ${hairColor.value}`);
102
- }
156
+ // MODEL CUSTOMIZATIONS
103
157
  if (modelDetails.length > 0) {
104
158
  instruction += `
105
159
  ══════════════════════════════════
106
160
  👤 MODEL SPECIFICATIONS
107
161
  ══════════════════════════════════
108
- ${modelDetails.join('\n')}
109
- The model should look like a natural, real human.
162
+ ${modelDetails.map(detailLine => `- ${detailLine}`).join('\n')}
163
+ - The model should look like a natural, real human.
110
164
  `;
111
165
  }
112
166
  // SETTING & BACKGROUND (if not overridden by occasion)
113
- if (!occasion && (background || backgroundType || vibe)) {
167
+ const hasSettingContext = !!(background || backgroundType || vibe || photographyStyle);
168
+ const shouldRenderSettingBlock = hasSettingContext || sceneDetails.length > 0;
169
+ if (shouldRenderSettingBlock) {
114
170
  instruction += `
115
171
  ══════════════════════════════════
116
172
  🎬 SETTING & ENVIRONMENT
117
173
  ══════════════════════════════════
118
174
  `;
175
+ if (sceneDetails.length > 0) {
176
+ instruction += `${sceneDetails.map(detailLine => `- ${detailLine}`).join('\n')}\n`;
177
+ }
178
+ // BACKGROUND TYPE (only add if no specific occasion context that would dictate the setting)
119
179
  if (backgroundType) {
120
- const bgValue = backgroundType.id === 'interior' ? getRandomLuxuryInterior() : backgroundType.value;
121
- instruction += `Setting Type: ${bgValue}\n`;
180
+ if (!occasion) {
181
+ const bgValue = getRandomBackgroundValue(backgroundType.id, backgroundType.value);
182
+ instruction += `- Setting Type: ${bgValue}\n`;
183
+ }
122
184
  }
123
- if (background) {
185
+ if (background && background.value) {
124
186
  if (template.id === 'flatlay_creative') {
125
- instruction += `Secondary accent color/texture element to complement the main surface: ${background.value}\n`;
187
+ instruction += `- Secondary accent color/texture element to complement the main surface: ${background.value}\n`;
126
188
  }
127
189
  else {
128
- instruction += `Color Palette & Texture: ${background.value}\n`;
190
+ instruction += `- Color Palette & Texture: ${background.value}\n`;
129
191
  }
130
192
  }
131
193
  if (vibe) {
132
- instruction += `Photography Style & Mood: ${vibe.value}\n`;
194
+ instruction += `- Mood & Vibes: ${vibe.value}\n`;
133
195
  }
134
- instruction += `\nBackground Treatment: HEAVILY BLURRED (deep cinematic bokeh) to keep focus strictly on the jewelry.
196
+ if (photographyStyle) {
197
+ instruction += `- Overall Photography Style: ${photographyStyle.value}\n`;
198
+ }
199
+ if (hasSettingContext) {
200
+ instruction += `\n- Background Treatment: ${getRandomBackgroundTreatment()}
135
201
  `;
202
+ }
136
203
  }
204
+ const LIGHTING_MODES = [
205
+ 'Natural light reflections on jewelry (NO artificial sparkles or glow)',
206
+ 'Soft side-lighting highlighting the metallic contours and stone clarity',
207
+ 'Subtle rim lighting to create separation from the background',
208
+ 'Gentle overhead diffused studio lighting for authentic material representation',
209
+ 'Dramatic chiaroscuro lighting with deep, natural shadows'
210
+ ];
211
+ const randomLighting = LIGHTING_MODES[Math.floor(Math.random() * LIGHTING_MODES.length)];
137
212
  // TECHNICAL REQUIREMENTS
138
213
  instruction += `
139
214
  ══════════════════════════════════
140
215
  ⚙️ TECHNICAL REQUIREMENTS
141
216
  ══════════════════════════════════
142
- - Natural light reflections on jewelry (NO artificial sparkles or glow)
217
+ - ${randomLighting}
143
218
  - Sharp focus on jewelry with shallow depth of field
219
+ - Natural skin texture with subtle variation; avoid over-smoothing or plastic skin
220
+ - Lighting should feel natural with gentle falloff and imperfect shadow edges
221
+ - Optional subtle lens character (light vignetting, mild edge softness) when appropriate
144
222
  - Authentic photographic quality (film grain acceptable)
145
223
  - Professional color grading
146
224
  - 2K resolution output quality
@@ -151,32 +229,23 @@ The model should look like a natural, real human.
151
229
  ══════════════════════════════════
152
230
  🎭 STYLE & POSE DIRECTION
153
231
  ══════════════════════════════════
154
- ${styleHint}
155
- IMPORTANT: Follow this specific direction to ensure variety across generated images.
156
- `;
157
- }
158
- if (isVariation) {
159
- instruction += `
160
- ══════════════════════════════════
161
- 🔄 VARIATION INSTRUCTION
162
- ══════════════════════════════════
163
- Keep the SAME jewelry pieces and overall aesthetic, but RADICALLY CHANGE THE POSE.
164
- - If previous shot was static, make this dynamic
165
- - If previous was profile, try 3/4 view or different angle
166
- - Change hand placement, head tilt, or body position
167
- - Goal: Fresh perspective with different composition
232
+ - ${styleHint}
233
+ - IMPORTANT: Follow this specific direction to ensure variety across generated images.
168
234
  `;
169
235
  }
170
236
  instruction += `
171
237
  ══════════════════════════════════
172
238
  🚫 STRICT PROHIBITIONS
173
239
  ══════════════════════════════════
174
- DO NOT add: fake sparkles, glitter particles, magical glows, lens flares, additional jewelry not in reference
175
- DO NOT change: the jewelry design, metal type, stone cuts, or any jewelry characteristics
176
- DO NOT use: artificial effects, over-processing, unrealistic elements
177
- DO NOT describe: skin details like pores, skin texture, or hyper-realistic skin features - just let the model look naturally human
178
-
179
- OUTPUT: A structured JSON-like prompt with distinct sections. Do not use a single block of text. Use the following format:
240
+ - DO NOT add: fake sparkles, glitter particles, magical glows, lens flares, additional jewelry not in reference.
241
+ - DO NOT change: the jewelry design, metal type, stone cuts, or any jewelry characteristics.
242
+ - DO NOT add: scratches, chips, patina, damage, or wear to the jewelry.
243
+ - DO NOT use: artificial effects, over-processing, unrealistic elements.
244
+ - DO NOT generate nudity, semi-nudity or scandalous imagery. The model should be elegantly styled and tastefully posed.
245
+ `;
246
+ if (!isBypassMode) {
247
+ instruction += `
248
+ - OUTPUT: A structured JSON-like prompt with distinct sections. Do not use a single block of text. Use the following format:
180
249
 
181
250
  {
182
251
  "Subject": "Detailed description of the jewelry and model...",
@@ -185,8 +254,9 @@ OUTPUT: A structured JSON-like prompt with distinct sections. Do not use a singl
185
254
  "Photography": "Camera and technical specs..."
186
255
  }
187
256
 
188
- Ensure the content of each section is rich, dense, and highly descriptive.
257
+ - Ensure the content of each section is rich, dense, and highly descriptive.
189
258
  `;
259
+ }
190
260
  return instruction;
191
261
  };
192
262
  export const buildSystemInstruction = (template, ethnicity) => {
@@ -199,7 +269,7 @@ export const buildSystemInstruction = (template, ethnicity) => {
199
269
  let llmSystemInstruction = '';
200
270
  if (isRomanticMood) {
201
271
  llmSystemInstruction = `You are a world-renowned still-life photographer and prop stylist for luxury jewelry and lifestyle brands.
202
- Your task is to write a prompt for an AI image generator to create a DREAMY, INTIMATE STILL-LIFE PHOTOGRAPH of jewelry in a romantic setting.
272
+ Generate a DREAMY, INTIMATE STILL-LIFE PHOTOGRAPH of jewelry in a romantic setting.
203
273
 
204
274
  CRITICAL GUIDELINES:
205
275
  1. **JEWELRY FIDELITY (TOP PRIORITY)**: The final image must contain ONLY the jewelry pieces visible in the reference images.
@@ -210,16 +280,12 @@ export const buildSystemInstruction = (template, ethnicity) => {
210
280
  - If the user chose "rose petals", the scene is ONLY rose petals and the jewelry. Do NOT add candles, letters, or other objects.
211
281
  - Keep the scene focused and minimal — one prop theme, not a cluttered collection of romantic clichés.
212
282
  3. **Subject**: NO human model, NO body parts, NO mannequins, NO hands.
213
- 4. **NO FAKE EFFECTS**: Strictly FORBID "sparkles", "glitter particles", "magical glow". Use natural light and genuine material textures.
214
- 5. **Realism**: Use product photography keywords (Hasselblad X2D 100C, 120mm Macro, f/2.8, shallow depth of field). Props must look real and tactile.
215
- 6. **Vibe**: Romantic, intimate, dreamy, feminine.
216
-
217
- Output: A single, dense, highly descriptive English prompt. No introductions.`;
283
+ 4. **NO FAKE EFFECTS**: Strictly FORBID "sparkles", "glitter particles", "magical glow". Use natural light and genuine material textures.`;
218
284
  }
219
285
  else if (isRomance) {
220
286
  const ethnicityPrompt = (ethnicity && ethnicity.id !== 'none') ? ethnicity.value : "Professional couple";
221
287
  llmSystemInstruction = `You are a world-renowned wedding and engagement photographer, known for capturing raw, authentic emotional moments.
222
- Your task is to write a prompt for an AI image generator to create an INTIMATE, EMOTIONALLY POWERFUL photograph based on reference jewelry images.
288
+ Generate an INTIMATE, EMOTIONALLY POWERFUL photograph based on the reference jewelry images.
223
289
 
224
290
  CRITICAL GUIDELINES:
225
291
  1. **JEWELRY FIDELITY (TOP PRIORITY)**: The final image must contain ONLY the jewelry pieces visible in the reference images.
@@ -228,15 +294,11 @@ export const buildSystemInstruction = (template, ethnicity) => {
228
294
  2. **Subject**: Focus on the emotional authenticity of the moment. The jewelry (especially rings) should be prominently visible but feel naturally integrated.
229
295
  - Hands, fingers, and body language are critical storytelling elements.
230
296
  - Ethnicity context: ${ethnicityPrompt}
231
- 3. **NO FAKE EFFECTS**: Strictly FORBID "sparkles", "glitter particles", "magical glow". Natural light reflection only.
232
- 4. **Realism**: Use photography keywords (Contax 645, Zeiss Planar 80mm f/2, Kodak Portra 400).
233
- 5. **Vibe**: Tender, authentic, emotionally powerful, intimate. Real love story energy.
234
-
235
- Output: A single, dense, highly descriptive English prompt. No introductions.`;
297
+ 3. **NO FAKE EFFECTS**: Strictly FORBID "sparkles", "glitter particles", "magical glow". Natural light reflection only.`;
236
298
  }
237
299
  else if (isMuseumExhibit) {
238
300
  llmSystemInstruction = `You are a world-renowned museum photographer and exhibition designer.
239
- Your task is to write a prompt for an AI image generator to create a MUSEUM-QUALITY photograph of jewelry displayed as a priceless exhibit.
301
+ Generate a MUSEUM-QUALITY photograph of jewelry displayed as a priceless exhibit.
240
302
 
241
303
  CRITICAL GUIDELINES:
242
304
  1. **JEWELRY FIDELITY (TOP PRIORITY)**: The final image must contain ONLY the jewelry pieces visible in the reference images.
@@ -244,30 +306,22 @@ export const buildSystemInstruction = (template, ethnicity) => {
244
306
  - Do NOT modify the design of the existing jewelry.
245
307
  2. **Subject**: The jewelry should be displayed as a priceless artifact worthy of the world's greatest museums.
246
308
  - NO human model, NO body parts, NO mannequins.
247
- 3. **NO FAKE EFFECTS**: Strictly FORBID "sparkles", "glitter particles", "magical glow". Professional museum lighting only.
248
- 4. **Realism**: Use professional museum photography equipment and lighting terminology.
249
- 5. **Vibe**: Reverent, prestigious, archival quality, awe-inspiring.
250
-
251
- Output: A single, dense, highly descriptive English prompt. No introductions.`;
309
+ 3. **NO FAKE EFFECTS**: Strictly FORBID "sparkles", "glitter particles", "magical glow". Professional museum lighting only.`;
252
310
  }
253
311
  else if (isFloating) {
254
312
  llmSystemInstruction = `You are a world-renowned product photographer and creative director for luxury jewelry campaigns.
255
- Your task is to write a prompt for an AI image generator to create a HYPER-REALISTIC product photograph based on reference images.
313
+ Generate a HYPER-REALISTIC product photograph based on the reference images.
256
314
 
257
315
  CRITICAL GUIDELINES:
258
316
  1. **JEWELRY FIDELITY (TOP PRIORITY)**: The final image must contain ONLY the jewelry pieces visible in the reference images.
259
317
  - Do NOT invent new pieces (e.g. do not add earrings if only a necklace is provided).
260
318
  - Do NOT modify the design of the existing jewelry.
261
319
  2. **Subject**: The jewelry should appear to be SUSPENDED in mid-air, floating, with NO human model, NO body parts, and NO mannequins. Focus on dramatic lighting, shadows, and a clean, minimalist composition.
262
- 3. **NO FAKE EFFECTS**: Strictly FORBID "sparkles", "glitter particles", "magical glow". Natural light reflection only.
263
- 4. **Realism**: Use photography keywords (Hasselblad X2D 100C, Macro Lens 120mm, f/2.8).
264
- 5. **Vibe**: Old money, elegant, classy, expensive, minimalist.
265
-
266
- Output: A single, dense, highly descriptive English prompt. No introductions.`;
320
+ 3. **NO FAKE EFFECTS**: Strictly FORBID "sparkles", "glitter particles", "magical glow". Natural light reflection only.`;
267
321
  }
268
322
  else if (isFlatlay) {
269
323
  llmSystemInstruction = `You are a world-renowned product photographer and creative director for luxury jewelry campaigns.
270
- Your task is to write a prompt for an AI image generator to create a HYPER-REALISTIC product photograph based on reference images.
324
+ Generate a HYPER-REALISTIC product photograph based on the reference images.
271
325
 
272
326
  CRITICAL GUIDELINES:
273
327
  1. **JEWELRY FIDELITY (TOP PRIORITY)**: The final image must contain ONLY the jewelry pieces visible in the reference images.
@@ -276,15 +330,11 @@ export const buildSystemInstruction = (template, ethnicity) => {
276
330
  2. **Subject**: The jewelry should be displayed as a creative still-life composition, with NO human model, NO body parts, and NO mannequins.
277
331
  - The jewelry may be laid flat on a surface, OR elevated on geometric pedestals, cubes, stone risers, plinths, or sculptural props.
278
332
  - Lighting should always look natural and photographic — soft studio light, window light, or gentle directional light. Shadows should feel organic, not artificial.
279
- 3. **NO FAKE EFFECTS**: Strictly FORBID "sparkles", "glitter particles", "magical glow", neon lighting, overly stylized color gels. Natural light reflection only.
280
- 4. **Realism**: Use photography keywords (Hasselblad X2D 100C, Macro Lens 120mm, f/2.8).
281
- 5. **Vibe**: Old money, elegant, classy, expensive, artistic.
282
-
283
- Output: A single, dense, highly descriptive English prompt. No introductions.`;
333
+ 3. **NO FAKE EFFECTS**: Strictly FORBID "sparkles", "glitter particles", "magical glow", neon lighting, overly stylized color gels. Natural light reflection only.`;
284
334
  }
285
335
  else if (isHandModel) {
286
336
  llmSystemInstruction = `You are a world-renowned product photographer and creative director for luxury jewelry campaigns.
287
- Your task is to write a prompt for an AI image generator to create a HYPER-REALISTIC hand model photograph based on reference images.
337
+ Generate a HYPER-REALISTIC hand model photograph based on the reference images.
288
338
 
289
339
  CRITICAL GUIDELINES:
290
340
  1. **JEWELRY FIDELITY (TOP PRIORITY)**: The final image must contain ONLY the jewelry pieces visible in the reference images.
@@ -297,16 +347,12 @@ export const buildSystemInstruction = (template, ethnicity) => {
297
347
  3. **Subject**: A model's hand(s) (age 20-30) with elegant, relaxed pose wearing the jewelry. Focus on authentic skin texture and natural nail appearance.
298
348
  - If 3 or more jewelry pieces are provided, show BOTH hands to distribute the pieces naturally and elegantly across both hands. Avoid cramming all pieces onto a single hand.
299
349
  - If 1-2 pieces, a single hand is fine.
300
- 4. **NO FAKE EFFECTS**: Strictly FORBID "sparkles", "glitter particles", "magical glow". Natural light reflection only.
301
- 5. **Realism**: Use photography keywords (Hasselblad X2D 100C, Macro Lens 120mm, f/2.8).
302
- 6. **Vibe**: Old money, elegant, classy, expensive, feminine.
303
-
304
- Output: A single, dense, highly descriptive English prompt. No introductions.`;
350
+ 4. **NO FAKE EFFECTS**: Strictly FORBID "sparkles", "glitter particles", "magical glow". Natural light reflection only.`;
305
351
  }
306
352
  else {
307
353
  const ethnicityPrompt = (ethnicity && ethnicity.id !== 'none') ? ethnicity.value : "Professional female model";
308
354
  llmSystemInstruction = `You are a world-renowned fashion photographer and creative director for Vogue Arabia and High Jewelry campaigns.
309
- Your task is to write a prompt for an AI image generator to create an AUTHENTIC, CINEMATIC photograph based on reference images. Skin texture should look natural and smooth.
355
+ Generate an AUTHENTIC, CINEMATIC photograph based on the reference images. Skin texture should look natural and realistic (not overly smoothed).
310
356
 
311
357
  CRITICAL GUIDELINES:
312
358
  1. **JEWELRY FIDELITY (TOP PRIORITY)**: The final image must contain ONLY the jewelry pieces visible in the reference images.
@@ -314,12 +360,14 @@ export const buildSystemInstruction = (template, ethnicity) => {
314
360
  - Do NOT modify the design of the existing jewelry.
315
361
  - If one ring is provided, the model wears ONE ring.
316
362
  2. **Subject**: ALWAYS a ${ethnicityPrompt} (age 20-30).
317
- 3. **NO FAKE EFFECTS**: Strictly FORBID "sparkles", "glitter particles", "magical glow". Natural light reflection only.
318
- 4. **Realism**: Use photography keywords (Hasselblad X2D 100C, Macro Lens 120mm, f/2.8).
319
- 5. **Vibe**: Old money, elegant, classy, expensive, feminine.
320
-
321
- Output: A single, dense, highly descriptive English prompt. No introductions.`;
363
+ 3. **NO FAKE EFFECTS**: Strictly FORBID "sparkles", "glitter particles", "magical glow". Natural light reflection only.`;
322
364
  }
365
+ llmSystemInstruction += `
366
+ IMPORTANT:
367
+ 1. Follow and prioritize the "SETTING & ENVIRONMENT" directives from the user prompt.
368
+ 2. Follow and prioritize the "MODEL SPECIFICATIONS" directives from the user prompt.
369
+ 3. If an "Overall Photography Style" directive is provided, treat it as a required style constraint.
370
+ 4. Only override these style directives if they conflict with jewelry fidelity or explicit prohibitions above.`;
323
371
  return llmSystemInstruction;
324
372
  };
325
373
  //# sourceMappingURL=promptBuilder.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"promptBuilder.js","sourceRoot":"","sources":["../../src/studio/promptBuilder.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"promptBuilder.js","sourceRoot":"","sources":["../../src/studio/promptBuilder.ts"],"names":[],"mappings":"AACA,OAAO,EAAiB,iBAAiB,EAAE,wBAAwB,EAAE,4BAA4B,EAAE,oBAAoB,EAAE,MAAM,gBAAgB,CAAC;AAEhJ,MAAM,CAAC,MAAM,cAAc,GAAG,CAC5B,QAAkB,EAClB,MAA0B,EAC1B,eAAmC,EACnC,cAAkC,EAClC,gBAAoC,EACpC,aAAiC,EACjC,SAA6B,EAC7B,QAA4B,EAC5B,SAA6B,EAC7B,UAA8B,EAC9B,cAAkC,EAClC,IAAwB,EACxB,gBAAoC,EACpC,UAAkB,EAClB,QAAmC,EACnC,SAAkB,EAClB,eAAwB,KAAK,EAC7B,EAAE;IACF,MAAM,cAAc,GAAG,QAAQ,CAAC,EAAE,KAAK,YAAY,IAAI,UAAU,IAAI,CAAC,CAAC;IACvE,MAAM,eAAe,GAAG,QAAQ,CAAC,EAAE,KAAK,gBAAgB,CAAC;IACzD,MAAM,kBAAkB,GAAG,UAAU,GAAG,CAAC;QACvC,CAAC,CAAC,uFAAuF,cAAc,CAAC,CAAC,CAAC,gJAAgJ,CAAC,CAAC,CAAC,EAAE,EAAE;QACjQ,CAAC,CAAC,wIAAwI,CAAC;IAE7I,uBAAuB;IACvB,IAAI,cAAc,GAAG,CAAC,SAAS,IAAI,SAAS,CAAC,EAAE,KAAK,MAAM,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,qBAAqB,CAAC;IACrG,MAAM,eAAe,GAAa,EAAE,CAAC;IACrC,MAAM,YAAY,GAAa,EAAE,CAAC;IAElC,IAAI,eAAe,EAAE,CAAC;QACpB,YAAY,CAAC,IAAI,CAAC,qJAAqJ,CAAC,CAAC;QACzK,eAAe,CAAC,IAAI,CAAC,8FAA8F,CAAC,CAAC;IACvH,CAAC;IAED,IAAI,eAAe,IAAI,SAAS,EAAE,EAAE,KAAK,SAAS,EAAE,CAAC;QACnD,cAAc,GAAG,uCAAuC,CAAC;QACzD,eAAe,CAAC,IAAI,CAAC,kFAAkF,CAAC,CAAC;QACzG,eAAe,CAAC,IAAI,CAAC,sEAAsE,CAAC,CAAC;IAC/F,CAAC;IAED,2DAA2D;IAC3D,IAAI,SAAS,IAAI,SAAS,CAAC,EAAE,IAAI,iBAAiB,CAAC,SAAS,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,eAAe,IAAI,SAAS,CAAC,EAAE,KAAK,SAAS,CAAC,EAAE,CAAC;QACrH,MAAM,OAAO,GAAG,iBAAiB,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC;QAChD,MAAM,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC;QACzE,cAAc,GAAG,GAAG,YAAY,KAAK,SAAS,CAAC,IAAI,GAAG,CAAC;IACzD,CAAC;IAED,IAAI,UAAU,GAAG,QAAQ,CAAC,UAAU,CAAC;IACrC,UAAU,GAAG,UAAU,CAAC,OAAO,CAAC,gBAAgB,EAAE,cAAc,CAAC,CAAC;IAElE,MAAM,cAAc,GAAG,CAAC,SAAS,IAAI,SAAS,CAAC,EAAE,KAAK,MAAM,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,iBAAiB,CAAC;IACjH,UAAU,GAAG,UAAU,CAAC,OAAO,CAAC,iBAAiB,EAAE,cAAc,CAAC,CAAC;IAEnE,MAAM,YAAY,GAAa,EAAE,CAAC;IAClC,MAAM,YAAY,GAAa,EAAE,CAAC;IAElC,IAAI,CAAC,QAAQ,CAAC,QAAQ,EAAE,CAAC;QAEvB,IAAI,MAAM,IAAI,QAAQ,CAAC,kBAAkB,EAAE,CAAC;YAC1C,MAAM,WAAW,GAAG,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,iBAAiB,EAAE,cAAc,CAAC,CAAC;YAC5E,YAAY,CAAC,IAAI,CAAC,GAAG,QAAQ,CAAC,kBAAkB,KAAK,WAAW,EAAE,CAAC,CAAC;QACtE,CAAC;QAED,IAAI,eAAe,IAAI,QAAQ,CAAC,2BAA2B,EAAE,CAAC;YAC5D,YAAY,CAAC,IAAI,CAAC,GAAG,QAAQ,CAAC,2BAA2B,KAAK,eAAe,CAAC,KAAK,EAAE,CAAC,CAAC;QACzF,CAAC;QAED,IAAI,cAAc,IAAI,QAAQ,CAAC,0BAA0B,EAAE,CAAC;YAC1D,YAAY,CAAC,IAAI,CAAC,GAAG,QAAQ,CAAC,0BAA0B,KAAK,cAAc,CAAC,KAAK,EAAE,CAAC,CAAC;QACvF,CAAC;QAED,IAAI,gBAAgB,IAAI,QAAQ,CAAC,4BAA4B,EAAE,CAAC;YAC9D,YAAY,CAAC,IAAI,CAAC,GAAG,QAAQ,CAAC,4BAA4B,KAAK,gBAAgB,CAAC,KAAK,EAAE,CAAC,CAAC;QAC3F,CAAC;QAED,IAAI,aAAa,IAAI,QAAQ,CAAC,yBAAyB,EAAE,CAAC;YACxD,YAAY,CAAC,IAAI,CAAC,GAAG,QAAQ,CAAC,yBAAyB,KAAK,aAAa,CAAC,KAAK,EAAE,CAAC,CAAC;QACrF,CAAC;IACH,CAAC;SAAM,CAAC;QAEN,IAAI,SAAS,IAAI,SAAS,CAAC,EAAE,KAAK,MAAM,EAAE,CAAC;YACzC,YAAY,CAAC,IAAI,CAAC,oBAAoB,cAAc,EAAE,CAAC,CAAC;QAC1D,CAAC;QAED,IAAI,MAAM,EAAE,CAAC;YACX,oEAAoE;YACpE,IAAI,WAAW,GAAG,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,iBAAiB,EAAE,cAAc,CAAC,CAAC;YAE1E,qDAAqD;YACrD,IAAI,MAAM,CAAC,EAAE,KAAK,eAAe,EAAE,CAAC;gBAClC,WAAW,GAAG,oBAAoB,EAAE,CAAC;YACvC,CAAC;YAED,IAAI,QAAQ,IAAI,QAAQ,CAAC,EAAE,KAAK,gBAAgB,EAAE,CAAC;gBACjD,WAAW,GAAG,GAAG,WAAW,6GAA6G,CAAC;YAC5I,CAAC;YAED,YAAY,CAAC,IAAI,CAAC,GAAG,QAAQ,CAAC,kBAAkB,KAAK,WAAW,EAAE,CAAC,CAAC;QACtE,CAAC;aACI,IAAI,QAAQ,CAAC,kBAAkB,EAAE,WAAW,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;YACvE,YAAY,CAAC,IAAI,CAAC,GAAG,QAAQ,CAAC,kBAAkB,wDAAwD,CAAC,CAAC;QAC5G,CAAC;aACI,IAAI,QAAQ,CAAC,kBAAkB,EAAE,WAAW,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;YACrE,YAAY,CAAC,IAAI,CAAC,GAAG,QAAQ,CAAC,kBAAkB,qDAAqD,CAAC,CAAC;QACzG,CAAC;QAED,IAAI,eAAe,EAAE,CAAC;YACpB,YAAY,CAAC,IAAI,CAAC,GAAG,QAAQ,CAAC,2BAA2B,KAAK,eAAe,CAAC,KAAK,EAAE,CAAC,CAAC;QACzF,CAAC;aACI,IAAI,QAAQ,CAAC,2BAA2B,EAAE,WAAW,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;YAChF,YAAY,CAAC,IAAI,CAAC,GAAG,QAAQ,CAAC,2BAA2B,wDAAwD,CAAC,CAAC;QACrH,CAAC;aACI,IAAI,QAAQ,CAAC,2BAA2B,EAAE,WAAW,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;YAC9E,YAAY,CAAC,IAAI,CAAC,GAAG,QAAQ,CAAC,2BAA2B,qDAAqD,CAAC,CAAC;QAClH,CAAC;QAED,IAAI,cAAc,EAAE,CAAC;YACnB,YAAY,CAAC,IAAI,CAAC,GAAG,QAAQ,CAAC,0BAA0B,KAAK,cAAc,CAAC,KAAK,EAAE,CAAC,CAAC;QACvF,CAAC;aACI,IAAI,QAAQ,CAAC,0BAA0B,EAAE,WAAW,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;YAC/E,YAAY,CAAC,IAAI,CAAC,GAAG,QAAQ,CAAC,0BAA0B,wDAAwD,CAAC,CAAC;QACpH,CAAC;aACI,IAAI,QAAQ,CAAC,0BAA0B,EAAE,WAAW,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;YAC7E,YAAY,CAAC,IAAI,CAAC,GAAG,QAAQ,CAAC,0BAA0B,qDAAqD,CAAC,CAAC;QACjH,CAAC;QAED,IAAI,gBAAgB,EAAE,CAAC;YACrB,YAAY,CAAC,IAAI,CAAC,GAAG,QAAQ,CAAC,4BAA4B,KAAK,gBAAgB,CAAC,KAAK,EAAE,CAAC,CAAC;QAC3F,CAAC;QAED,IAAI,aAAa,EAAE,CAAC;YAClB,YAAY,CAAC,IAAI,CAAC,GAAG,QAAQ,CAAC,yBAAyB,KAAK,aAAa,CAAC,KAAK,EAAE,CAAC,CAAC;QACrF,CAAC;QAED,IAAI,QAAQ,IAAI,QAAQ,CAAC,EAAE,KAAK,MAAM,IAAI,CAAC,CAAC,kBAAkB,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,eAAe,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC,EAAE,CAAC;YAC7I,YAAY,CAAC,IAAI,CAAC,oBAAoB,QAAQ,CAAC,KAAK,EAAE,CAAC,CAAC;QAC1D,CAAC;QAED,IAAI,SAAS,IAAI,SAAS,CAAC,EAAE,KAAK,MAAM,IAAI,CAAC,CAAC,YAAY,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,eAAe,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC,EAAE,CAAC;YAC3I,YAAY,CAAC,IAAI,CAAC,qBAAqB,SAAS,CAAC,KAAK,EAAE,CAAC,CAAC;QAC5D,CAAC;QAED,IAAI,eAAe,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC/B,YAAY,CAAC,IAAI,CAAC,GAAG,eAAe,CAAC,CAAC;QACxC,CAAC;QAED,IAAI,YAAY,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC5B,YAAY,CAAC,IAAI,CAAC,GAAG,YAAY,CAAC,CAAC;QACrC,CAAC;IACH,CAAC;IAED,MAAM,OAAO,GAAG;QACd,8CAA8C;QAC9C,oCAAoC;QACpC,sCAAsC;QACtC,wDAAwD;KACzD,CAAC;IACF,MAAM,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC;IAEzE,MAAM,WAAW,GAAG;QAClB,kBAAkB;QAClB,eAAe;QACf,gBAAgB;QAChB,iBAAiB;QACjB,iCAAiC;KAClC,CAAC;IACF,MAAM,UAAU,GAAG,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC;IAE/E,IAAI,WAAW,GACf;;;;;gBAKc,UAAU;UAChB,YAAY;cACR,UAAU;;;;;;EAMtB,kBAAkB;IAChB,kBAAkB;;;;CAIrB,CAAC;IAEA,sDAAsD;IACtD,IAAI,QAAQ,EAAE,aAAa,EAAE,CAAC;QAC5B,WAAW,IAAI;;uBAEI,QAAQ,CAAC,IAAI,CAAC,WAAW,EAAE;;IAE9C,QAAQ,CAAC,WAAW;;qCAEa,QAAQ,CAAC,aAAa,CAAC,gBAAgB;EAC1E,QAAQ,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC,CAAC,yBAAyB,QAAQ,CAAC,aAAa,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE;CAC5F,CAAC;IACA,CAAC;IAED,0BAA0B;IAC1B,IAAI,YAAY,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC1B,WAAW,IAAI;;;;EAInB,YAAY,CAAC,GAAG,CAAC,UAAU,CAAC,EAAE,CAAC,KAAK,UAAU,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;;CAE7D,CAAC;IACA,CAAC;IAED,uDAAuD;IACvD,MAAM,iBAAiB,GAAG,CAAC,CAAC,CAAC,UAAU,IAAI,cAAc,IAAI,IAAI,IAAI,gBAAgB,CAAC,CAAC;IACvF,MAAM,wBAAwB,GAAG,iBAAiB,IAAI,YAAY,CAAC,MAAM,GAAG,CAAC,CAAC;IAE9E,IAAI,wBAAwB,EAAE,CAAC;QAC7B,WAAW,IAAI;;;;CAIlB,CAAC;QAEE,IAAI,YAAY,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC5B,WAAW,IAAI,GAAG,YAAY,CAAC,GAAG,CAAC,UAAU,CAAC,EAAE,CAAC,KAAK,UAAU,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC;QACrF,CAAC;QAED,4FAA4F;QAC5F,IAAI,cAAc,EAAE,CAAC;YACnB,IAAI,CAAC,QAAQ,EAAC,CAAC;gBACb,MAAM,OAAO,GAAG,wBAAwB,CAAC,cAAc,CAAC,EAAE,EAAE,cAAc,CAAC,KAAK,CAAC,CAAC;gBAClF,WAAW,IAAI,mBAAmB,OAAO,IAAI,CAAC;YAChD,CAAC;QACH,CAAC;QAED,IAAI,UAAU,IAAI,UAAU,CAAC,KAAK,EAAE,CAAC;YACnC,IAAI,QAAQ,CAAC,EAAE,KAAK,kBAAkB,EAAE,CAAC;gBACvC,WAAW,IAAI,4EAA4E,UAAU,CAAC,KAAK,IAAI,CAAC;YAClH,CAAC;iBAAM,CAAC;gBACN,WAAW,IAAI,8BAA8B,UAAU,CAAC,KAAK,IAAI,CAAC;YACpE,CAAC;QACH,CAAC;QAED,IAAI,IAAI,EAAE,CAAC;YACT,WAAW,IAAI,mBAAmB,IAAI,CAAC,KAAK,IAAI,CAAC;QACnD,CAAC;QACD,IAAI,gBAAgB,EAAE,CAAC;YACrB,WAAW,IAAI,gCAAgC,gBAAgB,CAAC,KAAK,IAAI,CAAC;QAC5E,CAAC;QAED,IAAI,iBAAiB,EAAE,CAAC;YACtB,WAAW,IAAI,6BAA6B,4BAA4B,EAAE;CAC/E,CAAC;QACE,CAAC;IACH,CAAC;IAED,MAAM,cAAc,GAAG;QACrB,uEAAuE;QACvE,yEAAyE;QACzE,8DAA8D;QAC9D,gFAAgF;QAChF,0DAA0D;KAC3D,CAAC;IACF,MAAM,cAAc,GAAG,cAAc,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,cAAc,CAAC,MAAM,CAAC,CAAC,CAAC;IAEzF,yBAAyB;IACzB,WAAW,IAAI;;;;IAIb,cAAc;;;;;;;;CAQjB,CAAC;IAEA,6DAA6D;IAC7D,IAAI,SAAS,EAAE,CAAC;QACd,WAAW,IAAI;;;;IAIf,SAAS;;CAEZ,CAAC;IACA,CAAC;IAED,WAAW,IAAI;;;;;;;;;CAShB,CAAC;IAEA,IAAI,CAAC,YAAY,EAAE,CAAC;QAClB,WAAW,IAAI;;;;;;;;;;;CAWlB,CAAC;IACA,CAAC;IAED,OAAO,WAAW,CAAC;AACrB,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,sBAAsB,GAAG,CACpC,QAAkB,EAClB,SAA6B,EACrB,EAAE;IACV,MAAM,UAAU,GAAG,QAAQ,CAAC,EAAE,KAAK,kBAAkB,CAAC;IACtD,MAAM,SAAS,GAAG,QAAQ,CAAC,EAAE,KAAK,kBAAkB,CAAC;IACrD,MAAM,WAAW,GAAG,QAAQ,CAAC,EAAE,KAAK,YAAY,CAAC;IACjD,MAAM,eAAe,GAAG,QAAQ,CAAC,EAAE,KAAK,gBAAgB,CAAC;IACzD,MAAM,SAAS,GAAG,QAAQ,CAAC,EAAE,KAAK,kBAAkB,CAAC;IACrD,MAAM,cAAc,GAAG,QAAQ,CAAC,EAAE,KAAK,eAAe,CAAC;IACvD,IAAI,oBAAoB,GAAG,EAAE,CAAC;IAC9B,IAAI,cAAc,EAAE,CAAC;QACnB,oBAAoB,GAAG;;;;;;;;;;;;8IAYmH,CAAC;IAC7I,CAAC;SAAM,IAAI,SAAS,EAAE,CAAC;QACrB,MAAM,eAAe,GAAG,CAAC,SAAS,IAAI,SAAS,CAAC,EAAE,KAAK,MAAM,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC,qBAAqB,CAAC;QACzG,oBAAoB,GAAG;;;;;;;;;8BASG,eAAe;4HAC+E,CAAC;IAC3H,CAAC;SAAM,IAAI,eAAe,EAAE,CAAC;QAC3B,oBAAoB,GAAG;;;;;;;;;gIASqG,CAAC;IAC/H,CAAC;SAAM,IAAI,UAAU,EAAE,CAAC;QACtB,oBAAoB,GAAG;;;;;;;;4HAQiG,CAAC;IAC3H,CAAC;SAAM,IAAI,SAAS,EAAE,CAAC;QACrB,oBAAoB,GAAG;;;;;;;;;;uKAU4I,CAAC;IACtK,CAAC;SAAM,IAAI,WAAW,EAAE,CAAC;QACvB,oBAAoB,GAAG;;;;;;;;;;;;;;4HAciG,CAAC;IAC3H,CAAC;SAAM,CAAC;QACN,MAAM,eAAe,GAAG,CAAC,SAAS,IAAI,SAAS,CAAC,EAAE,KAAK,MAAM,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC,2BAA2B,CAAC;QAC/G,oBAAoB,GAAG;;;;;;;;+BAQI,eAAe;4HAC8E,CAAC;IAC3H,CAAC;IAED,oBAAoB,IAAI;;;;;+GAKqF,CAAC;IAC9G,OAAO,oBAAoB,CAAC;AAC9B,CAAC,CAAC"}
@@ -12,12 +12,16 @@ export interface Template {
12
12
  tertiaryCustomizationOptions?: Option[];
13
13
  quaternaryCustomizationLabel?: string;
14
14
  quaternaryCustomizationOptions?: Option[];
15
+ quinaryCustomizationLabel?: string;
16
+ quinaryCustomizationOptions?: Option[];
15
17
  isAdminOnly?: boolean;
18
+ hasModel?: boolean;
16
19
  }
17
20
  export interface Option {
18
21
  id: string;
19
22
  name: string;
20
23
  value: string;
24
+ description?: string;
21
25
  visualColor?: string;
22
26
  visualImage?: string;
23
27
  visualSvg?: string;
@@ -37,12 +41,14 @@ export interface GenerationState {
37
41
  selectedSecondaryDetailId: string | null;
38
42
  selectedTertiaryDetailId: string | null;
39
43
  selectedQuaternaryDetailId: string | null;
44
+ selectedQuinaryDetailId: string | null;
40
45
  selectedEthnicity: string | null;
41
46
  selectedSkinTone: string | null;
42
47
  selectedHairColor: string | null;
43
48
  selectedBackground: string | null;
44
49
  selectedBackgroundType: string | null;
45
50
  selectedVibe: string | null;
51
+ selectedPhotographyStyle: string | null;
46
52
  selectedResolution: string | null;
47
53
  imageCount: number;
48
54
  selectedOccasion: string | undefined;
package/dist/types.d.ts CHANGED
@@ -6,12 +6,15 @@ export interface GenerationSelections {
6
6
  detailId?: string;
7
7
  secondaryDetailId?: string;
8
8
  tertiaryDetailId?: string;
9
+ quaternaryDetailId?: string;
10
+ quinaryDetailId?: string;
9
11
  ethnicityId?: string;
10
12
  skinToneId?: string;
11
13
  hairColorId?: string;
12
14
  backgroundId?: string;
13
15
  backgroundTypeId?: string;
14
16
  vibeId?: string;
17
+ photographyStyleId?: string;
15
18
  resolutionId?: string;
16
19
  occasionId?: string;
17
20
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "studio-lumiere-cli",
3
- "version": "0.1.5",
3
+ "version": "0.1.7",
4
4
  "description": "Local SDK + CLI for Studio Lumiere image and video generation",
5
5
  "type": "module",
6
6
  "bin": {