| 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 |
|
|
| |
| @tool |
| def get_weather(city: str) -> str: |
| """Gets the current weather for a city. |
| Args: |
| city: City and state/country, for example 'Phoenix, AZ' or 'Flippin, AR' |
| """ |
| try: |
| |
| geo_url = "https://geocoding-api.open-meteo.com/v1/search" |
| geo_params = {"name": city, "count": 1, "language": "en", "format": "json"} |
| geo_response = requests.get(geo_url, params=geo_params, timeout=10) |
| geo_response.raise_for_status() |
| geo_data = geo_response.json() |
|
|
| if "results" not in geo_data or len(geo_data["results"]) == 0: |
| return f"I could not find weather coordinates for {city}." |
|
|
| location = geo_data["results"][0] |
| latitude = location["latitude"] |
| longitude = location["longitude"] |
| location_name = location.get("name", city) |
| state = location.get("admin1", "") |
| country = location.get("country", "") |
|
|
| |
| weather_url = "https://api.open-meteo.com/v1/forecast" |
| weather_params = { |
| "latitude": latitude, |
| "longitude": longitude, |
| "current": "temperature_2m,relative_humidity_2m,wind_speed_10m,weather_code", |
| "temperature_unit": "fahrenheit", |
| "wind_speed_unit": "mph", |
| "timezone": "auto", |
| } |
|
|
| weather_response = requests.get(weather_url, params=weather_params, timeout=10) |
| weather_response.raise_for_status() |
| weather_data = weather_response.json() |
| current = weather_data["current"] |
|
|
| return ( |
| f"Current weather for {location_name}, {state}, {country}: " |
| f"{current['temperature_2m']}°F, " |
| f"humidity {current['relative_humidity_2m']}%, " |
| f"wind {current['wind_speed_10m']} mph." |
| ) |
|
|
| except Exception as e: |
| return f"Error getting weather for {city}: {str(e)}" |
|
|
| @tool |
| def get_nba_scores(date: str = "") -> str: |
| """Gets current NBA scores from ESPN. |
| Args: |
| date: Optional date in YYYYMMDD format. Leave blank for today's games. |
| """ |
| try: |
| url = "https://site.api.espn.com/apis/site/v2/sports/basketball/nba/scoreboard" |
| params = {} |
| if date: |
| params["dates"] = date |
|
|
| response = requests.get(url, params=params, timeout=10) |
| response.raise_for_status() |
| data = response.json() |
|
|
| events = data.get("events", []) |
| if not events: |
| return "No NBA games found for that date." |
|
|
| results = [] |
| for event in events: |
| name = event.get("name", "Unknown matchup") |
| status = event.get("status", {}).get("type", {}).get("description", "") |
| competitors = event["competitions"][0]["competitors"] |
|
|
| teams = [] |
| for c in competitors: |
| team_name = c["team"]["displayName"] |
| score = c.get("score", "0") |
| teams.append(f"{team_name}: {score}") |
|
|
| results.append(f"{name} — {status} — " + " | ".join(teams)) |
|
|
| return "\n".join(results) |
|
|
| except Exception as e: |
| return f"Error getting NBA scores: {str(e)}" |
|
|
|
|
| @tool |
| def best_nba_team(arg1:str)-> str: |
| |
| """ Returns the best NBA team. |
| |
| Use this tool when the user asks: |
| - who is the best NBA team |
| - which NBA team will win |
| - best basketball team currently |
| |
| Args: |
| arg1: any string related to NBA question |
| """ |
| return "It is the Oklahoma City Thunder, they will win another championship." |
|
|
|
|
| @tool |
| def my_custom_tool(arg1:str, arg2:int)-> str: |
| |
| """A tool that does nothing yet |
| Args: |
| arg1: the first argument |
| arg2: the second argument |
| """ |
| return "What magic will you build ?" |
|
|
| @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)}" |
|
|
|
|
| final_answer = FinalAnswerTool() |
|
|
| |
| |
|
|
| model = HfApiModel( |
| max_tokens=2096, |
| temperature=0.5, |
| model_id='Qwen/Qwen2.5-Coder-32B-Instruct', |
| custom_role_conversions=None, |
| ) |
|
|
|
|
| |
| image_generation_tool = load_tool("agents-course/text-to-image", trust_remote_code=True) |
|
|
| 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, |
| get_weather, |
| get_nba_scores, |
| ], |
| max_steps=6, |
| verbosity_level=1, |
| grammar=None, |
| planning_interval=None, |
| name=None, |
| description=None, |
| prompt_templates=prompt_templates |
| ) |
|
|
|
|
| GradioUI(agent).launch() |