studio-lumiere-cli 0.1.6 → 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.
package/README.md CHANGED
@@ -1,532 +1,550 @@
1
- # Studio Lumiere CLI
2
-
3
- Local SDK + CLI for AI-powered jewelry product photography. Generate editorial-quality images, videos, and compositions from reference jewelry photos.
4
-
5
- ```bash
6
- npx studio-lumiere-cli <command> [options]
7
- ```
8
-
9
- ## Setup
10
-
11
- 1. Install dependencies
12
-
13
- ```
14
- npm install
15
- ```
16
-
17
- 2. Create `.env`
18
-
19
- ```
20
- GEMINI_API_KEY=your_key_here
21
- LUMIERE_OUTPUT_DIR=outputs
22
- ```
23
-
24
- ---
25
-
26
- ## Commands
27
-
28
- | Command | Description |
29
- |---------|-------------|
30
- | [`generate`](#generate) | Generate styled jewelry product images |
31
- | [`refine`](#refine) | Apply refinement instructions to an existing image |
32
- | [`upscale`](#upscale) | Upscale an image to higher resolution |
33
- | [`muse`](#muse) | Create a consistent character reference ("Muse") |
34
- | [`video`](#video) | Generate video from a text prompt |
35
- | [`tired-girl`](#tired-girl) | Generate "before" / casual aesthetic images |
36
- | [`annotate`](#annotate) | Overlay text on an image |
37
- | [`grid`](#grid) | Combine multiple images into a grid layout |
38
- | [`list`](#list) | List available templates, backgrounds, vibes, etc. |
39
-
40
- ---
41
-
42
- ## generate
43
-
44
- Generate styled jewelry product images using AI.
45
-
46
- ```bash
47
- lumiere generate --images <paths> --template <id> [options]
48
- ```
49
-
50
- ### Required
51
-
52
- | Flag | Description |
53
- |------|-------------|
54
- | `--images <paths>` | Comma-separated input image paths |
55
- | `--template <id>` | Template ID (see [Templates](#templates)) |
56
-
57
- ### Customization
58
-
59
- | Flag | Description |
60
- |------|-------------|
61
- | `--detail <id>` | Primary customization (template-specific) |
62
- | `--secondary-detail <id>` | Secondary customization |
63
- | `--tertiary-detail <id>` | Tertiary customization |
64
- | `--ethnicity <id>` | Model ethnicity |
65
- | `--skin-tone <id>` | Model skin tone |
66
- | `--hair-color <id>` | Model hair color |
67
- | `--background <id>` | Background color/texture |
68
- | `--background-type <id>` | Background type (studio, interior, exterior, texture) |
69
- | `--vibe <id>` | Photography mood/style |
70
- | `--resolution <id>` | Output aspect ratio (default: `portrait`) |
71
- | `--occasion <id>` | Special occasion theme |
72
-
73
- ### Generation
74
-
75
- | Flag | Description |
76
- |------|-------------|
77
- | `--quantity <n>` | Number of images to generate (default: `1`) |
78
- | `--muse-id <id>` | Muse ID for consistent model appearance |
79
- | `--muse-images <paths>` | Comma-separated Muse reference image paths |
80
- | `--no-enhance` | Skip LLM prompt enhancement |
81
-
82
- ### Example
83
-
84
- ```bash
85
- lumiere generate \
86
- --images "ring.jpg" \
87
- --template hand_model \
88
- --detail nail_red \
89
- --background velvet_black \
90
- --vibe golden_hour \
91
- --quantity 4
92
- ```
93
-
94
- ---
95
-
96
- ## refine
97
-
98
- Apply refinement instructions to an existing generated image.
99
-
100
- ```bash
101
- lumiere refine --image <path> --instruction <text> [options]
102
- ```
103
-
104
- | Flag | Description |
105
- |------|-------------|
106
- | `--image <path>` | **(required)** Path to image to refine |
107
- | `--instruction <text>` | **(required)** Refinement instruction |
108
- | `--size <percent>` | Resize jewelry to given percentage (e.g. `80` = smaller, `120` = larger) |
109
-
110
- ```bash
111
- lumiere refine --image "output.png" --instruction "make the background warmer"
112
- lumiere refine --image "output.png" --instruction "adjust jewelry" --size 80
113
- ```
114
-
115
- ---
116
-
117
- ## upscale
118
-
119
- Upscale an image to higher resolution.
120
-
121
- ```bash
122
- lumiere upscale --image <path> [--scale <n>]
123
- ```
124
-
125
- | Flag | Description |
126
- |------|-------------|
127
- | `--image <path>` | **(required)** Path to image |
128
- | `--scale <n>` | Scale factor (default: `2`) |
129
-
130
- ---
131
-
132
- ## muse
133
-
134
- Create a Muse (consistent character reference) from a source image. Used with the `half_body_muse` template for identity-consistent generations.
135
-
136
- ```bash
137
- lumiere muse --name <name> --source <path> [--variations <n>]
138
- ```
139
-
140
- | Flag | Description |
141
- |------|-------------|
142
- | `--name <name>` | **(required)** Name for the Muse |
143
- | `--source <path>` | **(required)** Path to source image |
144
- | `--variations <n>` | Number of variations to generate (default: `3`) |
145
-
146
- ```bash
147
- lumiere muse --name "Sarah" --source "reference.jpg"
148
- lumiere generate --images "necklace.jpg" --template half_body_muse --muse-id sarah
149
- ```
150
-
151
- ---
152
-
153
- ## video
154
-
155
- Generate a short video from a text prompt.
156
-
157
- ```bash
158
- lumiere video --prompt <text> [options]
159
- ```
160
-
161
- | Flag | Description |
162
- |------|-------------|
163
- | `--prompt <text>` | **(required)** Video description |
164
- | `--aspect <ratio>` | Aspect ratio (`1:1`, `3:4`, `9:16`, `16:9`) |
165
- | `--duration <seconds>` | Duration in seconds |
166
-
167
- Video-enabled templates: `hand_model`, `neck_model`, `ear_model`, `flatlay_creative`, `floating_minimal`, `half_body_muse`.
168
-
169
- ---
170
-
171
- ## tired-girl
172
-
173
- Generate "tired girl" / "before" aesthetic images showing a model in casual, un-styled looks (no jewelry).
174
-
175
- ```bash
176
- lumiere tired-girl [options]
177
- ```
178
-
179
- | Flag | Description |
180
- |------|-------------|
181
- | `--muse-id <id>` | Muse ID for identity reference |
182
- | `--image <path>` | Single reference image (if no Muse) |
183
- | `--styles <ids>` | Comma-separated style IDs |
184
- | `--quantity <n>` | Number of images (default: `1`) |
185
-
186
- ### Available styles
187
-
188
- | ID | Description |
189
- |----|-------------|
190
- | `tired` | Slightly tired, soft under-eye shadows, relaxed expression |
191
- | `morning` | Freshly awake, morning light, sleepy energy |
192
- | `no_makeup` | Completely bare faced |
193
- | `crazy_hair` | Messy, unstyled wild hair |
194
- | `pyjama` | Cozy pajamas or loungewear |
195
-
196
- ```bash
197
- lumiere tired-girl --muse-id sarah --styles "tired,no_makeup" --quantity 2
198
- ```
199
-
200
- ---
201
-
202
- ## annotate
203
-
204
- Overlay text on an image with customizable styling.
205
-
206
- ```bash
207
- lumiere annotate --input <path> --output <path> --text <text> [options]
208
- ```
209
-
210
- ### Required
211
-
212
- | Flag | Description |
213
- |------|-------------|
214
- | `--input <path>` | Input image path |
215
- | `--output <path>` | Output image path |
216
- | `--text <text>` | Text to overlay |
217
-
218
- ### Text styling
219
-
220
- | Flag | Default | Description |
221
- |------|---------|-------------|
222
- | `--font <name>` | `Poppins` | Font family |
223
- | `--size <px>` | auto | Font size in pixels |
224
- | `--weight <n>` | `700` | Font weight |
225
- | `--color <hex>` | `#FFFFFF` | Text color |
226
- | `--stroke-color <value>` | `rgba(0,0,0,0.6)` | Text outline color |
227
- | `--stroke-width <px>` | `fontSize * 0.08` | Text outline width |
228
-
229
- ### Banner
230
-
231
- | Flag | Default | Description |
232
- |------|---------|-------------|
233
- | `--banner` | off | Enable semi-transparent banner behind text |
234
- | `--banner-color <value>` | `rgba(0,0,0,0.45)` | Banner color |
235
- | `--banner-padding <px>` | `fontSize * 0.6` | Banner padding |
236
- | `--banner-radius <px>` | `fontSize * 0.4` | Banner corner radius |
237
-
238
- ### Position
239
-
240
- | Flag | Default | Description |
241
- |------|---------|-------------|
242
- | `--position <pos>` | `bottom-center` | One of: `top-center`, `top-left`, `top-right`, `bottom-center`, `bottom-center-high`, `bottom-left`, `bottom-right`, `center` |
243
- | `--padding <px>` | auto | Padding from edges |
244
- | `--max-width <ratio>` | auto | Max text width as ratio of image width (0-1) |
245
-
246
- ```bash
247
- lumiere annotate \
248
- --input "image.jpg" \
249
- --output "branded.jpg" \
250
- --text "New Collection" \
251
- --position bottom-center \
252
- --banner \
253
- --size 48
254
- ```
255
-
256
- ---
257
-
258
- ## grid
259
-
260
- Combine multiple images into a grid layout.
261
-
262
- ```bash
263
- lumiere grid --inputs <paths> --output <path> [options]
264
- ```
265
-
266
- | Flag | Default | Description |
267
- |------|---------|-------------|
268
- | `--inputs <paths>` | | **(required)** Comma-separated image paths |
269
- | `--output <path>` | | **(required)** Output image path |
270
- | `--columns <n>` | `2` | Number of columns |
271
- | `--rows <n>` | `2` | Number of rows |
272
- | `--padding <px>` | `20` | Padding between tiles |
273
- | `--background <hex>` | `#000000` | Background color |
274
- | `--tile-width <px>` | auto | Fixed tile width |
275
- | `--tile-height <px>` | auto | Fixed tile height |
276
-
277
- ```bash
278
- lumiere grid \
279
- --inputs "img1.jpg,img2.jpg,img3.jpg,img4.jpg" \
280
- --output "grid.jpg" \
281
- --columns 2 --rows 2 \
282
- --padding 10 --background "#FFFFFF"
283
- ```
284
-
285
- ---
286
-
287
- ## list
288
-
289
- List available options for any category. Output is JSON.
290
-
291
- ```bash
292
- lumiere list <type>
293
- ```
294
-
295
- | Type | Description |
296
- |------|-------------|
297
- | `templates` | All templates with their customization options |
298
- | `ethnicities` | Model ethnicity options |
299
- | `skin-tones` | Skin tone options |
300
- | `hair-colors` | Hair color options |
301
- | `backgrounds` | Background color/texture options |
302
- | `background-types` | Background type options |
303
- | `vibes` | Photography mood options |
304
- | `resolutions` | Aspect ratio options |
305
- | `occasions` | Special occasion themes |
306
-
307
- ---
308
-
309
- ## Templates
310
-
311
- ### `hand_model` -- Hand Model
312
-
313
- Close-up of a model's hand, wrist, and forearm. Perfect for rings and bracelets.
314
-
315
- | Customization | Options |
316
- |---------------|---------|
317
- | **Nail Polish** (`--detail`) | `nail_nude` Soft Nude, `nail_red` Classic Red, `nail_french` French Manicure, `nail_natural` Natural & Clean, `nail_dark` Noir / Dark |
318
-
319
- ---
320
-
321
- ### `neck_model` -- Neckline Portrait
322
-
323
- Waist-up portrait focusing on the neck and collarbone. Ideal for necklaces and pendants.
324
-
325
- | Customization | Options |
326
- |---------------|---------|
327
- | **Wardrobe** (`--detail`) | `wear_skin` Bare Skin, `wear_silk` White Silk Shirt, `wear_black` Black Turtleneck, `wear_gown` Evening Gown, `wear_kaftan` Modern Kaftan |
328
- | **Makeup** (`--tertiary-detail`) | `makeup_none` Bare, `makeup_minimal` Minimal, `makeup_soft` Soft Glam, `makeup_full` Full Glam, `makeup_editorial` Editorial |
329
-
330
- ---
331
-
332
- ### `ear_model` -- Ear Detail
333
-
334
- Intimate side profile shot. Best for earrings.
335
-
336
- | Customization | Options |
337
- |---------------|---------|
338
- | **Hairstyle** (`--detail`) | `hair_tucked` Tucked Behind Ear, `hair_updo` Elegant Updo, `hair_waves` Loose Waves, `hair_sleek` Sleek & Straight |
339
- | **Makeup** (`--tertiary-detail`) | `makeup_none` Bare, `makeup_minimal` Minimal, `makeup_soft` Soft Glam, `makeup_full` Full Glam, `makeup_editorial` Editorial |
340
-
341
- ---
342
-
343
- ### `flatlay_creative` -- Creative Flatlay
344
-
345
- Artistic still-life composition on a surface. No model. Great for any jewelry type.
346
-
347
- | Customization | Options |
348
- |---------------|---------|
349
- | **Surface** (`--detail`) | `surf_marble` White Marble, `surf_stone` Dark Slate, `surf_velvet` Beige Velvet, `surf_wood` Aged Wood, `surf_sand` Fine Sand, `surf_pedestal` Geometric Pedestal, `surf_riser` Stone Riser |
350
-
351
- ---
352
-
353
- ### `floating_minimal` -- Floating Minimalist
354
-
355
- Jewelry suspended in mid-air with dramatic lighting. No model.
356
-
357
- | Customization | Options |
358
- |---------------|---------|
359
- | **Lighting** (`--detail`) | `light_soft` Soft & Diffused, `light_hard` Hard Contrast, `light_warm` Golden Glow, `light_cool` Cool Steel |
360
-
361
- ---
362
-
363
- ### `half_body_muse` -- The Editorial Muse
364
-
365
- Dynamic waist-up fashion shot. The only template that supports Muse (consistent model identity).
366
-
367
- | Customization | Options |
368
- |---------------|---------|
369
- | **Outfit** (`--detail`) | `outfit_blazer` Power Suit, `outfit_evening` Evening Glamour, `outfit_linen` Resort Linen, `outfit_knit` Cashmere Knit, `outfit_silk` Silk Shirt, `outfit_turtleneck` Turtleneck |
370
- | **Nail Polish** (`--secondary-detail`) | `nail_nude` Soft Nude, `nail_red` Classic Red, `nail_french` French Manicure, `nail_natural` Natural & Clean, `nail_dark` Noir / Dark |
371
- | **Makeup** (`--tertiary-detail`) | `makeup_none` Bare, `makeup_minimal` Minimal, `makeup_soft` Soft Glam, `makeup_full` Full Glam, `makeup_editorial` Editorial |
372
- | **Pose** (quaternary) | `pose_winking`, `pose_grimace`, `pose_teasing`, `pose_kiss`, `pose_laughing`, `pose_pout`, `pose_peace` |
373
-
374
- ---
375
-
376
- ### `romance_proposal` -- Romance & Proposal
377
-
378
- Emotional engagement ring moments with a couple.
379
-
380
- | Customization | Options |
381
- |---------------|---------|
382
- | **Moment** (`--detail`) | `moment_proposal` The Proposal, `moment_said_yes` Just Said Yes, `moment_hand_in_hand` Hand in Hand, `moment_dinner` Intimate Dinner, `moment_promise` The Promise |
383
- | **Setting** (`--secondary-detail`) | `setting_garden` Garden, `setting_restaurant` Candlelit Restaurant, `setting_beach` Beach at Sunset, `setting_home` Cozy at Home, `setting_rooftop` Rooftop City Views, `setting_winter` Winter Snow |
384
- | **Nail Polish** (`--tertiary-detail`) | `nail_nude` Soft Nude, `nail_red` Classic Red, `nail_french` French Manicure, `nail_natural` Natural & Clean, `nail_dark` Noir / Dark |
385
-
386
- ---
387
-
388
- ### `museum_exhibit` -- Museum Exhibit
389
-
390
- Jewelry displayed as a priceless museum artifact. No model.
391
-
392
- | Customization | Options |
393
- |---------------|---------|
394
- | **Museum Style** (`--detail`) | `museum_classical` Classical Gallery, `museum_modern` Modern Art Museum, `museum_baroque` Baroque Palace, `museum_art_deco` Art Deco Gallery |
395
- | **Display Type** (`--secondary-detail`) | `display_vitrine` Glass Vitrine, `display_pedestal` Velvet Pedestal, `display_stand` Open Display, `display_wall` Wall Mount, `display_alcove` Illuminated Alcove |
396
-
397
- ---
398
-
399
- ### `romantic_mood` -- Romantic Mood
400
-
401
- Jewelry styled as a romantic still life with props. No model.
402
-
403
- | Customization | Options |
404
- |---------------|---------|
405
- | **Props** (`--detail`) | `prop_rose_petals` Rose Petals, `prop_candles` Candlelight, `prop_love_letter` Love Letter, `prop_silk_lace` Silk & Lace, `prop_fresh_roses` Fresh Roses, `prop_gift_box` The Gift |
406
- | **Mood** (`--secondary-detail`) | `mood_candlelight` Warm Candlelight, `mood_morning` Soft Morning Light, `mood_moody` Moody & Dark, `mood_golden` Golden Hour Glow, `mood_blush` Blush Pink Haze |
407
-
408
- ---
409
-
410
- ## Global Options
411
-
412
- ### Ethnicities (`--ethnicity`)
413
-
414
- | ID | Name |
415
- |----|------|
416
- | `european` | European |
417
- | `moroccan` | Moroccan |
418
- | `middle_east` | Middle Eastern |
419
- | `african` | African |
420
- | `asian` | East Asian |
421
-
422
- ### Skin Tones (`--skin-tone`)
423
-
424
- | ID | Name |
425
- |----|------|
426
- | `fair` | Porcelain |
427
- | `light` | Light |
428
- | `medium` | Tan |
429
- | `deep` | Deep |
430
- | `dark` | Ebony |
431
-
432
- ### Hair Colors (`--hair-color`)
433
-
434
- | ID | Name |
435
- |----|------|
436
- | `dark` | Dark / Black |
437
- | `brunette` | Brunette |
438
- | `blonde` | Blonde |
439
- | `red` | Red / Auburn |
440
- | `grey` | Silver / Grey |
441
-
442
- ### Backgrounds (`--background`)
443
-
444
- | ID | Name |
445
- |----|------|
446
- | `silk_cream` | Cream Silk |
447
- | `velvet_black` | Midnight Velvet |
448
- | `marble_white` | Carrara Marble |
449
- | `emerald_velvet` | Emerald Velvet |
450
- | `studio_grey` | Studio Grey |
451
- | `warm_beige` | Warm Beige |
452
- | `burgundy_velvet` | Burgundy Velvet |
453
- | `champagne_gold` | Champagne Gold |
454
- | `navy_sapphire` | Navy Sapphire |
455
- | `blush_rose` | Blush Rose |
456
- | `ivory_pearl` | Ivory Pearl |
457
- | `slate_charcoal` | Slate Charcoal |
458
-
459
- ### Background Types (`--background-type`)
460
-
461
- | ID | Name |
462
- |----|------|
463
- | `studio` | Studio Flat |
464
- | `interior` | Luxury Interior |
465
- | `exterior` | Outdoors |
466
- | `texture` | Macro Texture |
467
-
468
- ### Vibes (`--vibe`)
469
-
470
- | ID | Name |
471
- |----|------|
472
- | `golden_hour` | Golden Hour -- warm natural sunlight |
473
- | `moody_chic` | Moody Chic -- dramatic shadows, high contrast |
474
- | `clean_minimal` | Clean Minimal -- bright, airy, minimalist |
475
- | `romantic_soft` | Romantic -- soft focus, pastel tones |
476
-
477
- ### Resolutions (`--resolution`)
478
-
479
- | ID | Aspect Ratio | Best for |
480
- |----|-------------|----------|
481
- | `square` | 1:1 | Instagram Feed |
482
- | `portrait` | 3:4 | Instagram Feed (vertical) |
483
- | `story` | 9:16 | Instagram Stories / Reels |
484
- | `landscape` | 16:9 | Website / Ads |
485
-
486
- ### Occasions (`--occasion`)
487
-
488
- Occasions auto-configure vibe, background, and background type, and inject thematic prompt details.
489
-
490
- | ID | Name |
491
- |----|------|
492
- | `moroccan_wedding` | Moroccan Wedding |
493
- | `eid_fitr` | Eid al-Fitr |
494
- | `eid_adha` | Eid al-Adha |
495
- | `henna_night` | Henna Night |
496
- | `ramadan` | Ramadan |
497
- | `valentines` | Valentine's Day |
498
- | `mothers_day` | Mother's Day |
499
- | `birthday` | Birthday |
500
- | `anniversary` | Anniversary |
501
- | `graduation` | Graduation |
502
- | `christmas` | Christmas |
503
- | `new_year` | New Year |
504
-
505
- ---
506
-
507
- ## SDK Usage
508
-
509
- ```ts
510
- import { generateImages } from "studio-lumiere-cli";
511
-
512
- const result = await generateImages(
513
- { apiKey: "your-key", outputDir: "outputs" },
514
- {
515
- inputImages: ["./ring.jpg"],
516
- quantity: 4,
517
- selections: {
518
- templateId: "hand_model",
519
- detailId: "nail_red",
520
- backgroundId: "velvet_black",
521
- vibeId: "golden_hour",
522
- resolutionId: "portrait",
523
- },
524
- }
525
- );
526
- ```
527
-
528
- ## Notes
529
-
530
- - Templates, backgrounds, vibes, and all shared options are synced from the main Studio Lumiere web app at build time (`npm run sync`). The CLI always matches the web app.
531
- - The Muse flow generates variations and stores a local `muses.json` index under your output directory.
532
- - Video generation uses Veo via the Gemini SDK and returns an operation name plus the video file when available.
1
+ # Studio Lumiere CLI
2
+
3
+ Local SDK + CLI for AI-powered jewelry product photography. Generate editorial-quality images, videos, and compositions from reference jewelry photos.
4
+
5
+ ```bash
6
+ npx studio-lumiere-cli <command> [options]
7
+ ```
8
+
9
+ ## Setup
10
+
11
+ 1. Install dependencies
12
+
13
+ ```
14
+ npm install
15
+ ```
16
+
17
+ 2. Create `.env`
18
+
19
+ ```
20
+ GEMINI_API_KEY=your_key_here
21
+ LUMIERE_OUTPUT_DIR=outputs
22
+ ```
23
+
24
+ ---
25
+
26
+ ## Commands
27
+
28
+ | Command | Description |
29
+ |---------|-------------|
30
+ | [`generate`](#generate) | Generate styled jewelry product images |
31
+ | [`refine`](#refine) | Apply refinement instructions to an existing image |
32
+ | [`upscale`](#upscale) | Upscale an image to higher resolution |
33
+ | [`muse`](#muse) | Create a consistent character reference ("Muse") |
34
+ | [`video`](#video) | Generate video from a text prompt |
35
+ | [`tired-girl`](#tired-girl) | Generate "before" / casual aesthetic images |
36
+ | [`annotate`](#annotate) | Overlay text on an image |
37
+ | [`grid`](#grid) | Combine multiple images into a grid layout |
38
+ | [`list`](#list) | List available templates, backgrounds, vibes, etc. |
39
+
40
+ ---
41
+
42
+ ## generate
43
+
44
+ Generate styled jewelry product images using AI.
45
+
46
+ ```bash
47
+ lumiere generate --images <paths> --template <id> [options]
48
+ ```
49
+
50
+ ### Required
51
+
52
+ | Flag | Description |
53
+ |------|-------------|
54
+ | `--images <paths>` | Comma-separated input image paths |
55
+ | `--template <id>` | Template ID (see [Templates](#templates)) |
56
+
57
+ ### Customization
58
+
59
+ | Flag | Description |
60
+ |------|-------------|
61
+ | `--detail <id>` | Primary customization (template-specific) |
62
+ | `--secondary-detail <id>` | Secondary customization |
63
+ | `--tertiary-detail <id>` | Tertiary customization |
64
+ | `--quaternary-detail <id>` | Quaternary customization |
65
+ | `--quinary-detail <id>` | Quinary customization |
66
+ | `--ethnicity <id>` | Model ethnicity |
67
+ | `--skin-tone <id>` | Model skin tone |
68
+ | `--hair-color <id>` | Model hair color |
69
+ | `--background <id>` | Background color/texture |
70
+ | `--background-type <id>` | Background type (studio, interior, exterior, texture) |
71
+ | `--vibe <id>` | Photography mood/style |
72
+ | `--photography-style <id>` | Overall photography style |
73
+ | `--resolution <id>` | Output aspect ratio (default: `portrait`) |
74
+ | `--occasion <id>` | Special occasion theme |
75
+
76
+ ### Generation
77
+
78
+ | Flag | Description |
79
+ |------|-------------|
80
+ | `--quantity <n>` | Number of images to generate (default: `1`) |
81
+ | `--muse-id <id>` | Muse ID for consistent model appearance |
82
+ | `--muse-images <paths>` | Comma-separated Muse reference image paths |
83
+ | `--no-enhance` | Skip LLM prompt enhancement |
84
+
85
+ ### Example
86
+
87
+ ```bash
88
+ lumiere generate \
89
+ --images "ring.jpg" \
90
+ --template hand_model \
91
+ --detail nail_red \
92
+ --background velvet_black \
93
+ --vibe golden_hour \
94
+ --quantity 4
95
+ ```
96
+
97
+ ---
98
+
99
+ ## refine
100
+
101
+ Apply refinement instructions to an existing generated image.
102
+
103
+ ```bash
104
+ lumiere refine --image <path> --instruction <text> [options]
105
+ ```
106
+
107
+ | Flag | Description |
108
+ |------|-------------|
109
+ | `--image <path>` | **(required)** Path to image to refine |
110
+ | `--instruction <text>` | **(required)** Refinement instruction |
111
+ | `--size <percent>` | Resize jewelry to given percentage (e.g. `80` = smaller, `120` = larger) |
112
+
113
+ ```bash
114
+ lumiere refine --image "output.png" --instruction "make the background warmer"
115
+ lumiere refine --image "output.png" --instruction "adjust jewelry" --size 80
116
+ ```
117
+
118
+ ---
119
+
120
+ ## upscale
121
+
122
+ Upscale an image to higher resolution.
123
+
124
+ ```bash
125
+ lumiere upscale --image <path> [--scale <n>]
126
+ ```
127
+
128
+ | Flag | Description |
129
+ |------|-------------|
130
+ | `--image <path>` | **(required)** Path to image |
131
+ | `--scale <n>` | Scale factor (default: `2`) |
132
+
133
+ ---
134
+
135
+ ## muse
136
+
137
+ Create a Muse (consistent character reference) from a source image. Used with the `half_body_muse` template for identity-consistent generations.
138
+
139
+ ```bash
140
+ lumiere muse --name <name> --source <path> [--variations <n>]
141
+ ```
142
+
143
+ | Flag | Description |
144
+ |------|-------------|
145
+ | `--name <name>` | **(required)** Name for the Muse |
146
+ | `--source <path>` | **(required)** Path to source image |
147
+ | `--variations <n>` | Number of variations to generate (default: `3`) |
148
+
149
+ ```bash
150
+ lumiere muse --name "Sarah" --source "reference.jpg"
151
+ lumiere generate --images "necklace.jpg" --template half_body_muse --muse-id sarah
152
+ ```
153
+
154
+ ---
155
+
156
+ ## video
157
+
158
+ Generate a short video from a text prompt.
159
+
160
+ ```bash
161
+ lumiere video --prompt <text> [options]
162
+ ```
163
+
164
+ | Flag | Description |
165
+ |------|-------------|
166
+ | `--prompt <text>` | **(required)** Video description |
167
+ | `--aspect <ratio>` | Aspect ratio (`1:1`, `3:4`, `9:16`, `16:9`) |
168
+ | `--duration <seconds>` | Duration in seconds |
169
+
170
+ Video-enabled templates: `hand_model`, `neck_model`, `ear_model`, `flatlay_creative`, `floating_minimal`, `half_body_muse`.
171
+
172
+ ---
173
+
174
+ ## tired-girl
175
+
176
+ Generate "tired girl" / "before" aesthetic images showing a model in casual, un-styled looks (no jewelry).
177
+
178
+ ```bash
179
+ lumiere tired-girl [options]
180
+ ```
181
+
182
+ | Flag | Description |
183
+ |------|-------------|
184
+ | `--muse-id <id>` | Muse ID for identity reference |
185
+ | `--image <path>` | Single reference image (if no Muse) |
186
+ | `--styles <ids>` | Comma-separated style IDs |
187
+ | `--quantity <n>` | Number of images (default: `1`) |
188
+
189
+ ### Available styles
190
+
191
+ | ID | Description |
192
+ |----|-------------|
193
+ | `tired` | Slightly tired, soft under-eye shadows, relaxed expression |
194
+ | `morning` | Freshly awake, morning light, sleepy energy |
195
+ | `no_makeup` | Completely bare faced |
196
+ | `crazy_hair` | Messy, unstyled wild hair |
197
+ | `pyjama` | Cozy pajamas or loungewear |
198
+
199
+ ```bash
200
+ lumiere tired-girl --muse-id sarah --styles "tired,no_makeup" --quantity 2
201
+ ```
202
+
203
+ ---
204
+
205
+ ## annotate
206
+
207
+ Overlay text on an image with customizable styling.
208
+
209
+ ```bash
210
+ lumiere annotate --input <path> --output <path> --text <text> [options]
211
+ ```
212
+
213
+ ### Required
214
+
215
+ | Flag | Description |
216
+ |------|-------------|
217
+ | `--input <path>` | Input image path |
218
+ | `--output <path>` | Output image path |
219
+ | `--text <text>` | Text to overlay |
220
+
221
+ ### Text styling
222
+
223
+ | Flag | Default | Description |
224
+ |------|---------|-------------|
225
+ | `--font <name>` | `Poppins` | Font family |
226
+ | `--size <px>` | auto | Font size in pixels |
227
+ | `--weight <n>` | `700` | Font weight |
228
+ | `--color <hex>` | `#FFFFFF` | Text color |
229
+ | `--stroke-color <value>` | `rgba(0,0,0,0.6)` | Text outline color |
230
+ | `--stroke-width <px>` | `fontSize * 0.08` | Text outline width |
231
+
232
+ ### Banner
233
+
234
+ | Flag | Default | Description |
235
+ |------|---------|-------------|
236
+ | `--banner` | off | Enable semi-transparent banner behind text |
237
+ | `--banner-color <value>` | `rgba(0,0,0,0.45)` | Banner color |
238
+ | `--banner-padding <px>` | `fontSize * 0.6` | Banner padding |
239
+ | `--banner-radius <px>` | `fontSize * 0.4` | Banner corner radius |
240
+
241
+ ### Position
242
+
243
+ | Flag | Default | Description |
244
+ |------|---------|-------------|
245
+ | `--position <pos>` | `bottom-center` | One of: `top-center`, `top-left`, `top-right`, `bottom-center`, `bottom-center-high`, `bottom-left`, `bottom-right`, `center` |
246
+ | `--padding <px>` | auto | Padding from edges |
247
+ | `--max-width <ratio>` | auto | Max text width as ratio of image width (0-1) |
248
+
249
+ ```bash
250
+ lumiere annotate \
251
+ --input "image.jpg" \
252
+ --output "branded.jpg" \
253
+ --text "New Collection" \
254
+ --position bottom-center \
255
+ --banner \
256
+ --size 48
257
+ ```
258
+
259
+ ---
260
+
261
+ ## grid
262
+
263
+ Combine multiple images into a grid layout.
264
+
265
+ ```bash
266
+ lumiere grid --inputs <paths> --output <path> [options]
267
+ ```
268
+
269
+ | Flag | Default | Description |
270
+ |------|---------|-------------|
271
+ | `--inputs <paths>` | | **(required)** Comma-separated image paths |
272
+ | `--output <path>` | | **(required)** Output image path |
273
+ | `--columns <n>` | `2` | Number of columns |
274
+ | `--rows <n>` | `2` | Number of rows |
275
+ | `--padding <px>` | `20` | Padding between tiles |
276
+ | `--background <hex>` | `#000000` | Background color |
277
+ | `--tile-width <px>` | auto | Fixed tile width |
278
+ | `--tile-height <px>` | auto | Fixed tile height |
279
+
280
+ ```bash
281
+ lumiere grid \
282
+ --inputs "img1.jpg,img2.jpg,img3.jpg,img4.jpg" \
283
+ --output "grid.jpg" \
284
+ --columns 2 --rows 2 \
285
+ --padding 10 --background "#FFFFFF"
286
+ ```
287
+
288
+ ---
289
+
290
+ ## list
291
+
292
+ List available options for any category. Output is JSON.
293
+
294
+ ```bash
295
+ lumiere list <type>
296
+ ```
297
+
298
+ | Type | Description |
299
+ |------|-------------|
300
+ | `templates` | All templates with their customization options |
301
+ | `ethnicities` | Model ethnicity options |
302
+ | `skin-tones` | Skin tone options |
303
+ | `hair-colors` | Hair color options |
304
+ | `backgrounds` | Background color/texture options |
305
+ | `background-types` | Background type options |
306
+ | `vibes` | Photography mood options |
307
+ | `photography-styles` | Overall photography style options |
308
+ | `resolutions` | Aspect ratio options |
309
+ | `occasions` | Special occasion themes |
310
+
311
+ ---
312
+
313
+ ## Templates
314
+
315
+ ### `hand_model` -- Hand Model
316
+
317
+ Close-up of a model's hand, wrist, and forearm. Perfect for rings and bracelets.
318
+
319
+ | Customization | Options |
320
+ |---------------|---------|
321
+ | **Nail Polish** (`--detail`) | `nail_nude` Soft Nude, `nail_red` Classic Red, `nail_french` French Manicure, `nail_natural` Natural & Clean, `nail_dark` Noir / Dark |
322
+
323
+ ---
324
+
325
+ ### `neck_model` -- Neckline Portrait
326
+
327
+ Waist-up portrait focusing on the neck and collarbone. Ideal for necklaces and pendants.
328
+
329
+ | Customization | Options |
330
+ |---------------|---------|
331
+ | **Wardrobe** (`--detail`) | `wear_skin` Bare Skin, `wear_silk` White Silk Shirt, `wear_black` Black Turtleneck, `wear_gown` Evening Gown, `wear_kaftan` Modern Kaftan |
332
+ | **Makeup** (`--tertiary-detail`) | `makeup_none` Bare, `makeup_minimal` Minimal, `makeup_soft` Soft Glam, `makeup_full` Full Glam, `makeup_editorial` Editorial |
333
+
334
+ ---
335
+
336
+ ### `ear_model` -- Ear Detail
337
+
338
+ Intimate side profile shot. Best for earrings.
339
+
340
+ | Customization | Options |
341
+ |---------------|---------|
342
+ | **Hairstyle** (`--detail`) | `hair_tucked` Tucked Behind Ear, `hair_updo` Elegant Updo, `hair_waves` Loose Waves, `hair_sleek` Sleek & Straight |
343
+ | **Makeup** (`--tertiary-detail`) | `makeup_none` Bare, `makeup_minimal` Minimal, `makeup_soft` Soft Glam, `makeup_full` Full Glam, `makeup_editorial` Editorial |
344
+
345
+ ---
346
+
347
+ ### `flatlay_creative` -- Creative Flatlay
348
+
349
+ Artistic still-life composition on a surface. No model. Great for any jewelry type.
350
+
351
+ | Customization | Options |
352
+ |---------------|---------|
353
+ | **Surface** (`--detail`) | `surf_marble` White Marble, `surf_stone` Dark Slate, `surf_velvet` Beige Velvet, `surf_wood` Aged Wood, `surf_sand` Fine Sand, `surf_travertine` Travertine, `surf_obsidian` Black Obsidian, `surf_mirrored` Mirrored Glass, `surf_brushed_metal` Brushed Metal, `surf_frosted_acrylic` Frosted Acrylic, `surf_pedestal` Geometric Pedestal, `surf_riser` Stone Riser |
354
+
355
+ ---
356
+
357
+ ### `floating_minimal` -- Floating Minimalist
358
+
359
+ Jewelry suspended in mid-air with dramatic lighting. No model.
360
+
361
+ | Customization | Options |
362
+ |---------------|---------|
363
+ | **Lighting** (`--detail`) | `light_soft` Soft & Diffused, `light_hard` Hard Contrast, `light_warm` Golden Glow, `light_cool` Cool Steel |
364
+
365
+ ---
366
+
367
+ ### `half_body_muse` -- The Editorial Muse
368
+
369
+ Dynamic waist-up fashion shot. The only template that supports Muse (consistent model identity).
370
+
371
+ | Customization | Options |
372
+ |---------------|---------|
373
+ | **Outfit** (`--detail`) | `outfit_director_choice` Creative Director's Choice, `outfit_blazer` Power Suit (Blazer), `outfit_tailored_jumpsuit` Tailored Jumpsuit, `outfit_evening` Evening Glamour, `outfit_leather_jacket` Leather Jacket, `outfit_linen` Resort Linen, `outfit_knit` Cashmere Knit, `outfit_silk` Silk Shirt, `outfit_turtleneck` Turtleneck, `outfit_tailored_trench` Tailored Trench |
374
+ | **Nail Polish** (`--secondary-detail`) | `nail_nude` Soft Nude, `nail_red` Classic Red, `nail_french` French Manicure, `nail_natural` Natural & Clean, `nail_dark` Noir / Dark |
375
+ | **Makeup** (`--tertiary-detail`) | `makeup_none` Bare, `makeup_minimal` Minimal, `makeup_soft` Soft Glam, `makeup_full` Full Glam, `makeup_editorial` Editorial |
376
+ | **Pose** (`--quaternary-detail`) | `pose_winking`, `pose_grimace`, `pose_teasing`, `pose_kiss`, `pose_laughing`, `pose_pout`, `pose_power_tilt`, `pose_hand_ear`, `pose_profile`, `pose_over_shoulder`, `pose_peace` |
377
+ | **Accessories & Styling** (`--quinary-detail`) | `accessory_sunglasses`, `accessory_silk_scarf`, `accessory_silk_headband`, `accessory_sheer_gloves`, `accessory_statement_belt`, `accessory_silk_bandana`, `accessory_silk_tie`, `accessory_hair_clip`, `accessory_beret`, `accessory_wide_brim_hat`, `accessory_leather_gloves` |
378
+
379
+
380
+ ---
381
+
382
+ ### `romance_proposal` -- Romance & Proposal
383
+
384
+ Emotional engagement ring moments with a couple.
385
+
386
+ | Customization | Options |
387
+ |---------------|---------|
388
+ | **Moment** (`--detail`) | `moment_proposal` The Proposal, `moment_said_yes` Just Said Yes, `moment_hand_in_hand` Hand in Hand, `moment_dinner` Intimate Dinner, `moment_promise` The Promise |
389
+ | **Setting** (`--secondary-detail`) | `setting_garden` Garden, `setting_restaurant` Candlelit Restaurant, `setting_beach` Beach at Sunset, `setting_home` Cozy at Home, `setting_rooftop` Rooftop City Views, `setting_winter` Winter Snow |
390
+ | **Nail Polish** (`--tertiary-detail`) | `nail_nude` Soft Nude, `nail_red` Classic Red, `nail_french` French Manicure, `nail_natural` Natural & Clean, `nail_dark` Noir / Dark |
391
+
392
+ ---
393
+
394
+ ### `museum_exhibit` -- Museum Exhibit
395
+
396
+ Jewelry displayed as a priceless museum artifact. No model.
397
+
398
+ | Customization | Options |
399
+ |---------------|---------|
400
+ | **Museum Style** (`--detail`) | `museum_classical` Classical Gallery, `museum_modern` Modern Art Museum, `museum_baroque` Baroque Palace, `museum_art_deco` Art Deco Gallery |
401
+ | **Display Type** (`--secondary-detail`) | `display_vitrine` Glass Vitrine, `display_pedestal` Velvet Pedestal, `display_stand` Open Display, `display_wall` Wall Mount, `display_alcove` Illuminated Alcove |
402
+
403
+ ---
404
+
405
+ ### `romantic_mood` -- Romantic Mood
406
+
407
+ Jewelry styled as a romantic still life with props. No model.
408
+
409
+ | Customization | Options |
410
+ |---------------|---------|
411
+ | **Props** (`--detail`) | `prop_rose_petals` Rose Petals, `prop_candles` Candlelight, `prop_love_letter` Love Letter, `prop_silk_lace` Silk & Lace, `prop_fresh_roses` Fresh Roses, `prop_gift_box` The Gift |
412
+ | **Mood** (`--secondary-detail`) | `mood_candlelight` Warm Candlelight, `mood_morning` Soft Morning Light, `mood_moody` Moody & Dark, `mood_golden` Golden Hour Glow, `mood_blush` Blush Pink Haze |
413
+
414
+ ---
415
+
416
+ ## Global Options
417
+
418
+ ### Ethnicities (`--ethnicity`)
419
+
420
+ | ID | Name |
421
+ |----|------|
422
+ | `european` | European |
423
+ | `moroccan` | Moroccan |
424
+ | `middle_east` | Middle Eastern |
425
+ | `african` | African |
426
+ | `asian` | East Asian |
427
+
428
+ ### Skin Tones (`--skin-tone`)
429
+
430
+ | ID | Name |
431
+ |----|------|
432
+ | `fair` | Porcelain |
433
+ | `light` | Light |
434
+ | `medium` | Tan |
435
+ | `deep` | Deep |
436
+ | `dark` | Ebony |
437
+
438
+ ### Hair Colors (`--hair-color`)
439
+
440
+ | ID | Name |
441
+ |----|------|
442
+ | `dark` | Dark / Black |
443
+ | `brunette` | Brunette |
444
+ | `blonde` | Blonde |
445
+ | `red` | Red / Auburn |
446
+ | `grey` | Silver / Grey |
447
+
448
+ ### Backgrounds (`--background`)
449
+
450
+ | ID | Name |
451
+ |----|------|
452
+ | `silk_cream` | Cream Silk |
453
+ | `velvet_black` | Midnight Velvet |
454
+ | `marble_white` | Carrara Marble |
455
+ | `emerald_velvet` | Emerald Velvet |
456
+ | `studio_grey` | Studio Grey |
457
+ | `warm_beige` | Warm Beige |
458
+ | `burgundy_velvet` | Burgundy Velvet |
459
+ | `champagne_gold` | Champagne Gold |
460
+ | `navy_sapphire` | Navy Sapphire |
461
+ | `blush_rose` | Blush Rose |
462
+ | `ivory_pearl` | Ivory Pearl |
463
+ | `slate_charcoal` | Slate Charcoal |
464
+
465
+ ### Background Types (`--background-type`)
466
+
467
+ | ID | Name |
468
+ |----|------|
469
+ | `studio` | Studio Flat |
470
+ | `interior` | Luxury Interior |
471
+ | `exterior` | Outdoors |
472
+ | `texture` | Macro Texture |
473
+
474
+ ### Vibes (`--vibe`)
475
+
476
+ | ID | Name |
477
+ |----|------|
478
+ | `golden_hour` | Golden Hour -- warm natural sunlight |
479
+ | `moody_chic` | Moody Chic -- dramatic shadows, high contrast |
480
+ | `clean_minimal` | Clean Minimal -- bright, airy, minimalist |
481
+ | `romantic_soft` | Romantic -- soft focus, pastel tones |
482
+
483
+ ### Photography Styles (`--photography-style`)
484
+
485
+ | ID | Name |
486
+ |----|------|
487
+ | `ethereal_dream` | Ethereal Dream |
488
+ | `heritage_luxury` | High-Flash Raw |
489
+ | `modern_edge` | Modern Edge |
490
+ | `soft_natural` | Chromatic Gel |
491
+ | `acid_lofi` | Acid Infrared |
492
+ | `cyber_grit` | Cyber-Grit Noir |
493
+ | `cinematic_editorial` | Cinematic Editorial |
494
+
495
+ ### Resolutions (`--resolution`)
496
+
497
+ | ID | Aspect Ratio | Best for |
498
+ |----|-------------|----------|
499
+ | `square` | 1:1 | Instagram Feed |
500
+ | `portrait` | 3:4 | Instagram Feed (vertical) |
501
+ | `story` | 9:16 | Instagram Stories / Reels |
502
+ | `landscape` | 16:9 | Website / Ads |
503
+
504
+ ### Occasions (`--occasion`)
505
+
506
+ Occasions inject cultural/thematic elements (plus decor when available). They do not auto-configure background or vibe.
507
+
508
+ | ID | Name |
509
+ |----|------|
510
+ | `moroccan_wedding` | Moroccan Wedding |
511
+ | `eid_fitr` | Eid al-Fitr |
512
+ | `eid_adha` | Eid al-Adha |
513
+ | `henna_night` | Henna Night |
514
+ | `ramadan` | Ramadan |
515
+ | `valentines` | Valentine's Day |
516
+ | `mothers_day` | Mother's Day |
517
+ | `birthday` | Birthday |
518
+ | `anniversary` | Anniversary |
519
+ | `graduation` | Graduation |
520
+ | `christmas` | Christmas |
521
+ | `new_year` | New Year |
522
+
523
+ ---
524
+
525
+ ## SDK Usage
526
+
527
+ ```ts
528
+ import { generateImages } from "studio-lumiere-cli";
529
+
530
+ const result = await generateImages(
531
+ { apiKey: "your-key", outputDir: "outputs" },
532
+ {
533
+ inputImages: ["./ring.jpg"],
534
+ quantity: 4,
535
+ selections: {
536
+ templateId: "hand_model",
537
+ detailId: "nail_red",
538
+ backgroundId: "velvet_black",
539
+ vibeId: "golden_hour",
540
+ resolutionId: "portrait",
541
+ },
542
+ }
543
+ );
544
+ ```
545
+
546
+ ## Notes
547
+
548
+ - Templates, backgrounds, vibes, and all shared options are synced from the main Studio Lumiere web app at build time (`npm run sync`). The CLI always matches the web app.
549
+ - The Muse flow generates variations and stores a local `muses.json` index under your output directory.
550
+ - Video generation uses Veo via the Gemini SDK and returns an operation name plus the video file when available.