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.








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.
Flexible deployment
Cloud
On-Prem
Simple front-end
Our Telephony
BYO Telephony
In‑App
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.
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/a39;}."
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.
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/a39;}."
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.