Timothy Jaeryang Baek 1 semana atrás
pai
commit
2fa222d00a
2 arquivos alterados com 30 adições e 11 exclusões
  1. 17 5
      backend/open_webui/utils/middleware.py
  2. 13 6
      src/lib/apis/index.ts

+ 17 - 5
backend/open_webui/utils/middleware.py

@@ -2545,21 +2545,33 @@ async def process_chat_response(
                             else:
                                 tool_result = tool_result.body.decode("utf-8")
 
-                        elif tool.get("type") == "external" and isinstance(
-                            tool_result, tuple
+                        elif (
+                            tool.get("type") == "external"
+                            and isinstance(tool_result, tuple)
+                        ) or (
+                            tool.get("direct", True)
+                            and isinstance(tool_result, list)
+                            and len(tool_result) == 2
                         ):
                             tool_result, tool_response_headers = tool_result
 
                             if tool_response_headers:
                                 content_disposition = tool_response_headers.get(
-                                    "Content-Disposition", ""
+                                    "Content-Disposition",
+                                    tool_response_headers.get(
+                                        "content-disposition", ""
+                                    ),
                                 )
 
                                 if "inline" in content_disposition:
                                     content_type = tool_response_headers.get(
-                                        "Content-Type", ""
+                                        "Content-Type",
+                                        tool_response_headers.get("content-type", ""),
+                                    )
+                                    location = tool_response_headers.get(
+                                        "Location",
+                                        tool_response_headers.get("location", ""),
                                     )
-                                    location = tool_response_headers.get("Location", "")
 
                                     if "text/html" in content_type:
                                         # Display as iframe embed

+ 13 - 6
src/lib/apis/index.ts

@@ -493,18 +493,25 @@ export const executeToolServer = async (
 			throw new Error(`HTTP error! Status: ${res.status}. Message: ${resText}`);
 		}
 
+		// make a clone of res and extract headers
+		const responseHeaders = {};
+		res.headers.forEach((value, key) => {
+			responseHeaders[key] = value;
+		});
+
+		const text = await res.text();
 		let responseData;
+
 		try {
-			responseData = await res.json();
-		} catch (err) {
-			responseData = await res.text();
+			responseData = JSON.parse(text);
+		} catch {
+			responseData = text;
 		}
-
-		return responseData;
+		return [responseData, responseHeaders];
 	} catch (err: any) {
 		error = err.message;
 		console.error('API Request Error:', error);
-		return { error };
+		return [{ error }, null];
 	}
 };