diff --git a/.changeset/agent-id-inference-header.md b/.changeset/agent-id-inference-header.md deleted file mode 100644 index d2dbf3db3..000000000 --- a/.changeset/agent-id-inference-header.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@livekit/agents': patch ---- - -Add the agent participant SID as an `X-LiveKit-Agent-Id` header on inference requests, alongside the existing room and job ID headers, when running inside a job context. diff --git a/.changeset/amd-sip-answer-gate.md b/.changeset/amd-sip-answer-gate.md deleted file mode 100644 index 32b00d5c6..000000000 --- a/.changeset/amd-sip-answer-gate.md +++ /dev/null @@ -1,11 +0,0 @@ ---- -"@livekit/agents": patch ---- - -Defer AMD listening until the participant audio track is subscribed, and for SIP participants until `sip.callStatus` is `active`, so ringback and early media no longer consume the no-speech budget. After AMD settles on a machine verdict with `interruptOnMachine`, skip the normal auto-reply triggered by user-turn completion so it no longer races with — and interrupts — the caller's own `generateReply` (e.g. leaving a voicemail). - -Complete the AMD verdict-emission port: add `waitUntilFinished` and `maxEndpointingDelayMs` options and gate emission on both post-speech silence and end-of-turn (machine/uncertain verdicts wait for the turn detector or a fallback backstop; a confident human releases on silence alone). Settle `no_speech_timeout` as `uncertain` instead of `machine-unavailable`. Treat the classifier LLM's tool calls as authoritative — no longer resurrect a verdict by parsing free-text content emitted alongside an `uncertain`/postpone tool call. - -Wire AMD into the recognition-hook layer the way the Python framework does: `AgentActivity` now drives AMD via `onUserSpeechStarted()`, `onUserSpeechEnded(silenceDurationMs)`, and `onTranscript(text, source)` from its VAD/STT hooks, instead of AMD snooping the derived `UserStateChanged`/`UserInputTranscribed` session events. This gives AMD the VAD's real `silenceDuration` directly, so post-speech timers and reported delays are anchored on the true speech-end time rather than skewed by VAD/event latency. - -Port the AMD classification prompt verbatim from the Python framework — restoring the task description, category definitions (`machine-vm` = leaving a message IS possible; `machine-unavailable` = NOT possible), and the few-shot examples that steer borderline cases (hours-of-operation → uncertain, "press 1" → machine-ivr, call-screening → machine-ivr) — and pass the raw transcript as the user message so it matches the prompt's `Input:`/`Output:` pattern. diff --git a/.changeset/avatar-wait-cleanup.md b/.changeset/avatar-wait-cleanup.md deleted file mode 100644 index d44610a65..000000000 --- a/.changeset/avatar-wait-cleanup.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@livekit/agents': patch ---- - -feat(voice/avatar): add avatar join waiting and cleanup participant on close diff --git a/.changeset/bound-session-close-shutdown.md b/.changeset/bound-session-close-shutdown.md deleted file mode 100644 index 1677b8008..000000000 --- a/.changeset/bound-session-close-shutdown.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@livekit/agents': patch ---- - -Bound AgentSession close during job shutdown so shutdown callbacks still run. diff --git a/.changeset/calm-memory-warnings.md b/.changeset/calm-memory-warnings.md deleted file mode 100644 index 3b094de13..000000000 --- a/.changeset/calm-memory-warnings.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@livekit/agents': patch ---- - -Rate-limit IPC high-memory warnings and include process context in memory logs. diff --git a/.changeset/cold-avocados-behave.md b/.changeset/cold-avocados-behave.md deleted file mode 100644 index a2eef8a7b..000000000 --- a/.changeset/cold-avocados-behave.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@livekit/agents": patch ---- - -Add Agent.create method diff --git a/.changeset/compatible-google-genai.md b/.changeset/compatible-google-genai.md deleted file mode 100644 index d0fa76e22..000000000 --- a/.changeset/compatible-google-genai.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@livekit/agents-plugin-google': patch ---- - -Require a compatible Google Gen AI SDK version. diff --git a/.changeset/fix-realtime-model-format.md b/.changeset/fix-realtime-model-format.md deleted file mode 100644 index 5092c2b55..000000000 --- a/.changeset/fix-realtime-model-format.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@livekit/agents-plugin-openai': patch ---- - -Fix trailing whitespace formatting in realtime model options diff --git a/.changeset/flush-sentinel-segments.md b/.changeset/flush-sentinel-segments.md deleted file mode 100644 index 7bd4d1bc5..000000000 --- a/.changeset/flush-sentinel-segments.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@livekit/agents': patch ---- - -Support `FlushSentinel` in voice LLM nodes to flush audio and text output per segment. diff --git a/.changeset/gemini-provider-tools.md b/.changeset/gemini-provider-tools.md deleted file mode 100644 index 3b1093432..000000000 --- a/.changeset/gemini-provider-tools.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@livekit/agents-plugin-google': minor ---- - -Add Gemini provider tools for Google Search, Google Maps, URL context, File Search, code execution, and Vertex RAG retrieval, and serialize them from `ToolContext` for Google LLM and realtime sessions. diff --git a/.changeset/google-http-options-timeout.md b/.changeset/google-http-options-timeout.md deleted file mode 100644 index fbb56871f..000000000 --- a/.changeset/google-http-options-timeout.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@livekit/agents-plugin-google': patch ---- - -Preserve Google LLM request timeout when custom HTTP options are provided. diff --git a/.changeset/granular-recording-options.md b/.changeset/granular-recording-options.md deleted file mode 100644 index a0d873259..000000000 --- a/.changeset/granular-recording-options.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@livekit/agents': patch ---- - -Support granular recording options in `AgentSession.start`. The `record` option now accepts `boolean | RecordingOptions` (`{ audio, traces, logs, transcript }`); a boolean maps to all-on/all-off and a partial object merges onto all-on, so omitted keys default to `true`. Each category independently gates audio capture, trace export, log export, and transcript upload, mirroring the Python SDK and matching the documented granular form. diff --git a/.changeset/guard-agent-sid-header.md b/.changeset/guard-agent-sid-header.md deleted file mode 100644 index 699bd626b..000000000 --- a/.changeset/guard-agent-sid-header.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@livekit/agents': patch ---- - -Guard inference agent ID header lookup until the room is connected. diff --git a/.changeset/honest-news-create.md b/.changeset/honest-news-create.md deleted file mode 100644 index d32e4c31d..000000000 --- a/.changeset/honest-news-create.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@livekit/agents-plugin-openai': patch ---- - -Add Reasoning param for gpt-realtime-2\* model family diff --git a/.changeset/honest-swans-drum.md b/.changeset/honest-swans-drum.md deleted file mode 100644 index e4782071e..000000000 --- a/.changeset/honest-swans-drum.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@livekit/agents": patch ---- - -Don't retain recorded events when recording is disabled diff --git a/.changeset/inworld-delivery-mode.md b/.changeset/inworld-delivery-mode.md deleted file mode 100644 index c02a8c94e..000000000 --- a/.changeset/inworld-delivery-mode.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@livekit/agents': patch ---- - -Add Inworld `delivery_mode` to inference TTS model options. diff --git a/.changeset/list-syntax-toolcontext.md b/.changeset/list-syntax-toolcontext.md deleted file mode 100644 index 5e854a813..000000000 --- a/.changeset/list-syntax-toolcontext.md +++ /dev/null @@ -1,16 +0,0 @@ ---- -'@livekit/agents': minor ---- - -**BREAKING**: `Agent({ tools })` and `agent.updateTools()` now accept a flat list `(FunctionTool | ProviderTool | Toolset)[]` instead of a `Record` map, and `llm.tool({ ... })` requires a `name` field. `ToolContext` is now a Python-parity class with `functionTools` / `providerTools` / `toolsets` accessors, plus `flatten()`, `hasTool(id)`, `getFunctionTool(id)`, `updateTools()`, `copy()`, and `equals()`. To match the Python reference, registering two **different** function-tool instances under the same `name` now throws `duplicate function name: ` instead of silently overriding the earlier entry; passing the **same instance** twice is a no-op. `agent.toolCtx` returns a defensive copy so callers can no longer mutate the agent's internal state. `LLM.chat({ toolCtx })` accepts either a `ToolContext` instance or a raw `(FunctionTool | ProviderTool | Toolset)[]` array (`ToolCtxInput`) and normalizes it internally, so callers don't have to construct a `ToolContext` themselves. - -Tools also expose an `id: string` field on the base `Tool` interface (parity with Python's `Tool.id` property): for `FunctionTool` it mirrors `name`, for `ProviderTool` it is the provider tool id. `ToolContext` keys and equality now use `tool.id` consistently. - -**BREAKING**: Provider tools are now modeled to match Python's `ProviderTool`: - -- `ProviderDefinedTool` is renamed to `ProviderTool`, and `isProviderDefinedTool` is renamed to `isProviderTool`. -- `ProviderTool` is now an **abstract class** (Python parity). Plugins must subclass it (`class WebSearch extends ProviderTool { ... }`) to attach provider-specific fields and serializers; bare `new ProviderTool(...)` is rejected at compile time. -- The `tool({ id })` factory overload is removed; `tool({ ... })` only creates function tools now. Construct provider tools by instantiating a `ProviderTool` subclass. -- The `ToolType` literal for provider tools is renamed from `'provider-defined'` to `'provider'`. - -`Toolset` now carries a `TOOLSET_SYMBOL` marker and is detected via a new `isToolset()` guard (consistent with `isFunctionTool` / `isProviderTool`). Existing `instanceof Toolset` checks still work, but symbol-based detection is preferred for cross-realm safety. diff --git a/.changeset/openai-provider-tools.md b/.changeset/openai-provider-tools.md deleted file mode 100644 index 8e793a935..000000000 --- a/.changeset/openai-provider-tools.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@livekit/agents-plugin-openai': minor ---- - -Add OpenAI Responses provider tools for web search, file search, and code interpreter. diff --git a/.changeset/openai-responses-phase.md b/.changeset/openai-responses-phase.md deleted file mode 100644 index 58c786772..000000000 --- a/.changeset/openai-responses-phase.md +++ /dev/null @@ -1,6 +0,0 @@ ---- -'@livekit/agents': patch -'@livekit/agents-plugin-openai': patch ---- - -Preserve OpenAI Responses assistant message phase metadata across follow-up requests. diff --git a/.changeset/port-end-call-tool.md b/.changeset/port-end-call-tool.md deleted file mode 100644 index f1646f943..000000000 --- a/.changeset/port-end-call-tool.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@livekit/agents': minor ---- - -Add beta EndCallTool for ending calls from agent tools diff --git a/.changeset/quick-meals-breathe.md b/.changeset/quick-meals-breathe.md deleted file mode 100644 index d32233b93..000000000 --- a/.changeset/quick-meals-breathe.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@livekit/agents': patch ---- - -Adds base `Toolset` support: a stateful container for a group of tools with `setup()` / `aclose()` lifecycle hooks. Toolsets can be passed directly into `Agent({ tools: [...] })` alongside individual function tools; their tools are flattened into the agent's `ToolContext` and the runtime drives `setup()` on activity start, `aclose()` on close, and a setup/close diff when `agent.updateTools()` adds or removes Toolsets mid-session. Per-toolset `setup()` errors are logged but do not abort the activity. The `IGNORE_ON_ENTER` flag is also respected for function tools nested inside a Toolset. Every LLM and realtime plugin tool builder iterates `ToolContext.flatten()` so toolset-contributed tools are correctly advertised. Also exports `ToolCalledEvent` / `ToolCompletedEvent` payload types. diff --git a/.changeset/recorder-io-session-end.md b/.changeset/recorder-io-session-end.md deleted file mode 100644 index 3bd75aa80..000000000 --- a/.changeset/recorder-io-session-end.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@livekit/agents': patch ---- - -Close active RecorderIO during job session-end cleanup before generating the session report. diff --git a/.changeset/recording-primary-session-alignment.md b/.changeset/recording-primary-session-alignment.md deleted file mode 100644 index 700f16581..000000000 --- a/.changeset/recording-primary-session-alignment.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@livekit/agents': patch ---- - -Align `AgentSession.start` recording with the Python SDK's primary-session behavior. The primary/secondary designation now happens in `start()` before `initRecording`, so a demoted secondary session never configures cloud recording. A non-primary session whose `record` argument was not explicitly given now silently disables its recording (instead of throwing); it still throws only when `record` was passed explicitly, matching Python's `record_is_given` semantics. diff --git a/.changeset/restrict-stt-pipeline-reuse.md b/.changeset/restrict-stt-pipeline-reuse.md deleted file mode 100644 index e4cab27d3..000000000 --- a/.changeset/restrict-stt-pipeline-reuse.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@livekit/agents': patch ---- - -Restrict STT pipeline reuse during handoff to agents using the default sttNode. diff --git a/.changeset/skip-empty-realtime-messages.md b/.changeset/skip-empty-realtime-messages.md deleted file mode 100644 index 9b2945234..000000000 --- a/.changeset/skip-empty-realtime-messages.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@livekit/agents-plugin-openai': patch ---- - -Skip empty OpenAI realtime chat messages when updating remote chat context. diff --git a/.changeset/soniox-exclude-test-files.md b/.changeset/soniox-exclude-test-files.md deleted file mode 100644 index 5e18194b1..000000000 --- a/.changeset/soniox-exclude-test-files.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@livekit/agents-plugin-soniox': patch ---- - -Exclude test files from the published Soniox plugin build. diff --git a/.changeset/string-realtime-status-details.md b/.changeset/string-realtime-status-details.md deleted file mode 100644 index 14e37e9b3..000000000 --- a/.changeset/string-realtime-status-details.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@livekit/agents-plugin-openai': patch ---- - -Handle string OpenAI realtime response status details. diff --git a/.changeset/tcp-session-transport.md b/.changeset/tcp-session-transport.md deleted file mode 100644 index 78c70c8d7..000000000 --- a/.changeset/tcp-session-transport.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@livekit/agents': patch ---- - -Add `TcpSessionTransport`, a `SessionTransport` that frames protobuf session messages over a raw TCP socket (4-byte big-endian length prefix, 1 MiB cap, `TCP_NODELAY`), mirroring the Python implementation. Also handle the `updateIo` session request in `SessionHost`, toggling input/output audio and transcription. This is the transport plumbing that lets a local broker (e.g. the LiveKit CLI session daemon) drive a Node agent over TCP.