mirror of
https://github.com/danny-avila/LibreChat.git
synced 2025-12-23 03:40:14 +01:00
🚧 chore: merge latest dev build (#4288)
* fix: agent initialization, add `collectedUsage` handling * style: improve side panel styling * refactor(loadAgent): Optimize order agent project ID retrieval * feat: code execution * fix: typing issues * feat: ExecuteCode content part * refactor: use local state for default collapsed state of analysis content parts * fix: code parsing in ExecuteCode component * chore: bump agents package, export loadAuthValues * refactor: Update handleTools.js to use EnvVar for code execution tool authentication * WIP * feat: download code outputs * fix(useEventHandlers): type issues * feat: backend handling for code outputs * Refactor: Remove console.log statement in Part.tsx * refactor: add attachments to TMessage/messageSchema * WIP: prelim handling for code outputs * feat: attachments rendering * refactor: improve attachments rendering * fix: attachments, nullish edge case, handle attachments from event stream, bump agents package * fix filename download * fix: tool assignment for 'run code' on agent creation * fix: image handling by adding attachments * refactor: prevent agent creation without provider/model * refactor: remove unnecessary space in agent creation success message * refactor: select first model if selecting provider from empty on form * fix: Agent avatar bug * fix: `defaultAgentFormValues` causing boolean typing issue and typeerror * fix: capabilities counting as tools, causing duplication of them * fix: formatted messages edge case where consecutive content text type parts with the latter having tool_call_ids would cause consecutive AI messages to be created. furthermore, content could not be an array for tool_use messages (anthropic limitation) * chore: bump @librechat/agents dependency to version 1.6.9 * feat: bedrock agents * feat: new Agents icon * feat: agent titling * feat: agent landing * refactor: allow sharing agent globally only if user is admin or author * feat: initial AgentPanelSkeleton * feat: AgentPanelSkeleton * feat: collaborative agents * chore: add potential authorName as part of schema * chore: Remove unnecessary console.log statement * WIP: agent model parameters * chore: ToolsDialog typing and tool related localization chnages * refactor: update tool instance type (latest langchain class), and rename google tool to 'google' proper * chore: add back tools * feat: Agent knowledge files upload * refactor: better verbiage for disabled knowledge * chore: debug logs for file deletions * chore: debug logs for file deletions * feat: upload/delete agent knowledge/file-search files * feat: file search UI for agents * feat: first pass, file search tool * chore: update default agent capabilities and info
This commit is contained in:
parent
f33e75e2ee
commit
ad74350036
123 changed files with 3611 additions and 1541 deletions
|
|
@ -1,12 +1,6 @@
|
|||
import React, { useMemo } from 'react';
|
||||
import { isAssistantsEndpoint } from 'librechat-data-provider';
|
||||
import type {
|
||||
TAssistantsMap,
|
||||
TConversation,
|
||||
TEndpointsConfig,
|
||||
TPreset,
|
||||
} from 'librechat-data-provider';
|
||||
import { getEndpointField, getIconKey, getIconEndpoint } from '~/utils';
|
||||
import type * as t from 'librechat-data-provider';
|
||||
import { getEndpointField, getIconKey, getEntity, getIconEndpoint } from '~/utils';
|
||||
import { icons } from '~/components/Chat/Menus/Endpoints/Icons';
|
||||
import ConvoIconURL from '~/components/Endpoints/ConvoIconURL';
|
||||
|
||||
|
|
@ -14,61 +8,72 @@ export default function ConvoIcon({
|
|||
conversation,
|
||||
endpointsConfig,
|
||||
assistantMap,
|
||||
agentsMap,
|
||||
className = '',
|
||||
containerClassName = '',
|
||||
context,
|
||||
size,
|
||||
}: {
|
||||
conversation: TConversation | TPreset | null;
|
||||
endpointsConfig: TEndpointsConfig;
|
||||
assistantMap: TAssistantsMap | undefined;
|
||||
conversation: t.TConversation | t.TPreset | null;
|
||||
endpointsConfig: t.TEndpointsConfig;
|
||||
assistantMap: t.TAssistantsMap | undefined;
|
||||
agentsMap: t.TAgentsMap | undefined;
|
||||
containerClassName?: string;
|
||||
context?: 'message' | 'nav' | 'landing' | 'menu-item';
|
||||
className?: string;
|
||||
size?: number;
|
||||
}) {
|
||||
const iconURL = conversation?.iconURL;
|
||||
const iconURL = conversation?.iconURL ?? '';
|
||||
let endpoint = conversation?.endpoint;
|
||||
endpoint = getIconEndpoint({ endpointsConfig, iconURL, endpoint });
|
||||
const assistant = useMemo(() => {
|
||||
if (!isAssistantsEndpoint(conversation?.endpoint)) {
|
||||
return undefined;
|
||||
}
|
||||
|
||||
const endpointKey = conversation?.endpoint ?? '';
|
||||
const assistantId = conversation?.assistant_id ?? '';
|
||||
const { entity, isAgent } = useMemo(
|
||||
() =>
|
||||
getEntity({
|
||||
endpoint,
|
||||
agentsMap,
|
||||
assistantMap,
|
||||
agent_id: conversation?.agent_id,
|
||||
assistant_id: conversation?.assistant_id,
|
||||
}),
|
||||
[endpoint, conversation?.agent_id, conversation?.assistant_id, agentsMap, assistantMap],
|
||||
);
|
||||
|
||||
return assistantMap?.[endpointKey] ? assistantMap[endpointKey][assistantId] : undefined;
|
||||
}, [conversation?.endpoint, conversation?.assistant_id, assistantMap]);
|
||||
const assistantName = assistant && (assistant.name ?? '');
|
||||
const name = entity?.name ?? '';
|
||||
const avatar = isAgent
|
||||
? (entity as t.Agent | undefined)?.avatar?.filepath
|
||||
: ((entity as t.Assistant | undefined)?.metadata?.avatar as string);
|
||||
|
||||
const avatar = (assistant && (assistant.metadata?.avatar as string)) || '';
|
||||
const endpointIconURL = getEndpointField(endpointsConfig, endpoint, 'iconURL');
|
||||
const iconKey = getIconKey({ endpoint, endpointsConfig, endpointIconURL });
|
||||
const Icon = icons[iconKey];
|
||||
const Icon = icons[iconKey] ?? null;
|
||||
|
||||
return (
|
||||
<>
|
||||
{iconURL && iconURL.includes('http') ? (
|
||||
<ConvoIconURL
|
||||
preset={conversation}
|
||||
endpointIconURL={endpointIconURL}
|
||||
assistantName={assistantName}
|
||||
assistantAvatar={avatar}
|
||||
assistantName={name}
|
||||
agentAvatar={avatar}
|
||||
agentName={name}
|
||||
context={context}
|
||||
/>
|
||||
) : (
|
||||
<div className={containerClassName}>
|
||||
{endpoint &&
|
||||
Icon &&
|
||||
Icon({
|
||||
size,
|
||||
context,
|
||||
className,
|
||||
iconURL: endpointIconURL,
|
||||
assistantName,
|
||||
endpoint,
|
||||
avatar,
|
||||
})}
|
||||
{endpoint && Icon != null && (
|
||||
<Icon
|
||||
size={size}
|
||||
context={context}
|
||||
endpoint={endpoint}
|
||||
className={className}
|
||||
iconURL={endpointIconURL}
|
||||
assistantName={name}
|
||||
agentName={name}
|
||||
avatar={avatar}
|
||||
/>
|
||||
)}
|
||||
</div>
|
||||
)}
|
||||
</>
|
||||
|
|
|
|||
|
|
@ -64,7 +64,7 @@ const ConvoIconURL: React.FC<ConvoIconURLProps> = ({
|
|||
</div>
|
||||
);
|
||||
|
||||
return <Icon />;
|
||||
return <Icon context={context} />;
|
||||
}
|
||||
|
||||
return (
|
||||
|
|
@ -73,10 +73,10 @@ const ConvoIconURL: React.FC<ConvoIconURLProps> = ({
|
|||
size={41}
|
||||
context={context}
|
||||
className="h-2/3 w-2/3"
|
||||
agentName={agentName}
|
||||
iconURL={endpointIconURL}
|
||||
assistantName={assistantName}
|
||||
avatar={assistantAvatar || agentAvatar}
|
||||
agentName={agentName}
|
||||
avatar={assistantAvatar ?? agentAvatar}
|
||||
/>
|
||||
</div>
|
||||
);
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
import { EModelEndpoint, isAssistantsEndpoint, alternateName } from 'librechat-data-provider';
|
||||
import UnknownIcon from '~/components/Chat/Menus/Endpoints/UnknownIcon';
|
||||
import { BrainCircuit } from 'lucide-react';
|
||||
import { Feather } from 'lucide-react';
|
||||
import {
|
||||
Plugin,
|
||||
GPTIcon,
|
||||
|
|
@ -109,7 +109,7 @@ const MessageEndpointIcon: React.FC<IconProps> = (props) => {
|
|||
) : (
|
||||
<div className="h-6 w-6">
|
||||
<div className="shadow-stroke flex h-6 w-6 items-center justify-center overflow-hidden rounded-full">
|
||||
<BrainCircuit className="h-2/3 w-2/3 text-gray-400" />
|
||||
<Feather className="h-2/3 w-2/3 text-gray-400" />
|
||||
</div>
|
||||
</div>
|
||||
),
|
||||
|
|
|
|||
|
|
@ -1,6 +1,5 @@
|
|||
import { Feather } from 'lucide-react';
|
||||
import { EModelEndpoint, alternateName } from 'librechat-data-provider';
|
||||
import { BrainCircuit } from 'lucide-react';
|
||||
import UnknownIcon from '~/components/Chat/Menus/Endpoints/UnknownIcon';
|
||||
import {
|
||||
AzureMinimalIcon,
|
||||
OpenAIMinimalIcon,
|
||||
|
|
@ -13,11 +12,12 @@ import {
|
|||
BedrockIcon,
|
||||
Sparkles,
|
||||
} from '~/components/svg';
|
||||
import { cn } from '~/utils';
|
||||
import UnknownIcon from '~/components/Chat/Menus/Endpoints/UnknownIcon';
|
||||
import { IconProps } from '~/common';
|
||||
import { cn } from '~/utils';
|
||||
|
||||
const MinimalIcon: React.FC<IconProps> = (props) => {
|
||||
const { size = 30, iconClassName, error } = props;
|
||||
const { size = 30, iconURL = '', iconClassName, error } = props;
|
||||
|
||||
let endpoint = 'default'; // Default value for endpoint
|
||||
|
||||
|
|
@ -49,7 +49,7 @@ const MinimalIcon: React.FC<IconProps> = (props) => {
|
|||
[EModelEndpoint.assistants]: { icon: <Sparkles className="icon-sm" />, name: 'Assistant' },
|
||||
[EModelEndpoint.azureAssistants]: { icon: <Sparkles className="icon-sm" />, name: 'Assistant' },
|
||||
[EModelEndpoint.agents]: {
|
||||
icon: <BrainCircuit className="icon-sm" />,
|
||||
icon: <Feather className="icon-sm" />,
|
||||
name: props.modelLabel ?? alternateName[EModelEndpoint.agents],
|
||||
},
|
||||
[EModelEndpoint.bedrock]: {
|
||||
|
|
@ -57,21 +57,14 @@ const MinimalIcon: React.FC<IconProps> = (props) => {
|
|||
name: props.modelLabel ?? alternateName[EModelEndpoint.bedrock],
|
||||
},
|
||||
default: {
|
||||
icon: (
|
||||
<UnknownIcon
|
||||
iconURL={props.iconURL}
|
||||
endpoint={endpoint}
|
||||
className="icon-sm"
|
||||
context="nav"
|
||||
/>
|
||||
),
|
||||
icon: <UnknownIcon iconURL={iconURL} endpoint={endpoint} className="icon-sm" context="nav" />,
|
||||
name: endpoint,
|
||||
},
|
||||
};
|
||||
|
||||
let { icon, name } = endpointIcons[endpoint] ?? endpointIcons.default;
|
||||
if (props.iconURL && endpointIcons[props.iconURL]) {
|
||||
({ icon, name } = endpointIcons[props.iconURL]);
|
||||
if (iconURL && endpointIcons[iconURL] != null) {
|
||||
({ icon, name } = endpointIcons[iconURL]);
|
||||
}
|
||||
|
||||
return (
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue