evd / README.md
Benedette Otieno
feat: Add Kenya county risk intelligence and integrate into epidemiological context
a33aad5
|
Raw
History Blame Contribute Delete
7.1 kB

A newer version of the Gradio SDK is available: 6.22.0

Upgrade
metadata
title: Ebola Case Detection
colorFrom: red
colorTo: yellow
sdk: gradio
sdk_version: 6.16.0
app_file: app.py
pinned: false
python_version: '3.11'

Ebola Virus Disease Clinical Screening AI Agent

Production-ready adaptive EVD screening agent for healthcare workers, built with Python, Pydantic, an LLM-driven reasoning layer, LangGraph, and Gradio.

This agent performs dynamic clinical interviewing and classifies:

  • No Case
  • Suspected Case
  • Probable Case

It does not classify Confirmed Case (laboratory confirmation is intentionally out of scope).

1) Solution Architecture

Layer 1: Conversation Manager

  • Maintains session memory and full conversation history.
  • Tracks already asked questions and pending question.
  • Applies one-turn clinician input and returns one-turn agent output.

Layer 2: LLM Clinical Reasoning Agent

  • Uses an LLM to summarize known evidence, identify missing evidence, extract structured facts, and choose the next best single question.
  • Adapts questioning dynamically to symptoms, travel, exposure, and epidemiological context.
  • Stops questioning when the model determines sufficient evidence has been gathered.

Layer 3: Epidemiological Context Engine

  • Loads configurable outbreak context from JSON.
  • Computes proximity/context risk modifier from district, neighboring outbreaks, and alerts.
  • Prioritizes exposure questions earlier in high-risk context.

Layer 4: Explainability Module

  • Generates structured, auditable rationale:
    • Classification
    • Evidence collected
    • Criteria/definition match explanation
    • Recommended action

2) Folder Structure

.
β”œβ”€β”€ app.py
β”œβ”€β”€ requirements.txt
β”œβ”€β”€ data/
β”‚   └── epi_context.sample.json
β”œβ”€β”€ evd_agent/
β”‚   β”œβ”€β”€ __init__.py
β”‚   β”œβ”€β”€ config.py
β”‚   β”œβ”€β”€ context_engine.py
β”‚   β”œβ”€β”€ conversation.py
β”‚   β”œβ”€β”€ explainability.py
β”‚   β”œβ”€β”€ graph.py
β”‚   β”œβ”€β”€ llm_client.py
β”‚   β”œβ”€β”€ models.py
β”‚   └── reasoning.py
└── tests/
        └──

3) Data Models

Implemented with Pydantic in evd_agent/models.py:

  • PatientFacts: structured interview variables (symptoms, exposure, death, lab availability, location).
  • EpidemiologicalContext: outbreak metadata and alerts.
  • DecisionOutput: classification, rule, evidence, action, confidence, stop flag.
  • LLMInterviewPlan: structured LLM output for evidence summary, fact updates, and next question.
  • InterviewState: full session state, asked questions, pending question, history.
  • TurnResult: structured output for each turn.

4) State Schema

InterviewState fields:

  • session_id: unique UUID per session
  • status: in_progress | complete
  • facts: patient feature store
  • context: loaded epidemiological context
  • history: full clinician/assistant turns
  • asked_questions: dedup set
  • followup_question_count: tracks the max 3 follow-up questions rule
  • pending_question_text: next LLM-generated question
  • decision: current decision snapshot
  • llm_summary: latest reasoning summary from the model
  • rationale_log: extensible audit trail

5) Agent Workflow Diagram

flowchart TD
        A[Clinician Input] --> B[Conversation Manager]
        B --> D[LLM Reasoning Agent]
        D --> E[Structured Fact Updates]
        E --> H{Case Definition Met? by LLM + MOH guidance}
        H -- Yes --> I[Suspected or Probable]
        H -- No --> J[LLM-Generated Next Question]
        I --> K[Explainability Module]
        J --> K
        K --> L[Gradio UI Panels + Chat]

LangGraph orchestration is implemented in evd_agent/graph.py with nodes:

  • ingest_input
    • llm_reason
  • compose_response

6) Clinical Reasoning Logic

Clinical decisions are made directly by the LLM using Kenya MOH case definitions plus county context as supplemental situational awareness. County context influences question priority and concern level but does not independently classify a case.

7) Clinical Reasoning Workflow

Suspected case triggers if any:

  • Unexplained bleeding.
  • Sudden unexplained death.
  • Fever >= 38C with at least 3 compatible symptoms.
  • Fever >= 38C with qualifying exposure in previous 21 days.

Probable case triggers when all:

  • Deceased,
  • Meets suspected criteria,
  • Epidemiological linkage to known case,
  • Laboratory confirmation unavailable.

Adaptive questioning behavior:

  • One question at a time.
  • Stops immediately once suspect/probable criteria are met.
  • Uses LLM reasoning to prioritize highest-value unresolved evidence.
  • Asks a maximum of 3 follow-up questions when no case definition is met.
  • Avoids duplicate questions through state tracking.

8) Gradio Implementation

Gradio app in app.py includes:

  • Chat interface
  • Conversation history
  • Session memory (gr.State with InterviewState)
  • Classification panel
  • Epidemiological context panel
  • Alert banner
  • Reset button

9) Deployment Instructions

Local run

python -m venv .venv
source .venv/bin/activate
pip install -r requirements.txt
python app.py

Open http://localhost:7860.

Configurable context

Set custom context file:

export EVD_CONTEXT_PATH=/absolute/path/to/epi_context.json
python app.py

LLM configuration

Set an OpenAI-compatible model before starting the app. The UI will not launch without credentials, and the initial interview turn is generated by the LLM:

export EVD_LLM_API_KEY=your_key_here
export EVD_LLM_MODEL=gpt-4.1-mini
python app.py

You can also use a local .env file (auto-loaded by the app):

cp .env.example .env
# edit .env with your real key
python app.py

Optional custom endpoint:

export EVD_LLM_BASE_URL=https://your-openai-compatible-endpoint
python app.py

Container (example)

FROM python:3.12-slim
WORKDIR /app
COPY . .
RUN pip install --no-cache-dir -r requirements.txt
EXPOSE 7860
CMD ["python", "app.py"]

10) Production Hardening Recommendations

  1. Add authentication and role-based access control for surveillance users.
  2. Encrypt data in transit and at rest (TLS + disk/database encryption).
  3. Replace in-memory session state with durable backend store (PostgreSQL/Redis).
  4. Add structured audit logging (classification path, timestamp, user identity, facility).
  5. Add observability (metrics, traces, interview completion rates, escalation latency).
  6. Add input validation guardrails and red-team testing for ambiguous narratives.
  7. Add clinical governance versioning for case definitions by country/date.
  8. Integrate notification adapters (SMS, DHIS2, surveillance endpoint APIs).
  9. Add high-availability deployment and disaster recovery plan.
  10. Add unit/integration/regression tests to CI/CD gates.

11) Complete Python Code

All complete runnable code is included in this repository under:

  • app.py
  • evd_agent/*.py

Notes on Clinical Scope

  • This system is a surveillance decision-support assistant and should be used under official public health protocols.
  • Confirmed case classification is intentionally excluded, pending laboratory diagnostics.