First_agent / tools /weather.py
cjb97's picture
updated description
27f8993
from smolagents.tools import tool
import requests
import os
import re
from typing import Optional
@tool
def get_weather(location: str) -> str:
"""Get the current weather for a specified location.
Args:
location: A string representing a city (e.g., 'New York', 'Paris').
Returns:
str: A json blob containing the current weather information for that city.
"""
# Validate that location contains only allowed characters: letters, digits, spaces, and hyphens
if not re.fullmatch(r'[A-Za-z0-9\s-]+', location):
return "Error: Location contains invalid characters. Only letters, digits, spaces, and hyphens are allowed."
try:
# Get the API key from environment variables
api_key = os.getenv('OPENWEATHERMAP_API_KEY')
if not api_key:
return "Error: OPENWEATHERMAP_API_KEY not set in environment variables."
# First, geocode the location to get latitude and longitude
geo_url = f"http://api.openweathermap.org/geo/1.0/direct?q={location}&limit=1&appid={api_key}"
geo_response = requests.get(geo_url)
geo_data = geo_response.json()
if not geo_data:
return f"Error: Could not geocode location '{location}'."
lat = geo_data[0].get('lat')
lon = geo_data[0].get('lon')
if lat is None or lon is None:
return f"Error: Latitude or longitude not found for location '{location}'."
# Call the OpenWeatherMap weather API 2.5 endpoint
weather_url = f"https://api.openweathermap.org/data/2.5/weather?lat={lat}&lon={lon}&appid={api_key}&units=imperial"
weather_response = requests.get(weather_url)
weather_data = weather_response.json()
if weather_response.status_code == 200:
temp = weather_data.get('main', {}).get('temp', 'N/A')
weather_desc = weather_data.get('weather', [{}])[0].get('description', 'N/A')
humidity = weather_data.get('main', {}).get('humidity', 'N/A')
wind_speed = weather_data.get('wind', {}).get('speed', 'N/A')
return f"The current weather in {location} is {temp}°F with {weather_desc}. Humidity: {humidity}%, Wind speed: {wind_speed} mph."
else:
return f"Error fetching weather for {location}: {weather_data.get('message', 'Unknown error')}"
except Exception as e:
return f"Error fetching weather for {location}: {str(e)}"