File size: 4,174 Bytes
eb846d0 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 |
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;
}
|