import json import litellm from smolagents import CodeAgent from tools.tools import ( get_coordinates, get_earthquake_data, get_nasa_fire_data, get_full_daily_forecast, climate_change_data, get_full_air_quality_forecast, get_full_marine_daily_forecast, get_full_flood_daily_forecast, get_full_satellite_radiation, ) class RiskAnalysisAgent: """Agent responsible for analyzing risks based on user input and available data.""" def __init__(self, model): self.agent = CodeAgent( tools=[ get_coordinates, get_earthquake_data, get_nasa_fire_data, get_full_daily_forecast, climate_change_data, get_full_air_quality_forecast, get_full_marine_daily_forecast, get_full_flood_daily_forecast, get_full_satellite_radiation, ], model=model, additional_authorized_imports=["json", "datetime", "math"], ) def analyze_risks(self, user_query: str) -> dict: """Analyze risks based on user query.""" analysis_prompt = f""" You are an expert climate risk analyst. A user has submitted this query: "{user_query}" Your task: 1. Extract the location from the query 2. Identify what types of risks they're asking about 3. Gather relevant data using the available tools: - Use get_full_daily_forecast for detailed weather data - Use climate_change_data for long-term climate projections - Use get_full_air_quality_forecast for air quality risks - Use get_full_marine_daily_forecast for coastal/marine risks - Use get_full_flood_daily_forecast for detailed flood data - Use get_full_satellite_radiation for solar radiation data 4. Analyze the risk levels for each identified hazard 5. Return a comprehensive risk analysis For each risk type you identify, provide: - Risk level (0-100 scale) - Key factors contributing to the risk - Time horizon (immediate, short-term, long-term) - Confidence level in your assessment - Historical context (when available) - Future projections (when available) Focus on being thorough but concise. Use your judgment to determine which data sources are most relevant. IMPORTANT: Return a valid Python dictionary (not JSON string) in this exact format: {{ "location": {{"city": "CityName", "country": "CountryName", "lat": 0.0, "lon": 0.0}}, "identified_risks": ["risk1", "risk2"], "risk_analysis": {{ "earthquake": {{ "risk_level": 25, "contributing_factors": ["seismic activity", "building codes"], "time_horizon": "long-term", "Detailed analysis": "", "confidence": "medium", "key_insights": "Moderate earthquake risk due to regional seismic activity", "historical_context": "Historical earthquake data analysis", "future_projections": "Projected seismic activity trends" }}, "wildfire": {{ "risk_level": 60, "contributing_factors": ["dry conditions", "vegetation"], "time_horizon": "immediate", "Detailed analysis": "", "confidence": "high", "key_insights": "High wildfire risk during dry season", "historical_context": "Past wildfire patterns", "future_projections": "Climate change impact on fire risk" }}, "climate": {{ "risk_level": 45, "contributing_factors": ["temperature trends", "precipitation changes"], "time_horizon": "long-term", "confidence": "high", "Detailed analysis": "", "key_insights": "Significant climate change impacts expected", "future_projections": "Climate model predictions" }} }}, "overall_assessment": "Very detailed overall risk summary here" }} """ try: try: response = self.agent.run(analysis_prompt) except Exception as e: print(e) #response = litellm.completion(messages=analysis_prompt, model="anthropic/claude-sonnet-4-20250514") if isinstance(response, dict): return response elif isinstance(response, str): try: return json.loads(response) except json.JSONDecodeError: return { "location": { "city": "Unknown", "country": "Unknown", "lat": 0.0, "lon": 0.0, }, "identified_risks": ["general climate risks"], "risk_analysis": { "general": { "risk_level": 30, "contributing_factors": ["climate change"], "time_horizon": "long-term", "confidence": "medium", "key_insights": f"Analysis of query: {user_query}", } }, "overall_assessment": f"Climate risk analysis for: {user_query}", } else: return { "location": { "city": "Unknown", "country": "Unknown", "lat": 0.0, "lon": 0.0, }, "identified_risks": ["climate risks"], "risk_analysis": { "general": { "risk_level": 30, "contributing_factors": ["climate factors"], "time_horizon": "medium-term", "confidence": "medium", "key_insights": "General climate risk assessment", } }, "overall_assessment": "Basic climate risk analysis completed", } except Exception as e: print(f"Risk analysis error: {e}") return { "error": f"Risk analysis failed: {str(e)}", "location": { "city": "Unknown", "country": "Unknown", "lat": 0.0, "lon": 0.0, }, "identified_risks": [], "risk_analysis": {}, "overall_assessment": "Analysis could not be completed", }