2024-12-19 13:04:48 -05:00
|
|
|
import React, { useMemo } from 'react';
|
|
|
|
|
import { EModelEndpoint, EToolResources } from 'librechat-data-provider';
|
2025-03-10 17:23:46 -04:00
|
|
|
import { FileSearch, ImageUpIcon, FileType2Icon, TerminalSquareIcon } from 'lucide-react';
|
2024-12-19 13:04:48 -05:00
|
|
|
import OGDialogTemplate from '~/components/ui/OGDialogTemplate';
|
2025-02-03 10:53:04 -05:00
|
|
|
import { useGetEndpointsQuery } from '~/data-provider';
|
2024-12-19 13:04:48 -05:00
|
|
|
import useLocalize from '~/hooks/useLocalize';
|
|
|
|
|
import { OGDialog } from '~/components/ui';
|
|
|
|
|
|
|
|
|
|
interface DragDropModalProps {
|
🤖 feat: Streamline Endpoints to Agent Framework (#8013)
* refactor(buildEndpointOption): Improve error logging in middleware, consolidate `isAgents` builder logic, remove adding `modelsConfig` to `endpointOption`
* refactor: parameter extraction and organization in agent services, minimize redundancy of shared fields across objects, make clear distinction of parameters processed uniquely by LibreChat vs LLM Provider Configs
* refactor(createPayload): streamline all endpoints to agent route
* fix: add `modelLabel` to response sender options for agent initialization
* chore: correct log message context in EditController abort controller cleanup
* chore: remove unused abortRequest hook
* chore: remove unused addToCache module and its dependencies
* refactor: remove AskController and related routes, update endpoint URLs (now all streamlined to agents route)
* chore: remove unused bedrock route and its related imports
* refactor: simplify response sender logic for Google endpoint
* chore: add `modelDisplayLabel` handling for agents endpoint
* feat: add file search capability to ephemeral agents, update code interpreter selection based of file upload, consolidate main upload menu for all endpoints
* feat: implement useToolToggle hook for managing tool toggle state, refactor CodeInterpreter and WebSearch components to utilize new hook
* feat: add ToolsDropdown component to BadgeRow for enhanced tool options
* feat: introduce BadgeRowContext and BadgeRowProvider for managing conversation state, refactor related components to utilize context
* feat: implement useMCPSelect hook for managing MCP selection state, refactor MCPSelect component to utilize new hook
* feat: enhance BadgeRowContext with MCPSelect and tool toggle functionality, refactor related components to utilize updated context and hooks
* refactor: streamline useToolToggle hook by integrating setEphemeralAgent directly into toggle logic and removing redundant setValue function
* refactor: consolidate codeApiKeyForm and searchApiKeyForm from CodeInterpreter and WebSearch to utilize new context properties
* refactor: update CheckboxButton to support controlled state and enhance ToolsDropdown with permission-based toggles for web search and code interpreter
* refactor: conditionally render CheckboxButton in CodeInterpreter and WebSearch components for improved UI responsiveness
* chore: add jotai dependency to package.json and package-lock.json
* chore: update brace-expansion package to version 2.0.2 in package-lock.json due to CVE-2025-5889
* Revert "chore: add jotai dependency to package.json and package-lock.json"
This reverts commit 69b699739671e740820f570ddb83d1caa0dbd6e4.
* refactor: add pinning functionality to CodeInterpreter and WebSearch components, and enhance ToolsDropdown with pin toggle for web search and code interpreter
* chore: move MCPIcon to correct location, remove duplicate
* fix: update MCP import to use type-only import from librechat-data-provider
* feat: implement MCPSubMenu component and integrate pinning functionality into ToolsDropdown
* fix: cycling to submenu by using parent menu context
* feat: add FileSearch component and integrate it into BadgeRow and ToolsDropdown
* chore: import order
* chore: remove agent specific logic that would block functionality for streamlined endpoints
* chore: linting for `createContextHandlers`
* chore: ensure ToolsDropdown doesn't show up for agents
* chore: ensure tool resource is selected when dragged to UI
* chore: update file search behavior to simulate legacy functionality
* feat: ToolDialogs with multiple trigger references, add settings to tool dropdown
* refactor: simplify web search and code interpreter settings checks
* chore: simplify local storage key for pinned state in useToolToggle
* refactor: reinstate agent check in AttachFileChat component, as individual providers will ahve different file configurations
* ci: increase timeout for MongoDB connection in Agent tests
2025-06-23 09:59:05 -04:00
|
|
|
onOptionSelect: (option: EToolResources | undefined) => void;
|
2024-12-19 13:04:48 -05:00
|
|
|
files: File[];
|
|
|
|
|
isVisible: boolean;
|
|
|
|
|
setShowModal: (showModal: boolean) => void;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
interface FileOption {
|
|
|
|
|
label: string;
|
|
|
|
|
value?: EToolResources;
|
|
|
|
|
icon: React.JSX.Element;
|
|
|
|
|
condition?: boolean;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
const DragDropModal = ({ onOptionSelect, setShowModal, files, isVisible }: DragDropModalProps) => {
|
|
|
|
|
const localize = useLocalize();
|
|
|
|
|
const { data: endpointsConfig } = useGetEndpointsQuery();
|
|
|
|
|
const capabilities = useMemo(
|
|
|
|
|
() => endpointsConfig?.[EModelEndpoint.agents]?.capabilities ?? [],
|
|
|
|
|
[endpointsConfig],
|
|
|
|
|
);
|
|
|
|
|
|
|
|
|
|
const options = useMemo(() => {
|
|
|
|
|
const _options: FileOption[] = [
|
|
|
|
|
{
|
|
|
|
|
label: localize('com_ui_upload_image_input'),
|
|
|
|
|
value: undefined,
|
|
|
|
|
icon: <ImageUpIcon className="icon-md" />,
|
🧭 refactor: Modernize Nav/Header (#7094)
* refactor: streamline model preset handling in conversation setup
* refactor: integrate navigation and location hooks in chat functions and event handlers, prevent cache from fetching on final event handling
* fix: prevent adding code interpreter non-image output to file list on message attachment event, fix all unhandled edge cases when this is done (treating the file download as an image attachment, undefined fields, message tokenCount issues, use of `startsWith` on undefined "text") although it is now prevent altogether
* chore: remove unused jailbreak prop from MinimalIcon component in EndpointIcon
* feat: add new SVG icons (MobileSidebar, Sidebar, XAIcon), fix: xAI styling in dark vs. light modes, adjust styling of Landing icons
* fix: open conversation in new tab on navigation with ctrl/meta key
* refactor: update Nav & Header to use close/open sidebar buttons, as well as redesign "New Chat"/"Bookmarks" buttons to the top of the Nav, matching the latest design of ChatGPT for simplicity and to free up space
* chore: remove unused isToggleHovering state and simplify opacity logic in Nav component
* style: match mobile nav to mobile header
2025-04-27 14:03:25 -04:00
|
|
|
condition: files.every((file) => file.type?.startsWith('image/')),
|
2024-12-19 13:04:48 -05:00
|
|
|
},
|
|
|
|
|
];
|
|
|
|
|
for (const capability of capabilities) {
|
|
|
|
|
if (capability === EToolResources.file_search) {
|
|
|
|
|
_options.push({
|
|
|
|
|
label: localize('com_ui_upload_file_search'),
|
|
|
|
|
value: EToolResources.file_search,
|
|
|
|
|
icon: <FileSearch className="icon-md" />,
|
|
|
|
|
});
|
|
|
|
|
} else if (capability === EToolResources.execute_code) {
|
|
|
|
|
_options.push({
|
|
|
|
|
label: localize('com_ui_upload_code_files'),
|
|
|
|
|
value: EToolResources.execute_code,
|
|
|
|
|
icon: <TerminalSquareIcon className="icon-md" />,
|
|
|
|
|
});
|
2025-03-10 17:23:46 -04:00
|
|
|
} else if (capability === EToolResources.ocr) {
|
|
|
|
|
_options.push({
|
|
|
|
|
label: localize('com_ui_upload_ocr_text'),
|
|
|
|
|
value: EToolResources.ocr,
|
|
|
|
|
icon: <FileType2Icon className="icon-md" />,
|
|
|
|
|
});
|
2024-12-19 13:04:48 -05:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return _options;
|
|
|
|
|
}, [capabilities, files, localize]);
|
|
|
|
|
|
|
|
|
|
if (!isVisible) {
|
|
|
|
|
return null;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return (
|
|
|
|
|
<OGDialog open={isVisible} onOpenChange={setShowModal}>
|
|
|
|
|
<OGDialogTemplate
|
|
|
|
|
title={localize('com_ui_upload_type')}
|
|
|
|
|
className="w-11/12 sm:w-[440px] md:w-[400px] lg:w-[360px]"
|
|
|
|
|
main={
|
|
|
|
|
<div className="flex flex-col gap-2">
|
|
|
|
|
{options.map(
|
|
|
|
|
(option, index) =>
|
|
|
|
|
option.condition !== false && (
|
|
|
|
|
<button
|
|
|
|
|
key={index}
|
|
|
|
|
onClick={() => onOptionSelect(option.value)}
|
|
|
|
|
className="flex items-center gap-2 rounded-lg p-2 hover:bg-surface-active-alt"
|
|
|
|
|
>
|
|
|
|
|
{option.icon}
|
|
|
|
|
<span>{option.label}</span>
|
|
|
|
|
</button>
|
|
|
|
|
),
|
|
|
|
|
)}
|
|
|
|
|
</div>
|
|
|
|
|
}
|
|
|
|
|
/>
|
|
|
|
|
</OGDialog>
|
|
|
|
|
);
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
export default DragDropModal;
|