HurriAid

Why

I’m in Miami. Hurricanes happen. I want a simple, instant view: What’s my risk? What should I do right now? Where’s the nearest open shelter? Also, hurricane myths spread fast. I wanted a quick way to verify rumors without doomscrolling.

What it does

  • Risk snapshot: SAFE / LOW / MEDIUM / HIGH + a one-line “why.”
  • Right-sized checklist tailored to your risk.
  • Nearest open shelter with distance + ETA.
  • Rumor verifier: labels claims True / False / Misleading with a short note.

How it works (agents)

  • Watcher: loads advisory → computes distance → asks AI for risk + brief reason.
  • Parallel:
    • Checklist (AI): short, deduped, risk-sized actions.
    • Planner: finds nearest open shelter via Haversine distance + ETA.
    • Verifier (on demand): fact-checks user-entered rumors.
UI (Streamlit)
  ├─ Watcher → AI risk + why
  └─ Parallel
     ├─ Checklist (AI)
     ├─ Planner (nearest shelter)
     └─ Verifier (rumors)

Run it

# 1) Set your key (example: local dev)
export GOOGLE_GENAI_USE_VERTEXAI=FALSE
export GOOGLE_API_KEY="YOUR_API_KEY"

# 2) Install
pip install -r requirements.txt

# 3) Start
streamlit run app/ui.py

Key math — explained

1) Distance (ZIP → storm center)

  • Use your ZIP’s latitude/longitude and the storm center’s latitude/longitude.
  • Compute great-circle distance (follows Earth’s curve, not a straight line).
  • Result is in kilometers.

2) ETA to the nearest open shelter

  • Pick a conservative average road speed based on storm intensity:
    • TS or Cat 1: ~40 km/h
    • Cat 3 or higher: ~30 km/h
    • Otherwise: ~45 km/h
  • Formula: ETA (minutes) = (distance_km / speed_kmh) × 60
  • This is a safety-first estimate (no live traffic).

3) Risk labels (rule of thumb)

  • Inputs: advisory radius r, your distance d, storm category, and whether the advisory is active.
  • SAFE — No active advisory, or you’re well beyond r.
  • LOW — Advisory is active but you’re comfortably outside the likely impact zone.
  • MEDIUM — You’re near the edge (≈ within r + 120 km), or inside when it’s TS/Cat 1.
  • HIGH — You’re inside the advisory, or within ~50 km for Cat 2+.

What I learned

  • Clean JSON-only contracts keep the UI stable and parsing simple.
  • Coordinating multiple AI agents (prompts, temps, token limits) matters more than any single prompt.
  • Small, friendly error messages beat perfect but brittle flows.

Challenges

  • Getting models to always return strict JSON (no fences/prose).
  • Robust parsing + retries across agents.
  • Balancing speed, clarity, and “human” phrasing.

Why it matters

  • What’s my risk? To classify SAFE / LOW / MEDIUM / HIGH using live advisory data, your ZIP’s distance to the storm center, the advisory radius, and storm category, and include a one-sentence why for transparency.

  • What should I do now? An AI builds a 24–48h checklist sized to your risk: light reminders for LOW, core supplies for MEDIUM, and full prep + evac steps for HIGH, concise, de-duplicated, and actionable.

  • Where can I go? We find the nearest open shelter from data/shelters.json, compute distance with haversine, add a storm-aware ETA (slower for CAT3+), and provide a one-click Google Maps route.

  • Is that rumor real? A verifier labels each claim True / False / Misleading / Caution and adds a ≤30-word note—clear guidance without jargon or scare tactics.

Built With

  • custom-llm-verifier-(retries/timeouts)
  • google-adk-+-gemini-(genai-sdk)
  • google-maps-deep-links
  • local-json-data-(advisory/shelters/history)
  • pgeocode-+-haversine/circle-geo-utils
  • pydantic
  • python
  • streamlit-+-pydeck
  • threadpoolexecutor-orchestration
Share this project:

Updates