egaki 0.0.1 → 0.0.2

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.
@@ -0,0 +1,729 @@
1
+ // Single source of truth for all image generation models.
2
+ // Every model's provider, pricing, features, and generation strategy lives here.
3
+ // Other modules derive their data from this catalog — no separate registries.
4
+ //
5
+ // To add a model: add an entry to CATALOG with the right shared fragment spread.
6
+ // To update pricing: change the cost field on the model entry.
7
+ // To add a provider: create a new shared fragment and add models using it.
8
+ // ─── shared fragments ────────────────────────────────────────────────────────
9
+ // Spread these into model entries to avoid repeating common fields.
10
+ const googleImagen = {
11
+ provider: 'google',
12
+ strategy: 'image',
13
+ features: {
14
+ editing: true,
15
+ inpainting: true,
16
+ aspectRatios: ['1:1', '3:4', '4:3', '9:16', '16:9'],
17
+ seed: true,
18
+ multipleImages: true,
19
+ },
20
+ };
21
+ const googleText = {
22
+ provider: 'google',
23
+ strategy: 'text',
24
+ features: {
25
+ editing: true,
26
+ inpainting: false,
27
+ aspectRatios: ['1:1', '3:4', '4:3', '9:16', '16:9', '2:3', '3:2', '4:5', '5:4'],
28
+ seed: false,
29
+ multipleImages: false,
30
+ },
31
+ };
32
+ const openaiImage = {
33
+ provider: 'openai',
34
+ strategy: 'image',
35
+ };
36
+ const replicateImage = {
37
+ provider: 'replicate',
38
+ strategy: 'image',
39
+ };
40
+ const falImage = {
41
+ provider: 'fal',
42
+ strategy: 'image',
43
+ };
44
+ const fluxAspectRatios = ['1:1', '3:4', '4:3', '9:16', '16:9', '9:21', '21:9'];
45
+ // ─── catalog ─────────────────────────────────────────────────────────────────
46
+ export const CATALOG = [
47
+ // ── Google: Imagen ─────────────────────────────────────────────────────
48
+ {
49
+ id: 'imagen-4.0-generate-001',
50
+ name: 'Imagen 4',
51
+ released: '2025-08-15',
52
+ ...googleImagen,
53
+ cost: { type: 'per-image', perImage: 0.04 },
54
+ },
55
+ {
56
+ id: 'imagen-4.0-ultra-generate-001',
57
+ name: 'Imagen 4 Ultra',
58
+ released: '2025-08-15',
59
+ ...googleImagen,
60
+ cost: { type: 'per-image', perImage: 0.06 },
61
+ },
62
+ {
63
+ id: 'imagen-4.0-fast-generate-001',
64
+ name: 'Imagen 4 Fast',
65
+ released: '2025-08-15',
66
+ ...googleImagen,
67
+ cost: { type: 'per-image', perImage: 0.02 },
68
+ },
69
+ // ── Google: Gemini text+image ──────────────────────────────────────────
70
+ {
71
+ id: 'gemini-2.0-flash-exp-image-generation',
72
+ name: 'Gemini 2.0 Flash (Image)',
73
+ released: '2025-03',
74
+ ...googleText,
75
+ cost: { type: 'per-token', inputPerM: 0.1, outputPerM: 0.4 },
76
+ },
77
+ {
78
+ id: 'gemini-2.5-flash-image',
79
+ name: 'Gemini 2.5 Flash Image',
80
+ released: '2025-08-26',
81
+ ...googleText,
82
+ cost: { type: 'per-token', inputPerM: 0.3, outputPerM: 30 },
83
+ },
84
+ {
85
+ id: 'gemini-3-pro-image-preview',
86
+ name: 'Gemini 3 Pro Image',
87
+ released: '2025-11-20',
88
+ ...googleText,
89
+ cost: { type: 'per-token', inputPerM: 1.25, outputPerM: 10 },
90
+ },
91
+ {
92
+ id: 'nano-banana-pro-preview',
93
+ name: 'Nano Banana Pro',
94
+ description: 'Nano Banana Pro — the high-fidelity variant in the Nano Banana line, built on the ' +
95
+ 'Gemini Pro backbone. Best for complex scenes requiring maximum quality at the expense ' +
96
+ 'of higher cost and slower speed. Still the best fit for specialized high-fidelity tasks ' +
97
+ 'where Nano Banana 2 trades off some quality for much faster, cheaper generation.',
98
+ released: '2025-11-20',
99
+ ...googleText,
100
+ cost: { type: 'per-token', inputPerM: 0.3, outputPerM: 30 },
101
+ },
102
+ {
103
+ id: 'gemini-3.1-flash-image-preview',
104
+ name: 'Gemini 3.1 Flash Image (Nano Banana 2)',
105
+ description: 'Nano Banana 2 — high-efficiency successor in the Nano Banana line. Targets Pro-like ' +
106
+ 'quality with faster iteration and lower cost. Built on Gemini 3.1 Flash backbone. ' +
107
+ 'Key upgrades: consistent rendering of up to 5 characters per workflow, new native ' +
108
+ 'aspect ratios (4:1, 1:4, 8:1, 1:8), resolutions from 512px to 4K, improved text ' +
109
+ 'rendering and in-image localization. Nano Banana Pro remains the best fit for ' +
110
+ 'specialized high-fidelity tasks.',
111
+ released: '2026-02-26',
112
+ ...googleText,
113
+ features: {
114
+ ...googleText.features,
115
+ aspectRatios: [
116
+ ...googleText.features.aspectRatios,
117
+ '4:1',
118
+ '1:4',
119
+ '8:1',
120
+ '1:8',
121
+ ],
122
+ },
123
+ cost: { type: 'per-token', inputPerM: 0.5, outputPerM: 3.0 },
124
+ },
125
+ // ── OpenAI ─────────────────────────────────────────────────────────────
126
+ {
127
+ id: 'dall-e-2',
128
+ name: 'DALL-E 2',
129
+ released: '2022-11-03',
130
+ ...openaiImage,
131
+ cost: { type: 'per-image', perImage: 0.02 },
132
+ features: {
133
+ editing: true,
134
+ inpainting: true,
135
+ aspectRatios: [],
136
+ sizes: ['256x256', '512x512', '1024x1024'],
137
+ seed: false,
138
+ multipleImages: true,
139
+ },
140
+ },
141
+ {
142
+ id: 'dall-e-3',
143
+ name: 'DALL-E 3',
144
+ released: '2023-10-03',
145
+ ...openaiImage,
146
+ cost: { type: 'per-image', perImage: 0.04 },
147
+ features: {
148
+ editing: false,
149
+ inpainting: false,
150
+ aspectRatios: [],
151
+ sizes: ['1024x1024', '1792x1024', '1024x1792'],
152
+ seed: false,
153
+ multipleImages: false,
154
+ },
155
+ },
156
+ {
157
+ id: 'gpt-image-1',
158
+ name: 'GPT Image 1',
159
+ released: '2025-04-23',
160
+ ...openaiImage,
161
+ cost: { type: 'per-image', perImage: 0.04 },
162
+ features: {
163
+ editing: true,
164
+ inpainting: true,
165
+ aspectRatios: [],
166
+ sizes: ['1024x1024', '1536x1024', '1024x1536'],
167
+ seed: false,
168
+ multipleImages: true,
169
+ },
170
+ },
171
+ {
172
+ id: 'gpt-image-1-mini',
173
+ name: 'GPT Image 1 Mini',
174
+ released: '2025-10-06',
175
+ ...openaiImage,
176
+ cost: { type: 'per-image', perImage: 0.009 },
177
+ features: {
178
+ editing: true,
179
+ inpainting: true,
180
+ aspectRatios: [],
181
+ sizes: ['1024x1024', '1536x1024', '1024x1536'],
182
+ seed: false,
183
+ multipleImages: true,
184
+ },
185
+ },
186
+ {
187
+ id: 'gpt-image-1.5',
188
+ name: 'GPT Image 1.5',
189
+ released: '2025-12-16',
190
+ ...openaiImage,
191
+ cost: { type: 'per-image', perImage: 0.034 },
192
+ features: {
193
+ editing: true,
194
+ inpainting: true,
195
+ aspectRatios: [],
196
+ sizes: ['1024x1024', '1536x1024', '1024x1536'],
197
+ seed: false,
198
+ multipleImages: true,
199
+ },
200
+ },
201
+ // NOTE: chatgpt-image-latest exists in OpenAI's .d.ts types but it's a moving
202
+ // alias used by ChatGPT/Responses API, not a stable image endpoint model.
203
+ // Omitted until OpenAI stabilizes it as a first-class image generation target.
204
+ // ── Replicate ──────────────────────────────────────────────────────────
205
+ {
206
+ id: 'black-forest-labs/flux-1.1-pro',
207
+ name: 'Flux 1.1 Pro',
208
+ released: '2024-10-01',
209
+ ...replicateImage,
210
+ cost: { type: 'per-image', perImage: 0.04 },
211
+ features: {
212
+ editing: false,
213
+ inpainting: false,
214
+ aspectRatios: fluxAspectRatios,
215
+ seed: true,
216
+ multipleImages: false,
217
+ },
218
+ },
219
+ {
220
+ id: 'black-forest-labs/flux-1.1-pro-ultra',
221
+ name: 'Flux 1.1 Pro Ultra',
222
+ released: '2024-11-06',
223
+ ...replicateImage,
224
+ cost: { type: 'per-image', perImage: 0.06 },
225
+ features: {
226
+ editing: false,
227
+ inpainting: false,
228
+ aspectRatios: fluxAspectRatios,
229
+ seed: true,
230
+ multipleImages: false,
231
+ },
232
+ },
233
+ {
234
+ id: 'black-forest-labs/flux-2-pro',
235
+ name: 'Flux 2 Pro',
236
+ released: '2025-11-25',
237
+ ...replicateImage,
238
+ cost: { type: 'per-image', perImage: 0.015 },
239
+ features: {
240
+ editing: false,
241
+ inpainting: false,
242
+ aspectRatios: fluxAspectRatios,
243
+ seed: true,
244
+ multipleImages: false,
245
+ },
246
+ },
247
+ {
248
+ id: 'black-forest-labs/flux-2-dev',
249
+ name: 'Flux 2 Dev',
250
+ released: '2025-11-25',
251
+ ...replicateImage,
252
+ cost: { type: 'per-image', perImage: 0.012 },
253
+ features: {
254
+ editing: false,
255
+ inpainting: false,
256
+ aspectRatios: fluxAspectRatios,
257
+ seed: true,
258
+ multipleImages: false,
259
+ },
260
+ },
261
+ {
262
+ id: 'black-forest-labs/flux-dev',
263
+ name: 'Flux Dev',
264
+ released: '2024-08-01',
265
+ ...replicateImage,
266
+ cost: { type: 'per-image', perImage: 0.025 },
267
+ features: {
268
+ editing: false,
269
+ inpainting: false,
270
+ aspectRatios: fluxAspectRatios,
271
+ seed: true,
272
+ multipleImages: false,
273
+ },
274
+ },
275
+ {
276
+ id: 'black-forest-labs/flux-pro',
277
+ name: 'Flux Pro',
278
+ released: '2024-08-01',
279
+ ...replicateImage,
280
+ cost: { type: 'per-image', perImage: 0.055 },
281
+ features: {
282
+ editing: false,
283
+ inpainting: false,
284
+ aspectRatios: fluxAspectRatios,
285
+ seed: true,
286
+ multipleImages: false,
287
+ },
288
+ },
289
+ {
290
+ id: 'black-forest-labs/flux-schnell',
291
+ name: 'Flux Schnell',
292
+ released: '2024-08-01',
293
+ ...replicateImage,
294
+ cost: { type: 'per-image', perImage: 0.003 },
295
+ features: {
296
+ editing: false,
297
+ inpainting: false,
298
+ aspectRatios: fluxAspectRatios,
299
+ seed: true,
300
+ multipleImages: false,
301
+ },
302
+ },
303
+ {
304
+ id: 'black-forest-labs/flux-fill-pro',
305
+ name: 'Flux Fill Pro',
306
+ released: '2024-10-15',
307
+ ...replicateImage,
308
+ cost: { type: 'per-image', perImage: 0.05 },
309
+ features: {
310
+ editing: true,
311
+ inpainting: true,
312
+ aspectRatios: fluxAspectRatios,
313
+ seed: true,
314
+ multipleImages: false,
315
+ },
316
+ },
317
+ {
318
+ id: 'black-forest-labs/flux-fill-dev',
319
+ name: 'Flux Fill Dev',
320
+ released: '2024-10-15',
321
+ ...replicateImage,
322
+ cost: { type: 'per-image', perImage: 0.04 },
323
+ features: {
324
+ editing: true,
325
+ inpainting: true,
326
+ aspectRatios: fluxAspectRatios,
327
+ seed: true,
328
+ multipleImages: false,
329
+ },
330
+ },
331
+ {
332
+ id: 'ideogram-ai/ideogram-v2',
333
+ name: 'Ideogram v2',
334
+ released: '2024-08-19',
335
+ ...replicateImage,
336
+ cost: { type: 'per-image', perImage: 0.08 },
337
+ features: {
338
+ editing: false,
339
+ inpainting: false,
340
+ aspectRatios: ['1:1', '3:4', '4:3', '9:16', '16:9'],
341
+ seed: true,
342
+ multipleImages: false,
343
+ },
344
+ },
345
+ {
346
+ id: 'ideogram-ai/ideogram-v2-turbo',
347
+ name: 'Ideogram v2 Turbo',
348
+ released: '2024-08-19',
349
+ ...replicateImage,
350
+ cost: { type: 'per-image', perImage: 0.05 },
351
+ features: {
352
+ editing: false,
353
+ inpainting: false,
354
+ aspectRatios: ['1:1', '3:4', '4:3', '9:16', '16:9'],
355
+ seed: true,
356
+ multipleImages: false,
357
+ },
358
+ },
359
+ {
360
+ id: 'recraft-ai/recraft-v3',
361
+ name: 'Recraft v3',
362
+ released: '2024-10-29',
363
+ ...replicateImage,
364
+ cost: { type: 'per-image', perImage: 0.04 },
365
+ features: {
366
+ editing: false,
367
+ inpainting: false,
368
+ aspectRatios: ['1:1', '3:4', '4:3', '9:16', '16:9'],
369
+ seed: true,
370
+ multipleImages: false,
371
+ },
372
+ },
373
+ {
374
+ id: 'recraft-ai/recraft-v3-svg',
375
+ name: 'Recraft v3 SVG',
376
+ released: '2024-10-29',
377
+ ...replicateImage,
378
+ cost: { type: 'per-image', perImage: 0.08 },
379
+ features: {
380
+ editing: false,
381
+ inpainting: false,
382
+ aspectRatios: ['1:1', '3:4', '4:3', '9:16', '16:9'],
383
+ seed: true,
384
+ multipleImages: false,
385
+ },
386
+ },
387
+ {
388
+ id: 'stability-ai/stable-diffusion-3.5-large',
389
+ name: 'SD 3.5 Large',
390
+ released: '2024-10-22',
391
+ ...replicateImage,
392
+ cost: { type: 'per-image', perImage: 0.065 },
393
+ features: {
394
+ editing: false,
395
+ inpainting: false,
396
+ aspectRatios: ['1:1', '3:4', '4:3', '9:16', '16:9', '9:21', '21:9'],
397
+ seed: true,
398
+ multipleImages: false,
399
+ },
400
+ },
401
+ {
402
+ id: 'stability-ai/stable-diffusion-3.5-large-turbo',
403
+ name: 'SD 3.5 Large Turbo',
404
+ released: '2024-10-22',
405
+ ...replicateImage,
406
+ cost: { type: 'per-image', perImage: 0.04 },
407
+ features: {
408
+ editing: false,
409
+ inpainting: false,
410
+ aspectRatios: ['1:1', '3:4', '4:3', '9:16', '16:9', '9:21', '21:9'],
411
+ seed: true,
412
+ multipleImages: false,
413
+ },
414
+ },
415
+ {
416
+ id: 'stability-ai/stable-diffusion-3.5-medium',
417
+ name: 'SD 3.5 Medium',
418
+ released: '2024-10-29',
419
+ ...replicateImage,
420
+ cost: { type: 'per-image', perImage: 0.035 },
421
+ features: {
422
+ editing: false,
423
+ inpainting: false,
424
+ aspectRatios: ['1:1', '3:4', '4:3', '9:16', '16:9', '9:21', '21:9'],
425
+ seed: true,
426
+ multipleImages: false,
427
+ },
428
+ },
429
+ {
430
+ id: 'luma/photon',
431
+ name: 'Luma Photon',
432
+ released: '2024-12-10',
433
+ ...replicateImage,
434
+ cost: { type: 'per-image', perImage: 0.03 },
435
+ features: {
436
+ editing: false,
437
+ inpainting: false,
438
+ aspectRatios: ['1:1', '3:4', '4:3', '9:16', '16:9', '9:21', '21:9'],
439
+ seed: true,
440
+ multipleImages: false,
441
+ },
442
+ },
443
+ {
444
+ id: 'luma/photon-flash',
445
+ name: 'Luma Photon Flash',
446
+ released: '2024-12-10',
447
+ ...replicateImage,
448
+ cost: { type: 'per-image', perImage: 0.01 },
449
+ features: {
450
+ editing: false,
451
+ inpainting: false,
452
+ aspectRatios: ['1:1', '3:4', '4:3', '9:16', '16:9', '9:21', '21:9'],
453
+ seed: true,
454
+ multipleImages: false,
455
+ },
456
+ },
457
+ {
458
+ id: 'nvidia/sana',
459
+ name: 'NVIDIA Sana',
460
+ released: '2024-11-27',
461
+ ...replicateImage,
462
+ cost: { type: 'per-image', perImage: 0.01 },
463
+ features: {
464
+ editing: false,
465
+ inpainting: false,
466
+ aspectRatios: ['1:1', '3:4', '4:3', '9:16', '16:9'],
467
+ seed: true,
468
+ multipleImages: false,
469
+ },
470
+ },
471
+ // ── Fal ────────────────────────────────────────────────────────────────
472
+ {
473
+ id: 'fal-ai/flux/schnell',
474
+ name: 'Flux Schnell',
475
+ released: '2024-08-01',
476
+ ...falImage,
477
+ cost: { type: 'per-image', perImage: 0.003 },
478
+ features: {
479
+ editing: false,
480
+ inpainting: false,
481
+ aspectRatios: fluxAspectRatios,
482
+ seed: true,
483
+ multipleImages: true,
484
+ },
485
+ },
486
+ {
487
+ id: 'fal-ai/flux/dev',
488
+ name: 'Flux Dev',
489
+ released: '2024-08-01',
490
+ ...falImage,
491
+ cost: { type: 'per-image', perImage: 0.025 },
492
+ features: {
493
+ editing: false,
494
+ inpainting: false,
495
+ aspectRatios: fluxAspectRatios,
496
+ seed: true,
497
+ multipleImages: true,
498
+ },
499
+ },
500
+ {
501
+ id: 'fal-ai/flux-general',
502
+ name: 'Flux General',
503
+ released: '2025-01',
504
+ ...falImage,
505
+ cost: { type: 'per-image', perImage: 0.075 },
506
+ features: {
507
+ editing: true,
508
+ inpainting: false,
509
+ aspectRatios: fluxAspectRatios,
510
+ seed: true,
511
+ multipleImages: true,
512
+ },
513
+ },
514
+ {
515
+ id: 'fal-ai/flux-general/inpainting',
516
+ name: 'Flux General Inpainting',
517
+ released: '2025-01',
518
+ ...falImage,
519
+ cost: { type: 'per-image', perImage: 0.075 },
520
+ features: {
521
+ editing: true,
522
+ inpainting: true,
523
+ aspectRatios: fluxAspectRatios,
524
+ seed: true,
525
+ multipleImages: false,
526
+ },
527
+ },
528
+ {
529
+ id: 'fal-ai/flux-general/image-to-image',
530
+ name: 'Flux General Image-to-Image',
531
+ released: '2025-01',
532
+ ...falImage,
533
+ cost: { type: 'per-image', perImage: 0.075 },
534
+ features: {
535
+ editing: true,
536
+ inpainting: false,
537
+ aspectRatios: fluxAspectRatios,
538
+ seed: true,
539
+ multipleImages: false,
540
+ },
541
+ },
542
+ {
543
+ id: 'fal-ai/flux-pro/v1.1',
544
+ name: 'Flux Pro 1.1',
545
+ released: '2024-10-01',
546
+ ...falImage,
547
+ cost: { type: 'per-image', perImage: 0.04 },
548
+ features: {
549
+ editing: false,
550
+ inpainting: false,
551
+ aspectRatios: fluxAspectRatios,
552
+ seed: true,
553
+ multipleImages: false,
554
+ },
555
+ },
556
+ {
557
+ id: 'fal-ai/flux-pro/v1.1-ultra',
558
+ name: 'Flux Pro 1.1 Ultra',
559
+ released: '2024-11-06',
560
+ ...falImage,
561
+ cost: { type: 'per-image', perImage: 0.06 },
562
+ features: {
563
+ editing: false,
564
+ inpainting: false,
565
+ aspectRatios: fluxAspectRatios,
566
+ seed: true,
567
+ multipleImages: false,
568
+ },
569
+ },
570
+ {
571
+ id: 'fal-ai/flux-pro/kontext',
572
+ name: 'Flux Kontext',
573
+ released: '2025-06-12',
574
+ ...falImage,
575
+ cost: { type: 'per-image', perImage: 0.04 },
576
+ features: {
577
+ editing: true,
578
+ inpainting: false,
579
+ aspectRatios: fluxAspectRatios,
580
+ seed: true,
581
+ multipleImages: false,
582
+ },
583
+ },
584
+ {
585
+ id: 'fal-ai/flux-pro/kontext/max',
586
+ name: 'Flux Kontext Max',
587
+ released: '2025-06-12',
588
+ ...falImage,
589
+ cost: { type: 'per-image', perImage: 0.08 },
590
+ features: {
591
+ editing: true,
592
+ inpainting: false,
593
+ aspectRatios: fluxAspectRatios,
594
+ seed: true,
595
+ multipleImages: false,
596
+ },
597
+ },
598
+ {
599
+ id: 'fal-ai/flux-lora',
600
+ name: 'Flux LoRA',
601
+ released: '2024-09',
602
+ ...falImage,
603
+ cost: { type: 'per-image', perImage: 0.035 },
604
+ features: {
605
+ editing: false,
606
+ inpainting: false,
607
+ aspectRatios: fluxAspectRatios,
608
+ seed: true,
609
+ multipleImages: true,
610
+ },
611
+ },
612
+ {
613
+ id: 'fal-ai/recraft/v3/text-to-image',
614
+ name: 'Recraft v3',
615
+ released: '2024-10-29',
616
+ ...falImage,
617
+ cost: { type: 'per-image', perImage: 0.04 },
618
+ features: {
619
+ editing: false,
620
+ inpainting: false,
621
+ aspectRatios: fluxAspectRatios,
622
+ seed: true,
623
+ multipleImages: false,
624
+ },
625
+ },
626
+ {
627
+ id: 'fal-ai/recraft/v3/image-to-image',
628
+ name: 'Recraft v3 Image-to-Image',
629
+ released: '2024-10-29',
630
+ ...falImage,
631
+ cost: { type: 'per-image', perImage: 0.04 },
632
+ features: {
633
+ editing: true,
634
+ inpainting: false,
635
+ aspectRatios: fluxAspectRatios,
636
+ seed: true,
637
+ multipleImages: false,
638
+ },
639
+ },
640
+ {
641
+ id: 'fal-ai/ideogram/character',
642
+ name: 'Ideogram Character',
643
+ released: '2025-03',
644
+ ...falImage,
645
+ cost: { type: 'per-image', perImage: 0.10 },
646
+ features: {
647
+ editing: true,
648
+ inpainting: true,
649
+ aspectRatios: fluxAspectRatios,
650
+ seed: true,
651
+ multipleImages: false,
652
+ },
653
+ },
654
+ {
655
+ id: 'fal-ai/imagen4/preview',
656
+ name: 'Imagen 4 (Fal)',
657
+ released: '2025-08-15',
658
+ ...falImage,
659
+ cost: { type: 'per-image', perImage: 0.04 },
660
+ features: {
661
+ editing: false,
662
+ inpainting: false,
663
+ aspectRatios: ['1:1', '3:4', '4:3', '9:16', '16:9'],
664
+ seed: true,
665
+ multipleImages: false,
666
+ },
667
+ },
668
+ {
669
+ id: 'fal-ai/luma-photon',
670
+ name: 'Luma Photon (Fal)',
671
+ released: '2024-12-10',
672
+ ...falImage,
673
+ cost: { type: 'per-image', perImage: 0.019 },
674
+ features: {
675
+ editing: false,
676
+ inpainting: false,
677
+ aspectRatios: fluxAspectRatios,
678
+ seed: false,
679
+ multipleImages: false,
680
+ },
681
+ },
682
+ {
683
+ id: 'fal-ai/luma-photon/flash',
684
+ name: 'Luma Photon Flash (Fal)',
685
+ released: '2024-12-10',
686
+ ...falImage,
687
+ cost: { type: 'per-image', perImage: 0.005 },
688
+ features: {
689
+ editing: false,
690
+ inpainting: false,
691
+ aspectRatios: fluxAspectRatios,
692
+ seed: false,
693
+ multipleImages: false,
694
+ },
695
+ },
696
+ {
697
+ id: 'fal-ai/omnigen-v2',
698
+ name: 'OmniGen v2',
699
+ released: '2025-06',
700
+ ...falImage,
701
+ cost: { type: 'per-image', perImage: 0.03 },
702
+ features: {
703
+ editing: true,
704
+ inpainting: false,
705
+ aspectRatios: fluxAspectRatios,
706
+ seed: true,
707
+ multipleImages: false,
708
+ },
709
+ },
710
+ {
711
+ id: 'fal-ai/qwen-image',
712
+ name: 'Qwen Image',
713
+ released: '2025-06',
714
+ ...falImage,
715
+ cost: { type: 'per-image', perImage: 0.03 },
716
+ features: {
717
+ editing: false,
718
+ inpainting: false,
719
+ aspectRatios: fluxAspectRatios,
720
+ seed: true,
721
+ multipleImages: false,
722
+ },
723
+ },
724
+ ];
725
+ // ─── lookup helpers ──────────────────────────────────────────────────────────
726
+ const catalogIndex = new Map(CATALOG.map((m) => [m.id, m]));
727
+ export function findModel(id) {
728
+ return catalogIndex.get(id);
729
+ }