55from json import loads
66import re
77
8+ # 导入 logging 和自定义处理器
9+ import logging
10+ from dify_plugin .config .logger_format import plugin_logger_handler
11+
812from dify_plugin import Tool
913from dify_plugin .entities .tool import ToolInvokeMessage
1014
15+ # 使用自定义处理器设置日志
16+ logger = logging .getLogger (__name__ )
17+ logger .setLevel (logging .INFO )
18+ logger .addHandler (plugin_logger_handler )
1119
1220class HttpRequestStreamTool (Tool ):
1321 def _invoke (self , tool_parameters : dict [str , Any ]) -> Generator [ToolInvokeMessage , None , None ]:
@@ -23,10 +31,14 @@ def _invoke(self, tool_parameters: dict[str, Any]) -> Generator[ToolInvokeMessag
2331 body = tool_parameters .get ("body" , None )
2432 headers_str = tool_parameters .get ("headers" , None )
2533 if not url :
26- raise httpx .InvalidURL ("URL cannot be empty." )
34+ err_msg = "URL cannot be empty."
35+ logger .error (err_msg )
36+ raise httpx .InvalidURL (err_msg )
2737
2838 if not url .startswith (("http://" , "https://" )):
29- raise httpx .InvalidURL ("URL must start with http:// or https://." )
39+ err_msg = "URL must start with http:// or https://."
40+ logger .error (err_msg )
41+ raise httpx .InvalidURL (err_msg )
3042
3143 # 解析 headers 参数:支持用户以 JSON 对象字符串方式传入请求头
3244 user_headers : dict [str , Any ] = {}
@@ -36,10 +48,14 @@ def _invoke(self, tool_parameters: dict[str, Any]) -> Generator[ToolInvokeMessag
3648 if isinstance (parsed , dict ):
3749 user_headers = parsed
3850 else :
39- raise ValueError ("headers must be a JSON object string." )
51+ err_msg = "headers must be a JSON object string."
52+ logger .error (err_msg )
53+ raise ValueError (err_msg )
4054 except ValueError :
4155 # 用户传入的 headers 字符串不是合法 JSON 或不是对象
42- raise ValueError ("headers must be a valid JSON object string." )
56+ err_msg = "headers must be a valid JSON object string."
57+ logger .error (err_msg )
58+ raise ValueError (err_msg )
4359
4460 # 构造 httpx.stream 的参数,增加 SSE 兼容头部与超时设置
4561 stream_kwargs : dict [str , Any ] = {
@@ -68,7 +84,9 @@ def _invoke(self, tool_parameters: dict[str, Any]) -> Generator[ToolInvokeMessag
6884 req_body = loads (body )
6985 stream_kwargs ["json" ] = req_body
7086 except ValueError :
71- raise ValueError ("body must be a valid JSON string." )
87+ err_msg = "body must be a valid JSON string."
88+ logger .error (err_msg )
89+ raise ValueError (err_msg )
7290
7391 try :
7492 # 标记是否已经提取并输出过 conversation_id,避免重复输出
@@ -78,7 +96,10 @@ def _invoke(self, tool_parameters: dict[str, Any]) -> Generator[ToolInvokeMessag
7896 with httpx .stream (** stream_kwargs ) as response :
7997 # 对非 2xx 状态码进行友好提示并终止流
8098 if response .status_code < 200 or response .status_code >= 300 :
81- raise httpx .HTTPStatusError (f"HTTP Error: { response .status_code } " , response = response )
99+ err_msg = f"HTTP Error: { response .status_code } "
100+ logger .error (err_msg )
101+ # 使用 httpx 内置的 raise_for_status 构造并抛出包含 request/response 的异常
102+ response .raise_for_status ()
82103 for raw_line in response .iter_lines ():
83104 if raw_line is None :
84105 continue
@@ -103,8 +124,11 @@ def _invoke(self, tool_parameters: dict[str, Any]) -> Generator[ToolInvokeMessag
103124
104125 except httpx .HTTPError as e :
105126 # 捕获 httpx 的 HTTP 异常,并输出到用户侧
127+ err_msg = f"HTTP Error: { e } "
128+ logger .error (err_msg )
106129 raise e
107130 except Exception as e :
108131 # 捕获其他意料之外的异常,避免中断
132+ err_msg = f"Unexpected Error: { e } "
133+ logger .error (err_msg )
109134 raise e
110-
0 commit comments