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
package/src/models.ts DELETED
@@ -1,309 +0,0 @@
1
- // Model registry for egaki.
2
- // Maps model IDs to their provider and generation strategy. The enum of
3
- // supported models is derived from this registry so there's a single source
4
- // of truth for both CLI validation and runtime provider resolution.
5
- //
6
- // Two generation strategies:
7
- // - 'image': uses provider.image(modelId) + generateImage()
8
- // - 'text': uses provider(modelId) + generateText() with responseModalities
9
- //
10
- // Provider resolution priority:
11
- // 1. Provider-specific key (e.g. GOOGLE_GENERATIVE_AI_API_KEY) → direct SDK
12
- // 2. Egaki API key (EGAKI_API_KEY) → route through egaki gateway
13
- // 3. No key → error with subscription recommendation
14
- //
15
- // Model IDs are sourced from the TypeScript types exported by each @ai-sdk/*
16
- // package. To add new models, check the *ModelId types in each package's
17
- // dist/index.d.ts and add entries here.
18
- import type { ImageModel, LanguageModel } from 'ai'
19
- import pc from 'picocolors'
20
- import { PROVIDERS, EGAKI_GATEWAY_URL, shouldUseChatGptBackend } from './credentials.js'
21
- import { CATALOG, findModel } from './model-catalog.js'
22
- import type { ModelEntry } from './model-catalog.js'
23
- import { VIDEO_CATALOG, findVideoModel } from './video-model-catalog.js'
24
- import type { VideoModelEntry } from './video-model-catalog.js'
25
-
26
- export type AnyModelEntry = ModelEntry | VideoModelEntry
27
- export type { ModelEntry, VideoModelEntry }
28
-
29
- export const IMAGE_MODELS = CATALOG.map((m) => m.id) as [string, ...string[]]
30
- export const VIDEO_MODELS = VIDEO_CATALOG.map((m) => m.id) as [string, ...string[]]
31
-
32
- /**
33
- * Strip provider prefix from a model ID (e.g. "vertex/imagen-4.0-generate-001" → "imagen-4.0-generate-001").
34
- * Provider SDKs expect bare model IDs, but the catalog uses prefixed IDs for routing.
35
- */
36
- function stripProviderPrefix(modelId: string): string {
37
- const slash = modelId.indexOf('/')
38
- if (slash === -1) return modelId
39
- return modelId.slice(slash + 1)
40
- }
41
-
42
- export const DEFAULT_MODEL = 'nano-banana-pro-preview'
43
- export const DEFAULT_VIDEO_MODEL = 'veo-3.1-fast-generate-001'
44
-
45
- export function getModelConfig(modelId: string): AnyModelEntry {
46
- const entry = findModel(modelId) ?? findVideoModel(modelId)
47
- if (!entry) {
48
- console.error(pc.red(`Unknown model: ${modelId}`))
49
- process.exit(1)
50
- }
51
- return entry
52
- }
53
-
54
- /**
55
- * Check if the egaki gateway API key is available (from env or stored credentials).
56
- */
57
- function hasEgakiKey(): boolean {
58
- const info = PROVIDERS['egaki']
59
- if (!info) return false
60
- return Boolean(process.env[info.envVar])
61
- }
62
-
63
- /**
64
- * Check if a direct provider key is available for the given provider.
65
- */
66
- function hasDirectProviderKey(providerName: string): boolean {
67
- const info = PROVIDERS[providerName]
68
- if (!info) return false
69
- return Boolean(process.env[info.envVar])
70
- }
71
-
72
- // Check that the provider's API key is available before making API calls.
73
- // Prints a user-friendly error with instructions on how to configure it.
74
- // Prioritizes egaki subscription over individual provider keys.
75
- export function ensureProviderKey(providerName: string): void {
76
- // If direct provider key exists, we're good
77
- if (hasDirectProviderKey(providerName)) return
78
-
79
- // Vertex models require a direct key — the upstream Vercel AI Gateway
80
- // does not support vertex/ routing, so egaki gateway can't proxy them.
81
- if (providerName === 'vertex') {
82
- console.error('')
83
- console.error(pc.red(pc.bold('Vertex models require a direct Google Cloud API key')))
84
- console.error('')
85
- console.error(` ${pc.cyan('egaki login --provider vertex --key <key>')}`)
86
- console.error('')
87
- console.error(pc.dim('Get a key at https://console.cloud.google.com/apis/credentials'))
88
- console.error(pc.dim('Egaki subscription does not cover Vertex routing yet.'))
89
- console.error('')
90
- process.exit(1)
91
- }
92
-
93
- // If egaki key exists, we'll route through the gateway
94
- if (hasEgakiKey()) return
95
-
96
- const info = PROVIDERS[providerName]
97
-
98
- console.error('')
99
- console.error(pc.red(pc.bold(`Missing API key for ${info?.label || providerName}`)))
100
- console.error('')
101
- console.error(` ${pc.bold('Recommended:')} Use Egaki subscription (all models, one key)`)
102
- console.error('')
103
- console.error(
104
- ` ${pc.cyan('egaki subscribe')} get started in 30 seconds`,
105
- )
106
- console.error('')
107
- console.error(` ${pc.dim('Or configure a provider key directly:')}`)
108
- console.error('')
109
- console.error(
110
- ` ${pc.cyan('egaki login')} interactive setup`,
111
- )
112
- if (info) {
113
- console.error(
114
- ` ${pc.cyan(`${info.envVar}=...`)} egaki image ... inline env var`,
115
- )
116
- console.error(
117
- ` ${pc.cyan(`egaki login --provider ${providerName} --key <key>`)}`,
118
- )
119
- console.error('')
120
- console.error(` ${pc.dim(info.hint)}`)
121
- }
122
- console.error('')
123
- process.exit(1)
124
- }
125
-
126
- /**
127
- * Create a gateway-backed image model using createGateway from the AI SDK.
128
- * The model ID is sent as provider/model format to the gateway.
129
- */
130
- async function createGatewayImageModel(modelId: string, provider: string): Promise<ImageModel> {
131
- const { createGateway } = await import('ai')
132
- const gateway = createGateway({
133
- apiKey: process.env['EGAKI_API_KEY']!,
134
- baseURL: EGAKI_GATEWAY_URL,
135
- })
136
- // Gateway expects provider/model format for routing.
137
- // For models that already have a prefix (e.g. vertex/imagen-4.0), strip it
138
- // and use the catalog provider. For bare IDs, prepend the provider.
139
- const bareId = stripProviderPrefix(modelId)
140
- const gatewayModelId = `${provider}/${bareId}`
141
- return gateway.image(gatewayModelId)
142
- }
143
-
144
- /**
145
- * Create a gateway-backed text model using createGateway from the AI SDK.
146
- */
147
- async function createGatewayTextModel(modelId: string, provider: string): Promise<LanguageModel> {
148
- const { createGateway } = await import('ai')
149
- const gateway = createGateway({
150
- apiKey: process.env['EGAKI_API_KEY']!,
151
- baseURL: EGAKI_GATEWAY_URL,
152
- })
153
- const bareId = stripProviderPrefix(modelId)
154
- const gatewayModelId = `${provider}/${bareId}`
155
- return gateway(gatewayModelId)
156
- }
157
-
158
- /**
159
- * Create a gateway-backed video model using createGateway from the AI SDK.
160
- */
161
- async function createGatewayVideoModel(modelId: string, provider: string) {
162
- const { createGateway } = await import('ai')
163
- const gateway = createGateway({
164
- apiKey: process.env['EGAKI_API_KEY']!,
165
- baseURL: EGAKI_GATEWAY_URL,
166
- })
167
- const bareId = stripProviderPrefix(modelId)
168
- const gatewayModelId = `${provider}/${bareId}`
169
- return gateway.video(gatewayModelId)
170
- }
171
-
172
- /**
173
- * ChatGPT OAuth image generation goes through the Codex backend instead of the
174
- * OpenAI Image API, so OpenAI image models need the custom responses path.
175
- */
176
- export function shouldUseResponsesApi(modelId: string): boolean {
177
- const config = findModel(modelId)
178
- if (!config) return false
179
- return config.provider === 'openai' && config.strategy === 'image' && shouldUseChatGptBackend()
180
- }
181
-
182
- // Lazily import the provider and create the right model instance.
183
- // This avoids loading all provider SDKs upfront — only the one needed
184
- // for the selected model gets imported.
185
- //
186
- // Priority: direct provider key > egaki gateway > error
187
- export async function createImageModel(modelId: string): Promise<ImageModel> {
188
- const config = getModelConfig(modelId)
189
- ensureProviderKey(config.provider)
190
-
191
- // If the user has a direct provider key, use the provider SDK directly
192
- if (hasDirectProviderKey(config.provider)) {
193
- switch (config.provider) {
194
- case 'google': {
195
- const { google } = await import('@ai-sdk/google')
196
- return google.image(modelId)
197
- }
198
- case 'vertex': {
199
- const { vertex } = await import('@ai-sdk/google-vertex')
200
- return vertex.image(stripProviderPrefix(modelId))
201
- }
202
- case 'openai': {
203
- const { openai } = await import('@ai-sdk/openai')
204
- return openai.image(modelId)
205
- }
206
- case 'replicate': {
207
- const { replicate } = await import('@ai-sdk/replicate')
208
- return replicate.image(modelId)
209
- }
210
- case 'fal': {
211
- const { fal } = await import('@ai-sdk/fal')
212
- return fal.image(modelId)
213
- }
214
- }
215
- }
216
-
217
- // Fall back to egaki gateway
218
- if (hasEgakiKey()) {
219
- return createGatewayImageModel(modelId, config.provider)
220
- }
221
-
222
- // Should not reach here — ensureProviderKey would have exited
223
- console.error(pc.red(`No API key available for provider: ${config.provider}`))
224
- process.exit(1)
225
- }
226
-
227
- export async function createTextModel(
228
- modelId: string,
229
- ): Promise<LanguageModel> {
230
- const config = getModelConfig(modelId)
231
- if (config.strategy !== 'text') {
232
- console.error(pc.red(`Model ${modelId} is not a text model`))
233
- process.exit(1)
234
- }
235
- ensureProviderKey(config.provider)
236
-
237
- // Direct provider key takes priority
238
- if (hasDirectProviderKey(config.provider)) {
239
- switch (config.provider) {
240
- case 'google': {
241
- const { google } = await import('@ai-sdk/google')
242
- return google(modelId)
243
- }
244
- case 'vertex': {
245
- const { vertex } = await import('@ai-sdk/google-vertex')
246
- return vertex(stripProviderPrefix(modelId))
247
- }
248
- default:
249
- // Only Google/Vertex support generateText with responseModalities for images
250
- console.error(
251
- pc.red(
252
- `Text+image generation is only supported for Google/Vertex models, got provider: ${config.provider}`,
253
- ),
254
- )
255
- process.exit(1)
256
- }
257
- }
258
-
259
- // Fall back to egaki gateway
260
- if (hasEgakiKey()) {
261
- return createGatewayTextModel(modelId, config.provider)
262
- }
263
-
264
- console.error(pc.red(`No API key available for provider: ${config.provider}`))
265
- process.exit(1)
266
- }
267
-
268
- export async function createVideoModel(modelId: string): Promise<any> {
269
- const config = getModelConfig(modelId)
270
- if (config.strategy !== 'video') {
271
- console.error(pc.red(`Model ${modelId} is not a video model`))
272
- process.exit(1)
273
- }
274
-
275
- ensureProviderKey(config.provider)
276
-
277
- // Direct provider key takes priority
278
- if (hasDirectProviderKey(config.provider)) {
279
- switch (config.provider) {
280
- case 'google': {
281
- const { google } = await import('@ai-sdk/google')
282
- return google.video(modelId)
283
- }
284
- case 'vertex': {
285
- const { vertex } = await import('@ai-sdk/google-vertex')
286
- return vertex.video(stripProviderPrefix(modelId))
287
- }
288
- case 'fal': {
289
- const { fal } = await import('@ai-sdk/fal')
290
- return fal.video(modelId)
291
- }
292
- default:
293
- console.error(
294
- pc.red(
295
- `Direct video generation is only supported for Google, Vertex, and Fal keys, got provider: ${config.provider}`,
296
- ),
297
- )
298
- process.exit(1)
299
- }
300
- }
301
-
302
- // Fall back to egaki gateway
303
- if (hasEgakiKey()) {
304
- return createGatewayVideoModel(modelId, config.provider)
305
- }
306
-
307
- console.error(pc.red(`No API key available for provider: ${config.provider}`))
308
- process.exit(1)
309
- }
@@ -1,363 +0,0 @@
1
- // Single source of truth for video generation models.
2
- // Stores provider, strategy, capabilities, and duration-based pricing metadata.
3
- // Gateway billing uses this catalog to estimate per-request video cost.
4
-
5
- export type VideoDurationPricingTier = {
6
- /** USD per second for this variant */
7
- costPerSecond: number
8
- /** Optional resolution discriminator (e.g. 720p, 1080p, 4k) */
9
- resolution?: string
10
- /** Optional mode discriminator (e.g. std, pro) */
11
- mode?: string
12
- /** Optional audio discriminator */
13
- audio?: boolean
14
- }
15
-
16
- export type PerVideoSecondCost = {
17
- type: 'per-video-second'
18
- /** Fallback duration when request does not specify one (seconds) */
19
- defaultDurationSec: number
20
- tiers: VideoDurationPricingTier[]
21
- }
22
-
23
- export type UnknownVideoCost = {
24
- type: 'unknown'
25
- }
26
-
27
- export type VideoModelCost = PerVideoSecondCost | UnknownVideoCost
28
-
29
- export type VideoModelFeatures = {
30
- /** Supports text prompt to video generation */
31
- textToVideo: boolean
32
- /** Supports image-to-video prompt object ({ image, text }) */
33
- imageToVideo: boolean
34
- /** Optional capabilities exposed by provider */
35
- capabilities: Array<'t2v' | 'i2v' | 'r2v' | 'motion-control' | 'editing'>
36
- /** Optional supported aspect ratios */
37
- aspectRatios?: string[]
38
- /** Optional supported resolutions */
39
- resolutions?: string[]
40
- /** Optional duration range in seconds */
41
- durationRangeSec?: { min: number; max: number }
42
- seed: boolean
43
- multipleVideos: boolean
44
- }
45
-
46
- export type VideoModelEntry = {
47
- id: string
48
- name: string
49
- description?: string
50
- provider: string
51
- strategy: 'video'
52
- released: string
53
- cost: VideoModelCost
54
- features: VideoModelFeatures
55
- }
56
-
57
- const commonRatios = ['16:9', '9:16', '1:1', '4:3', '3:4']
58
-
59
- export const VIDEO_CATALOG: VideoModelEntry[] = [
60
- {
61
- id: 'veo-3.1-generate-001',
62
- name: 'Veo 3.1',
63
- provider: 'google',
64
- strategy: 'video',
65
- released: '2026-01',
66
- cost: {
67
- type: 'per-video-second',
68
- defaultDurationSec: 8,
69
- tiers: [
70
- { resolution: '720p', audio: false, costPerSecond: 0.2 },
71
- { resolution: '720p', audio: true, costPerSecond: 0.4 },
72
- { resolution: '1080p', audio: false, costPerSecond: 0.2 },
73
- { resolution: '1080p', audio: true, costPerSecond: 0.4 },
74
- { resolution: '4k', audio: false, costPerSecond: 0.4 },
75
- { resolution: '4k', audio: true, costPerSecond: 0.6 },
76
- ],
77
- },
78
- features: {
79
- textToVideo: true,
80
- imageToVideo: false,
81
- capabilities: ['t2v'],
82
- aspectRatios: ['16:9', '9:16'],
83
- resolutions: ['720p', '1080p', '4k'],
84
- durationRangeSec: { min: 4, max: 8 },
85
- seed: true,
86
- multipleVideos: true,
87
- },
88
- },
89
- {
90
- id: 'veo-3.1-fast-generate-001',
91
- name: 'Veo 3.1 Fast',
92
- provider: 'google',
93
- strategy: 'video',
94
- released: '2026-01',
95
- cost: {
96
- type: 'per-video-second',
97
- defaultDurationSec: 8,
98
- tiers: [
99
- { resolution: '720p', audio: false, costPerSecond: 0.1 },
100
- { resolution: '720p', audio: true, costPerSecond: 0.15 },
101
- { resolution: '1080p', audio: false, costPerSecond: 0.1 },
102
- { resolution: '1080p', audio: true, costPerSecond: 0.15 },
103
- { resolution: '4k', audio: false, costPerSecond: 0.3 },
104
- { resolution: '4k', audio: true, costPerSecond: 0.35 },
105
- ],
106
- },
107
- features: {
108
- textToVideo: true,
109
- imageToVideo: false,
110
- capabilities: ['t2v'],
111
- aspectRatios: ['16:9', '9:16'],
112
- resolutions: ['720p', '1080p', '4k'],
113
- durationRangeSec: { min: 4, max: 8 },
114
- seed: true,
115
- multipleVideos: true,
116
- },
117
- },
118
- {
119
- id: 'veo-3.0-generate-001',
120
- name: 'Veo 3.0',
121
- provider: 'google',
122
- strategy: 'video',
123
- released: '2025-12',
124
- cost: {
125
- type: 'per-video-second',
126
- defaultDurationSec: 8,
127
- tiers: [
128
- { resolution: '720p', audio: false, costPerSecond: 0.2 },
129
- { resolution: '720p', audio: true, costPerSecond: 0.4 },
130
- { resolution: '1080p', audio: false, costPerSecond: 0.2 },
131
- { resolution: '1080p', audio: true, costPerSecond: 0.4 },
132
- ],
133
- },
134
- features: {
135
- textToVideo: true,
136
- imageToVideo: false,
137
- capabilities: ['t2v'],
138
- aspectRatios: ['16:9', '9:16'],
139
- resolutions: ['720p', '1080p'],
140
- durationRangeSec: { min: 4, max: 8 },
141
- seed: true,
142
- multipleVideos: true,
143
- },
144
- },
145
- {
146
- id: 'veo-3.0-fast-generate-001',
147
- name: 'Veo 3.0 Fast',
148
- provider: 'google',
149
- strategy: 'video',
150
- released: '2025-12',
151
- cost: {
152
- type: 'per-video-second',
153
- defaultDurationSec: 8,
154
- tiers: [
155
- { resolution: '720p', audio: false, costPerSecond: 0.1 },
156
- { resolution: '720p', audio: true, costPerSecond: 0.15 },
157
- { resolution: '1080p', audio: false, costPerSecond: 0.1 },
158
- { resolution: '1080p', audio: true, costPerSecond: 0.15 },
159
- ],
160
- },
161
- features: {
162
- textToVideo: true,
163
- imageToVideo: false,
164
- capabilities: ['t2v'],
165
- aspectRatios: ['16:9', '9:16'],
166
- resolutions: ['720p', '1080p'],
167
- durationRangeSec: { min: 4, max: 8 },
168
- seed: true,
169
- multipleVideos: true,
170
- },
171
- },
172
- // ── Vertex: Veo ──────────────────────────────────────────────────────
173
- // Same Veo models routed through Vertex AI / Google Cloud billing.
174
- // Use `egaki login --provider vertex --key <key>` to configure.
175
- {
176
- id: 'vertex/veo-3.1-generate-001',
177
- name: 'Veo 3.1 (Vertex)',
178
- provider: 'vertex',
179
- strategy: 'video',
180
- released: '2026-01',
181
- cost: {
182
- type: 'per-video-second',
183
- defaultDurationSec: 8,
184
- tiers: [
185
- { resolution: '720p', audio: false, costPerSecond: 0.2 },
186
- { resolution: '720p', audio: true, costPerSecond: 0.4 },
187
- { resolution: '1080p', audio: false, costPerSecond: 0.2 },
188
- { resolution: '1080p', audio: true, costPerSecond: 0.4 },
189
- { resolution: '4k', audio: false, costPerSecond: 0.4 },
190
- { resolution: '4k', audio: true, costPerSecond: 0.6 },
191
- ],
192
- },
193
- features: {
194
- textToVideo: true,
195
- imageToVideo: false,
196
- capabilities: ['t2v'],
197
- aspectRatios: ['16:9', '9:16'],
198
- resolutions: ['720p', '1080p', '4k'],
199
- durationRangeSec: { min: 4, max: 8 },
200
- seed: true,
201
- multipleVideos: true,
202
- },
203
- },
204
- {
205
- id: 'vertex/veo-3.1-fast-generate-001',
206
- name: 'Veo 3.1 Fast (Vertex)',
207
- provider: 'vertex',
208
- strategy: 'video',
209
- released: '2026-01',
210
- cost: {
211
- type: 'per-video-second',
212
- defaultDurationSec: 8,
213
- tiers: [
214
- { resolution: '720p', audio: false, costPerSecond: 0.1 },
215
- { resolution: '720p', audio: true, costPerSecond: 0.15 },
216
- { resolution: '1080p', audio: false, costPerSecond: 0.1 },
217
- { resolution: '1080p', audio: true, costPerSecond: 0.15 },
218
- { resolution: '4k', audio: false, costPerSecond: 0.3 },
219
- { resolution: '4k', audio: true, costPerSecond: 0.35 },
220
- ],
221
- },
222
- features: {
223
- textToVideo: true,
224
- imageToVideo: false,
225
- capabilities: ['t2v'],
226
- aspectRatios: ['16:9', '9:16'],
227
- resolutions: ['720p', '1080p', '4k'],
228
- durationRangeSec: { min: 4, max: 8 },
229
- seed: true,
230
- multipleVideos: true,
231
- },
232
- },
233
- {
234
- id: 'grok-imagine-video',
235
- name: 'Grok Imagine Video',
236
- provider: 'xai',
237
- strategy: 'video',
238
- released: '2026-03',
239
- cost: {
240
- type: 'per-video-second',
241
- defaultDurationSec: 5,
242
- tiers: [
243
- { resolution: '480p', costPerSecond: 0.05 },
244
- { resolution: '720p', costPerSecond: 0.07 },
245
- ],
246
- },
247
- features: {
248
- textToVideo: true,
249
- imageToVideo: true,
250
- capabilities: ['t2v', 'i2v', 'editing'],
251
- aspectRatios: ['1:1', '16:9', '9:16', '4:3', '3:4', '3:2', '2:3'],
252
- resolutions: ['480p', '720p'],
253
- durationRangeSec: { min: 1, max: 15 },
254
- seed: false,
255
- multipleVideos: false,
256
- },
257
- },
258
- {
259
- id: 'kling-v2.6-t2v',
260
- name: 'Kling v2.6 T2V',
261
- provider: 'klingai',
262
- strategy: 'video',
263
- released: '2025-12',
264
- cost: {
265
- type: 'per-video-second',
266
- defaultDurationSec: 5,
267
- tiers: [
268
- { mode: 'std', costPerSecond: 0.042 },
269
- { mode: 'pro', audio: false, costPerSecond: 0.07 },
270
- { mode: 'pro', audio: true, costPerSecond: 0.14 },
271
- ],
272
- },
273
- features: {
274
- textToVideo: true,
275
- imageToVideo: false,
276
- capabilities: ['t2v'],
277
- aspectRatios: commonRatios,
278
- durationRangeSec: { min: 5, max: 10 },
279
- seed: false,
280
- multipleVideos: false,
281
- },
282
- },
283
- {
284
- id: 'wan-v2.6-t2v',
285
- name: 'Wan v2.6 T2V',
286
- provider: 'alibaba',
287
- strategy: 'video',
288
- released: '2026-01',
289
- cost: {
290
- type: 'per-video-second',
291
- defaultDurationSec: 5,
292
- tiers: [
293
- { resolution: '720p', costPerSecond: 0.1 },
294
- { resolution: '1080p', costPerSecond: 0.15 },
295
- ],
296
- },
297
- features: {
298
- textToVideo: true,
299
- imageToVideo: false,
300
- capabilities: ['t2v'],
301
- resolutions: ['720p', '1080p'],
302
- durationRangeSec: { min: 2, max: 15 },
303
- seed: false,
304
- multipleVideos: false,
305
- },
306
- },
307
-
308
- // Fal direct BYOK models — duration pricing depends on Fal endpoint/config.
309
- {
310
- id: 'luma-ray-2',
311
- name: 'Luma Ray 2 (Fal)',
312
- provider: 'fal',
313
- strategy: 'video',
314
- released: '2025-11',
315
- cost: { type: 'unknown' },
316
- features: {
317
- textToVideo: true,
318
- imageToVideo: true,
319
- capabilities: ['t2v', 'i2v'],
320
- aspectRatios: commonRatios,
321
- seed: true,
322
- multipleVideos: false,
323
- },
324
- },
325
- {
326
- id: 'minimax-video',
327
- name: 'MiniMax Video (Fal)',
328
- provider: 'fal',
329
- strategy: 'video',
330
- released: '2025-10',
331
- cost: { type: 'unknown' },
332
- features: {
333
- textToVideo: true,
334
- imageToVideo: false,
335
- capabilities: ['t2v'],
336
- aspectRatios: commonRatios,
337
- seed: false,
338
- multipleVideos: false,
339
- },
340
- },
341
- {
342
- id: 'hunyuan-video',
343
- name: 'Hunyuan Video (Fal)',
344
- provider: 'fal',
345
- strategy: 'video',
346
- released: '2025-09',
347
- cost: { type: 'unknown' },
348
- features: {
349
- textToVideo: true,
350
- imageToVideo: true,
351
- capabilities: ['t2v', 'i2v'],
352
- aspectRatios: commonRatios,
353
- seed: true,
354
- multipleVideos: false,
355
- },
356
- },
357
- ]
358
-
359
- const videoCatalogIndex = new Map(VIDEO_CATALOG.map((m) => [m.id, m]))
360
-
361
- export function findVideoModel(id: string): VideoModelEntry | undefined {
362
- return videoCatalogIndex.get(id)
363
- }
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes