Spaces:
Sleeping
Sleeping
Test
Browse files- 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 |
-
|
|
|
|
|
|
|
|
|
|
|
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 |
-
|
47 |
-
Tool.from_langchain(tool)
|
48 |
-
for tool in browser_toolkit.get_tools()
|
49 |
-
]
|
50 |
|
51 |
-
|
52 |
-
|
53 |
-
|
54 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
55 |
|
|
|
56 |
return tools
|
|
|
57 |
except Exception as e:
|
58 |
-
|
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 |
-
|
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 |
-
|
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
|