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 ActionIcon from './ActionIcon'; 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); 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]); const hasInfo = useMemo( () => (args?.length || 0) > 0 || (output?.length || 0) > 0, [args, output], ); return (
{progress < 1 ? (
) : error ? ( ) : ( )}
({})} inProgressText={localize('com_assistants_running_action')} finishedText={ domain && domain.length !== Constants.ENCODED_DOMAIN_LENGTH ? localize('com_assistants_completed_action', domain) : localize('com_assistants_completed_function', function_name) } hasInput={hasInfo} popover={true} /> {hasInfo && ( )}
); }