Spaces:
Sleeping
Sleeping
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)}" |