import { X, Link2, PlusCircle } from 'lucide-react'; import { EModelEndpoint } from 'librechat-data-provider'; import React, { useState, useMemo, useCallback, useEffect } from 'react'; import { ControlCombobox, HoverCard, HoverCardPortal, HoverCardContent, HoverCardTrigger, CircleHelpIcon, } from '@librechat/client'; import type { ControllerRenderProps } from 'react-hook-form'; import type { TMessage } from 'librechat-data-provider'; import type { AgentForm, OptionWithIcon } from '~/common'; import MessageIcon from '~/components/Share/MessageIcon'; import { useAgentsMapContext } from '~/Providers'; import { useLocalize } from '~/hooks'; import { ESide } from '~/common'; interface AgentChainProps { field: ControllerRenderProps; currentAgentId: string; } /** TODO: make configurable */ const MAX_AGENTS = 10; const AgentChain: React.FC = ({ field, currentAgentId }) => { const localize = useLocalize(); const [newAgentId, setNewAgentId] = useState(''); const agentsMap = useAgentsMapContext() || {}; const agentIds = field.value || []; const agents = useMemo(() => Object.values(agentsMap), [agentsMap]); const selectableAgents = useMemo( () => agents .filter((agent) => agent?.id !== currentAgentId) .map( (agent) => ({ label: agent?.name || '', value: agent?.id, icon: ( ), }) as OptionWithIcon, ), [agents, currentAgentId], ); const getAgentDetails = useCallback((id: string) => agentsMap[id], [agentsMap]); useEffect(() => { if (newAgentId && agentIds.length < MAX_AGENTS) { field.onChange([...agentIds, newAgentId]); setNewAgentId(''); } }, [newAgentId, agentIds, field]); const removeAgentAt = (index: number) => { field.onChange(agentIds.filter((_, i) => i !== index)); }; const updateAgentAt = (index: number, id: string) => { const updated = [...agentIds]; updated[index] = id; field.onChange(updated); }; return (
{agentIds.length} / {MAX_AGENTS}
{/* Current fixed agent */}
{getAgentDetails(currentAgentId)?.name}
{} {agentIds.map((agentId, idx) => (
updateAgentAt(idx, id)} selectPlaceholder={localize('com_ui_agent_var', { 0: localize('com_ui_select') })} searchPlaceholder={localize('com_ui_agent_var', { 0: localize('com_ui_search') })} items={selectableAgents} displayValue={getAgentDetails(agentId)?.name ?? ''} SelectIcon={ } className="flex-1 border-border-heavy" containerClassName="px-0" /> {/* Future Settings button? */} {/* */}
{idx < agentIds.length - 1 && ( )}
))} {agentIds.length < MAX_AGENTS && ( <> {agentIds.length > 0 && } } /> )} {agentIds.length >= MAX_AGENTS && (

{localize('com_ui_agent_chain_max', { 0: MAX_AGENTS })}

)}

{localize('com_ui_agent_chain_info')}

); }; export default AgentChain;