Langoedge Blog
Stateful Voice AI Agents: Why Calls Need a State Machine
A stateful voice AI agent is a voice agent built on an explicit state machine rather than a single prompt-and-tools loop. Its conversation state (who's calling, what they want, what has been tried) is checkpointed on every turn, and its edges can loop back conditionally, so when something goes wrong mid-call it can retry or take another path with context intact. A stateless agent, by contrast, relies on the model to hold everything in its prompt, and tends to repeat questions, drop details or give up when a tool returns something unexpected.
Key facts
- ElevenLabs launched Reception, a small-business AI receptionist from $29 a month, on 17 September 2026 (Inc.). A voice-model company now competes directly at the application layer.
- Agent reliability across repeated attempts is weak without structure: on τ-bench, GPT-4o succeeded on under 50% of tasks and under 25% of tasks consistently across eight tries in the retail domain (Yao et al., 2024).
- "A natural voice does not prove that the caller's intent was identified correctly, an address was recorded accurately, or an appointment reached the calendar" (Dataconomy).
- Langoedge compiles a visual graph into a LangGraph state machine, checkpointed every turn, with conditional edges that can loop back.
Why ElevenLabs' Reception matters for platform builders
Until recently the voice AI stack had a rough division of labour. Model companies (ElevenLabs, Deepgram, Cartesia) sold the voice. Platform companies (Vapi, Bland, Retell, Vocode) sold the orchestration that turns a voice into a useful phone call. That has been a good business: Vapi reached a $500 million valuation in May 2026 after winning an Amazon Ring deal over 40 rivals, and Bland has raised more than $100 million.
Reception crosses that line. It answers calls, books jobs, schedules appointments and sends a summary and recording, at $29, $79 or $199 a month. Inc. lists its competitors as Zoom, RingCentral, Yelp, Jobber, Goodcall, Smith.ai and My AI Front Desk, not the developer platforms.
The lesson isn't about ElevenLabs specifically. If the company supplying your voice can ship a receptionist on its own stack, "we sound the best" stops being a moat for anyone built on top of it. What's left to compete on is what the agent does when the call goes off-script.
With Reception, ElevenLabs is both a voice supplier and a competitor to receptionist products built on top of it.
What "stateful" buys you on a bad call
Take a common failure. A caller wants Tuesday at 2pm. The calendar tool says it's taken. The agent now has to keep everything it knows (name, reason for visit, preferred days), offer alternatives, and not re-ask anything.
In a single prompt loop, that retry is bolted on. The model has to notice the failure, remember the context, and choose to try again, every time, on every call. When it doesn't, you hear it: the agent restates the whole conversation, loses a detail, or apologises and ends the call. τ-bench's consistency numbers show how often "every time" fails in practice.
In a state machine, the retry is structural. The tool result routes to an "offer alternative times" node, with the session's state already there. The model decides what to say; the graph decides where the conversation goes.
The loop from "offer alternatives" back to "check slot" is what a stateless agent has to improvise and a stateful one gets from its structure.
A minimal stateful booking agent in LangGraph
This is a stripped-down version of that loop in LangGraph. The tools are stubs; the structure is the point.
from typing import TypedDict
from langgraph.graph import StateGraph, START, END
from langgraph.checkpoint.memory import InMemorySaver
class CallState(TypedDict, total=False):
caller: str
requested_slot: str
slot_free: bool
alternatives: list[str]
attempts: int
outcome: str
def check_slot(state: CallState) -> CallState:
free = calendar_is_free(state["requested_slot"]) # your calendar API
return {"slot_free": free, "attempts": state.get("attempts", 0) + 1}
def offer_alternatives(state: CallState) -> CallState:
options = next_free_slots(after=state["requested_slot"], limit=3)
choice = ask_caller_to_pick(options) # the voice layer asks and returns a choice or None
return {"alternatives": options, "requested_slot": choice or state["requested_slot"],
"outcome": "" if choice else "no_suitable_slot"}
def confirm(state: CallState) -> CallState:
book(state["requested_slot"], state["caller"])
return {"outcome": "booked"}
def take_callback(state: CallState) -> CallState:
return {"outcome": "callback"}
def after_check(state: CallState) -> str:
if state["slot_free"]:
return "confirm"
return "take_callback" if state["attempts"] >= 3 else "offer_alternatives"
def after_offer(state: CallState) -> str:
return "take_callback" if state.get("outcome") == "no_suitable_slot" else "check_slot"
graph = StateGraph(CallState)
graph.add_node("check_slot", check_slot)
graph.add_node("offer_alternatives", offer_alternatives)
graph.add_node("confirm", confirm)
graph.add_node("take_callback", take_callback)
graph.add_edge(START, "check_slot")
graph.add_conditional_edges("check_slot", after_check)
graph.add_conditional_edges("offer_alternatives", after_offer)
graph.add_edge("confirm", END)
graph.add_edge("take_callback", END)
app = graph.compile(checkpointer=InMemorySaver())
config = {"configurable": {"thread_id": "call-8f2c"}} # one thread per call
app.invoke({"caller": "Sam", "requested_slot": "Tue 14:00"}, config)
Three details do the work. The checkpointer saves state after every step under the call's thread_id, so nothing lives only in the prompt. The conditional edges make retry a route, not a hope. And the attempts counter caps the loop, so a bad calendar can't trap a caller forever. In production you'd use a durable checkpointer (Postgres or Redis) instead of InMemorySaver.
Keep slow work off the voice turn
State handles correctness. Latency needs a second idea: heavy backend work shouldn't run inside the voice turn at all. Langoedge lets a voice node call a separate text graph as an asynchronous tool, so a CRM write or database lookup runs beside the conversation. We explain that in voice-to-text sub-routing, and the numbers behind it in voice AI agent latency.
What to check before picking a voice AI platform
- Show me the second attempt. Ask for a call where a tool fails or returns something unexpected. If the agent apologises and hangs up, it's stateless with a polite failure mode.
- Is session state durable? State that lives only in memory for the call can't hand off to background work or survive a hiccup.
- Are integrations configured or hand-coded? Langoedge uses Pipedream Connect (MCP, 3,000+ apps) and hand-builds a few critical ones such as Cliniko, ServiceM8, Telnyx and Twilio. See MCP integrations for AI voice agents.
- How are calls graded? Manually replaying recordings doesn't scale. We cover automated scoring in LLM-as-judge for voice AI.
FAQ
What is a stateful voice AI agent?
A stateful voice AI agent runs on an explicit state machine with conversation state checkpointed on every turn and conditional edges that can loop back. When a tool fails or returns an unexpected result mid-call, it can retry or take another path with the caller's details intact, instead of relying on the model to remember and improvise.
What's the difference between a stateful and a stateless voice agent?
A stateless agent keeps context only in its prompt and depends on the model to handle every failure case correctly each time. A stateful agent stores context in a structured state and encodes retries and branches in the graph itself, which makes its behaviour on unusual calls more consistent.
Is ElevenLabs now a competitor to Vapi, Bland and Retell?
At the application layer, partly. Reception is a complete AI receptionist rather than a voice model, so it competes for the same small-business buyers as receptionist products built on those platforms, although Inc. lists its direct competitors as answering services such as Smith.ai and Goodcall.
Does a better-sounding voice make an agent more reliable?
No. Voice quality and task completion are separate problems. A natural-sounding agent can still record the wrong address or book the wrong slot. Reliability comes from how the agent handles failures and whether its actions are checked.
Does Langoedge build its own voice models?
No. Langoedge is an orchestration and telephony layer. It compiles a visual graph into a LangGraph state machine and runs calls over direct Telnyx and Twilio SIP trunking, using third-party speech models.
Sources
- Inc., "This Startup Is Now Offering an AI Receptionist for Just $29 a Month"
- Yao et al., "τ-bench: A Benchmark for Tool-Agent-User Interaction in Real-World Domains" (2024)
- Dataconomy, "How To Benchmark AI Voice Agents Before They Go Live" (1 September 2026)
- TechCrunch, "AI voice startup Vapi hits $500M valuation" (12 May 2026)
- PR Newswire, "Bland Surpasses $100M Funding With New Series C"
- LangGraph documentation, persistence and checkpointers
About the author. Arnab Chakraborty is the founder of Langoedge, a Melbourne company building voice and text AI agents on LangGraph with direct SIP telephony. Disclosure: Langoedge competes with some of the platforms named here.