Skip to content

Commit bf4b6e5

Browse files
authored
feat: support custom tool upload file (#10796)
1 parent 25fda7a commit bf4b6e5

File tree

2 files changed

+13
-3
lines changed

2 files changed

+13
-3
lines changed

api/core/tools/tool/api_tool.py

+10-3
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55

66
import httpx
77

8+
from core.file.file_manager import download
89
from core.helper import ssrf_proxy
910
from core.tools.entities.tool_bundle import ApiToolBundle
1011
from core.tools.entities.tool_entities import ToolInvokeMessage, ToolProviderType
@@ -138,6 +139,7 @@ def do_http_request(
138139
path_params = {}
139140
body = {}
140141
cookies = {}
142+
files = []
141143

142144
# check parameters
143145
for parameter in self.api_bundle.openapi.get("parameters", []):
@@ -166,8 +168,12 @@ def do_http_request(
166168
properties = body_schema.get("properties", {})
167169
for name, property in properties.items():
168170
if name in parameters:
169-
# convert type
170-
body[name] = self._convert_body_property_type(property, parameters[name])
171+
if property.get("format") == "binary":
172+
f = parameters[name]
173+
files.append((name, (f.filename, download(f), f.mime_type)))
174+
else:
175+
# convert type
176+
body[name] = self._convert_body_property_type(property, parameters[name])
171177
elif name in required:
172178
raise ToolParameterValidationError(
173179
f"Missing required parameter {name} in operation {self.api_bundle.operation_id}"
@@ -182,7 +188,7 @@ def do_http_request(
182188
for name, value in path_params.items():
183189
url = url.replace(f"{{{name}}}", f"{value}")
184190

185-
# parse http body data if needed, for GET/HEAD/OPTIONS/TRACE, the body is ignored
191+
# parse http body data if needed
186192
if "Content-Type" in headers:
187193
if headers["Content-Type"] == "application/json":
188194
body = json.dumps(body)
@@ -198,6 +204,7 @@ def do_http_request(
198204
headers=headers,
199205
cookies=cookies,
200206
data=body,
207+
files=files,
201208
timeout=API_TOOL_DEFAULT_TIMEOUT,
202209
follow_redirects=True,
203210
)

api/core/tools/utils/parser.py

+3
Original file line numberDiff line numberDiff line change
@@ -161,6 +161,9 @@ def parse_openapi_to_tool_bundle(
161161
def _get_tool_parameter_type(parameter: dict) -> ToolParameter.ToolParameterType:
162162
parameter = parameter or {}
163163
typ = None
164+
if parameter.get("format") == "binary":
165+
return ToolParameter.ToolParameterType.FILE
166+
164167
if "type" in parameter:
165168
typ = parameter["type"]
166169
elif "schema" in parameter and "type" in parameter["schema"]:

0 commit comments

Comments
 (0)