Contact Sales

All fields are required

Developer Experience That Ships | SignalWire
Developer Experience

Ship Agents, Not Boilerplate

LiveKit closed state management as 'Not Planned.' SignalWire built it in. The gap between idea and working agent should be code, not workarounds.

1
package to install
8+
LiveKit packages to coordinate
$0.16
per minute, flat rate
2.7B
minutes processed
The problem

Developer experience gaps that slow every project

Tools must be Python functions, no JSON Schema

LiveKit requires all tools to be defined as Python functions. Developers who want to define tools using JSON Schema (the format LLMs use natively) cannot. The request was closed as 'Not Planned' (GitHub #1966).

State management is DIY

No built-in way to persist conversation state across turns, transfers, or steps. Developers build custom state layers from scratch for every project.

Eight packages with separate version cadences

livekit-agents, livekit, livekit-api, livekit-protocol, plus plugins for each STT, TTS, and turn detection provider. Version mismatches cause silent failures.

Quota limits surface as connection errors

Developers see APIConnectionError with body: null when they hit STT quotas. A LiveKit team member acknowledged the error message is poor. Debugging requires guessing.

Build a Voice AI Agent

from signalwire_agents import AgentBase
from signalwire_agents.core.function_result import SwaigFunctionResult

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 SwaigFunctionResult(f"Order {order_id}: shipped, ETA April 2nd")

agent = SupportAgent()
agent.run()

Tool calling: Python-only vs. multiple options

LiveKit Approach

  • Tools must be Python functions introspected by the framework
  • No JSON Schema support despite LLMs using it natively
  • JSON Schema support request closed as 'Not Planned'
  • MCP integration requires custom code that developers call 'complicated'

SignalWire Approach

  • Python decorator generates JSON Schema automatically
  • Define tools in declarative YAML markup
  • Connect to any API without webhooks using serverless data integration
  • LLM-native: JSON Schema in, structured response out

Language models use JSON Schema, MCP uses JSON Schema, OpenAPI uses JSON Schema, but livekit uses python functions.

State management that works without external databases

Sensitive data the model never sees

Store account numbers, auth tokens, and PII accessible to tool functions but invisible to the language model. No prompt leakage of sensitive data.

Session state across turns and transfers

State persists automatically across conversation turns, agent transfers, and step transitions. No external database required.

Post-conversation actions built in

Trigger end-of-conversation summaries, CRM updates, and ticket creation through built-in post-prompt hooks. No webhook gymnastics.

Automatic tool state tracking

Tool function responses include state updates that persist automatically and are available to subsequent turns without manual save and restore.

Package management: eight packages vs. one

LiveKit (8+ Packages)

  • livekit-agents, livekit, livekit-api, livekit-protocol
  • Separate plugins for OpenAI, Silero, Deepgram, ElevenLabs
  • Each package with its own version cadence
  • Mismatches cause silent failures with cryptic timeout errors

SignalWire (1 Package)

  • pip install signalwire-agents
  • One package, one version, zero dependency coordination
  • STT, TTS, and LLM integrations at the platform level
  • No client-side plugin packages to manage

Developer experience comparison

AspectLiveKitSignalWire
Tool definitionPython function introspectionJSON Schema + decorator (LLM-native)
Serverless data integrationNot availableServerless API integration connects to any endpoint
State managementManual (closed as 'Not Planned')Built-in shared data layer and session
Package count8+ coordinated packages1 package
Version coordinationRequired; silent failures on mismatchNot needed
Error messagesQuota limits appear as connection errorsStandard HTTP status codes
Model compatibilityPlugin-dependent (documented Gemini issues)Platform-level, model-agnostic
Post-call actionsDIY webhook integrationBuilt-in post-prompts
DeploymentLiveKit-specific worker processAny Python host (server, Lambda, Cloud Functions)

From pip install to production

1

Install

pip install signalwire-agents. One package, one version.

2

Define your agent

Inherit AgentBase, set a prompt, add skills. Under 15 lines for a working agent.

3

Add tools

Decorate Python functions with @agent.tool or define them in YAML. JSON Schema generated automatically.

4

Ship it

Call agent.run(). Same code deploys to a server, Lambda, or Cloud Functions. No platform-specific worker process.

FAQ

Can I use my existing OpenAI, Deepgram, or ElevenLabs accounts?

Yes. STT, TTS, and LLM providers are configured at the platform level. You bring your own API keys or use SignalWire's integrated providers.

How does tool calling work with different LLM providers?

Tools are defined as JSON Schema. Model compatibility is handled at the platform level, not in client-side plugins. The same tool definition works across providers.

What happens to state when a call transfers between agents?

Session state, metadata, and conversation context transfer automatically. The receiving agent inherits the full conversation history.

Do I need to run a LiveKit server for development?

No. SignalWire agents are standard Python HTTP servers. Run locally with python your_agent.py, test with any HTTP client, deploy anywhere.

Trusted by 2,000+ companies

Define an agent. Add tools. Ship it.

One package, one install. The same code deploys to a server, Lambda, or Cloud Functions.