@livekit/agents@1.7.0
Introducing PII Redaction Support
This release adds PII redaction support for Agent Observability. It semantically redacts detected entities from chat history and audio recordings. It also filters sensitive data from logs and traces while retaining useful diagnostic context.
To support this feature, we renamed sensitive trace attributes and log fields emitted by the framework. If your third-party observability queries depend on these names, update them when you upgrade.
Introducing Expressive Mode
Expressive mode allows voice agents to speak with natural prosody and emotion. Speech delivery is determined by emotion tags generated from the context of the conversation. Enable expressive mode in your AgentSession:
import { inference, voice } from '@livekit/agents';
const session = new voice.AgentSession({
stt: new inference.STT({ model: 'deepgram/nova-3', language: 'multi' }),
llm: new inference.LLM({ model: 'google/gemma-4-31b-it' }),
tts: new inference.TTS({
model: 'fishaudio/s2.1-pro',
voice: 'b347db033a6549378b48d00acb0d06cd',
}),
expressive: true,
// ... vad, turnDetection
});See the documentation and the blog post for more information.
Minor Changes
- Tag content-bearing telemetry with
lk.pii.*and redact trace exception details when project or session redaction is enabled. Redacted audio uploads now require transcript uploads, Deepgram parse failures retain readable details without logging connection query parameters, and MiniMax task failure payloads no longer appear in exception messages. Dashboards and queries using the previous sensitive trace keys must migrate to theirlk.pii.*replacements. - #2100 (@chenghao-mou)
Patch Changes
-
⚠️ Remove Rime Arcana model support before Rime's cloud cutoff on August 15, 2026 at 12:00 UTC. SetmodelIdtocodawhen you upgrade. The default paths keep their established speakers for voice continuity. - #2253 (@naszzz) -
Send every field the agent_session wire format declares for chat items, and emit the telemetry chat item log with the same field names and shapes as livekit/agents. - #2247 (@u9g)
-
Wait for pending turn finalization when closing a voice session. - #2307 (@rosetta-livekit-bot)
-
Require local inference 0.2.7. - #2303 (@chenghao-mou)
-
Skip LiveKit Cloud trace, OTLP and Pino log, session report, and recording uploads after Cloud reports project data recording is disabled. - #2107 (@rosetta-livekit-bot)
-
Start answering machine detection timeouts after SIP calls are answered and settle when the participant disappears before audio arrives. - #2226 (@rosetta-livekit-bot)
-
Exclude discarded room audio from reported playback duration. The room audio queue now defaults - #2256 (@rosetta-livekit-bot)
to 200ms, matching Python. SetRoomOutputOptions.queueSizeMsto retain a larger prebuffer for
bursty TTS output. -
Add
Agent.updateOptions()for swapping STT, VAD, LLM, and TTS models at runtime, including - #2297 (@rosetta-livekit-bot)
explicitnullvalues to disable session fallback, and allow expressive TTS settings to be
updated dynamically on agents and sessions. Only the fields you pass are changed, matching
Agent.update_options()in the Python framework. -
chore(deps): update @livekit/rtc-node to 0.13.34 - #2304 (@1egoman)
Ports data streams over to the rust livekit-ffi implementation, replacing the
TypeScript one (livekit/node-sdks#697). Data streams v2 brings single-packet
streams and DEFLATE compression, roughly doubling throughput.Behavior changes worth noting for anything reading a stream:
- Errors encountered while reading an incoming stream now propagate to the
caller instead of being logged and dropped, so a handler that awaits
readAll()needs to handle rejections. Both of our stream handlers
(RoomIO.onUserTextInputandRoomSessionTransport.onByteStream) already do. - An in-flight stream is now terminated with an error when either side fully
reconnects, where previously the receiver could be handed a payload that was
silently missing the chunks lost during the outage. - Incoming streams are capped at 5gb by default, overridable per room via
dataStream.maxPayloadByteLengthonroom.connect. sendTextandsendFileaccept a newcompressoption (defaulttrue).
- Errors encountered while reading an incoming stream now propagate to the