import pandas as pd import joblib import gradio as gr import json import requests MODEL_PATH = "risk_model.joblib" ZAPIER_WEBHOOK_URL = "https://hooks.zapier.com/hooks/catch/27083565/uvtxiub/" DISCLAIMER = ( "Educational demo only. This tool does not provide diagnosis, " "prescriptions, or treatment plans. If symptoms are severe or urgent, seek emergency care." ) RED_FLAGS = [ "chest pain", "chest tightness", "severe shortness of breath", "fainting", "loss of consciousness", "stroke" ] risk_model = joblib.load(MODEL_PATH) def send_urgent_alert(symptom_text, risk_score): try: requests.post(ZAPIER_WEBHOOK_URL, json={ "triage_level": "urgent", "symptom": symptom_text, "risk_score": risk_score, "message": "URGENT triage case detected by HealthBridge AI" }, timeout=5) except Exception: pass def assess(sexvar, educa, genhlth, menthlth, stress, sleep_hours, sleep_quality, duration_days, adherence_prob, symptom_text): text_lower = str(symptom_text).lower() red_flag_hit = any(flag in text_lower for flag in RED_FLAGS) input_df = pd.DataFrame([{ "user_id": 0, "SEXVAR": sexvar, "EDUCA": educa, "GENHLTH": genhlth, "MENTHLTH": menthlth, "stress_score_0_10": stress, "sleep_hours": sleep_hours, "sleep_quality_0_10": sleep_quality, "symptom_duration_days": duration_days, "adherence_prob": adherence_prob, "symptom_text": symptom_text, "triage_label": "medium" }]) risk_score = float(risk_model.predict_proba(input_df)[0][1]) if red_flag_hit: triage_level = "urgent" elif risk_score >= 0.7: triage_level = "high" elif risk_score >= 0.4: triage_level = "medium" else: triage_level = "low" if triage_level == "urgent": send_urgent_alert(symptom_text, round(risk_score, 3)) if triage_level == "urgent": next_steps = [ "🚨 Seek emergency care immediately or call emergency services.", "Do not drive yourself — ask someone nearby to help.", "Do not wait to see if symptoms improve." ] elif triage_level == "high": next_steps = [ "Contact a healthcare provider as soon as possible.", "Monitor symptoms closely and note any changes.", "Seek emergency care if symptoms worsen rapidly." ] elif triage_level == "medium": next_steps = [ "Schedule an appointment with your doctor within the next few days.", "Rest and monitor your symptoms.", "Seek urgent care if symptoms escalate." ] else: next_steps = [ "Monitor symptoms and maintain healthy routines.", "Seek professional care if symptoms persist beyond a week.", "Stay hydrated and rest as needed." ] LEVEL_COLORS = { "urgent": "#FF2D2D", "high": "#FF8C00", "medium": "#F5C518", "low": "#2ECC71" } LEVEL_BG = { "urgent": "#FFF0F0", "high": "#FFF5E6", "medium": "#FFFBEA", "low": "#F0FFF6" } LEVEL_ICONS = { "urgent": "🚨", "high": "⚠️", "medium": "🔶", "low": "✅" } color = LEVEL_COLORS[triage_level] bg = LEVEL_BG[triage_level] icon = LEVEL_ICONS[triage_level] risk_pct = int(risk_score * 100) bar_color = color steps_html = "".join(f"
  • {s}
  • " for s in next_steps) alert_banner = "" if triage_level == "urgent": alert_banner = f"""
    🚨 URGENT — An automated alert email has been sent.
    """ html = f"""
    {alert_banner}
    {icon}
    Triage Level
    {triage_level.upper()}
    Risk Score {risk_pct}%
    {"🚩" if red_flag_hit else "✔️"} Red Flag: {"DETECTED" if red_flag_hit else "None detected"}
    Recommended Next Steps
    ⚠️ {DISCLAIMER}
    """ return html demo = gr.Interface( fn=assess, inputs=[ gr.Dropdown([1, 2], value=1, label="Sex (BRFSS-coded)"), gr.Slider(1, 6, value=4, step=1, label="Education level"), gr.Slider(1, 5, value=3, step=1, label="General health"), gr.Slider(0, 30, value=5, step=1, label="Mental health bad days"), gr.Slider(0, 10, value=5, step=0.1, label="Stress score"), gr.Slider(3, 10, value=7, step=0.1, label="Sleep hours"), gr.Slider(0, 10, value=7, step=0.1, label="Sleep quality"), gr.Slider(1, 30, value=5, step=1, label="Symptom duration (days)"), gr.Slider(0.05, 0.95, value=0.65, step=0.01, label="Adherence probability"), gr.Textbox(lines=4, placeholder="e.g. chest pain for 2 days, high stress, poor sleep", label="Symptom description") ], outputs=gr.HTML(label="Triage Result"), title="HealthBridge AI — Non-diagnostic Triage Demo", description="Educational demo only. Not a substitute for professional medical advice.", theme=gr.themes.Soft() ) demo.launch()