--- title: AMR-Guard emoji: ⚕️ colorFrom: blue colorTo: indigo sdk: gradio sdk_version: "5.25.0" python_version: "3.12" hardware: zero-gpu pinned: true license: apache-2.0 tags: - healthcare - medical - antimicrobial-resistance - clinical-decision-support - streamlit - llm - medgemma short_description: Multi-agent clinical support for antimicrobial stewardship --- # AMR-Guard: Infection Lifecycle Orchestrator A multi-agent clinical decision-support system for antimicrobial stewardship, submitted to the **[MedGemma Impact Challenge](https://www.kaggle.com/competitions/med-gemma-impact-challenge)**. Powered by **MedGemma** (4B multimodal + 27B text) and **TxGemma** — HAI-DEF models from Google. --- ## What it does AMR-Guard guides clinicians through two stages of infection management with a **dynamic, site-aware patient form** that adapts its fields based on the selected infection site. **Stage 1 — Empirical** (no lab results yet) Patient history → risk factor analysis → empirical antibiotic recommendation **Stage 2 — Targeted** (lab results available) Lab report upload (PDF / image, any language) → pathogen & MIC extraction → resistance trend analysis → targeted prescription with drug interaction screening A unique capability is **MIC creep detection**: the system flags when a pathogen's Minimum Inhibitory Concentration has risen ≥4-fold across admissions — even while the lab still reports "Susceptible" — giving clinicians a 6–18 month early warning before formal treatment failure. --- ## Key Features | Feature | Details | |---------|---------| | **Dynamic form** | Fields adapt to infection site (urinary, respiratory, bloodstream, skin, intra-abdominal, CNS) | | **Contextual suspected source** | Dropdown options change based on infection site (e.g. CAP / HAP / VAP for respiratory) | | **Conditional creatinine** | Shown prominently for systemic infections; optional toggle for skin / intra-abdominal | | **Lab file upload** | Upload PDF or image (PNG/JPG/TIFF) — PDF text extracted via pypdf; images sent to MedGemma vision | | **MIC creep detection** | ≥4-fold MIC rise flagged before clinical resistance develops | | **WHO AWaRe stewardship** | ACCESS → WATCH → RESERVE prescribing hierarchy enforced | | **Drug interaction screening** | 191 K+ interactions from DDInter 2.0 | | **Renal dose adjustment** | Cockcroft-Gault CrCl → 5-tier dose adjustment | --- ## Agent Pipeline ``` Patient form ──► Agent 1: Intake Historian ──► (no lab) ──────────────────────────────► Agent 4: Clinical Pharmacologist ──► Prescription │ ▲ └──► (lab uploaded) ──► Agent 2: Vision Specialist ──► Agent 3: Trend Analyst ──┘ ``` | # | Agent | Model | Role | |---|-------|-------|------| | 1 | Intake Historian | MedGemma 4B IT | Parse EHR notes, calculate CrCl (Cockcroft-Gault), identify MDR risk factors | | 2 | Vision Specialist | MedGemma 4B IT (multimodal) | Extract pathogen names + MIC values from lab images / PDFs in **any language** | | 3 | Trend Analyst | MedGemma 27B Text IT | Detect MIC creep, compute resistance velocity against EUCAST v16.0 breakpoints | | 4 | Clinical Pharmacologist | MedGemma 4B IT + TxGemma 9B | Select antibiotic + dose, apply WHO AWaRe stewardship, screen drug interactions | **Orchestration:** LangGraph state machine with conditional routing **Knowledge base:** SQLite (EUCAST breakpoints, WHO AWaRe, ATLAS surveillance, DDInter interactions) + ChromaDB (IDSA guidelines, WHO GLASS — semantic RAG) --- ## Hugging Face Spaces Deployment > **Recommended deployment target.** Provides a persistent URL, native Streamlit support, GPU access, and multi-user access out of the box. ### Requirements - A HF Space with **GPU hardware** (T4 for MedGemma 4B; A10G or better for MedGemma 27B) - HF access granted to [MedGemma](https://huggingface.co/google/medgemma-4b-it) and [TxGemma](https://huggingface.co/google/txgemma-2b-predict) ### Steps **1. Create a new Space** Go to [huggingface.co/new-space](https://huggingface.co/new-space) and select: - SDK: **Streamlit** - Hardware: **T4 (GPU)** (free tier, limited quota) or **A10G** **2. Push this repository** ```bash git remote set-url space https://huggingface.co/spaces//amr-guard 2>/dev/null || git remote add space https://huggingface.co/spaces//amr-guard git push space master:main ``` **3. Add Space Secrets** In your Space → Settings → Variables and Secrets, add: | Secret name | Value | Notes | |-------------|-------|-------| | `MEDIC_LOCAL_MEDGEMMA_4B_MODEL` | `google/medgemma-4b-it` | Required | | `MEDIC_LOCAL_MEDGEMMA_27B_MODEL` | `google/medgemma-4b-it` | Use 4B fallback on T4 | | `MEDIC_LOCAL_TXGEMMA_9B_MODEL` | `google/txgemma-2b-predict` | Required | | `MEDIC_LOCAL_TXGEMMA_2B_MODEL` | `google/txgemma-2b-predict` | Required | | `MEDIC_QUANTIZATION` | `4bit` | Required | | `MEDIC_ENV` | `production` | Required | | `HF_TOKEN` | Your HF access token | Required (gated models) | **4. First boot — knowledge base initialisation** `app.py` detects the HF Spaces environment (`SPACE_ID` env var) and automatically runs `setup_demo.py` on first boot to build the SQLite + ChromaDB knowledge base. This takes ~2–5 minutes once and requires no manual steps. > Enable **Persistent Storage** (Space Settings → Persistent Storage) so the knowledge base survives restarts. Without it, setup runs on every cold boot (~2 min overhead). **5. Drug interaction dataset (optional)** To enable full drug interaction screening, place `db_drug_interactions.csv` in `docs/drug_safety/` before pushing, or after deployment open the Space terminal and run: ```bash kaggle datasets download -d mghobashy/drug-drug-interactions --unzip -p docs/drug_safety/ python setup_demo.py ``` --- ## Local Setup ### Requirements - Python 3.11+ - [`uv`](https://docs.astral.sh/uv/) for dependency management - HuggingFace account with access to MedGemma and TxGemma ### 1. Install dependencies ```bash uv sync ``` ### 2. Configure environment ```bash cp .env.example .env ``` Minimum required settings in `.env`: ```bash MEDIC_LOCAL_MEDGEMMA_4B_MODEL=google/medgemma-4b-it MEDIC_LOCAL_MEDGEMMA_27B_MODEL=google/medgemma-4b-it # 4B fallback if < 24 GB VRAM MEDIC_LOCAL_TXGEMMA_9B_MODEL=google/txgemma-2b-predict MEDIC_LOCAL_TXGEMMA_2B_MODEL=google/txgemma-2b-predict MEDIC_QUANTIZATION=4bit ``` ### 3. Authenticate with HuggingFace ```bash uv run huggingface-cli login ``` ### 4. Build the knowledge base ```bash uv run python setup_demo.py ``` Ingests EUCAST breakpoints, WHO AWaRe classification, IDSA guidelines, ATLAS surveillance data, and DDInter drug interactions into SQLite + ChromaDB. Source files are in `docs/` — generated database is written to `data/` (gitignored). ### 5. Run the app ```bash uv run streamlit run app.py ``` Open `http://localhost:8501` in your browser. --- ## Kaggle Reproduction The full pipeline can also be reproduced on a free Kaggle T4 GPU (16 GB VRAM): 1. Open [`notebooks/kaggle_medic_demo.ipynb`](notebooks/kaggle_medic_demo.ipynb) in Kaggle 2. Add the `mghobashy/drug-drug-interactions` dataset to the notebook 3. Add your HuggingFace token as a Kaggle secret named `HF_TOKEN` 4. Run all cells — the notebook clones this repo, installs dependencies, builds the knowledge base, and launches the app via a public tunnel Models run with 4-bit quantization on T4 (MedGemma 4B + TxGemma 2B). --- ## Dynamic Form — Field Reference The Patient Analysis form adapts based on the selected **Primary infection site**. | Infection site | Site-specific fields | Creatinine | |---|---|---| | **Urinary** | Catheter status, urinary symptoms, urine appearance | Always shown | | **Respiratory** | O₂ saturation, ventilation status, cough type, sputum character | Always shown | | **Bloodstream** | Central line, temperature, heart rate, respiratory rate, WBC, lactate, shock status | Always shown | | **Skin** | Wound type, cellulitis extent, abscess, foreign body | Optional (renal flag) | | **Intra-abdominal** | Pain location, peritonitis signs, perforation suspected, ascites | Optional (renal flag) | | **CNS** | CSF obtained, neurological symptoms, recent neurosurgery, GCS score | Always shown | | **Other** | No site-specific fields | Optional (renal flag) | The **Suspected source** dropdown adapts contextually (e.g., respiratory → CAP / HAP / VAP / Aspiration / ...). **Lab / Culture Results** accepts three input modes: - **None** — empirical pathway only - **Upload file** — PDF (text extracted via pypdf) or image (PNG/JPG/TIFF sent to MedGemma vision) - **Paste text** — manual copy-paste from a lab system --- ## Knowledge Base Sources All data is open-access — no registration required except where noted. | Source | Contents | Used for | |--------|----------|---------| | [EUCAST v16.0](https://www.eucast.org/bacteria/clinical-breakpoints-and-interpretation/) | Clinical breakpoint tables | MIC interpretation, creep detection | | [WHO AWaRe 2024](https://aware.essentialmeds.org) | Access / Watch / Reserve classification | Antibiotic stewardship | | [IDSA AMR Guidance 2024](https://www.idsociety.org/practice-guideline/amr-guidance/) | Treatment guidelines PDF | Empirical therapy RAG | | [Pfizer ATLAS](https://atlas-surveillance.com) *(free registration)* | 6.5M MIC surveillance measurements | Resistance patterns RAG | | [WHO GLASS](https://worldhealthorg.shinyapps.io/glass-dashboard/) | 23M+ AMR episodes, 141 countries | Global resistance context | | [DDInter 2.0](https://ddinter2.scbdd.com) | 191,000+ drug-drug interactions | Interaction screening | | [OpenFDA](https://api.fda.gov/drug/label.json) | Drug labeling / contraindications | Safety RAG | --- ## Project Structure ``` amr-guard/ ├── app.py # Streamlit UI — all four pages ├── setup_demo.py # One-command knowledge base setup ├── requirements.txt # pip requirements (HF Spaces / CI) ├── packages.txt # apt system packages (HF Spaces) ├── pyproject.toml # Full dependency spec (managed by uv) ├── .env.example # Environment variable template │ ├── src/ │ ├── agents.py # Four agent implementations │ ├── form_config.py # Dynamic form field definitions per infection site │ ├── graph.py # LangGraph orchestrator + conditional routing │ ├── loader.py # Model loading: multimodal + causal LM + vision inference │ ├── prompts.py # System and user prompts for all agents │ ├── rag.py # ChromaDB ingestion and retrieval helpers │ ├── state.py # InfectionState TypedDict schema │ ├── utils.py # CrCl calculator, MIC creep detection │ ├── config.py # Pydantic settings (reads from .env / Space Secrets) │ ├── tools/ │ │ ├── antibiotic_tools.py # WHO AWaRe lookups, MIC interpretation │ │ ├── resistance_tools.py # Pathogen resistance pattern queries │ │ ├── safety_tools.py # Drug interaction screening │ │ └── rag_tools.py # Guideline retrieval wrappers │ └── db/ │ ├── schema.sql # SQLite table definitions │ ├── database.py # Connection and query helpers │ ├── import_data.py # ETL: Excel/CSV/PDF → SQLite │ └── vector_store.py # ChromaDB ingestion │ ├── docs/ # Source data files (committed — used by setup_demo.py) │ ├── antibiotic_guidelines/ # WHO AWaRe Excel exports, IDSA PDF │ ├── mic_breakpoints/ # EUCAST v16.0 breakpoint tables │ ├── pathogen_resistance/ # ATLAS susceptibility data │ └── drug_safety/ # DDInter drug interaction CSV │ ├── notebooks/ │ └── kaggle_medic_demo.ipynb # Full reproducible Kaggle notebook │ └── tests/ └── test_pipeline.py # Agent and pipeline unit tests ``` --- > **Research demo only.** Not validated for clinical use. All recommendations must be reviewed by a licensed clinician before any patient-care decision.