|
import gradio as gr |
|
import requests |
|
from datetime import datetime |
|
|
|
|
|
MCP_SERVER_URL = "https://elanuk-mcp-hf.hf.space" |
|
|
|
|
|
BIHAR_DISTRICTS = [ |
|
"Patna", "Gaya", "Bhagalpur", "Muzaffarpur", "Darbhanga", "Siwan", |
|
"Begusarai", "Katihar", "Nalanda", "Rohtas", "Saran", "Samastipur", |
|
"Madhubani", "Purnia", "Araria", "Kishanganj", "Supaul", "Madhepura", |
|
"Saharsa", "Khagaria", "Munger", "Lakhisarai", "Sheikhpura", "Nawada", |
|
"Jamui", "Jehanabad", "Aurangabad", "Arwal", "Kaimur", "Buxar", |
|
"Bhojpur", "Saran", "Siwan", "Gopalganj", "East Champaran", "West Champaran", |
|
"Sitamarhi", "Sheohar", "Vaishali" |
|
] |
|
|
|
def format_workflow_output(raw_output): |
|
"""Format the workflow output for display""" |
|
if not raw_output: |
|
return "β No output received" |
|
|
|
lines = raw_output.split('\n') |
|
formatted_lines = [] |
|
|
|
for line in lines: |
|
line = line.strip() |
|
if not line: |
|
formatted_lines.append("") |
|
continue |
|
|
|
if line.startswith('πΎ') and 'Workflow' in line: |
|
formatted_lines.append(f"## {line}") |
|
elif line.startswith('=') or line.startswith('-'): |
|
continue |
|
elif line.startswith('π€οΈ') or line.startswith('β
Workflow'): |
|
formatted_lines.append(f"### {line}") |
|
elif line.startswith('π±') or line.startswith('π') or line.startswith('ποΈ') or line.startswith('π€'): |
|
formatted_lines.append(f"#### {line}") |
|
elif line.startswith('β
') or line.startswith('β'): |
|
formatted_lines.append(f"- {line}") |
|
else: |
|
formatted_lines.append(line) |
|
|
|
return '\n'.join(formatted_lines) |
|
|
|
def format_alert_summary(raw_data): |
|
"""Create a formatted summary of the alert data""" |
|
if not raw_data or 'alert_data' not in raw_data: |
|
return "No alert data available" |
|
|
|
alert_data = raw_data['alert_data'] |
|
|
|
summary = f""" |
|
## π¨ Alert Summary |
|
|
|
**π Location:** {alert_data['location']['village']}, {alert_data['location']['district']}, {alert_data['location']['state']} |
|
|
|
**πΎ Crop Information:** |
|
- **Crop:** {alert_data['crop']['name'].title()} |
|
- **Growth Stage:** {alert_data['crop']['stage']} |
|
- **Season:** {alert_data['crop']['season'].title()} |
|
|
|
**π€οΈ Weather Conditions:** |
|
- **Temperature:** {alert_data['weather']['temperature']} |
|
- **Expected Rainfall:** {alert_data['weather']['expected_rainfall']} |
|
- **Wind Speed:** {alert_data['weather']['wind_speed']} |
|
- **Rain Probability:** {alert_data['weather']['rain_probability']}% |
|
|
|
**β οΈ Alert Details:** |
|
- **Type:** {alert_data['alert']['type'].replace('_', ' ').title()} |
|
- **Urgency:** {alert_data['alert']['urgency'].upper()} |
|
- **AI Enhanced:** {'β
Yes' if alert_data['alert']['ai_generated'] else 'β No'} |
|
|
|
**π¨ Alert Message:** |
|
{alert_data['alert']['message']} |
|
|
|
**π― Action Items:** |
|
{chr(10).join([f"- {item.replace('_', ' ').title()}" for item in alert_data['alert']['action_items']])} |
|
""" |
|
return summary |
|
|
|
def run_workflow(district): |
|
"""Run the workflow and return results""" |
|
if not district: |
|
return "β Please select a district", "", "" |
|
|
|
try: |
|
payload = { |
|
"state": "bihar", |
|
"district": district.lower() |
|
} |
|
|
|
|
|
response = requests.post( |
|
f"{MCP_SERVER_URL}/api/run-workflow", |
|
json=payload, |
|
timeout=60 |
|
) |
|
|
|
if response.status_code == 200: |
|
result = response.json() |
|
|
|
workflow_output = format_workflow_output(result.get('message', '')) |
|
alert_summary = format_alert_summary(result.get('raw_data', {})) |
|
csv_content = result.get('csv', '') |
|
|
|
|
|
if csv_content: |
|
filename = f"bihar_alert_{district.lower()}_{datetime.now().strftime('%Y%m%d_%H%M%S')}.csv" |
|
with open(filename, 'w', encoding='utf-8') as f: |
|
f.write(csv_content) |
|
return workflow_output, alert_summary, gr.File(value=filename, visible=True) |
|
else: |
|
return workflow_output, alert_summary, gr.File(visible=False) |
|
|
|
else: |
|
error_msg = f"β Server Error ({response.status_code})" |
|
return error_msg, "", gr.File(visible=False) |
|
|
|
except Exception as e: |
|
error_msg = f"β Error: {str(e)}" |
|
return error_msg, "", gr.File(visible=False) |
|
|
|
|
|
with gr.Blocks( |
|
title="BIHAR AgMCP - Agricultural Weather Alerts", |
|
theme=gr.themes.Soft() |
|
) as demo: |
|
|
|
gr.Markdown(""" |
|
# πΎ BIHAR AgMCP - Agricultural Weather Alert System |
|
|
|
**AI-Powered Weather Alerts for Bihar Farmers** |
|
|
|
Generate personalized weather alerts for agricultural activities in Bihar districts. |
|
|
|
## How to Use: |
|
1. Select a Bihar district from the dropdown |
|
2. Click "Generate Weather Alert" |
|
3. View the formatted results and download CSV data |
|
""") |
|
|
|
with gr.Row(): |
|
with gr.Column(scale=1): |
|
district_input = gr.Dropdown( |
|
choices=BIHAR_DISTRICTS, |
|
label="π Select Bihar District", |
|
value="Patna" |
|
) |
|
|
|
run_btn = gr.Button( |
|
"π Generate Weather Alert", |
|
variant="primary", |
|
size="lg" |
|
) |
|
|
|
with gr.Row(): |
|
with gr.Column(scale=2): |
|
workflow_output = gr.Markdown( |
|
label="π Workflow Output", |
|
value="Select a district and click the button to generate alerts..." |
|
) |
|
|
|
with gr.Column(scale=1): |
|
alert_summary = gr.Markdown( |
|
label="π Alert Summary", |
|
value="Alert details will appear here..." |
|
) |
|
|
|
csv_output = gr.File( |
|
label="π Download CSV Data", |
|
visible=False |
|
) |
|
|
|
|
|
run_btn.click( |
|
run_workflow, |
|
inputs=[district_input], |
|
outputs=[workflow_output, alert_summary, csv_output] |
|
) |
|
|
|
if __name__ == "__main__": |
|
demo.launch( |
|
server_name="0.0.0.0", |
|
server_port=7860 |
|
) |