Clinic triage and scheduling squad

Route patients between triage, emergency, and scheduler assistants with context-preserving transfers

Overview

Compose multiple assistants into a Squad for safe, specialized healthcare flows: a triage assistant assesses symptoms, an emergency assistant handles urgent cases, and a scheduler books appointments.

Squad Capabilities:

  • Structured triage evaluation and safety gates
  • Emergency detection → immediate handoff
  • Provider matching and scheduling tools
  • Transfers preserve full conversation context

1. Define members

Example squad payload
{
"members": [
{ "assistant": { "name": "Triage", "model": {"provider": "openai", "model": "gpt-4o", "messages": [{"role": "system", "content": "Medical triage assistant. Identify red flags."}] }, "firstMessage": "Hello, how can I help you today?", "firstMessageMode": "assistant-speaks-first" } },
{ "assistant": { "name": "Emergency", "model": {"provider": "openai", "model": "gpt-4o", "messages": [{"role": "system", "content": "Emergency protocol assistant. Keep interaction brief and connect immediately."}] } } },
{ "assistant": { "name": "Scheduler", "model": {"provider": "openai", "model": "gpt-4o", "messages": [{"role": "system", "content": "Clinic scheduler. Offer next available slots, then confirm."}] }, "toolIds": ["BOOK_TOOL_ID", "PROVIDER_LOOKUP_ID"] } }
]
}

2. Configure transfers

  • From Triage → Emergency when red flags detected
  • From Triage → Scheduler for routine care
  • Warm-transfer with a short summary for human escalation

3. Implement

create web call with transient squad
import { VapiClient } from "@vapi-ai/server-sdk";
const vapi = new VapiClient({ token: process.env.VAPI_API_KEY! });
await vapi.calls.create({
transport: { type: "web" },
squad: {
members: [
{
assistant: {
name: "Triage",
model: {
provider: "openai",
model: "gpt-4o",
messages: [{ role: "system", content: "Medical triage assistant. Identify red flags." }],
},
firstMessage: "Hello, how can I help you today?",
firstMessageMode: "assistant-speaks-first",
},
},
{
assistant: {
name: "Emergency",
model: {
provider: "openai",
model: "gpt-4o",
messages: [{ role: "system", content: "Emergency protocol assistant. Keep interaction brief and connect immediately." }],
},
},
},
{
assistant: {
name: "Scheduler",
model: {
provider: "openai",
model: "gpt-4o",
messages: [{ role: "system", content: "Clinic scheduler. Offer next available slots, then confirm." }],
},
},
},
],
},
});
create phone call with transient squad
await vapi.calls.create({
phoneNumberId: "YOUR_PHONE_NUMBER_ID",
customer: { number: "+15551234567" },
squad: { /* same squad as above */ members: [] },
});
create and reuse a squad (optional)
const squad = await vapi.squads.create({
name: "Clinic Triage",
members: [ /* same members as above */ ],
});
await vapi.calls.create({ transport: { type: "web" }, squadId: squad.id });

4. Test

Attach a phone number to the Squad (or start with a Squad when creating a call) and test urgent vs routine scenarios.

Next steps