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.
- package/CHANGELOG.md +188 -0
- package/dist/cli/cache-utils.d.ts +33 -0
- package/dist/cli/cache-utils.d.ts.map +1 -0
- package/dist/cli/cache-utils.js +157 -0
- package/dist/cli/cached-generate.d.ts +105 -0
- package/dist/cli/cached-generate.d.ts.map +1 -0
- package/dist/cli/cached-generate.js +208 -0
- package/dist/cli/cached-generate.test.d.ts +11 -0
- package/dist/cli/cached-generate.test.d.ts.map +1 -0
- package/dist/cli/cached-generate.test.js +431 -0
- package/dist/cli/cartesia-provider.d.ts +16 -0
- package/dist/cli/cartesia-provider.d.ts.map +1 -0
- package/dist/cli/cartesia-provider.js +184 -0
- package/dist/cli/chatgpt-auth.d.ts.map +1 -0
- package/dist/cli/cli.d.ts +4 -0
- package/dist/cli/cli.d.ts.map +1 -0
- package/dist/cli/cli.js +1329 -0
- package/dist/cli/clone-generate.d.ts +26 -0
- package/dist/cli/clone-generate.d.ts.map +1 -0
- package/dist/cli/clone-generate.js +148 -0
- package/dist/{credentials.d.ts → cli/credentials.d.ts} +11 -2
- package/dist/cli/credentials.d.ts.map +1 -0
- package/dist/{credentials.js → cli/credentials.js} +88 -5
- package/dist/cli/elevenlabs-speech-provider.d.ts +26 -0
- package/dist/cli/elevenlabs-speech-provider.d.ts.map +1 -0
- package/dist/cli/elevenlabs-speech-provider.js +199 -0
- package/dist/cli/generate.d.ts +140 -0
- package/dist/cli/generate.d.ts.map +1 -0
- package/dist/cli/generate.js +604 -0
- package/dist/cli/generate.test.d.ts +2 -0
- package/dist/cli/generate.test.d.ts.map +1 -0
- package/dist/cli/generate.test.js +131 -0
- package/dist/cli/login.d.ts.map +1 -0
- package/dist/{login.js → cli/login.js} +45 -4
- package/dist/cli/main.d.ts +3 -0
- package/dist/cli/main.d.ts.map +1 -0
- package/dist/cli/main.js +7 -0
- package/dist/cli/model-catalog.d.ts +141 -0
- package/dist/cli/model-catalog.d.ts.map +1 -0
- package/dist/cli/model-catalog.js +2135 -0
- package/dist/{models.d.ts → cli/models.d.ts} +16 -9
- package/dist/cli/models.d.ts.map +1 -0
- package/dist/cli/models.js +313 -0
- package/dist/cli/open-browser.d.ts.map +1 -0
- package/dist/cli/openai-speech-provider.d.ts +3 -0
- package/dist/cli/openai-speech-provider.d.ts.map +1 -0
- package/dist/cli/openai-speech-provider.js +28 -0
- package/dist/cli/separation-generate.d.ts +34 -0
- package/dist/cli/separation-generate.d.ts.map +1 -0
- package/dist/cli/separation-generate.js +117 -0
- package/dist/cli/speech-catalog.d.ts +35 -0
- package/dist/cli/speech-catalog.d.ts.map +1 -0
- package/dist/cli/speech-catalog.js +195 -0
- package/dist/cli/speech-generate.d.ts +86 -0
- package/dist/cli/speech-generate.d.ts.map +1 -0
- package/dist/cli/speech-generate.js +156 -0
- package/dist/cli/speech-models.d.ts +8 -0
- package/dist/cli/speech-models.d.ts.map +1 -0
- package/dist/cli/speech-models.js +109 -0
- package/dist/cli/speech-provider.test.d.ts +2 -0
- package/dist/cli/speech-provider.test.d.ts.map +1 -0
- package/dist/cli/speech-provider.test.js +197 -0
- package/dist/cli/subscription.d.ts.map +1 -0
- package/dist/cli/transcription-catalog.d.ts +35 -0
- package/dist/cli/transcription-catalog.d.ts.map +1 -0
- package/dist/cli/transcription-catalog.js +192 -0
- package/dist/cli/transcription-generate.d.ts +62 -0
- package/dist/cli/transcription-generate.d.ts.map +1 -0
- package/dist/cli/transcription-generate.js +144 -0
- package/dist/cli/transcription-models.d.ts +9 -0
- package/dist/cli/transcription-models.d.ts.map +1 -0
- package/dist/cli/transcription-models.js +100 -0
- package/dist/cli/transcription-providers.d.ts +22 -0
- package/dist/cli/transcription-providers.d.ts.map +1 -0
- package/dist/cli/transcription-providers.js +290 -0
- package/dist/cli/video-model-catalog.d.ts +2 -0
- package/dist/cli/video-model-catalog.d.ts.map +1 -0
- package/dist/cli/video-model-catalog.js +5 -0
- package/dist/cli/xai-auth.d.ts +29 -0
- package/dist/cli/xai-auth.d.ts.map +1 -0
- package/dist/cli/xai-auth.js +325 -0
- package/dist/vite/angled-screen.d.ts +57 -0
- package/dist/vite/angled-screen.d.ts.map +1 -0
- package/dist/vite/angled-screen.js +115 -0
- package/dist/vite/app.d.ts +51 -0
- package/dist/vite/app.d.ts.map +1 -0
- package/dist/vite/app.js +150 -0
- package/dist/vite/bands-shader.d.ts +47 -0
- package/dist/vite/bands-shader.d.ts.map +1 -0
- package/dist/vite/bands-shader.js +267 -0
- package/dist/vite/code-block.d.ts +107 -0
- package/dist/vite/code-block.d.ts.map +1 -0
- package/dist/vite/code-block.js +641 -0
- package/dist/vite/components.d.ts +36 -0
- package/dist/vite/components.d.ts.map +1 -0
- package/dist/vite/components.js +113 -0
- package/dist/vite/dispersion-rings-shader.d.ts +44 -0
- package/dist/vite/dispersion-rings-shader.d.ts.map +1 -0
- package/dist/vite/dispersion-rings-shader.js +282 -0
- package/dist/vite/easing-curves.d.ts +129 -0
- package/dist/vite/easing-curves.d.ts.map +1 -0
- package/dist/vite/easing-curves.js +584 -0
- package/dist/vite/easing-curves.test.d.ts +2 -0
- package/dist/vite/easing-curves.test.d.ts.map +1 -0
- package/dist/vite/easing-curves.test.js +200 -0
- package/dist/vite/generated-media-client.d.ts +35 -0
- package/dist/vite/generated-media-client.d.ts.map +1 -0
- package/dist/vite/generated-media-client.js +76 -0
- package/dist/vite/keyframes.d.ts +129 -0
- package/dist/vite/keyframes.d.ts.map +1 -0
- package/dist/vite/keyframes.js +194 -0
- package/dist/vite/layout-editor.d.ts +45 -0
- package/dist/vite/layout-editor.d.ts.map +1 -0
- package/dist/vite/layout-editor.js +587 -0
- package/dist/vite/layout-transition.d.ts +136 -0
- package/dist/vite/layout-transition.d.ts.map +1 -0
- package/dist/vite/layout-transition.js +581 -0
- package/dist/vite/liquid-gradient-shader.d.ts +62 -0
- package/dist/vite/liquid-gradient-shader.d.ts.map +1 -0
- package/dist/vite/liquid-gradient-shader.js +413 -0
- package/dist/vite/mdx-client.d.ts +15 -0
- package/dist/vite/mdx-client.d.ts.map +1 -0
- package/dist/vite/mdx-client.js +265 -0
- package/dist/vite/mdx-parse.d.ts +102 -0
- package/dist/vite/mdx-parse.d.ts.map +1 -0
- package/dist/vite/mdx-parse.js +251 -0
- package/dist/vite/mdx-provided-components.d.ts +18 -0
- package/dist/vite/mdx-provided-components.d.ts.map +1 -0
- package/dist/vite/mdx-provided-components.js +14 -0
- package/dist/vite/mdx-video.d.ts +327 -0
- package/dist/vite/mdx-video.d.ts.map +1 -0
- package/dist/vite/mdx-video.js +596 -0
- package/dist/vite/mdx-video.test.d.ts +9 -0
- package/dist/vite/mdx-video.test.d.ts.map +1 -0
- package/dist/vite/mdx-video.test.js +1945 -0
- package/dist/vite/media-components.d.ts +45 -0
- package/dist/vite/media-components.d.ts.map +1 -0
- package/dist/vite/media-components.js +355 -0
- package/dist/vite/media-duration-store.d.ts +66 -0
- package/dist/vite/media-duration-store.d.ts.map +1 -0
- package/dist/vite/media-duration-store.js +204 -0
- package/dist/vite/player-page.d.ts +35 -0
- package/dist/vite/player-page.d.ts.map +1 -0
- package/dist/vite/player-page.js +720 -0
- package/dist/vite/render-client.d.ts +18 -0
- package/dist/vite/render-client.d.ts.map +1 -0
- package/dist/vite/render-client.js +67 -0
- package/dist/vite/sdk.d.ts +221 -0
- package/dist/vite/sdk.d.ts.map +1 -0
- package/dist/vite/sdk.js +355 -0
- package/dist/vite/server-components.d.ts +55 -0
- package/dist/vite/server-components.d.ts.map +1 -0
- package/dist/vite/server-components.js +156 -0
- package/dist/vite/server-mdx.d.ts +74 -0
- package/dist/vite/server-mdx.d.ts.map +1 -0
- package/dist/vite/server-mdx.js +259 -0
- package/dist/vite/shader-renderer.d.ts +48 -0
- package/dist/vite/shader-renderer.d.ts.map +1 -0
- package/dist/vite/shader-renderer.js +411 -0
- package/dist/vite/store-hooks.d.ts +12 -0
- package/dist/vite/store-hooks.d.ts.map +1 -0
- package/dist/vite/store-hooks.js +93 -0
- package/dist/vite/store.d.ts +75 -0
- package/dist/vite/store.d.ts.map +1 -0
- package/dist/vite/store.js +52 -0
- package/dist/vite/store.test.d.ts +6 -0
- package/dist/vite/store.test.d.ts.map +1 -0
- package/dist/vite/store.test.js +172 -0
- package/dist/vite/tweakpane-hook.d.ts +94 -0
- package/dist/vite/tweakpane-hook.d.ts.map +1 -0
- package/dist/vite/tweakpane-hook.js +450 -0
- package/dist/vite/vite-plugin.d.ts +28 -0
- package/dist/vite/vite-plugin.d.ts.map +1 -0
- package/dist/vite/vite-plugin.js +538 -0
- package/dist/vite/wave-gradient-shader.d.ts +41 -0
- package/dist/vite/wave-gradient-shader.d.ts.map +1 -0
- package/dist/vite/wave-gradient-shader.js +207 -0
- package/package.json +103 -25
- package/skills/egaki/SKILL.md +162 -1
- package/src/cli/cache-utils.ts +169 -0
- package/src/cli/cached-generate.test.ts +531 -0
- package/src/cli/cached-generate.ts +348 -0
- package/src/cli/cartesia-provider.ts +249 -0
- package/src/cli/cli.ts +1818 -0
- package/src/cli/clone-generate.ts +202 -0
- package/src/{credentials.ts → cli/credentials.ts} +90 -7
- package/src/cli/elevenlabs-speech-provider.ts +243 -0
- package/src/cli/generate.test.ts +166 -0
- package/src/cli/generate.ts +912 -0
- package/src/{login.ts → cli/login.ts} +48 -3
- package/src/cli/main.ts +8 -0
- package/src/cli/model-catalog.ts +2336 -0
- package/src/cli/models.ts +408 -0
- package/src/cli/openai-speech-provider.ts +34 -0
- package/src/cli/separation-generate.ts +187 -0
- package/src/cli/speech-catalog.ts +253 -0
- package/src/cli/speech-generate.ts +275 -0
- package/src/cli/speech-models.ts +146 -0
- package/src/cli/speech-provider.test.ts +226 -0
- package/src/cli/transcription-catalog.ts +250 -0
- package/src/cli/transcription-generate.ts +214 -0
- package/src/cli/transcription-models.ts +136 -0
- package/src/cli/transcription-providers.ts +427 -0
- package/src/cli/video-model-catalog.ts +14 -0
- package/src/cli/xai-auth.ts +396 -0
- package/src/vite/angled-screen.tsx +214 -0
- package/src/vite/app.tsx +197 -0
- package/src/vite/bands-shader.tsx +319 -0
- package/src/vite/code-block.tsx +939 -0
- package/src/vite/components.tsx +278 -0
- package/src/vite/dispersion-rings-shader.tsx +331 -0
- package/src/vite/easing-curves.test.ts +232 -0
- package/src/vite/easing-curves.ts +743 -0
- package/src/vite/generated-media-client.tsx +121 -0
- package/src/vite/keyframes.tsx +347 -0
- package/src/vite/layout-editor.tsx +709 -0
- package/src/vite/layout-transition.tsx +706 -0
- package/src/vite/liquid-gradient-shader.tsx +474 -0
- package/src/vite/mdx-client.tsx +420 -0
- package/src/vite/mdx-parse.ts +343 -0
- package/src/vite/mdx-provided-components.ts +19 -0
- package/src/vite/mdx-video.test.tsx +2219 -0
- package/src/vite/mdx-video.tsx +976 -0
- package/src/vite/media-components.tsx +473 -0
- package/src/vite/media-duration-store.ts +225 -0
- package/src/vite/motion-timing.ts +194 -0
- package/src/vite/player-page.tsx +1107 -0
- package/src/vite/render-client.ts +84 -0
- package/src/vite/sdk.ts +598 -0
- package/src/vite/server-components.tsx +241 -0
- package/src/vite/server-mdx.ts +285 -0
- package/src/vite/shader-renderer.tsx +535 -0
- package/src/vite/store-hooks.ts +117 -0
- package/src/vite/store.test.ts +202 -0
- package/src/vite/store.ts +115 -0
- package/src/vite/styles.css +21 -0
- package/src/vite/tweakpane-hook.tsx +593 -0
- package/src/vite/virtual-modules.d.ts +30 -0
- package/src/vite/vite-plugin.ts +584 -0
- package/src/vite/wave-gradient-shader.tsx +253 -0
- package/README.md +0 -266
- package/dist/antigravity-auth.d.ts +0 -15
- package/dist/antigravity-auth.d.ts.map +0 -1
- package/dist/antigravity-auth.js +0 -544
- package/dist/antigravity-image.d.ts +0 -11
- package/dist/antigravity-image.d.ts.map +0 -1
- package/dist/antigravity-image.js +0 -285
- package/dist/chatgpt-auth.d.ts.map +0 -1
- package/dist/cli.d.ts +0 -3
- package/dist/cli.d.ts.map +0 -1
- package/dist/cli.js +0 -968
- package/dist/credentials.d.ts.map +0 -1
- package/dist/gateway-model-candidates.generated.d.ts +0 -11
- package/dist/gateway-model-candidates.generated.d.ts.map +0 -1
- package/dist/gateway-model-candidates.generated.js +0 -64
- package/dist/login.d.ts.map +0 -1
- package/dist/model-catalog.d.ts +0 -42
- package/dist/model-catalog.d.ts.map +0 -1
- package/dist/model-catalog.js +0 -1001
- package/dist/models.d.ts.map +0 -1
- package/dist/models.js +0 -246
- package/dist/open-browser.d.ts.map +0 -1
- package/dist/subscription.d.ts.map +0 -1
- package/dist/video-model-catalog.d.ts +0 -52
- package/dist/video-model-catalog.d.ts.map +0 -1
- package/dist/video-model-catalog.js +0 -306
- package/src/cli.ts +0 -1378
- package/src/model-catalog.ts +0 -1077
- package/src/models.ts +0 -309
- package/src/video-model-catalog.ts +0 -363
- /package/dist/{chatgpt-auth.d.ts → cli/chatgpt-auth.d.ts} +0 -0
- /package/dist/{chatgpt-auth.js → cli/chatgpt-auth.js} +0 -0
- /package/dist/{login.d.ts → cli/login.d.ts} +0 -0
- /package/dist/{open-browser.d.ts → cli/open-browser.d.ts} +0 -0
- /package/dist/{open-browser.js → cli/open-browser.js} +0 -0
- /package/dist/{subscription.d.ts → cli/subscription.d.ts} +0 -0
- /package/dist/{subscription.js → cli/subscription.js} +0 -0
- /package/src/{chatgpt-auth.ts → cli/chatgpt-auth.ts} +0 -0
- /package/src/{open-browser.ts → cli/open-browser.ts} +0 -0
- /package/src/{subscription.ts → cli/subscription.ts} +0 -0
package/dist/models.d.ts.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"models.d.ts","sourceRoot":"","sources":["../src/models.ts"],"names":[],"mappings":"AAiBA,OAAO,KAAK,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,IAAI,CAAA;AAInD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAA;AAEpD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAA;AAE/D,MAAM,MAAM,aAAa,GAAG,UAAU,GAAG,eAAe,CAAA;AACxD,YAAY,EAAE,UAAU,EAAE,eAAe,EAAE,CAAA;AAE3C,eAAO,MAAM,YAAY,EAA+B,CAAC,MAAM,EAAE,GAAG,MAAM,EAAE,CAAC,CAAA;AAC7E,eAAO,MAAM,YAAY,EAAqC,CAAC,MAAM,EAAE,GAAG,MAAM,EAAE,CAAC,CAAA;AAYnF,eAAO,MAAM,aAAa,4BAA4B,CAAA;AACtD,eAAO,MAAM,mBAAmB,8BAA8B,CAAA;AAE9D,wBAAgB,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG,aAAa,CAO7D;AAuBD,wBAAgB,iBAAiB,CAAC,YAAY,EAAE,MAAM,GAAG,IAAI,CAiD5D;AAgDD;;;GAGG;AACH,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAI9D;AAOD,wBAAsB,gBAAgB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC,CAsC3E;AAED,wBAAsB,eAAe,CACnC,OAAO,EAAE,MAAM,GACd,OAAO,CAAC,aAAa,CAAC,CAqCxB;AAED,wBAAsB,gBAAgB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,CAyCpE"}
|
package/dist/models.js
DELETED
|
@@ -1,246 +0,0 @@
|
|
|
1
|
-
import pc from 'picocolors';
|
|
2
|
-
import { PROVIDERS, EGAKI_GATEWAY_URL, shouldUseChatGptBackend } from './credentials.js';
|
|
3
|
-
import { CATALOG, findModel } from './model-catalog.js';
|
|
4
|
-
import { VIDEO_CATALOG, findVideoModel } from './video-model-catalog.js';
|
|
5
|
-
export const IMAGE_MODELS = CATALOG.map((m) => m.id);
|
|
6
|
-
export const VIDEO_MODELS = VIDEO_CATALOG.map((m) => m.id);
|
|
7
|
-
/**
|
|
8
|
-
* Strip provider prefix from a model ID (e.g. "vertex/imagen-4.0-generate-001" → "imagen-4.0-generate-001").
|
|
9
|
-
* Provider SDKs expect bare model IDs, but the catalog uses prefixed IDs for routing.
|
|
10
|
-
*/
|
|
11
|
-
function stripProviderPrefix(modelId) {
|
|
12
|
-
const slash = modelId.indexOf('/');
|
|
13
|
-
if (slash === -1)
|
|
14
|
-
return modelId;
|
|
15
|
-
return modelId.slice(slash + 1);
|
|
16
|
-
}
|
|
17
|
-
export const DEFAULT_MODEL = 'nano-banana-pro-preview';
|
|
18
|
-
export const DEFAULT_VIDEO_MODEL = 'veo-3.1-fast-generate-001';
|
|
19
|
-
export function getModelConfig(modelId) {
|
|
20
|
-
const entry = findModel(modelId) ?? findVideoModel(modelId);
|
|
21
|
-
if (!entry) {
|
|
22
|
-
console.error(pc.red(`Unknown model: ${modelId}`));
|
|
23
|
-
process.exit(1);
|
|
24
|
-
}
|
|
25
|
-
return entry;
|
|
26
|
-
}
|
|
27
|
-
/**
|
|
28
|
-
* Check if the egaki gateway API key is available (from env or stored credentials).
|
|
29
|
-
*/
|
|
30
|
-
function hasEgakiKey() {
|
|
31
|
-
const info = PROVIDERS['egaki'];
|
|
32
|
-
if (!info)
|
|
33
|
-
return false;
|
|
34
|
-
return Boolean(process.env[info.envVar]);
|
|
35
|
-
}
|
|
36
|
-
/**
|
|
37
|
-
* Check if a direct provider key is available for the given provider.
|
|
38
|
-
*/
|
|
39
|
-
function hasDirectProviderKey(providerName) {
|
|
40
|
-
const info = PROVIDERS[providerName];
|
|
41
|
-
if (!info)
|
|
42
|
-
return false;
|
|
43
|
-
return Boolean(process.env[info.envVar]);
|
|
44
|
-
}
|
|
45
|
-
// Check that the provider's API key is available before making API calls.
|
|
46
|
-
// Prints a user-friendly error with instructions on how to configure it.
|
|
47
|
-
// Prioritizes egaki subscription over individual provider keys.
|
|
48
|
-
export function ensureProviderKey(providerName) {
|
|
49
|
-
// If direct provider key exists, we're good
|
|
50
|
-
if (hasDirectProviderKey(providerName))
|
|
51
|
-
return;
|
|
52
|
-
// Vertex models require a direct key — the upstream Vercel AI Gateway
|
|
53
|
-
// does not support vertex/ routing, so egaki gateway can't proxy them.
|
|
54
|
-
if (providerName === 'vertex') {
|
|
55
|
-
console.error('');
|
|
56
|
-
console.error(pc.red(pc.bold('Vertex models require a direct Google Cloud API key')));
|
|
57
|
-
console.error('');
|
|
58
|
-
console.error(` ${pc.cyan('egaki login --provider vertex --key <key>')}`);
|
|
59
|
-
console.error('');
|
|
60
|
-
console.error(pc.dim('Get a key at https://console.cloud.google.com/apis/credentials'));
|
|
61
|
-
console.error(pc.dim('Egaki subscription does not cover Vertex routing yet.'));
|
|
62
|
-
console.error('');
|
|
63
|
-
process.exit(1);
|
|
64
|
-
}
|
|
65
|
-
// If egaki key exists, we'll route through the gateway
|
|
66
|
-
if (hasEgakiKey())
|
|
67
|
-
return;
|
|
68
|
-
const info = PROVIDERS[providerName];
|
|
69
|
-
console.error('');
|
|
70
|
-
console.error(pc.red(pc.bold(`Missing API key for ${info?.label || providerName}`)));
|
|
71
|
-
console.error('');
|
|
72
|
-
console.error(` ${pc.bold('Recommended:')} Use Egaki subscription (all models, one key)`);
|
|
73
|
-
console.error('');
|
|
74
|
-
console.error(` ${pc.cyan('egaki subscribe')} get started in 30 seconds`);
|
|
75
|
-
console.error('');
|
|
76
|
-
console.error(` ${pc.dim('Or configure a provider key directly:')}`);
|
|
77
|
-
console.error('');
|
|
78
|
-
console.error(` ${pc.cyan('egaki login')} interactive setup`);
|
|
79
|
-
if (info) {
|
|
80
|
-
console.error(` ${pc.cyan(`${info.envVar}=...`)} egaki image ... inline env var`);
|
|
81
|
-
console.error(` ${pc.cyan(`egaki login --provider ${providerName} --key <key>`)}`);
|
|
82
|
-
console.error('');
|
|
83
|
-
console.error(` ${pc.dim(info.hint)}`);
|
|
84
|
-
}
|
|
85
|
-
console.error('');
|
|
86
|
-
process.exit(1);
|
|
87
|
-
}
|
|
88
|
-
/**
|
|
89
|
-
* Create a gateway-backed image model using createGateway from the AI SDK.
|
|
90
|
-
* The model ID is sent as provider/model format to the gateway.
|
|
91
|
-
*/
|
|
92
|
-
async function createGatewayImageModel(modelId, provider) {
|
|
93
|
-
const { createGateway } = await import('ai');
|
|
94
|
-
const gateway = createGateway({
|
|
95
|
-
apiKey: process.env['EGAKI_API_KEY'],
|
|
96
|
-
baseURL: EGAKI_GATEWAY_URL,
|
|
97
|
-
});
|
|
98
|
-
// Gateway expects provider/model format for routing.
|
|
99
|
-
// For models that already have a prefix (e.g. vertex/imagen-4.0), strip it
|
|
100
|
-
// and use the catalog provider. For bare IDs, prepend the provider.
|
|
101
|
-
const bareId = stripProviderPrefix(modelId);
|
|
102
|
-
const gatewayModelId = `${provider}/${bareId}`;
|
|
103
|
-
return gateway.image(gatewayModelId);
|
|
104
|
-
}
|
|
105
|
-
/**
|
|
106
|
-
* Create a gateway-backed text model using createGateway from the AI SDK.
|
|
107
|
-
*/
|
|
108
|
-
async function createGatewayTextModel(modelId, provider) {
|
|
109
|
-
const { createGateway } = await import('ai');
|
|
110
|
-
const gateway = createGateway({
|
|
111
|
-
apiKey: process.env['EGAKI_API_KEY'],
|
|
112
|
-
baseURL: EGAKI_GATEWAY_URL,
|
|
113
|
-
});
|
|
114
|
-
const bareId = stripProviderPrefix(modelId);
|
|
115
|
-
const gatewayModelId = `${provider}/${bareId}`;
|
|
116
|
-
return gateway(gatewayModelId);
|
|
117
|
-
}
|
|
118
|
-
/**
|
|
119
|
-
* Create a gateway-backed video model using createGateway from the AI SDK.
|
|
120
|
-
*/
|
|
121
|
-
async function createGatewayVideoModel(modelId, provider) {
|
|
122
|
-
const { createGateway } = await import('ai');
|
|
123
|
-
const gateway = createGateway({
|
|
124
|
-
apiKey: process.env['EGAKI_API_KEY'],
|
|
125
|
-
baseURL: EGAKI_GATEWAY_URL,
|
|
126
|
-
});
|
|
127
|
-
const bareId = stripProviderPrefix(modelId);
|
|
128
|
-
const gatewayModelId = `${provider}/${bareId}`;
|
|
129
|
-
return gateway.video(gatewayModelId);
|
|
130
|
-
}
|
|
131
|
-
/**
|
|
132
|
-
* ChatGPT OAuth image generation goes through the Codex backend instead of the
|
|
133
|
-
* OpenAI Image API, so OpenAI image models need the custom responses path.
|
|
134
|
-
*/
|
|
135
|
-
export function shouldUseResponsesApi(modelId) {
|
|
136
|
-
const config = findModel(modelId);
|
|
137
|
-
if (!config)
|
|
138
|
-
return false;
|
|
139
|
-
return config.provider === 'openai' && config.strategy === 'image' && shouldUseChatGptBackend();
|
|
140
|
-
}
|
|
141
|
-
// Lazily import the provider and create the right model instance.
|
|
142
|
-
// This avoids loading all provider SDKs upfront — only the one needed
|
|
143
|
-
// for the selected model gets imported.
|
|
144
|
-
//
|
|
145
|
-
// Priority: direct provider key > egaki gateway > error
|
|
146
|
-
export async function createImageModel(modelId) {
|
|
147
|
-
const config = getModelConfig(modelId);
|
|
148
|
-
ensureProviderKey(config.provider);
|
|
149
|
-
// If the user has a direct provider key, use the provider SDK directly
|
|
150
|
-
if (hasDirectProviderKey(config.provider)) {
|
|
151
|
-
switch (config.provider) {
|
|
152
|
-
case 'google': {
|
|
153
|
-
const { google } = await import('@ai-sdk/google');
|
|
154
|
-
return google.image(modelId);
|
|
155
|
-
}
|
|
156
|
-
case 'vertex': {
|
|
157
|
-
const { vertex } = await import('@ai-sdk/google-vertex');
|
|
158
|
-
return vertex.image(stripProviderPrefix(modelId));
|
|
159
|
-
}
|
|
160
|
-
case 'openai': {
|
|
161
|
-
const { openai } = await import('@ai-sdk/openai');
|
|
162
|
-
return openai.image(modelId);
|
|
163
|
-
}
|
|
164
|
-
case 'replicate': {
|
|
165
|
-
const { replicate } = await import('@ai-sdk/replicate');
|
|
166
|
-
return replicate.image(modelId);
|
|
167
|
-
}
|
|
168
|
-
case 'fal': {
|
|
169
|
-
const { fal } = await import('@ai-sdk/fal');
|
|
170
|
-
return fal.image(modelId);
|
|
171
|
-
}
|
|
172
|
-
}
|
|
173
|
-
}
|
|
174
|
-
// Fall back to egaki gateway
|
|
175
|
-
if (hasEgakiKey()) {
|
|
176
|
-
return createGatewayImageModel(modelId, config.provider);
|
|
177
|
-
}
|
|
178
|
-
// Should not reach here — ensureProviderKey would have exited
|
|
179
|
-
console.error(pc.red(`No API key available for provider: ${config.provider}`));
|
|
180
|
-
process.exit(1);
|
|
181
|
-
}
|
|
182
|
-
export async function createTextModel(modelId) {
|
|
183
|
-
const config = getModelConfig(modelId);
|
|
184
|
-
if (config.strategy !== 'text') {
|
|
185
|
-
console.error(pc.red(`Model ${modelId} is not a text model`));
|
|
186
|
-
process.exit(1);
|
|
187
|
-
}
|
|
188
|
-
ensureProviderKey(config.provider);
|
|
189
|
-
// Direct provider key takes priority
|
|
190
|
-
if (hasDirectProviderKey(config.provider)) {
|
|
191
|
-
switch (config.provider) {
|
|
192
|
-
case 'google': {
|
|
193
|
-
const { google } = await import('@ai-sdk/google');
|
|
194
|
-
return google(modelId);
|
|
195
|
-
}
|
|
196
|
-
case 'vertex': {
|
|
197
|
-
const { vertex } = await import('@ai-sdk/google-vertex');
|
|
198
|
-
return vertex(stripProviderPrefix(modelId));
|
|
199
|
-
}
|
|
200
|
-
default:
|
|
201
|
-
// Only Google/Vertex support generateText with responseModalities for images
|
|
202
|
-
console.error(pc.red(`Text+image generation is only supported for Google/Vertex models, got provider: ${config.provider}`));
|
|
203
|
-
process.exit(1);
|
|
204
|
-
}
|
|
205
|
-
}
|
|
206
|
-
// Fall back to egaki gateway
|
|
207
|
-
if (hasEgakiKey()) {
|
|
208
|
-
return createGatewayTextModel(modelId, config.provider);
|
|
209
|
-
}
|
|
210
|
-
console.error(pc.red(`No API key available for provider: ${config.provider}`));
|
|
211
|
-
process.exit(1);
|
|
212
|
-
}
|
|
213
|
-
export async function createVideoModel(modelId) {
|
|
214
|
-
const config = getModelConfig(modelId);
|
|
215
|
-
if (config.strategy !== 'video') {
|
|
216
|
-
console.error(pc.red(`Model ${modelId} is not a video model`));
|
|
217
|
-
process.exit(1);
|
|
218
|
-
}
|
|
219
|
-
ensureProviderKey(config.provider);
|
|
220
|
-
// Direct provider key takes priority
|
|
221
|
-
if (hasDirectProviderKey(config.provider)) {
|
|
222
|
-
switch (config.provider) {
|
|
223
|
-
case 'google': {
|
|
224
|
-
const { google } = await import('@ai-sdk/google');
|
|
225
|
-
return google.video(modelId);
|
|
226
|
-
}
|
|
227
|
-
case 'vertex': {
|
|
228
|
-
const { vertex } = await import('@ai-sdk/google-vertex');
|
|
229
|
-
return vertex.video(stripProviderPrefix(modelId));
|
|
230
|
-
}
|
|
231
|
-
case 'fal': {
|
|
232
|
-
const { fal } = await import('@ai-sdk/fal');
|
|
233
|
-
return fal.video(modelId);
|
|
234
|
-
}
|
|
235
|
-
default:
|
|
236
|
-
console.error(pc.red(`Direct video generation is only supported for Google, Vertex, and Fal keys, got provider: ${config.provider}`));
|
|
237
|
-
process.exit(1);
|
|
238
|
-
}
|
|
239
|
-
}
|
|
240
|
-
// Fall back to egaki gateway
|
|
241
|
-
if (hasEgakiKey()) {
|
|
242
|
-
return createGatewayVideoModel(modelId, config.provider);
|
|
243
|
-
}
|
|
244
|
-
console.error(pc.red(`No API key available for provider: ${config.provider}`));
|
|
245
|
-
process.exit(1);
|
|
246
|
-
}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"open-browser.d.ts","sourceRoot":"","sources":["../src/open-browser.ts"],"names":[],"mappings":"AAyBA,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAsBrD"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"subscription.d.ts","sourceRoot":"","sources":["../src/subscription.ts"],"names":[],"mappings":"AAsDA,wBAAsB,oBAAoB,IAAI,OAAO,CAAC,IAAI,CAAC,CA8H1D;AAED,wBAAgB,uBAAuB,CAAC,KAAK,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI,CA6B3E;AAID,wBAAsB,WAAW,IAAI,OAAO,CAAC,IAAI,CAAC,CAgCjD;AAID,wBAAsB,SAAS,IAAI,OAAO,CAAC,IAAI,CAAC,CA8C/C"}
|
|
@@ -1,52 +0,0 @@
|
|
|
1
|
-
export type VideoDurationPricingTier = {
|
|
2
|
-
/** USD per second for this variant */
|
|
3
|
-
costPerSecond: number;
|
|
4
|
-
/** Optional resolution discriminator (e.g. 720p, 1080p, 4k) */
|
|
5
|
-
resolution?: string;
|
|
6
|
-
/** Optional mode discriminator (e.g. std, pro) */
|
|
7
|
-
mode?: string;
|
|
8
|
-
/** Optional audio discriminator */
|
|
9
|
-
audio?: boolean;
|
|
10
|
-
};
|
|
11
|
-
export type PerVideoSecondCost = {
|
|
12
|
-
type: 'per-video-second';
|
|
13
|
-
/** Fallback duration when request does not specify one (seconds) */
|
|
14
|
-
defaultDurationSec: number;
|
|
15
|
-
tiers: VideoDurationPricingTier[];
|
|
16
|
-
};
|
|
17
|
-
export type UnknownVideoCost = {
|
|
18
|
-
type: 'unknown';
|
|
19
|
-
};
|
|
20
|
-
export type VideoModelCost = PerVideoSecondCost | UnknownVideoCost;
|
|
21
|
-
export type VideoModelFeatures = {
|
|
22
|
-
/** Supports text prompt to video generation */
|
|
23
|
-
textToVideo: boolean;
|
|
24
|
-
/** Supports image-to-video prompt object ({ image, text }) */
|
|
25
|
-
imageToVideo: boolean;
|
|
26
|
-
/** Optional capabilities exposed by provider */
|
|
27
|
-
capabilities: Array<'t2v' | 'i2v' | 'r2v' | 'motion-control' | 'editing'>;
|
|
28
|
-
/** Optional supported aspect ratios */
|
|
29
|
-
aspectRatios?: string[];
|
|
30
|
-
/** Optional supported resolutions */
|
|
31
|
-
resolutions?: string[];
|
|
32
|
-
/** Optional duration range in seconds */
|
|
33
|
-
durationRangeSec?: {
|
|
34
|
-
min: number;
|
|
35
|
-
max: number;
|
|
36
|
-
};
|
|
37
|
-
seed: boolean;
|
|
38
|
-
multipleVideos: boolean;
|
|
39
|
-
};
|
|
40
|
-
export type VideoModelEntry = {
|
|
41
|
-
id: string;
|
|
42
|
-
name: string;
|
|
43
|
-
description?: string;
|
|
44
|
-
provider: string;
|
|
45
|
-
strategy: 'video';
|
|
46
|
-
released: string;
|
|
47
|
-
cost: VideoModelCost;
|
|
48
|
-
features: VideoModelFeatures;
|
|
49
|
-
};
|
|
50
|
-
export declare const VIDEO_CATALOG: VideoModelEntry[];
|
|
51
|
-
export declare function findVideoModel(id: string): VideoModelEntry | undefined;
|
|
52
|
-
//# sourceMappingURL=video-model-catalog.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"video-model-catalog.d.ts","sourceRoot":"","sources":["../src/video-model-catalog.ts"],"names":[],"mappings":"AAIA,MAAM,MAAM,wBAAwB,GAAG;IACrC,sCAAsC;IACtC,aAAa,EAAE,MAAM,CAAA;IACrB,+DAA+D;IAC/D,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,kDAAkD;IAClD,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,mCAAmC;IACnC,KAAK,CAAC,EAAE,OAAO,CAAA;CAChB,CAAA;AAED,MAAM,MAAM,kBAAkB,GAAG;IAC/B,IAAI,EAAE,kBAAkB,CAAA;IACxB,oEAAoE;IACpE,kBAAkB,EAAE,MAAM,CAAA;IAC1B,KAAK,EAAE,wBAAwB,EAAE,CAAA;CAClC,CAAA;AAED,MAAM,MAAM,gBAAgB,GAAG;IAC7B,IAAI,EAAE,SAAS,CAAA;CAChB,CAAA;AAED,MAAM,MAAM,cAAc,GAAG,kBAAkB,GAAG,gBAAgB,CAAA;AAElE,MAAM,MAAM,kBAAkB,GAAG;IAC/B,+CAA+C;IAC/C,WAAW,EAAE,OAAO,CAAA;IACpB,8DAA8D;IAC9D,YAAY,EAAE,OAAO,CAAA;IACrB,gDAAgD;IAChD,YAAY,EAAE,KAAK,CAAC,KAAK,GAAG,KAAK,GAAG,KAAK,GAAG,gBAAgB,GAAG,SAAS,CAAC,CAAA;IACzE,uCAAuC;IACvC,YAAY,CAAC,EAAE,MAAM,EAAE,CAAA;IACvB,qCAAqC;IACrC,WAAW,CAAC,EAAE,MAAM,EAAE,CAAA;IACtB,yCAAyC;IACzC,gBAAgB,CAAC,EAAE;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAA;KAAE,CAAA;IAC/C,IAAI,EAAE,OAAO,CAAA;IACb,cAAc,EAAE,OAAO,CAAA;CACxB,CAAA;AAED,MAAM,MAAM,eAAe,GAAG;IAC5B,EAAE,EAAE,MAAM,CAAA;IACV,IAAI,EAAE,MAAM,CAAA;IACZ,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,QAAQ,EAAE,MAAM,CAAA;IAChB,QAAQ,EAAE,OAAO,CAAA;IACjB,QAAQ,EAAE,MAAM,CAAA;IAChB,IAAI,EAAE,cAAc,CAAA;IACpB,QAAQ,EAAE,kBAAkB,CAAA;CAC7B,CAAA;AAID,eAAO,MAAM,aAAa,EAAE,eAAe,EA0S1C,CAAA;AAID,wBAAgB,cAAc,CAAC,EAAE,EAAE,MAAM,GAAG,eAAe,GAAG,SAAS,CAEtE"}
|
|
@@ -1,306 +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
|
-
const commonRatios = ['16:9', '9:16', '1:1', '4:3', '3:4'];
|
|
5
|
-
export const VIDEO_CATALOG = [
|
|
6
|
-
{
|
|
7
|
-
id: 'veo-3.1-generate-001',
|
|
8
|
-
name: 'Veo 3.1',
|
|
9
|
-
provider: 'google',
|
|
10
|
-
strategy: 'video',
|
|
11
|
-
released: '2026-01',
|
|
12
|
-
cost: {
|
|
13
|
-
type: 'per-video-second',
|
|
14
|
-
defaultDurationSec: 8,
|
|
15
|
-
tiers: [
|
|
16
|
-
{ resolution: '720p', audio: false, costPerSecond: 0.2 },
|
|
17
|
-
{ resolution: '720p', audio: true, costPerSecond: 0.4 },
|
|
18
|
-
{ resolution: '1080p', audio: false, costPerSecond: 0.2 },
|
|
19
|
-
{ resolution: '1080p', audio: true, costPerSecond: 0.4 },
|
|
20
|
-
{ resolution: '4k', audio: false, costPerSecond: 0.4 },
|
|
21
|
-
{ resolution: '4k', audio: true, costPerSecond: 0.6 },
|
|
22
|
-
],
|
|
23
|
-
},
|
|
24
|
-
features: {
|
|
25
|
-
textToVideo: true,
|
|
26
|
-
imageToVideo: false,
|
|
27
|
-
capabilities: ['t2v'],
|
|
28
|
-
aspectRatios: ['16:9', '9:16'],
|
|
29
|
-
resolutions: ['720p', '1080p', '4k'],
|
|
30
|
-
durationRangeSec: { min: 4, max: 8 },
|
|
31
|
-
seed: true,
|
|
32
|
-
multipleVideos: true,
|
|
33
|
-
},
|
|
34
|
-
},
|
|
35
|
-
{
|
|
36
|
-
id: 'veo-3.1-fast-generate-001',
|
|
37
|
-
name: 'Veo 3.1 Fast',
|
|
38
|
-
provider: 'google',
|
|
39
|
-
strategy: 'video',
|
|
40
|
-
released: '2026-01',
|
|
41
|
-
cost: {
|
|
42
|
-
type: 'per-video-second',
|
|
43
|
-
defaultDurationSec: 8,
|
|
44
|
-
tiers: [
|
|
45
|
-
{ resolution: '720p', audio: false, costPerSecond: 0.1 },
|
|
46
|
-
{ resolution: '720p', audio: true, costPerSecond: 0.15 },
|
|
47
|
-
{ resolution: '1080p', audio: false, costPerSecond: 0.1 },
|
|
48
|
-
{ resolution: '1080p', audio: true, costPerSecond: 0.15 },
|
|
49
|
-
{ resolution: '4k', audio: false, costPerSecond: 0.3 },
|
|
50
|
-
{ resolution: '4k', audio: true, costPerSecond: 0.35 },
|
|
51
|
-
],
|
|
52
|
-
},
|
|
53
|
-
features: {
|
|
54
|
-
textToVideo: true,
|
|
55
|
-
imageToVideo: false,
|
|
56
|
-
capabilities: ['t2v'],
|
|
57
|
-
aspectRatios: ['16:9', '9:16'],
|
|
58
|
-
resolutions: ['720p', '1080p', '4k'],
|
|
59
|
-
durationRangeSec: { min: 4, max: 8 },
|
|
60
|
-
seed: true,
|
|
61
|
-
multipleVideos: true,
|
|
62
|
-
},
|
|
63
|
-
},
|
|
64
|
-
{
|
|
65
|
-
id: 'veo-3.0-generate-001',
|
|
66
|
-
name: 'Veo 3.0',
|
|
67
|
-
provider: 'google',
|
|
68
|
-
strategy: 'video',
|
|
69
|
-
released: '2025-12',
|
|
70
|
-
cost: {
|
|
71
|
-
type: 'per-video-second',
|
|
72
|
-
defaultDurationSec: 8,
|
|
73
|
-
tiers: [
|
|
74
|
-
{ resolution: '720p', audio: false, costPerSecond: 0.2 },
|
|
75
|
-
{ resolution: '720p', audio: true, costPerSecond: 0.4 },
|
|
76
|
-
{ resolution: '1080p', audio: false, costPerSecond: 0.2 },
|
|
77
|
-
{ resolution: '1080p', audio: true, costPerSecond: 0.4 },
|
|
78
|
-
],
|
|
79
|
-
},
|
|
80
|
-
features: {
|
|
81
|
-
textToVideo: true,
|
|
82
|
-
imageToVideo: false,
|
|
83
|
-
capabilities: ['t2v'],
|
|
84
|
-
aspectRatios: ['16:9', '9:16'],
|
|
85
|
-
resolutions: ['720p', '1080p'],
|
|
86
|
-
durationRangeSec: { min: 4, max: 8 },
|
|
87
|
-
seed: true,
|
|
88
|
-
multipleVideos: true,
|
|
89
|
-
},
|
|
90
|
-
},
|
|
91
|
-
{
|
|
92
|
-
id: 'veo-3.0-fast-generate-001',
|
|
93
|
-
name: 'Veo 3.0 Fast',
|
|
94
|
-
provider: 'google',
|
|
95
|
-
strategy: 'video',
|
|
96
|
-
released: '2025-12',
|
|
97
|
-
cost: {
|
|
98
|
-
type: 'per-video-second',
|
|
99
|
-
defaultDurationSec: 8,
|
|
100
|
-
tiers: [
|
|
101
|
-
{ resolution: '720p', audio: false, costPerSecond: 0.1 },
|
|
102
|
-
{ resolution: '720p', audio: true, costPerSecond: 0.15 },
|
|
103
|
-
{ resolution: '1080p', audio: false, costPerSecond: 0.1 },
|
|
104
|
-
{ resolution: '1080p', audio: true, costPerSecond: 0.15 },
|
|
105
|
-
],
|
|
106
|
-
},
|
|
107
|
-
features: {
|
|
108
|
-
textToVideo: true,
|
|
109
|
-
imageToVideo: false,
|
|
110
|
-
capabilities: ['t2v'],
|
|
111
|
-
aspectRatios: ['16:9', '9:16'],
|
|
112
|
-
resolutions: ['720p', '1080p'],
|
|
113
|
-
durationRangeSec: { min: 4, max: 8 },
|
|
114
|
-
seed: true,
|
|
115
|
-
multipleVideos: true,
|
|
116
|
-
},
|
|
117
|
-
},
|
|
118
|
-
// ── Vertex: Veo ──────────────────────────────────────────────────────
|
|
119
|
-
// Same Veo models routed through Vertex AI / Google Cloud billing.
|
|
120
|
-
// Use `egaki login --provider vertex --key <key>` to configure.
|
|
121
|
-
{
|
|
122
|
-
id: 'vertex/veo-3.1-generate-001',
|
|
123
|
-
name: 'Veo 3.1 (Vertex)',
|
|
124
|
-
provider: 'vertex',
|
|
125
|
-
strategy: 'video',
|
|
126
|
-
released: '2026-01',
|
|
127
|
-
cost: {
|
|
128
|
-
type: 'per-video-second',
|
|
129
|
-
defaultDurationSec: 8,
|
|
130
|
-
tiers: [
|
|
131
|
-
{ resolution: '720p', audio: false, costPerSecond: 0.2 },
|
|
132
|
-
{ resolution: '720p', audio: true, costPerSecond: 0.4 },
|
|
133
|
-
{ resolution: '1080p', audio: false, costPerSecond: 0.2 },
|
|
134
|
-
{ resolution: '1080p', audio: true, costPerSecond: 0.4 },
|
|
135
|
-
{ resolution: '4k', audio: false, costPerSecond: 0.4 },
|
|
136
|
-
{ resolution: '4k', audio: true, costPerSecond: 0.6 },
|
|
137
|
-
],
|
|
138
|
-
},
|
|
139
|
-
features: {
|
|
140
|
-
textToVideo: true,
|
|
141
|
-
imageToVideo: false,
|
|
142
|
-
capabilities: ['t2v'],
|
|
143
|
-
aspectRatios: ['16:9', '9:16'],
|
|
144
|
-
resolutions: ['720p', '1080p', '4k'],
|
|
145
|
-
durationRangeSec: { min: 4, max: 8 },
|
|
146
|
-
seed: true,
|
|
147
|
-
multipleVideos: true,
|
|
148
|
-
},
|
|
149
|
-
},
|
|
150
|
-
{
|
|
151
|
-
id: 'vertex/veo-3.1-fast-generate-001',
|
|
152
|
-
name: 'Veo 3.1 Fast (Vertex)',
|
|
153
|
-
provider: 'vertex',
|
|
154
|
-
strategy: 'video',
|
|
155
|
-
released: '2026-01',
|
|
156
|
-
cost: {
|
|
157
|
-
type: 'per-video-second',
|
|
158
|
-
defaultDurationSec: 8,
|
|
159
|
-
tiers: [
|
|
160
|
-
{ resolution: '720p', audio: false, costPerSecond: 0.1 },
|
|
161
|
-
{ resolution: '720p', audio: true, costPerSecond: 0.15 },
|
|
162
|
-
{ resolution: '1080p', audio: false, costPerSecond: 0.1 },
|
|
163
|
-
{ resolution: '1080p', audio: true, costPerSecond: 0.15 },
|
|
164
|
-
{ resolution: '4k', audio: false, costPerSecond: 0.3 },
|
|
165
|
-
{ resolution: '4k', audio: true, costPerSecond: 0.35 },
|
|
166
|
-
],
|
|
167
|
-
},
|
|
168
|
-
features: {
|
|
169
|
-
textToVideo: true,
|
|
170
|
-
imageToVideo: false,
|
|
171
|
-
capabilities: ['t2v'],
|
|
172
|
-
aspectRatios: ['16:9', '9:16'],
|
|
173
|
-
resolutions: ['720p', '1080p', '4k'],
|
|
174
|
-
durationRangeSec: { min: 4, max: 8 },
|
|
175
|
-
seed: true,
|
|
176
|
-
multipleVideos: true,
|
|
177
|
-
},
|
|
178
|
-
},
|
|
179
|
-
{
|
|
180
|
-
id: 'grok-imagine-video',
|
|
181
|
-
name: 'Grok Imagine Video',
|
|
182
|
-
provider: 'xai',
|
|
183
|
-
strategy: 'video',
|
|
184
|
-
released: '2026-03',
|
|
185
|
-
cost: {
|
|
186
|
-
type: 'per-video-second',
|
|
187
|
-
defaultDurationSec: 5,
|
|
188
|
-
tiers: [
|
|
189
|
-
{ resolution: '480p', costPerSecond: 0.05 },
|
|
190
|
-
{ resolution: '720p', costPerSecond: 0.07 },
|
|
191
|
-
],
|
|
192
|
-
},
|
|
193
|
-
features: {
|
|
194
|
-
textToVideo: true,
|
|
195
|
-
imageToVideo: true,
|
|
196
|
-
capabilities: ['t2v', 'i2v', 'editing'],
|
|
197
|
-
aspectRatios: ['1:1', '16:9', '9:16', '4:3', '3:4', '3:2', '2:3'],
|
|
198
|
-
resolutions: ['480p', '720p'],
|
|
199
|
-
durationRangeSec: { min: 1, max: 15 },
|
|
200
|
-
seed: false,
|
|
201
|
-
multipleVideos: false,
|
|
202
|
-
},
|
|
203
|
-
},
|
|
204
|
-
{
|
|
205
|
-
id: 'kling-v2.6-t2v',
|
|
206
|
-
name: 'Kling v2.6 T2V',
|
|
207
|
-
provider: 'klingai',
|
|
208
|
-
strategy: 'video',
|
|
209
|
-
released: '2025-12',
|
|
210
|
-
cost: {
|
|
211
|
-
type: 'per-video-second',
|
|
212
|
-
defaultDurationSec: 5,
|
|
213
|
-
tiers: [
|
|
214
|
-
{ mode: 'std', costPerSecond: 0.042 },
|
|
215
|
-
{ mode: 'pro', audio: false, costPerSecond: 0.07 },
|
|
216
|
-
{ mode: 'pro', audio: true, costPerSecond: 0.14 },
|
|
217
|
-
],
|
|
218
|
-
},
|
|
219
|
-
features: {
|
|
220
|
-
textToVideo: true,
|
|
221
|
-
imageToVideo: false,
|
|
222
|
-
capabilities: ['t2v'],
|
|
223
|
-
aspectRatios: commonRatios,
|
|
224
|
-
durationRangeSec: { min: 5, max: 10 },
|
|
225
|
-
seed: false,
|
|
226
|
-
multipleVideos: false,
|
|
227
|
-
},
|
|
228
|
-
},
|
|
229
|
-
{
|
|
230
|
-
id: 'wan-v2.6-t2v',
|
|
231
|
-
name: 'Wan v2.6 T2V',
|
|
232
|
-
provider: 'alibaba',
|
|
233
|
-
strategy: 'video',
|
|
234
|
-
released: '2026-01',
|
|
235
|
-
cost: {
|
|
236
|
-
type: 'per-video-second',
|
|
237
|
-
defaultDurationSec: 5,
|
|
238
|
-
tiers: [
|
|
239
|
-
{ resolution: '720p', costPerSecond: 0.1 },
|
|
240
|
-
{ resolution: '1080p', costPerSecond: 0.15 },
|
|
241
|
-
],
|
|
242
|
-
},
|
|
243
|
-
features: {
|
|
244
|
-
textToVideo: true,
|
|
245
|
-
imageToVideo: false,
|
|
246
|
-
capabilities: ['t2v'],
|
|
247
|
-
resolutions: ['720p', '1080p'],
|
|
248
|
-
durationRangeSec: { min: 2, max: 15 },
|
|
249
|
-
seed: false,
|
|
250
|
-
multipleVideos: false,
|
|
251
|
-
},
|
|
252
|
-
},
|
|
253
|
-
// Fal direct BYOK models — duration pricing depends on Fal endpoint/config.
|
|
254
|
-
{
|
|
255
|
-
id: 'luma-ray-2',
|
|
256
|
-
name: 'Luma Ray 2 (Fal)',
|
|
257
|
-
provider: 'fal',
|
|
258
|
-
strategy: 'video',
|
|
259
|
-
released: '2025-11',
|
|
260
|
-
cost: { type: 'unknown' },
|
|
261
|
-
features: {
|
|
262
|
-
textToVideo: true,
|
|
263
|
-
imageToVideo: true,
|
|
264
|
-
capabilities: ['t2v', 'i2v'],
|
|
265
|
-
aspectRatios: commonRatios,
|
|
266
|
-
seed: true,
|
|
267
|
-
multipleVideos: false,
|
|
268
|
-
},
|
|
269
|
-
},
|
|
270
|
-
{
|
|
271
|
-
id: 'minimax-video',
|
|
272
|
-
name: 'MiniMax Video (Fal)',
|
|
273
|
-
provider: 'fal',
|
|
274
|
-
strategy: 'video',
|
|
275
|
-
released: '2025-10',
|
|
276
|
-
cost: { type: 'unknown' },
|
|
277
|
-
features: {
|
|
278
|
-
textToVideo: true,
|
|
279
|
-
imageToVideo: false,
|
|
280
|
-
capabilities: ['t2v'],
|
|
281
|
-
aspectRatios: commonRatios,
|
|
282
|
-
seed: false,
|
|
283
|
-
multipleVideos: false,
|
|
284
|
-
},
|
|
285
|
-
},
|
|
286
|
-
{
|
|
287
|
-
id: 'hunyuan-video',
|
|
288
|
-
name: 'Hunyuan Video (Fal)',
|
|
289
|
-
provider: 'fal',
|
|
290
|
-
strategy: 'video',
|
|
291
|
-
released: '2025-09',
|
|
292
|
-
cost: { type: 'unknown' },
|
|
293
|
-
features: {
|
|
294
|
-
textToVideo: true,
|
|
295
|
-
imageToVideo: true,
|
|
296
|
-
capabilities: ['t2v', 'i2v'],
|
|
297
|
-
aspectRatios: commonRatios,
|
|
298
|
-
seed: true,
|
|
299
|
-
multipleVideos: false,
|
|
300
|
-
},
|
|
301
|
-
},
|
|
302
|
-
];
|
|
303
|
-
const videoCatalogIndex = new Map(VIDEO_CATALOG.map((m) => [m.id, m]));
|
|
304
|
-
export function findVideoModel(id) {
|
|
305
|
-
return videoCatalogIndex.get(id);
|
|
306
|
-
}
|