manager-agent / firecrawler.py
SuccessfulCrab's picture
Upload 2 files
0451b7d verified
Raw
History Blame Contribute Delete
2.28 kB
import os
from firecrawl import FirecrawlApp
from pydantic import BaseModel, Field
from typing import List
from smolagents import Tool
import urllib.parse
class FireCrawlTool(Tool):
name = "firecrawl_website_qa"
description = """This tool scrapes websites using an API call with URL validation"""
inputs = {
"website": {
"type": "string",
"description": "A singular website address"
}
}
output_type = "string"
def validate_url(self, url: str) -> str:
"""
Validate the input URL and return an appropriate message.
Args:
url (str): The URL to validate
Returns:
str: Validated URL or error message
"""
# Check if URL is blank or None
if not url or url.strip() == '':
return 'No URL was entered by user'
try:
# Attempt to parse the URL
result = urllib.parse.urlparse(url)
# Check if the URL has a valid scheme (http/https) and netloc (domain)
if not all([result.scheme in ['http', 'https'], result.netloc]):
return 'URL entered by user is invalid'
return url # Return the original URL if it passes validation
except Exception:
return 'URL entered by user is invalid'
def forward(self, website: str):
# Validate the URL first
url_validation = self.validate_url(website)
# If validation returns an error message, return it
if url_validation in ['No URL was entered by user', 'URL entered by user is invalid']:
return url_validation
# Initialize the FirecrawlApp with the API key
api_key = os.getenv("api_key")
app = FirecrawlApp(api_key=api_key)
# Scrape a website
try:
scrape_result = app.scrape_url(website, params={
'location': {
'country': 'AU'
}
})
# Truncate the result to 7000 characters
return scrape_result['markdown'][:7000]
except Exception as e:
return f"Error scraping website: {str(e)}"