5
5
6
6
import httpx
7
7
8
+ from core .file .file_manager import download
8
9
from core .helper import ssrf_proxy
9
10
from core .tools .entities .tool_bundle import ApiToolBundle
10
11
from core .tools .entities .tool_entities import ToolInvokeMessage , ToolProviderType
@@ -138,6 +139,7 @@ def do_http_request(
138
139
path_params = {}
139
140
body = {}
140
141
cookies = {}
142
+ files = []
141
143
142
144
# check parameters
143
145
for parameter in self .api_bundle .openapi .get ("parameters" , []):
@@ -166,8 +168,12 @@ def do_http_request(
166
168
properties = body_schema .get ("properties" , {})
167
169
for name , property in properties .items ():
168
170
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 ])
171
177
elif name in required :
172
178
raise ToolParameterValidationError (
173
179
f"Missing required parameter { name } in operation { self .api_bundle .operation_id } "
@@ -182,7 +188,7 @@ def do_http_request(
182
188
for name , value in path_params .items ():
183
189
url = url .replace (f"{{{ name } }}" , f"{ value } " )
184
190
185
- # parse http body data if needed, for GET/HEAD/OPTIONS/TRACE, the body is ignored
191
+ # parse http body data if needed
186
192
if "Content-Type" in headers :
187
193
if headers ["Content-Type" ] == "application/json" :
188
194
body = json .dumps (body )
@@ -198,6 +204,7 @@ def do_http_request(
198
204
headers = headers ,
199
205
cookies = cookies ,
200
206
data = body ,
207
+ files = files ,
201
208
timeout = API_TOOL_DEFAULT_TIMEOUT ,
202
209
follow_redirects = True ,
203
210
)
0 commit comments