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
1{
2 "members": [
3 { "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" } },
4 { "assistant": { "name": "Emergency", "model": {"provider": "openai", "model": "gpt-4o", "messages": [{"role": "system", "content": "Emergency protocol assistant. Keep interaction brief and connect immediately."}] } } },
5 { "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"] } }
6 ]
7}

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

See: Silent transfers.

3. Implement

create web call with transient squad
1import { VapiClient } from "@vapi-ai/server-sdk";
2
3const vapi = new VapiClient({ token: process.env.VAPI_API_KEY! });
4
5await vapi.calls.create({
6 transport: { type: "web" },
7 squad: {
8 members: [
9 {
10 assistant: {
11 name: "Triage",
12 model: {
13 provider: "openai",
14 model: "gpt-4o",
15 messages: [{ role: "system", content: "Medical triage assistant. Identify red flags." }],
16 },
17 firstMessage: "Hello, how can I help you today?",
18 firstMessageMode: "assistant-speaks-first",
19 },
20 },
21 {
22 assistant: {
23 name: "Emergency",
24 model: {
25 provider: "openai",
26 model: "gpt-4o",
27 messages: [{ role: "system", content: "Emergency protocol assistant. Keep interaction brief and connect immediately." }],
28 },
29 },
30 },
31 {
32 assistant: {
33 name: "Scheduler",
34 model: {
35 provider: "openai",
36 model: "gpt-4o",
37 messages: [{ role: "system", content: "Clinic scheduler. Offer next available slots, then confirm." }],
38 },
39 },
40 },
41 ],
42 },
43});
create phone call with transient squad
1await vapi.calls.create({
2 phoneNumberId: "YOUR_PHONE_NUMBER_ID",
3 customer: { number: "+15551234567" },
4 squad: { /* same squad as above */ members: [] },
5});
create and reuse a squad (optional)
1const squad = await vapi.squads.create({
2 name: "Clinic Triage",
3 members: [ /* same members as above */ ],
4});
5
6await 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