By Sagar Shankaran, Founder of CallSphere
Build an AI agent for public health departments that provides vaccination eligibility information, finds nearby clinics with appointment availability, and distributes outbreak alerts with actionable guidance.
Key takeaways
Public health departments serve as the front line of community health infrastructure. They manage vaccination programs, track disease outbreaks, operate clinics, and communicate health advisories. During routine operations, residents call with questions about vaccine eligibility, clinic hours, and immunization records. During outbreaks, call volumes spike by 10x or more, overwhelming staff and leaving residents without timely information.
An AI agent can handle the information layer: determining vaccine eligibility based on age and health conditions, finding nearby clinics with availability, checking immunization records, and distributing outbreak alerts with specific guidance. The agent does not replace clinical judgment — it replaces the phone tree and the hold queue.
Vaccine eligibility rules are set by the CDC and state health departments. They follow structured criteria based on age, health conditions, and prior vaccination history. This is deterministic logic that must be precise.
Hear it before you finish reading
Talk to a live CallSphere AI voice agent for healthcare in your browser — 60 seconds, no signup.
flowchart LR
CALLER(["Patient or Caregiver"])
subgraph TEL["Telephony"]
SIP["Twilio SIP and PSTN"]
end
subgraph BRAIN["Healthcare AI Agent"]
STT["Streaming STT<br/>Deepgram or Whisper"]
NLU{"Intent and<br/>Entity Extraction"}
TOOLS["Tool Calls"]
TTS["Streaming TTS<br/>ElevenLabs or Rime"]
end
subgraph DATA["Live Data Plane"]
CRM[("CRM and Notes")]
CAL[("Calendar and<br/>Schedule")]
KB[("Knowledge Base<br/>and Policies")]
end
subgraph OUT["Outcomes"]
O1(["Appointment booked"])
O2(["Prescription refill request"])
O3(["Triage to clinician"])
end
CALLER --> SIP --> STT --> NLU
NLU -->|Lookup| TOOLS
TOOLS <--> CRM
TOOLS <--> CAL
TOOLS <--> KB
NLU --> TTS --> SIP --> CALLER
NLU -->|Resolved| O1
NLU -->|Schedule| O2
NLU -->|Escalate| O3
style CALLER fill:#f1f5f9,stroke:#64748b,color:#0f172a
style NLU fill:#4f46e5,stroke:#4338ca,color:#fff
style O1 fill:#059669,stroke:#047857,color:#fff
style O2 fill:#0ea5e9,stroke:#0369a1,color:#fff
style O3 fill:#f59e0b,stroke:#d97706,color:#1f2937
from dataclasses import dataclass, field
from datetime import date
from enum import Enum
class VaccineType(Enum):
FLU = "influenza"
COVID = "covid_19"
TDAP = "tdap"
MMR = "mmr"
SHINGLES = "shingles"
PNEUMOCOCCAL = "pneumococcal"
HPV = "hpv"
HEPATITIS_B = "hepatitis_b"
@dataclass
class VaccineRule:
vaccine: VaccineType
min_age: int | None = None
max_age: int | None = None
recommended_for: list[str] = field(default_factory=list)
contraindications: list[str] = field(default_factory=list)
dose_schedule: str = ""
requires_prior_dose: bool = False
seasonal: bool = False
VACCINE_SCHEDULE: dict[VaccineType, VaccineRule] = {
VaccineType.FLU: VaccineRule(
vaccine=VaccineType.FLU,
min_age=6, # months, but we simplify to years here
recommended_for=["everyone 6 months and older"],
contraindications=["severe egg allergy (egg-free options available)"],
dose_schedule="Annually, typically September through March",
seasonal=True,
),
VaccineType.SHINGLES: VaccineRule(
vaccine=VaccineType.SHINGLES,
min_age=50,
recommended_for=[
"adults 50 and older",
"adults 19+ with weakened immune systems",
],
dose_schedule="Two doses, 2-6 months apart (Shingrix)",
),
VaccineType.HPV: VaccineRule(
vaccine=VaccineType.HPV,
min_age=9,
max_age=45,
recommended_for=[
"routine: ages 11-12 (can start at 9)",
"catch-up: through age 26",
"shared decision: ages 27-45",
],
dose_schedule="2 doses if started before 15; 3 doses if started at 15+",
),
VaccineType.PNEUMOCOCCAL: VaccineRule(
vaccine=VaccineType.PNEUMOCOCCAL,
min_age=65,
recommended_for=[
"adults 65 and older",
"adults 19-64 with certain medical conditions",
"adults 19-64 who smoke",
],
dose_schedule="PCV20 single dose, or PCV15 followed by PPSV23",
),
}
@dataclass
class PersonProfile:
age: int
conditions: list[str] = field(default_factory=list)
prior_vaccines: dict[str, date] = field(default_factory=dict)
pregnant: bool = False
immunocompromised: bool = False
def check_vaccine_eligibility(
person: PersonProfile,
) -> list[dict]:
"""Check which vaccines a person is eligible for."""
results = []
for vtype, rule in VACCINE_SCHEDULE.items():
eligible = True
reasons = []
# Age check
if rule.min_age and person.age < rule.min_age:
eligible = False
reasons.append(f"Minimum age is {rule.min_age}")
if rule.max_age and person.age > rule.max_age:
eligible = False
reasons.append(f"Maximum age is {rule.max_age}")
# Contraindication check
for contra in rule.contraindications:
if any(c.lower() in contra.lower() for c in person.conditions):
reasons.append(f"Contraindication: {contra}")
# Check if already vaccinated recently
last_dose = person.prior_vaccines.get(vtype.value)
if last_dose and not rule.seasonal:
reasons.append(f"Last dose: {last_dose.isoformat()}")
results.append({
"vaccine": vtype.value,
"eligible": eligible,
"recommended_for": rule.recommended_for,
"reasons": reasons,
"dose_schedule": rule.dose_schedule,
})
return results
Finding the right clinic involves geographic proximity, vaccine availability, appointment slots, and sometimes insurance acceptance. The agent queries a clinic database and returns actionable options.
from dataclasses import dataclass, field
from math import radians, sin, cos, sqrt, atan2
@dataclass
class Clinic:
clinic_id: str
name: str
address: str
latitude: float
longitude: float
phone: str
hours: dict[str, str] # day -> "9:00 AM - 5:00 PM"
vaccines_available: list[VaccineType] = field(default_factory=list)
accepts_walkins: bool = False
accepts_insurance: list[str] = field(default_factory=list)
next_available_slot: str | None = None
def haversine_distance(lat1: float, lon1: float, lat2: float, lon2: float) -> float:
"""Calculate distance between two points in miles."""
R = 3959 # Earth radius in miles
dlat = radians(lat2 - lat1)
dlon = radians(lon2 - lon1)
a = sin(dlat / 2) ** 2 + cos(radians(lat1)) * cos(radians(lat2)) * sin(dlon / 2) ** 2
return R * 2 * atan2(sqrt(a), sqrt(1 - a))
def find_nearby_clinics(
user_lat: float,
user_lon: float,
vaccine_needed: VaccineType | None = None,
max_distance_miles: float = 10.0,
clinics: list[Clinic] = None,
) -> list[dict]:
"""Find clinics near the user, optionally filtered by vaccine availability."""
results = []
for clinic in clinics or []:
distance = haversine_distance(user_lat, user_lon, clinic.latitude, clinic.longitude)
if distance > max_distance_miles:
continue
if vaccine_needed and vaccine_needed not in clinic.vaccines_available:
continue
results.append({
"name": clinic.name,
"address": clinic.address,
"phone": clinic.phone,
"distance_miles": round(distance, 1),
"walk_ins": clinic.accepts_walkins,
"next_appointment": clinic.next_available_slot,
"vaccines": [v.value for v in clinic.vaccines_available],
})
results.sort(key=lambda x: x["distance_miles"])
return results[:10]
During disease outbreaks, the agent becomes a critical communication channel. It must distribute accurate, actionable information without causing panic.
from datetime import datetime
@dataclass
class OutbreakAlert:
alert_id: str
disease: str
severity: str # low, moderate, high, critical
affected_areas: list[str]
case_count: int
date_issued: datetime
summary: str
prevention_steps: list[str]
symptoms_to_watch: list[str]
when_to_seek_care: str
exposure_locations: list[dict] | None = None
ACTIVE_ALERTS: list[OutbreakAlert] = []
def get_relevant_alerts(user_zipcode: str) -> list[dict]:
"""Get outbreak alerts relevant to the user's location."""
relevant = []
for alert in ACTIVE_ALERTS:
if user_zipcode in alert.affected_areas or "all" in alert.affected_areas:
relevant.append({
"disease": alert.disease,
"severity": alert.severity,
"case_count": alert.case_count,
"summary": alert.summary,
"prevention": alert.prevention_steps,
"symptoms": alert.symptoms_to_watch,
"seek_care_when": alert.when_to_seek_care,
"date_issued": alert.date_issued.isoformat(),
})
# Sort critical alerts first
severity_order = {"critical": 0, "high": 1, "moderate": 2, "low": 3}
relevant.sort(key=lambda x: severity_order.get(x["severity"], 4))
return relevant
The public health agent prompt must balance helpfulness with medical accuracy. It provides information from authoritative sources (CDC, state health department) and always directs clinical questions to healthcare providers.
HEALTH_AGENT_PROMPT = """You are a public health information assistant for
the county health department.
You help residents with:
- Vaccine eligibility and scheduling
- Finding nearby clinics
- Understanding outbreak alerts
- Immunization record questions
RULES:
1. Base all vaccine information on CDC recommendations.
2. Never diagnose conditions or recommend treatments.
3. For symptoms: provide general guidance and direct to a healthcare provider.
4. For outbreak alerts: share facts, prevention steps, and when to seek care.
5. Always mention that individual medical decisions should involve a doctor.
6. If someone describes an emergency, direct them to call 911 immediately.
"""
The agent responds to misinformation with factual, evidence-based information from the CDC and peer-reviewed sources. It does not argue or become confrontational. For example, if a user says "vaccines cause autism," the agent responds: "Extensive research involving millions of children has found no link between vaccines and autism. The original study claiming this link was retracted due to serious methodological flaws. I can share links to the CDC's vaccine safety research if you would like to review the evidence." The agent acknowledges the person's concern, provides facts, and offers resources.
Still reading? Stop comparing — try CallSphere live.
See the healthcare AI agent handle a real call — complete, industry-specific, and live in your browser. No signup.
Vaccine recommendations are stored in a versioned configuration that is updated whenever the CDC issues new guidance. The agent's eligibility engine reads from this configuration at runtime, so updates take effect immediately. A public health administrator reviews and approves all changes before they go live. The agent includes a "last updated" timestamp in eligibility responses so users know how current the information is.
Yes. The agent can look up a child's immunization record (with parental consent and identity verification), compare it against the CDC recommended schedule for the child's age, and identify which vaccines are due or overdue. It generates a personalized schedule showing what vaccines are needed at upcoming well-child visits. The agent can also send reminders when the next dose is due, reducing missed vaccinations.
#GovernmentAI #PublicHealth #Vaccination #HealthAlerts #ClinicFinder #AgenticAI #LearnAI #AIEngineering

Written by
Sagar Shankaran· Founder, CallSphere
LinkedInSagar Shankaran is the founder of CallSphere, where he builds production AI voice and chat agents deployed across healthcare, hospitality, real estate, and home services. He writes about agentic AI, LLM engineering, and shipping voice agents that handle real calls in production.
See how AI voice agents work for your industry. Live demo available -- no signup required.
Build an AI agent for municipal parks and recreation departments that handles program catalog search, class registration, facility reservations, and seasonal event information for community members.
Learn how to build an AI agent for court systems that provides case lookup, hearing date information, filing requirements, and attorney resources while maintaining strict accuracy standards for legal information.
Learn how to build an AI agent that handles 311 citizen complaints by classifying request types, routing to the correct city department, tracking status, and automating follow-up communications.
The Biden administration's AI modernization push leads to rapid deployment of AI agents across IRS, VA, SSA, and USPS, transforming public service delivery.
Learn how to build an AI agent for emergency management agencies that distributes disaster alerts, maps shelter locations, coordinates resource information, and provides real-time updates to affected citizens.
Build an AI agent that walks citizens through permit application processes, generates document checklists, calculates fees, and provides real-time status updates on submitted applications.
© 2026 CallSphere Inc. All rights reserved.
Made within San Francisco