Newer
Older
navi-1 / tools / weather.py
import httpx
import json

name = "weather"
description = (
    "Fetches current weather or a 3-day forecast for a specified city using wttr.in. "
    "Supports 'now' (default) for current conditions and 'forecast' for a 3-day outlook."
)
parameters = {
    "type": "object",
    "properties": {
        "city": {"type": "string", "description": "The name of the city."},
        "action": {
            "type": "string",
            "enum": ["now", "forecast"],
            "description": "The type of weather data to retrieve.",
        },
    },
    "required": ["city"],
}

async def execute(params: dict) -> str:
    city = params.get("city")
    action = params.get("action", "now")
    
    # wttr.in JSON format: 
    # For 'now', we use format=j1
    # For 'forecast', we use format=j1 (it includes current + forecast in the JSON)
    
    url = f"https://wttr.in/{city}?format=j1"
    
    async with httpx.AsyncClient() as client:
        try:
            response = await client.get(url)
            response.raise_for_status()
            data = response.json()
        except Exception as e:
            return f"Error fetching weather data: {str(e)}"

    if action == "now":
        current = data.get("current_condition", [{}])[0]
        temp = current.get("temp_C", "N/A")
        desc = current.get("weatherDesc", [{}])[0].get("value", "N/A")
        humidity = current.get("humidity", "N/A")
        wind = current.get("windspeedKmph", "N/A")
        
        return (f"Current weather in {city}:\n"
                f"- Temperature: {temp}°C\n"
                f"- Condition: {desc}\n"
                f"- Humidity: {humidity}%\n"
                f"- Wind Speed: {wind} km/h")

    elif action == "forecast":
        forecast_list = data.get("weather", [])
        if not forecast_list:
            return f"No forecast available for {city}."
        
        # We take the next 3 days from the forecast list (skipping the first if it's just 'today's' continuation)
        # wttr.in j1 format: 'weather' array contains daily objects.
        
        output = [f"3-Day Forecast for {city}:"]
        # The 'weather' array in j1 contains daily forecasts.
        for day in forecast_list[:3]:
            date = day.get("date", "Unknown")
            # Each day has 'maxtempC' and 'mintempC'
            max_t = day.get("maxtempC", "N/					A")
            min_t = day.get("mintempC", "N/A")
            output.append(f"- {date}: High {max_t}°C, Low {min_t}°C")
            
        return "\n".join(output)
    
    else:
        return "Invalid action. Use 'now' or 'forecast'."