mirror of
https://git.mirrors.martin98.com/https://github.com/langgenius/dify.git
synced 2025-07-31 01:52:04 +08:00
Fix Custom Tool File Upload: Resolve Multiple Files Recognition and Multipart Boundary Issues (#14014)
Co-authored-by: crazywoola <427733928@qq.com>
This commit is contained in:
parent
8047d08b3b
commit
8b89447549
@ -195,7 +195,12 @@ class ApiTool(Tool):
|
|||||||
properties = body_schema.get("properties", {})
|
properties = body_schema.get("properties", {})
|
||||||
for name, property in properties.items():
|
for name, property in properties.items():
|
||||||
if name in parameters:
|
if name in parameters:
|
||||||
if property.get("format") == "binary":
|
# multiple file upload: if the type is array and the items have format as binary
|
||||||
|
if property.get("type") == "array" and property.get("items", {}).get("format") == "binary":
|
||||||
|
# parameters[name] should be a list of file objects.
|
||||||
|
for f in parameters[name]:
|
||||||
|
files.append((name, (f.filename, download(f), f.mime_type)))
|
||||||
|
elif property.get("format") == "binary":
|
||||||
f = parameters[name]
|
f = parameters[name]
|
||||||
files.append((name, (f.filename, download(f), f.mime_type)))
|
files.append((name, (f.filename, download(f), f.mime_type)))
|
||||||
elif "$ref" in property:
|
elif "$ref" in property:
|
||||||
@ -226,6 +231,13 @@ class ApiTool(Tool):
|
|||||||
else:
|
else:
|
||||||
body = body
|
body = body
|
||||||
|
|
||||||
|
# if there is a file upload, remove the Content-Type header
|
||||||
|
# so that httpx can automatically generate the boundary header required for multipart/form-data.
|
||||||
|
# issue: https://github.com/langgenius/dify/issues/13684
|
||||||
|
# reference: https://stackoverflow.com/questions/39280438/fetch-missing-boundary-in-multipart-form-data-post
|
||||||
|
if files:
|
||||||
|
headers.pop("Content-Type", None)
|
||||||
|
|
||||||
if method in {
|
if method in {
|
||||||
"get",
|
"get",
|
||||||
"head",
|
"head",
|
||||||
|
@ -186,6 +186,9 @@ class ApiBasedToolSchemaParser:
|
|||||||
return ToolParameter.ToolParameterType.BOOLEAN
|
return ToolParameter.ToolParameterType.BOOLEAN
|
||||||
elif typ == "string":
|
elif typ == "string":
|
||||||
return ToolParameter.ToolParameterType.STRING
|
return ToolParameter.ToolParameterType.STRING
|
||||||
|
elif typ == "array":
|
||||||
|
items = parameter.get("items") or parameter.get("schema", {}).get("items")
|
||||||
|
return ToolParameter.ToolParameterType.FILES if items and items.get("format") == "binary" else None
|
||||||
else:
|
else:
|
||||||
return None
|
return None
|
||||||
|
|
||||||
|
@ -51,3 +51,6 @@ http_port ${REVERSE_PROXY_PORT} accel vhost
|
|||||||
cache_peer ${SANDBOX_HOST} parent ${SANDBOX_PORT} 0 no-query originserver
|
cache_peer ${SANDBOX_HOST} parent ${SANDBOX_PORT} 0 no-query originserver
|
||||||
acl src_all src all
|
acl src_all src all
|
||||||
http_access allow src_all
|
http_access allow src_all
|
||||||
|
|
||||||
|
# Unless the option's size is increased, an error will occur when uploading more than two files.
|
||||||
|
client_request_buffer_max_size 100 MB
|
Loading…
x
Reference in New Issue
Block a user