| | import React, { createContext, useContext, useState, useMemo } from 'react'; |
| | import { EModelEndpoint } from 'librechat-data-provider'; |
| | import type { MCP, Action, TPlugin } from 'librechat-data-provider'; |
| | import type { AgentPanelContextType, MCPServerInfo } from '~/common'; |
| | import { |
| | useAvailableToolsQuery, |
| | useGetActionsQuery, |
| | useGetStartupConfig, |
| | useMCPToolsQuery, |
| | } from '~/data-provider'; |
| | import { useLocalize, useGetAgentsConfig, useMCPConnectionStatus } from '~/hooks'; |
| | import { Panel, isEphemeralAgent } from '~/common'; |
| |
|
| | const AgentPanelContext = createContext<AgentPanelContextType | undefined>(undefined); |
| |
|
| | export function useAgentPanelContext() { |
| | const context = useContext(AgentPanelContext); |
| | if (context === undefined) { |
| | throw new Error('useAgentPanelContext must be used within an AgentPanelProvider'); |
| | } |
| | return context; |
| | } |
| |
|
| | |
| | export function AgentPanelProvider({ children }: { children: React.ReactNode }) { |
| | const localize = useLocalize(); |
| | const [mcp, setMcp] = useState<MCP | undefined>(undefined); |
| | const [mcps, setMcps] = useState<MCP[] | undefined>(undefined); |
| | const [action, setAction] = useState<Action | undefined>(undefined); |
| | const [activePanel, setActivePanel] = useState<Panel>(Panel.builder); |
| | const [agent_id, setCurrentAgentId] = useState<string | undefined>(undefined); |
| |
|
| | const { data: startupConfig } = useGetStartupConfig(); |
| | const { data: actions } = useGetActionsQuery(EModelEndpoint.agents, { |
| | enabled: !isEphemeralAgent(agent_id), |
| | }); |
| |
|
| | const { data: regularTools } = useAvailableToolsQuery(EModelEndpoint.agents); |
| |
|
| | const { data: mcpData } = useMCPToolsQuery({ |
| | enabled: !isEphemeralAgent(agent_id) && startupConfig?.mcpServers != null, |
| | }); |
| |
|
| | const { agentsConfig, endpointsConfig } = useGetAgentsConfig(); |
| | const mcpServerNames = useMemo( |
| | () => Object.keys(startupConfig?.mcpServers ?? {}), |
| | [startupConfig], |
| | ); |
| |
|
| | const { connectionStatus } = useMCPConnectionStatus({ |
| | enabled: !isEphemeralAgent(agent_id) && mcpServerNames.length > 0, |
| | }); |
| |
|
| | const mcpServersMap = useMemo(() => { |
| | const configuredServers = new Set(mcpServerNames); |
| | const serversMap = new Map<string, MCPServerInfo>(); |
| |
|
| | if (mcpData?.servers) { |
| | for (const [serverName, serverData] of Object.entries(mcpData.servers)) { |
| | const metadata = { |
| | name: serverName, |
| | pluginKey: serverName, |
| | description: `${localize('com_ui_tool_collection_prefix')} ${serverName}`, |
| | icon: serverData.icon || '', |
| | authConfig: serverData.authConfig, |
| | authenticated: serverData.authenticated, |
| | } as TPlugin; |
| |
|
| | const tools = serverData.tools.map((tool) => ({ |
| | tool_id: tool.pluginKey, |
| | metadata: { |
| | ...tool, |
| | icon: serverData.icon, |
| | authConfig: serverData.authConfig, |
| | authenticated: serverData.authenticated, |
| | } as TPlugin, |
| | })); |
| |
|
| | serversMap.set(serverName, { |
| | serverName, |
| | tools, |
| | isConfigured: configuredServers.has(serverName), |
| | isConnected: connectionStatus?.[serverName]?.connectionState === 'connected', |
| | metadata, |
| | }); |
| | } |
| | } |
| |
|
| | |
| | for (const mcpServerName of mcpServerNames) { |
| | if (serversMap.has(mcpServerName)) { |
| | continue; |
| | } |
| | const metadata = { |
| | icon: '', |
| | name: mcpServerName, |
| | pluginKey: mcpServerName, |
| | description: `${localize('com_ui_tool_collection_prefix')} ${mcpServerName}`, |
| | } as TPlugin; |
| |
|
| | serversMap.set(mcpServerName, { |
| | tools: [], |
| | metadata, |
| | isConfigured: true, |
| | serverName: mcpServerName, |
| | isConnected: connectionStatus?.[mcpServerName]?.connectionState === 'connected', |
| | }); |
| | } |
| |
|
| | return serversMap; |
| | }, [mcpData, localize, mcpServerNames, connectionStatus]); |
| |
|
| | const value: AgentPanelContextType = { |
| | mcp, |
| | mcps, |
| | action, |
| | setMcp, |
| | actions, |
| | setMcps, |
| | agent_id, |
| | setAction, |
| | activePanel, |
| | regularTools, |
| | agentsConfig, |
| | startupConfig, |
| | mcpServersMap, |
| | setActivePanel, |
| | endpointsConfig, |
| | setCurrentAgentId, |
| | }; |
| |
|
| | return <AgentPanelContext.Provider value={value}>{children}</AgentPanelContext.Provider>; |
| | } |
| |
|