import { useMemo } from 'react'; import { actionDelimiter, actionDomainSeparator, Constants } from 'librechat-data-provider'; import * as Popover from '@radix-ui/react-popover'; import useLocalize from '~/hooks/useLocalize'; import ProgressCircle from './ProgressCircle'; import InProgressCall from './InProgressCall'; import CancelledIcon from './CancelledIcon'; import ProgressText from './ProgressText'; import FinishedIcon from './FinishedIcon'; import ToolPopover from './ToolPopover'; import WrenchIcon from './WrenchIcon'; import { useProgress } from '~/hooks'; import { logger } from '~/utils'; export default function ToolCall({ initialProgress = 0.1, isSubmitting, name, args: _args = '', output, }: { initialProgress: number; isSubmitting: boolean; name: string; args: string | Record; output?: string | null; }) { const localize = useLocalize(); const progress = useProgress(initialProgress); const radius = 56.08695652173913; const circumference = 2 * Math.PI * radius; const offset = circumference - progress * circumference; const [function_name, _domain] = name.split(actionDelimiter) as [string, string | undefined]; const domain = _domain?.replaceAll(actionDomainSeparator, '.') ?? null; const error = output?.toLowerCase()?.includes('error processing tool'); const args = useMemo(() => { if (typeof _args === 'string') { return _args; } try { return JSON.stringify(_args, null, 2); } catch (e) { logger.error( 'client/src/components/Chat/Messages/Content/ToolCall.tsx - Failed to stringify args', e, ); return ''; } }, [_args]) as string | undefined; const hasInfo = useMemo( () => (args?.length ?? 0) > 0 || (output?.length ?? 0) > 0, [args, output], ); const renderIcon = () => { if (progress < 1) { return (
); } return error === true ? : ; }; const getFinishedText = () => { if (domain != null && domain && domain.length !== Constants.ENCODED_DOMAIN_LENGTH) { return localize('com_assistants_completed_action', domain); } return localize('com_assistants_completed_function', function_name); }; return (
{renderIcon()}
({})} inProgressText={localize('com_assistants_running_action')} finishedText={getFinishedText()} hasInput={hasInfo} popover={true} /> {hasInfo && ( )}
); }