Spaces:
Sleeping
Sleeping
| import os | |
| import json | |
| import pandas as pd | |
| import requests | |
| from flask import Flask, render_template, request, jsonify | |
| from dotenv import load_dotenv | |
| import google.generativeai as genai | |
| load_dotenv() | |
| app = Flask(__name__) | |
| GOOGLE_API_KEY = os.getenv("GOOGLE_API_KEY") | |
| CSV_PATH = "dam.csv" | |
| # Initialize Gemini API | |
| genai.configure(api_key=GOOGLE_API_KEY) | |
| gemini_model = genai.GenerativeModel('gemini-1.5-flash') | |
| # Load dams CSV with latitude, longitude, dam_name columns | |
| dams_df = pd.read_csv(CSV_PATH) | |
| dams_df['latitude'] = pd.to_numeric(dams_df['latitude'], errors='coerce') | |
| dams_df['longitude'] = pd.to_numeric(dams_df['longitude'], errors='coerce') | |
| dams_df.dropna(subset=['latitude', 'longitude', 'dam_name'], inplace=True) | |
| def index(): | |
| dams = dams_df.to_dict(orient='records') | |
| return render_template('index.html', dams=dams) | |
| def dam_details(): | |
| data = request.json | |
| dam_name = data.get('dam_name') | |
| lat = data.get('latitude') | |
| lon = data.get('longitude') | |
| current_level = data.get('current_water_level') | |
| # Gemini: Get dam info | |
| prompt = f""" | |
| Provide the following information for the dam "{dam_name}" in JSON format: | |
| {{ | |
| "capacity_mcm": "N/A if unknown", | |
| "number_of_spillway_gates": "N/A if unknown", | |
| "gate_type": "N/A if unknown", | |
| "dam_height_meters": "N/A if unknown", | |
| "purpose": "N/A if unknown", | |
| "river_name": "N/A if unknown", | |
| "country": "N/A if unknown" | |
| }} | |
| """ | |
| try: | |
| response = gemini_model.generate_content(prompt) | |
| text = response.text.strip() | |
| # Extract JSON from response text | |
| json_start = text.find('{') | |
| json_end = text.rfind('}') + 1 | |
| dam_info = json.loads(text[json_start:json_end]) | |
| except Exception as e: | |
| return jsonify({"error": f"Gemini API error: {e}"}) | |
| # Fetch rainfall forecast | |
| try: | |
| forecast_url = "https://api.open-meteo.com/v1/forecast" | |
| params = { | |
| "latitude": lat, | |
| "longitude": lon, | |
| "daily": "precipitation_sum", | |
| "forecast_days": 10, | |
| "timezone": "auto" | |
| } | |
| r = requests.get(forecast_url, params=params, timeout=10) | |
| r.raise_for_status() | |
| forecast_data = r.json() | |
| dates = forecast_data['daily']['time'] | |
| rain = forecast_data['daily']['precipitation_sum'] | |
| rainfall_list = [{"date": d, "rainfall_mm": v} for d, v in zip(dates, rain)] | |
| except Exception as e: | |
| return jsonify({"error": f"Rainfall API error: {e}"}) | |
| # Prepare prompt for operational advice | |
| rain_summary = "\n".join([f"{r['date']}: {r['rainfall_mm']} mm" for r in rainfall_list]) | |
| advice_prompt = f""" | |
| You are an expert dam operations advisor. For the dam "{dam_name}", here is the info: | |
| Capacity (MCM): {dam_info.get('capacity_mcm', 'N/A')} | |
| Spillway gates: {dam_info.get('number_of_spillway_gates', 'N/A')} ({dam_info.get('gate_type', 'N/A')}) | |
| Height: {dam_info.get('dam_height_meters', 'N/A')} meters | |
| Purpose: {dam_info.get('purpose', 'N/A')} | |
| River: {dam_info.get('river_name', 'N/A')} | |
| Country: {dam_info.get('country', 'N/A')} | |
| Current water level: {current_level} % of capacity. | |
| Rainfall forecast for next 10 days: | |
| {rain_summary} | |
| Based on this data, provide operational recommendations with key performance indicators (KPIs). | |
| Format your response with: | |
| KEY RECOMMENDATIONS: | |
| - Overall Status: [NORMAL, WATCH, WARNING, EMERGENCY] | |
| - Action Required: [MAINTAIN CURRENT, OPEN GATES, CLOSE GATES, MONITOR CLOSELY] | |
| - Urgency and timing if opening gates | |
| - Suggested % of gate opening | |
| - Other notes | |
| """ | |
| try: | |
| advice_resp = gemini_model.generate_content(advice_prompt) | |
| advice_text = advice_resp.text.strip() | |
| except Exception as e: | |
| advice_text = f"Error generating advice: {e}" | |
| return jsonify({ | |
| "dam_info": dam_info, | |
| "rainfall_forecast": rainfall_list, | |
| "operational_advice": advice_text | |
| }) | |
| if __name__ == "__main__": | |
| app.run(debug=True) | |