@ -7,6 +7,7 @@ from core.model_runtime.entities import (
AudioPromptMessageContent ,
DocumentPromptMessageContent ,
ImagePromptMessageContent ,
TextPromptMessageContent ,
VideoPromptMessageContent ,
)
from core . model_runtime . entities . message_entities import PromptMessageContentUnionTypes
@ -44,11 +45,46 @@ def to_prompt_message_content(
* ,
image_detail_config : ImagePromptMessageContent . DETAIL | None = None ,
) - > PromptMessageContentUnionTypes :
"""
Convert a file to prompt message content .
This function converts files to their appropriate prompt message content types .
For supported file types ( IMAGE , AUDIO , VIDEO , DOCUMENT ) , it creates the
corresponding message content with proper encoding / URL .
For unsupported file types , instead of raising an error , it returns a
TextPromptMessageContent with a descriptive message about the file .
Args :
f : The file to convert
image_detail_config : Optional detail configuration for image files
Returns :
PromptMessageContentUnionTypes : The appropriate message content type
Raises :
ValueError : If file extension or mime_type is missing
"""
if f . extension is None :
raise ValueError ( " Missing file extension " )
if f . mime_type is None :
raise ValueError ( " Missing file mime_type " )
prompt_class_map : Mapping [ FileType , type [ PromptMessageContentUnionTypes ] ] = {
FileType . IMAGE : ImagePromptMessageContent ,
FileType . AUDIO : AudioPromptMessageContent ,
FileType . VIDEO : VideoPromptMessageContent ,
FileType . DOCUMENT : DocumentPromptMessageContent ,
}
# Check if file type is supported
if f . type not in prompt_class_map :
# For unsupported file types, return a text description
return TextPromptMessageContent (
data = f " [Unsupported file type: { f . filename } ( { f . type . value } )] "
)
# Process supported file types
params = {
" base64_data " : _get_encoded_string ( f ) if dify_config . MULTIMODAL_SEND_FORMAT == " base64 " else " " ,
" url " : _to_url ( f ) if dify_config . MULTIMODAL_SEND_FORMAT == " url " else " " ,
@ -58,17 +94,7 @@ def to_prompt_message_content(
if f . type == FileType . IMAGE :
params [ " detail " ] = image_detail_config or ImagePromptMessageContent . DETAIL . LOW
prompt_class_map : Mapping [ FileType , type [ PromptMessageContentUnionTypes ] ] = {
FileType . IMAGE : ImagePromptMessageContent ,
FileType . AUDIO : AudioPromptMessageContent ,
FileType . VIDEO : VideoPromptMessageContent ,
FileType . DOCUMENT : DocumentPromptMessageContent ,
}
try :
return prompt_class_map [ f . type ] . model_validate ( params )
except KeyError :
raise ValueError ( f " file type { f . type } is not supported " )
return prompt_class_map [ f . type ] . model_validate ( params )
def download ( f : File , / ) :