mirror of
https://github.com/danny-avila/LibreChat.git
synced 2025-12-18 09:20:15 +01:00
* 🔧 refactor: Update MCP connection handling to improve performance and testing * refactor: Replace getAll() with getLoaded() in MCP.js to prevent unnecessary connection creation for user-context servers. * test: Adjust MCP.spec.js to mock getLoaded() instead of getAll() for consistency with the new implementation. * feat: Enhance MCPServersInitializer to reset initialization flag for better handling of process restarts and stale data. * test: Add integration tests to verify re-initialization behavior and ensure stale data is cleared when necessary. * 🔧 refactor: Enhance cached endpoints config handling for GPT plugins * refactor: Update MCPServersInitializer tests to use new server management methods * refactor: Replace direct Redis server manipulation with registry.addServer and registry.getServerConfig for better abstraction and consistency. * test: Adjust integration tests to verify server initialization and stale data handling using the updated methods. * 🔧 refactor: Increase retry limits and delay for MCP server creation * Updated MAX_CREATE_RETRIES from 3 to 5 to allow for more attempts during server creation. * Increased RETRY_BASE_DELAY_MS from 10 to 25 milliseconds to provide a longer wait time between retries, improving stability in server initialization. * refactor: Update MCPServersInitializer tests to utilize new registry methods * refactor: Replace direct access to sharedAppServers with registry.getServerConfig for improved abstraction. * test: Adjust tests to verify server initialization and stale data handling using the updated registry methods, ensuring consistency and clarity in the test structure.
125 lines
3.9 KiB
JavaScript
125 lines
3.9 KiB
JavaScript
const { loadCustomEndpointsConfig } = require('@librechat/api');
|
|
const {
|
|
CacheKeys,
|
|
EModelEndpoint,
|
|
isAgentsEndpoint,
|
|
orderEndpointsConfig,
|
|
defaultAgentCapabilities,
|
|
} = require('librechat-data-provider');
|
|
const loadDefaultEndpointsConfig = require('./loadDefaultEConfig');
|
|
const getLogStores = require('~/cache/getLogStores');
|
|
const { getAppConfig } = require('./app');
|
|
|
|
/**
|
|
*
|
|
* @param {ServerRequest} req
|
|
* @returns {Promise<TEndpointsConfig>}
|
|
*/
|
|
async function getEndpointsConfig(req) {
|
|
const cache = getLogStores(CacheKeys.CONFIG_STORE);
|
|
const cachedEndpointsConfig = await cache.get(CacheKeys.ENDPOINT_CONFIG);
|
|
if (cachedEndpointsConfig) {
|
|
if (cachedEndpointsConfig.gptPlugins) {
|
|
await cache.delete(CacheKeys.ENDPOINT_CONFIG);
|
|
} else {
|
|
return cachedEndpointsConfig;
|
|
}
|
|
}
|
|
|
|
const appConfig = req.config ?? (await getAppConfig({ role: req.user?.role }));
|
|
const defaultEndpointsConfig = await loadDefaultEndpointsConfig(appConfig);
|
|
const customEndpointsConfig = loadCustomEndpointsConfig(appConfig?.endpoints?.custom);
|
|
|
|
/** @type {TEndpointsConfig} */
|
|
const mergedConfig = {
|
|
...defaultEndpointsConfig,
|
|
...customEndpointsConfig,
|
|
};
|
|
|
|
if (appConfig.endpoints?.[EModelEndpoint.azureOpenAI]) {
|
|
/** @type {Omit<TConfig, 'order'>} */
|
|
mergedConfig[EModelEndpoint.azureOpenAI] = {
|
|
userProvide: false,
|
|
};
|
|
}
|
|
|
|
if (appConfig.endpoints?.[EModelEndpoint.azureOpenAI]?.assistants) {
|
|
/** @type {Omit<TConfig, 'order'>} */
|
|
mergedConfig[EModelEndpoint.azureAssistants] = {
|
|
userProvide: false,
|
|
};
|
|
}
|
|
|
|
if (
|
|
mergedConfig[EModelEndpoint.assistants] &&
|
|
appConfig?.endpoints?.[EModelEndpoint.assistants]
|
|
) {
|
|
const { disableBuilder, retrievalModels, capabilities, version, ..._rest } =
|
|
appConfig.endpoints[EModelEndpoint.assistants];
|
|
|
|
mergedConfig[EModelEndpoint.assistants] = {
|
|
...mergedConfig[EModelEndpoint.assistants],
|
|
version,
|
|
retrievalModels,
|
|
disableBuilder,
|
|
capabilities,
|
|
};
|
|
}
|
|
if (mergedConfig[EModelEndpoint.agents] && appConfig?.endpoints?.[EModelEndpoint.agents]) {
|
|
const { disableBuilder, capabilities, allowedProviders, ..._rest } =
|
|
appConfig.endpoints[EModelEndpoint.agents];
|
|
|
|
mergedConfig[EModelEndpoint.agents] = {
|
|
...mergedConfig[EModelEndpoint.agents],
|
|
allowedProviders,
|
|
disableBuilder,
|
|
capabilities,
|
|
};
|
|
}
|
|
|
|
if (
|
|
mergedConfig[EModelEndpoint.azureAssistants] &&
|
|
appConfig?.endpoints?.[EModelEndpoint.azureAssistants]
|
|
) {
|
|
const { disableBuilder, retrievalModels, capabilities, version, ..._rest } =
|
|
appConfig.endpoints[EModelEndpoint.azureAssistants];
|
|
|
|
mergedConfig[EModelEndpoint.azureAssistants] = {
|
|
...mergedConfig[EModelEndpoint.azureAssistants],
|
|
version,
|
|
retrievalModels,
|
|
disableBuilder,
|
|
capabilities,
|
|
};
|
|
}
|
|
|
|
if (mergedConfig[EModelEndpoint.bedrock] && appConfig?.endpoints?.[EModelEndpoint.bedrock]) {
|
|
const { availableRegions } = appConfig.endpoints[EModelEndpoint.bedrock];
|
|
mergedConfig[EModelEndpoint.bedrock] = {
|
|
...mergedConfig[EModelEndpoint.bedrock],
|
|
availableRegions,
|
|
};
|
|
}
|
|
|
|
const endpointsConfig = orderEndpointsConfig(mergedConfig);
|
|
|
|
await cache.set(CacheKeys.ENDPOINT_CONFIG, endpointsConfig);
|
|
return endpointsConfig;
|
|
}
|
|
|
|
/**
|
|
* @param {ServerRequest} req
|
|
* @param {import('librechat-data-provider').AgentCapabilities} capability
|
|
* @returns {Promise<boolean>}
|
|
*/
|
|
const checkCapability = async (req, capability) => {
|
|
const isAgents = isAgentsEndpoint(req.body?.endpointType || req.body?.endpoint);
|
|
const endpointsConfig = await getEndpointsConfig(req);
|
|
const capabilities =
|
|
isAgents || endpointsConfig?.[EModelEndpoint.agents]?.capabilities != null
|
|
? (endpointsConfig?.[EModelEndpoint.agents]?.capabilities ?? [])
|
|
: defaultAgentCapabilities;
|
|
return capabilities.includes(capability);
|
|
};
|
|
|
|
module.exports = { getEndpointsConfig, checkCapability };
|