mirror of
https://github.com/samanhappy/mcphub.git
synced 2026-01-01 12:18:39 -05:00
fix: expand environment variables in database and OpenAI configuration (#162)
This commit is contained in:
143
src/utils/smartRouting.ts
Normal file
143
src/utils/smartRouting.ts
Normal file
@@ -0,0 +1,143 @@
|
||||
import { loadSettings, expandEnvVars } from '../config/index.js';
|
||||
|
||||
/**
|
||||
* Smart routing configuration interface
|
||||
*/
|
||||
export interface SmartRoutingConfig {
|
||||
enabled: boolean;
|
||||
dbUrl: string;
|
||||
openaiApiBaseUrl: string;
|
||||
openaiApiKey: string;
|
||||
openaiApiEmbeddingModel: string;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the complete smart routing configuration from environment variables and settings.
|
||||
*
|
||||
* Priority order for each setting:
|
||||
* 1. Specific environment variables (ENABLE_SMART_ROUTING, SMART_ROUTING_ENABLED, etc.)
|
||||
* 2. Generic environment variables (OPENAI_API_KEY, DATABASE_URL, etc.)
|
||||
* 3. Settings configuration (systemConfig.smartRouting)
|
||||
* 4. Default values
|
||||
*
|
||||
* @returns {SmartRoutingConfig} Complete smart routing configuration
|
||||
*/
|
||||
export function getSmartRoutingConfig(): SmartRoutingConfig {
|
||||
let settings = loadSettings();
|
||||
const smartRoutingSettings: Partial<SmartRoutingConfig> =
|
||||
settings.systemConfig?.smartRouting || {};
|
||||
|
||||
return {
|
||||
// Enabled status - check multiple environment variables
|
||||
enabled: getConfigValue(
|
||||
[process.env.SMART_ROUTING_ENABLED],
|
||||
smartRoutingSettings.enabled,
|
||||
false,
|
||||
parseBooleanEnvVar,
|
||||
),
|
||||
|
||||
// Database configuration
|
||||
dbUrl: getConfigValue([process.env.DB_URL], smartRoutingSettings.dbUrl, '', expandEnvVars),
|
||||
|
||||
// OpenAI API configuration
|
||||
openaiApiBaseUrl: getConfigValue(
|
||||
[process.env.OPENAI_API_BASE_URL],
|
||||
smartRoutingSettings.openaiApiBaseUrl,
|
||||
'https://api.openai.com/v1',
|
||||
expandEnvVars,
|
||||
),
|
||||
|
||||
openaiApiKey: getConfigValue(
|
||||
[process.env.OPENAI_API_KEY],
|
||||
smartRoutingSettings.openaiApiKey,
|
||||
'',
|
||||
expandEnvVars,
|
||||
),
|
||||
|
||||
openaiApiEmbeddingModel: getConfigValue(
|
||||
[process.env.OPENAI_API_EMBEDDING_MODEL],
|
||||
smartRoutingSettings.openaiApiEmbeddingModel,
|
||||
'text-embedding-3-small',
|
||||
expandEnvVars,
|
||||
),
|
||||
};
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets a configuration value with priority order: environment variables > settings > default.
|
||||
*
|
||||
* @param {(string | undefined)[]} envVars - Array of environment variable names to check in order
|
||||
* @param {any} settingsValue - Value from settings configuration
|
||||
* @param {any} defaultValue - Default value to use if no other value is found
|
||||
* @param {Function} transformer - Function to transform the final value to the correct type
|
||||
* @returns {any} The configuration value with the appropriate transformation applied
|
||||
*/
|
||||
function getConfigValue<T>(
|
||||
envVars: (string | undefined)[],
|
||||
settingsValue: any,
|
||||
defaultValue: T,
|
||||
transformer: (value: any) => T,
|
||||
): T {
|
||||
// Check environment variables in order
|
||||
for (const envVar of envVars) {
|
||||
if (envVar !== undefined && envVar !== null && envVar !== '') {
|
||||
try {
|
||||
return transformer(envVar);
|
||||
} catch (error) {
|
||||
console.warn(`Failed to transform environment variable "${envVar}":`, error);
|
||||
continue;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Check settings value
|
||||
if (settingsValue !== undefined && settingsValue !== null) {
|
||||
try {
|
||||
return transformer(settingsValue);
|
||||
} catch (error) {
|
||||
console.warn('Failed to transform settings value:', error);
|
||||
}
|
||||
}
|
||||
|
||||
// Return default value
|
||||
return defaultValue;
|
||||
}
|
||||
|
||||
/**
|
||||
* Parses a string environment variable value to a boolean.
|
||||
* Supports common boolean representations: true/false, 1/0, yes/no, on/off
|
||||
*
|
||||
* @param {string} value - The environment variable value to parse
|
||||
* @returns {boolean} The parsed boolean value
|
||||
*/
|
||||
function parseBooleanEnvVar(value: string): boolean {
|
||||
if (typeof value === 'boolean') {
|
||||
return value;
|
||||
}
|
||||
|
||||
if (typeof value !== 'string') {
|
||||
return false;
|
||||
}
|
||||
|
||||
const normalized = value.toLowerCase().trim();
|
||||
|
||||
// Handle common truthy values
|
||||
if (normalized === 'true' || normalized === '1' || normalized === 'yes' || normalized === 'on') {
|
||||
return true;
|
||||
}
|
||||
|
||||
// Handle common falsy values
|
||||
if (
|
||||
normalized === 'false' ||
|
||||
normalized === '0' ||
|
||||
normalized === 'no' ||
|
||||
normalized === 'off' ||
|
||||
normalized === ''
|
||||
) {
|
||||
return false;
|
||||
}
|
||||
|
||||
// Default to false for unrecognized values
|
||||
console.warn(`Unrecognized boolean value for smart routing: "${value}", defaulting to false`);
|
||||
return false;
|
||||
}
|
||||
Reference in New Issue
Block a user