import React, { useMemo } from 'react'; import { Paperclip, FileText, Image, FileType } from 'lucide-react'; import type { AgentToolResources } from 'librechat-data-provider'; import { useGetFiles } from '~/data-provider'; import { useLocalize } from '~/hooks'; interface PromptFilesPreviewProps { toolResources: AgentToolResources; } const PromptFilesPreview: React.FC = ({ toolResources }) => { const localize = useLocalize(); const { data: allFiles = [] } = useGetFiles(); // Create a fileMap for quick lookup const fileMap = useMemo(() => { const map: Record = {}; allFiles.forEach((file) => { if (file.file_id) { map[file.file_id] = file; } }); return map; }, [allFiles]); // Extract all file IDs from tool resources const attachedFiles = useMemo(() => { const files: Array<{ file: any; toolResource: string }> = []; Object.entries(toolResources).forEach(([toolResource, resource]) => { if (resource?.file_ids) { resource.file_ids.forEach((fileId) => { const dbFile = fileMap[fileId]; if (dbFile) { files.push({ file: dbFile, toolResource }); } }); } }); return files; }, [toolResources, fileMap]); const getFileIcon = (type: string) => { if (type?.startsWith('image/')) { return ; } if (type?.includes('text') || type?.includes('document')) { return ; } return ; }; const getToolResourceLabel = (toolResource: string) => { switch (toolResource) { case 'file_search': return 'File Search'; case 'execute_code': return 'Code Interpreter'; case 'ocr': return 'Text Extraction'; case 'image_edit': return 'Image Editing'; default: return toolResource; } }; if (attachedFiles.length === 0) { return null; } return (

{localize('com_ui_files')} ({attachedFiles.length})

{attachedFiles.map(({ file, toolResource }, index) => (
{getFileIcon(file.type)}
{file.filename}
{getToolResourceLabel(toolResource)} {file.bytes && ( <> {(file.bytes / 1024).toFixed(1)} KB )}
{file.type?.startsWith('image/') && file.width && file.height && (
{file.width} × {file.height}
)}
))}
); }; export default PromptFilesPreview;