| | 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, |
| | }; |
| |
|