🔁 refactor: Capabilities for Tools/File handling for Direct Endpoints (#8253)

* feat: add useAgentCapabilities hook to manage agent capabilities

* refactor: move  agents and endpoints configuration to AgentPanel context provider

* refactor: implement useGetAgentsConfig hook for consolidated agents and endpoints management

* refactor: enhance ToolsDropdown to utilize agent capabilities and streamline dropdown item rendering

* chore: reorder return values in useAgentCapabilities for improved clarity

* refactor: enhance agent capabilities handling in AttachFileMenu and update file handling logic to allow capabilities to be used for non-agents endpoints
This commit is contained in:
Danny Avila 2025-07-04 14:51:26 -04:00 committed by GitHub
parent a288ad1d9c
commit f5511e4a4e
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
15 changed files with 308 additions and 250 deletions

View file

@ -1,2 +1,4 @@
export { default as useAgentsMap } from './useAgentsMap';
export { default as useSelectAgent } from './useSelectAgent';
export { default as useAgentCapabilities } from './useAgentCapabilities';
export { default as useGetAgentsConfig } from './useGetAgentsConfig';

View file

@ -0,0 +1,61 @@
import { useMemo } from 'react';
import { AgentCapabilities } from 'librechat-data-provider';
interface AgentCapabilitiesResult {
toolsEnabled: boolean;
actionsEnabled: boolean;
artifactsEnabled: boolean;
ocrEnabled: boolean;
fileSearchEnabled: boolean;
webSearchEnabled: boolean;
codeEnabled: boolean;
}
export default function useAgentCapabilities(
capabilities: AgentCapabilities[] | undefined,
): AgentCapabilitiesResult {
const toolsEnabled = useMemo(
() => capabilities?.includes(AgentCapabilities.tools) ?? false,
[capabilities],
);
const actionsEnabled = useMemo(
() => capabilities?.includes(AgentCapabilities.actions) ?? false,
[capabilities],
);
const artifactsEnabled = useMemo(
() => capabilities?.includes(AgentCapabilities.artifacts) ?? false,
[capabilities],
);
const ocrEnabled = useMemo(
() => capabilities?.includes(AgentCapabilities.ocr) ?? false,
[capabilities],
);
const fileSearchEnabled = useMemo(
() => capabilities?.includes(AgentCapabilities.file_search) ?? false,
[capabilities],
);
const webSearchEnabled = useMemo(
() => capabilities?.includes(AgentCapabilities.web_search) ?? false,
[capabilities],
);
const codeEnabled = useMemo(
() => capabilities?.includes(AgentCapabilities.execute_code) ?? false,
[capabilities],
);
return {
ocrEnabled,
codeEnabled,
toolsEnabled,
actionsEnabled,
artifactsEnabled,
webSearchEnabled,
fileSearchEnabled,
};
}

View file

@ -0,0 +1,35 @@
import { useMemo } from 'react';
import { EModelEndpoint, AgentCapabilities } from 'librechat-data-provider';
import type { TAgentsEndpoint, TEndpointsConfig, TConfig } from 'librechat-data-provider';
import { useGetEndpointsQuery } from '~/data-provider';
interface UseGetAgentsConfigOptions {
endpointsConfig?: TEndpointsConfig;
}
export default function useGetAgentsConfig(options?: UseGetAgentsConfigOptions): {
agentsConfig?: TAgentsEndpoint | null;
endpointsConfig?: TEndpointsConfig | null;
} {
const { endpointsConfig: providedConfig } = options || {};
const { data: queriedConfig } = useGetEndpointsQuery({
enabled: !providedConfig,
});
const endpointsConfig = providedConfig || queriedConfig;
const agentsConfig = useMemo<TAgentsEndpoint | null>(() => {
const config = endpointsConfig?.[EModelEndpoint.agents] ?? null;
if (!config) return null;
return {
...(config as TConfig),
capabilities: Array.isArray(config.capabilities)
? config.capabilities.map((cap) => cap as unknown as AgentCapabilities)
: ([] as AgentCapabilities[]),
} as TAgentsEndpoint;
}, [endpointsConfig]);
return { agentsConfig, endpointsConfig };
}

View file

@ -25,10 +25,10 @@ import useUpdateFiles from './useUpdateFiles';
type UseFileHandling = {
fileSetter?: FileSetter;
fileFilter?: (file: File) => boolean;
additionalMetadata?: Record<string, string | undefined>;
overrideEndpoint?: EModelEndpoint;
fileFilter?: (file: File) => boolean;
overrideEndpointFileConfig?: EndpointFileConfig;
additionalMetadata?: Record<string, string | undefined>;
};
const useFileHandling = (params?: UseFileHandling) => {
@ -151,6 +151,10 @@ const useFileHandling = (params?: UseFileHandling) => {
const formData = new FormData();
formData.append('endpoint', endpoint);
formData.append(
'original_endpoint',
conversation?.endpointType || conversation?.endpoint || '',
);
formData.append('file', extendedFile.file as File, encodeURIComponent(filename));
formData.append('file_id', extendedFile.file_id);