3232from camel .toolkits .function_tool import FunctionTool
3333from camel .utils .commons import dependencies_required
3434
35+ from camel .toolkits ._utils import add_reason_field
36+
3537from .config_loader import ConfigLoader
3638from .ws_wrapper import WebSocketBrowserWrapper , high_level_action
3739
@@ -99,6 +101,7 @@ def __init__(
99101 stealth : bool = False ,
100102 cache_dir : Optional [str ] = None ,
101103 enabled_tools : Optional [List [str ]] = None ,
104+ enable_reasoning : bool = False ,
102105 browser_log_to_file : bool = False ,
103106 log_dir : Optional [str ] = None ,
104107 session_id : Optional [str ] = None ,
@@ -128,6 +131,9 @@ def __init__(
128131 cache_dir (str): Directory for caching. Defaults to "tmp/".
129132 enabled_tools (Optional[List[str]]): List of enabled tools.
130133 Defaults to None.
134+ enable_reasoning (bool): Whether to enable reasoning when agent
135+ is using the browser toolkit. Defaults to False. agent will
136+ provide explanations for its actions when this is enabled.
131137 browser_log_to_file (bool): Whether to log browser actions to
132138 file. Defaults to False.
133139 log_dir (Optional[str]): Custom directory path for log files.
@@ -187,6 +193,7 @@ def __init__(
187193 log_dir = log_dir ,
188194 session_id = session_id ,
189195 enabled_tools = enabled_tools ,
196+ enable_reasoning = enable_reasoning ,
190197 connect_over_cdp = connect_over_cdp ,
191198 cdp_url = cdp_url ,
192199 cdp_keep_current_page = cdp_keep_current_page ,
@@ -206,17 +213,22 @@ def __init__(
206213 "is True, the browser will keep the current page and not "
207214 "navigate to any URL."
208215 )
216+ # toolkit settings
217+ self ._cache_dir = toolkit_config .cache_dir
218+ self ._browser_log_to_file = toolkit_config .browser_log_to_file
219+ self ._enabled_tools = toolkit_config .enabled_tools
220+ self ._enable_reasoning = toolkit_config .enable_reasoning
209221
222+ # browser settings
210223 self ._headless = browser_config .headless
211224 self ._user_data_dir = browser_config .user_data_dir
212225 self ._stealth = browser_config .stealth
213- self ._cache_dir = toolkit_config .cache_dir
214- self ._browser_log_to_file = toolkit_config .browser_log_to_file
215226 self ._default_start_url = browser_config .default_start_url
216227 self ._session_id = toolkit_config .session_id or "default"
217228 self ._viewport_limit = browser_config .viewport_limit
218229 self ._full_visual_mode = browser_config .full_visual_mode
219230
231+ # timeout settings
220232 self ._default_timeout = browser_config .default_timeout
221233 self ._short_timeout = browser_config .short_timeout
222234 self ._navigation_timeout = browser_config .navigation_timeout
@@ -227,24 +239,30 @@ def __init__(
227239 browser_config .dom_content_loaded_timeout
228240 )
229241
230- if enabled_tools is None :
231- self .enabled_tools = self .DEFAULT_TOOLS .copy ()
242+ if self . _enabled_tools is None :
243+ self ._enabled_tools = self .DEFAULT_TOOLS .copy ()
232244 else :
233245 invalid_tools = [
234- tool for tool in enabled_tools if tool not in self .ALL_TOOLS
246+ tool for tool in self . _enabled_tools if tool not in self .ALL_TOOLS
235247 ]
236248 if invalid_tools :
237249 raise ValueError (
238250 f"Invalid tools specified: { invalid_tools } . "
239251 f"Available tools: { self .ALL_TOOLS } "
240252 )
241- self .enabled_tools = enabled_tools .copy ()
242253
243- logger .info (f"Enabled tools: { self .enabled_tools } " )
254+ logger .info (f"Enabled tools: { self ._enabled_tools } " )
244255
245256 self ._ws_wrapper : Optional [WebSocketBrowserWrapper ] = None
246257 self ._ws_config = self .config_loader .to_ws_config ()
247258
259+ # Dynamically wrap tool methods if reasoning is enabled
260+ if self ._enable_reasoning :
261+ for tool_name in self ._enabled_tools :
262+ method = getattr (self , tool_name , None )
263+ if method and callable (method ):
264+ setattr (self , tool_name , add_reason_field (method ))
265+
248266 async def _ensure_ws_wrapper (self ):
249267 """Ensure WebSocket wrapper is initialized."""
250268 if self ._ws_wrapper is None :
@@ -1913,7 +1931,7 @@ def clone_for_new_session(
19131931 stealth = self ._stealth ,
19141932 cache_dir = f"{ self ._cache_dir .rstrip ('/' )} _clone_"
19151933 f"{ new_session_id } /" ,
1916- enabled_tools = self .enabled_tools .copy (),
1934+ enabled_tools = self ._enabled_tools .copy (),
19171935 browser_log_to_file = self ._browser_log_to_file ,
19181936 session_id = new_session_id ,
19191937 default_start_url = self ._default_start_url ,
@@ -1958,16 +1976,15 @@ def get_tools(self) -> List[FunctionTool]:
19581976 "browser_sheet_read" : self .browser_sheet_read ,
19591977 }
19601978
1961- enabled_tools = []
1962-
1963- for tool_name in self .enabled_tools :
1979+ tools = []
1980+ for tool_name in self ._enabled_tools :
19641981 if tool_name in tool_map :
19651982 tool = FunctionTool (
19661983 cast (Callable [..., Any ], tool_map [tool_name ])
19671984 )
1968- enabled_tools .append (tool )
1985+ tools .append (tool )
19691986 else :
19701987 logger .warning (f"Unknown tool name: { tool_name } " )
19711988
1972- logger .info (f"Returning { len (enabled_tools )} enabled tools" )
1973- return enabled_tools
1989+ logger .info (f"Returning { len (tools )} enabled tools" )
1990+ return tools
0 commit comments