{"slug":"signalwire-ai-receptionist","title":"SignalWire AI Receptionist — No-Code Voice Agent in the Portal","tags":["signalwire","ai-receptionist","no-code","voice-ai","ai-agent-resource"],"agent_summary":"Build a voice AI receptionist inside the SignalWire portal without writing code. Covers AI Agent Resource setup, prompt configuration, SWAIG tool definitions in the UI, voice/language picker, assigning to a phone number or as a Call Flow Builder node, and billing model.","trigger_phrases":["AI receptionist SignalWire","no-code voice AI","AI Agent Resource setup","AI receptionist prompt","assign AI agent to phone number","AI agent billing per minute"],"runnable":false,"markdown":"\n# SignalWire AI Receptionist\n\nA 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](/topic/signalwire-call-flow-builder) AI Agent node.\n\nUse the portal AI Agent when:\n\n- You want to ship without a backend.\n- The agent's tools fit DataMap (no custom auth flows).\n- Non-technical team members will edit prompts.\n\nUse the [Python Agents SDK](/topic/signalwire-python-agents-sdk) when:\n\n- Tools need custom auth, mutation, or branching logic.\n- You want git-versioned prompts.\n- You're integrating with a wider Python codebase.\n\n## Creating an AI Agent Resource\n\n1. Dashboard → **Resources** → **+ Add New** → **AI Agent** → **Custom AI Agent**.\n2. Name the agent (this becomes the dropdown label everywhere the agent is referenced).\n3. Configure the four pillars: prompt, voice/language, tools, post-call settings.\n4. Save and fund the project (AI agents are billed per minute of conversation).\n\n## The four configuration pillars\n\n### 1. Prompt\n\nThe persona block. Markdown formatting is recommended — LLMs follow structure better than prose.\n\n```markdown\n## Role\nYou are a friendly receptionist for Acme Plumbing.\n\n## Goals\n- Greet the caller warmly.\n- Identify whether they need a quote, a repair, or to follow up on existing work.\n- Capture name, address, and a callback number.\n- Offer the next-available appointment slot.\n\n## Guidelines\n- Be concise — 2 sentences max per turn.\n- Never quote prices over the phone.\n- If you cannot help, transfer to a human at extension 100.\n```\n\n### 2. Voice and language\n\n- **Language** — primary ISO code (e.g., `en-US`).\n- **Voice** — pick a TTS voice from the SignalWire catalog (Rime, ElevenLabs, Deepgram, Cartesia, etc.).\n- **Additional languages** — optional list, each with its own voice.\n\nRime voices (e.g., `rime.spore`, `rime.luna`) are the default for fast TTS. Premium voices (ElevenLabs, Cartesia) are billed at a premium TTS rate.\n\n### 3. SWAIG tools\n\nTools are defined in the AI Agent UI. Each tool can be:\n\n| Tool type | Configure in UI |\n|---|---|\n| **DataMap** (HTTP API, no server) | URL, method, headers, body template, response template |\n| **External webhook** | URL — your server returns the SWAIG response |\n| **Native** (built-in platform) | Toggle from the list (e.g., `check_time`) |\n\nFor each tool: name, description (AI uses this to decide when to call), parameters (JSON schema), optional fillers (`\"One moment...\"`).\n\n### 4. Post-call settings\n\n- **Post prompt** — instruction text to coerce structured JSON from the conversation.\n- **Post prompt URL** — webhook to receive the structured payload + transcript + metadata.\n- **Recording** — toggle to enable background recording of every call.\n\nExample post prompt:\n\n```text\nAnalyze the call. Return ONLY valid JSON, no prose:\n{\n  \"caller_intent\": \"string\",\n  \"appointment_booked\": boolean,\n  \"callback_required\": boolean,\n  \"address\": \"string or null\",\n  \"summary\": \"2 sentence summary\"\n}\n```\n\n## Assigning the agent to a phone number\n\nTwo ways:\n\n### As the direct call handler\n\n1. **Phone Numbers** in the Dashboard.\n2. Select the DID → edit **Call Handler**.\n3. Set handler to **AI Agent** → pick your agent from the dropdown.\n4. Save. Inbound calls now go straight to the AI receptionist.\n\n### Inside a Call Flow Builder flow\n\n1. Open a Call Flow in CFB.\n2. Drop an **AI Agent** node onto the canvas.\n3. In the node settings, pick the agent from the dropdown.\n4. Wire it after Handle Call (and optionally Answer Call, Start Recording).\n5. Deploy the flow.\n6. Assign the flow to the DID (Call Handler → Call Flow).\n\nUse 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.\n\n## Variables available inside prompts\n\n| Variable | Notes |\n|---|---|\n| `${call.from}` | Caller's number |\n| `${call.to}` | Number dialed |\n| `${global_data.key}` | Session-wide data (set via SWAIG `update_global_data`) |\n\nReference them inside the prompt or tool response templates:\n\n```text\nYou are speaking with the caller from ${call.from}.\n```\n\n## Billing model\n\nAI 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.\n\n## Comparison to the Python SDK\n\n| Capability | Portal AI Agent | Python SDK |\n|---|---|---|\n| Persona/prompt config | UI form | `set_prompt_text` / `prompt_add_section` |\n| Tools | UI form (DataMap or webhook) | `@tool` decorator |\n| Multi-step contexts | Limited | Full [ContextBuilder](/topic/agents-context-builder) |\n| Skills / prefabs | Not available | [add_skill, prefabs](/topic/agents-skills-system) |\n| MCP federation | Not available | [MCP Gateway](/topic/agents-mcp-gateway) |\n| Git-versioned prompts | Manual export | Native |\n| Multi-instance deploys | One per number | `AgentServer` mounts many on one process |\n\nFor complex agents, build in Python and assign the resulting endpoint as a SWML script (see [Python Agents SDK](/topic/signalwire-python-agents-sdk)).\n\n## Anti-patterns\n\n- Writing prompts as one long paragraph — split into sections.\n- Defining 15+ tools in the UI — at that complexity, switch to the Python SDK.\n- Skipping the post-call settings — you lose the structured-data layer that makes calls useful as data.\n- Forgetting to fund the project — agent fails to answer with no clear error.\n- 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.\n\n## See also\n\n- [SWML AI verb](/topic/swml-ai-verb)\n- [SWAIG functions](/topic/swaig-functions)\n- [Call Flow Builder](/topic/signalwire-call-flow-builder)\n- [Python Agents SDK](/topic/signalwire-python-agents-sdk)\n- [Call Intelligence pipeline](/topic/signalwire-call-intelligence)\n","html":"<h1>SignalWire AI Receptionist</h1>\n<p>A no-code path to a voice AI agent. Lives in the SignalWire portal under <strong>Resources → AI Agent</strong>. Generates SWML under the hood, then exposes the agent for assignment to a phone number or selection inside a <a href=\"/topic/signalwire-call-flow-builder\">Call Flow Builder</a> AI Agent node.</p>\n<p>Use the portal AI Agent when:</p>\n<ul>\n<li>You want to ship without a backend.</li>\n<li>The agent's tools fit DataMap (no custom auth flows).</li>\n<li>Non-technical team members will edit prompts.</li>\n</ul>\n<p>Use the <a href=\"/topic/signalwire-python-agents-sdk\">Python Agents SDK</a> when:</p>\n<ul>\n<li>Tools need custom auth, mutation, or branching logic.</li>\n<li>You want git-versioned prompts.</li>\n<li>You're integrating with a wider Python codebase.</li>\n</ul>\n<h2>Creating an AI Agent Resource</h2>\n<ol>\n<li>Dashboard → <strong>Resources</strong> → <strong>+ Add New</strong> → <strong>AI Agent</strong> → <strong>Custom AI Agent</strong>.</li>\n<li>Name the agent (this becomes the dropdown label everywhere the agent is referenced).</li>\n<li>Configure the four pillars: prompt, voice/language, tools, post-call settings.</li>\n<li>Save and fund the project (AI agents are billed per minute of conversation).</li>\n</ol>\n<h2>The four configuration pillars</h2>\n<h3>1. Prompt</h3>\n<p>The persona block. Markdown formatting is recommended — LLMs follow structure better than prose.</p>\n<pre><code class=\"language-markdown\">## Role\nYou are a friendly receptionist for Acme Plumbing.\n\n## Goals\n- Greet the caller warmly.\n- Identify whether they need a quote, a repair, or to follow up on existing work.\n- Capture name, address, and a callback number.\n- Offer the next-available appointment slot.\n\n## Guidelines\n- Be concise — 2 sentences max per turn.\n- Never quote prices over the phone.\n- If you cannot help, transfer to a human at extension 100.\n</code></pre>\n<h3>2. Voice and language</h3>\n<ul>\n<li><strong>Language</strong> — primary ISO code (e.g., <code>en-US</code>).</li>\n<li><strong>Voice</strong> — pick a TTS voice from the SignalWire catalog (Rime, ElevenLabs, Deepgram, Cartesia, etc.).</li>\n<li><strong>Additional languages</strong> — optional list, each with its own voice.</li>\n</ul>\n<p>Rime voices (e.g., <code>rime.spore</code>, <code>rime.luna</code>) are the default for fast TTS. Premium voices (ElevenLabs, Cartesia) are billed at a premium TTS rate.</p>\n<h3>3. SWAIG tools</h3>\n<p>Tools are defined in the AI Agent UI. Each tool can be:</p>\n<p>| Tool type | Configure in UI |\n|---|---|\n| <strong>DataMap</strong> (HTTP API, no server) | URL, method, headers, body template, response template |\n| <strong>External webhook</strong> | URL — your server returns the SWAIG response |\n| <strong>Native</strong> (built-in platform) | Toggle from the list (e.g., <code>check_time</code>) |</p>\n<p>For each tool: name, description (AI uses this to decide when to call), parameters (JSON schema), optional fillers (<code>\"One moment...\"</code>).</p>\n<h3>4. Post-call settings</h3>\n<ul>\n<li><strong>Post prompt</strong> — instruction text to coerce structured JSON from the conversation.</li>\n<li><strong>Post prompt URL</strong> — webhook to receive the structured payload + transcript + metadata.</li>\n<li><strong>Recording</strong> — toggle to enable background recording of every call.</li>\n</ul>\n<p>Example post prompt:</p>\n<pre><code class=\"language-text\">Analyze the call. Return ONLY valid JSON, no prose:\n{\n  \"caller_intent\": \"string\",\n  \"appointment_booked\": boolean,\n  \"callback_required\": boolean,\n  \"address\": \"string or null\",\n  \"summary\": \"2 sentence summary\"\n}\n</code></pre>\n<h2>Assigning the agent to a phone number</h2>\n<p>Two ways:</p>\n<h3>As the direct call handler</h3>\n<ol>\n<li><strong>Phone Numbers</strong> in the Dashboard.</li>\n<li>Select the DID → edit <strong>Call Handler</strong>.</li>\n<li>Set handler to <strong>AI Agent</strong> → pick your agent from the dropdown.</li>\n<li>Save. Inbound calls now go straight to the AI receptionist.</li>\n</ol>\n<h3>Inside a Call Flow Builder flow</h3>\n<ol>\n<li>Open a Call Flow in CFB.</li>\n<li>Drop an <strong>AI Agent</strong> node onto the canvas.</li>\n<li>In the node settings, pick the agent from the dropdown.</li>\n<li>Wire it after Handle Call (and optionally Answer Call, Start Recording).</li>\n<li>Deploy the flow.</li>\n<li>Assign the flow to the DID (Call Handler → Call Flow).</li>\n</ol>\n<p>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.</p>\n<h2>Variables available inside prompts</h2>\n<p>| Variable | Notes |\n|---|---|\n| <code>${call.from}</code> | Caller's number |\n| <code>${call.to}</code> | Number dialed |\n| <code>${global_data.key}</code> | Session-wide data (set via SWAIG <code>update_global_data</code>) |</p>\n<p>Reference them inside the prompt or tool response templates:</p>\n<pre><code class=\"language-text\">You are speaking with the caller from ${call.from}.\n</code></pre>\n<h2>Billing model</h2>\n<p>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.</p>\n<h2>Comparison to the Python SDK</h2>\n<p>| Capability | Portal AI Agent | Python SDK |\n|---|---|---|\n| Persona/prompt config | UI form | <code>set_prompt_text</code> / <code>prompt_add_section</code> |\n| Tools | UI form (DataMap or webhook) | <code>@tool</code> decorator |\n| Multi-step contexts | Limited | Full <a href=\"/topic/agents-context-builder\">ContextBuilder</a> |\n| Skills / prefabs | Not available | <a href=\"/topic/agents-skills-system\">add_skill, prefabs</a> |\n| MCP federation | Not available | <a href=\"/topic/agents-mcp-gateway\">MCP Gateway</a> |\n| Git-versioned prompts | Manual export | Native |\n| Multi-instance deploys | One per number | <code>AgentServer</code> mounts many on one process |</p>\n<p>For complex agents, build in Python and assign the resulting endpoint as a SWML script (see <a href=\"/topic/signalwire-python-agents-sdk\">Python Agents SDK</a>).</p>\n<h2>Anti-patterns</h2>\n<ul>\n<li>Writing prompts as one long paragraph — split into sections.</li>\n<li>Defining 15+ tools in the UI — at that complexity, switch to the Python SDK.</li>\n<li>Skipping the post-call settings — you lose the structured-data layer that makes calls useful as data.</li>\n<li>Forgetting to fund the project — agent fails to answer with no clear error.</li>\n<li>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.</li>\n</ul>\n<h2>See also</h2>\n<ul>\n<li><a href=\"/topic/swml-ai-verb\">SWML AI verb</a></li>\n<li><a href=\"/topic/swaig-functions\">SWAIG functions</a></li>\n<li><a href=\"/topic/signalwire-call-flow-builder\">Call Flow Builder</a></li>\n<li><a href=\"/topic/signalwire-python-agents-sdk\">Python Agents SDK</a></li>\n<li><a href=\"/topic/signalwire-call-intelligence\">Call Intelligence pipeline</a></li>\n</ul>\n"}