d8rt8v's picture
Upload tool
bbd506b verified
from smolagents import Tool
from typing import Any, Optional
class SimpleTool(Tool):
name = "get_holidays"
description = "A tool that returns holidays for a given day and month."
inputs = {"day":{"type":"integer","description":"The day of the month (1-31) in integer format"},"month":{"type":"integer","description":"The month of the year (1-12) in integer format"}}
output_type = "string"
def forward(self, day: int, month: int) -> str:
"""A tool that returns holidays for a given day and month.
Args:
day: The day of the month (1-31) in integer format
month: The month of the year (1-12) in integer format
Returns:
A string listing holidays for the specified date, or an error message if something goes wrong.
"""
#Imports
import requests
from bs4 import BeautifulSoup
#Mapping for request
months = {
1:"yanvar",
2:"fevral",
3:"mart",
4:"aprel",
5:"may",
6:"iyun",
7:"iyul",
8:"avgust",
9:"sentyabr",
10:"oktyabr",
11:"noyabr",
12:"dekabr"
}
# Validate the month and day
if month is None or day is None:
return "Invalid month/day"
# Validate month range
if not (1 <= month <= 12):
return "Invalid month"
# Validate day range (assuming non-leap year for simplicity)
if month in {4, 6, 9, 11} and day > 30:
return "Invalid day for this month"
elif month == 2 and day > 28:
return "Invalid day for February"
elif day > 31:
return "Invalid day"
# Map the month to its Russian name
russian_month = months[month]
# Construct the query URL
url = f"https://kakoysegodnyaprazdnik.ru/baza/{russian_month}/{day}"
# Define headers to mimic a browser
headers = {
"User-Agent": "Mozilla/5.0 (Windows; Windows NT 10.3; WOW64; en-US) AppleWebKit/603.45 (KHTML, like Gecko) Chrome/51.0.2756.132 Safari/601",
"Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8",
"Accept-Language": "ru-RU,en;q=0.9",
"Accept-Encoding": "gzip, deflate"
}
try:
# Send GET request
response = requests.get(url, headers=headers)
response.raise_for_status() # Raises an exception for 4xx/5xx errors
response.encoding = 'utf-8' # Ensure proper decoding of Russian text
# Parse HTML content
soup = BeautifulSoup(response.text, "html.parser")
listing_wr_div = soup.find("div", class_="listing_wr")
if not listing_wr_div:
return "No holiday data found for this date."
# Extract holiday names
holidays = []
for answer_div in listing_wr_div.find_all("div", itemprop=["suggestedAnswer", "acceptedAnswer"]):
span_tag = answer_div.find("span", itemprop="text")
if span_tag:
holiday = span_tag.get_text(strip=True)
holidays.append(holiday)
# Return results
if not holidays:
return "No holidays found for this date."
return "\n".join(holidays) # Join holidays with newlines for readability
except requests.RequestException as e:
return f"Failed to retrieve holidays. Error: {str(e)}"