| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485 | import loggingfrom mimetypes import guess_extensionfrom core.tools.entities.tool_entities import ToolInvokeMessagefrom core.tools.tool_file_manager import ToolFileManagerlogger = logging.getLogger(__name__)class ToolFileMessageTransformer:    @staticmethod    def transform_tool_invoke_messages(messages: list[ToolInvokeMessage],                                       user_id: str,                                       tenant_id: str,                                       conversation_id: str) -> list[ToolInvokeMessage]:        """        Transform tool message and handle file download        """        result = []        for message in messages:            if message.type == ToolInvokeMessage.MessageType.TEXT:                result.append(message)            elif message.type == ToolInvokeMessage.MessageType.LINK:                result.append(message)            elif message.type == ToolInvokeMessage.MessageType.IMAGE:                # try to download image                try:                    file = ToolFileManager.create_file_by_url(                        user_id=user_id,                         tenant_id=tenant_id,                        conversation_id=conversation_id,                        file_url=message.message                    )                                        url = f'/files/tools/{file.id}{guess_extension(file.mimetype) or ".png"}'                    result.append(ToolInvokeMessage(                        type=ToolInvokeMessage.MessageType.IMAGE_LINK,                        message=url,                        save_as=message.save_as,                        meta=message.meta.copy() if message.meta is not None else {},                    ))                except Exception as e:                    logger.exception(e)                    result.append(ToolInvokeMessage(                        type=ToolInvokeMessage.MessageType.TEXT,                        message=f"Failed to download image: {message.message}, you can try to download it yourself.",                        meta=message.meta.copy() if message.meta is not None else {},                        save_as=message.save_as,                    ))            elif message.type == ToolInvokeMessage.MessageType.BLOB:                # get mime type and save blob to storage                mimetype = message.meta.get('mime_type', 'octet/stream')                # if message is str, encode it to bytes                if isinstance(message.message, str):                    message.message = message.message.encode('utf-8')                                file = ToolFileManager.create_file_by_raw(                    user_id=user_id, tenant_id=tenant_id,                    conversation_id=conversation_id,                    file_binary=message.message,                    mimetype=mimetype                )                                                                            url = f'/files/tools/{file.id}{guess_extension(file.mimetype) or ".bin"}'                # check if file is image                if 'image' in mimetype:                    result.append(ToolInvokeMessage(                        type=ToolInvokeMessage.MessageType.IMAGE_LINK,                        message=url,                        save_as=message.save_as,                        meta=message.meta.copy() if message.meta is not None else {},                    ))                else:                    result.append(ToolInvokeMessage(                        type=ToolInvokeMessage.MessageType.LINK,                        message=url,                        save_as=message.save_as,                        meta=message.meta.copy() if message.meta is not None else {},                    ))            else:                result.append(message)        return result
 |