| const { logger } = require('@librechat/data-schemas'); |
| const { CacheKeys } = require('librechat-data-provider'); |
| const { getToolkitKey, checkPluginAuth, filterUniquePlugins } = require('@librechat/api'); |
| const { getCachedTools, setCachedTools } = require('~/server/services/Config'); |
| const { availableTools, toolkits } = require('~/app/clients/tools'); |
| const { getAppConfig } = require('~/server/services/Config'); |
| const { getLogStores } = require('~/cache'); |
|
|
| const getAvailablePluginsController = async (req, res) => { |
| try { |
| const cache = getLogStores(CacheKeys.CONFIG_STORE); |
| const cachedPlugins = await cache.get(CacheKeys.PLUGINS); |
| if (cachedPlugins) { |
| res.status(200).json(cachedPlugins); |
| return; |
| } |
|
|
| const appConfig = await getAppConfig({ role: req.user?.role }); |
| |
| const { filteredTools = [], includedTools = [] } = appConfig; |
| |
| const pluginManifest = availableTools; |
|
|
| const uniquePlugins = filterUniquePlugins(pluginManifest); |
| let authenticatedPlugins = []; |
| for (const plugin of uniquePlugins) { |
| authenticatedPlugins.push( |
| checkPluginAuth(plugin) ? { ...plugin, authenticated: true } : plugin, |
| ); |
| } |
|
|
| let plugins = authenticatedPlugins; |
|
|
| if (includedTools.length > 0) { |
| plugins = plugins.filter((plugin) => includedTools.includes(plugin.pluginKey)); |
| } else { |
| plugins = plugins.filter((plugin) => !filteredTools.includes(plugin.pluginKey)); |
| } |
|
|
| await cache.set(CacheKeys.PLUGINS, plugins); |
| res.status(200).json(plugins); |
| } catch (error) { |
| res.status(500).json({ message: error.message }); |
| } |
| }; |
|
|
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| const getAvailableTools = async (req, res) => { |
| try { |
| const userId = req.user?.id; |
| if (!userId) { |
| logger.warn('[getAvailableTools] User ID not found in request'); |
| return res.status(401).json({ message: 'Unauthorized' }); |
| } |
| const cache = getLogStores(CacheKeys.CONFIG_STORE); |
| const cachedToolsArray = await cache.get(CacheKeys.TOOLS); |
|
|
| const appConfig = req.config ?? (await getAppConfig({ role: req.user?.role })); |
|
|
| |
| if (cachedToolsArray != null) { |
| res.status(200).json(cachedToolsArray); |
| return; |
| } |
|
|
| |
| let toolDefinitions = await getCachedTools(); |
|
|
| if (toolDefinitions == null && appConfig?.availableTools != null) { |
| logger.warn('[getAvailableTools] Tool cache was empty, re-initializing from app config'); |
| await setCachedTools(appConfig.availableTools); |
| toolDefinitions = appConfig.availableTools; |
| } |
|
|
| |
| let pluginManifest = availableTools; |
|
|
| |
| const uniquePlugins = filterUniquePlugins(pluginManifest); |
| const authenticatedPlugins = uniquePlugins.map((plugin) => { |
| if (checkPluginAuth(plugin)) { |
| return { ...plugin, authenticated: true }; |
| } else { |
| return plugin; |
| } |
| }); |
|
|
| |
| const toolsOutput = []; |
| for (const plugin of authenticatedPlugins) { |
| const isToolDefined = toolDefinitions?.[plugin.pluginKey] !== undefined; |
| const isToolkit = |
| plugin.toolkit === true && |
| Object.keys(toolDefinitions ?? {}).some( |
| (key) => getToolkitKey({ toolkits, toolName: key }) === plugin.pluginKey, |
| ); |
|
|
| if (!isToolDefined && !isToolkit) { |
| continue; |
| } |
|
|
| toolsOutput.push(plugin); |
| } |
|
|
| const finalTools = filterUniquePlugins(toolsOutput); |
| await cache.set(CacheKeys.TOOLS, finalTools); |
|
|
| res.status(200).json(finalTools); |
| } catch (error) { |
| logger.error('[getAvailableTools]', error); |
| res.status(500).json({ message: error.message }); |
| } |
| }; |
|
|
| module.exports = { |
| getAvailableTools, |
| getAvailablePluginsController, |
| }; |
|
|