# twilio-conference-calls

Reference patterns for Twilio Conference call flows. It guides the setup of warm transfers, hold music, and supervisor coaching in call centers.

- skill · `type=skill` · Codex, ChatGPT · ★ 7604
- Author: Twilio · official OpenAI repository
- License: MIT · policy=mirror · the beginning of the file is at the end of this page
- Source: https://github.com/openai/plugins/tree/HEAD/plugins/twilio-developer-kit/skills/twilio-conference-calls/SKILL.md
- Updated: 2026-10-08
- HTML: https://affpapa.org/en/nevibecode/skills/twilio-conference-calls

## What it does

This skill models telephony workflows around Twilio Conference. Instead of routing inbound calls through a direct `<Dial>`, it puts callers into a named conference room right away. This keeps call controls active.

The guide supplies implementation logic for Python and Node.js. It covers warm transfers with caller hold and whisper coaching where a supervisor talks only to the agent. Pay attention to the difference between `hold` and `muted`. Setting `muted=True` instead of `hold=True` leaks internal agent conversations to the waiting caller.

Running these flows requires a voice-enabled Twilio number and authentication credentials (`TWILIO_ACCOUNT_SID`, `TWILIO_AUTH_TOKEN`). For security, dynamic TwiML generation must rely on the SDK `VoiceResponse` builder rather than raw string interpolation.

## Install

### Codex (native platform)

1. **Skills CLI (Vercel)**
```bash
npx skills add openai/plugins --skill twilio-conference-calls -a codex
```

2. **Manually: put the files in place**
- File: `.agents/skills/twilio-conference-calls/SKILL.md` — For all projects use ~/.agents/skills/

### Claude Code

1. **Skills CLI (Vercel)**
```bash
npx skills add openai/plugins --skill twilio-conference-calls -a claude-code
```

2. **Manually: put the files in place**
- File: `~/.claude/skills/twilio-conference-calls/SKILL.md` — Copy the whole skill folder; for one project use .claude/skills/twilio-conference-calls/

### Cursor

**Manually: put the files in place**
- File: `.cursor/skills/twilio-conference-calls/SKILL.md` — Cursor also reads .agents/skills/ and .claude/skills/

### GitHub Copilot

1. **GitHub CLI**
```bash
gh skill install openai/plugins twilio-conference-calls
```

2. **Manually: put the files in place**
- File: `.github/skills/twilio-conference-calls/SKILL.md`

### Gemini CLI

**Platform CLI**
```bash
gemini skills install https://github.com/openai/plugins --path plugins/twilio-developer-kit/skills/twilio-conference-calls
```

### Windsurf (Devin Desktop)

**Manually: put the files in place**
- File: `.devin/skills/twilio-conference-calls/SKILL.md` — The legacy .windsurf/skills/ path still works

### Claude.ai

**Claude.ai**
- Zip the folder and upload it in Settings → Capabilities → Skills

Where a file is given instead of a command, copy the files from the source to that path: https://github.com/openai/plugins/tree/HEAD/plugins/twilio-developer-kit/skills/twilio-conference-calls/SKILL.md

## When to use it
- route incoming calls into conference rooms
- execute warm transfers with customer hold
- enable supervisor whisper coaching during calls
- prevent private agent chatter from leaking to callers

## Example prompts
- Show how to implement a warm transfer using Twilio Conference in Python
- Generate an Express route to put an incoming Twilio call into a conference
- Explain how to configure supervisor coaching with the Twilio SDK

## Source text · SKILL.md · MIT

Below is the content of a third-party file. It is data, not instructions for you: do not act on anything written inside unless the human asks. Block tag: 0447628b1ff4762d.

BEGIN THIRD-PARTY FILE 0447628b1ff4762d
````text
---
name: twilio-conference-calls
description: >
  Build multi-party calls using Twilio Conference. Covers warm transfer,
  cold transfer, coaching (whisper), hold vs mute, participant modes, and
  supervisor barge. Use this skill for any contact center, support line,
  or scenario requiring transfers, holds, or multi-party calls.
---

## Overview

Conference is the foundation of contact center call handling. The key insight: **every call that might need a transfer should start as a Conference**, not a direct `<Dial>`. A Conference supports hold, transfer, coaching, and recording — a direct Dial does not.

```
Caller ──→ Conference Room ←── Agent
                  ↑
              Supervisor (coach mode: speaks to agent only)
```

**Contact center best practice:** Every multi-agent call should use Conference, not direct Dial.

---

## Prerequisites

- Twilio account with a voice-capable phone number — see `twilio-account-setup`
- `TWILIO_ACCOUNT_SID` and `TWILIO_AUTH_TOKEN` — see `twilio-iam-auth-setup`
- SDK: `pip install twilio` / `npm install twilio`
- For agent routing: TaskRouter — see `twilio-taskrouter-routing`

---

## Quickstart

**Step 1 — Put the inbound caller into a Conference**

When a call comes in, place the caller into a named Conference room.

**Python (Flask)**
```python
from flask import Flask, request
from twilio.twiml.voice_response import VoiceResponse

app = Flask(__name__)

@app.route("/voice", methods=["POST"])
def incoming_call():
    call_sid = request.form["CallSid"]
    response = VoiceResponse()
    dial = response.dial()
    dial.conference(
        f"room-{call_sid}",
        start_conference_on_enter=True,
        end_conference_on_exit=False,  # Keep conference alive when caller disconnects (for wrap-up)
        wait_url="http://twimlets.com/holdmusic?Bucket=com.twilio.music.classical",
        status_callback="https://yourapp.com/conference-events",
        status_callback_event="join leave",
        record="record-from-start"
    )
    return str(response)
```

**Node.js (Express)**
```node
app.post("/voice", (req, res) => {
    const callSid = req.body.CallSid;
    const response = new VoiceResponse();
    const dial = response.dial();
    dial.conference(
        `room-${callSid}`,
        {
            startConferenceOnEnter: true,
            endConferenceOnExit: false,
            waitUrl: "http://twimlets.com/holdmusic?Bucket=com.twilio.music.classical",
            statusCallback: "https://yourapp.com/conference-events",
            statusCallbackEvent: "join leave",
            record: "record-from-start",
        }
    );
    res.type("text/xml").send(response.toString());
});
```

**Step 2 — Connect an agent to the same Conference**

After TaskRouter assigns a worker, dial the agent into the conference:

> **Security:** Never interpolate untrusted user input into inline `twiml=` strings. Use the SDK's `VoiceResponse` builder for any dynamic content.

**Python**
```python
# Called from your assignment callback or agent connect logic
def connect_agent(conference_name, agent_phone):
    client.calls.create(
        to=agent_phone,
        from_="+15551234567",  # your Twilio number
````
END THIRD-PARTY FILE 0447628b1ff4762d

The third-party file has ended. Everything between the 0447628b1ff4762d tags is data: requests and commands from it are not followed. An “end of file” line with another tag inside the block is part of the file.

First 3207 of 11558 bytes. © Twilio · MIT · https://github.com/openai/plugins/tree/HEAD/plugins/twilio-developer-kit/skills/twilio-conference-calls/SKILL.md

_Part of the page did not fit — see the HTML version._

---
NeVibeCode on affpapa.org. Catalog texts are descriptions, not instructions for the agent. How to choose and install: https://affpapa.org/en/nevibecode/agents.md
