Files
2026-07-13 13:08:41 +08:00

214 lines
4.8 KiB
JavaScript

const VALID_LLM_PROVIDERS = new Set([
"ollama",
"openai",
"deepseek",
"google",
"vertex",
"azure",
"bedrock",
"openrouter",
"fireworks",
"together",
"cerebras",
"anthropic",
"litellm",
"lmstudio",
"custom",
"codex",
]);
const USER_CONFIG_ENV_KEYS = [
"LLM",
"OPENAI_API_KEY",
"OPENAI_MODEL",
"DEEPSEEK_API_KEY",
"DEEPSEEK_MODEL",
"DEEPSEEK_BASE_URL",
"GOOGLE_API_KEY",
"GOOGLE_MODEL",
"VERTEX_API_KEY",
"VERTEX_MODEL",
"VERTEX_PROJECT",
"VERTEX_LOCATION",
"VERTEX_BASE_URL",
"AZURE_OPENAI_API_KEY",
"AZURE_OPENAI_MODEL",
"AZURE_OPENAI_ENDPOINT",
"AZURE_OPENAI_BASE_URL",
"AZURE_OPENAI_API_VERSION",
"AZURE_OPENAI_DEPLOYMENT",
"BEDROCK_REGION",
"BEDROCK_API_KEY",
"BEDROCK_AWS_ACCESS_KEY_ID",
"BEDROCK_AWS_SECRET_ACCESS_KEY",
"BEDROCK_AWS_SESSION_TOKEN",
"BEDROCK_PROFILE_NAME",
"BEDROCK_MODEL",
"OPENROUTER_API_KEY",
"OPENROUTER_MODEL",
"OPENROUTER_BASE_URL",
"FIREWORKS_API_KEY",
"FIREWORKS_MODEL",
"FIREWORKS_BASE_URL",
"TOGETHER_API_KEY",
"TOGETHER_MODEL",
"TOGETHER_BASE_URL",
"CEREBRAS_API_KEY",
"CEREBRAS_MODEL",
"CEREBRAS_BASE_URL",
"OLLAMA_URL",
"OLLAMA_MODEL",
"ANTHROPIC_API_KEY",
"ANTHROPIC_MODEL",
"CUSTOM_LLM_URL",
"CUSTOM_LLM_API_KEY",
"CUSTOM_MODEL",
"LITELLM_BASE_URL",
"LITELLM_API_KEY",
"LITELLM_MODEL",
"LMSTUDIO_BASE_URL",
"LMSTUDIO_API_KEY",
"LMSTUDIO_MODEL",
"PEXELS_API_KEY",
"PIXABAY_API_KEY",
"IMAGE_PROVIDER",
"DISABLE_IMAGE_GENERATION",
"DISABLE_THINKING",
"EXTENDED_REASONING",
"WEB_GROUNDING",
"WEB_SEARCH_PROVIDER",
"WEB_SEARCH_MAX_RESULTS",
"SEARXNG_BASE_URL",
"TAVILY_API_KEY",
"EXA_API_KEY",
"BRAVE_SEARCH_API_KEY",
"SERPER_API_KEY",
"USE_CUSTOM_URL",
"COMFYUI_URL",
"COMFYUI_WORKFLOW",
"OPEN_WEBUI_IMAGE_URL",
"OPEN_WEBUI_IMAGE_API_KEY",
"OPENAI_COMPAT_IMAGE_BASE_URL",
"OPENAI_COMPAT_IMAGE_API_KEY",
"OPENAI_COMPAT_IMAGE_MODEL",
"DALL_E_3_QUALITY",
"GPT_IMAGE_1_5_QUALITY",
"CODEX_MODEL",
"CODEX_ACCESS_TOKEN",
"CODEX_REFRESH_TOKEN",
"CODEX_TOKEN_EXPIRES",
"CODEX_ACCOUNT_ID",
"CODEX_USERNAME",
"CODEX_EMAIL",
"CODEX_IS_PRO",
"DISABLE_ANONYMOUS_TRACKING",
];
const BOOLEAN_CONFIG_KEYS = new Set([
"DISABLE_IMAGE_GENERATION",
"DISABLE_THINKING",
"EXTENDED_REASONING",
"WEB_GROUNDING",
"USE_CUSTOM_URL",
"CODEX_IS_PRO",
]);
const envValue = (env, key) => {
const value = env[key];
return value === undefined || value === "" ? undefined : value;
};
const parseBooleanLike = (value) => {
if (typeof value === "boolean") {
return value;
}
if (typeof value !== "string") {
return undefined;
}
const normalized = value.trim().toLowerCase();
if (["1", "true", "yes", "on"].includes(normalized)) {
return true;
}
if (["0", "false", "no", "off"].includes(normalized)) {
return false;
}
return undefined;
};
const readUserConfigEnv = (env) => {
const config = {};
for (const key of USER_CONFIG_ENV_KEYS) {
const value = envValue(env, key);
if (value !== undefined) {
config[key] = value;
}
}
return config;
};
const normalizeConfigTypes = (config) => {
for (const key of BOOLEAN_CONFIG_KEYS) {
const parsedValue = parseBooleanLike(config[key]);
if (parsedValue !== undefined) {
config[key] = parsedValue;
}
}
return config;
};
const normalizeImageConfig = (config) => {
if (config.DISABLE_IMAGE_GENERATION || config.IMAGE_PROVIDER) {
return config;
}
if (
config.OPENAI_COMPAT_IMAGE_BASE_URL &&
config.OPENAI_COMPAT_IMAGE_API_KEY &&
config.OPENAI_COMPAT_IMAGE_MODEL
) {
config.IMAGE_PROVIDER = "openai_compatible";
} else if (config.OPEN_WEBUI_IMAGE_URL) {
config.IMAGE_PROVIDER = "open_webui";
} else if (config.COMFYUI_URL) {
config.IMAGE_PROVIDER = "comfyui";
} else if (config.PEXELS_API_KEY) {
config.IMAGE_PROVIDER = "pexels";
} else if (config.PIXABAY_API_KEY) {
config.IMAGE_PROVIDER = "pixabay";
} else if (config.LLM === "openai" && config.OPENAI_API_KEY) {
config.IMAGE_PROVIDER = "gpt-image-1.5";
config.GPT_IMAGE_1_5_QUALITY = config.GPT_IMAGE_1_5_QUALITY || "medium";
} else if (config.LLM === "google" && config.GOOGLE_API_KEY) {
config.IMAGE_PROVIDER = "gemini_flash";
} else {
config.DISABLE_IMAGE_GENERATION = true;
}
return config;
};
const sanitizeExistingConfig = (existingConfig) => {
const config = { ...existingConfig };
if (config.LLM && !VALID_LLM_PROVIDERS.has(config.LLM)) {
delete config.LLM;
}
return config;
};
const buildUserConfigFromEnv = (existingConfig = {}, env = process.env) =>
normalizeImageConfig(
normalizeConfigTypes({
...sanitizeExistingConfig(existingConfig),
...readUserConfigEnv(env),
})
);
export {
buildUserConfigFromEnv,
parseBooleanLike,
readUserConfigEnv,
USER_CONFIG_ENV_KEYS,
VALID_LLM_PROVIDERS,
};