@@ -62,6 +62,9 @@ async def adjust_parameters(self, request_params: Dict[str, Any], page_params_ca
6262 await self ._adjust_top_p (top_p_to_set , check_client_disconnected )
6363 await self ._check_disconnect (check_client_disconnected , "End Parameter Adjustment" )
6464
65+ # 确保工具面板已展开,以便调整高级设置
66+ await self ._ensure_tools_panel_expanded (check_client_disconnected )
67+
6568 # 调整URL CONTEXT
6669 if ENABLE_URL_CONTEXT :
6770 await self ._open_url_content (check_client_disconnected )
@@ -77,9 +80,16 @@ async def adjust_parameters(self, request_params: Dict[str, Any], page_params_ca
7780 async def _handle_thinking_budget (self , request_params : Dict [str , Any ], check_client_disconnected : Callable ):
7881 """处理思考预算的调整逻辑。"""
7982 reasoning_effort = request_params .get ('reasoning_effort' )
80- if reasoning_effort is not None :
81- # 用户指定了,则开启并设置
82- self .logger .info (f"[{ self .req_id } ] 用户指定了 reasoning_effort: { reasoning_effort } 。" )
83+
84+ # 检查用户是否明确禁用了思考预算
85+ should_disable_budget = isinstance (reasoning_effort , str ) and reasoning_effort .lower () == 'none'
86+
87+ if should_disable_budget :
88+ self .logger .info (f"[{ self .req_id } ] 用户通过 reasoning_effort='none' 明确禁用思考预算。" )
89+ await self ._control_thinking_budget_toggle (should_be_checked = False , check_client_disconnected = check_client_disconnected )
90+ elif reasoning_effort is not None :
91+ # 用户指定了非 'none' 的值,则开启并设置
92+ self .logger .info (f"[{ self .req_id } ] 用户指定了 reasoning_effort: { reasoning_effort } ,将启用并设置思考预算。" )
8393 await self ._control_thinking_budget_toggle (should_be_checked = True , check_client_disconnected = check_client_disconnected )
8494 await self ._adjust_thinking_budget (reasoning_effort , check_client_disconnected )
8595 else :
@@ -209,27 +219,50 @@ async def _adjust_google_search(self, request_params: Dict[str, Any], check_clie
209219 if isinstance (e , ClientDisconnectedError ):
210220 raise
211221
212- async def _open_url_content (self ,check_client_disconnected : Callable ):
222+ async def _ensure_tools_panel_expanded (self , check_client_disconnected : Callable ):
223+ """确保包含高级工具(URL上下文、思考预算等)的面板是展开的。"""
224+ self .logger .info (f"[{ self .req_id } ] 检查并确保工具面板已展开..." )
213225 try :
214226 collapse_tools_locator = self .page .locator ('button[aria-label="Expand or collapse tools"]' )
227+ await expect_async (collapse_tools_locator ).to_be_visible (timeout = 5000 )
228+
215229 grandparent_locator = collapse_tools_locator .locator ("xpath=../.." )
230+ class_string = await grandparent_locator .get_attribute ("class" , timeout = 3000 )
216231
217- # 3. 获取祖父级元素的 class 属性值
218- # get_attribute 返回一个包含所有 class 的字符串,例如 "menu dropdown active"
219- class_string = await grandparent_locator .get_attribute ("class" )
220-
221- # 4. 在 Python 中进行判断
222- # 确保 class_string 不是 None,并且 'expanded' 是一个独立的 class
223232 if class_string and "expanded" not in class_string .split ():
233+ self .logger .info (f"[{ self .req_id } ] 工具面板未展开,正在点击以展开..." )
224234 await collapse_tools_locator .click (timeout = CLICK_TIMEOUT_MS )
225- await asyncio .sleep (0.5 )
235+ await self ._check_disconnect (check_client_disconnected , "展开工具面板后" )
236+ # 等待展开动画完成
237+ await expect_async (grandparent_locator ).to_have_class (re .compile (r'.*expanded.*' ), timeout = 5000 )
238+ self .logger .info (f"[{ self .req_id } ] ✅ 工具面板已成功展开。" )
239+ else :
240+ self .logger .info (f"[{ self .req_id } ] 工具面板已处于展开状态。" )
241+ except Exception as e :
242+ self .logger .error (f"[{ self .req_id } ] ❌ 展开工具面板时发生错误: { e } " )
243+ # 即使出错,也继续尝试执行后续操作,但记录错误
244+ if isinstance (e , ClientDisconnectedError ):
245+ raise
246+
247+ async def _open_url_content (self ,check_client_disconnected : Callable ):
248+ """仅负责打开 URL Context 开关,前提是面板已展开。"""
249+ try :
250+ self .logger .info (f"[{ self .req_id } ] 检查并启用 URL Context 开关..." )
226251 use_url_content_selector = self .page .locator (USE_URL_CONTEXT_SELECTOR )
252+ await expect_async (use_url_content_selector ).to_be_visible (timeout = 5000 )
253+
227254 is_checked = await use_url_content_selector .get_attribute ("aria-checked" )
228255 if "false" == is_checked :
256+ self .logger .info (f"[{ self .req_id } ] URL Context 开关未开启,正在点击以开启..." )
229257 await use_url_content_selector .click (timeout = CLICK_TIMEOUT_MS )
230- await self ._check_disconnect (check_client_disconnected , "点击URLCONTEXT" )
258+ await self ._check_disconnect (check_client_disconnected , "点击URLCONTEXT后" )
259+ self .logger .info (f"[{ self .req_id } ] ✅ URL Context 开关已点击。" )
260+ else :
261+ self .logger .info (f"[{ self .req_id } ] URL Context 开关已处于开启状态。" )
231262 except Exception as e :
232- self .logger .error (f"[{ self .req_id } ] ❌ 操作USE_URL_CONTEXT_SELECTOR时发生错误:{ e } 。" )
263+ self .logger .error (f"[{ self .req_id } ] ❌ 操作 USE_URL_CONTEXT_SELECTOR 时发生错误:{ e } 。" )
264+ if isinstance (e , ClientDisconnectedError ):
265+ raise
233266
234267 async def _control_thinking_budget_toggle (self , should_be_checked : bool , check_client_disconnected : Callable ):
235268 """
0 commit comments