import os import datetime import requests import pytz import yaml from dotenv import load_dotenv from smolagents import CodeAgent, HfApiModel, load_tool, tool from tools.final_answer import FinalAnswerTool from Gradio_UI import GradioUI # Load environment variables from .env load_dotenv() @tool def get_current_time_in_timezone(timezone: str) -> str: """ 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 get_realtime_weather(location: str) -> str: """ Fetches current weather for a given location. Args: location: City name (and optional country code), e.g. "Montreal,CA" or "Paris,FR". Returns: A human-readable summary of temperature, conditions, humidity, etc. """ api_key = os.getenv("OPENWEATHER_API_KEY") if not api_key: return "Error: OPENWEATHER_API_KEY not set in environment." params = { "q": location, "appid": api_key, "units": "metric", # use "imperial" for °F "lang": "en" } try: resp = requests.get("https://api.openweathermap.org/data/2.5/weather", params=params) resp.raise_for_status() data = resp.json() weather = data["weather"][0]["description"].capitalize() temp = data["main"]["temp"] feels = data["main"]["feels_like"] humidity = data["main"]["humidity"] wind = data["wind"]["speed"] return ( f"Weather in {data['name']}: {weather}. " f"🌡️ Temp: {temp}°C (feels like {feels}°C), " f"💧 Humidity: {humidity}%, " f"💨 Wind: {wind} m/s." ) except requests.HTTPError as e: return f"HTTP error fetching weather for '{location}': {e}" except Exception as e: return f"Error fetching weather for '{location}': {e}" # Final answer tool final_answer = FinalAnswerTool() # Load other tools image_generation_tool = load_tool("agents-course/text-to-image", trust_remote_code=True) # Load prompt templates with open("prompts.yaml", "r") as stream: prompt_templates = yaml.safe_load(stream) # Model setup model = HfApiModel( max_tokens=2096, temperature=0.5, model_id="Qwen/Qwen2.5-Coder-32B-Instruct", ) # Agent configuration agent = CodeAgent( model=model, tools=[ final_answer, get_current_time_in_timezone, get_realtime_weather, image_generation_tool, ], max_steps=6, verbosity_level=1, grammar=None, planning_interval=None, name=None, description=None, prompt_templates=prompt_templates ) # Launch the Gradio UI GradioUI(agent).launch()