| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697 | 
							- import mimetypes
 - import os
 - import re
 - import urllib.parse
 - from collections.abc import Mapping
 - from typing import Any
 - from uuid import uuid4
 - 
 - import httpx
 - from pydantic import BaseModel
 - 
 - from configs import dify_config
 - 
 - 
 - class FileInfo(BaseModel):
 -     filename: str
 -     extension: str
 -     mimetype: str
 -     size: int
 - 
 - 
 - def guess_file_info_from_response(response: httpx.Response):
 -     url = str(response.url)
 -     # Try to extract filename from URL
 -     parsed_url = urllib.parse.urlparse(url)
 -     url_path = parsed_url.path
 -     filename = os.path.basename(url_path)
 - 
 -     # If filename couldn't be extracted, use Content-Disposition header
 -     if not filename:
 -         content_disposition = response.headers.get("Content-Disposition")
 -         if content_disposition:
 -             filename_match = re.search(r'filename="?(.+)"?', content_disposition)
 -             if filename_match:
 -                 filename = filename_match.group(1)
 - 
 -     # If still no filename, generate a unique one
 -     if not filename:
 -         unique_name = str(uuid4())
 -         filename = f"{unique_name}"
 - 
 -     # Guess MIME type from filename first, then URL
 -     mimetype, _ = mimetypes.guess_type(filename)
 -     if mimetype is None:
 -         mimetype, _ = mimetypes.guess_type(url)
 -     if mimetype is None:
 -         # If guessing fails, use Content-Type from response headers
 -         mimetype = response.headers.get("Content-Type", "application/octet-stream")
 - 
 -     extension = os.path.splitext(filename)[1]
 - 
 -     # Ensure filename has an extension
 -     if not extension:
 -         extension = mimetypes.guess_extension(mimetype) or ".bin"
 -         filename = f"{filename}{extension}"
 - 
 -     return FileInfo(
 -         filename=filename,
 -         extension=extension,
 -         mimetype=mimetype,
 -         size=int(response.headers.get("Content-Length", -1)),
 -     )
 - 
 - 
 - def get_parameters_from_feature_dict(*, features_dict: Mapping[str, Any], user_input_form: list[dict[str, Any]]):
 -     return {
 -         "opening_statement": features_dict.get("opening_statement"),
 -         "suggested_questions": features_dict.get("suggested_questions", []),
 -         "suggested_questions_after_answer": features_dict.get("suggested_questions_after_answer", {"enabled": False}),
 -         "speech_to_text": features_dict.get("speech_to_text", {"enabled": False}),
 -         "text_to_speech": features_dict.get("text_to_speech", {"enabled": False}),
 -         "retriever_resource": features_dict.get("retriever_resource", {"enabled": False}),
 -         "annotation_reply": features_dict.get("annotation_reply", {"enabled": False}),
 -         "more_like_this": features_dict.get("more_like_this", {"enabled": False}),
 -         "user_input_form": user_input_form,
 -         "sensitive_word_avoidance": features_dict.get(
 -             "sensitive_word_avoidance", {"enabled": False, "type": "", "configs": []}
 -         ),
 -         "file_upload": features_dict.get(
 -             "file_upload",
 -             {
 -                 "image": {
 -                     "enabled": False,
 -                     "number_limits": 3,
 -                     "detail": "high",
 -                     "transfer_methods": ["remote_url", "local_file"],
 -                 }
 -             },
 -         ),
 -         "system_parameters": {
 -             "image_file_size_limit": dify_config.UPLOAD_IMAGE_FILE_SIZE_LIMIT,
 -             "video_file_size_limit": dify_config.UPLOAD_VIDEO_FILE_SIZE_LIMIT,
 -             "audio_file_size_limit": dify_config.UPLOAD_AUDIO_FILE_SIZE_LIMIT,
 -             "file_size_limit": dify_config.UPLOAD_FILE_SIZE_LIMIT,
 -             "workflow_file_upload_limit": dify_config.WORKFLOW_FILE_UPLOAD_LIMIT,
 -         },
 -     }
 
 
  |