@vibeframe/cli 0.92.0 → 0.93.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/CONTEXT.md +1 -1
- package/dist/index.js +76 -45
- package/package.json +3 -3
package/CONTEXT.md
CHANGED
|
@@ -92,7 +92,7 @@ export GOOGLE_API_KEY="..." # Gemini (image, video, inspect)
|
|
|
92
92
|
export OPENAI_API_KEY="..." # Whisper, DALL-E, GPT
|
|
93
93
|
export ANTHROPIC_API_KEY="..." # Claude (storyboard, grading)
|
|
94
94
|
export XAI_API_KEY="..." # Grok
|
|
95
|
-
export
|
|
95
|
+
export FAL_API_KEY="..." # Seedance video (default)
|
|
96
96
|
export ELEVENLABS_API_KEY="..." # TTS, music, sound effects
|
|
97
97
|
export KLING_API_KEY="..." # Kling video
|
|
98
98
|
export RUNWAY_API_SECRET="..." # Runway video
|
package/dist/index.js
CHANGED
|
@@ -14270,6 +14270,9 @@ function getProvidersFor(kind) {
|
|
|
14270
14270
|
function getProviderEnvVars() {
|
|
14271
14271
|
return Object.fromEntries([...apiKeyRegistry.values()].map((k) => [k.configKey, k.envVar]));
|
|
14272
14272
|
}
|
|
14273
|
+
function getProviderEnvAliases() {
|
|
14274
|
+
return Object.fromEntries([...apiKeyRegistry.values()].filter((k) => k.envAliases && k.envAliases.length > 0).map((k) => [k.envVar, k.envAliases ?? []]));
|
|
14275
|
+
}
|
|
14273
14276
|
function getCommandKeyMap() {
|
|
14274
14277
|
const map = {};
|
|
14275
14278
|
for (const p of providerRegistry2.values()) {
|
|
@@ -14377,7 +14380,8 @@ var init_api_keys = __esm({
|
|
|
14377
14380
|
});
|
|
14378
14381
|
defineApiKey({
|
|
14379
14382
|
configKey: "fal",
|
|
14380
|
-
envVar: "
|
|
14383
|
+
envVar: "FAL_API_KEY",
|
|
14384
|
+
envAliases: ["FAL_KEY"],
|
|
14381
14385
|
label: "fal.ai",
|
|
14382
14386
|
showInSetup: true,
|
|
14383
14387
|
setupDescription: "Seedance 2.0 video gen ($$, default since v0.57)",
|
|
@@ -14394,7 +14398,7 @@ var init_api_keys = __esm({
|
|
|
14394
14398
|
label: "xAI",
|
|
14395
14399
|
showInSetup: true,
|
|
14396
14400
|
setupDescription: "Grok \u2014 video gen with audio ($$), image ($), Agent",
|
|
14397
|
-
envExampleComment: "xAI API Key (Grok video generation \u2014 fallback when no
|
|
14401
|
+
envExampleComment: "xAI API Key (Grok video generation \u2014 fallback when no FAL_API_KEY)",
|
|
14398
14402
|
envExampleUrl: "https://console.x.ai/",
|
|
14399
14403
|
keyFormat: { prefix: /^xai-/, example: "xai-..." }
|
|
14400
14404
|
});
|
|
@@ -24451,7 +24455,7 @@ var init_FalProvider = __esm({
|
|
|
24451
24455
|
return {
|
|
24452
24456
|
id: "",
|
|
24453
24457
|
status: "failed",
|
|
24454
|
-
error: "fal.ai API key not configured. Set
|
|
24458
|
+
error: "fal.ai API key not configured. Set FAL_API_KEY in .env."
|
|
24455
24459
|
};
|
|
24456
24460
|
}
|
|
24457
24461
|
const variant = options?.model ?? DEFAULT_VARIANT;
|
|
@@ -25228,6 +25232,7 @@ __export(dist_exports2, {
|
|
|
25228
25232
|
getCommandKeyMap: () => getCommandKeyMap,
|
|
25229
25233
|
getDisplayLabelForApiKey: () => getDisplayLabelForApiKey,
|
|
25230
25234
|
getKeyFormat: () => getKeyFormat,
|
|
25235
|
+
getProviderEnvAliases: () => getProviderEnvAliases,
|
|
25231
25236
|
getProviderEnvVars: () => getProviderEnvVars,
|
|
25232
25237
|
getProvidersFor: () => getProvidersFor,
|
|
25233
25238
|
getSetupProviders: () => getSetupProviders,
|
|
@@ -25687,7 +25692,7 @@ function createDefaultConfig() {
|
|
|
25687
25692
|
}
|
|
25688
25693
|
};
|
|
25689
25694
|
}
|
|
25690
|
-
var PROVIDER_NAMES, PROVIDER_ENV_VARS;
|
|
25695
|
+
var PROVIDER_NAMES, PROVIDER_ENV_VARS, PROVIDER_ENV_ALIASES;
|
|
25691
25696
|
var init_schema = __esm({
|
|
25692
25697
|
"src/config/schema.ts"() {
|
|
25693
25698
|
"use strict";
|
|
@@ -25701,6 +25706,7 @@ var init_schema = __esm({
|
|
|
25701
25706
|
openrouter: "OpenRouter"
|
|
25702
25707
|
};
|
|
25703
25708
|
PROVIDER_ENV_VARS = getProviderEnvVars();
|
|
25709
|
+
PROVIDER_ENV_ALIASES = getProviderEnvAliases();
|
|
25704
25710
|
}
|
|
25705
25711
|
});
|
|
25706
25712
|
|
|
@@ -25709,6 +25715,7 @@ var config_exports = {};
|
|
|
25709
25715
|
__export(config_exports, {
|
|
25710
25716
|
CONFIG_DIR: () => CONFIG_DIR,
|
|
25711
25717
|
CONFIG_PATH: () => CONFIG_PATH,
|
|
25718
|
+
PROVIDER_ENV_ALIASES: () => PROVIDER_ENV_ALIASES,
|
|
25712
25719
|
PROVIDER_ENV_VARS: () => PROVIDER_ENV_VARS,
|
|
25713
25720
|
PROVIDER_NAMES: () => PROVIDER_NAMES,
|
|
25714
25721
|
USER_CONFIG_DIR: () => USER_CONFIG_DIR,
|
|
@@ -25823,7 +25830,7 @@ async function isConfigured() {
|
|
|
25823
25830
|
return true;
|
|
25824
25831
|
}
|
|
25825
25832
|
const envVar = PROVIDER_ENV_VARS[providerKey];
|
|
25826
|
-
if (envVar &&
|
|
25833
|
+
if (envVar && getEnvValue(envVar)) {
|
|
25827
25834
|
return true;
|
|
25828
25835
|
}
|
|
25829
25836
|
return false;
|
|
@@ -25834,9 +25841,12 @@ async function getApiKeyFromConfig(providerKey) {
|
|
|
25834
25841
|
return config2.providers[providerKey];
|
|
25835
25842
|
}
|
|
25836
25843
|
const envVar = PROVIDER_ENV_VARS[providerKey];
|
|
25837
|
-
if (envVar) return
|
|
25844
|
+
if (envVar) return getEnvValue(envVar);
|
|
25838
25845
|
return void 0;
|
|
25839
25846
|
}
|
|
25847
|
+
function getEnvValue(envVar) {
|
|
25848
|
+
return process.env[envVar] || PROVIDER_ENV_ALIASES[envVar]?.map((alias) => process.env[alias]).find(Boolean);
|
|
25849
|
+
}
|
|
25840
25850
|
async function updateProviderKey(providerKey, apiKey, options = {}) {
|
|
25841
25851
|
const scope = options.scope ?? await getActiveScope(options.cwd);
|
|
25842
25852
|
let config2 = await loadConfig({ scope, cwd: options.cwd });
|
|
@@ -25862,6 +25872,12 @@ var init_config = __esm({
|
|
|
25862
25872
|
import { createInterface } from "node:readline";
|
|
25863
25873
|
import { readFile as readFile3, writeFile as writeFile3, access as access3 } from "node:fs/promises";
|
|
25864
25874
|
import { resolve as resolve5 } from "node:path";
|
|
25875
|
+
function providerKeyForEnvVar(envVar) {
|
|
25876
|
+
return PROVIDER_KEY_BY_ENV_VAR[envVar];
|
|
25877
|
+
}
|
|
25878
|
+
function getEnvValue2(envVar) {
|
|
25879
|
+
return process.env[envVar] || PROVIDER_ENV_ALIASES[envVar]?.map((alias) => process.env[alias]).find(Boolean);
|
|
25880
|
+
}
|
|
25865
25881
|
function loadEnv() {
|
|
25866
25882
|
(0, import_dotenv.config)({ path: resolve5(process.cwd(), ".env"), debug: false, quiet: true });
|
|
25867
25883
|
const monorepoRoot = findMonorepoRoot();
|
|
@@ -25924,19 +25940,7 @@ async function getApiKey(envVar, providerName, optionValue) {
|
|
|
25924
25940
|
if (optionValue) {
|
|
25925
25941
|
return optionValue;
|
|
25926
25942
|
}
|
|
25927
|
-
const
|
|
25928
|
-
ANTHROPIC_API_KEY: "anthropic",
|
|
25929
|
-
OPENAI_API_KEY: "openai",
|
|
25930
|
-
GOOGLE_API_KEY: "google",
|
|
25931
|
-
XAI_API_KEY: "xai",
|
|
25932
|
-
ELEVENLABS_API_KEY: "elevenlabs",
|
|
25933
|
-
RUNWAY_API_SECRET: "runway",
|
|
25934
|
-
KLING_API_KEY: "kling",
|
|
25935
|
-
OPENROUTER_API_KEY: "openrouter",
|
|
25936
|
-
IMGBB_API_KEY: "imgbb",
|
|
25937
|
-
REPLICATE_API_TOKEN: "replicate"
|
|
25938
|
-
};
|
|
25939
|
-
const providerKey = providerKeyMap[envVar];
|
|
25943
|
+
const providerKey = providerKeyForEnvVar(envVar);
|
|
25940
25944
|
if (providerKey) {
|
|
25941
25945
|
const configKey = await getApiKeyFromConfig(providerKey);
|
|
25942
25946
|
if (configKey) {
|
|
@@ -25944,7 +25948,7 @@ async function getApiKey(envVar, providerName, optionValue) {
|
|
|
25944
25948
|
}
|
|
25945
25949
|
}
|
|
25946
25950
|
loadEnv();
|
|
25947
|
-
const envValue =
|
|
25951
|
+
const envValue = getEnvValue2(envVar);
|
|
25948
25952
|
if (envValue) {
|
|
25949
25953
|
return envValue;
|
|
25950
25954
|
}
|
|
@@ -25970,7 +25974,7 @@ async function getApiKey(envVar, providerName, optionValue) {
|
|
|
25970
25974
|
}
|
|
25971
25975
|
function hasApiKey(envVar) {
|
|
25972
25976
|
loadEnv();
|
|
25973
|
-
return !!
|
|
25977
|
+
return !!getEnvValue2(envVar);
|
|
25974
25978
|
}
|
|
25975
25979
|
async function requireApiKey(envVar, providerName, cliOverride) {
|
|
25976
25980
|
const key = await getApiKey(envVar, providerName, cliOverride);
|
|
@@ -25999,19 +26003,35 @@ async function saveApiKeyToEnv(envVar, apiKey) {
|
|
|
25999
26003
|
}
|
|
26000
26004
|
await writeFile3(envPath, content, "utf-8");
|
|
26001
26005
|
}
|
|
26002
|
-
var import_dotenv, API_KEY_URLS, ApiKeyError;
|
|
26006
|
+
var import_dotenv, PROVIDER_KEY_BY_ENV_VAR, API_KEY_URLS, ApiKeyError;
|
|
26003
26007
|
var init_api_key = __esm({
|
|
26004
26008
|
"src/utils/api-key.ts"() {
|
|
26005
26009
|
"use strict";
|
|
26006
26010
|
import_dotenv = __toESM(require_main(), 1);
|
|
26007
26011
|
init_source();
|
|
26008
26012
|
init_config();
|
|
26013
|
+
PROVIDER_KEY_BY_ENV_VAR = {
|
|
26014
|
+
ANTHROPIC_API_KEY: "anthropic",
|
|
26015
|
+
OPENAI_API_KEY: "openai",
|
|
26016
|
+
GOOGLE_API_KEY: "google",
|
|
26017
|
+
XAI_API_KEY: "xai",
|
|
26018
|
+
ELEVENLABS_API_KEY: "elevenlabs",
|
|
26019
|
+
FAL_API_KEY: "fal",
|
|
26020
|
+
FAL_KEY: "fal",
|
|
26021
|
+
RUNWAY_API_SECRET: "runway",
|
|
26022
|
+
KLING_API_KEY: "kling",
|
|
26023
|
+
OPENROUTER_API_KEY: "openrouter",
|
|
26024
|
+
IMGBB_API_KEY: "imgbb",
|
|
26025
|
+
REPLICATE_API_TOKEN: "replicate"
|
|
26026
|
+
};
|
|
26009
26027
|
API_KEY_URLS = {
|
|
26010
26028
|
GOOGLE_API_KEY: "https://aistudio.google.com/apikey",
|
|
26011
26029
|
OPENAI_API_KEY: "https://platform.openai.com/api-keys",
|
|
26012
26030
|
ANTHROPIC_API_KEY: "https://console.anthropic.com/settings/keys",
|
|
26013
26031
|
XAI_API_KEY: "https://console.x.ai",
|
|
26014
26032
|
ELEVENLABS_API_KEY: "https://elevenlabs.io/app/settings/api-keys",
|
|
26033
|
+
FAL_API_KEY: "https://fal.ai/dashboard/keys",
|
|
26034
|
+
FAL_KEY: "https://fal.ai/dashboard/keys",
|
|
26015
26035
|
RUNWAY_API_SECRET: "https://app.runwayml.com/settings/api-keys",
|
|
26016
26036
|
KLING_API_KEY: "https://klingai.com/dev",
|
|
26017
26037
|
REPLICATE_API_TOKEN: "https://replicate.com/account/api-tokens",
|
|
@@ -33417,7 +33437,7 @@ async function loadProviderDefaults() {
|
|
|
33417
33437
|
configProviderKeys = null;
|
|
33418
33438
|
}
|
|
33419
33439
|
}
|
|
33420
|
-
function
|
|
33440
|
+
function providerKeyForEnvVar2(envVar) {
|
|
33421
33441
|
const envVars = getProviderEnvVars();
|
|
33422
33442
|
for (const [providerKey, candidateEnvVar] of Object.entries(envVars)) {
|
|
33423
33443
|
if (candidateEnvVar === envVar) return providerKey;
|
|
@@ -33427,7 +33447,7 @@ function providerKeyForEnvVar(envVar) {
|
|
|
33427
33447
|
function hasCandidateKey(candidate) {
|
|
33428
33448
|
if (candidate.envVar === null) return true;
|
|
33429
33449
|
if (hasApiKey(candidate.envVar)) return true;
|
|
33430
|
-
const providerKey =
|
|
33450
|
+
const providerKey = providerKeyForEnvVar2(candidate.envVar);
|
|
33431
33451
|
return providerKey ? Boolean(configProviderKeys?.has(providerKey)) : false;
|
|
33432
33452
|
}
|
|
33433
33453
|
function resolveProvider(category) {
|
|
@@ -35229,7 +35249,7 @@ function registerVideoCommand(parent) {
|
|
|
35229
35249
|
"Provider: seedance (ByteDance Seedance 2.0 via fal.ai), grok, kling, runway, veo. `fal` is a deprecated v0.x alias for seedance and will be removed in 1.0."
|
|
35230
35250
|
).option(
|
|
35231
35251
|
"-k, --api-key <key>",
|
|
35232
|
-
"API key (or set
|
|
35252
|
+
"API key (or set FAL_API_KEY / XAI_API_KEY / RUNWAY_API_SECRET / KLING_API_KEY / GOOGLE_API_KEY env)"
|
|
35233
35253
|
).option("-o, --output <path>", "Output file path (downloads video)").option("-i, --image <path>", "Reference image for image-to-video").option(
|
|
35234
35254
|
"-d, --duration <sec>",
|
|
35235
35255
|
"Duration in seconds. Seedance accepts 4-15; Kling accepts 5 or 10; Veo maps to 6 or 8.",
|
|
@@ -35252,7 +35272,7 @@ function registerVideoCommand(parent) {
|
|
|
35252
35272
|
"after",
|
|
35253
35273
|
`
|
|
35254
35274
|
Examples:
|
|
35255
|
-
$ vibe generate video "dancing cat" -o cat.mp4 # Seedance when
|
|
35275
|
+
$ vibe generate video "dancing cat" -o cat.mp4 # Seedance when FAL_API_KEY is set
|
|
35256
35276
|
$ vibe gen vid "cinematic city timelapse" -o city.mp4 -p seedance # Seedance via fal.ai
|
|
35257
35277
|
$ vibe gen vid "city timelapse" -o city.mp4 -p kling # Kling
|
|
35258
35278
|
$ vibe gen vid "epic scene" -i frame.png -o out.mp4 -p runway # Image-to-video
|
|
@@ -35295,7 +35315,7 @@ Examples:
|
|
|
35295
35315
|
veo: "GOOGLE_API_KEY",
|
|
35296
35316
|
kling: "KLING_API_KEY",
|
|
35297
35317
|
runway: "RUNWAY_API_SECRET",
|
|
35298
|
-
seedance: "
|
|
35318
|
+
seedance: "FAL_API_KEY"
|
|
35299
35319
|
};
|
|
35300
35320
|
let provider;
|
|
35301
35321
|
if (options.provider) {
|
|
@@ -35398,7 +35418,7 @@ Examples:
|
|
|
35398
35418
|
kling: "KLING_API_KEY",
|
|
35399
35419
|
veo: "GOOGLE_API_KEY",
|
|
35400
35420
|
grok: "XAI_API_KEY",
|
|
35401
|
-
seedance: "
|
|
35421
|
+
seedance: "FAL_API_KEY"
|
|
35402
35422
|
};
|
|
35403
35423
|
const providerNameMap = {
|
|
35404
35424
|
runway: "Runway",
|
|
@@ -35777,7 +35797,7 @@ var init_generate = __esm({
|
|
|
35777
35797
|
Examples:
|
|
35778
35798
|
$ vibe generate image "a sunset over the ocean" -o sunset.png
|
|
35779
35799
|
$ vibe generate image "logo design" -o logo.png -p openai
|
|
35780
|
-
$ vibe generate video "dancing cat" -o cat.mp4 # Seedance when
|
|
35800
|
+
$ vibe generate video "dancing cat" -o cat.mp4 # Seedance when FAL_API_KEY is set
|
|
35781
35801
|
$ vibe generate video "city timelapse" -o city.mp4 -p seedance # Seedance via fal.ai
|
|
35782
35802
|
$ vibe generate video "city timelapse" -o city.mp4 -p kling # Kling
|
|
35783
35803
|
$ vibe generate video "epic scene" -i frame.png -o out.mp4 -p runway # Image-to-video
|
|
@@ -35788,7 +35808,7 @@ Examples:
|
|
|
35788
35808
|
API Keys (per provider):
|
|
35789
35809
|
GOOGLE_API_KEY Image (default), Veo video
|
|
35790
35810
|
OPENAI_API_KEY Image (-p openai)
|
|
35791
|
-
|
|
35811
|
+
FAL_API_KEY Seedance video (-p seedance, default video)
|
|
35792
35812
|
XAI_API_KEY Grok image/video
|
|
35793
35813
|
KLING_API_KEY Kling video (-p kling)
|
|
35794
35814
|
RUNWAY_API_SECRET Runway video (-p runway)
|
|
@@ -52806,10 +52826,11 @@ async function executeVideoGenerate(options) {
|
|
|
52806
52826
|
runway: "RUNWAY_API_SECRET",
|
|
52807
52827
|
kling: "KLING_API_KEY",
|
|
52808
52828
|
veo: "GOOGLE_API_KEY",
|
|
52809
|
-
seedance: "
|
|
52810
|
-
fal: "
|
|
52829
|
+
seedance: "FAL_API_KEY",
|
|
52830
|
+
fal: "FAL_API_KEY"
|
|
52811
52831
|
};
|
|
52812
|
-
const
|
|
52832
|
+
const envKey = envKeyMap[provider] || "";
|
|
52833
|
+
const key = apiKey || (hasApiKey(envKey) ? process.env[envKey] || (envKey === "FAL_API_KEY" ? process.env.FAL_KEY : void 0) : void 0);
|
|
52813
52834
|
if (!key) return { success: false, error: `${envKeyMap[provider]} required for ${provider}` };
|
|
52814
52835
|
let referenceImage;
|
|
52815
52836
|
let referenceImageBuffer;
|
|
@@ -53206,6 +53227,7 @@ var init_ai_video = __esm({
|
|
|
53206
53227
|
init_dist2();
|
|
53207
53228
|
init_upload_host();
|
|
53208
53229
|
init_ai_helpers();
|
|
53230
|
+
init_api_key();
|
|
53209
53231
|
}
|
|
53210
53232
|
});
|
|
53211
53233
|
|
|
@@ -63425,7 +63447,7 @@ init_source();
|
|
|
63425
63447
|
// package.json
|
|
63426
63448
|
var package_default = {
|
|
63427
63449
|
name: "@vibeframe/cli",
|
|
63428
|
-
version: "0.
|
|
63450
|
+
version: "0.93.0",
|
|
63429
63451
|
description: "VibeFrame CLI - natural language video editing from the terminal",
|
|
63430
63452
|
private: false,
|
|
63431
63453
|
license: "MIT",
|
|
@@ -70423,6 +70445,13 @@ var VALID_LLM_PROVIDERS = [
|
|
|
70423
70445
|
"openrouter"
|
|
70424
70446
|
];
|
|
70425
70447
|
var VALID_SCOPES = ["user", "project"];
|
|
70448
|
+
function envValueFor(meta) {
|
|
70449
|
+
return process.env[meta.envVar] || meta.envAliases?.map((alias) => process.env[alias]).find(Boolean);
|
|
70450
|
+
}
|
|
70451
|
+
function envValueForName(envVar) {
|
|
70452
|
+
if (envVar === "FAL_API_KEY") return process.env.FAL_API_KEY || process.env.FAL_KEY;
|
|
70453
|
+
return process.env[envVar];
|
|
70454
|
+
}
|
|
70426
70455
|
function parseScope(raw) {
|
|
70427
70456
|
const v = String(raw ?? "user");
|
|
70428
70457
|
if (!VALID_SCOPES.includes(v)) {
|
|
@@ -70569,7 +70598,7 @@ var AI_FEATURES = [
|
|
|
70569
70598
|
keys: [
|
|
70570
70599
|
{
|
|
70571
70600
|
configKey: "fal",
|
|
70572
|
-
envVar: "
|
|
70601
|
+
envVar: "FAL_API_KEY",
|
|
70573
70602
|
name: "Seedance 2.0 (via fal.ai)",
|
|
70574
70603
|
url: "https://fal.ai/dashboard/keys",
|
|
70575
70604
|
what: "ByteDance Seedance 2.0 text-to-video and image-to-video"
|
|
@@ -70581,7 +70610,7 @@ var AI_FEATURES = [
|
|
|
70581
70610
|
desc: "recommended default, text-to-video + image-to-video",
|
|
70582
70611
|
key: {
|
|
70583
70612
|
configKey: "fal",
|
|
70584
|
-
envVar: "
|
|
70613
|
+
envVar: "FAL_API_KEY",
|
|
70585
70614
|
name: "Seedance 2.0 (via fal.ai)",
|
|
70586
70615
|
url: "https://fal.ai/dashboard/keys",
|
|
70587
70616
|
what: "ByteDance Seedance 2.0 text-to-video and image-to-video"
|
|
@@ -70890,7 +70919,7 @@ async function runNonInteractiveSetup(opts) {
|
|
|
70890
70919
|
if (opts.importEnv) {
|
|
70891
70920
|
loadEnv();
|
|
70892
70921
|
for (const meta of getAllApiKeys()) {
|
|
70893
|
-
const envValue =
|
|
70922
|
+
const envValue = envValueFor(meta);
|
|
70894
70923
|
if (!envValue) continue;
|
|
70895
70924
|
const existing = config2.providers[meta.configKey];
|
|
70896
70925
|
if (existing === envValue) continue;
|
|
@@ -71020,7 +71049,7 @@ async function runSetupWizard(fullSetup = false, scope = "user") {
|
|
|
71020
71049
|
},
|
|
71021
71050
|
{
|
|
71022
71051
|
configKey: "fal",
|
|
71023
|
-
envVar: "
|
|
71052
|
+
envVar: "FAL_API_KEY",
|
|
71024
71053
|
name: "fal.ai",
|
|
71025
71054
|
url: "https://fal.ai/dashboard/keys",
|
|
71026
71055
|
what: "Seedance 2.0 \u2014 video generation, default since v0.57"
|
|
@@ -71231,7 +71260,7 @@ async function runAIFeaturesSetup(config2, _scope) {
|
|
|
71231
71260
|
}
|
|
71232
71261
|
loadEnv();
|
|
71233
71262
|
const configValue = config2.providers[keyDef.configKey];
|
|
71234
|
-
const envValue =
|
|
71263
|
+
const envValue = envValueForName(keyDef.envVar);
|
|
71235
71264
|
if (configValue || envValue) {
|
|
71236
71265
|
const value = configValue || envValue;
|
|
71237
71266
|
const source = configValue ? "config" : ".env";
|
|
@@ -71279,7 +71308,7 @@ async function collectKeys(config2, keys) {
|
|
|
71279
71308
|
loadEnv();
|
|
71280
71309
|
for (const keyDef of keys) {
|
|
71281
71310
|
const configValue = config2.providers[keyDef.configKey];
|
|
71282
|
-
const envValue =
|
|
71311
|
+
const envValue = envValueForName(keyDef.envVar);
|
|
71283
71312
|
if (configValue) {
|
|
71284
71313
|
console.log(
|
|
71285
71314
|
` ${source_default.green("\u2713")} ${keyDef.name.padEnd(14)} ${maskApiKey(configValue)} ${source_default.dim("(config)")}`
|
|
@@ -71540,7 +71569,7 @@ async function showConfig(opts = { verbose: false }) {
|
|
|
71540
71569
|
{ key: "openai", name: "OpenAI", env: "OPENAI_API_KEY" },
|
|
71541
71570
|
{ key: "google", name: "Google", env: "GOOGLE_API_KEY" },
|
|
71542
71571
|
{ key: "xai", name: "xAI", env: "XAI_API_KEY" },
|
|
71543
|
-
{ key: "fal", name: "fal.ai", env: "
|
|
71572
|
+
{ key: "fal", name: "fal.ai", env: "FAL_API_KEY" },
|
|
71544
71573
|
{ key: "elevenlabs", name: "ElevenLabs", env: "ELEVENLABS_API_KEY" },
|
|
71545
71574
|
{ key: "runway", name: "Runway", env: "RUNWAY_API_SECRET" },
|
|
71546
71575
|
{ key: "kling", name: "Kling", env: "KLING_API_KEY" },
|
|
@@ -71551,7 +71580,7 @@ async function showConfig(opts = { verbose: false }) {
|
|
|
71551
71580
|
let unsetCount = 0;
|
|
71552
71581
|
for (const p of providerKeys) {
|
|
71553
71582
|
const configValue = config2?.providers[p.key];
|
|
71554
|
-
const dotenvValue = dotenvKeys[p.env];
|
|
71583
|
+
const dotenvValue = dotenvKeys[p.env] || (p.env === "FAL_API_KEY" ? dotenvKeys.FAL_KEY : void 0);
|
|
71555
71584
|
if (configValue || dotenvValue) {
|
|
71556
71585
|
const sources = [];
|
|
71557
71586
|
if (configValue) sources.push("config");
|
|
@@ -71847,7 +71876,7 @@ OPENROUTER_API_KEY= # multiplexes any provider above
|
|
|
71847
71876
|
|
|
71848
71877
|
# \u2500\u2500 Media providers \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500
|
|
71849
71878
|
ELEVENLABS_API_KEY= # paid TTS / SFX / music (Kokoro is the free fallback)
|
|
71850
|
-
|
|
71879
|
+
FAL_API_KEY= # Seedance 2.0 \u2014 default video provider since v0.57
|
|
71851
71880
|
IMGBB_API_KEY= # image hosting for Seedance/Kling image-to-video
|
|
71852
71881
|
RUNWAY_API_SECRET= # Runway Gen-4.5 video
|
|
71853
71882
|
KLING_API_KEY= # Kling video
|
|
@@ -72722,7 +72751,9 @@ async function runDiagnostics() {
|
|
|
72722
72751
|
let readyCount = FREE_COMMANDS.length;
|
|
72723
72752
|
let totalCount = FREE_COMMANDS.length;
|
|
72724
72753
|
for (const [envVar, commands] of Object.entries(COMMAND_KEY_MAP)) {
|
|
72725
|
-
const configured =
|
|
72754
|
+
const configured = Boolean(
|
|
72755
|
+
process.env[envVar] || PROVIDER_ENV_ALIASES[envVar]?.map((alias) => process.env[alias]).find(Boolean)
|
|
72756
|
+
);
|
|
72726
72757
|
const providerName = Object.entries(PROVIDER_ENV_VARS).find(([, v]) => v === envVar)?.[0] ?? envVar;
|
|
72727
72758
|
providers[providerName] = { envVar, configured, commands };
|
|
72728
72759
|
totalCount += commands.length;
|
|
@@ -73011,7 +73042,7 @@ async function runLiveKeyTests(results) {
|
|
|
73011
73042
|
}
|
|
73012
73043
|
const { testKey: testKey2 } = await Promise.resolve().then(() => (init_key_live_test(), key_live_test_exports));
|
|
73013
73044
|
for (const [name, info] of configured) {
|
|
73014
|
-
const value = process.env[info.envVar];
|
|
73045
|
+
const value = process.env[info.envVar] || PROVIDER_ENV_ALIASES[info.envVar]?.map((alias) => process.env[alias]).find(Boolean);
|
|
73015
73046
|
if (!value) continue;
|
|
73016
73047
|
process.stdout.write(` ${name.padEnd(12)} `);
|
|
73017
73048
|
const result = await testKey2(name, value);
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@vibeframe/cli",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.93.0",
|
|
4
4
|
"description": "VibeFrame CLI - natural language video editing from the terminal",
|
|
5
5
|
"private": false,
|
|
6
6
|
"license": "MIT",
|
|
@@ -183,8 +183,8 @@
|
|
|
183
183
|
"tsx": "^4.21.0",
|
|
184
184
|
"typescript": "^5.3.3",
|
|
185
185
|
"vitest": "^1.2.2",
|
|
186
|
-
"@vibeframe/
|
|
187
|
-
"@vibeframe/
|
|
186
|
+
"@vibeframe/ai-providers": "0.93.0",
|
|
187
|
+
"@vibeframe/core": "0.93.0"
|
|
188
188
|
},
|
|
189
189
|
"engines": {
|
|
190
190
|
"node": ">=20"
|