HAMMALE's picture
Update app.py
9bf390e verified
from smolagents import CodeAgent, DuckDuckGoSearchTool, HfApiModel, load_tool, tool
import datetime
import requests
import pytz
import yaml
import json
import re
from tools.final_answer import FinalAnswerTool
from Gradio_UI import GradioUI
@tool
def get_current_time_in_timezone(timezone: str) -> str:
"""A tool that fetches the current local time in a specified timezone.
Args:
timezone: A string representing a valid timezone (e.g., 'America/New_York').
"""
try:
tz = pytz.timezone(timezone)
local_time = datetime.datetime.now(tz).strftime("%Y-%m-%d %H:%M:%S")
return f"The current local time in {timezone} is: {local_time}"
except Exception as e:
return f"Error fetching time for timezone '{timezone}': {str(e)}"
@tool
def calculate_time_difference(timezone1: str, timezone2: str) -> str:
"""Calculate the time difference between two timezones.
Args:
timezone1: First timezone (e.g., 'America/New_York')
timezone2: Second timezone (e.g., 'Asia/Tokyo')
"""
try:
tz1 = pytz.timezone(timezone1)
tz2 = pytz.timezone(timezone2)
now = datetime.datetime.now(pytz.UTC)
offset1 = now.astimezone(tz1).utcoffset().total_seconds() / 3600
offset2 = now.astimezone(tz2).utcoffset().total_seconds() / 3600
diff = offset2 - offset1
return f"Time difference: {timezone2} is {diff:+.1f} hours ahead of {timezone1}"
except Exception as e:
return f"Error calculating time difference: {str(e)}"
@tool
def get_weather_info(city: str) -> str:
"""Fetch current weather information for a city using wttr.in service.
Args:
city: Name of the city (e.g., 'London', 'Paris', 'Tokyo')
"""
try:
response = requests.get(f"https://wttr.in/{city}?format=j1", timeout=10)
if response.status_code == 200:
data = response.json()
current = data['current_condition'][0]
temp_c = current['temp_C']
feels_like = current['FeelsLikeC']
desc = current['weatherDesc'][0]['value']
humidity = current['humidity']
wind_speed = current['windspeedKmph']
return f"Weather in {city}: {desc}, {temp_c}°C (feels like {feels_like}°C), Humidity: {humidity}%, Wind: {wind_speed} km/h"
else:
return f"Could not fetch weather for {city}"
except Exception as e:
return f"Error fetching weather: {str(e)}"
@tool
def convert_currency(amount: float, from_currency: str, to_currency: str) -> str:
"""Convert currency using live exchange rates from an API.
Args:
amount: Amount to convert
from_currency: Source currency code (e.g., 'USD')
to_currency: Target currency code (e.g., 'EUR')
"""
try:
url = f"https://api.exchangerate-api.com/v4/latest/{from_currency.upper()}"
response = requests.get(url, timeout=10)
if response.status_code == 200:
data = response.json()
rate = data['rates'].get(to_currency.upper())
if rate:
converted = amount * rate
return f"{amount} {from_currency.upper()} = {converted:.2f} {to_currency.upper()} (Rate: {rate:.4f})"
else:
return f"Currency {to_currency} not found"
else:
return "Error fetching exchange rates"
except Exception as e:
return f"Error converting currency: {str(e)}"
@tool
def extract_urls_from_text(text: str) -> str:
"""Extract all URLs from a given text.
Args:
text: The text to extract URLs from
"""
url_pattern = r'https?://[^\s<>"{}|\\^`\[\]]+'
urls = re.findall(url_pattern, text)
if urls:
return f"Found {len(urls)} URL(s): " + ", ".join(urls)
else:
return "No URLs found in the text"
@tool
def countdown_to_date(target_date: str) -> str:
"""Calculate countdown to a specific date.
Args:
target_date: Date in format 'YYYY-MM-DD' (e.g., '2025-12-31')
"""
try:
target = datetime.datetime.strptime(target_date, "%Y-%m-%d")
now = datetime.datetime.now()
diff = target - now
if diff.days < 0:
return f"The date {target_date} has already passed ({abs(diff.days)} days ago)"
days = diff.days
hours = diff.seconds // 3600
minutes = (diff.seconds % 3600) // 60
return f"Countdown to {target_date}: {days} days, {hours} hours, {minutes} minutes"
except Exception as e:
return f"Error parsing date: {str(e)}"
@tool
def generate_random_password(length: int, include_symbols: bool = True) -> str:
"""Generate a random secure password.
Args:
length: Length of the password (minimum 8)
include_symbols: Whether to include special symbols
"""
import random
import string
if length < 8:
return "Password length must be at least 8 characters"
chars = string.ascii_letters + string.digits
if include_symbols:
chars += "!@#$%^&*()_+-=[]{}|;:,.<>?"
password = ''.join(random.choice(chars) for _ in range(length))
return f"Generated password (length {length}): {password}"
@tool
def calculate_age_from_birthdate(birthdate: str) -> str:
"""Calculate age from birthdate.
Args:
birthdate: Date in format 'YYYY-MM-DD' (e.g., '1990-05-15')
"""
try:
birth = datetime.datetime.strptime(birthdate, "%Y-%m-%d")
today = datetime.datetime.now()
age = today.year - birth.year - ((today.month, today.day) < (birth.month, birth.day))
next_birthday = datetime.datetime(today.year, birth.month, birth.day)
if next_birthday < today:
next_birthday = datetime.datetime(today.year + 1, birth.month, birth.day)
days_to_birthday = (next_birthday - today).days
return f"Age: {age} years old. Next birthday in {days_to_birthday} days."
except Exception as e:
return f"Error calculating age: {str(e)}"
@tool
def list_available_timezones(region: str = "all") -> str:
"""List available timezones for a specific region.
Args:
region: Region name (e.g., 'America', 'Europe', 'Asia') or 'all' for common timezones
"""
if region.lower() == "all":
common_tz = [
"UTC", "America/New_York", "America/Los_Angeles", "America/Chicago",
"Europe/London", "Europe/Paris", "Europe/Berlin", "Asia/Tokyo",
"Asia/Shanghai", "Asia/Dubai", "Australia/Sydney", "Pacific/Auckland"
]
return "Common timezones: " + ", ".join(common_tz)
else:
timezones = [tz for tz in pytz.all_timezones if tz.startswith(region)]
if timezones:
return f"Timezones in {region}: " + ", ".join(timezones[:20]) + ("..." if len(timezones) > 20 else "")
else:
return f"No timezones found for region '{region}'"
final_answer = FinalAnswerTool()
# Use HfApiModel instead of InferenceClientModel
model = HfApiModel(
model_id='Qwen/Qwen2.5-Coder-32B-Instruct',
token=None # Will use HF_TOKEN from environment if available
)
# Import tool from Hub
image_generation_tool = load_tool("agents-course/text-to-image", trust_remote_code=True)
search_tool = DuckDuckGoSearchTool()
# Load system prompt from prompt.yaml file
with open("prompts.yaml", 'r') as stream:
prompt_templates = yaml.safe_load(stream)
agent = CodeAgent(
model=model,
tools=[
final_answer,
get_current_time_in_timezone,
calculate_time_difference,
get_weather_info,
convert_currency,
extract_urls_from_text,
countdown_to_date,
generate_random_password,
calculate_age_from_birthdate,
list_available_timezones,
image_generation_tool,
search_tool
],
max_steps=6,
verbosity_level=1,
grammar=None,
planning_interval=None,
name=None,
description=None,
prompt_templates=prompt_templates
)
GradioUI(agent).launch()