Quellcode durchsuchen

Fix: crash of workflow file upload (#10831)

Co-authored-by: -LAN- <laipz8200@outlook.com>
Co-authored-by: StyleZhang <jasonapring2015@outlook.com>
tags/0.12.0
KVOJJJin vor 11 Monaten
Ursprung
Commit
328965ed7c
Es ist kein Account mit der E-Mail-Adresse des Committers verbunden

+ 1
- 3
api/core/app/app_config/features/file_upload/manager.py Datei anzeigen

file_upload_dict = config.get("file_upload") file_upload_dict = config.get("file_upload")
if file_upload_dict: if file_upload_dict:
if file_upload_dict.get("enabled"): if file_upload_dict.get("enabled"):
transform_methods = file_upload_dict.get("allowed_file_upload_methods") or file_upload_dict.get(
"allowed_upload_methods", []
)
transform_methods = file_upload_dict.get("allowed_file_upload_methods", [])
data = { data = {
"image_config": { "image_config": {
"number_limits": file_upload_dict["number_limits"], "number_limits": file_upload_dict["number_limits"],

+ 4
- 4
api/core/app/apps/base_app_generator.py Datei anzeigen

tenant_id=app_config.tenant_id, tenant_id=app_config.tenant_id,
config=FileUploadConfig( config=FileUploadConfig(
allowed_file_types=entity_dictionary[k].allowed_file_types, allowed_file_types=entity_dictionary[k].allowed_file_types,
allowed_extensions=entity_dictionary[k].allowed_file_extensions,
allowed_upload_methods=entity_dictionary[k].allowed_file_upload_methods,
allowed_file_extensions=entity_dictionary[k].allowed_file_extensions,
allowed_file_upload_methods=entity_dictionary[k].allowed_file_upload_methods,
), ),
) )
for k, v in user_inputs.items() for k, v in user_inputs.items()
tenant_id=app_config.tenant_id, tenant_id=app_config.tenant_id,
config=FileUploadConfig( config=FileUploadConfig(
allowed_file_types=entity_dictionary[k].allowed_file_types, allowed_file_types=entity_dictionary[k].allowed_file_types,
allowed_extensions=entity_dictionary[k].allowed_file_extensions,
allowed_upload_methods=entity_dictionary[k].allowed_file_upload_methods,
allowed_file_extensions=entity_dictionary[k].allowed_file_extensions,
allowed_file_upload_methods=entity_dictionary[k].allowed_file_upload_methods,
), ),
) )
for k, v in user_inputs.items() for k, v in user_inputs.items()

+ 2
- 2
api/core/file/models.py Datei anzeigen



image_config: Optional[ImageConfig] = None image_config: Optional[ImageConfig] = None
allowed_file_types: Sequence[FileType] = Field(default_factory=list) allowed_file_types: Sequence[FileType] = Field(default_factory=list)
allowed_extensions: Sequence[str] = Field(default_factory=list)
allowed_upload_methods: Sequence[FileTransferMethod] = Field(default_factory=list)
allowed_file_extensions: Sequence[str] = Field(default_factory=list)
allowed_file_upload_methods: Sequence[FileTransferMethod] = Field(default_factory=list)
number_limits: int = 0 number_limits: int = 0





+ 2
- 2
api/factories/file_factory.py Datei anzeigen

if config.allowed_file_types and file.type not in config.allowed_file_types and file.type != FileType.CUSTOM: if config.allowed_file_types and file.type not in config.allowed_file_types and file.type != FileType.CUSTOM:
return False return False


if config.allowed_extensions and file.extension not in config.allowed_extensions:
if config.allowed_file_extensions and file.extension not in config.allowed_file_extensions:
return False return False


if config.allowed_upload_methods and file.transfer_method not in config.allowed_upload_methods:
if config.allowed_file_upload_methods and file.transfer_method not in config.allowed_file_upload_methods:
return False return False


if file.type == FileType.IMAGE and config.image_config: if file.type == FileType.IMAGE and config.image_config:

+ 2
- 2
api/models/workflow.py Datei anzeigen

) )
features["file_upload"]["enabled"] = image_enabled features["file_upload"]["enabled"] = image_enabled
features["file_upload"]["number_limits"] = image_number_limits features["file_upload"]["number_limits"] = image_number_limits
features["file_upload"]["allowed_upload_methods"] = image_transfer_methods
features["file_upload"]["allowed_file_upload_methods"] = image_transfer_methods
features["file_upload"]["allowed_file_types"] = ["image"] features["file_upload"]["allowed_file_types"] = ["image"]
features["file_upload"]["allowed_extensions"] = []
features["file_upload"]["allowed_file_extensions"] = []
del features["file_upload"]["image"] del features["file_upload"]["image"]
self._features = json.dumps(features) self._features = json.dumps(features)
return self._features return self._features

+ 2
- 2
api/tests/integration_tests/workflow/test_sync_workflow.py Datei anzeigen

"file_upload": { "file_upload": {
"enabled": True, "enabled": True,
"allowed_file_types": ["image"], "allowed_file_types": ["image"],
"allowed_extensions": [],
"allowed_upload_methods": ["remote_url", "local_file"],
"allowed_file_extensions": [],
"allowed_file_upload_methods": ["remote_url", "local_file"],
"number_limits": 6, "number_limits": 6,
}, },
"opening_statement": "", "opening_statement": "",

+ 41
- 1
api/tests/unit_tests/core/test_file.py Datei anzeigen

from core.file import FILE_MODEL_IDENTITY, File, FileTransferMethod, FileType
import json

from core.file import FILE_MODEL_IDENTITY, File, FileTransferMethod, FileType, FileUploadConfig
from models.workflow import Workflow




def test_file_loads_and_dumps(): def test_file_loads_and_dumps():
file_dict = file.to_dict() file_dict = file.to_dict()
assert "_extra_config" not in file_dict assert "_extra_config" not in file_dict
assert "url" in file_dict assert "url" in file_dict


def test_workflow_features_with_image():
# Create a feature dict that mimics the old structure with image config
features = {
"file_upload": {
"image": {"enabled": True, "number_limits": 5, "transfer_methods": ["remote_url", "local_file"]}
}
}

# Create a workflow instance with the features
workflow = Workflow(
tenant_id="tenant-1",
app_id="app-1",
type="chat",
version="1.0",
graph="{}",
features=json.dumps(features),
created_by="user-1",
environment_variables=[],
conversation_variables=[],
)

# Get the converted features through the property
converted_features = json.loads(workflow.features)

# Create FileUploadConfig from the converted features
file_upload_config = FileUploadConfig.model_validate(converted_features["file_upload"])

# Validate the config
assert file_upload_config.number_limits == 5
assert list(file_upload_config.allowed_file_types) == [FileType.IMAGE]
assert list(file_upload_config.allowed_file_upload_methods) == [
FileTransferMethod.REMOTE_URL,
FileTransferMethod.LOCAL_FILE,
]
assert list(file_upload_config.allowed_file_extensions) == []

+ 10
- 7
web/app/components/base/file-uploader/utils.ts Datei anzeigen

} }


export const getFileExtension = (fileName: string, fileMimetype: string, isRemote?: boolean) => { export const getFileExtension = (fileName: string, fileMimetype: string, isRemote?: boolean) => {
let extension = ''
if (fileMimetype) if (fileMimetype)
return mime.getExtension(fileMimetype) || ''
extension = mime.getExtension(fileMimetype) || ''


if (isRemote)
return ''

if (fileName) {
if (fileName && !extension) {
const fileNamePair = fileName.split('.') const fileNamePair = fileName.split('.')
const fileNamePairLength = fileNamePair.length const fileNamePairLength = fileNamePair.length


if (fileNamePairLength > 1) if (fileNamePairLength > 1)
return fileNamePair[fileNamePairLength - 1]
extension = fileNamePair[fileNamePairLength - 1]
else
extension = ''
} }


return ''
if (isRemote)
extension = ''

return extension
} }


export const getFileAppearanceType = (fileName: string, fileMimetype: string) => { export const getFileAppearanceType = (fileName: string, fileMimetype: string) => {

+ 1
- 1
web/app/components/share/text-generation/index.tsx Datei anzeigen

setVisionConfig({ setVisionConfig({
// legacy of image upload compatible // legacy of image upload compatible
...file_upload, ...file_upload,
transfer_methods: file_upload.allowed_upload_methods,
transfer_methods: file_upload.allowed_file_upload_methods || file_upload.allowed_upload_methods,
// legacy of image upload compatible // legacy of image upload compatible
image_file_size_limit: appParams?.system_parameters?.image_file_size_limit, image_file_size_limit: appParams?.system_parameters?.image_file_size_limit,
fileUploadConfig: appParams?.system_parameters, fileUploadConfig: appParams?.system_parameters,

Laden…
Abbrechen
Speichern