First_agent_template / tools /getDeviceInfo.py
SilviuMatei's picture
Update tools/getDeviceInfo.py
c00f902 verified
from typing import Any, Optional
from smolagents.tools import Tool
import requests
import markdownify
import smolagents
import playwright.sync_api as playwright
import re
import yaml
from smolagents import CodeAgent, HfApiModel
from tools.final_answer import FinalAnswerTool
import json
class getDeviceInfo(Tool):
name = "visit_webpage"
description = "Visits a webpage at the given URL, reads its content as a markdown string, and extracts device information."
inputs = {'url': {'type': 'string', 'description': 'The URL of the webpage to visit.'}}
output_type = "string" # ✅ Fix: Use "string" instead of "json"
def forward(self, url: str) -> str: # ✅ Return a JSON string
try:
from smolagents.utils import truncate_content
except ImportError as e:
raise ImportError(
"You must install the `smolagents` package to run this tool."
) from e
try:
# Fetch the webpage
response = requests.get(url, timeout=20)
response.raise_for_status()
markdown_content = markdownify.markdownify(response.text).strip()
markdown_content = re.sub(r"\n{3,}", "\n\n", markdown_content)
webpage_content = truncate_content(markdown_content, 10000)
except requests.exceptions.Timeout:
webpage_content = "The request timed out."
except requests.exceptions.RequestException as e:
webpage_content = f"Error fetching the webpage: {str(e)}"
except Exception as e:
webpage_content = f"Unexpected error: {str(e)}"
# Extract device information using Playwright
with playwright.sync_api.sync_playwright() as p:
browser = p.chromium.launch(headless=True)
page = browser.new_page()
script = """() => ({
userAgent: navigator.userAgent,
platform: navigator.platform,
language: navigator.language,
screenWidth: window.screen.width,
screenHeight: window.screen.height
})"""
page.goto("about:blank")
device_info = page.evaluate(script)
browser.close()
# ✅ Convert output to JSON string for compatibility
result = {
"webpage_content": webpage_content,
"device_info": device_info
}
return json.dumps(result) # ✅ Ensure return type matches "string"