NewYour coding agent can read the release notes before it upgrades.Set up the MCP server →
PyPI · #1841 most downloaded on PyPI
A powerful framework for building realtime voice AI agents
Last release 2 days ago
15 Sep 2026
Ships on a steady schedule
a new release about every 9 days
Nearly every release is documented
notes for 55 of the last 60 stable releases
4 versions withdrawn
withdrawn after publishing
3 years old
220 releases · first in 2023
To learn more about the new observability features, check out our full write-up on the LiveKit blog. It walks through how session playback, trace insp
To learn more about the new observability features, check out our full write-up on the LiveKit blog. It walks through how session playback, trace inspection, and synchronized logs streamline debugging for voice agents. Read more here
The CLI has been redesigned, and a new text-only mode was added so you can test your agent without using voice.
python3 my_agent.py console --text
You can also now configure both the input device and output device directly through the provided parameters.
python3 my_agent.py console --input-device "AirPods" --output-device "MacBook"
We’ve renamed Worker to AgentServer, and you now need to use a decorator to define the entrypoint. All existing functionality remains backward compatible. This change lays the groundwork for upcoming design improvements and new features.
server = AgentServer()
def prewarm(proc: JobProcess): ...
def load(proc: JobProcess): ...
server.setup_fnc = prewarm
server.load_fnc = load
@server.rtc_session(agent_name="my_customer_service_agent")
async def entrypoint(ctx: JobContext): ...
Use the on_session_end callback to generate a structured SessionReport that the conversation history, events, recording metadata, and the agent’s configuration.
server = AgentServer()
async def on_session_end(ctx: JobContext) -> None:
report = ctx.make_session_report()
print(json.dumps(report.to_dict(), indent=2))
chat_history = report.chat_history
# Do post-processing on your session (e.g final evaluations, generate a summary, ...)
@server.rtc_session(on_session_end=on_session_end)
async def my_agent(ctx: JobContext) -> None:
...
To capture everything that occurred during your session, we added an AgentHandoff item to the ChatContext.
class AgentHandoff(BaseModel):
...
old_agent_id: str | None
new_agent_id: str
We updated the turn-detection model, resulting in measurable accuracy improvements across most languages. The table below shows the change in tnr@0.993 between versions 0.4.0 and 0.4.1, along with the percentage difference.
This new version also handles special user inputs such as email addresses, street addresses, and phone numbers much more effectively.
<img width="449" height="493" alt="514623611-bb709e00-71ca-4b0e-86c4-fd854dcaf51c" src="https://github.com/user-attachments/assets/0f9dee1e-5bfa-4c04-be2c-06d3c2213ed5" />
We added TaskGroup, which lets you run multiple tasks concurrently and wait for all of them to finish. This is useful when collecting several pieces of information from a user where the order doesn’t matter, or when the user may revise earlier inputs while continuing the flow.
We’ve also added an example that uses TaskGroup to build a SurveyAgent, which you can use as a reference.
task_group = TaskGroup()
task_group.add(lambda: GetEmailTask(), id="get_email_task", description="Get the email address")
task_group.add(lambda: GetPhoneNumberTask(), id="phone_number_task", description="Get the phone number")
task_group.add(lambda: GetCreditCardTask(), id="credit_card_task", description="Get credit card")
results = await task_group
Agents can now optionally handle IVR-style interactions. Enabling ivr_detection allows the session to identify and respond appropriately to IVR tones or patterns, and min_endpointing_delay lets you control how long the system waits before ending a turn—useful for menu-style inputs.
session = AgentSession(
ivr_detection=True,
min_endpointing_delay=5,
)
We added a FlushSentinel marker that can be yielded from llm_node to flush partial LLM output to TTS and start a new TTS stream. This lets you emit a short, early response (for example, when a specific tool call is detected) while the main LLM response continues in the background. For a concrete pattern, see the flush_llm_node.py example.
async def llm_node(self, chat_ctx: llm.ChatContext, tools: list[llm.FunctionTool], model_settings: ModelSettings) -> AsyncIterable[llm.ChatChunk | FlushSentinel]:
yield "This is the first sentence"
yield FlushSentinel()
yield "Another TTS generation"
The --asyncio-debug argument was removed, use PYTHONASYNCIODEBUG environment variable instead.
LogLevel on the CLI by @theomonnom in https://github.com/livekit/agents/pull/3292Agent.id by @theomonnom in https://github.com/livekit/agents/pull/3478AgentHandoff chat item by @theomonnom in https://github.com/livekit/agents/pull/3479AgentHandoff to the chat_ctx & AgentSessionReport by @theomonnom in https://github.com/livekit/agents/pull/3541readchar by @theomonnom in https://github.com/livekit/agents/pull/3542RecorderIO av.error.MemoryError by @theomonnom in https://github.com/livekit/agents/pull/3543--record is enabled by @theomonnom in https://github.com/livekit/agents/pull/3572ChatContext.summarize by @theomonnom in https://github.com/livekit/agents/pull/3660assistant to agent by @theomonnom in https://github.com/livekit/agents/pull/3690agent_session span by @theomonnom in https://github.com/livekit/agents/pull/3726realtime_session to rtc_session by @theomonnom in https://github.com/livekit/agents/pull/3729room_io from the AgentSession by @theomonnom in https://github.com/livekit/agents/pull/3946Full Changelog: https://github.com/livekit/agents/compare/livekit-agents@1.2.18...livekit-agents@1.3.3
One column per month.
Nothing published for this version
> A more detailed changelog will be available soon!
[!NOTE] A more detailed changelog will be available soon!
LogLevel on the CLI by @theomonnom in https://github.com/livekit/agents/pull/3292Agent.id by @theomonnom in https://github.com/livekit/agents/pull/3478AgentHandoff chat item by @theomonnom in https://github.com/livekit/agents/pull/3479AgentHandoff to the chat_ctx & AgentSessionReport by @theomonnom in https://github.com/livekit/agents/pull/3541readchar by @theomonnom in https://github.com/livekit/agents/pull/3542RecorderIO av.error.MemoryError by @theomonnom in https://github.com/livekit/agents/pull/3543--record is enabled by @theomonnom in https://github.com/livekit/agents/pull/3572ChatContext.summarize by @theomonnom in https://github.com/livekit/agents/pull/3660assistant to agent by @theomonnom in https://github.com/livekit/agents/pull/3690agent_session span by @theomonnom in https://github.com/livekit/agents/pull/3726realtime_session to rtc_session by @theomonnom in https://github.com/livekit/agents/pull/3729room_io from the AgentSession by @theomonnom in https://github.com/livekit/agents/pull/3946Full Changelog: https://github.com/livekit/agents/compare/livekit-agents@1.2.18...livekit-agents@1.3.1
Nothing published for this version
Nothing published for this version
chore: update to correct livekit-plugins-minimax-ai package by @davidzhao in https://github.com/livekit/agents/pull/3753
basic_agent accidental commit in #3392 by @Shubhrakanti in https://github.com/livekit/agents/pull/3797Full Changelog: https://github.com/livekit/agents/compare/livekit-agents@1.2.17...livekit-agents@1.2.18
Fix/aws realtime tooluse barge in by @kachenjr in https://github.com/livekit/agents/pull/3704
Full Changelog: https://github.com/livekit/agents/compare/livekit-agents@1.2.16...livekit-agents@1.2.17
Conditional message truncation based on LLM capabilitities by @hadamove-rapidsos in https://github.com/livekit/agents/pull/3655
Full Changelog: https://github.com/livekit/agents/compare/livekit-agents@1.2.15...livekit-agents@1.2.16
reduce CI noise by @theomonnom in https://github.com/livekit/agents/pull/3552
timeout param to with_openrouter() function by @msaelices in https://github.com/livekit/agents/pull/3538preemptive_generation parameter in AgentSession by @m-hamashita in https://github.com/livekit/agents/pull/3624Full Changelog: https://github.com/livekit/agents/compare/livekit-agents@1.2.14...livekit-agents@1.2.15
Introduce LiveKit Inference: a unified model interface enabling STT, LLM, and TTS via one API key, with optimized latency, billing, and concurrency ma
extra_headers provider by @theomonnom in https://github.com/livekit/agents/pull/3549Full Changelog: https://github.com/livekit/agents/compare/livekit-agents@1.2.13...livekit-agents@1.2.14
Gladia STT: support partial transcriptions by @fabrice404 in https://github.com/livekit/agents/pull/3530
model:lang and parse model specs outside ctor by @longcw in https://github.com/livekit/agents/pull/3536Full Changelog: https://github.com/livekit/agents/compare/livekit-agents@1.2.12...livekit-agents@1.2.13
fix: add transaction id for bithuman agent by @CathyL0 in https://github.com/livekit/agents/pull/3313
Full Changelog: https://github.com/livekit/agents/compare/livekit-agents@1.2.11...livekit-agents@1.2.12
add shutdown method for AgentSession by @tinalenguyen in https://github.com/livekit/agents/pull/3429
Full Changelog: https://github.com/livekit/agents/compare/livekit-agents@1.2.9...livekit-agents@1.2.11
Nothing published for this version
OpenAI Realtime API now supports video input
Full Changelog: https://github.com/livekit/agents/compare/livekit-agents@1.2.8...livekit-agents@1.2.9
AgentSession.start() now returns a RunResult when called with capture_run=True. This makes it possible to assert the first message when the agent init
RunResult when called with capture_run=True.
This makes it possible to assert the first message when the agent initiates the conversation:result = await sess.start(EchoAgent(), capture_run=True)
result.expect.next_event().is_agent_handoff(new_agent_type=EchoAgent)
result.expect.next_event().is_message(role="assistant")
false_interruption_timeout. Audio output is paused and then resumed on the same SpeechHandle, eliminating the need to manually call generate_reply() in the agent_false_interruption event handler—please remove this call if present from earlier versions. This behavior is enabled by default; to disable automatic resume, set resume_false_interruption=False.Full Changelog: https://github.com/livekit/agents/compare/livekit-agents@1.2.7...livekit-agents@1.2.8
fix(examples): multi-user-translator: iterate over copy of keys to allow dict mutation during loop by @mike-r-mclaughlin in https://github.com/livekit
start_time, end_time, and speaker_id to 11labs SpeechData by @dvschuyl in https://github.com/livekit/agents/pull/3224min_endpointing_delay via AgentSession and configing it per-agent by @longcw in https://github.com/livekit/agents/pull/3227cancel_tool_reply to function_tools_executed event by @longcw in https://github.com/livekit/agents/pull/3177Full Changelog: https://github.com/livekit/agents/compare/livekit-agents@1.2.6...livekit-agents@1.2.7
fix: examples: multi-user-translator: fix event names and use nova-2 model explicitly by @mike-r-mclaughlin in https://github.com/livekit/agents/pull/
Full Changelog: https://github.com/livekit/agents/compare/livekit-agents@1.2.5...livekit-agents@1.2.6
> livekit-agents 1.2 introduced many new features. You can check out the changelog [here](https://github.com/livekit/agents/releases/tag/livekit-agent
[!NOTE]
livekit-agents 1.2 introduced many new features. You can check out the changelog here.
Full Changelog: https://github.com/livekit/agents/compare/livekit-agents@1.2.4...livekit-agents@1.2.5
> livekit-agents 1.2 introduced many new features. You can check out the changelog [here](https://github.com/livekit/agents/releases/tag/livekit-agent
[!NOTE]
livekit-agents 1.2 introduced many new features. You can check out the changelog here.
wait_on_enter when resuming Agent after AgentTask execution by @anishnag in https://github.com/livekit/agents/pull/3090Full Changelog: https://github.com/livekit/agents/compare/livekit-agents@1.2.3...livekit-agents@1.2.4
> livekit-agents 1.2 introduced many new features. You can check out the changelog [here](https://github.com/livekit/agents/releases/tag/livekit-agent
[!NOTE]
livekit-agents 1.2 introduced many new features. You can check out the changelog here.
previous patch version changelog here (1.2.2)
Full Changelog: https://github.com/livekit/agents/compare/livekit-agents@1.2.2...livekit-agents@1.2.3
> livekit-agents 1.2 introduced many new features. You can check out the changelog [here](https://github.com/livekit/agents/releases/tag/livekit-agent
[!NOTE]
livekit-agents 1.2 introduced many new features. You can check out the changelog here.
Waiting for the playout to finish inside the function tools could lead to deadlocks. In this version, an error will be raised instead. To wait for the assistant's spoken response prior of executing a tool, use RunContext.wait_for_playout.
@function_tool
async def my_function_tool(self, ctx: RunContext):
await ctx.wait_for_playout() # wait for the assistant's spoken response that started the execution of this tool
We're now emitting an event when the agent got interrupted, but we didn't receive any transcript. (Likely a false interruption). This is useful to "re-regenerate" an assistant reply so the agent doesn't seems stuck.
@session.on("agent_false_interruption")
def on_false_interruption(ev: AgentFalseInterruptionEvent):
session.generate_reply(instructions=ev.extra_instructions or NOT_GIVEN)
We have begun implementing conversation recording directly within the Worker. Currently, it can be accessed using the console subcommand. A future update will provide API to use this in production.
python3 examples/drive-thru/drivethru_agent.py console --record
Full Changelog: https://github.com/livekit/agents/compare/livekit-agents@1.2.0...livekit-agents@1.2.2
Nothing published for this version
You can now perform turn-by-turn evaluations on your agent interactions. Here's an example of how to validate expected behaviors:
You can now perform turn-by-turn evaluations on your agent interactions. Here's an example of how to validate expected behaviors:
result = await sess.run(user_input="Can I book an appointment? What's your availability for the next two weeks?")
result.expect.skip_next_event_if(type="message", role="assistant")
result.expect.next_event().is_function_call(name="list_available_slots")
result.expect.next_event().is_function_call_output()
await result.expect.next_event().is_message(role="assistant").judge(llm, intent="must confirm no availability")
Check out these practical examples: drive-thru, frontdesk
Documentation: https://docs.livekit.io/agents/build/testing/
This feature enables speculative initiation of LLM and TTS processing before the user's turn concludes, significantly reducing response latency by overlapping processing with user audio. Disabled by default:
session = AgentSession(..., preemptive_generation=True)
The end-of-turn model has been refined to reduce sensitivity to punctuation and better handle multilingual scenarios, notably improving Hindi language support. ' Documentation: https://docs.livekit.io/agents/build/turns/turn-detector/#supported-languages
Agent now supports tracing for LLM/TTS requests and user callbacks using OpenTelemetry. See LangFuse example for detailed implementation.
AgentTask is a new experimental subset feature allowing agents to terminate upon achieving specific goals. You can await AgentTasks directly in your workflows:
@function_tool
async def schedule_appointment(self, ctx: RunContext[Userdata], slot_id: str) -> str:
# Attempts to retrieve user email, allowing multiple agent-user interactions
email_result = await beta.workflows.GetEmailTask(chat_ctx=self.chat_ctx)
Combine Gemini or OpenAI's realtime STT/LLM with a separate TTS engine, optimizing your agent's voice interactions:
session = AgentSession(
llm=openai.realtime.RealtimeModel(modalities=["text"]),
# Alternatively: llm=google.beta.realtime.RealtimeModel(modalities=[Modality.TEXT]),
tts=openai.TTS(voice="ash"),
)
View the complete example.
Documentation: https://docs.livekit.io/agents/integrations/realtime/#separate-tts
Align transcripts accurately with speech outputs from TTS engines such as Cartesia and 11labs for improved synchronization:
session = AgentSession(..., use_tts_aligned_transcript=True)
Refer to the complete example.
Documentation: https://docs.livekit.io/agents/build/text/#tts-aligned-transcriptions
Transitioned to the Blingfire tokenization engine from the previous naive implementation, significantly enhancing handling and accuracy for multiple languages.
Full Changelog: https://github.com/livekit/agents/compare/livekit-agents@1.1.7...livekit-agents@1.2.0
fix log extra field handling in log.py by @Panmax in https://github.com/livekit/agents/pull/2875
Full Changelog: https://github.com/livekit/agents/compare/livekit-agents@1.1.6...livekit-agents@1.1.7
Fix LMNT plugin docs by @zachoverflow in https://github.com/livekit/agents/pull/2762
Full Changelog: https://github.com/livekit/agents/compare/livekit-agents@1.1.5...livekit-agents@1.1.6
Preserve original path when connecting to web socket (fix for #2700) by @arpesenti in https://github.com/livekit/agents/pull/2702
Full Changelog: https://github.com/livekit/agents/compare/livekit-agents@1.1.4...livekit-agents@1.1.5
add warning for deprecated speed and emotion control for cartesia tts by @longcw in https://github.com/livekit/agents/pull/2708
Full Changelog: https://github.com/livekit/agents/compare/livekit-agents@1.1.2...livekit-agents@1.1.4
Nothing published for this version
Add spitch optional dependency by @temibabs in https://github.com/livekit/agents/pull/2559
Full Changelog: https://github.com/livekit/agents/compare/livekit-agents@1.1.0...livekit-agents@1.1.2
Nothing published for this version
deprecate multi-segments SynthesizeStream by @theomonnom in https://github.com/livekit/agents/pull/2421
Full Changelog: https://github.com/livekit/agents/compare/livekit-agents@1.0.23...livekit-agents@1.1.0
Support empty array of parameters when using raw_schema by @koen-boost in https://github.com/livekit/agents/pull/2328
with_letta OpenAI plugin by @mattzh72 in https://github.com/livekit/agents/pull/2182arcana model to allow for synthesis of long audio by @MaCaki in https://github.com/livekit/agents/pull/2343LLM.chat by @free-soellingeraj in https://github.com/livekit/agents/pull/2353Full Changelog: https://github.com/livekit/agents/compare/livekit-agents@1.0.22...livekit-agents@1.0.23
fix user transcription forwarding order by @longcw in https://github.com/livekit/agents/pull/2279
Full Changelog: https://github.com/livekit/agents/compare/livekit-agents@1.0.21...livekit-agents@1.0.22
debug QOL by @theomonnom in https://github.com/livekit/agents/pull/2150
Full Changelog: https://github.com/livekit/agents/compare/livekit-agent@1.0.20...livekit-agents@1.0.21
Nothing published for this version
Nothing published for this version
Nothing published for this version
add bithuman deps for the plugin by @longcw in https://github.com/livekit/agents/pull/2090
Full Changelog: https://github.com/livekit/agents/compare/livekit-agents@1.0.14...livekit-agents@1.0.17
Nothing published for this version
Nothing published for this version
azure speech sdk version upgrade (>=1.41.0 to >=1.43.0) by @jayeshp19 in https://github.com/livekit/agents/pull/2008
Full Changelog: https://github.com/livekit/agents/compare/livekit-agents@1.0.13...livekit-agents@1.0.14
fix audio resampler returning corrupted audio by @theomonnom https://github.com/livekit/rust-sdks/pull/627
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Your coding agent can read these notes before it upgrades. Set up the MCP server →