—— Migration Guide ——

Swap the Telephony. Keep Your Stack.

Whether you use Vapi, Retell, or another AI orchestration layer, the telephony underneath it is the bottleneck: latency, cost, and a vendor pivoting away from phones.

< 1.2s

typical AI response latency

< 1.2s

typical AI response latency

2,000+

companies in production

2,000+

companies in production

5–10

business days for number porting

5–10

business days for number porting

0

changes to your AI layer

0

changes to your AI layer

—— Why Swap ——

The Telephony Layer Is the Bottleneck

Your telephony provider is pivoting to AI

Legacy providers are deprioritizing phone infrastructure to chase AI revenue. The layer underneath your AI is getting less attention, not more.

Your telephony provider is pivoting to AI

Legacy providers are deprioritizing phone infrastructure to chase AI revenue. The layer underneath your AI is getting less attention, not more.

Every network hop adds latency

Audio travels through a carrier, telephony provider, and AI layer. SignalWire is built for real-time media with fewer hops.

Every network hop adds latency

Audio travels through a carrier, telephony provider, and AI layer. SignalWire is built for real-time media with fewer hops.

Markup stacks through the vendor chain

Your provider marks up carrier rates, and the orchestration layer marks up the provider. You pay margins on margins.

Markup stacks through the vendor chain

Your provider marks up carrier rates, and the orchestration layer marks up the provider. You pay margins on margins.

When the call drops, who owns it?

Debugging across telephony and AI orchestration logs at 2am is the hidden cost of a multi-vendor stack.

When the call drops, who owns it?

Debugging across telephony and AI orchestration logs at 2am is the hidden cost of a multi-vendor stack.

Build a Voice AI Agent

Python

TypeScript

Go

Java

Ruby

PHP

Perl

C++

C#

01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22

from signalwire import AgentBase
from signalwire.core.function_result import FunctionResult

class SupportAgent(AgentBase):
    def __init__(self):
        super().__init__(name="Support Agent", route="/support")
        self.prompt_add_section("Instructions",
            body="You are a customer support agent. "
                 "Greet the caller and resolve their issue.")
        self.add_language("English", "en-US", "rime.spore:mistv2")

    @AgentBase.tool(name="check_order")
    def check_order(self, order_id: str):
        """Check the status of a customer order.

        Args:
            order_id: The order ID to look up
        """
        return FunctionResult(f"Order {order_id}: shipped, ETA April 2nd")

agent = SupportAgent()
agent.run()

Python

TypeScript

Go

Java

Ruby

PHP

Perl

C++

C#

01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22

from signalwire import AgentBase
from signalwire.core.function_result import FunctionResult

class SupportAgent(AgentBase):
    def __init__(self):
        super().__init__(name="Support Agent", route="/support")
        self.prompt_add_section("Instructions",
            body="You are a customer support agent. "
                 "Greet the caller and resolve their issue.")
        self.add_language("English", "en-US", "rime.spore:mistv2")

    @AgentBase.tool(name="check_order")
    def check_order(self, order_id: str):
        """Check the status of a customer order.

        Args:
            order_id: The order ID to look up
        """
        return FunctionResult(f"Order {order_id}: shipped, ETA April 2nd")

agent = SupportAgent()
agent.run()

Python

TypeScript

Go

Java

Ruby

PHP

Perl

C++

C#

01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22

from signalwire import AgentBase
from signalwire.core.function_result import FunctionResult

class SupportAgent(AgentBase):
    def __init__(self):
        super().__init__(name="Support Agent", route="/support")
        self.prompt_add_section("Instructions",
            body="You are a customer support agent. "
                 "Greet the caller and resolve their issue.")
        self.add_language("English", "en-US", "rime.spore:mistv2")

    @AgentBase.tool(name="check_order")
    def check_order(self, order_id: str):
        """Check the status of a customer order.

        Args:
            order_id: The order ID to look up
        """
        return FunctionResult(f"Order {order_id}: shipped, ETA April 2nd")

agent = SupportAgent()
agent.run()

What Changes, What Stays

Before: Legacy Telephony

Separate telephony, STT, TTS, and LLM providers, each with its own SDK

Your glue code manages state across all four services

Each vendor adds a separate queue, invoice, and escalation path

Compliance and observability must be rebuilt across every vendor

16 to 23 months before a production call

After: SignalWire Telephony

Telephony, STT, TTS, and LLM in one platform

AI runs inside the media stack, not outside it

800–1200ms typical response latency

One vendor, one invoice, one escalation path

Production calls in four to six weeks

State management is platform-native

—— From Install to Production ——

From Install to Production

Day 1: Install and build your first agent

Install signalwire-agents, define your agent class, add a prompt, and make your first phone call to a working AI agent.

Day 1: Install and build your first agent

Install signalwire-agents, define your agent class, add a prompt, and make your first phone call to a working AI agent.

Weeks 1–2: Connect your business logic

Add tool functions that call your backend: order lookups, appointment scheduling, account verification, and the tools that differentiate your product.

Weeks 1–2: Connect your business logic

Add tool functions that call your backend: order lookups, appointment scheduling, account verification, and the tools that differentiate your product.

Weeks 2–3: Structure conversation flow

Define steps with scoped prompts and scoped tools. Each step handles one phase of the conversation with focused context.

Weeks 2–3: Structure conversation flow

Define steps with scoped prompts and scoped tools. Each step handles one phase of the conversation with focused context.

Weeks 4–6: Go live

Deploy your agent as a standard HTTP microservice. Provision phone numbers, route calls, and move into production.

Weeks 4–6: Go live

Deploy your agent as a standard HTTP microservice. Provision phone numbers, route calls, and move into production.

Weeks 3–4: Test and iterate

Test with real calls. Iterate on prompts and flows. Use the sandbox environment for rapid development cycles.

Weeks 3–4: Test and iterate

Test with real calls. Iterate on prompts and flows. Use the sandbox environment for rapid development cycles.

Try it now

Sigmond Runs on SignalWire

A voice and video AI agent built on the SignalWire SDK, wired to a live knowledge base, able to see what you show him. Build the same thing on voice, phone, WhatsApp, or SIP, or an entire white-label platform with SignalWire as the network underneath.

Sigmond

Trusted by 2,000+ Companies

Swap the telephony layer. Keep everything else.

Provision SignalWire numbers and configure SIP trunking. Your AI agents keep running without changes.

Swap the telephony layer. Keep everything else.

Provision SignalWire numbers and configure SIP trunking. Your AI agents keep running without changes.

Swap the telephony layer. Keep everything else.

Provision SignalWire numbers and configure SIP trunking. Your AI agents keep running without changes.

Swap the telephony layer. Keep everything else.

Provision SignalWire numbers and configure SIP trunking. Your AI agents keep running without changes.