SignalWire AI Receptionist
A no-code path to a voice AI agent. Lives in the SignalWire portal under Resources → AI Agent. Generates SWML under the hood, then exposes the agent for assignment to a phone number or selection inside a Call Flow Builder AI Agent node.
Use the portal AI Agent when:
- You want to ship without a backend.
- The agent's tools fit DataMap (no custom auth flows).
- Non-technical team members will edit prompts.
Use the Python Agents SDK when:
- Tools need custom auth, mutation, or branching logic.
- You want git-versioned prompts.
- You're integrating with a wider Python codebase.
Creating an AI Agent Resource
- Dashboard → Resources → + Add New → AI Agent → Custom AI Agent.
- Name the agent (this becomes the dropdown label everywhere the agent is referenced).
- Configure the four pillars: prompt, voice/language, tools, post-call settings.
- Save and fund the project (AI agents are billed per minute of conversation).
The four configuration pillars
1. Prompt
The persona block. Markdown formatting is recommended — LLMs follow structure better than prose.
## Role
You are a friendly receptionist for Acme Plumbing.
## Goals
- Greet the caller warmly.
- Identify whether they need a quote, a repair, or to follow up on existing work.
- Capture name, address, and a callback number.
- Offer the next-available appointment slot.
## Guidelines
- Be concise — 2 sentences max per turn.
- Never quote prices over the phone.
- If you cannot help, transfer to a human at extension 100.
2. Voice and language
- Language — primary ISO code (e.g.,
en-US). - Voice — pick a TTS voice from the SignalWire catalog (Rime, ElevenLabs, Deepgram, Cartesia, etc.).
- Additional languages — optional list, each with its own voice.
Rime voices (e.g., rime.spore, rime.luna) are the default for fast TTS. Premium voices (ElevenLabs, Cartesia) are billed at a premium TTS rate.
3. SWAIG tools
Tools are defined in the AI Agent UI. Each tool can be:
| Tool type | Configure in UI |
|---|---|
| DataMap (HTTP API, no server) | URL, method, headers, body template, response template |
| External webhook | URL — your server returns the SWAIG response |
| Native (built-in platform) | Toggle from the list (e.g., check_time) |
For each tool: name, description (AI uses this to decide when to call), parameters (JSON schema), optional fillers ("One moment...").
4. Post-call settings
- Post prompt — instruction text to coerce structured JSON from the conversation.
- Post prompt URL — webhook to receive the structured payload + transcript + metadata.
- Recording — toggle to enable background recording of every call.
Example post prompt:
Analyze the call. Return ONLY valid JSON, no prose:
{
"caller_intent": "string",
"appointment_booked": boolean,
"callback_required": boolean,
"address": "string or null",
"summary": "2 sentence summary"
}
Assigning the agent to a phone number
Two ways:
As the direct call handler
- Phone Numbers in the Dashboard.
- Select the DID → edit Call Handler.
- Set handler to AI Agent → pick your agent from the dropdown.
- Save. Inbound calls now go straight to the AI receptionist.
Inside a Call Flow Builder flow
- Open a Call Flow in CFB.
- Drop an AI Agent node onto the canvas.
- In the node settings, pick the agent from the dropdown.
- Wire it after Handle Call (and optionally Answer Call, Start Recording).
- Deploy the flow.
- Assign the flow to the DID (Call Handler → Call Flow).
Use the CFB path when you need branching logic before or after the AI section — for example, an after-hours check that routes to voicemail outside business hours and to the AI during open hours.
Variables available inside prompts
| Variable | Notes |
|---|---|
| ${call.from} | Caller's number |
| ${call.to} | Number dialed |
| ${global_data.key} | Session-wide data (set via SWAIG update_global_data) |
Reference them inside the prompt or tool response templates:
You are speaking with the caller from ${call.from}.
Billing model
AI Agents are billed per minute of conversation, on top of standard call-leg charges. Premium TTS voices add per-character charges. Check the SignalWire pricing page for current rates. Funding the project before assigning the agent to a number is mandatory — calls won't connect if the balance can't cover the per-minute charge.
Comparison to the Python SDK
| Capability | Portal AI Agent | Python SDK |
|---|---|---|
| Persona/prompt config | UI form | set_prompt_text / prompt_add_section |
| Tools | UI form (DataMap or webhook) | @tool decorator |
| Multi-step contexts | Limited | Full ContextBuilder |
| Skills / prefabs | Not available | add_skill, prefabs |
| MCP federation | Not available | MCP Gateway |
| Git-versioned prompts | Manual export | Native |
| Multi-instance deploys | One per number | AgentServer mounts many on one process |
For complex agents, build in Python and assign the resulting endpoint as a SWML script (see Python Agents SDK).
Anti-patterns
- Writing prompts as one long paragraph — split into sections.
- Defining 15+ tools in the UI — at that complexity, switch to the Python SDK.
- Skipping the post-call settings — you lose the structured-data layer that makes calls useful as data.
- Forgetting to fund the project — agent fails to answer with no clear error.
- Using a premium TTS voice for a 24/7 receptionist — premium voice costs add up fast. Save them for outbound campaigns where the brand justifies the spend.