from smolagents import CodeAgent, DuckDuckGoSearchTool, HfApiModel, load_tool, tool import datetime import requests import pytz import yaml from tools.final_answer import FinalAnswerTool from Gradio_UI import GradioUI # Custom Tools @tool def convert_time_between_timezones( time_str: str, from_tz: str, to_tz: str, time_format: str = "%Y-%m-%d %H:%M:%S" ) -> str: """Converts a time between two timezones, handling DST automatically. Args: time_str: The time string to convert (e.g., '2023-12-25 16:00:00') from_tz: Source timezone (e.g., 'Europe/Madrid', 'UTC+2', 'America/Mexico_City') to_tz: Target timezone (e.g., 'America/Sao_Paulo', 'UTC-3') time_format: Format of input/output time strings """ try: # Handle UTC offsets (like 'UTC+2') if from_tz.startswith('UTC'): from_tz = f'Etc/GMT{-int(from_tz[3:])}' if '+' in from_tz else f'Etc/GMT{+int(from_tz[3:])}' if to_tz.startswith('UTC'): to_tz = f'Etc/GMT{-int(to_tz[3:])}' if '+' in to_tz else f'Etc/GMT{+int(to_tz[3:])}' # Get timezone objects from_zone = pytz.timezone(from_tz) to_zone = pytz.timezone(to_tz) # Parse time (naive) and localize to source timezone naive_time = datetime.datetime.strptime(time_str, time_format) localized_time = from_zone.localize(naive_time) # Convert to target timezone converted_time = localized_time.astimezone(to_zone) # Get current UTC offsets to show the difference from_offset = localized_time.strftime('%z') to_offset = converted_time.strftime('%z') return (f"{localized_time.strftime(time_format)} {from_tz} ({from_offset}) " f"is {converted_time.strftime(time_format)} {to_tz} ({to_offset})") except pytz.UnknownTimeZoneError as e: common_tz = { 'Spain': 'Europe/Madrid', 'São Paulo': 'America/Sao_Paulo', 'SP': 'America/Sao_Paulo', 'Paulo, Mexico': 'America/Mexico_City', 'CEST': 'Europe/Madrid', # Central European Summer Time 'CET': 'Europe/Paris', # Central European Time 'BRT': 'America/Sao_Paulo' } if e.args[0] in common_tz: return f"Note: Using '{common_tz[e.args[0]]}' for '{e.args[0]}'.\n" + \ convert_time_between_timezones(time_str, common_tz[e.args[0]], to_tz, time_format) return f"Error: Unknown timezone - {str(e)}. Common timezones: Europe/Madrid, America/Sao_Paulo, etc." except Exception as e: return f"Error converting time: {str(e)}" @tool def weather_lookup(city: str) -> str: """Fetches current weather conditions for a specified city. Args: city: The city name to get weather for (e.g., 'Paris, France') """ try: response = requests.get(f"https://wttr.in/{city}?format=%C+%t") return f"Weather in {city}: {response.text}" except Exception as e: return f"Error fetching weather: {str(e)}" @tool def unit_converter(value: float, from_unit: str, to_unit: str) -> str: """Converts between different units (length, weight, temperature). Args: value: The numerical value to convert from_unit: The unit to convert from (e.g., 'miles') to_unit: The unit to convert to (e.g., 'kilometers') """ # Simplified conversion examples conversions = { ('miles', 'kilometers'): lambda x: x * 1.60934, ('fahrenheit', 'celsius'): lambda x: (x - 32) * 5/9, ('pounds', 'kilograms'): lambda x: x * 0.453592 } try: if (from_unit, to_unit) in conversions: result = conversions[(from_unit, to_unit)](value) return f"{value} {from_unit} = {result:.2f} {to_unit}" return f"Conversion from {from_unit} to {to_unit} not supported" except Exception as e: return f"Conversion error: {str(e)}" # Initialize tools final_answer = FinalAnswerTool() duckduckgo_search = DuckDuckGoSearchTool() image_generation_tool = load_tool("agents-course/text-to-image", trust_remote_code=True) # Initialize model model = HfApiModel( max_tokens=2096, temperature=0.5, model_id='Qwen/Qwen2.5-Coder-32B-Instruct', custom_role_conversions=None, ) # Load system prompt with open("prompts.yaml", 'r') as stream: prompt_templates = yaml.safe_load(stream) # Create agent with all tools agent = CodeAgent( model=model, tools=[final_answer, duckduckgo_search, image_generation_tool, convert_time_between_timezones], max_steps=6, verbosity_level=1, grammar=None, planning_interval=None, name=None, description=None, prompt_templates=prompt_templates ) # Launch the interface GradioUI(agent).launch()