import { Tools, Constants, ContentTypes, ToolCallTypes, imageGenTools, isImageVisionTool, } from 'librechat-data-provider'; import { memo } from 'react'; import type { TMessageContentParts, TAttachment } from 'librechat-data-provider'; import { OpenAIImageGen, EmptyText, Reasoning, ExecuteCode, AgentUpdate, Text } from './Parts'; import { ErrorMessage } from './MessageContent'; import RetrievalCall from './RetrievalCall'; import AgentHandoff from './AgentHandoff'; import CodeAnalyze from './CodeAnalyze'; import Container from './Container'; import WebSearch from './WebSearch'; import ToolCall from './ToolCall'; import ImageGen from './ImageGen'; import Image from './Image'; type PartProps = { part?: TMessageContentParts; isLast?: boolean; isSubmitting: boolean; showCursor: boolean; isCreatedByUser: boolean; attachments?: TAttachment[]; }; const Part = memo( ({ part, isSubmitting, attachments, isLast, showCursor, isCreatedByUser }: PartProps) => { if (!part) { return null; } if (part.type === ContentTypes.ERROR) { return ( ); } else if (part.type === ContentTypes.AGENT_UPDATE) { return ( <> {isLast && showCursor && ( )} ); } else if (part.type === ContentTypes.TEXT) { const text = typeof part.text === 'string' ? part.text : part.text?.value; if (typeof text !== 'string') { return null; } if (part.tool_call_ids != null && !text) { return null; } /** Skip rendering if text is only whitespace to avoid empty Container */ if (!isLast && text.length > 0 && /^\s*$/.test(text)) { return null; } return ( ); } else if (part.type === ContentTypes.THINK) { const reasoning = typeof part.think === 'string' ? part.think : part.think?.value; if (typeof reasoning !== 'string') { return null; } return ; } else if (part.type === ContentTypes.TOOL_CALL) { const toolCall = part[ContentTypes.TOOL_CALL]; if (!toolCall) { return null; } const isToolCall = 'args' in toolCall && (!toolCall.type || toolCall.type === ToolCallTypes.TOOL_CALL); if ( isToolCall && (toolCall.name === Tools.execute_code || toolCall.name === Constants.PROGRAMMATIC_TOOL_CALLING) ) { return ( ); } else if ( isToolCall && (toolCall.name === 'image_gen_oai' || toolCall.name === 'image_edit_oai' || toolCall.name === 'gemini_image_gen') ) { return ( ); } else if (isToolCall && toolCall.name === Tools.web_search) { return ( ); } else if (isToolCall && toolCall.name?.startsWith(Constants.LC_TRANSFER_TO_)) { return ( ); } else if (isToolCall) { return ( ); } else if (toolCall.type === ToolCallTypes.CODE_INTERPRETER) { const code_interpreter = toolCall[ToolCallTypes.CODE_INTERPRETER]; return ( ); } else if ( toolCall.type === ToolCallTypes.RETRIEVAL || toolCall.type === ToolCallTypes.FILE_SEARCH ) { return ( ); } else if ( toolCall.type === ToolCallTypes.FUNCTION && ToolCallTypes.FUNCTION in toolCall && imageGenTools.has(toolCall.function.name) ) { return ( ); } else if (toolCall.type === ToolCallTypes.FUNCTION && ToolCallTypes.FUNCTION in toolCall) { if (isImageVisionTool(toolCall)) { if (isSubmitting && showCursor) { return ( ); } return null; } return ( ); } } else if (part.type === ContentTypes.IMAGE_FILE) { const imageFile = part[ContentTypes.IMAGE_FILE]; const height = imageFile.height ?? 1920; const width = imageFile.width ?? 1080; return ( ); } return null; }, ); export default Part;