""" Simple weather assistant agent using PydanticAI. This agent demonstrates structured outputs by returning weather information in a consistent format using Pydantic models. """ from pydantic import BaseModel from pydantic_ai import Agent, RunContext # Use the OpenAI Responses API with the smallest current GPT-5 reasoning model. # The `openai-responses:` prefix selects the Responses API explicitly (the bare # `openai:` prefix also resolves there in PydanticAI v2.0+). DEFAULT_MODEL = "openai-responses:gpt-5.4-nano" class WeatherResponse(BaseModel): """Structured weather response""" location: str temperature: str description: str def get_weather(ctx: RunContext, location: str) -> dict: """Get weather data for a location (mock implementation for demo)""" # Simple mock weather data for demonstration mock_weather = { "london": {"temp": "18°C", "desc": "Cloudy"}, "new york": {"temp": "22°C", "desc": "Sunny"}, "tokyo": {"temp": "16°C", "desc": "Rainy"}, } location_lower = location.lower() for city, weather in mock_weather.items(): if city in location_lower: return { "location": location, "temperature": weather["temp"], "description": weather["desc"], } # Default response for unknown locations return {"location": location, "temperature": "21°C", "description": "Clear"} def get_weather_agent(model: str = DEFAULT_MODEL) -> Agent: """Create a weather agent with structured output""" agent = Agent( model, output_type=WeatherResponse, system_prompt=( "You are a helpful weather assistant. " "Use the get_weather tool to fetch weather data for locations. " "Always return responses in the required structured format." ), ) agent.tool(get_weather) return agent async def run_weather_agent(query: str, model: str = DEFAULT_MODEL) -> WeatherResponse: """Run the weather agent with a query""" try: agent = get_weather_agent(model) result = await agent.run(query) return result.output except Exception as e: return WeatherResponse( location="Unknown", temperature="N/A", description=f"Error: {str(e)}" ) if __name__ == "__main__": import asyncio async def test_agent(): queries = ["What's the weather like in London?"] for query in queries: result = await run_weather_agent(query) print(f"{query} -> {result.model_dump_json()}") asyncio.run(test_agent())