Spaces:
Sleeping
Sleeping
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", | |
} | |