mirror of
https://github.com/danny-avila/LibreChat.git
synced 2025-12-17 08:50:15 +01:00
* chore: replace violation cache accessors with enum * chore: fix test * chore(fileSchema): index timestamps * fix(ActionService): use encoding/caching strategy for handling assistant function character length limit * refactor(actions): async `domainParser` also resolve retrieved model (which is deployment name) to user-defined model * style(AssistantAction): add `whitespace-nowrap` for ellipsis * refactor(ActionService): if domain is less than or equal to encoded domain fixed length, return domain with replacement of separator * refactor(actions): use sessions/transactions for updating Assistant Action database records * chore: remove TTL from ENCODED_DOMAINS cache * refactor(domainParser): minor optimization and add tests * fix(spendTokens): use txData.user for token usage logging * refactor(actions): add helper function `withSession` for database operations with sessions/transactions * fix(PluginsClient): logger debug `message` field edge case
79 lines
2.8 KiB
TypeScript
79 lines
2.8 KiB
TypeScript
// import { useState, useEffect } 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';
|
|
|
|
export default function ToolCall({
|
|
initialProgress = 0.1,
|
|
isSubmitting,
|
|
name,
|
|
args = '',
|
|
output,
|
|
}: {
|
|
initialProgress: number;
|
|
isSubmitting: boolean;
|
|
name: string;
|
|
args: string;
|
|
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');
|
|
|
|
return (
|
|
<Popover.Root>
|
|
<div className="my-2.5 flex items-center gap-2.5">
|
|
<div className="relative h-5 w-5 shrink-0">
|
|
{progress < 1 ? (
|
|
<InProgressCall progress={progress} isSubmitting={isSubmitting} error={error}>
|
|
<div
|
|
className="absolute left-0 top-0 flex h-full w-full items-center justify-center rounded-full bg-transparent text-white"
|
|
style={{ opacity: 1, transform: 'none' }}
|
|
data-projection-id="849"
|
|
>
|
|
<div>
|
|
<WrenchIcon />
|
|
</div>
|
|
<ProgressCircle radius={radius} circumference={circumference} offset={offset} />
|
|
</div>
|
|
</InProgressCall>
|
|
) : error ? (
|
|
<CancelledIcon />
|
|
) : (
|
|
<FinishedIcon />
|
|
)}
|
|
</div>
|
|
<ProgressText
|
|
progress={progress}
|
|
onClick={() => ({})}
|
|
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={!!args?.length}
|
|
popover={true}
|
|
/>
|
|
{!!args?.length && (
|
|
<ToolPopover input={args} output={output} domain={domain} function_name={function_name} />
|
|
)}
|
|
</div>
|
|
</Popover.Root>
|
|
);
|
|
}
|