Skip to main content
Let a live voice model hold the conversation while a reasoning backend handles its tools. models.live names the voice model; backend: points to an OpenAI entry in models.think. The live model decides when to speak and how to respond to interruptions. On this page:

Quickstart

Create a new package with a LiveKit target. If initialization opens the console, select LiveKit and finish creating the package.
Terminal
Replace voice-desk/agent.yaml with this complete file:
voice-desk/agent.yaml
Keep the scaffold’s targets.yaml, but remove its target-level models: overrides because the model palette above replaces the scaffold’s. Keep its framework provider and version pin, and remove any phone connection: for this browser example. Replace voice-desk/instructions.md with this complete prompt:
voice-desk/instructions.md
Set OPENAI_API_KEY in your shell or the package’s .env, then run:
Terminal
Use Docker for this LiveKit run. The Pipecat target is another option; it runs locally with uv. The example below stays with this same desk agent.

Pros and cons

Pick Live when you want the model to manage the spoken exchange and send tool work to a backend. It fits an agent that can work within the model’s own turn and voice behavior. Live can respond with fewer speech-processing stages, but is not guaranteed to beat Realtime or a tuned Cascade on every interaction. Compare both reply time and successful tool completion. Choose Realtime for selectable turn modes or a separate voice. Choose Cascade when the workflow needs more steps and state. The overview compares all three and links the LiveKit and Coval articles.

1. Bind the live model

The quickstart’s desk names voice through its live: binding. That entry uses gpt-live-1 and names reasoning as its backend. Both use OPENAI_API_KEY; your account must have access to both models.
cascade | realtime | live
required
Set live explicitly. Omitted means cascade, which cannot use a live binding.
a models.live entry name
required
Agent-level binding. It replaces think: and speak: on this agent.
a models.think entry name
OpenAI reasoning entry used by the live model. Required when the agent has tools, including knowledge lookup. It cannot use endpoint_env.
See Live model fields for the full entry reference. Do not add separate listen, speak, or turn sections; live owns those jobs.

2. Give the backend a tool

Add one local tool to the same desk. Create these two complete new files:
voice-desk/tools/opening_hours.yaml
voice-desk/tools/opening_hours.py
Merge these attachments into agent.yaml. Keep the existing instructions and live binding under desk:
voice-desk/agent.yaml
Append this instruction to the existing prompt:
voice-desk/instructions.md
The live model sends the request to its backend. The backend requests a tool call, the generated application runs the handler, and the live model speaks the result. A tool’s returned data should determine the answer; the model should not invent it.

3. Try tools and knowledge in a call

Stop the earlier dev run, then validate and restart:
Terminal
Ask when the desk opens, then interrupt with a follow-up question. Check that the dev page records the tool and that the spoken answer matches its result. For document lookup, follow Knowledge bases and attach the resulting search tool to this same agent. It runs through the backend too. The complete takeaway example combines orders and knowledge on both frameworks.

Advanced

The live entry’s voice is optional; omitted means the provider’s default. With no tools, the backend is optional, but requests needing one may be declined. The backend binding forwards its model name; do not rely on its params: being applied to the live session. A greeting is an opening instruction, so its exact wording can change. See Live model for fields and target differences.
Use the switching steps. The current Live integration fixes instructions and tool setup at session start. It supports one agent and browser audio on Pipecat and LiveKit. These are limits of Unmute’s integration, not of every speech-to-speech API. It does not support tasks, handoffs, variables, pre-fetch, tracing, MCP tools, or phone connections. Remove conversation.interruption; the model manages interruptions itself. Keep cascade when these features are part of your required workflow.

Troubleshooting

Validation says the live model needs a backend

An attached tool has no reasoning backend to run it. Fix: add backend: reasoning to the live entry and keep the OpenAI models.think.reasoning entry from the quickstart.

The model speaks but cannot use my tool

The tool may be unattached, its arguments may be wrong, or its handler may return a refusal. Fix: check the dev tool row and logs, verify both tool attachments, and compare the result with what the agent said. See Local tools for the tool contract.

The call fails at session start

A configured model or voice may be unavailable to the API key. Fix: read the provider error in the dev logs and verify access to the live model and its backend.

The greeting sounds different

The live model paraphrases the opening instruction. Fix: write the intended meaning in the greeting; use cascade if exact synthesized wording is required.

Where to go next

Live model fields

Review fields and target support.

Realtime

Choose turn detection or another voice.