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
@@ -0,0 +1,2135 @@
1
+ // Single source of truth for all image and video 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
+ // Provider option schemas are sourced from the @ai-sdk/* packages and upstream API docs.
10
+ // Each shared fragment has a URL comment pointing to the source of truth so options
11
+ // are easy to verify and update when providers change their APIs.
12
+ //
13
+ // Sources:
14
+ // xAI image: node_modules/@ai-sdk/xai/dist/index.d.ts → xaiImageModelOptions
15
+ // https://docs.x.ai/docs/api-reference#create-image
16
+ // xAI video: node_modules/@ai-sdk/xai/dist/index.d.ts → XaiVideoModelOptions
17
+ // https://docs.x.ai/docs/api-reference#create-video
18
+ // OpenAI: node_modules/@ai-sdk/openai/dist/index.d.ts → imageGeneration args
19
+ // https://platform.openai.com/docs/api-reference/images
20
+ // Fal image: https://ai-sdk.dev/providers/ai-sdk-providers/fal
21
+ // node_modules/@ai-sdk/fal/dist/index.d.ts → FalImageModelOptions
22
+ // Fal video: node_modules/@ai-sdk/fal/dist/index.d.ts → FalVideoModelOptions
23
+ // https://ai-sdk.dev/providers/ai-sdk-providers/fal
24
+ // ─── shared fragments ────────────────────────────────────────────────────────
25
+ // Spread these into model entries to avoid repeating common fields.
26
+ const googleImagen = {
27
+ provider: 'google',
28
+ strategy: 'image',
29
+ features: {
30
+ editing: true,
31
+ inpainting: true,
32
+ aspectRatios: ['1:1', '3:4', '4:3', '9:16', '16:9'],
33
+ seed: true,
34
+ multipleImages: true,
35
+ },
36
+ };
37
+ const googleText = {
38
+ provider: 'google',
39
+ strategy: 'text',
40
+ features: {
41
+ editing: true,
42
+ inpainting: false,
43
+ aspectRatios: ['1:1', '3:4', '4:3', '9:16', '16:9', '2:3', '3:2', '4:5', '5:4'],
44
+ seed: false,
45
+ multipleImages: false,
46
+ },
47
+ };
48
+ // Source: node_modules/@ai-sdk/openai/dist/index.d.ts → imageGeneration args
49
+ // Docs: https://platform.openai.com/docs/api-reference/images/create
50
+ const openaiImageProviderOptions = [
51
+ { flag: 'quality', providerKey: 'quality', description: 'Image quality', values: ['auto', 'low', 'medium', 'high'], defaultValue: 'auto', type: 'string' },
52
+ { flag: 'output-format', providerKey: 'outputFormat', description: 'Output format', values: ['png', 'jpeg', 'webp'], defaultValue: 'png', type: 'string' },
53
+ ];
54
+ const openaiImage = {
55
+ provider: 'openai',
56
+ strategy: 'image',
57
+ providerOptions: openaiImageProviderOptions,
58
+ };
59
+ const replicateImage = {
60
+ provider: 'replicate',
61
+ strategy: 'image',
62
+ };
63
+ // Source: node_modules/@ai-sdk/fal/dist/index.d.ts → FalImageModelOptions (lazy passthrough)
64
+ // Docs: https://ai-sdk.dev/providers/ai-sdk-providers/fal#provider-options
65
+ const falImageProviderOptions = [
66
+ { flag: 'output-format', providerKey: 'outputFormat', description: 'Output format', values: ['png', 'jpeg'], type: 'string' },
67
+ { flag: 'negative-prompt', providerKey: 'negativePrompt', description: 'What to avoid in the image', type: 'string' },
68
+ ];
69
+ const falImage = {
70
+ provider: 'fal',
71
+ strategy: 'image',
72
+ providerOptions: falImageProviderOptions,
73
+ };
74
+ const bflImage = {
75
+ provider: 'bfl',
76
+ strategy: 'image',
77
+ };
78
+ const recraftImage = {
79
+ provider: 'recraft',
80
+ strategy: 'image',
81
+ };
82
+ // Source: node_modules/@ai-sdk/xai/dist/index.d.ts → xaiImageModelOptions
83
+ // Docs: https://docs.x.ai/docs/api-reference#create-image
84
+ const xaiImageProviderOptions = [
85
+ { flag: 'quality', providerKey: 'quality', description: 'Image quality', values: ['low', 'medium', 'high'], defaultValue: 'medium', type: 'string' },
86
+ { flag: 'resolution', providerKey: 'resolution', description: 'Output resolution', values: ['1k', '2k'], defaultValue: '1k', type: 'string' },
87
+ { flag: 'output-format', providerKey: 'output_format', description: 'Output format', values: ['png', 'jpeg'], defaultValue: 'png', type: 'string' },
88
+ ];
89
+ const xaiImage = {
90
+ provider: 'xai',
91
+ strategy: 'image',
92
+ providerOptions: xaiImageProviderOptions,
93
+ };
94
+ // Source: node_modules/@ai-sdk/xai/dist/index.d.ts → XaiVideoModelOptions
95
+ // Docs: https://docs.x.ai/docs/api-reference#create-video
96
+ const xaiVideoProviderOptions = [
97
+ { flag: 'resolution', providerKey: 'resolution', description: 'Output resolution', values: ['480p', '720p'], defaultValue: '720p', type: 'string' },
98
+ { flag: 'mode', providerKey: 'mode', description: 'Video operation mode', values: ['edit-video', 'extend-video', 'reference-to-video'], type: 'string' },
99
+ // video-url is not a CLI flag; it's set internally from --input in edit/extend modes.
100
+ // Kept here so findProviderOption() can verify the model supports it and resolve the correct providerKey.
101
+ { flag: 'video-url', providerKey: 'videoUrl', description: 'Source video URL for editing or extension (internal)', type: 'string' },
102
+ { flag: 'reference-images', providerKey: 'referenceImageUrls', description: 'Reference images for R2V (1-7 files or URLs)', type: 'string', array: true },
103
+ ];
104
+ // Source: node_modules/@ai-sdk/bytedance/dist/index.d.ts → ByteDanceVideoProviderOptions
105
+ // Docs: https://sdk.vercel.ai/docs/providers/bytedance
106
+ const bytedanceVideoProviderOptions = [
107
+ { flag: 'resolution', providerKey: 'resolution', description: 'Output resolution', values: ['480p', '720p', '1080p'], type: 'string' },
108
+ { flag: 'reference-images', providerKey: 'referenceImages', description: 'Reference images for R2V (1-9 files or URLs, use @Image1 etc. in prompt)', type: 'string', array: true },
109
+ { flag: 'watermark', providerKey: 'watermark', description: 'Add watermark to video', type: 'boolean' },
110
+ { flag: 'generate-audio', providerKey: 'generateAudio', description: 'Generate synchronized audio', type: 'boolean' },
111
+ ];
112
+ // Source: node_modules/@ai-sdk/fal/dist/index.d.ts → FalVideoModelOptions
113
+ // Docs: https://ai-sdk.dev/providers/ai-sdk-providers/fal
114
+ const falVideoProviderOptions = [
115
+ { flag: 'negative-prompt', providerKey: 'negativePrompt', description: 'What to avoid in the video', type: 'string' },
116
+ ];
117
+ const vertexImagen = {
118
+ provider: 'vertex',
119
+ strategy: 'image',
120
+ features: {
121
+ ...googleImagen.features,
122
+ },
123
+ };
124
+ const vertexText = {
125
+ provider: 'vertex',
126
+ strategy: 'text',
127
+ features: {
128
+ ...googleText.features,
129
+ },
130
+ };
131
+ const fluxAspectRatios = ['1:1', '3:4', '4:3', '9:16', '16:9', '9:21', '21:9'];
132
+ // ─── catalog ─────────────────────────────────────────────────────────────────
133
+ export const CATALOG = [
134
+ // ── Google: Imagen ─────────────────────────────────────────────────────
135
+ {
136
+ id: 'imagen-4.0-generate-001',
137
+ name: 'Imagen 4',
138
+ released: '2025-08-15',
139
+ ...googleImagen,
140
+ cost: { type: 'per-image', perImage: 0.04 },
141
+ },
142
+ {
143
+ id: 'imagen-4.0-ultra-generate-001',
144
+ name: 'Imagen 4 Ultra',
145
+ released: '2025-08-15',
146
+ ...googleImagen,
147
+ cost: { type: 'per-image', perImage: 0.06 },
148
+ },
149
+ {
150
+ id: 'imagen-4.0-fast-generate-001',
151
+ name: 'Imagen 4 Fast',
152
+ released: '2025-08-15',
153
+ ...googleImagen,
154
+ cost: { type: 'per-image', perImage: 0.02 },
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: 'Nano Banana Pro — the high-fidelity variant in the Nano Banana line, built on the ' +
182
+ 'Gemini Pro backbone. Best for complex scenes requiring maximum quality at the expense ' +
183
+ 'of higher cost and slower speed. Still the best fit for specialized high-fidelity tasks ' +
184
+ 'where Nano Banana 2 trades off some quality for much faster, cheaper generation.',
185
+ released: '2025-11-20',
186
+ ...googleText,
187
+ cost: { type: 'per-token', inputPerM: 0.3, outputPerM: 30 },
188
+ },
189
+ {
190
+ id: 'gemini-3.1-flash-image-preview',
191
+ name: 'Gemini 3.1 Flash Image (Nano Banana 2)',
192
+ description: 'Nano Banana 2 — high-efficiency successor in the Nano Banana line. Targets Pro-like ' +
193
+ 'quality with faster iteration and lower cost. Built on Gemini 3.1 Flash backbone. ' +
194
+ 'Key upgrades: consistent rendering of up to 5 characters per workflow, new native ' +
195
+ 'aspect ratios (4:1, 1:4, 8:1, 1:8), resolutions from 512px to 4K, improved text ' +
196
+ 'rendering and in-image localization. Nano Banana Pro remains the best fit for ' +
197
+ 'specialized high-fidelity tasks.',
198
+ released: '2026-02-26',
199
+ ...googleText,
200
+ features: {
201
+ ...googleText.features,
202
+ aspectRatios: [
203
+ ...googleText.features.aspectRatios,
204
+ '4:1',
205
+ '1:4',
206
+ '8:1',
207
+ '1:8',
208
+ ],
209
+ },
210
+ cost: { type: 'per-token', inputPerM: 0.5, outputPerM: 3.0 },
211
+ },
212
+ // ── Vertex: Imagen ──────────────────────────────────────────────────────
213
+ // Same models as Google AI Studio but routed through Vertex AI / Google Cloud billing.
214
+ // Use `egaki login --provider vertex --key <key>` to configure.
215
+ {
216
+ id: 'vertex/imagen-4.0-generate-001',
217
+ name: 'Imagen 4 (Vertex)',
218
+ released: '2025-08-15',
219
+ ...vertexImagen,
220
+ cost: { type: 'per-image', perImage: 0.04 },
221
+ },
222
+ {
223
+ id: 'vertex/imagen-4.0-ultra-generate-001',
224
+ name: 'Imagen 4 Ultra (Vertex)',
225
+ released: '2025-08-15',
226
+ ...vertexImagen,
227
+ cost: { type: 'per-image', perImage: 0.06 },
228
+ },
229
+ {
230
+ id: 'vertex/imagen-4.0-fast-generate-001',
231
+ name: 'Imagen 4 Fast (Vertex)',
232
+ released: '2025-08-15',
233
+ ...vertexImagen,
234
+ cost: { type: 'per-image', perImage: 0.02 },
235
+ },
236
+ // ── Vertex: Gemini text+image ─────────────────────────────────────────
237
+ {
238
+ id: 'vertex/gemini-2.5-flash-image',
239
+ name: 'Gemini 2.5 Flash Image (Vertex)',
240
+ released: '2025-08-26',
241
+ ...vertexText,
242
+ cost: { type: 'per-token', inputPerM: 0.3, outputPerM: 30 },
243
+ },
244
+ {
245
+ id: 'vertex/gemini-3-pro-image-preview',
246
+ name: 'Gemini 3 Pro Image (Vertex)',
247
+ released: '2025-11-20',
248
+ ...vertexText,
249
+ cost: { type: 'per-token', inputPerM: 1.25, outputPerM: 10 },
250
+ },
251
+ {
252
+ id: 'vertex/gemini-3.1-flash-image-preview',
253
+ name: 'Gemini 3.1 Flash Image (Vertex)',
254
+ released: '2026-02-26',
255
+ ...vertexText,
256
+ features: {
257
+ ...vertexText.features,
258
+ aspectRatios: [
259
+ ...vertexText.features.aspectRatios,
260
+ '4:1',
261
+ '1:4',
262
+ '8:1',
263
+ '1:8',
264
+ ],
265
+ },
266
+ cost: { type: 'per-token', inputPerM: 0.5, outputPerM: 3.0 },
267
+ },
268
+ // ── BFL (AI Gateway) ───────────────────────────────────────────────────
269
+ {
270
+ id: 'flux-kontext-max',
271
+ name: 'FLUX Kontext Max',
272
+ released: '2025-06-12',
273
+ ...bflImage,
274
+ cost: { type: 'per-image', perImage: 0.08 },
275
+ features: {
276
+ editing: true,
277
+ inpainting: false,
278
+ aspectRatios: fluxAspectRatios,
279
+ seed: true,
280
+ multipleImages: false,
281
+ },
282
+ },
283
+ {
284
+ id: 'flux-kontext-pro',
285
+ name: 'FLUX Kontext Pro',
286
+ released: '2025-06-12',
287
+ ...bflImage,
288
+ cost: { type: 'per-image', perImage: 0.04 },
289
+ features: {
290
+ editing: true,
291
+ inpainting: false,
292
+ aspectRatios: fluxAspectRatios,
293
+ seed: true,
294
+ multipleImages: false,
295
+ },
296
+ },
297
+ {
298
+ id: 'flux-pro-1.0-fill',
299
+ name: 'FLUX Pro 1.0 Fill',
300
+ released: '2024-10-15',
301
+ ...bflImage,
302
+ cost: { type: 'per-image', perImage: 0.05 },
303
+ features: {
304
+ editing: true,
305
+ inpainting: true,
306
+ aspectRatios: fluxAspectRatios,
307
+ seed: true,
308
+ multipleImages: false,
309
+ },
310
+ },
311
+ {
312
+ id: 'flux-pro-1.1',
313
+ name: 'FLUX Pro 1.1',
314
+ released: '2024-10-01',
315
+ ...bflImage,
316
+ cost: { type: 'per-image', perImage: 0.04 },
317
+ features: {
318
+ editing: false,
319
+ inpainting: false,
320
+ aspectRatios: fluxAspectRatios,
321
+ seed: true,
322
+ multipleImages: false,
323
+ },
324
+ },
325
+ {
326
+ id: 'flux-pro-1.1-ultra',
327
+ name: 'FLUX Pro 1.1 Ultra',
328
+ released: '2024-11-06',
329
+ ...bflImage,
330
+ cost: { type: 'per-image', perImage: 0.06 },
331
+ features: {
332
+ editing: false,
333
+ inpainting: false,
334
+ aspectRatios: fluxAspectRatios,
335
+ seed: true,
336
+ multipleImages: false,
337
+ },
338
+ },
339
+ {
340
+ id: 'flux-2-pro',
341
+ name: 'FLUX.2 Pro',
342
+ released: '2025-12',
343
+ ...bflImage,
344
+ cost: { type: 'per-image', perImage: 0.03 },
345
+ features: {
346
+ editing: true,
347
+ inpainting: false,
348
+ aspectRatios: fluxAspectRatios,
349
+ seed: true,
350
+ multipleImages: false,
351
+ },
352
+ },
353
+ {
354
+ id: 'flux-2-max',
355
+ name: 'FLUX.2 Max',
356
+ released: '2025-12',
357
+ ...bflImage,
358
+ cost: { type: 'per-image', perImage: 0.07 },
359
+ features: {
360
+ editing: true,
361
+ inpainting: false,
362
+ aspectRatios: fluxAspectRatios,
363
+ seed: true,
364
+ multipleImages: false,
365
+ },
366
+ },
367
+ {
368
+ id: 'flux-2-flex',
369
+ name: 'FLUX.2 Flex',
370
+ released: '2025-12',
371
+ ...bflImage,
372
+ cost: { type: 'per-image', perImage: 0.05 },
373
+ features: {
374
+ editing: true,
375
+ inpainting: false,
376
+ aspectRatios: fluxAspectRatios,
377
+ seed: true,
378
+ multipleImages: false,
379
+ },
380
+ },
381
+ {
382
+ id: 'flux-2-klein-9b',
383
+ name: 'FLUX.2 Klein 9B',
384
+ released: '2025-12',
385
+ ...bflImage,
386
+ cost: { type: 'per-image', perImage: 0.015 },
387
+ features: {
388
+ editing: true,
389
+ inpainting: false,
390
+ aspectRatios: fluxAspectRatios,
391
+ seed: true,
392
+ multipleImages: false,
393
+ },
394
+ },
395
+ {
396
+ id: 'flux-2-klein-4b',
397
+ name: 'FLUX.2 Klein 4B',
398
+ released: '2025-12',
399
+ ...bflImage,
400
+ cost: { type: 'per-image', perImage: 0.014 },
401
+ features: {
402
+ editing: true,
403
+ inpainting: false,
404
+ aspectRatios: fluxAspectRatios,
405
+ seed: true,
406
+ multipleImages: false,
407
+ },
408
+ },
409
+ // ── Recraft (AI Gateway) ───────────────────────────────────────────────
410
+ {
411
+ id: 'recraft-v2',
412
+ name: 'Recraft v2',
413
+ released: '2024-08-19',
414
+ ...recraftImage,
415
+ cost: { type: 'per-image', perImage: 0.04 },
416
+ features: {
417
+ editing: false,
418
+ inpainting: false,
419
+ aspectRatios: ['1:1', '3:4', '4:3', '9:16', '16:9'],
420
+ seed: false,
421
+ multipleImages: false,
422
+ },
423
+ },
424
+ {
425
+ id: 'recraft-v3',
426
+ name: 'Recraft v3 (AI Gateway)',
427
+ released: '2024-10-29',
428
+ ...recraftImage,
429
+ cost: { type: 'per-image', perImage: 0.04 },
430
+ features: {
431
+ editing: false,
432
+ inpainting: false,
433
+ aspectRatios: ['1:1', '3:4', '4:3', '9:16', '16:9'],
434
+ seed: false,
435
+ multipleImages: false,
436
+ },
437
+ },
438
+ {
439
+ id: 'recraft-v4',
440
+ name: 'Recraft v4',
441
+ released: '2025-10-08',
442
+ ...recraftImage,
443
+ cost: { type: 'per-image', perImage: 0.04 },
444
+ features: {
445
+ editing: false,
446
+ inpainting: false,
447
+ aspectRatios: ['1:1', '3:4', '4:3', '9:16', '16:9'],
448
+ seed: false,
449
+ multipleImages: false,
450
+ },
451
+ },
452
+ {
453
+ id: 'recraft-v4-pro',
454
+ name: 'Recraft v4 Pro',
455
+ released: '2025-10-08',
456
+ ...recraftImage,
457
+ cost: { type: 'per-image', perImage: 0.25 },
458
+ features: {
459
+ editing: false,
460
+ inpainting: false,
461
+ aspectRatios: ['1:1', '3:4', '4:3', '9:16', '16:9'],
462
+ seed: false,
463
+ multipleImages: false,
464
+ },
465
+ },
466
+ {
467
+ id: 'recraft-v4.1',
468
+ name: 'Recraft v4.1',
469
+ released: '2026-05',
470
+ ...recraftImage,
471
+ cost: { type: 'per-image', perImage: 0.04 },
472
+ features: {
473
+ editing: false,
474
+ inpainting: false,
475
+ aspectRatios: ['1:1', '3:4', '4:3', '9:16', '16:9'],
476
+ seed: false,
477
+ multipleImages: false,
478
+ },
479
+ },
480
+ {
481
+ id: 'recraft-v4.1-pro',
482
+ name: 'Recraft v4.1 Pro',
483
+ released: '2026-05',
484
+ ...recraftImage,
485
+ cost: { type: 'per-image', perImage: 0.25 },
486
+ features: {
487
+ editing: false,
488
+ inpainting: false,
489
+ aspectRatios: ['1:1', '3:4', '4:3', '9:16', '16:9'],
490
+ seed: false,
491
+ multipleImages: false,
492
+ },
493
+ },
494
+ {
495
+ id: 'recraft-v4.1-utility',
496
+ name: 'Recraft v4.1 Utility',
497
+ released: '2026-05',
498
+ ...recraftImage,
499
+ cost: { type: 'per-image', perImage: 0.04 },
500
+ features: {
501
+ editing: false,
502
+ inpainting: false,
503
+ aspectRatios: ['1:1', '3:4', '4:3', '9:16', '16:9'],
504
+ seed: false,
505
+ multipleImages: false,
506
+ },
507
+ },
508
+ {
509
+ id: 'recraft-v4.1-utility-pro',
510
+ name: 'Recraft v4.1 Utility Pro',
511
+ released: '2026-05',
512
+ ...recraftImage,
513
+ cost: { type: 'per-image', perImage: 0.25 },
514
+ features: {
515
+ editing: false,
516
+ inpainting: false,
517
+ aspectRatios: ['1:1', '3:4', '4:3', '9:16', '16:9'],
518
+ seed: false,
519
+ multipleImages: false,
520
+ },
521
+ },
522
+ // ── ByteDance Seedream (AI Gateway) ────────────────────────────────────
523
+ {
524
+ id: 'seedream-5.0-lite',
525
+ name: 'Seedream 5.0 Lite',
526
+ released: '2026-01',
527
+ provider: 'bytedance',
528
+ strategy: 'image',
529
+ cost: { type: 'per-image', perImage: 0.035 },
530
+ features: {
531
+ editing: false,
532
+ inpainting: false,
533
+ aspectRatios: ['1:1', '3:4', '4:3', '9:16', '16:9'],
534
+ seed: false,
535
+ multipleImages: false,
536
+ },
537
+ },
538
+ {
539
+ id: 'seedream-4.5',
540
+ name: 'Seedream 4.5',
541
+ released: '2025-11',
542
+ provider: 'bytedance',
543
+ strategy: 'image',
544
+ cost: { type: 'per-image', perImage: 0.04 },
545
+ features: {
546
+ editing: true,
547
+ inpainting: false,
548
+ aspectRatios: ['1:1', '3:4', '4:3', '9:16', '16:9'],
549
+ seed: false,
550
+ multipleImages: false,
551
+ },
552
+ },
553
+ {
554
+ id: 'seedream-4.0',
555
+ name: 'Seedream 4.0',
556
+ released: '2025-08',
557
+ provider: 'bytedance',
558
+ strategy: 'image',
559
+ cost: { type: 'per-image', perImage: 0.03 },
560
+ features: {
561
+ editing: true,
562
+ inpainting: false,
563
+ aspectRatios: ['1:1', '3:4', '4:3', '9:16', '16:9'],
564
+ seed: false,
565
+ multipleImages: false,
566
+ },
567
+ },
568
+ // ── xAI (AI Gateway) ────────────────────────────────────────────────────
569
+ {
570
+ id: 'grok-imagine-image',
571
+ name: 'Grok Imagine Image',
572
+ released: '2026-03',
573
+ ...xaiImage,
574
+ cost: { type: 'per-image', perImage: 0.02 },
575
+ features: {
576
+ editing: true,
577
+ inpainting: false,
578
+ aspectRatios: ['1:1', '3:4', '4:3', '9:16', '16:9'],
579
+ seed: false,
580
+ multipleImages: true,
581
+ },
582
+ },
583
+ {
584
+ id: 'grok-imagine-image-quality',
585
+ name: 'Grok Imagine Image Quality',
586
+ released: '2026-04',
587
+ ...xaiImage,
588
+ cost: { type: 'per-image', perImage: 0.05 },
589
+ features: {
590
+ editing: true,
591
+ inpainting: false,
592
+ aspectRatios: ['1:1', '3:4', '4:3', '9:16', '16:9'],
593
+ seed: false,
594
+ multipleImages: true,
595
+ },
596
+ },
597
+ // ── OpenAI ─────────────────────────────────────────────────────────────
598
+ {
599
+ id: 'dall-e-2',
600
+ name: 'DALL-E 2',
601
+ released: '2022-11-03',
602
+ ...openaiImage,
603
+ cost: { type: 'per-image', perImage: 0.02 },
604
+ features: {
605
+ editing: true,
606
+ inpainting: true,
607
+ aspectRatios: [],
608
+ sizes: ['256x256', '512x512', '1024x1024'],
609
+ seed: false,
610
+ multipleImages: true,
611
+ },
612
+ },
613
+ {
614
+ id: 'dall-e-3',
615
+ name: 'DALL-E 3',
616
+ released: '2023-10-03',
617
+ ...openaiImage,
618
+ cost: { type: 'per-image', perImage: 0.04 },
619
+ features: {
620
+ editing: false,
621
+ inpainting: false,
622
+ aspectRatios: [],
623
+ sizes: ['1024x1024', '1792x1024', '1024x1792'],
624
+ seed: false,
625
+ multipleImages: false,
626
+ },
627
+ },
628
+ {
629
+ id: 'gpt-image-1',
630
+ name: 'GPT Image 1',
631
+ released: '2025-04-23',
632
+ ...openaiImage,
633
+ cost: { type: 'per-image', perImage: 0.04 },
634
+ features: {
635
+ editing: true,
636
+ inpainting: true,
637
+ aspectRatios: [],
638
+ sizes: ['1024x1024', '1536x1024', '1024x1536'],
639
+ seed: false,
640
+ multipleImages: true,
641
+ },
642
+ },
643
+ {
644
+ id: 'gpt-image-1-mini',
645
+ name: 'GPT Image 1 Mini',
646
+ released: '2025-10-06',
647
+ ...openaiImage,
648
+ cost: { type: 'per-image', perImage: 0.009 },
649
+ features: {
650
+ editing: true,
651
+ inpainting: true,
652
+ aspectRatios: [],
653
+ sizes: ['1024x1024', '1536x1024', '1024x1536'],
654
+ seed: false,
655
+ multipleImages: true,
656
+ },
657
+ },
658
+ {
659
+ id: 'gpt-image-1.5',
660
+ name: 'GPT Image 1.5',
661
+ released: '2025-12-16',
662
+ ...openaiImage,
663
+ cost: { type: 'per-image', perImage: 0.034 },
664
+ features: {
665
+ editing: true,
666
+ inpainting: true,
667
+ aspectRatios: [],
668
+ sizes: ['1024x1024', '1536x1024', '1024x1536'],
669
+ seed: false,
670
+ multipleImages: true,
671
+ },
672
+ },
673
+ {
674
+ id: 'gpt-image-2',
675
+ name: 'GPT Image 2',
676
+ description: 'State-of-the-art image generation model with token-based pricing. ' +
677
+ 'Cost varies by quality and size; $0.053 is the medium-quality 1024×1024 estimate.',
678
+ released: '2026-04-21',
679
+ ...openaiImage,
680
+ // Token-based pricing: $30/1M output image tokens. Medium quality 1024×1024 ≈ $0.053.
681
+ cost: { type: 'per-image', perImage: 0.053 },
682
+ features: {
683
+ editing: true,
684
+ inpainting: true,
685
+ aspectRatios: [],
686
+ sizes: ['1024x1024', '1536x1024', '1024x1536'],
687
+ seed: false,
688
+ multipleImages: true,
689
+ },
690
+ },
691
+ {
692
+ id: 'chatgpt-image-latest',
693
+ name: 'ChatGPT Image',
694
+ description: 'Rolling-latest alias that tracks the newest ChatGPT image model. Currently points ' +
695
+ 'to gpt-image-2. Pricing may shift when the alias retargets to a newer model.',
696
+ released: '2026-01',
697
+ ...openaiImage,
698
+ // Matches gpt-image-2 medium quality 1024×1024 estimate.
699
+ cost: { type: 'per-image', perImage: 0.053 },
700
+ features: {
701
+ editing: true,
702
+ inpainting: true,
703
+ aspectRatios: [],
704
+ sizes: ['1024x1024', '1536x1024', '1024x1536'],
705
+ seed: false,
706
+ multipleImages: true,
707
+ },
708
+ },
709
+ // ── Replicate ──────────────────────────────────────────────────────────
710
+ {
711
+ id: 'black-forest-labs/flux-1.1-pro',
712
+ name: 'Flux 1.1 Pro',
713
+ released: '2024-10-01',
714
+ ...replicateImage,
715
+ cost: { type: 'per-image', perImage: 0.04 },
716
+ features: {
717
+ editing: false,
718
+ inpainting: false,
719
+ aspectRatios: fluxAspectRatios,
720
+ seed: true,
721
+ multipleImages: false,
722
+ },
723
+ },
724
+ {
725
+ id: 'black-forest-labs/flux-1.1-pro-ultra',
726
+ name: 'Flux 1.1 Pro Ultra',
727
+ released: '2024-11-06',
728
+ ...replicateImage,
729
+ cost: { type: 'per-image', perImage: 0.06 },
730
+ features: {
731
+ editing: false,
732
+ inpainting: false,
733
+ aspectRatios: fluxAspectRatios,
734
+ seed: true,
735
+ multipleImages: false,
736
+ },
737
+ },
738
+ {
739
+ id: 'black-forest-labs/flux-2-pro',
740
+ name: 'Flux 2 Pro',
741
+ released: '2025-11-25',
742
+ ...replicateImage,
743
+ cost: { type: 'per-image', perImage: 0.015 },
744
+ features: {
745
+ editing: false,
746
+ inpainting: false,
747
+ aspectRatios: fluxAspectRatios,
748
+ seed: true,
749
+ multipleImages: false,
750
+ },
751
+ },
752
+ {
753
+ id: 'black-forest-labs/flux-2-dev',
754
+ name: 'Flux 2 Dev',
755
+ released: '2025-11-25',
756
+ ...replicateImage,
757
+ cost: { type: 'per-image', perImage: 0.012 },
758
+ features: {
759
+ editing: false,
760
+ inpainting: false,
761
+ aspectRatios: fluxAspectRatios,
762
+ seed: true,
763
+ multipleImages: false,
764
+ },
765
+ },
766
+ {
767
+ id: 'black-forest-labs/flux-dev',
768
+ name: 'Flux Dev',
769
+ released: '2024-08-01',
770
+ ...replicateImage,
771
+ cost: { type: 'per-image', perImage: 0.025 },
772
+ features: {
773
+ editing: false,
774
+ inpainting: false,
775
+ aspectRatios: fluxAspectRatios,
776
+ seed: true,
777
+ multipleImages: false,
778
+ },
779
+ },
780
+ {
781
+ id: 'black-forest-labs/flux-pro',
782
+ name: 'Flux Pro',
783
+ released: '2024-08-01',
784
+ ...replicateImage,
785
+ cost: { type: 'per-image', perImage: 0.055 },
786
+ features: {
787
+ editing: false,
788
+ inpainting: false,
789
+ aspectRatios: fluxAspectRatios,
790
+ seed: true,
791
+ multipleImages: false,
792
+ },
793
+ },
794
+ {
795
+ id: 'black-forest-labs/flux-schnell',
796
+ name: 'Flux Schnell',
797
+ released: '2024-08-01',
798
+ ...replicateImage,
799
+ cost: { type: 'per-image', perImage: 0.003 },
800
+ features: {
801
+ editing: false,
802
+ inpainting: false,
803
+ aspectRatios: fluxAspectRatios,
804
+ seed: true,
805
+ multipleImages: false,
806
+ },
807
+ },
808
+ {
809
+ id: 'black-forest-labs/flux-fill-pro',
810
+ name: 'Flux Fill Pro',
811
+ released: '2024-10-15',
812
+ ...replicateImage,
813
+ cost: { type: 'per-image', perImage: 0.05 },
814
+ features: {
815
+ editing: true,
816
+ inpainting: true,
817
+ aspectRatios: fluxAspectRatios,
818
+ seed: true,
819
+ multipleImages: false,
820
+ },
821
+ },
822
+ {
823
+ id: 'black-forest-labs/flux-fill-dev',
824
+ name: 'Flux Fill Dev',
825
+ released: '2024-10-15',
826
+ ...replicateImage,
827
+ cost: { type: 'per-image', perImage: 0.04 },
828
+ features: {
829
+ editing: true,
830
+ inpainting: true,
831
+ aspectRatios: fluxAspectRatios,
832
+ seed: true,
833
+ multipleImages: false,
834
+ },
835
+ },
836
+ {
837
+ id: 'ideogram-ai/ideogram-v2',
838
+ name: 'Ideogram v2',
839
+ released: '2024-08-19',
840
+ ...replicateImage,
841
+ cost: { type: 'per-image', perImage: 0.08 },
842
+ features: {
843
+ editing: false,
844
+ inpainting: false,
845
+ aspectRatios: ['1:1', '3:4', '4:3', '9:16', '16:9'],
846
+ seed: true,
847
+ multipleImages: false,
848
+ },
849
+ },
850
+ {
851
+ id: 'ideogram-ai/ideogram-v2-turbo',
852
+ name: 'Ideogram v2 Turbo',
853
+ released: '2024-08-19',
854
+ ...replicateImage,
855
+ cost: { type: 'per-image', perImage: 0.05 },
856
+ features: {
857
+ editing: false,
858
+ inpainting: false,
859
+ aspectRatios: ['1:1', '3:4', '4:3', '9:16', '16:9'],
860
+ seed: true,
861
+ multipleImages: false,
862
+ },
863
+ },
864
+ {
865
+ id: 'recraft-ai/recraft-v3',
866
+ name: 'Recraft v3',
867
+ released: '2024-10-29',
868
+ ...replicateImage,
869
+ cost: { type: 'per-image', perImage: 0.04 },
870
+ features: {
871
+ editing: false,
872
+ inpainting: false,
873
+ aspectRatios: ['1:1', '3:4', '4:3', '9:16', '16:9'],
874
+ seed: true,
875
+ multipleImages: false,
876
+ },
877
+ },
878
+ {
879
+ id: 'recraft-ai/recraft-v3-svg',
880
+ name: 'Recraft v3 SVG',
881
+ released: '2024-10-29',
882
+ ...replicateImage,
883
+ cost: { type: 'per-image', perImage: 0.08 },
884
+ features: {
885
+ editing: false,
886
+ inpainting: false,
887
+ aspectRatios: ['1:1', '3:4', '4:3', '9:16', '16:9'],
888
+ seed: true,
889
+ multipleImages: false,
890
+ },
891
+ },
892
+ {
893
+ id: 'stability-ai/stable-diffusion-3.5-large',
894
+ name: 'SD 3.5 Large',
895
+ released: '2024-10-22',
896
+ ...replicateImage,
897
+ cost: { type: 'per-image', perImage: 0.065 },
898
+ features: {
899
+ editing: false,
900
+ inpainting: false,
901
+ aspectRatios: ['1:1', '3:4', '4:3', '9:16', '16:9', '9:21', '21:9'],
902
+ seed: true,
903
+ multipleImages: false,
904
+ },
905
+ },
906
+ {
907
+ id: 'stability-ai/stable-diffusion-3.5-large-turbo',
908
+ name: 'SD 3.5 Large Turbo',
909
+ released: '2024-10-22',
910
+ ...replicateImage,
911
+ cost: { type: 'per-image', perImage: 0.04 },
912
+ features: {
913
+ editing: false,
914
+ inpainting: false,
915
+ aspectRatios: ['1:1', '3:4', '4:3', '9:16', '16:9', '9:21', '21:9'],
916
+ seed: true,
917
+ multipleImages: false,
918
+ },
919
+ },
920
+ {
921
+ id: 'stability-ai/stable-diffusion-3.5-medium',
922
+ name: 'SD 3.5 Medium',
923
+ released: '2024-10-29',
924
+ ...replicateImage,
925
+ cost: { type: 'per-image', perImage: 0.035 },
926
+ features: {
927
+ editing: false,
928
+ inpainting: false,
929
+ aspectRatios: ['1:1', '3:4', '4:3', '9:16', '16:9', '9:21', '21:9'],
930
+ seed: true,
931
+ multipleImages: false,
932
+ },
933
+ },
934
+ {
935
+ id: 'luma/photon',
936
+ name: 'Luma Photon',
937
+ released: '2024-12-10',
938
+ ...replicateImage,
939
+ cost: { type: 'per-image', perImage: 0.03 },
940
+ features: {
941
+ editing: false,
942
+ inpainting: false,
943
+ aspectRatios: ['1:1', '3:4', '4:3', '9:16', '16:9', '9:21', '21:9'],
944
+ seed: true,
945
+ multipleImages: false,
946
+ },
947
+ },
948
+ {
949
+ id: 'luma/photon-flash',
950
+ name: 'Luma Photon Flash',
951
+ released: '2024-12-10',
952
+ ...replicateImage,
953
+ cost: { type: 'per-image', perImage: 0.01 },
954
+ features: {
955
+ editing: false,
956
+ inpainting: false,
957
+ aspectRatios: ['1:1', '3:4', '4:3', '9:16', '16:9', '9:21', '21:9'],
958
+ seed: true,
959
+ multipleImages: false,
960
+ },
961
+ },
962
+ {
963
+ id: 'nvidia/sana',
964
+ name: 'NVIDIA Sana',
965
+ released: '2024-11-27',
966
+ ...replicateImage,
967
+ cost: { type: 'per-image', perImage: 0.01 },
968
+ features: {
969
+ editing: false,
970
+ inpainting: false,
971
+ aspectRatios: ['1:1', '3:4', '4:3', '9:16', '16:9'],
972
+ seed: true,
973
+ multipleImages: false,
974
+ },
975
+ },
976
+ // ── Fal ────────────────────────────────────────────────────────────────
977
+ {
978
+ id: 'fal-ai/flux/schnell',
979
+ name: 'Flux Schnell',
980
+ released: '2024-08-01',
981
+ ...falImage,
982
+ cost: { type: 'per-image', perImage: 0.003 },
983
+ features: {
984
+ editing: false,
985
+ inpainting: false,
986
+ aspectRatios: fluxAspectRatios,
987
+ seed: true,
988
+ multipleImages: true,
989
+ },
990
+ },
991
+ {
992
+ id: 'fal-ai/flux/dev',
993
+ name: 'Flux Dev',
994
+ released: '2024-08-01',
995
+ ...falImage,
996
+ cost: { type: 'per-image', perImage: 0.025 },
997
+ features: {
998
+ editing: false,
999
+ inpainting: false,
1000
+ aspectRatios: fluxAspectRatios,
1001
+ seed: true,
1002
+ multipleImages: true,
1003
+ },
1004
+ },
1005
+ {
1006
+ id: 'fal-ai/flux-general',
1007
+ name: 'Flux General',
1008
+ released: '2025-01',
1009
+ ...falImage,
1010
+ cost: { type: 'per-image', perImage: 0.075 },
1011
+ features: {
1012
+ editing: true,
1013
+ inpainting: false,
1014
+ aspectRatios: fluxAspectRatios,
1015
+ seed: true,
1016
+ multipleImages: true,
1017
+ },
1018
+ },
1019
+ {
1020
+ id: 'fal-ai/flux-general/inpainting',
1021
+ name: 'Flux General Inpainting',
1022
+ released: '2025-01',
1023
+ ...falImage,
1024
+ cost: { type: 'per-image', perImage: 0.075 },
1025
+ features: {
1026
+ editing: true,
1027
+ inpainting: true,
1028
+ aspectRatios: fluxAspectRatios,
1029
+ seed: true,
1030
+ multipleImages: false,
1031
+ },
1032
+ },
1033
+ {
1034
+ id: 'fal-ai/flux-general/image-to-image',
1035
+ name: 'Flux General Image-to-Image',
1036
+ released: '2025-01',
1037
+ ...falImage,
1038
+ cost: { type: 'per-image', perImage: 0.075 },
1039
+ features: {
1040
+ editing: true,
1041
+ inpainting: false,
1042
+ aspectRatios: fluxAspectRatios,
1043
+ seed: true,
1044
+ multipleImages: false,
1045
+ },
1046
+ },
1047
+ {
1048
+ id: 'fal-ai/flux-pro/v1.1',
1049
+ name: 'Flux Pro 1.1',
1050
+ released: '2024-10-01',
1051
+ ...falImage,
1052
+ cost: { type: 'per-image', perImage: 0.04 },
1053
+ features: {
1054
+ editing: false,
1055
+ inpainting: false,
1056
+ aspectRatios: fluxAspectRatios,
1057
+ seed: true,
1058
+ multipleImages: false,
1059
+ },
1060
+ },
1061
+ {
1062
+ id: 'fal-ai/flux-pro/v1.1-ultra',
1063
+ name: 'Flux Pro 1.1 Ultra',
1064
+ released: '2024-11-06',
1065
+ ...falImage,
1066
+ cost: { type: 'per-image', perImage: 0.06 },
1067
+ features: {
1068
+ editing: false,
1069
+ inpainting: false,
1070
+ aspectRatios: fluxAspectRatios,
1071
+ seed: true,
1072
+ multipleImages: false,
1073
+ },
1074
+ },
1075
+ {
1076
+ id: 'fal-ai/flux-pro/kontext',
1077
+ name: 'Flux Kontext',
1078
+ released: '2025-06-12',
1079
+ ...falImage,
1080
+ cost: { type: 'per-image', perImage: 0.04 },
1081
+ features: {
1082
+ editing: true,
1083
+ inpainting: false,
1084
+ aspectRatios: fluxAspectRatios,
1085
+ seed: true,
1086
+ multipleImages: false,
1087
+ },
1088
+ },
1089
+ {
1090
+ id: 'fal-ai/flux-pro/kontext/max',
1091
+ name: 'Flux Kontext Max',
1092
+ released: '2025-06-12',
1093
+ ...falImage,
1094
+ cost: { type: 'per-image', perImage: 0.08 },
1095
+ features: {
1096
+ editing: true,
1097
+ inpainting: false,
1098
+ aspectRatios: fluxAspectRatios,
1099
+ seed: true,
1100
+ multipleImages: false,
1101
+ },
1102
+ },
1103
+ {
1104
+ id: 'fal-ai/flux-lora',
1105
+ name: 'Flux LoRA',
1106
+ released: '2024-09',
1107
+ ...falImage,
1108
+ cost: { type: 'per-image', perImage: 0.035 },
1109
+ features: {
1110
+ editing: false,
1111
+ inpainting: false,
1112
+ aspectRatios: fluxAspectRatios,
1113
+ seed: true,
1114
+ multipleImages: true,
1115
+ },
1116
+ },
1117
+ {
1118
+ id: 'fal-ai/recraft/v3/text-to-image',
1119
+ name: 'Recraft v3',
1120
+ released: '2024-10-29',
1121
+ ...falImage,
1122
+ cost: { type: 'per-image', perImage: 0.04 },
1123
+ features: {
1124
+ editing: false,
1125
+ inpainting: false,
1126
+ aspectRatios: fluxAspectRatios,
1127
+ seed: true,
1128
+ multipleImages: false,
1129
+ },
1130
+ },
1131
+ {
1132
+ id: 'fal-ai/recraft/v3/image-to-image',
1133
+ name: 'Recraft v3 Image-to-Image',
1134
+ released: '2024-10-29',
1135
+ ...falImage,
1136
+ cost: { type: 'per-image', perImage: 0.04 },
1137
+ features: {
1138
+ editing: true,
1139
+ inpainting: false,
1140
+ aspectRatios: fluxAspectRatios,
1141
+ seed: true,
1142
+ multipleImages: false,
1143
+ },
1144
+ },
1145
+ {
1146
+ id: 'fal-ai/ideogram/character',
1147
+ name: 'Ideogram Character',
1148
+ released: '2025-03',
1149
+ ...falImage,
1150
+ cost: { type: 'per-image', perImage: 0.10 },
1151
+ features: {
1152
+ editing: true,
1153
+ inpainting: true,
1154
+ aspectRatios: fluxAspectRatios,
1155
+ seed: true,
1156
+ multipleImages: false,
1157
+ },
1158
+ },
1159
+ {
1160
+ id: 'fal-ai/imagen4/preview',
1161
+ name: 'Imagen 4 (Fal)',
1162
+ released: '2025-08-15',
1163
+ ...falImage,
1164
+ cost: { type: 'per-image', perImage: 0.04 },
1165
+ features: {
1166
+ editing: false,
1167
+ inpainting: false,
1168
+ aspectRatios: ['1:1', '3:4', '4:3', '9:16', '16:9'],
1169
+ seed: true,
1170
+ multipleImages: false,
1171
+ },
1172
+ },
1173
+ {
1174
+ id: 'fal-ai/luma-photon',
1175
+ name: 'Luma Photon (Fal)',
1176
+ released: '2024-12-10',
1177
+ ...falImage,
1178
+ cost: { type: 'per-image', perImage: 0.019 },
1179
+ features: {
1180
+ editing: false,
1181
+ inpainting: false,
1182
+ aspectRatios: fluxAspectRatios,
1183
+ seed: false,
1184
+ multipleImages: false,
1185
+ },
1186
+ },
1187
+ {
1188
+ id: 'fal-ai/luma-photon/flash',
1189
+ name: 'Luma Photon Flash (Fal)',
1190
+ released: '2024-12-10',
1191
+ ...falImage,
1192
+ cost: { type: 'per-image', perImage: 0.005 },
1193
+ features: {
1194
+ editing: false,
1195
+ inpainting: false,
1196
+ aspectRatios: fluxAspectRatios,
1197
+ seed: false,
1198
+ multipleImages: false,
1199
+ },
1200
+ },
1201
+ {
1202
+ id: 'fal-ai/omnigen-v2',
1203
+ name: 'OmniGen v2',
1204
+ released: '2025-06',
1205
+ ...falImage,
1206
+ cost: { type: 'per-image', perImage: 0.03 },
1207
+ features: {
1208
+ editing: true,
1209
+ inpainting: false,
1210
+ aspectRatios: fluxAspectRatios,
1211
+ seed: true,
1212
+ multipleImages: false,
1213
+ },
1214
+ },
1215
+ {
1216
+ id: 'fal-ai/qwen-image',
1217
+ name: 'Qwen Image',
1218
+ released: '2025-06',
1219
+ ...falImage,
1220
+ cost: { type: 'per-image', perImage: 0.03 },
1221
+ features: {
1222
+ editing: false,
1223
+ inpainting: false,
1224
+ aspectRatios: fluxAspectRatios,
1225
+ seed: true,
1226
+ multipleImages: false,
1227
+ },
1228
+ },
1229
+ ];
1230
+ // ─── video catalog ───────────────────────────────────────────────────────────
1231
+ const commonVideoRatios = ['16:9', '9:16', '1:1', '4:3', '3:4'];
1232
+ export const VIDEO_CATALOG = [
1233
+ {
1234
+ id: 'veo-3.1-generate-001',
1235
+ name: 'Veo 3.1',
1236
+ provider: 'google',
1237
+ strategy: 'video',
1238
+ released: '2026-01',
1239
+ cost: {
1240
+ type: 'per-video-second',
1241
+ defaultDurationSec: 8,
1242
+ tiers: [
1243
+ { resolution: '720p', audio: false, costPerSecond: 0.2 },
1244
+ { resolution: '720p', audio: true, costPerSecond: 0.4 },
1245
+ { resolution: '1080p', audio: false, costPerSecond: 0.2 },
1246
+ { resolution: '1080p', audio: true, costPerSecond: 0.4 },
1247
+ { resolution: '4k', audio: false, costPerSecond: 0.4 },
1248
+ { resolution: '4k', audio: true, costPerSecond: 0.6 },
1249
+ ],
1250
+ },
1251
+ features: {
1252
+ textToVideo: true,
1253
+ imageToVideo: false,
1254
+ capabilities: ['t2v'],
1255
+ aspectRatios: ['16:9', '9:16'],
1256
+ resolutions: ['720p', '1080p', '4k'],
1257
+ durationRangeSec: { min: 4, max: 8 },
1258
+ seed: true,
1259
+ multipleVideos: true,
1260
+ },
1261
+ },
1262
+ {
1263
+ id: 'veo-3.1-fast-generate-001',
1264
+ name: 'Veo 3.1 Fast',
1265
+ provider: 'google',
1266
+ strategy: 'video',
1267
+ released: '2026-01',
1268
+ cost: {
1269
+ type: 'per-video-second',
1270
+ defaultDurationSec: 8,
1271
+ tiers: [
1272
+ { resolution: '720p', audio: false, costPerSecond: 0.1 },
1273
+ { resolution: '720p', audio: true, costPerSecond: 0.15 },
1274
+ { resolution: '1080p', audio: false, costPerSecond: 0.1 },
1275
+ { resolution: '1080p', audio: true, costPerSecond: 0.15 },
1276
+ { resolution: '4k', audio: false, costPerSecond: 0.3 },
1277
+ { resolution: '4k', audio: true, costPerSecond: 0.35 },
1278
+ ],
1279
+ },
1280
+ features: {
1281
+ textToVideo: true,
1282
+ imageToVideo: false,
1283
+ capabilities: ['t2v'],
1284
+ aspectRatios: ['16:9', '9:16'],
1285
+ resolutions: ['720p', '1080p', '4k'],
1286
+ durationRangeSec: { min: 4, max: 8 },
1287
+ seed: true,
1288
+ multipleVideos: true,
1289
+ },
1290
+ },
1291
+ {
1292
+ id: 'veo-3.0-generate-001',
1293
+ name: 'Veo 3.0',
1294
+ provider: 'google',
1295
+ strategy: 'video',
1296
+ released: '2025-12',
1297
+ cost: {
1298
+ type: 'per-video-second',
1299
+ defaultDurationSec: 8,
1300
+ tiers: [
1301
+ { resolution: '720p', audio: false, costPerSecond: 0.2 },
1302
+ { resolution: '720p', audio: true, costPerSecond: 0.4 },
1303
+ { resolution: '1080p', audio: false, costPerSecond: 0.2 },
1304
+ { resolution: '1080p', audio: true, costPerSecond: 0.4 },
1305
+ ],
1306
+ },
1307
+ features: {
1308
+ textToVideo: true,
1309
+ imageToVideo: false,
1310
+ capabilities: ['t2v'],
1311
+ aspectRatios: ['16:9', '9:16'],
1312
+ resolutions: ['720p', '1080p'],
1313
+ durationRangeSec: { min: 4, max: 8 },
1314
+ seed: true,
1315
+ multipleVideos: true,
1316
+ },
1317
+ },
1318
+ {
1319
+ id: 'veo-3.0-fast-generate-001',
1320
+ name: 'Veo 3.0 Fast',
1321
+ provider: 'google',
1322
+ strategy: 'video',
1323
+ released: '2025-12',
1324
+ cost: {
1325
+ type: 'per-video-second',
1326
+ defaultDurationSec: 8,
1327
+ tiers: [
1328
+ { resolution: '720p', audio: false, costPerSecond: 0.1 },
1329
+ { resolution: '720p', audio: true, costPerSecond: 0.15 },
1330
+ { resolution: '1080p', audio: false, costPerSecond: 0.1 },
1331
+ { resolution: '1080p', audio: true, costPerSecond: 0.15 },
1332
+ ],
1333
+ },
1334
+ features: {
1335
+ textToVideo: true,
1336
+ imageToVideo: false,
1337
+ capabilities: ['t2v'],
1338
+ aspectRatios: ['16:9', '9:16'],
1339
+ resolutions: ['720p', '1080p'],
1340
+ durationRangeSec: { min: 4, max: 8 },
1341
+ seed: true,
1342
+ multipleVideos: true,
1343
+ },
1344
+ },
1345
+ // ── Vertex: Veo ──────────────────────────────────────────────────────
1346
+ {
1347
+ id: 'vertex/veo-3.1-generate-001',
1348
+ name: 'Veo 3.1 (Vertex)',
1349
+ provider: 'vertex',
1350
+ strategy: 'video',
1351
+ released: '2026-01',
1352
+ cost: {
1353
+ type: 'per-video-second',
1354
+ defaultDurationSec: 8,
1355
+ tiers: [
1356
+ { resolution: '720p', audio: false, costPerSecond: 0.2 },
1357
+ { resolution: '720p', audio: true, costPerSecond: 0.4 },
1358
+ { resolution: '1080p', audio: false, costPerSecond: 0.2 },
1359
+ { resolution: '1080p', audio: true, costPerSecond: 0.4 },
1360
+ { resolution: '4k', audio: false, costPerSecond: 0.4 },
1361
+ { resolution: '4k', audio: true, costPerSecond: 0.6 },
1362
+ ],
1363
+ },
1364
+ features: {
1365
+ textToVideo: true,
1366
+ imageToVideo: false,
1367
+ capabilities: ['t2v'],
1368
+ aspectRatios: ['16:9', '9:16'],
1369
+ resolutions: ['720p', '1080p', '4k'],
1370
+ durationRangeSec: { min: 4, max: 8 },
1371
+ seed: true,
1372
+ multipleVideos: true,
1373
+ },
1374
+ },
1375
+ {
1376
+ id: 'vertex/veo-3.1-fast-generate-001',
1377
+ name: 'Veo 3.1 Fast (Vertex)',
1378
+ provider: 'vertex',
1379
+ strategy: 'video',
1380
+ released: '2026-01',
1381
+ cost: {
1382
+ type: 'per-video-second',
1383
+ defaultDurationSec: 8,
1384
+ tiers: [
1385
+ { resolution: '720p', audio: false, costPerSecond: 0.1 },
1386
+ { resolution: '720p', audio: true, costPerSecond: 0.15 },
1387
+ { resolution: '1080p', audio: false, costPerSecond: 0.1 },
1388
+ { resolution: '1080p', audio: true, costPerSecond: 0.15 },
1389
+ { resolution: '4k', audio: false, costPerSecond: 0.3 },
1390
+ { resolution: '4k', audio: true, costPerSecond: 0.35 },
1391
+ ],
1392
+ },
1393
+ features: {
1394
+ textToVideo: true,
1395
+ imageToVideo: false,
1396
+ capabilities: ['t2v'],
1397
+ aspectRatios: ['16:9', '9:16'],
1398
+ resolutions: ['720p', '1080p', '4k'],
1399
+ durationRangeSec: { min: 4, max: 8 },
1400
+ seed: true,
1401
+ multipleVideos: true,
1402
+ },
1403
+ },
1404
+ {
1405
+ id: 'grok-imagine-video',
1406
+ name: 'Grok Imagine Video',
1407
+ provider: 'xai',
1408
+ strategy: 'video',
1409
+ released: '2026-03',
1410
+ cost: {
1411
+ type: 'per-video-second',
1412
+ defaultDurationSec: 5,
1413
+ tiers: [
1414
+ { resolution: '480p', costPerSecond: 0.05 },
1415
+ { resolution: '720p', costPerSecond: 0.07 },
1416
+ ],
1417
+ },
1418
+ features: {
1419
+ textToVideo: true,
1420
+ imageToVideo: true,
1421
+ capabilities: ['t2v', 'i2v', 'editing', 'extension', 'r2v'],
1422
+ aspectRatios: ['1:1', '16:9', '9:16', '4:3', '3:4', '3:2', '2:3'],
1423
+ resolutions: ['480p', '720p'],
1424
+ durationRangeSec: { min: 1, max: 15 },
1425
+ seed: false,
1426
+ multipleVideos: false,
1427
+ },
1428
+ providerOptions: xaiVideoProviderOptions,
1429
+ },
1430
+ {
1431
+ id: 'grok-imagine-video-1.5',
1432
+ name: 'Grok Imagine Video 1.5',
1433
+ provider: 'xai',
1434
+ strategy: 'video',
1435
+ released: '2026-05',
1436
+ cost: {
1437
+ type: 'per-video-second',
1438
+ defaultDurationSec: 5,
1439
+ tiers: [
1440
+ { resolution: '480p', costPerSecond: 0.08 },
1441
+ { resolution: '720p', costPerSecond: 0.14 },
1442
+ ],
1443
+ },
1444
+ features: {
1445
+ textToVideo: false,
1446
+ imageToVideo: true,
1447
+ capabilities: ['i2v'],
1448
+ aspectRatios: ['1:1', '16:9', '9:16', '4:3', '3:4', '3:2', '2:3'],
1449
+ resolutions: ['480p', '720p'],
1450
+ durationRangeSec: { min: 1, max: 15 },
1451
+ seed: false,
1452
+ multipleVideos: false,
1453
+ },
1454
+ providerOptions: xaiVideoProviderOptions,
1455
+ },
1456
+ // ── Kling (AI Gateway) ──────────────────────────────────────────────
1457
+ // Source: https://ai-gateway.vercel.sh/v1/models (klingai/* entries)
1458
+ {
1459
+ id: 'kling-v3.0-t2v',
1460
+ name: 'Kling v3.0 T2V',
1461
+ provider: 'klingai',
1462
+ strategy: 'video',
1463
+ released: '2026-02',
1464
+ cost: {
1465
+ type: 'per-video-second',
1466
+ defaultDurationSec: 5,
1467
+ tiers: [
1468
+ { mode: 'std', audio: false, costPerSecond: 0.168 },
1469
+ { mode: 'std', audio: true, costPerSecond: 0.308 },
1470
+ { mode: 'pro', audio: false, costPerSecond: 0.224 },
1471
+ { mode: 'pro', audio: true, costPerSecond: 0.392 },
1472
+ ],
1473
+ },
1474
+ features: {
1475
+ textToVideo: true,
1476
+ imageToVideo: false,
1477
+ capabilities: ['t2v'],
1478
+ aspectRatios: ['16:9', '9:16', '1:1'],
1479
+ resolutions: ['720p', '1080p', '4k'],
1480
+ durationRangeSec: { min: 3, max: 15 },
1481
+ seed: false,
1482
+ multipleVideos: false,
1483
+ },
1484
+ },
1485
+ {
1486
+ id: 'kling-v3.0-i2v',
1487
+ name: 'Kling v3.0 I2V',
1488
+ provider: 'klingai',
1489
+ strategy: 'video',
1490
+ released: '2026-02',
1491
+ cost: {
1492
+ type: 'per-video-second',
1493
+ defaultDurationSec: 5,
1494
+ tiers: [
1495
+ { mode: 'std', audio: false, costPerSecond: 0.168 },
1496
+ { mode: 'std', audio: true, costPerSecond: 0.308 },
1497
+ { mode: 'pro', audio: false, costPerSecond: 0.224 },
1498
+ { mode: 'pro', audio: true, costPerSecond: 0.392 },
1499
+ ],
1500
+ },
1501
+ features: {
1502
+ textToVideo: false,
1503
+ imageToVideo: true,
1504
+ capabilities: ['i2v', 'r2v'],
1505
+ aspectRatios: ['16:9', '9:16', '1:1'],
1506
+ resolutions: ['720p', '1080p', '4k'],
1507
+ durationRangeSec: { min: 3, max: 15 },
1508
+ seed: false,
1509
+ multipleVideos: false,
1510
+ },
1511
+ },
1512
+ {
1513
+ id: 'kling-v3.0-motion-control',
1514
+ name: 'Kling v3.0 Motion Control',
1515
+ provider: 'klingai',
1516
+ strategy: 'video',
1517
+ released: '2026-03',
1518
+ cost: {
1519
+ type: 'per-video-second',
1520
+ defaultDurationSec: 5,
1521
+ tiers: [
1522
+ { mode: 'std', costPerSecond: 0.126 },
1523
+ { mode: 'pro', costPerSecond: 0.168 },
1524
+ ],
1525
+ },
1526
+ features: {
1527
+ textToVideo: true,
1528
+ imageToVideo: false,
1529
+ capabilities: ['t2v', 'motion-control'],
1530
+ aspectRatios: ['16:9', '9:16', '1:1'],
1531
+ seed: false,
1532
+ multipleVideos: false,
1533
+ },
1534
+ },
1535
+ {
1536
+ id: 'kling-v2.6-t2v',
1537
+ name: 'Kling v2.6 T2V',
1538
+ provider: 'klingai',
1539
+ strategy: 'video',
1540
+ released: '2025-12',
1541
+ cost: {
1542
+ type: 'per-video-second',
1543
+ defaultDurationSec: 5,
1544
+ tiers: [
1545
+ { mode: 'std', costPerSecond: 0.042 },
1546
+ { mode: 'pro', audio: false, costPerSecond: 0.07 },
1547
+ { mode: 'pro', audio: true, costPerSecond: 0.14 },
1548
+ ],
1549
+ },
1550
+ features: {
1551
+ textToVideo: true,
1552
+ imageToVideo: false,
1553
+ capabilities: ['t2v'],
1554
+ aspectRatios: commonVideoRatios,
1555
+ durationRangeSec: { min: 5, max: 10 },
1556
+ seed: false,
1557
+ multipleVideos: false,
1558
+ },
1559
+ },
1560
+ {
1561
+ id: 'kling-v2.6-i2v',
1562
+ name: 'Kling v2.6 I2V',
1563
+ provider: 'klingai',
1564
+ strategy: 'video',
1565
+ released: '2025-12',
1566
+ cost: {
1567
+ type: 'per-video-second',
1568
+ defaultDurationSec: 5,
1569
+ tiers: [
1570
+ { mode: 'std', costPerSecond: 0.042 },
1571
+ { mode: 'pro', audio: false, costPerSecond: 0.07 },
1572
+ { mode: 'pro', audio: true, costPerSecond: 0.14 },
1573
+ ],
1574
+ },
1575
+ features: {
1576
+ textToVideo: false,
1577
+ imageToVideo: true,
1578
+ capabilities: ['i2v'],
1579
+ aspectRatios: ['16:9', '9:16', '1:1'],
1580
+ resolutions: ['720p', '1080p'],
1581
+ durationRangeSec: { min: 5, max: 10 },
1582
+ seed: false,
1583
+ multipleVideos: false,
1584
+ },
1585
+ },
1586
+ {
1587
+ id: 'kling-v2.6-motion-control',
1588
+ name: 'Kling v2.6 Motion Control',
1589
+ provider: 'klingai',
1590
+ strategy: 'video',
1591
+ released: '2025-12',
1592
+ cost: {
1593
+ type: 'per-video-second',
1594
+ defaultDurationSec: 5,
1595
+ tiers: [
1596
+ { mode: 'std', costPerSecond: 0.07 },
1597
+ { mode: 'pro', costPerSecond: 0.112 },
1598
+ ],
1599
+ },
1600
+ features: {
1601
+ textToVideo: true,
1602
+ imageToVideo: false,
1603
+ capabilities: ['t2v', 'motion-control'],
1604
+ aspectRatios: commonVideoRatios,
1605
+ seed: false,
1606
+ multipleVideos: false,
1607
+ },
1608
+ },
1609
+ {
1610
+ id: 'kling-v2.5-turbo-t2v',
1611
+ name: 'Kling v2.5 Turbo T2V',
1612
+ provider: 'klingai',
1613
+ strategy: 'video',
1614
+ released: '2025-09',
1615
+ cost: {
1616
+ type: 'per-video-second',
1617
+ defaultDurationSec: 5,
1618
+ tiers: [
1619
+ { mode: 'std', costPerSecond: 0.042 },
1620
+ { mode: 'pro', costPerSecond: 0.07 },
1621
+ ],
1622
+ },
1623
+ features: {
1624
+ textToVideo: true,
1625
+ imageToVideo: false,
1626
+ capabilities: ['t2v'],
1627
+ aspectRatios: commonVideoRatios,
1628
+ seed: false,
1629
+ multipleVideos: false,
1630
+ },
1631
+ },
1632
+ {
1633
+ id: 'kling-v2.5-turbo-i2v',
1634
+ name: 'Kling v2.5 Turbo I2V',
1635
+ provider: 'klingai',
1636
+ strategy: 'video',
1637
+ released: '2025-09',
1638
+ cost: {
1639
+ type: 'per-video-second',
1640
+ defaultDurationSec: 5,
1641
+ tiers: [
1642
+ { mode: 'std', costPerSecond: 0.042 },
1643
+ { mode: 'pro', costPerSecond: 0.07 },
1644
+ ],
1645
+ },
1646
+ features: {
1647
+ textToVideo: false,
1648
+ imageToVideo: true,
1649
+ capabilities: ['i2v'],
1650
+ aspectRatios: commonVideoRatios,
1651
+ seed: false,
1652
+ multipleVideos: false,
1653
+ },
1654
+ },
1655
+ // ── Alibaba Wan (AI Gateway) ──────────────────────────────────────────
1656
+ {
1657
+ id: 'wan-v2.6-t2v',
1658
+ name: 'Wan v2.6 T2V',
1659
+ provider: 'alibaba',
1660
+ strategy: 'video',
1661
+ released: '2026-01',
1662
+ cost: {
1663
+ type: 'per-video-second',
1664
+ defaultDurationSec: 5,
1665
+ tiers: [
1666
+ { resolution: '720p', costPerSecond: 0.1 },
1667
+ { resolution: '1080p', costPerSecond: 0.15 },
1668
+ ],
1669
+ },
1670
+ features: {
1671
+ textToVideo: true,
1672
+ imageToVideo: false,
1673
+ capabilities: ['t2v'],
1674
+ resolutions: ['720p', '1080p'],
1675
+ durationRangeSec: { min: 2, max: 15 },
1676
+ seed: false,
1677
+ multipleVideos: false,
1678
+ },
1679
+ },
1680
+ {
1681
+ id: 'wan-v2.6-i2v',
1682
+ name: 'Wan v2.6 I2V',
1683
+ provider: 'alibaba',
1684
+ strategy: 'video',
1685
+ released: '2025-12',
1686
+ cost: {
1687
+ type: 'per-video-second',
1688
+ defaultDurationSec: 5,
1689
+ tiers: [
1690
+ { resolution: '720p', costPerSecond: 0.1 },
1691
+ { resolution: '1080p', costPerSecond: 0.15 },
1692
+ ],
1693
+ },
1694
+ features: {
1695
+ textToVideo: false,
1696
+ imageToVideo: true,
1697
+ capabilities: ['i2v'],
1698
+ aspectRatios: commonVideoRatios,
1699
+ resolutions: ['720p', '1080p'],
1700
+ durationRangeSec: { min: 2, max: 15 },
1701
+ seed: false,
1702
+ multipleVideos: false,
1703
+ },
1704
+ },
1705
+ {
1706
+ id: 'wan-v2.6-i2v-flash',
1707
+ name: 'Wan v2.6 I2V Flash',
1708
+ provider: 'alibaba',
1709
+ strategy: 'video',
1710
+ released: '2025-12',
1711
+ cost: {
1712
+ type: 'per-video-second',
1713
+ defaultDurationSec: 5,
1714
+ tiers: [
1715
+ { resolution: '720p', costPerSecond: 0.05 },
1716
+ { resolution: '1080p', costPerSecond: 0.075 },
1717
+ ],
1718
+ },
1719
+ features: {
1720
+ textToVideo: false,
1721
+ imageToVideo: true,
1722
+ capabilities: ['i2v'],
1723
+ aspectRatios: commonVideoRatios,
1724
+ resolutions: ['720p', '1080p'],
1725
+ durationRangeSec: { min: 2, max: 15 },
1726
+ seed: false,
1727
+ multipleVideos: false,
1728
+ },
1729
+ },
1730
+ {
1731
+ id: 'wan-v2.6-r2v',
1732
+ name: 'Wan v2.6 R2V',
1733
+ provider: 'alibaba',
1734
+ strategy: 'video',
1735
+ released: '2025-12',
1736
+ cost: {
1737
+ type: 'per-video-second',
1738
+ defaultDurationSec: 5,
1739
+ tiers: [
1740
+ { resolution: '720p', costPerSecond: 0.1 },
1741
+ { resolution: '1080p', costPerSecond: 0.15 },
1742
+ ],
1743
+ },
1744
+ features: {
1745
+ textToVideo: false,
1746
+ imageToVideo: false,
1747
+ capabilities: ['r2v'],
1748
+ aspectRatios: commonVideoRatios,
1749
+ resolutions: ['720p', '1080p'],
1750
+ durationRangeSec: { min: 2, max: 10 },
1751
+ seed: false,
1752
+ multipleVideos: false,
1753
+ },
1754
+ },
1755
+ {
1756
+ id: 'wan-v2.6-r2v-flash',
1757
+ name: 'Wan v2.6 R2V Flash',
1758
+ provider: 'alibaba',
1759
+ strategy: 'video',
1760
+ released: '2025-12',
1761
+ cost: {
1762
+ type: 'per-video-second',
1763
+ defaultDurationSec: 5,
1764
+ tiers: [
1765
+ { resolution: '720p', costPerSecond: 0.05 },
1766
+ { resolution: '1080p', costPerSecond: 0.075 },
1767
+ ],
1768
+ },
1769
+ features: {
1770
+ textToVideo: false,
1771
+ imageToVideo: false,
1772
+ capabilities: ['r2v'],
1773
+ aspectRatios: commonVideoRatios,
1774
+ resolutions: ['720p', '1080p'],
1775
+ durationRangeSec: { min: 2, max: 10 },
1776
+ seed: false,
1777
+ multipleVideos: false,
1778
+ },
1779
+ },
1780
+ {
1781
+ id: 'wan-v2.5-t2v-preview',
1782
+ name: 'Wan v2.5 T2V Preview',
1783
+ provider: 'alibaba',
1784
+ strategy: 'video',
1785
+ released: '2025-09',
1786
+ cost: {
1787
+ type: 'per-video-second',
1788
+ defaultDurationSec: 5,
1789
+ tiers: [
1790
+ { resolution: '480p', costPerSecond: 0.05 },
1791
+ { resolution: '720p', costPerSecond: 0.1 },
1792
+ { resolution: '1080p', costPerSecond: 0.15 },
1793
+ ],
1794
+ },
1795
+ features: {
1796
+ textToVideo: true,
1797
+ imageToVideo: false,
1798
+ capabilities: ['t2v'],
1799
+ resolutions: ['480p', '720p', '1080p'],
1800
+ seed: false,
1801
+ multipleVideos: false,
1802
+ },
1803
+ },
1804
+ // ── ByteDance Seedance (AI Gateway) ─────────────────────────────────
1805
+ // Source: https://ai-gateway.vercel.sh/v1/models/bytedance/seedance-2.0/endpoints
1806
+ // Pricing from capabilities.pricing.variants (per-second, resolution-based).
1807
+ // Seedance 2.0 uses C-Dense unified multimodal architecture: text, image, audio, video inputs.
1808
+ // Reference images for r2v must be passed as URLs (max 9 images, 300-6000px, max 30MB each).
1809
+ // Reference images in prompts use @Image1, @Image2, etc. syntax.
1810
+ {
1811
+ id: 'seedance-2.0',
1812
+ name: 'Seedance 2.0',
1813
+ description: 'ByteDance C-Dense multimodal video model. Supports text, image, audio, and video inputs. ' +
1814
+ 'Native audio generation with lip-sync. Up to 720p, 4-15s.',
1815
+ provider: 'bytedance',
1816
+ strategy: 'video',
1817
+ released: '2026-04',
1818
+ cost: {
1819
+ type: 'per-video-second',
1820
+ defaultDurationSec: 8,
1821
+ tiers: [
1822
+ { resolution: '480p', hasVideoInput: false, costPerSecond: 0.07 },
1823
+ { resolution: '480p', hasVideoInput: true, costPerSecond: 0.12 },
1824
+ { resolution: '720p', hasVideoInput: false, costPerSecond: 0.15 },
1825
+ { resolution: '720p', hasVideoInput: true, costPerSecond: 0.26 },
1826
+ ],
1827
+ },
1828
+ features: {
1829
+ textToVideo: true,
1830
+ imageToVideo: true,
1831
+ capabilities: ['t2v', 'i2v', 'r2v'],
1832
+ aspectRatios: ['16:9', '4:3', '1:1', '3:4', '9:16', '21:9'],
1833
+ resolutions: ['480p', '720p'],
1834
+ durationRangeSec: { min: 4, max: 15 },
1835
+ seed: false,
1836
+ multipleVideos: false,
1837
+ },
1838
+ providerOptions: bytedanceVideoProviderOptions,
1839
+ },
1840
+ {
1841
+ id: 'seedance-2.0-fast',
1842
+ name: 'Seedance 2.0 Fast',
1843
+ description: 'Faster variant of Seedance 2.0 with same capabilities but lower latency and cost.',
1844
+ provider: 'bytedance',
1845
+ strategy: 'video',
1846
+ released: '2026-04',
1847
+ cost: {
1848
+ type: 'per-video-second',
1849
+ defaultDurationSec: 8,
1850
+ tiers: [
1851
+ { resolution: '480p', hasVideoInput: false, costPerSecond: 0.05 },
1852
+ { resolution: '480p', hasVideoInput: true, costPerSecond: 0.09 },
1853
+ { resolution: '720p', hasVideoInput: false, costPerSecond: 0.12 },
1854
+ { resolution: '720p', hasVideoInput: true, costPerSecond: 0.20 },
1855
+ ],
1856
+ },
1857
+ providerOptions: bytedanceVideoProviderOptions,
1858
+ features: {
1859
+ textToVideo: true,
1860
+ imageToVideo: true,
1861
+ capabilities: ['t2v', 'i2v', 'r2v'],
1862
+ aspectRatios: ['16:9', '4:3', '1:1', '3:4', '9:16', '21:9'],
1863
+ resolutions: ['480p', '720p'],
1864
+ durationRangeSec: { min: 4, max: 15 },
1865
+ seed: false,
1866
+ multipleVideos: false,
1867
+ },
1868
+ },
1869
+ {
1870
+ id: 'seedance-v1.5-pro',
1871
+ name: 'Seedance v1.5 Pro',
1872
+ description: 'V2A native audio-video joint generation. Synchronized audio output for professional video creation.',
1873
+ provider: 'bytedance',
1874
+ strategy: 'video',
1875
+ released: '2025-12',
1876
+ cost: {
1877
+ type: 'per-video-second',
1878
+ defaultDurationSec: 5,
1879
+ tiers: [
1880
+ { resolution: '480p', audio: false, costPerSecond: 0.0121 },
1881
+ { resolution: '480p', audio: true, costPerSecond: 0.0241 },
1882
+ { resolution: '720p', audio: false, costPerSecond: 0.0259 },
1883
+ { resolution: '720p', audio: true, costPerSecond: 0.0518 },
1884
+ { resolution: '1080p', audio: false, costPerSecond: 0.0583 },
1885
+ { resolution: '1080p', audio: true, costPerSecond: 0.1166 },
1886
+ ],
1887
+ },
1888
+ features: {
1889
+ textToVideo: true,
1890
+ imageToVideo: true,
1891
+ capabilities: ['t2v', 'i2v'],
1892
+ aspectRatios: commonVideoRatios,
1893
+ resolutions: ['480p', '720p', '1080p'],
1894
+ seed: false,
1895
+ multipleVideos: false,
1896
+ },
1897
+ },
1898
+ {
1899
+ id: 'seedance-v1.0-pro',
1900
+ name: 'Seedance v1.0 Pro',
1901
+ description: 'Multi-shot storytelling model. Smooth, detailed, cinematic 1080p HD videos.',
1902
+ provider: 'bytedance',
1903
+ strategy: 'video',
1904
+ released: '2025-06',
1905
+ cost: {
1906
+ type: 'per-video-second',
1907
+ defaultDurationSec: 5,
1908
+ tiers: [
1909
+ { resolution: '480p', costPerSecond: 0.0243 },
1910
+ { resolution: '720p', costPerSecond: 0.0515 },
1911
+ { resolution: '1080p', costPerSecond: 0.1224 },
1912
+ ],
1913
+ },
1914
+ features: {
1915
+ textToVideo: true,
1916
+ imageToVideo: true,
1917
+ capabilities: ['t2v', 'i2v'],
1918
+ aspectRatios: commonVideoRatios,
1919
+ resolutions: ['480p', '720p', '1080p'],
1920
+ seed: false,
1921
+ multipleVideos: false,
1922
+ },
1923
+ },
1924
+ {
1925
+ id: 'seedance-v1.0-pro-fast',
1926
+ name: 'Seedance v1.0 Pro Fast',
1927
+ description: 'Cost-efficient fast variant of Seedance 1.0 Pro.',
1928
+ provider: 'bytedance',
1929
+ strategy: 'video',
1930
+ released: '2025-10',
1931
+ cost: {
1932
+ type: 'per-video-second',
1933
+ defaultDurationSec: 5,
1934
+ tiers: [
1935
+ { resolution: '480p', costPerSecond: 0.0097 },
1936
+ { resolution: '720p', costPerSecond: 0.0206 },
1937
+ { resolution: '1080p', costPerSecond: 0.049 },
1938
+ ],
1939
+ },
1940
+ features: {
1941
+ textToVideo: true,
1942
+ imageToVideo: true,
1943
+ capabilities: ['t2v', 'i2v'],
1944
+ aspectRatios: commonVideoRatios,
1945
+ resolutions: ['480p', '720p', '1080p'],
1946
+ seed: false,
1947
+ multipleVideos: false,
1948
+ },
1949
+ },
1950
+ {
1951
+ id: 'seedance-v1.0-lite-t2v',
1952
+ name: 'Seedance v1.0 Lite T2V',
1953
+ description: 'Lightweight text-to-video model. Balances quality and speed with strong semantic understanding.',
1954
+ provider: 'bytedance',
1955
+ strategy: 'video',
1956
+ released: '2025-06',
1957
+ cost: {
1958
+ type: 'per-video-second',
1959
+ defaultDurationSec: 5,
1960
+ tiers: [
1961
+ { resolution: '480p', costPerSecond: 0.0175 },
1962
+ { resolution: '720p', costPerSecond: 0.0371 },
1963
+ { resolution: '1080p', costPerSecond: 0.0881 },
1964
+ ],
1965
+ },
1966
+ features: {
1967
+ textToVideo: true,
1968
+ imageToVideo: false,
1969
+ capabilities: ['t2v'],
1970
+ aspectRatios: commonVideoRatios,
1971
+ resolutions: ['480p', '720p', '1080p'],
1972
+ durationRangeSec: { min: 3, max: 12 },
1973
+ seed: false,
1974
+ multipleVideos: false,
1975
+ },
1976
+ },
1977
+ {
1978
+ id: 'seedance-v1.0-lite-i2v',
1979
+ name: 'Seedance v1.0 Lite I2V',
1980
+ description: 'Lightweight image-to-video model. Generates video from image/text with reference image support.',
1981
+ provider: 'bytedance',
1982
+ strategy: 'video',
1983
+ released: '2025-06',
1984
+ cost: {
1985
+ type: 'per-video-second',
1986
+ defaultDurationSec: 5,
1987
+ tiers: [
1988
+ { resolution: '480p', costPerSecond: 0.0175 },
1989
+ { resolution: '720p', costPerSecond: 0.0371 },
1990
+ { resolution: '1080p', costPerSecond: 0.0881 },
1991
+ ],
1992
+ },
1993
+ features: {
1994
+ textToVideo: false,
1995
+ imageToVideo: true,
1996
+ capabilities: ['i2v', 'r2v'],
1997
+ aspectRatios: commonVideoRatios,
1998
+ resolutions: ['480p', '720p', '1080p'],
1999
+ durationRangeSec: { min: 3, max: 12 },
2000
+ seed: false,
2001
+ multipleVideos: false,
2002
+ },
2003
+ providerOptions: bytedanceVideoProviderOptions,
2004
+ },
2005
+ // ── Fal video models ─────────────────────────────────────────────────
2006
+ {
2007
+ id: 'luma-ray-2',
2008
+ name: 'Luma Ray 2 (Fal)',
2009
+ provider: 'fal',
2010
+ strategy: 'video',
2011
+ released: '2025-11',
2012
+ cost: { type: 'unknown' },
2013
+ features: {
2014
+ textToVideo: true,
2015
+ imageToVideo: true,
2016
+ capabilities: ['t2v', 'i2v'],
2017
+ aspectRatios: commonVideoRatios,
2018
+ seed: true,
2019
+ multipleVideos: false,
2020
+ },
2021
+ providerOptions: falVideoProviderOptions,
2022
+ },
2023
+ {
2024
+ id: 'minimax-video',
2025
+ name: 'MiniMax Video (Fal)',
2026
+ provider: 'fal',
2027
+ strategy: 'video',
2028
+ released: '2025-10',
2029
+ cost: { type: 'unknown' },
2030
+ features: {
2031
+ textToVideo: true,
2032
+ imageToVideo: false,
2033
+ capabilities: ['t2v'],
2034
+ aspectRatios: commonVideoRatios,
2035
+ seed: false,
2036
+ multipleVideos: false,
2037
+ },
2038
+ providerOptions: falVideoProviderOptions,
2039
+ },
2040
+ {
2041
+ id: 'hunyuan-video',
2042
+ name: 'Hunyuan Video (Fal)',
2043
+ provider: 'fal',
2044
+ strategy: 'video',
2045
+ released: '2025-09',
2046
+ cost: { type: 'unknown' },
2047
+ features: {
2048
+ textToVideo: true,
2049
+ imageToVideo: true,
2050
+ capabilities: ['t2v', 'i2v'],
2051
+ aspectRatios: commonVideoRatios,
2052
+ seed: true,
2053
+ multipleVideos: false,
2054
+ },
2055
+ providerOptions: falVideoProviderOptions,
2056
+ },
2057
+ ];
2058
+ // ─── provider option helpers ─────────────────────────────────────────────────
2059
+ /**
2060
+ * Collect the valid values for a CLI flag across all providers in the catalog.
2061
+ * Returns a map of provider name → enum values array. Only includes providers
2062
+ * that declare values for the given flag. Used by cli.ts to auto-generate
2063
+ * flag descriptions like "xAI: low, medium, high. OpenAI: auto, low, medium, high".
2064
+ */
2065
+ export function getProviderValuesForFlag(flag, catalogs = [CATALOG, VIDEO_CATALOG]) {
2066
+ const result = new Map();
2067
+ for (const catalog of catalogs) {
2068
+ for (const entry of catalog) {
2069
+ if (!entry.providerOptions)
2070
+ continue;
2071
+ for (const opt of entry.providerOptions) {
2072
+ if (opt.flag === flag && opt.values?.length && !result.has(entry.provider)) {
2073
+ result.set(entry.provider, opt.values);
2074
+ }
2075
+ }
2076
+ }
2077
+ }
2078
+ return result;
2079
+ }
2080
+ /**
2081
+ * Build a human-readable description suffix listing provider-specific values
2082
+ * for a flag. Includes default values when available.
2083
+ * Example: "xai: low, medium, high (default: medium). openai: auto, low, medium, high (default: auto)"
2084
+ */
2085
+ export function describeProviderValues(flag, catalogs) {
2086
+ const allCatalogs = catalogs ?? [CATALOG, VIDEO_CATALOG];
2087
+ // collect {provider → {values, defaultValue}} for this flag
2088
+ const providerInfo = new Map();
2089
+ for (const catalog of allCatalogs) {
2090
+ for (const entry of catalog) {
2091
+ if (!entry.providerOptions)
2092
+ continue;
2093
+ for (const opt of entry.providerOptions) {
2094
+ if (opt.flag === flag && opt.values?.length && !providerInfo.has(entry.provider)) {
2095
+ providerInfo.set(entry.provider, {
2096
+ values: opt.values,
2097
+ defaultValue: opt.defaultValue,
2098
+ });
2099
+ }
2100
+ }
2101
+ }
2102
+ }
2103
+ if (providerInfo.size === 0)
2104
+ return '';
2105
+ return [...providerInfo.entries()]
2106
+ .map(([provider, info]) => {
2107
+ const vals = info.values.join(', ');
2108
+ const def = info.defaultValue ? ` (default: ${info.defaultValue})` : '';
2109
+ return `${provider}: ${vals}${def}`;
2110
+ })
2111
+ .join('. ');
2112
+ }
2113
+ /**
2114
+ * Find the ProviderOption definition for a given flag and provider from a model entry.
2115
+ * Returns undefined if the model doesn't support this flag.
2116
+ */
2117
+ export function findProviderOption(entry, flag) {
2118
+ return entry.providerOptions?.find((opt) => opt.flag === flag);
2119
+ }
2120
+ // ─── lookup helpers ──────────────────────────────────────────────────────────
2121
+ const imageCatalogIndex = new Map(CATALOG.map((m) => [m.id, m]));
2122
+ const videoCatalogIndex = new Map(VIDEO_CATALOG.map((m) => [m.id, m]));
2123
+ export function findModel(id) {
2124
+ return imageCatalogIndex.get(id);
2125
+ }
2126
+ export function findVideoModel(id) {
2127
+ return videoCatalogIndex.get(id);
2128
+ }
2129
+ export function findAnyModel(id) {
2130
+ return imageCatalogIndex.get(id) ?? videoCatalogIndex.get(id);
2131
+ }
2132
+ // Re-export speech catalog for convenience in CLI code that needs all catalogs.
2133
+ export { SPEECH_CATALOG, findSpeechModel } from './speech-catalog.js';
2134
+ // Re-export transcription catalog.
2135
+ export { TRANSCRIPTION_CATALOG, findTranscriptionModel } from './transcription-catalog.js';