GPT-Live through LiveKit Inference
GPT-Live now runs on your LiveKit credentials
No separate OpenAI key. The string resolves to inference.DuplexModel.
LiveKit Agents 1.8.8 lets you run OpenAI's GPT-Live with your LiveKit credentials, so a voice agent no longer needs its own OpenAI key for it. Pass the model string as the session's LLM, and LiveKit Inference serves it through a new class called DuplexModel.
How DuplexModel works
Delegated work runs on a backend model that Inference serves
GPT-Live speaks with the user and hands delegated work to a backend model. Through Inference that backend defaults to GPT 5.6 Luna, and your function tools work as usual. There are limits. Delegated work runs on the default service tier only, the backend has to be an OpenAI model that Inference serves, and hosted tools like web search are refused with an error. For those, use the OpenAI plugin directly.
New model strings
Gemini Live and Grok Voice 3.0 work as model strings too
extended-thinking
think-fast-2.0
Other realtime models get the same one-string setup. Inference now accepts three Gemini Live model strings, including an extended-thinking variant. Grok Voice 3.0 replaces Think Fast 2.0 in both the Inference list and the xAI plugin. And GPT-Live 1 is the one full-duplex model on the list.
Decision models
Decision models answer questions about a call in the background
model = typesafe.DecisionModel(model="jev-latest")
response = await model.evaluate(
input=context,
decisions={
"handoff": llm.Probability(
"The caller requests a human."),
"intent": llm.Choice("What does the caller want?",
options={"booking": …, "other": …}),
"frustration": llm.Score("How frustrated…?",
levels=["Calm", "Annoyed", "Angry"]),
},
)
There's a new kind of model in the framework. A DecisionModel takes the conversation and a batch of named questions, and answers them all in one request, without delaying the agent's reply. The first provider is TypeSafe's Jev, through its own API or OpenRouter's Decisions API. Each question is a probability, a choice between named options, or a score on levels you describe, like calm, annoyed or angry.
Breaking changes
Two changes can break an existing agent
isinstance(m,
openai.realtime.RealtimeModel)
# True for inference.RealtimeModelisinstance(m, (
openai.realtime.RealtimeModel,
inference.RealtimeModel))GPTLiveModel(voice="aster")GPTLiveModel(voice="cedar")Two changes can break existing code. The Inference RealtimeModel no longer subclasses the OpenAI plugin's RealtimeModel, so a type check against the plugin class stops matching Inference models. Check for both classes. Incidental wildcard exports, like the realtime model module's logger, are gone too. And for GPT-Live, the unsupported aster voice is replaced by cedar, so update any voice set to aster.
Retired model IDs
Retired model IDs still connect, with a deprecation warning
| openai/gpt-realtime-2 | → | openai/gpt-realtime-2.1 |
| openai/gpt-realtime-1.5 | → | openai/gpt-realtime-2.1 |
| xai/grok-voice-think-fast-2.0 | → | xai/grok-voice-3.0 |
| RealtimeModel(inference_class=) | → | no effect, removed in v2.0 |
Retired GPT Realtime and Grok Voice IDs keep working. Each one logs a deprecation warning that names its replacement, so you can move over when it suits you. The realtime inference class argument is deprecated as well. It's no longer sent and it's due to be removed in version two.
Fixes
Gemini 3.x reply instructions now go in as a user turn
If you call generate reply with instructions on Gemini 3.1 or 3.8, those instructions now go in as a user turn. Sent as a model turn, they made the model speak its reasoning or stay silent, and the wrapper around the new user turn keeps the model from quoting them back later as the user's words. Hosted xAI sessions now emit one final user transcript per turn. And in TTS chunking, a stray closing tag can no longer cancel out a later opening one.
Upgrade
Upgrade to 1.8.8 after two quick checks
"livekit-agents[openai]==1.8.8"
Before you upgrade, look for two things: type checks against the OpenAI plugin's RealtimeModel, and GPT-Live agents using the aster voice. Fix those first. Then install 1.8.8 with the extras you already use, and add the TypeSafe plugin if you want decision models. GPT-Live now runs on your LiveKit credentials.








