|
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) |
|
|
|
parsed_url = urllib.parse.urlparse(url) |
|
url_path = parsed_url.path |
|
filename = os.path.basename(url_path) |
|
|
|
|
|
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 not filename: |
|
unique_name = str(uuid4()) |
|
filename = f"{unique_name}" |
|
|
|
|
|
mimetype, _ = mimetypes.guess_type(filename) |
|
if mimetype is None: |
|
mimetype, _ = mimetypes.guess_type(url) |
|
if mimetype is None: |
|
|
|
mimetype = response.headers.get("Content-Type", "application/octet-stream") |
|
|
|
extension = os.path.splitext(filename)[1] |
|
|
|
|
|
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, |
|
}, |
|
} |
|
|