VoiceRun is a serverless enterprise voice platform

Our event-driven paradigm accelerates how enterprises build, deploy, measure, and optimize voice applications with speed, scale, and security.

Code First development

Describe what you want, wire in your systems, and ship versioned deploys with confidence. Build your demo with just a sentence. Then take to your repo, CLI, and IDE to perfect it.

model logo
model logo
model logo
model logo
model logo
model logo
model logo
model logo

State-of-the-art models

Simply orchestrate between the best model providers, whether for speech-to-text, text-to-speech, or LLM. Be ready to swap from today's SOTA to tomorrow's in an instant without losing native latency optimizations.

Extensible architecture

Pick the design pattern that best suits your use case.

A single reasoning model handles dialogue and actions end-to-end. Lowest complexity and fastest to ship; great for narrow use cases and pilots. As use case complexity growths, context length and model intelligence demand increases until latency, cost, and consistency become blockers.

Simple: User and State are active with continuous exchange.
Simple AgentA single user container and single state container exchange messages.UserAgent

Flexible deployment

Cloud

Global scale
Instant global availability and edge latency
Autoscaling with no cold starts
Managed security, monitoring, and updates
SOC2/ISO-ready posture out of the box

On-Prem

Max control
Deploy inside your VPC or air‑gapped network
Full data residency and fine-grained control
Offline-capable with the same APIs and SDKs
Custom SLAs, SSO/SAML, and private networking

Simple front-end

Our Telephony

Minutes to live
Managed numbers with global reach
Provision in seconds — no carrier setup
Autoscaling, monitoring, and failover
Secure by default with recording controls

BYO Telephony

Max control
Connect your own Twilio or CAAS
Keep contracts, numbers, and pricing
SIP/PSTN routing and fine‑grained control
Private networking and compliance options

In‑App

Web & mobile
React/Next.js and native iOS/Android SDKs
Realtime mic capture, playback, and stats
Drop‑in components and simple APIs
Works in browsers and mobile apps

Custom measurements

Centralize call logs, user turns, and outcomes. Analyze funnels and identify friction with real transcripts. Instrument your agent directly in code to unlock downstream analytics and iteration.

agent.py
import asyncio
import datetime
import json
from typing import Optional

from primfunctions.events import (
    Event, LogEvent, TextToSpeechEvent, TextEvent, StartEvent
)
from primfunctions.context import Context

# Application constants
SYSTEM_PROMPT = "You are a data-driven assistant that runs quick experiments."
VOICE = "lyric"

# ----- Handlers -----
async def handler(event: Event, context: Context):
    if isinstance(event, StartEvent):
        # 
        # A/B test for welcome message
        context.add_test("welcome_variant", {
            "A": 0.5,  # Control
            "B": 0.5   # Treatment
        }, stop={
            "iterations": 1000,
            "confidence": 95,
            "target_outcome": "conversion_rate",
            "stop_on": 2,
            "default": "A",
            "notify": ["analytics@company.com"]
        })

        selected = context.assign_variant("welcome_variant")
        if selected == "A":
            yield TextToSpeechEvent("Welcome back. Ready to analyze conversions?", voice=VOICE)
        else:
            yield TextToSpeechEvent("Welcome! Want to try a quick experiment to lift conversions?", voice=VOICE)
        # 

    elif isinstance(event, TextEvent):
        user_text = event.data.get("text", "").strip()
        if not user_text:
            return

        # Fetch prior metrics
        current_rate = context.get_state().get("conversion_rate", 0.32)
        last_updated: Optional[str] = context.get_state().get("last_updated")

        # Respond with current numbers
        reply = f"Current conversion rate is {current_rate:.2%}. Last updated: {last_updated or 'n/a'}."
        yield TextToSpeechEvent(reply, voice=VOICE)

        # Record we discussed metrics
        yield LogEvent({"event": "metrics_discussed", "rate": current_rate})

        #  

        # Persist the time this was evaluated
        context.set_state({"last_updated": datetime.datetime.utcnow().isoformat()})

Rapid experimentation

Run A/Bs on prompts, voices, and policies. VoiceRun will automatically split and execute your experiment.Capture outcomes per session to compare win rates and deploy the best variant confidently.

agent.py
import asyncio
import datetime
import json
from typing import Optional

from primfunctions.events import (
    Event, LogEvent, TextToSpeechEvent, TextEvent, StartEvent
)
from primfunctions.context import Context

# Application constants
SYSTEM_PROMPT = "You are a data-driven assistant that runs quick experiments."
VOICE = "lyric"

# ----- Handlers -----
async def handler(event: Event, context: Context):
    if isinstance(event, StartEvent):
        # 
        # A/B test for welcome message
        context.add_test("welcome_variant", {
            "A": 0.5,  # Control
            "B": 0.5   # Treatment
        }, stop={
            "iterations": 1000,
            "confidence": 95,
            "target_outcome": "conversion_rate",
            "stop_on": 2,
            "default": "A",
            "notify": ["analytics@company.com"]
        })

        selected = context.assign_variant("welcome_variant")
        if selected == "A":
            yield TextToSpeechEvent("Welcome back. Ready to analyze conversions?", voice=VOICE)
        else:
            yield TextToSpeechEvent("Welcome! Want to try a quick experiment to lift conversions?", voice=VOICE)
        # 

    elif isinstance(event, TextEvent):
        user_text = event.data.get("text", "").strip()
        if not user_text:
            return

        # Fetch prior metrics
        current_rate = context.get_state().get("conversion_rate", 0.32)
        last_updated: Optional[str] = context.get_state().get("last_updated")

        # Respond with current numbers
        reply = f"Current conversion rate is {current_rate:.2%}. Last updated: {last_updated or 'n/a'}."
        yield TextToSpeechEvent(reply, voice=VOICE)

        # Record we discussed metrics
        yield LogEvent({"event": "metrics_discussed", "rate": current_rate})

        # context.set_outcome("conversion_rate", current_rate + 0.1)

        # Persist the time this was evaluated
        context.set_state({"last_updated": datetime.datetime.utcnow().isoformat()})

Build your first voice agent today.

Spin up an agent, connect telephony or the React SDK, and ship a pilot in hours.

Get Started