huytofu92 commited on
Commit
a1dd06e
·
1 Parent(s): ed00413
Files changed (2) hide show
  1. browser.py +34 -14
  2. mini_agents.py +3 -9
browser.py CHANGED
@@ -13,6 +13,7 @@ class BrowserManager:
13
  _instance = None
14
  _lock = Lock()
15
  _browser_tools: Optional[List[Tool]] = None
 
16
 
17
  def __new__(cls):
18
  if cls._instance is None:
@@ -37,10 +38,31 @@ class BrowserManager:
37
  async_browser=async_browser,
38
  sync_browser=None # Don't use sync browser
39
  )
40
- return [
41
  Tool.from_langchain(tool)
42
  for tool in browser_toolkit.get_tools()
43
  ]
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
44
 
45
  @contextmanager
46
  def get_browser_tools(self):
@@ -49,13 +71,9 @@ class BrowserManager:
49
  if self._browser_tools is None:
50
  with self._lock:
51
  if self._browser_tools is None:
52
- # Create new event loop for this thread if needed
53
- try:
54
- loop = asyncio.get_event_loop()
55
- except RuntimeError:
56
- # Create new event loop in this thread
57
- loop = asyncio.new_event_loop()
58
- asyncio.set_event_loop(loop)
59
 
60
  # Create tools in the event loop
61
  self._browser_tools = loop.run_until_complete(self._create_async_tools())
@@ -66,19 +84,21 @@ class BrowserManager:
66
  print(f"Error in browser context: {e}")
67
  # Reset tools on error
68
  self._browser_tools = None
 
69
  raise
70
  finally:
71
  # Cleanup if needed
72
  if self._browser_tools:
73
  for tool in self._browser_tools:
74
- if hasattr(tool, 'browser'):
75
  try:
76
- # Run cleanup in event loop
77
- loop = asyncio.get_event_loop()
78
- loop.run_until_complete(tool.browser.close())
79
- except:
80
- pass
81
  self._browser_tools = None
 
82
 
83
  # Create a singleton instance
84
  browser_manager = BrowserManager()
 
13
  _instance = None
14
  _lock = Lock()
15
  _browser_tools: Optional[List[Tool]] = None
16
+ _loop: Optional[asyncio.AbstractEventLoop] = None
17
 
18
  def __new__(cls):
19
  if cls._instance is None:
 
38
  async_browser=async_browser,
39
  sync_browser=None # Don't use sync browser
40
  )
41
+ tools = [
42
  Tool.from_langchain(tool)
43
  for tool in browser_toolkit.get_tools()
44
  ]
45
+
46
+ # Store browser reference for cleanup
47
+ for tool in tools:
48
+ tool._browser = async_browser
49
+
50
+ return tools
51
+
52
+ def _ensure_event_loop(self):
53
+ """Ensure we have a valid event loop in this thread"""
54
+ try:
55
+ loop = asyncio.get_event_loop()
56
+ if loop.is_running():
57
+ # If loop is running, we're in an async context
58
+ # Create a new loop for our browser tools
59
+ loop = asyncio.new_event_loop()
60
+ asyncio.set_event_loop(loop)
61
+ except RuntimeError:
62
+ # No event loop exists, create one
63
+ loop = asyncio.new_event_loop()
64
+ asyncio.set_event_loop(loop)
65
+ return loop
66
 
67
  @contextmanager
68
  def get_browser_tools(self):
 
71
  if self._browser_tools is None:
72
  with self._lock:
73
  if self._browser_tools is None:
74
+ # Get or create event loop
75
+ loop = self._ensure_event_loop()
76
+ self._loop = loop
 
 
 
 
77
 
78
  # Create tools in the event loop
79
  self._browser_tools = loop.run_until_complete(self._create_async_tools())
 
84
  print(f"Error in browser context: {e}")
85
  # Reset tools on error
86
  self._browser_tools = None
87
+ self._loop = None
88
  raise
89
  finally:
90
  # Cleanup if needed
91
  if self._browser_tools:
92
  for tool in self._browser_tools:
93
+ if hasattr(tool, '_browser'):
94
  try:
95
+ # Use the stored loop for cleanup
96
+ if self._loop and not self._loop.is_closed():
97
+ self._loop.run_until_complete(tool._browser.close())
98
+ except Exception as e:
99
+ print(f"Error during browser cleanup: {e}")
100
  self._browser_tools = None
101
+ self._loop = None
102
 
103
  # Create a singleton instance
104
  browser_manager = BrowserManager()
mini_agents.py CHANGED
@@ -176,8 +176,9 @@ class MasterAgentWrapper:
176
  self.master_agent.tools = original_tools + browser_tools
177
 
178
  try:
179
- # Run the agent using sync run
180
- result = self.master_agent.run(question)
 
181
  return result
182
  finally:
183
  # Restore original tools
@@ -188,13 +189,6 @@ class MasterAgentWrapper:
188
  try:
189
  # Get browser tools in the correct context
190
  with browser_manager.get_browser_tools() as browser_tools:
191
- # Get or create event loop for browser tools
192
- try:
193
- loop = asyncio.get_event_loop()
194
- except RuntimeError:
195
- loop = asyncio.new_event_loop()
196
- asyncio.set_event_loop(loop)
197
-
198
  # Run with browser tools
199
  # The browser tools will handle their own async operations
200
  return self._run_with_browser_tools(question, browser_tools)
 
176
  self.master_agent.tools = original_tools + browser_tools
177
 
178
  try:
179
+ # Run the agent using sync run, but in a way that doesn't block the event loop
180
+ loop = asyncio.get_running_loop()
181
+ result = loop.run_in_executor(None, self.master_agent.run, question)
182
  return result
183
  finally:
184
  # Restore original tools
 
189
  try:
190
  # Get browser tools in the correct context
191
  with browser_manager.get_browser_tools() as browser_tools:
 
 
 
 
 
 
 
192
  # Run with browser tools
193
  # The browser tools will handle their own async operations
194
  return self._run_with_browser_tools(question, browser_tools)