—— Architecture ——

Voice AI Fails When State Splits

External state management is the single biggest source of production failures in voice AI. The fix is not better code. It is a different architecture.

< 1.2s

typical AI response latency

< 1.2s

typical AI response latency

1

platform for the full AI pipeline

1

platform for the full AI pipeline

2,000+

companies in production

2,000+

companies in production

2.7B

minutes processed

2.7B

minutes processed

—— The State Problem ——

Failure modes that emerge at scale

Zombie calls

Your app receives a hangup event after it already issued a transfer command. The transfer succeeds. The call is now live with no state tracking. Nobody knows the call exists.

Zombie calls

Your app receives a hangup event after it already issued a transfer command. The transfer succeeds. The call is now live with no state tracking. Nobody knows the call exists.

Double updates

Two concurrent events for the same call. Both read state, both mutate, one overwrites the other. The caller hears contradictory information in the same conversation.

Double updates

Two concurrent events for the same call. Both read state, both mutate, one overwrites the other. The caller hears contradictory information in the same conversation.

Phantom transfers

The transfer target picks up during a brief network partition. Your app never receives the answer event. The call is bridged but your state shows it as still ringing.

Phantom transfers

The transfer target picks up during a brief network partition. Your app never receives the answer event. The call is bridged but your state shows it as still ringing.

Stale responses

The caller interrupts while the LLM is generating. Your app receives the full LLM response and sends it to TTS. The caller hears an answer to a question they already corrected.

Stale responses

The caller interrupts while the LLM is generating. Your app receives the full LLM response and sends it to TTS. The caller hears an answer to a question they already corrected.

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()

AI outside the call vs. AI inside the call

Bolt-On: AI Outside the Call

Audio streams to your server, then to STT, LLM, TTS

Six network hops minimum per conversational turn

State split across your app, telephony provider, and AI services

Race conditions multiply with call volume

Your app is responsible for context, timing, and error recovery

Root cause found after 90 minutes of cross-vendor investigation

SignalWire: AI Inside the Call

AI kernel orchestrates from inside the media stack

The kernel eliminates the hops between the audio and the orchestration layer

Events processed in order within a single system

No external state to synchronize or reconcile

State lives in one place: the platform. The media engine holds runtime state. The control plane governs lifecycle.

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

Keep state inside the call.

Build on one platform where the media engine and AI control plane share a single ordered call lifecycle.

Keep state inside the call.

Build on one platform where the media engine and AI control plane share a single ordered call lifecycle.

Keep state inside the call.

Build on one platform where the media engine and AI control plane share a single ordered call lifecycle.

Keep state inside the call.

Build on one platform where the media engine and AI control plane share a single ordered call lifecycle.