Some calls are forms in disguise. A new patient intake, a home service booking, an insurance claim. There is a list of things you must collect, usually in a particular order, and the caller will get one of them wrong and want to fix it.
A Guided Path is a voice agent pattern where a fixed flow, not the model, decides the order of steps. In a Guided Path, the flow owns the order. The model only handles the current step: ask for the phone number, check it, move on. When the caller says “sorry, my number is actually 416”, the path steps back to the phone step, fixes it, and returns to where it was.
Use it when
Required fields arrive in a set order and callers correct themselves. Intake, order taking, applications, claims, surveys. This is also the pattern clients ask for without knowing the name: “it has to ask these questions, in this order, every time”.
Avoid it when
The conversation is open ended and order does not matter. A rigid path on a support call feels like a form being read aloud. Use a Supervisor that starts tasks when the caller raises them instead.
Latency
Solo speed per turn, because each step is a small prompt. Calls do run a few turns longer, since each step checks its answer before moving on. That is usually the right trade: one extra “is that right?” is cheaper than a wrong address on a booking.
Build it on LiveKit
A TaskGroup runs AgentTasks in order. Tasks in the group share conversation context, and the group lets the caller return to a completed step to change it.
from livekit.agents.beta.workflows import TaskGroup
async def run_intake(agent) -> dict:
group = TaskGroup(chat_ctx=agent.chat_ctx)
group.add(lambda: GetName(), id="name", description="Collects the caller's full name")
group.add(lambda: GetPhone(), id="phone", description="Collects a callback number")
group.add(lambda: GetService(), id="service", description="What needs fixing and where")
group.add(lambda: GetTimeSlot(), id="slot", description="Books a visit window")
result = await group
return result.task_results # {"name": NameResult(...), "phone": PhoneResult(...), ...}
Each GetX class is an AgentTask with a typed result, exactly like the tasks in the Supervisor pattern. The description matters: it is what lets the group recognise “go back to my phone number” and route to the right step. See LiveKit’s tasks and task groups reference.
How it combines
A Guided Path is most often a task inside a Supervisor. The supervisor handles small talk and changes of mind, then lends the call to the path for the structured part. Add a read-back confirmation as a capability on the last step. If checking availability for the time slot takes more than a second or two, add a Background Worker.
Common questions
How does a voice agent let a caller correct an earlier answer?
In a Guided Path built on a LiveKit TaskGroup, each step has a description. When the caller says something like "go back to my phone number", the group routes to that step, updates it, and returns to where it was.
Is a Guided Path the same as an IVR menu?
No. An IVR forces the caller through keypad options. A Guided Path still talks naturally at each step, and only the order of required fields is fixed.
Does a Guided Path make calls slower?
Each turn is fast because each step has a small prompt. Calls run a few turns longer because each step confirms its answer, which is cheaper than storing a wrong address.
Sources and further reading
Mahimai Raja
Mahimai builds production voice agents on LiveKit for small businesses and maintains the open-source livekit-starter. He is building ShipVoice, the voice AI platform for agencies. Find him on X or at [email protected].