const path = require('path'); const { logger } = require('@librechat/data-schemas'); const { loadServiceKey, isUserProvided } = require('@librechat/api'); const { EModelEndpoint } = require('librechat-data-provider'); const { config } = require('./EndpointService'); const { openAIApiKey, azureOpenAIApiKey, useAzurePlugins, userProvidedOpenAI, googleKey } = config; /** * Load async endpoints and return a configuration object * @param {Express.Request} req - The request object */ async function loadAsyncEndpoints(req) { let serviceKey, googleUserProvides; /** Check if GOOGLE_KEY is provided at all(including 'user_provided') */ const isGoogleKeyProvided = googleKey && googleKey.trim() !== ''; if (isGoogleKeyProvided) { /** If GOOGLE_KEY is provided, check if it's user_provided */ googleUserProvides = isUserProvided(googleKey); } else { /** Only attempt to load service key if GOOGLE_KEY is not provided */ const serviceKeyPath = process.env.GOOGLE_SERVICE_KEY_FILE_PATH || path.join(__dirname, '../../..', 'data', 'auth.json'); try { serviceKey = await loadServiceKey(serviceKeyPath); } catch (error) { logger.error('Error loading service key', error); serviceKey = null; } } const google = serviceKey || isGoogleKeyProvided ? { userProvide: googleUserProvides } : false; const useAzure = req.app.locals[EModelEndpoint.azureOpenAI]?.plugins; const gptPlugins = useAzure || openAIApiKey || azureOpenAIApiKey ? { availableAgents: ['classic', 'functions'], userProvide: useAzure ? false : userProvidedOpenAI, userProvideURL: useAzure ? false : config[EModelEndpoint.openAI]?.userProvideURL || config[EModelEndpoint.azureOpenAI]?.userProvideURL, azure: useAzurePlugins || useAzure, } : false; return { google, gptPlugins }; } module.exports = loadAsyncEndpoints;