egaki 0.5.0 → 0.7.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (280) hide show
  1. package/CHANGELOG.md +188 -0
  2. package/dist/cli/cache-utils.d.ts +33 -0
  3. package/dist/cli/cache-utils.d.ts.map +1 -0
  4. package/dist/cli/cache-utils.js +157 -0
  5. package/dist/cli/cached-generate.d.ts +105 -0
  6. package/dist/cli/cached-generate.d.ts.map +1 -0
  7. package/dist/cli/cached-generate.js +208 -0
  8. package/dist/cli/cached-generate.test.d.ts +11 -0
  9. package/dist/cli/cached-generate.test.d.ts.map +1 -0
  10. package/dist/cli/cached-generate.test.js +431 -0
  11. package/dist/cli/cartesia-provider.d.ts +16 -0
  12. package/dist/cli/cartesia-provider.d.ts.map +1 -0
  13. package/dist/cli/cartesia-provider.js +184 -0
  14. package/dist/cli/chatgpt-auth.d.ts.map +1 -0
  15. package/dist/cli/cli.d.ts +4 -0
  16. package/dist/cli/cli.d.ts.map +1 -0
  17. package/dist/cli/cli.js +1329 -0
  18. package/dist/cli/clone-generate.d.ts +26 -0
  19. package/dist/cli/clone-generate.d.ts.map +1 -0
  20. package/dist/cli/clone-generate.js +148 -0
  21. package/dist/{credentials.d.ts → cli/credentials.d.ts} +11 -2
  22. package/dist/cli/credentials.d.ts.map +1 -0
  23. package/dist/{credentials.js → cli/credentials.js} +88 -5
  24. package/dist/cli/elevenlabs-speech-provider.d.ts +26 -0
  25. package/dist/cli/elevenlabs-speech-provider.d.ts.map +1 -0
  26. package/dist/cli/elevenlabs-speech-provider.js +199 -0
  27. package/dist/cli/generate.d.ts +140 -0
  28. package/dist/cli/generate.d.ts.map +1 -0
  29. package/dist/cli/generate.js +604 -0
  30. package/dist/cli/generate.test.d.ts +2 -0
  31. package/dist/cli/generate.test.d.ts.map +1 -0
  32. package/dist/cli/generate.test.js +131 -0
  33. package/dist/cli/login.d.ts.map +1 -0
  34. package/dist/{login.js → cli/login.js} +45 -4
  35. package/dist/cli/main.d.ts +3 -0
  36. package/dist/cli/main.d.ts.map +1 -0
  37. package/dist/cli/main.js +7 -0
  38. package/dist/cli/model-catalog.d.ts +141 -0
  39. package/dist/cli/model-catalog.d.ts.map +1 -0
  40. package/dist/cli/model-catalog.js +2135 -0
  41. package/dist/{models.d.ts → cli/models.d.ts} +16 -9
  42. package/dist/cli/models.d.ts.map +1 -0
  43. package/dist/cli/models.js +313 -0
  44. package/dist/cli/open-browser.d.ts.map +1 -0
  45. package/dist/cli/openai-speech-provider.d.ts +3 -0
  46. package/dist/cli/openai-speech-provider.d.ts.map +1 -0
  47. package/dist/cli/openai-speech-provider.js +28 -0
  48. package/dist/cli/separation-generate.d.ts +34 -0
  49. package/dist/cli/separation-generate.d.ts.map +1 -0
  50. package/dist/cli/separation-generate.js +117 -0
  51. package/dist/cli/speech-catalog.d.ts +35 -0
  52. package/dist/cli/speech-catalog.d.ts.map +1 -0
  53. package/dist/cli/speech-catalog.js +195 -0
  54. package/dist/cli/speech-generate.d.ts +86 -0
  55. package/dist/cli/speech-generate.d.ts.map +1 -0
  56. package/dist/cli/speech-generate.js +156 -0
  57. package/dist/cli/speech-models.d.ts +8 -0
  58. package/dist/cli/speech-models.d.ts.map +1 -0
  59. package/dist/cli/speech-models.js +109 -0
  60. package/dist/cli/speech-provider.test.d.ts +2 -0
  61. package/dist/cli/speech-provider.test.d.ts.map +1 -0
  62. package/dist/cli/speech-provider.test.js +197 -0
  63. package/dist/cli/subscription.d.ts.map +1 -0
  64. package/dist/cli/transcription-catalog.d.ts +35 -0
  65. package/dist/cli/transcription-catalog.d.ts.map +1 -0
  66. package/dist/cli/transcription-catalog.js +192 -0
  67. package/dist/cli/transcription-generate.d.ts +62 -0
  68. package/dist/cli/transcription-generate.d.ts.map +1 -0
  69. package/dist/cli/transcription-generate.js +144 -0
  70. package/dist/cli/transcription-models.d.ts +9 -0
  71. package/dist/cli/transcription-models.d.ts.map +1 -0
  72. package/dist/cli/transcription-models.js +100 -0
  73. package/dist/cli/transcription-providers.d.ts +22 -0
  74. package/dist/cli/transcription-providers.d.ts.map +1 -0
  75. package/dist/cli/transcription-providers.js +290 -0
  76. package/dist/cli/video-model-catalog.d.ts +2 -0
  77. package/dist/cli/video-model-catalog.d.ts.map +1 -0
  78. package/dist/cli/video-model-catalog.js +5 -0
  79. package/dist/cli/xai-auth.d.ts +29 -0
  80. package/dist/cli/xai-auth.d.ts.map +1 -0
  81. package/dist/cli/xai-auth.js +325 -0
  82. package/dist/vite/angled-screen.d.ts +57 -0
  83. package/dist/vite/angled-screen.d.ts.map +1 -0
  84. package/dist/vite/angled-screen.js +115 -0
  85. package/dist/vite/app.d.ts +51 -0
  86. package/dist/vite/app.d.ts.map +1 -0
  87. package/dist/vite/app.js +150 -0
  88. package/dist/vite/bands-shader.d.ts +47 -0
  89. package/dist/vite/bands-shader.d.ts.map +1 -0
  90. package/dist/vite/bands-shader.js +267 -0
  91. package/dist/vite/code-block.d.ts +107 -0
  92. package/dist/vite/code-block.d.ts.map +1 -0
  93. package/dist/vite/code-block.js +641 -0
  94. package/dist/vite/components.d.ts +36 -0
  95. package/dist/vite/components.d.ts.map +1 -0
  96. package/dist/vite/components.js +113 -0
  97. package/dist/vite/dispersion-rings-shader.d.ts +44 -0
  98. package/dist/vite/dispersion-rings-shader.d.ts.map +1 -0
  99. package/dist/vite/dispersion-rings-shader.js +282 -0
  100. package/dist/vite/easing-curves.d.ts +129 -0
  101. package/dist/vite/easing-curves.d.ts.map +1 -0
  102. package/dist/vite/easing-curves.js +584 -0
  103. package/dist/vite/easing-curves.test.d.ts +2 -0
  104. package/dist/vite/easing-curves.test.d.ts.map +1 -0
  105. package/dist/vite/easing-curves.test.js +200 -0
  106. package/dist/vite/generated-media-client.d.ts +35 -0
  107. package/dist/vite/generated-media-client.d.ts.map +1 -0
  108. package/dist/vite/generated-media-client.js +76 -0
  109. package/dist/vite/keyframes.d.ts +129 -0
  110. package/dist/vite/keyframes.d.ts.map +1 -0
  111. package/dist/vite/keyframes.js +194 -0
  112. package/dist/vite/layout-editor.d.ts +45 -0
  113. package/dist/vite/layout-editor.d.ts.map +1 -0
  114. package/dist/vite/layout-editor.js +587 -0
  115. package/dist/vite/layout-transition.d.ts +136 -0
  116. package/dist/vite/layout-transition.d.ts.map +1 -0
  117. package/dist/vite/layout-transition.js +581 -0
  118. package/dist/vite/liquid-gradient-shader.d.ts +62 -0
  119. package/dist/vite/liquid-gradient-shader.d.ts.map +1 -0
  120. package/dist/vite/liquid-gradient-shader.js +413 -0
  121. package/dist/vite/mdx-client.d.ts +15 -0
  122. package/dist/vite/mdx-client.d.ts.map +1 -0
  123. package/dist/vite/mdx-client.js +265 -0
  124. package/dist/vite/mdx-parse.d.ts +102 -0
  125. package/dist/vite/mdx-parse.d.ts.map +1 -0
  126. package/dist/vite/mdx-parse.js +251 -0
  127. package/dist/vite/mdx-provided-components.d.ts +18 -0
  128. package/dist/vite/mdx-provided-components.d.ts.map +1 -0
  129. package/dist/vite/mdx-provided-components.js +14 -0
  130. package/dist/vite/mdx-video.d.ts +327 -0
  131. package/dist/vite/mdx-video.d.ts.map +1 -0
  132. package/dist/vite/mdx-video.js +596 -0
  133. package/dist/vite/mdx-video.test.d.ts +9 -0
  134. package/dist/vite/mdx-video.test.d.ts.map +1 -0
  135. package/dist/vite/mdx-video.test.js +1945 -0
  136. package/dist/vite/media-components.d.ts +45 -0
  137. package/dist/vite/media-components.d.ts.map +1 -0
  138. package/dist/vite/media-components.js +355 -0
  139. package/dist/vite/media-duration-store.d.ts +66 -0
  140. package/dist/vite/media-duration-store.d.ts.map +1 -0
  141. package/dist/vite/media-duration-store.js +204 -0
  142. package/dist/vite/player-page.d.ts +35 -0
  143. package/dist/vite/player-page.d.ts.map +1 -0
  144. package/dist/vite/player-page.js +720 -0
  145. package/dist/vite/render-client.d.ts +18 -0
  146. package/dist/vite/render-client.d.ts.map +1 -0
  147. package/dist/vite/render-client.js +67 -0
  148. package/dist/vite/sdk.d.ts +221 -0
  149. package/dist/vite/sdk.d.ts.map +1 -0
  150. package/dist/vite/sdk.js +355 -0
  151. package/dist/vite/server-components.d.ts +55 -0
  152. package/dist/vite/server-components.d.ts.map +1 -0
  153. package/dist/vite/server-components.js +156 -0
  154. package/dist/vite/server-mdx.d.ts +74 -0
  155. package/dist/vite/server-mdx.d.ts.map +1 -0
  156. package/dist/vite/server-mdx.js +259 -0
  157. package/dist/vite/shader-renderer.d.ts +48 -0
  158. package/dist/vite/shader-renderer.d.ts.map +1 -0
  159. package/dist/vite/shader-renderer.js +411 -0
  160. package/dist/vite/store-hooks.d.ts +12 -0
  161. package/dist/vite/store-hooks.d.ts.map +1 -0
  162. package/dist/vite/store-hooks.js +93 -0
  163. package/dist/vite/store.d.ts +75 -0
  164. package/dist/vite/store.d.ts.map +1 -0
  165. package/dist/vite/store.js +52 -0
  166. package/dist/vite/store.test.d.ts +6 -0
  167. package/dist/vite/store.test.d.ts.map +1 -0
  168. package/dist/vite/store.test.js +172 -0
  169. package/dist/vite/tweakpane-hook.d.ts +94 -0
  170. package/dist/vite/tweakpane-hook.d.ts.map +1 -0
  171. package/dist/vite/tweakpane-hook.js +450 -0
  172. package/dist/vite/vite-plugin.d.ts +28 -0
  173. package/dist/vite/vite-plugin.d.ts.map +1 -0
  174. package/dist/vite/vite-plugin.js +538 -0
  175. package/dist/vite/wave-gradient-shader.d.ts +41 -0
  176. package/dist/vite/wave-gradient-shader.d.ts.map +1 -0
  177. package/dist/vite/wave-gradient-shader.js +207 -0
  178. package/package.json +103 -25
  179. package/skills/egaki/SKILL.md +162 -1
  180. package/src/cli/cache-utils.ts +169 -0
  181. package/src/cli/cached-generate.test.ts +531 -0
  182. package/src/cli/cached-generate.ts +348 -0
  183. package/src/cli/cartesia-provider.ts +249 -0
  184. package/src/cli/cli.ts +1818 -0
  185. package/src/cli/clone-generate.ts +202 -0
  186. package/src/{credentials.ts → cli/credentials.ts} +90 -7
  187. package/src/cli/elevenlabs-speech-provider.ts +243 -0
  188. package/src/cli/generate.test.ts +166 -0
  189. package/src/cli/generate.ts +912 -0
  190. package/src/{login.ts → cli/login.ts} +48 -3
  191. package/src/cli/main.ts +8 -0
  192. package/src/cli/model-catalog.ts +2336 -0
  193. package/src/cli/models.ts +408 -0
  194. package/src/cli/openai-speech-provider.ts +34 -0
  195. package/src/cli/separation-generate.ts +187 -0
  196. package/src/cli/speech-catalog.ts +253 -0
  197. package/src/cli/speech-generate.ts +275 -0
  198. package/src/cli/speech-models.ts +146 -0
  199. package/src/cli/speech-provider.test.ts +226 -0
  200. package/src/cli/transcription-catalog.ts +250 -0
  201. package/src/cli/transcription-generate.ts +214 -0
  202. package/src/cli/transcription-models.ts +136 -0
  203. package/src/cli/transcription-providers.ts +427 -0
  204. package/src/cli/video-model-catalog.ts +14 -0
  205. package/src/cli/xai-auth.ts +396 -0
  206. package/src/vite/angled-screen.tsx +214 -0
  207. package/src/vite/app.tsx +197 -0
  208. package/src/vite/bands-shader.tsx +319 -0
  209. package/src/vite/code-block.tsx +939 -0
  210. package/src/vite/components.tsx +278 -0
  211. package/src/vite/dispersion-rings-shader.tsx +331 -0
  212. package/src/vite/easing-curves.test.ts +232 -0
  213. package/src/vite/easing-curves.ts +743 -0
  214. package/src/vite/generated-media-client.tsx +121 -0
  215. package/src/vite/keyframes.tsx +347 -0
  216. package/src/vite/layout-editor.tsx +709 -0
  217. package/src/vite/layout-transition.tsx +706 -0
  218. package/src/vite/liquid-gradient-shader.tsx +474 -0
  219. package/src/vite/mdx-client.tsx +420 -0
  220. package/src/vite/mdx-parse.ts +343 -0
  221. package/src/vite/mdx-provided-components.ts +19 -0
  222. package/src/vite/mdx-video.test.tsx +2219 -0
  223. package/src/vite/mdx-video.tsx +976 -0
  224. package/src/vite/media-components.tsx +473 -0
  225. package/src/vite/media-duration-store.ts +225 -0
  226. package/src/vite/motion-timing.ts +194 -0
  227. package/src/vite/player-page.tsx +1107 -0
  228. package/src/vite/render-client.ts +84 -0
  229. package/src/vite/sdk.ts +598 -0
  230. package/src/vite/server-components.tsx +241 -0
  231. package/src/vite/server-mdx.ts +285 -0
  232. package/src/vite/shader-renderer.tsx +535 -0
  233. package/src/vite/store-hooks.ts +117 -0
  234. package/src/vite/store.test.ts +202 -0
  235. package/src/vite/store.ts +115 -0
  236. package/src/vite/styles.css +21 -0
  237. package/src/vite/tweakpane-hook.tsx +593 -0
  238. package/src/vite/virtual-modules.d.ts +30 -0
  239. package/src/vite/vite-plugin.ts +584 -0
  240. package/src/vite/wave-gradient-shader.tsx +253 -0
  241. package/README.md +0 -266
  242. package/dist/antigravity-auth.d.ts +0 -15
  243. package/dist/antigravity-auth.d.ts.map +0 -1
  244. package/dist/antigravity-auth.js +0 -544
  245. package/dist/antigravity-image.d.ts +0 -11
  246. package/dist/antigravity-image.d.ts.map +0 -1
  247. package/dist/antigravity-image.js +0 -285
  248. package/dist/chatgpt-auth.d.ts.map +0 -1
  249. package/dist/cli.d.ts +0 -3
  250. package/dist/cli.d.ts.map +0 -1
  251. package/dist/cli.js +0 -968
  252. package/dist/credentials.d.ts.map +0 -1
  253. package/dist/gateway-model-candidates.generated.d.ts +0 -11
  254. package/dist/gateway-model-candidates.generated.d.ts.map +0 -1
  255. package/dist/gateway-model-candidates.generated.js +0 -64
  256. package/dist/login.d.ts.map +0 -1
  257. package/dist/model-catalog.d.ts +0 -42
  258. package/dist/model-catalog.d.ts.map +0 -1
  259. package/dist/model-catalog.js +0 -1001
  260. package/dist/models.d.ts.map +0 -1
  261. package/dist/models.js +0 -246
  262. package/dist/open-browser.d.ts.map +0 -1
  263. package/dist/subscription.d.ts.map +0 -1
  264. package/dist/video-model-catalog.d.ts +0 -52
  265. package/dist/video-model-catalog.d.ts.map +0 -1
  266. package/dist/video-model-catalog.js +0 -306
  267. package/src/cli.ts +0 -1378
  268. package/src/model-catalog.ts +0 -1077
  269. package/src/models.ts +0 -309
  270. package/src/video-model-catalog.ts +0 -363
  271. /package/dist/{chatgpt-auth.d.ts → cli/chatgpt-auth.d.ts} +0 -0
  272. /package/dist/{chatgpt-auth.js → cli/chatgpt-auth.js} +0 -0
  273. /package/dist/{login.d.ts → cli/login.d.ts} +0 -0
  274. /package/dist/{open-browser.d.ts → cli/open-browser.d.ts} +0 -0
  275. /package/dist/{open-browser.js → cli/open-browser.js} +0 -0
  276. /package/dist/{subscription.d.ts → cli/subscription.d.ts} +0 -0
  277. /package/dist/{subscription.js → cli/subscription.js} +0 -0
  278. /package/src/{chatgpt-auth.ts → cli/chatgpt-auth.ts} +0 -0
  279. /package/src/{open-browser.ts → cli/open-browser.ts} +0 -0
  280. /package/src/{subscription.ts → cli/subscription.ts} +0 -0
@@ -1,1077 +0,0 @@
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
-
9
- // ─── types ───────────────────────────────────────────────────────────────────
10
-
11
- export type PerImageCost = {
12
- type: 'per-image'
13
- /** USD per image at default quality/resolution */
14
- perImage: number
15
- }
16
-
17
- export type PerTokenCost = {
18
- type: 'per-token'
19
- /** USD per million input tokens */
20
- inputPerM: number
21
- /** USD per million output tokens */
22
- outputPerM: number
23
- }
24
-
25
- export type ModelCost = PerImageCost | PerTokenCost
26
-
27
- export type ModelFeatures = {
28
- /** supports input images for editing */
29
- editing: boolean
30
- /** supports mask for inpainting */
31
- inpainting: boolean
32
- /** supported aspect ratios */
33
- aspectRatios: string[]
34
- /** supported WIDTHxHEIGHT sizes (OpenAI models) */
35
- sizes?: string[]
36
- /** supports deterministic seed */
37
- seed: boolean
38
- /** supports generating n > 1 images */
39
- multipleImages: boolean
40
- }
41
-
42
- export type ModelEntry = {
43
- id: string
44
- name: string
45
- /** Optional longer description shown in `egaki models` output */
46
- description?: string
47
- provider: string
48
- strategy: 'image' | 'text'
49
- /** Release date in YYYY-MM-DD or YYYY-MM format */
50
- released: string
51
- cost: ModelCost
52
- features: ModelFeatures
53
- }
54
-
55
- // ─── shared fragments ────────────────────────────────────────────────────────
56
- // Spread these into model entries to avoid repeating common fields.
57
-
58
- const googleImagen = {
59
- provider: 'google',
60
- strategy: 'image' as const,
61
- features: {
62
- editing: true,
63
- inpainting: true,
64
- aspectRatios: ['1:1', '3:4', '4:3', '9:16', '16:9'],
65
- seed: true,
66
- multipleImages: true,
67
- },
68
- }
69
-
70
- const googleText = {
71
- provider: 'google',
72
- strategy: 'text' as const,
73
- features: {
74
- editing: true,
75
- inpainting: false,
76
- aspectRatios: ['1:1', '3:4', '4:3', '9:16', '16:9', '2:3', '3:2', '4:5', '5:4'],
77
- seed: false,
78
- multipleImages: false,
79
- },
80
- }
81
-
82
- const openaiImage = {
83
- provider: 'openai',
84
- strategy: 'image' as const,
85
- }
86
-
87
- const replicateImage = {
88
- provider: 'replicate',
89
- strategy: 'image' as const,
90
- }
91
-
92
- const falImage = {
93
- provider: 'fal',
94
- strategy: 'image' as const,
95
- }
96
-
97
- const bflImage = {
98
- provider: 'bfl',
99
- strategy: 'image' as const,
100
- }
101
-
102
- const recraftImage = {
103
- provider: 'recraft',
104
- strategy: 'image' as const,
105
- }
106
-
107
- const xaiImage = {
108
- provider: 'xai',
109
- strategy: 'image' as const,
110
- }
111
-
112
- const vertexImagen = {
113
- provider: 'vertex',
114
- strategy: 'image' as const,
115
- features: {
116
- ...googleImagen.features,
117
- },
118
- }
119
-
120
- const vertexText = {
121
- provider: 'vertex',
122
- strategy: 'text' as const,
123
- features: {
124
- ...googleText.features,
125
- },
126
- }
127
-
128
- const fluxAspectRatios = ['1:1', '3:4', '4:3', '9:16', '16:9', '9:21', '21:9']
129
-
130
- // ─── catalog ─────────────────────────────────────────────────────────────────
131
-
132
- export const CATALOG: ModelEntry[] = [
133
- // ── Google: Imagen ─────────────────────────────────────────────────────
134
- {
135
- id: 'imagen-4.0-generate-001',
136
- name: 'Imagen 4',
137
- released: '2025-08-15',
138
- ...googleImagen,
139
- cost: { type: 'per-image', perImage: 0.04 },
140
- },
141
- {
142
- id: 'imagen-4.0-ultra-generate-001',
143
- name: 'Imagen 4 Ultra',
144
- released: '2025-08-15',
145
- ...googleImagen,
146
- cost: { type: 'per-image', perImage: 0.06 },
147
- },
148
- {
149
- id: 'imagen-4.0-fast-generate-001',
150
- name: 'Imagen 4 Fast',
151
- released: '2025-08-15',
152
- ...googleImagen,
153
- cost: { type: 'per-image', perImage: 0.02 },
154
- },
155
-
156
- // ── Google: Gemini text+image ──────────────────────────────────────────
157
- {
158
- id: 'gemini-2.0-flash-exp-image-generation',
159
- name: 'Gemini 2.0 Flash (Image)',
160
- released: '2025-03',
161
- ...googleText,
162
- cost: { type: 'per-token', inputPerM: 0.1, outputPerM: 0.4 },
163
- },
164
- {
165
- id: 'gemini-2.5-flash-image',
166
- name: 'Gemini 2.5 Flash Image',
167
- released: '2025-08-26',
168
- ...googleText,
169
- cost: { type: 'per-token', inputPerM: 0.3, outputPerM: 30 },
170
- },
171
- {
172
- id: 'gemini-3-pro-image-preview',
173
- name: 'Gemini 3 Pro Image',
174
- released: '2025-11-20',
175
- ...googleText,
176
- cost: { type: 'per-token', inputPerM: 1.25, outputPerM: 10 },
177
- },
178
- {
179
- id: 'nano-banana-pro-preview',
180
- name: 'Nano Banana Pro',
181
- description:
182
- 'Nano Banana Pro — the high-fidelity variant in the Nano Banana line, built on the ' +
183
- 'Gemini Pro backbone. Best for complex scenes requiring maximum quality at the expense ' +
184
- 'of higher cost and slower speed. Still the best fit for specialized high-fidelity tasks ' +
185
- 'where Nano Banana 2 trades off some quality for much faster, cheaper generation.',
186
- released: '2025-11-20',
187
- ...googleText,
188
- cost: { type: 'per-token', inputPerM: 0.3, outputPerM: 30 },
189
- },
190
- {
191
- id: 'gemini-3.1-flash-image-preview',
192
- name: 'Gemini 3.1 Flash Image (Nano Banana 2)',
193
- description:
194
- 'Nano Banana 2 — high-efficiency successor in the Nano Banana line. Targets Pro-like ' +
195
- 'quality with faster iteration and lower cost. Built on Gemini 3.1 Flash backbone. ' +
196
- 'Key upgrades: consistent rendering of up to 5 characters per workflow, new native ' +
197
- 'aspect ratios (4:1, 1:4, 8:1, 1:8), resolutions from 512px to 4K, improved text ' +
198
- 'rendering and in-image localization. Nano Banana Pro remains the best fit for ' +
199
- 'specialized high-fidelity tasks.',
200
- released: '2026-02-26',
201
- ...googleText,
202
- features: {
203
- ...googleText.features,
204
- aspectRatios: [
205
- ...googleText.features.aspectRatios,
206
- '4:1',
207
- '1:4',
208
- '8:1',
209
- '1:8',
210
- ],
211
- },
212
- cost: { type: 'per-token', inputPerM: 0.5, outputPerM: 3.0 },
213
- },
214
-
215
- // ── Vertex: Imagen ──────────────────────────────────────────────────────
216
- // Same models as Google AI Studio but routed through Vertex AI / Google Cloud billing.
217
- // Use `egaki login --provider vertex --key <key>` to configure.
218
- {
219
- id: 'vertex/imagen-4.0-generate-001',
220
- name: 'Imagen 4 (Vertex)',
221
- released: '2025-08-15',
222
- ...vertexImagen,
223
- cost: { type: 'per-image', perImage: 0.04 },
224
- },
225
- {
226
- id: 'vertex/imagen-4.0-ultra-generate-001',
227
- name: 'Imagen 4 Ultra (Vertex)',
228
- released: '2025-08-15',
229
- ...vertexImagen,
230
- cost: { type: 'per-image', perImage: 0.06 },
231
- },
232
- {
233
- id: 'vertex/imagen-4.0-fast-generate-001',
234
- name: 'Imagen 4 Fast (Vertex)',
235
- released: '2025-08-15',
236
- ...vertexImagen,
237
- cost: { type: 'per-image', perImage: 0.02 },
238
- },
239
-
240
- // ── Vertex: Gemini text+image ─────────────────────────────────────────
241
- {
242
- id: 'vertex/gemini-2.5-flash-image',
243
- name: 'Gemini 2.5 Flash Image (Vertex)',
244
- released: '2025-08-26',
245
- ...vertexText,
246
- cost: { type: 'per-token', inputPerM: 0.3, outputPerM: 30 },
247
- },
248
- {
249
- id: 'vertex/gemini-3-pro-image-preview',
250
- name: 'Gemini 3 Pro Image (Vertex)',
251
- released: '2025-11-20',
252
- ...vertexText,
253
- cost: { type: 'per-token', inputPerM: 1.25, outputPerM: 10 },
254
- },
255
- {
256
- id: 'vertex/gemini-3.1-flash-image-preview',
257
- name: 'Gemini 3.1 Flash Image (Vertex)',
258
- released: '2026-02-26',
259
- ...vertexText,
260
- features: {
261
- ...vertexText.features,
262
- aspectRatios: [
263
- ...vertexText.features.aspectRatios,
264
- '4:1',
265
- '1:4',
266
- '8:1',
267
- '1:8',
268
- ],
269
- },
270
- cost: { type: 'per-token', inputPerM: 0.5, outputPerM: 3.0 },
271
- },
272
-
273
- // ── BFL (AI Gateway) ───────────────────────────────────────────────────
274
- {
275
- id: 'flux-kontext-max',
276
- name: 'FLUX Kontext Max',
277
- released: '2025-06-12',
278
- ...bflImage,
279
- cost: { type: 'per-image', perImage: 0.08 },
280
- features: {
281
- editing: true,
282
- inpainting: false,
283
- aspectRatios: fluxAspectRatios,
284
- seed: true,
285
- multipleImages: false,
286
- },
287
- },
288
- {
289
- id: 'flux-kontext-pro',
290
- name: 'FLUX Kontext Pro',
291
- released: '2025-06-12',
292
- ...bflImage,
293
- cost: { type: 'per-image', perImage: 0.04 },
294
- features: {
295
- editing: true,
296
- inpainting: false,
297
- aspectRatios: fluxAspectRatios,
298
- seed: true,
299
- multipleImages: false,
300
- },
301
- },
302
- {
303
- id: 'flux-pro-1.0-fill',
304
- name: 'FLUX Pro 1.0 Fill',
305
- released: '2024-10-15',
306
- ...bflImage,
307
- cost: { type: 'per-image', perImage: 0.05 },
308
- features: {
309
- editing: true,
310
- inpainting: true,
311
- aspectRatios: fluxAspectRatios,
312
- seed: true,
313
- multipleImages: false,
314
- },
315
- },
316
- {
317
- id: 'flux-pro-1.1',
318
- name: 'FLUX Pro 1.1',
319
- released: '2024-10-01',
320
- ...bflImage,
321
- cost: { type: 'per-image', perImage: 0.04 },
322
- features: {
323
- editing: false,
324
- inpainting: false,
325
- aspectRatios: fluxAspectRatios,
326
- seed: true,
327
- multipleImages: false,
328
- },
329
- },
330
- {
331
- id: 'flux-pro-1.1-ultra',
332
- name: 'FLUX Pro 1.1 Ultra',
333
- released: '2024-11-06',
334
- ...bflImage,
335
- cost: { type: 'per-image', perImage: 0.06 },
336
- features: {
337
- editing: false,
338
- inpainting: false,
339
- aspectRatios: fluxAspectRatios,
340
- seed: true,
341
- multipleImages: false,
342
- },
343
- },
344
-
345
- // ── Recraft (AI Gateway) ───────────────────────────────────────────────
346
- {
347
- id: 'recraft-v2',
348
- name: 'Recraft v2',
349
- released: '2024-08-19',
350
- ...recraftImage,
351
- cost: { type: 'per-image', perImage: 0.04 },
352
- features: {
353
- editing: false,
354
- inpainting: false,
355
- aspectRatios: ['1:1', '3:4', '4:3', '9:16', '16:9'],
356
- seed: false,
357
- multipleImages: false,
358
- },
359
- },
360
- {
361
- id: 'recraft-v3',
362
- name: 'Recraft v3 (AI Gateway)',
363
- released: '2024-10-29',
364
- ...recraftImage,
365
- cost: { type: 'per-image', perImage: 0.04 },
366
- features: {
367
- editing: false,
368
- inpainting: false,
369
- aspectRatios: ['1:1', '3:4', '4:3', '9:16', '16:9'],
370
- seed: false,
371
- multipleImages: false,
372
- },
373
- },
374
- {
375
- id: 'recraft-v4',
376
- name: 'Recraft v4',
377
- released: '2025-10-08',
378
- ...recraftImage,
379
- cost: { type: 'per-image', perImage: 0.04 },
380
- features: {
381
- editing: false,
382
- inpainting: false,
383
- aspectRatios: ['1:1', '3:4', '4:3', '9:16', '16:9'],
384
- seed: false,
385
- multipleImages: false,
386
- },
387
- },
388
- {
389
- id: 'recraft-v4-pro',
390
- name: 'Recraft v4 Pro',
391
- released: '2025-10-08',
392
- ...recraftImage,
393
- cost: { type: 'per-image', perImage: 0.25 },
394
- features: {
395
- editing: false,
396
- inpainting: false,
397
- aspectRatios: ['1:1', '3:4', '4:3', '9:16', '16:9'],
398
- seed: false,
399
- multipleImages: false,
400
- },
401
- },
402
-
403
- // ── xAI (AI Gateway) ────────────────────────────────────────────────────
404
- {
405
- id: 'grok-imagine-image',
406
- name: 'Grok Imagine Image',
407
- released: '2026-03',
408
- ...xaiImage,
409
- cost: { type: 'per-image', perImage: 0.02 },
410
- features: {
411
- editing: true,
412
- inpainting: false,
413
- aspectRatios: ['1:1', '3:4', '4:3', '9:16', '16:9'],
414
- seed: false,
415
- multipleImages: true,
416
- },
417
- },
418
- {
419
- id: 'grok-imagine-image-pro',
420
- name: 'Grok Imagine Image Pro',
421
- released: '2026-03',
422
- ...xaiImage,
423
- cost: { type: 'per-image', perImage: 0.07 },
424
- features: {
425
- editing: true,
426
- inpainting: false,
427
- aspectRatios: ['1:1', '3:4', '4:3', '9:16', '16:9'],
428
- seed: false,
429
- multipleImages: true,
430
- },
431
- },
432
-
433
- // ── OpenAI ─────────────────────────────────────────────────────────────
434
- {
435
- id: 'dall-e-2',
436
- name: 'DALL-E 2',
437
- released: '2022-11-03',
438
- ...openaiImage,
439
- cost: { type: 'per-image', perImage: 0.02 },
440
- features: {
441
- editing: true,
442
- inpainting: true,
443
- aspectRatios: [],
444
- sizes: ['256x256', '512x512', '1024x1024'],
445
- seed: false,
446
- multipleImages: true,
447
- },
448
- },
449
- {
450
- id: 'dall-e-3',
451
- name: 'DALL-E 3',
452
- released: '2023-10-03',
453
- ...openaiImage,
454
- cost: { type: 'per-image', perImage: 0.04 },
455
- features: {
456
- editing: false,
457
- inpainting: false,
458
- aspectRatios: [],
459
- sizes: ['1024x1024', '1792x1024', '1024x1792'],
460
- seed: false,
461
- multipleImages: false,
462
- },
463
- },
464
- {
465
- id: 'gpt-image-1',
466
- name: 'GPT Image 1',
467
- released: '2025-04-23',
468
- ...openaiImage,
469
- cost: { type: 'per-image', perImage: 0.04 },
470
- features: {
471
- editing: true,
472
- inpainting: true,
473
- aspectRatios: [],
474
- sizes: ['1024x1024', '1536x1024', '1024x1536'],
475
- seed: false,
476
- multipleImages: true,
477
- },
478
- },
479
- {
480
- id: 'gpt-image-1-mini',
481
- name: 'GPT Image 1 Mini',
482
- released: '2025-10-06',
483
- ...openaiImage,
484
- cost: { type: 'per-image', perImage: 0.009 },
485
- features: {
486
- editing: true,
487
- inpainting: true,
488
- aspectRatios: [],
489
- sizes: ['1024x1024', '1536x1024', '1024x1536'],
490
- seed: false,
491
- multipleImages: true,
492
- },
493
- },
494
- {
495
- id: 'gpt-image-1.5',
496
- name: 'GPT Image 1.5',
497
- released: '2025-12-16',
498
- ...openaiImage,
499
- cost: { type: 'per-image', perImage: 0.034 },
500
- features: {
501
- editing: true,
502
- inpainting: true,
503
- aspectRatios: [],
504
- sizes: ['1024x1024', '1536x1024', '1024x1536'],
505
- seed: false,
506
- multipleImages: true,
507
- },
508
- },
509
- {
510
- id: 'gpt-image-2',
511
- name: 'GPT Image 2',
512
- description:
513
- 'State-of-the-art image generation model with token-based pricing. ' +
514
- 'Cost varies by quality and size; $0.053 is the medium-quality 1024×1024 estimate.',
515
- released: '2026-04-21',
516
- ...openaiImage,
517
- // Token-based pricing: $30/1M output image tokens. Medium quality 1024×1024 ≈ $0.053.
518
- cost: { type: 'per-image', perImage: 0.053 },
519
- features: {
520
- editing: true,
521
- inpainting: true,
522
- aspectRatios: [],
523
- sizes: ['1024x1024', '1536x1024', '1024x1536'],
524
- seed: false,
525
- multipleImages: true,
526
- },
527
- },
528
- {
529
- id: 'chatgpt-image-latest',
530
- name: 'ChatGPT Image',
531
- description:
532
- 'Rolling-latest alias that tracks the newest ChatGPT image model. Currently points ' +
533
- 'to gpt-image-2. Pricing may shift when the alias retargets to a newer model.',
534
- released: '2026-01',
535
- ...openaiImage,
536
- // Matches gpt-image-2 medium quality 1024×1024 estimate.
537
- cost: { type: 'per-image', perImage: 0.053 },
538
- features: {
539
- editing: true,
540
- inpainting: true,
541
- aspectRatios: [],
542
- sizes: ['1024x1024', '1536x1024', '1024x1536'],
543
- seed: false,
544
- multipleImages: true,
545
- },
546
- },
547
-
548
- // ── Replicate ──────────────────────────────────────────────────────────
549
- {
550
- id: 'black-forest-labs/flux-1.1-pro',
551
- name: 'Flux 1.1 Pro',
552
- released: '2024-10-01',
553
- ...replicateImage,
554
- cost: { type: 'per-image', perImage: 0.04 },
555
- features: {
556
- editing: false,
557
- inpainting: false,
558
- aspectRatios: fluxAspectRatios,
559
- seed: true,
560
- multipleImages: false,
561
- },
562
- },
563
- {
564
- id: 'black-forest-labs/flux-1.1-pro-ultra',
565
- name: 'Flux 1.1 Pro Ultra',
566
- released: '2024-11-06',
567
- ...replicateImage,
568
- cost: { type: 'per-image', perImage: 0.06 },
569
- features: {
570
- editing: false,
571
- inpainting: false,
572
- aspectRatios: fluxAspectRatios,
573
- seed: true,
574
- multipleImages: false,
575
- },
576
- },
577
- {
578
- id: 'black-forest-labs/flux-2-pro',
579
- name: 'Flux 2 Pro',
580
- released: '2025-11-25',
581
- ...replicateImage,
582
- cost: { type: 'per-image', perImage: 0.015 },
583
- features: {
584
- editing: false,
585
- inpainting: false,
586
- aspectRatios: fluxAspectRatios,
587
- seed: true,
588
- multipleImages: false,
589
- },
590
- },
591
- {
592
- id: 'black-forest-labs/flux-2-dev',
593
- name: 'Flux 2 Dev',
594
- released: '2025-11-25',
595
- ...replicateImage,
596
- cost: { type: 'per-image', perImage: 0.012 },
597
- features: {
598
- editing: false,
599
- inpainting: false,
600
- aspectRatios: fluxAspectRatios,
601
- seed: true,
602
- multipleImages: false,
603
- },
604
- },
605
- {
606
- id: 'black-forest-labs/flux-dev',
607
- name: 'Flux Dev',
608
- released: '2024-08-01',
609
- ...replicateImage,
610
- cost: { type: 'per-image', perImage: 0.025 },
611
- features: {
612
- editing: false,
613
- inpainting: false,
614
- aspectRatios: fluxAspectRatios,
615
- seed: true,
616
- multipleImages: false,
617
- },
618
- },
619
- {
620
- id: 'black-forest-labs/flux-pro',
621
- name: 'Flux Pro',
622
- released: '2024-08-01',
623
- ...replicateImage,
624
- cost: { type: 'per-image', perImage: 0.055 },
625
- features: {
626
- editing: false,
627
- inpainting: false,
628
- aspectRatios: fluxAspectRatios,
629
- seed: true,
630
- multipleImages: false,
631
- },
632
- },
633
- {
634
- id: 'black-forest-labs/flux-schnell',
635
- name: 'Flux Schnell',
636
- released: '2024-08-01',
637
- ...replicateImage,
638
- cost: { type: 'per-image', perImage: 0.003 },
639
- features: {
640
- editing: false,
641
- inpainting: false,
642
- aspectRatios: fluxAspectRatios,
643
- seed: true,
644
- multipleImages: false,
645
- },
646
- },
647
- {
648
- id: 'black-forest-labs/flux-fill-pro',
649
- name: 'Flux Fill Pro',
650
- released: '2024-10-15',
651
- ...replicateImage,
652
- cost: { type: 'per-image', perImage: 0.05 },
653
- features: {
654
- editing: true,
655
- inpainting: true,
656
- aspectRatios: fluxAspectRatios,
657
- seed: true,
658
- multipleImages: false,
659
- },
660
- },
661
- {
662
- id: 'black-forest-labs/flux-fill-dev',
663
- name: 'Flux Fill Dev',
664
- released: '2024-10-15',
665
- ...replicateImage,
666
- cost: { type: 'per-image', perImage: 0.04 },
667
- features: {
668
- editing: true,
669
- inpainting: true,
670
- aspectRatios: fluxAspectRatios,
671
- seed: true,
672
- multipleImages: false,
673
- },
674
- },
675
- {
676
- id: 'ideogram-ai/ideogram-v2',
677
- name: 'Ideogram v2',
678
- released: '2024-08-19',
679
- ...replicateImage,
680
- cost: { type: 'per-image', perImage: 0.08 },
681
- features: {
682
- editing: false,
683
- inpainting: false,
684
- aspectRatios: ['1:1', '3:4', '4:3', '9:16', '16:9'],
685
- seed: true,
686
- multipleImages: false,
687
- },
688
- },
689
- {
690
- id: 'ideogram-ai/ideogram-v2-turbo',
691
- name: 'Ideogram v2 Turbo',
692
- released: '2024-08-19',
693
- ...replicateImage,
694
- cost: { type: 'per-image', perImage: 0.05 },
695
- features: {
696
- editing: false,
697
- inpainting: false,
698
- aspectRatios: ['1:1', '3:4', '4:3', '9:16', '16:9'],
699
- seed: true,
700
- multipleImages: false,
701
- },
702
- },
703
- {
704
- id: 'recraft-ai/recraft-v3',
705
- name: 'Recraft v3',
706
- released: '2024-10-29',
707
- ...replicateImage,
708
- cost: { type: 'per-image', perImage: 0.04 },
709
- features: {
710
- editing: false,
711
- inpainting: false,
712
- aspectRatios: ['1:1', '3:4', '4:3', '9:16', '16:9'],
713
- seed: true,
714
- multipleImages: false,
715
- },
716
- },
717
- {
718
- id: 'recraft-ai/recraft-v3-svg',
719
- name: 'Recraft v3 SVG',
720
- released: '2024-10-29',
721
- ...replicateImage,
722
- cost: { type: 'per-image', perImage: 0.08 },
723
- features: {
724
- editing: false,
725
- inpainting: false,
726
- aspectRatios: ['1:1', '3:4', '4:3', '9:16', '16:9'],
727
- seed: true,
728
- multipleImages: false,
729
- },
730
- },
731
- {
732
- id: 'stability-ai/stable-diffusion-3.5-large',
733
- name: 'SD 3.5 Large',
734
- released: '2024-10-22',
735
- ...replicateImage,
736
- cost: { type: 'per-image', perImage: 0.065 },
737
- features: {
738
- editing: false,
739
- inpainting: false,
740
- aspectRatios: ['1:1', '3:4', '4:3', '9:16', '16:9', '9:21', '21:9'],
741
- seed: true,
742
- multipleImages: false,
743
- },
744
- },
745
- {
746
- id: 'stability-ai/stable-diffusion-3.5-large-turbo',
747
- name: 'SD 3.5 Large Turbo',
748
- released: '2024-10-22',
749
- ...replicateImage,
750
- cost: { type: 'per-image', perImage: 0.04 },
751
- features: {
752
- editing: false,
753
- inpainting: false,
754
- aspectRatios: ['1:1', '3:4', '4:3', '9:16', '16:9', '9:21', '21:9'],
755
- seed: true,
756
- multipleImages: false,
757
- },
758
- },
759
- {
760
- id: 'stability-ai/stable-diffusion-3.5-medium',
761
- name: 'SD 3.5 Medium',
762
- released: '2024-10-29',
763
- ...replicateImage,
764
- cost: { type: 'per-image', perImage: 0.035 },
765
- features: {
766
- editing: false,
767
- inpainting: false,
768
- aspectRatios: ['1:1', '3:4', '4:3', '9:16', '16:9', '9:21', '21:9'],
769
- seed: true,
770
- multipleImages: false,
771
- },
772
- },
773
- {
774
- id: 'luma/photon',
775
- name: 'Luma Photon',
776
- released: '2024-12-10',
777
- ...replicateImage,
778
- cost: { type: 'per-image', perImage: 0.03 },
779
- features: {
780
- editing: false,
781
- inpainting: false,
782
- aspectRatios: ['1:1', '3:4', '4:3', '9:16', '16:9', '9:21', '21:9'],
783
- seed: true,
784
- multipleImages: false,
785
- },
786
- },
787
- {
788
- id: 'luma/photon-flash',
789
- name: 'Luma Photon Flash',
790
- released: '2024-12-10',
791
- ...replicateImage,
792
- cost: { type: 'per-image', perImage: 0.01 },
793
- features: {
794
- editing: false,
795
- inpainting: false,
796
- aspectRatios: ['1:1', '3:4', '4:3', '9:16', '16:9', '9:21', '21:9'],
797
- seed: true,
798
- multipleImages: false,
799
- },
800
- },
801
- {
802
- id: 'nvidia/sana',
803
- name: 'NVIDIA Sana',
804
- released: '2024-11-27',
805
- ...replicateImage,
806
- cost: { type: 'per-image', perImage: 0.01 },
807
- features: {
808
- editing: false,
809
- inpainting: false,
810
- aspectRatios: ['1:1', '3:4', '4:3', '9:16', '16:9'],
811
- seed: true,
812
- multipleImages: false,
813
- },
814
- },
815
-
816
- // ── Fal ────────────────────────────────────────────────────────────────
817
- {
818
- id: 'fal-ai/flux/schnell',
819
- name: 'Flux Schnell',
820
- released: '2024-08-01',
821
- ...falImage,
822
- cost: { type: 'per-image', perImage: 0.003 },
823
- features: {
824
- editing: false,
825
- inpainting: false,
826
- aspectRatios: fluxAspectRatios,
827
- seed: true,
828
- multipleImages: true,
829
- },
830
- },
831
- {
832
- id: 'fal-ai/flux/dev',
833
- name: 'Flux Dev',
834
- released: '2024-08-01',
835
- ...falImage,
836
- cost: { type: 'per-image', perImage: 0.025 },
837
- features: {
838
- editing: false,
839
- inpainting: false,
840
- aspectRatios: fluxAspectRatios,
841
- seed: true,
842
- multipleImages: true,
843
- },
844
- },
845
- {
846
- id: 'fal-ai/flux-general',
847
- name: 'Flux General',
848
- released: '2025-01',
849
- ...falImage,
850
- cost: { type: 'per-image', perImage: 0.075 },
851
- features: {
852
- editing: true,
853
- inpainting: false,
854
- aspectRatios: fluxAspectRatios,
855
- seed: true,
856
- multipleImages: true,
857
- },
858
- },
859
- {
860
- id: 'fal-ai/flux-general/inpainting',
861
- name: 'Flux General Inpainting',
862
- released: '2025-01',
863
- ...falImage,
864
- cost: { type: 'per-image', perImage: 0.075 },
865
- features: {
866
- editing: true,
867
- inpainting: true,
868
- aspectRatios: fluxAspectRatios,
869
- seed: true,
870
- multipleImages: false,
871
- },
872
- },
873
- {
874
- id: 'fal-ai/flux-general/image-to-image',
875
- name: 'Flux General Image-to-Image',
876
- released: '2025-01',
877
- ...falImage,
878
- cost: { type: 'per-image', perImage: 0.075 },
879
- features: {
880
- editing: true,
881
- inpainting: false,
882
- aspectRatios: fluxAspectRatios,
883
- seed: true,
884
- multipleImages: false,
885
- },
886
- },
887
- {
888
- id: 'fal-ai/flux-pro/v1.1',
889
- name: 'Flux Pro 1.1',
890
- released: '2024-10-01',
891
- ...falImage,
892
- cost: { type: 'per-image', perImage: 0.04 },
893
- features: {
894
- editing: false,
895
- inpainting: false,
896
- aspectRatios: fluxAspectRatios,
897
- seed: true,
898
- multipleImages: false,
899
- },
900
- },
901
- {
902
- id: 'fal-ai/flux-pro/v1.1-ultra',
903
- name: 'Flux Pro 1.1 Ultra',
904
- released: '2024-11-06',
905
- ...falImage,
906
- cost: { type: 'per-image', perImage: 0.06 },
907
- features: {
908
- editing: false,
909
- inpainting: false,
910
- aspectRatios: fluxAspectRatios,
911
- seed: true,
912
- multipleImages: false,
913
- },
914
- },
915
- {
916
- id: 'fal-ai/flux-pro/kontext',
917
- name: 'Flux Kontext',
918
- released: '2025-06-12',
919
- ...falImage,
920
- cost: { type: 'per-image', perImage: 0.04 },
921
- features: {
922
- editing: true,
923
- inpainting: false,
924
- aspectRatios: fluxAspectRatios,
925
- seed: true,
926
- multipleImages: false,
927
- },
928
- },
929
- {
930
- id: 'fal-ai/flux-pro/kontext/max',
931
- name: 'Flux Kontext Max',
932
- released: '2025-06-12',
933
- ...falImage,
934
- cost: { type: 'per-image', perImage: 0.08 },
935
- features: {
936
- editing: true,
937
- inpainting: false,
938
- aspectRatios: fluxAspectRatios,
939
- seed: true,
940
- multipleImages: false,
941
- },
942
- },
943
- {
944
- id: 'fal-ai/flux-lora',
945
- name: 'Flux LoRA',
946
- released: '2024-09',
947
- ...falImage,
948
- cost: { type: 'per-image', perImage: 0.035 },
949
- features: {
950
- editing: false,
951
- inpainting: false,
952
- aspectRatios: fluxAspectRatios,
953
- seed: true,
954
- multipleImages: true,
955
- },
956
- },
957
- {
958
- id: 'fal-ai/recraft/v3/text-to-image',
959
- name: 'Recraft v3',
960
- released: '2024-10-29',
961
- ...falImage,
962
- cost: { type: 'per-image', perImage: 0.04 },
963
- features: {
964
- editing: false,
965
- inpainting: false,
966
- aspectRatios: fluxAspectRatios,
967
- seed: true,
968
- multipleImages: false,
969
- },
970
- },
971
- {
972
- id: 'fal-ai/recraft/v3/image-to-image',
973
- name: 'Recraft v3 Image-to-Image',
974
- released: '2024-10-29',
975
- ...falImage,
976
- cost: { type: 'per-image', perImage: 0.04 },
977
- features: {
978
- editing: true,
979
- inpainting: false,
980
- aspectRatios: fluxAspectRatios,
981
- seed: true,
982
- multipleImages: false,
983
- },
984
- },
985
- {
986
- id: 'fal-ai/ideogram/character',
987
- name: 'Ideogram Character',
988
- released: '2025-03',
989
- ...falImage,
990
- cost: { type: 'per-image', perImage: 0.10 },
991
- features: {
992
- editing: true,
993
- inpainting: true,
994
- aspectRatios: fluxAspectRatios,
995
- seed: true,
996
- multipleImages: false,
997
- },
998
- },
999
- {
1000
- id: 'fal-ai/imagen4/preview',
1001
- name: 'Imagen 4 (Fal)',
1002
- released: '2025-08-15',
1003
- ...falImage,
1004
- cost: { type: 'per-image', perImage: 0.04 },
1005
- features: {
1006
- editing: false,
1007
- inpainting: false,
1008
- aspectRatios: ['1:1', '3:4', '4:3', '9:16', '16:9'],
1009
- seed: true,
1010
- multipleImages: false,
1011
- },
1012
- },
1013
- {
1014
- id: 'fal-ai/luma-photon',
1015
- name: 'Luma Photon (Fal)',
1016
- released: '2024-12-10',
1017
- ...falImage,
1018
- cost: { type: 'per-image', perImage: 0.019 },
1019
- features: {
1020
- editing: false,
1021
- inpainting: false,
1022
- aspectRatios: fluxAspectRatios,
1023
- seed: false,
1024
- multipleImages: false,
1025
- },
1026
- },
1027
- {
1028
- id: 'fal-ai/luma-photon/flash',
1029
- name: 'Luma Photon Flash (Fal)',
1030
- released: '2024-12-10',
1031
- ...falImage,
1032
- cost: { type: 'per-image', perImage: 0.005 },
1033
- features: {
1034
- editing: false,
1035
- inpainting: false,
1036
- aspectRatios: fluxAspectRatios,
1037
- seed: false,
1038
- multipleImages: false,
1039
- },
1040
- },
1041
- {
1042
- id: 'fal-ai/omnigen-v2',
1043
- name: 'OmniGen v2',
1044
- released: '2025-06',
1045
- ...falImage,
1046
- cost: { type: 'per-image', perImage: 0.03 },
1047
- features: {
1048
- editing: true,
1049
- inpainting: false,
1050
- aspectRatios: fluxAspectRatios,
1051
- seed: true,
1052
- multipleImages: false,
1053
- },
1054
- },
1055
- {
1056
- id: 'fal-ai/qwen-image',
1057
- name: 'Qwen Image',
1058
- released: '2025-06',
1059
- ...falImage,
1060
- cost: { type: 'per-image', perImage: 0.03 },
1061
- features: {
1062
- editing: false,
1063
- inpainting: false,
1064
- aspectRatios: fluxAspectRatios,
1065
- seed: true,
1066
- multipleImages: false,
1067
- },
1068
- },
1069
- ]
1070
-
1071
- // ─── lookup helpers ──────────────────────────────────────────────────────────
1072
-
1073
- const catalogIndex = new Map(CATALOG.map((m) => [m.id, m]))
1074
-
1075
- export function findModel(id: string): ModelEntry | undefined {
1076
- return catalogIndex.get(id)
1077
- }