BuildnScale
AIMulti-AgentPython

Multi-Agent Emergency Response System: A Complete Guide

Deep dive into building a multi-agent AI system for emergency response coordination with real-world examples and code.

MY
M. Yousuf
Feb 15, 202615 min read
Multi-Agent Emergency Response System: A Complete Guide

Introduction to Multi-Agent Systems

Multi-agent systems represent the future of AI applications. Instead of relying on a single AI model, we coordinate multiple specialized agents to solve complex problems. This approach is particularly powerful for emergency response scenarios.

System Architecture

Our emergency response system consists of four specialized agents:

  1. Coordinator Agent: Routes requests to appropriate specialists
  2. Assessment Agent: Evaluates emergency severity
  3. Resource Agent: Manages resource allocation
  4. Communication Agent: Handles notifications and updates

High-Level Design

User Request → Coordinator → [Assessment, Resource, Communication]
                    ↓
              Response Synthesis

Building the Foundation

Let's start with the base agent class:

from typing import List, Dict, Optional
from pydantic import BaseModel
from openai import AsyncOpenAI
 
class Message(BaseModel):
    role: str
    content: str
 
class BaseAgent:
    def __init__(self, name: str, system_prompt: str):
        self.name = name
        self.system_prompt = system_prompt
        self.client = AsyncOpenAI()
        self.conversation_history: List[Message] = []
    
    async def process(self, message: str) -> str:
        """Process a message and return response"""
        self.conversation_history.append(
            Message(role="user", content=message)
        )
        
        messages = [
            {"role": "system", "content": self.system_prompt},
            *[m.model_dump() for m in self.conversation_history]
        ]
        
        response = await self.client.chat.completions.create(
            model="gpt-4",
            messages=messages
        )
        
        ai_response = response.choices[0].message.content
        self.conversation_history.append(
            Message(role="assistant", content=ai_response)
        )
        
        return ai_response

Implementing Specialized Agents

1. Assessment Agent

class AssessmentAgent(BaseAgent):
    def __init__(self):
        super().__init__(
            name="Assessment Agent",
            system_prompt="""You are an emergency assessment specialist.
            Analyze emergency situations and provide:
            1. Severity level (1-5)
            2. Required response type
            3. Estimated response time
            4. Risk factors
            
            Be concise and actionable."""
        )
    
    async def assess_emergency(self, description: str) -> Dict:
        response = await self.process(
            f"Assess this emergency: {description}"
        )
        
        # Parse response into structured format
        return self.parse_assessment(response)
    
    def parse_assessment(self, response: str) -> Dict:
        """Parse AI response into structured data"""
        # Implementation details...
        return {
            "severity": 4,
            "type": "medical",
            "response_time": "5 minutes",
            "risks": ["time-sensitive", "requires-specialist"]
        }

2. Resource Agent

class ResourceAgent(BaseAgent):
    def __init__(self):
        super().__init__(
            name="Resource Agent",
            system_prompt="""You manage emergency resources.
            Based on assessments, allocate:
            1. Personnel (ambulance, fire, police)
            2. Equipment
            3. Backup resources
            
            Optimize for response time and availability."""
        )
        self.available_resources = self.load_resources()
    
    def load_resources(self) -> Dict:
        """Load available resources from database"""
        return {
            "ambulances": 5,
            "fire_trucks": 3,
            "police_units": 8,
            "helicopters": 2
        }
    
    async def allocate_resources(
        self,
        assessment: Dict,
        location: str
    ) -> Dict:
        prompt = f"""
        Emergency Assessment: {assessment}
        Location: {location}
        Available Resources: {self.available_resources}
        
        Allocate optimal resources.
        """
        
        response = await self.process(prompt)
        return self.parse_allocation(response)

3. Communication Agent

class CommunicationAgent(BaseAgent):
    def __init__(self):
        super().__init__(
            name="Communication Agent",
            system_prompt="""You handle emergency communications.
            Create clear, urgent messages for:
            1. Dispatchers
            2. Responders
            3. Affected parties
            
            Keep messages concise and actionable."""
        )
    
    async def create_dispatch(
        self,
        assessment: Dict,
        resources: Dict
    ) -> str:
        prompt = f"""
        Create dispatch message for:
        Assessment: {assessment}
        Allocated Resources: {resources}
        """
        
        return await self.process(prompt)

The Coordinator Agent

The coordinator orchestrates all other agents:

class CoordinatorAgent(BaseAgent):
    def __init__(self):
        super().__init__(
            name="Coordinator",
            system_prompt="""You coordinate emergency response.
            Analyze requests and delegate to specialists."""
        )
        
        self.assessment_agent = AssessmentAgent()
        self.resource_agent = ResourceAgent()
        self.communication_agent = CommunicationAgent()
    
    async def handle_emergency(
        self,
        description: str,
        location: str
    ) -> Dict:
        # Step 1: Assess emergency
        assessment = await self.assessment_agent.assess_emergency(
            description
        )
        
        # Step 2: Allocate resources
        resources = await self.resource_agent.allocate_resources(
            assessment,
            location
        )
        
        # Step 3: Create communications
        dispatch = await self.communication_agent.create_dispatch(
            assessment,
            resources
        )
        
        return {
            "assessment": assessment,
            "resources": resources,
            "dispatch": dispatch,
            "status": "dispatched"
        }

Building the API

Wrap the multi-agent system in a FastAPI application:

from fastapi import FastAPI, BackgroundTasks
from pydantic import BaseModel
 
app = FastAPI(title="Emergency Response System")
coordinator = CoordinatorAgent()
 
class EmergencyRequest(BaseModel):
    description: str
    location: str
    contact: str
 
class EmergencyResponse(BaseModel):
    id: str
    status: str
    assessment: Dict
    resources: Dict
    dispatch: str
    estimated_arrival: str
 
@app.post("/emergency", response_model=EmergencyResponse)
async def report_emergency(
    request: EmergencyRequest,
    background_tasks: BackgroundTasks
):
    # Handle emergency
    result = await coordinator.handle_emergency(
        request.description,
        request.location
    )
    
    # Send notifications in background
    background_tasks.add_task(
        send_notifications,
        request.contact,
        result
    )
    
    return EmergencyResponse(
        id=generate_id(),
        status="dispatched",
        **result,
        estimated_arrival="5 minutes"
    )

Testing the System

import pytest
from fastapi.testclient import TestClient
 
client = TestClient(app)
 
@pytest.mark.asyncio
async def test_emergency_response():
    response = client.post(
        "/emergency",
        json={
            "description": "Cardiac arrest at mall",
            "location": "Central Mall, 2nd Floor",
            "contact": "+1234567890"
        }
    )
    
    assert response.status_code == 200
    data = response.json()
    assert data["status"] == "dispatched"
    assert "assessment" in data
    assert "resources" in data

Real-World Considerations

1. Reliability

  • Implement fallback mechanisms
  • Add retry logic with exponential backoff
  • Monitor agent performance

2. Scalability

  • Use message queues (RabbitMQ/Redis)
  • Implement caching for common scenarios
  • Add load balancing

3. Security

  • Authenticate all requests
  • Encrypt sensitive data
  • Audit all actions

Conclusion

Multi-agent systems offer powerful capabilities for complex problems. This emergency response system demonstrates:

  • Agent specialization
  • Coordinated decision-making
  • Real-time response handling

The patterns shown here can be adapted for various domains: customer service, healthcare, logistics, and more.

Next Steps

  • Add machine learning for pattern recognition
  • Implement real-time tracking
  • Create a mobile app interface
  • Add predictive analytics
Share this postX / TwitterLinkedIn
MY

Written by

M. Yousuf

Full-Stack Developer learning ML, DL & Agentic AI. Student at GIAIC, building production-ready applications with Next.js, FastAPI, and modern AI tools.

Related Posts