mcp-hf / app.py
elanuk's picture
Update app.py
fa33eaa verified
raw
history blame
6.4 kB
import gradio as gr
import requests
from datetime import datetime
# Use your deployed server instead of localhost
MCP_SERVER_URL = "https://elanuk-mcp-hf.hf.space"
# Bihar districts list
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()
}
# Call your existing deployed server
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', '')
# Create CSV file if content exists
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)
# Create Gradio interface
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
)
# Connect the button
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
)