huytofu92 commited on
Commit
eda541b
·
1 Parent(s): beb3f4b
Files changed (1) hide show
  1. browser.py +36 -12
browser.py CHANGED
@@ -8,6 +8,11 @@ from langchain_community.tools.playwright.utils import (
8
  create_async_playwright_browser,
9
  )
10
  from langchain_community.agent_toolkits import PlayWrightBrowserToolkit
 
 
 
 
 
11
 
12
  class BrowserManager:
13
  _instance = None
@@ -35,27 +40,42 @@ class BrowserManager:
35
  asyncio.set_event_loop(loop)
36
 
37
  try:
 
38
  # Create browsers in the new loop
39
- async_browser = loop.run_until_complete(create_async_playwright_browser())
 
 
 
 
 
40
 
41
  # Create toolkit and tools
 
42
  browser_toolkit = PlayWrightBrowserToolkit.from_browser(
43
  async_browser=async_browser,
44
  sync_browser=None # Don't use sync browser
45
  )
46
- tools = [
47
- Tool.from_langchain(tool)
48
- for tool in browser_toolkit.get_tools()
49
- ]
50
 
51
- # Store browser reference for cleanup
52
- for tool in tools:
53
- tool._browser = async_browser
54
- tool._loop = loop
 
 
 
 
 
 
 
 
 
55
 
 
56
  return tools
 
57
  except Exception as e:
58
- print(f"Error creating browser tools: {e}")
59
  if loop.is_running():
60
  loop.stop()
61
  loop.close()
@@ -68,12 +88,14 @@ class BrowserManager:
68
  if self._browser_tools is None:
69
  with self._lock:
70
  if self._browser_tools is None:
 
71
  self._browser_tools = self._create_browser_tools()
 
72
 
73
  yield self._browser_tools
74
 
75
  except Exception as e:
76
- print(f"Error in browser context: {e}")
77
  # Reset tools on error
78
  self._browser_tools = None
79
  raise
@@ -85,10 +107,12 @@ class BrowserManager:
85
  try:
86
  loop = tool._loop
87
  if loop and not loop.is_closed():
 
88
  loop.run_until_complete(tool._browser.close())
89
  loop.close()
 
90
  except Exception as e:
91
- print(f"Error during browser cleanup: {e}")
92
  self._browser_tools = None
93
 
94
  # Create a singleton instance
 
8
  create_async_playwright_browser,
9
  )
10
  from langchain_community.agent_toolkits import PlayWrightBrowserToolkit
11
+ import logging
12
+ from playwright.async_api import async_playwright
13
+
14
+ logging.basicConfig(level=logging.DEBUG)
15
+ logger = logging.getLogger(__name__)
16
 
17
  class BrowserManager:
18
  _instance = None
 
40
  asyncio.set_event_loop(loop)
41
 
42
  try:
43
+ logger.debug("Creating async browser...")
44
  # Create browsers in the new loop
45
+ async def create_browser():
46
+ playwright = await async_playwright().start()
47
+ return await playwright.chromium.launch(headless=True)
48
+
49
+ async_browser = loop.run_until_complete(create_browser())
50
+ logger.debug("Async browser created successfully")
51
 
52
  # Create toolkit and tools
53
+ logger.debug("Creating browser toolkit...")
54
  browser_toolkit = PlayWrightBrowserToolkit.from_browser(
55
  async_browser=async_browser,
56
  sync_browser=None # Don't use sync browser
57
  )
58
+ logger.debug("Browser toolkit created successfully")
 
 
 
59
 
60
+ logger.debug("Converting tools...")
61
+ tools = []
62
+ for tool in browser_toolkit.get_tools():
63
+ logger.debug(f"Converting tool: {tool.name}")
64
+ try:
65
+ converted_tool = Tool.from_langchain(tool)
66
+ converted_tool._browser = async_browser
67
+ converted_tool._loop = loop
68
+ tools.append(converted_tool)
69
+ logger.debug(f"Successfully converted tool: {tool.name}")
70
+ except Exception as e:
71
+ logger.error(f"Error converting tool {tool.name}: {e}")
72
+ raise
73
 
74
+ logger.debug(f"Successfully created {len(tools)} browser tools")
75
  return tools
76
+
77
  except Exception as e:
78
+ logger.error(f"Error creating browser tools: {e}")
79
  if loop.is_running():
80
  loop.stop()
81
  loop.close()
 
88
  if self._browser_tools is None:
89
  with self._lock:
90
  if self._browser_tools is None:
91
+ logger.debug("Creating new browser tools...")
92
  self._browser_tools = self._create_browser_tools()
93
+ logger.debug("Browser tools created successfully")
94
 
95
  yield self._browser_tools
96
 
97
  except Exception as e:
98
+ logger.error(f"Error in browser context: {e}")
99
  # Reset tools on error
100
  self._browser_tools = None
101
  raise
 
107
  try:
108
  loop = tool._loop
109
  if loop and not loop.is_closed():
110
+ logger.debug("Cleaning up browser...")
111
  loop.run_until_complete(tool._browser.close())
112
  loop.close()
113
+ logger.debug("Browser cleanup completed")
114
  except Exception as e:
115
+ logger.error(f"Error during browser cleanup: {e}")
116
  self._browser_tools = None
117
 
118
  # Create a singleton instance