mirror of
https://git.mirrors.martin98.com/https://github.com/langgenius/dify.git
synced 2025-08-14 06:55:57 +08:00
feat: support custom tool upload file (#10796)
This commit is contained in:
parent
25fda7adc5
commit
bf4b6e5f80
@ -5,6 +5,7 @@ from urllib.parse import urlencode
|
|||||||
|
|
||||||
import httpx
|
import httpx
|
||||||
|
|
||||||
|
from core.file.file_manager import download
|
||||||
from core.helper import ssrf_proxy
|
from core.helper import ssrf_proxy
|
||||||
from core.tools.entities.tool_bundle import ApiToolBundle
|
from core.tools.entities.tool_bundle import ApiToolBundle
|
||||||
from core.tools.entities.tool_entities import ToolInvokeMessage, ToolProviderType
|
from core.tools.entities.tool_entities import ToolInvokeMessage, ToolProviderType
|
||||||
@ -138,6 +139,7 @@ class ApiTool(Tool):
|
|||||||
path_params = {}
|
path_params = {}
|
||||||
body = {}
|
body = {}
|
||||||
cookies = {}
|
cookies = {}
|
||||||
|
files = []
|
||||||
|
|
||||||
# check parameters
|
# check parameters
|
||||||
for parameter in self.api_bundle.openapi.get("parameters", []):
|
for parameter in self.api_bundle.openapi.get("parameters", []):
|
||||||
@ -166,6 +168,10 @@ 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":
|
||||||
|
f = parameters[name]
|
||||||
|
files.append((name, (f.filename, download(f), f.mime_type)))
|
||||||
|
else:
|
||||||
# convert type
|
# convert type
|
||||||
body[name] = self._convert_body_property_type(property, parameters[name])
|
body[name] = self._convert_body_property_type(property, parameters[name])
|
||||||
elif name in required:
|
elif name in required:
|
||||||
@ -182,7 +188,7 @@ class ApiTool(Tool):
|
|||||||
for name, value in path_params.items():
|
for name, value in path_params.items():
|
||||||
url = url.replace(f"{{{name}}}", f"{value}")
|
url = url.replace(f"{{{name}}}", f"{value}")
|
||||||
|
|
||||||
# parse http body data if needed, for GET/HEAD/OPTIONS/TRACE, the body is ignored
|
# parse http body data if needed
|
||||||
if "Content-Type" in headers:
|
if "Content-Type" in headers:
|
||||||
if headers["Content-Type"] == "application/json":
|
if headers["Content-Type"] == "application/json":
|
||||||
body = json.dumps(body)
|
body = json.dumps(body)
|
||||||
@ -198,6 +204,7 @@ class ApiTool(Tool):
|
|||||||
headers=headers,
|
headers=headers,
|
||||||
cookies=cookies,
|
cookies=cookies,
|
||||||
data=body,
|
data=body,
|
||||||
|
files=files,
|
||||||
timeout=API_TOOL_DEFAULT_TIMEOUT,
|
timeout=API_TOOL_DEFAULT_TIMEOUT,
|
||||||
follow_redirects=True,
|
follow_redirects=True,
|
||||||
)
|
)
|
||||||
|
@ -161,6 +161,9 @@ class ApiBasedToolSchemaParser:
|
|||||||
def _get_tool_parameter_type(parameter: dict) -> ToolParameter.ToolParameterType:
|
def _get_tool_parameter_type(parameter: dict) -> ToolParameter.ToolParameterType:
|
||||||
parameter = parameter or {}
|
parameter = parameter or {}
|
||||||
typ = None
|
typ = None
|
||||||
|
if parameter.get("format") == "binary":
|
||||||
|
return ToolParameter.ToolParameterType.FILE
|
||||||
|
|
||||||
if "type" in parameter:
|
if "type" in parameter:
|
||||||
typ = parameter["type"]
|
typ = parameter["type"]
|
||||||
elif "schema" in parameter and "type" in parameter["schema"]:
|
elif "schema" in parameter and "type" in parameter["schema"]:
|
||||||
|
Loading…
x
Reference in New Issue
Block a user