| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125 | import mimetypesimport osimport platformimport reimport urllib.parseimport warningsfrom collections.abc import Mappingfrom typing import Anyfrom uuid import uuid4import httpxtry:    import magicexcept ImportError:    if platform.system() == "Windows":        warnings.warn(            "To use python-magic guess MIMETYPE, you need to run `pip install python-magic-bin`", stacklevel=2        )    elif platform.system() == "Darwin":        warnings.warn("To use python-magic guess MIMETYPE, you need to run `brew install libmagic`", stacklevel=2)    elif platform.system() == "Linux":        warnings.warn(            "To use python-magic guess MIMETYPE, you need to run `sudo apt-get install libmagic1`", stacklevel=2        )    else:        warnings.warn("To use python-magic guess MIMETYPE, you need to install `libmagic`", stacklevel=2)    magic = None  # type: ignorefrom pydantic import BaseModelfrom configs import dify_configclass FileInfo(BaseModel):    filename: str    extension: str    mimetype: str    size: intdef 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")    # Use python-magic to guess MIME type if still unknown or generic    if mimetype == "application/octet-stream" and magic is not None:        try:            mimetype = magic.from_buffer(response.content[:1024], mime=True)        except magic.MagicException:            pass    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,        },    }
 |