|
|
|
|
@ -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,44 @@ 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 +92,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, /):
|
|
|
|
|
|