@@ -20,26 +20,47 @@ def _invoke(self, tool_parameters: dict[str, Any]) -> Generator[ToolInvokeMessag
2020 url = tool_parameters .get ("url" )
2121 method = tool_parameters .get ("method" , "GET" )
2222 body = tool_parameters .get ("body" , None )
23+ headers_str = tool_parameters .get ("headers" , None )
2324 if not url :
2425 raise httpx .InvalidURL ("URL cannot be empty." )
2526
2627 if not url .startswith (("http://" , "https://" )):
2728 raise httpx .InvalidURL ("URL must start with http:// or https://." )
2829
30+ # 解析 headers 参数:支持用户以 JSON 对象字符串方式传入请求头
31+ user_headers : dict [str , Any ] = {}
32+ if headers_str :
33+ try :
34+ parsed = loads (headers_str )
35+ if isinstance (parsed , dict ):
36+ user_headers = parsed
37+ else :
38+ raise ValueError ("headers must be a JSON object string." )
39+ except ValueError :
40+ # 用户传入的 headers 字符串不是合法 JSON 或不是对象
41+ raise ValueError ("headers must be a valid JSON object string." )
42+
2943 # 构造 httpx.stream 的参数,增加 SSE 兼容头部与超时设置
3044 stream_kwargs : dict [str , Any ] = {
3145 "method" : method ,
3246 "url" : url ,
33- # SSE 推荐的请求头,提升与代理/网关的兼容性
34- "headers" : {
35- "Accept" : "text/event-stream" ,
36- "Cache-Control" : "no-cache" ,
37- "Connection" : "keep-alive" ,
38- },
3947 # 读取不设整体超时,连接阶段限制为 5 秒,避免读超时中断流
4048 "timeout" : httpx .Timeout (timeout = None , connect = 5.0 ),
4149 }
4250
51+ # 默认 SSE 兼容请求头,提升与代理/网关的兼容性
52+ default_headers : dict [str , str ] = {
53+ "Accept" : "text/event-stream" ,
54+ "Cache-Control" : "no-cache" ,
55+ "Connection" : "keep-alive" ,
56+ }
57+ # 合并用户请求头,用户值覆盖默认值,确保所有值为字符串类型
58+ merged_headers : dict [str , str ] = {
59+ ** default_headers ,
60+ ** {str (k ): str (v ) for k , v in user_headers .items ()}
61+ }
62+ stream_kwargs ["headers" ] = merged_headers
63+
4364 if body :
4465 # 检查body是否是合法的json格式
4566 try :
0 commit comments