Skip to content

Commit ec918ce

Browse files
author
mobiusy
committed
fix(http_request_stream): 添加日志记录并改进错误处理
为HTTP请求流工具添加日志记录功能,使用自定义日志处理器记录错误信息。改进错误处理,在抛出异常前记录详细错误信息,便于问题排查。同时更新README中的版本号至0.0.2。
1 parent 6c47aa2 commit ec918ce

2 files changed

Lines changed: 32 additions & 8 deletions

File tree

http_request_stream/README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44

55
## 基本信息
66
- 作者:mobiusy
7-
- 版本:0.0.1
7+
- 版本:0.0.2
88
- 类型:tool
99

1010
## 功能特性

http_request_stream/tools/http_request_stream.py

Lines changed: 31 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -5,9 +5,17 @@
55
from json import loads
66
import re
77

8+
# 导入 logging 和自定义处理器
9+
import logging
10+
from dify_plugin.config.logger_format import plugin_logger_handler
11+
812
from dify_plugin import Tool
913
from 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

1220
class 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

Comments
 (0)