GPT-Live now runs on your LiveKit credentials

2 days ago

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.

Ask about this presentation

Chapters

  1. 0:00GPT-Live through LiveKit Inference
  2. 0:19How DuplexModel works
  3. 0:45New model strings
  4. 1:07Decision models
  5. 1:32Breaking changes
  6. 1:58Retired model IDs
  7. 2:17Fixes
  8. 2:46Upgrade
Show transcript
  1. 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.

    Slide text
    LiveKitlivekit-agents 1.8.8

    GPT-Live now runs on your LiveKit credentials

    session = AgentSession(llm="openai/gpt-live-1")

    No separate OpenAI key. The string resolves to inference.DuplexModel.

    STT → LLM → TTS REALTIME DECISION
  2. 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.

    Slide text
    LiveKitinference/realtime/gpt_live.py

    Delegated work runs on a backend model that Inference serves

    AgentSession
    llm="openai/gpt-live-1"
    GPT-Live
    default voice "marin"
    delegation
    Backend model
    gpt-5.6-luna by default
    Limits through Inference
    Default service tier only, for delegated work
    The backend must be an OpenAI LLM that Inference serves
    Hosted tools such as WebSearch() are refused; function tools work
    STT → LLM → TTS REALTIME DECISION
  3. 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.

    Slide text
    LiveKitinference/_realtime_models.py

    Gemini Live and Grok Voice 3.0 work as model strings too

    Google
    Gemini Live
    google/gemini-3.8-live
    google/gemini-3.8-live-
    extended-thinking
    google/gemini-live
    xAI
    Grok Voice 3.0
    xai/grok-voice-3.0
    xai/grok-voice-
    think-fast-2.0
    OpenAI
    GPT-Live 1
    openai/gpt-live-1
    STT → LLM → TTS REALTIME DECISION
  4. 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.

    Slide text
    LiveKitlivekit-plugins-typesafe

    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"]),
        },
    )
    Probability
    0 to 1 that a statement is true
    Choice
    one named option
    Score
    a position on ordered levels
    STT → LLM → TTS REALTIME DECISION
  5. 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.

    Slide text
    LiveKitBreaking changes

    Two changes can break an existing agent

    1.8.7
    isinstance(m,
        openai.realtime.RealtimeModel)
    # True for inference.RealtimeModel
    1.8.8
    isinstance(m, (
        openai.realtime.RealtimeModel,
        inference.RealtimeModel))
    1.8.7
    GPTLiveModel(voice="aster")
    1.8.8
    GPTLiveModel(voice="cedar")
    STT → LLM → TTS REALTIME DECISION
  6. 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.

    Slide text
    LiveKitBehavior changes

    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
    STT → LLM → TTS REALTIME DECISION
  7. 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.

    Slide text
    LiveKitFixes

    Gemini 3.x reply instructions now go in as a user turn

    Gemini 3.x
    Sent as a model turn, they made the model speak its reasoning or stay silent. The wrapper keeps it from quoting them back as the user's words.
    xAI
    Hosted sessions emit one final user transcript per turn.
    TTS chunking
    A stray closing XML tag no longer cancels out a later opening tag.
    STT → LLM → TTS REALTIME DECISION
  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.

    Slide text
    LiveKitUpgrade

    Upgrade to 1.8.8 after two quick checks

    Type checks against openai.realtime.RealtimeModel
    GPT-Live agents set to the aster voice
    $ pip install -U
      "livekit-agents[openai]==1.8.8"
    $ pip install livekit-plugins-typesafe
    STT → LLM → TTS REALTIME DECISION

What happened in AI today, in your inbox

One short email each evening. Read it and you’re caught up.

Built in New York with ❤️