My_Sidekick / sidekick_tools.py
Shima92's picture
Add robust runtime Playwright installation
2476b30
Raw
History Blame Contribute Delete
4.33 kB
import os
import requests
import subprocess
import sys
from playwright.async_api import async_playwright
from langchain_community.agent_toolkits import PlayWrightBrowserToolkit
from dotenv import load_dotenv
from langchain.agents import Tool
from langchain_community.agent_toolkits import FileManagementToolkit
from langchain_community.tools.wikipedia.tool import WikipediaQueryRun
from langchain_experimental.tools import PythonREPLTool
from langchain_community.utilities import GoogleSerperAPIWrapper
from langchain_community.utilities.wikipedia import WikipediaAPIWrapper
load_dotenv(override=True)
pushover_token = os.getenv("PUSHOVER_TOKEN")
pushover_user = os.getenv("PUSHOVER_USER")
pushover_url = "https://api.pushover.net/1/messages.json"
serper = GoogleSerperAPIWrapper()
async def playwright_tools():
playwright = await async_playwright().start()
browser = await playwright.chromium.launch(headless=True)
toolkit = PlayWrightBrowserToolkit.from_browser(async_browser=browser)
return toolkit.get_tools(), browser, playwright
def push(text: str):
"""Send a push notification to the user"""
requests.post(pushover_url, data = {"token": pushover_token, "user": pushover_user, "message": text})
return "success"
def get_file_tools():
toolkit = FileManagementToolkit(root_dir="sandbox")
return toolkit.get_tools()
async def other_tools():
push_tool = Tool(name="send_push_notification", func=push, description="Use this tool when you want to send a push notification")
file_tools = get_file_tools()
tool_search =Tool(
name="search",
func=serper.run,
description="Use this tool when you want to get the results of an online web search"
)
wikipedia = WikipediaAPIWrapper()
wiki_tool = WikipediaQueryRun(api_wrapper=wikipedia)
python_repl = PythonREPLTool()
return file_tools + [push_tool, tool_search, python_repl, wiki_tool]
def ensure_playwright_installed():
"""Ensure Playwright browsers are installed at runtime if not present."""
chromium_path = "/root/.cache/ms-playwright/chromium-1169"
chromium_headless_path = "/root/.cache/ms-playwright/chromium_headless_shell-1169"
if not os.path.exists(chromium_path) and not os.path.exists(chromium_headless_path):
print("Playwright browsers not found. Installing...", file=sys.stderr)
try:
result = subprocess.run(
["playwright", "install", "--with-deps", "chromium"],
capture_output=True,
text=True,
timeout=300 # 5 minute timeout
)
if result.returncode == 0:
print("Playwright browsers installed successfully!", file=sys.stderr)
else:
print(f"Playwright installation failed: {result.stderr}", file=sys.stderr)
raise Exception(f"Playwright installation failed: {result.stderr}")
except subprocess.TimeoutExpired:
print("Playwright installation timed out", file=sys.stderr)
raise
except Exception as e:
print(f"Failed to install Playwright browsers: {e}", file=sys.stderr)
raise
async def playwright_tools():
"""Initialize Playwright and return browser tools."""
try:
# Try to ensure browsers are installed
ensure_playwright_installed()
# Import and start Playwright
from playwright.async_api import async_playwright
playwright = await async_playwright().start()
browser = await playwright.chromium.launch(headless=True)
# Create your tools here based on your actual implementation
# This is a placeholder - replace with your actual tool creation
tools = []
print("Playwright initialized successfully", file=sys.stderr)
return tools, browser, playwright
except Exception as e:
print(f"WARNING: Playwright initialization failed: {e}", file=sys.stderr)
print("The app will continue without browser automation capabilities", file=sys.stderr)
# Return empty/None values so the app can still start
return [], None, None
# Add any other tool functions you have below
# Make sure they handle the case where browser is None