Migration guide: https://docs.pipecat.ai/pipecat/migration/migration-1.0
Added
-
Updated LemonSlice transport:
- Added
on_avatar_connectedandon_avatar_disconnectedevents triggered when the avatar joins and leaves the room. - Added
api_urlparameter toLemonSliceNewSessionRequestto allow overriding the LemonSlice API endpoint. - Added support for passing arbitrary named parameters to the LemonSlice API endpoint.
(PR #3995)
- Added
-
Added Inworld Realtime LLM service with WebSocket-based cascade STT/LLM/TTS, semantic VAD, function calling, and Router support.
(PR #4140) -
⚠️ Added WebSocket-based
OpenAIResponsesLLMServiceas the new default for the OpenAI Responses API. It maintains a persistent connection towss://api.openai.com/v1/responsesand automatically usesprevious_response_idto send only incremental context, falling back to full context on reconnection or cache miss. The previous HTTP-based implementation is now available asOpenAIResponsesHttpLLMService.
(PR #4141) -
Added
group_parallel_toolsparameter toLLMService(defaultTrue). WhenTrue, all function calls from the same LLM response batch share a group ID and the LLM is triggered exactly once after the last call completes. Set toFalseto trigger inference independently for each function call result as it arrives.
(PR #4217) -
Added async function call support to
register_function()andregister_direct_function()viacancel_on_interruption=False. When set toFalse, the LLM continues the conversation immediately without waiting for the function result. The result is injected back into the context as adevelopermessage once available, triggering a new LLM inference at that point.
(PR #4217) -
Added
enable_prompt_cachingsetting toAWSBedrockLLMServicefor Bedrock ConverseStream prompt caching.
(PR #4219) -
Added support for streaming intermediate results from async function calls. Call
result_callbackmultiple times withproperties=FunctionCallResultProperties(is_final=False)to push incremental updates, then call it once more (withis_final=True, the default) to deliver the final result. Only valid for functions registered withcancel_on_interruption=False.
(PR #4230) -
Added
LLMMessagesTransformFrameto facilitate programmatically editing context in a frame-based way.The previous approach required the caller to directly grab a reference to the context object, grab a "snapshot" of its messages at that point in time, transform the messages, and then push an
LLMMessagesUpdateFramewith the transformed messages. This approach can lead to problems: what if there had already been a change to the context queued in the pipeline? The transformed messages would simply overwrite it without consideration.
(PR #4231) -
The development runner now exports a module-level
appFastAPI instance (from pipecat.runner.run import app) so you can register custom routes before callingmain().
(PR #4234) -
ToolsSchemanow acceptscustom_toolsfor OpenAI LLM services (OpenAILLMService,OpenAIResponsesLLMService,OpenAIResponsesHttpLLMService, andOpenAIRealtimeLLMService), letting you pass provider-specific tools liketool_searchalongside standard function tools.
(PR #4248) -
Added enhancements to
NvidiaTTSService:- Cross-sentence stitching: multiple sentences within an LLM turn are fed into a single
SynthesizeOnlinegRPC stream for seamless audio across sentence boundaries (requires Magpie TTS model v1.7.0+). custom_dictionaryandencodingparameters for IPA-based custom pronunciation and output audio encoding.- Metrics generation (
can_generate_metricsreturns true) andstop_all_metrics()when an audio context is interrupted. - gRPC error handling around synthesis config retrieval (
GetRivaSynthesisConfig).
(PR #4249)
- Cross-sentence stitching: multiple sentences within an LLM turn are fed into a single
-
Added
MistralTTSServicefor streaming text-to-speech using Mistral's Voxtral TTS API (voxtral-mini-tts-2603). Supports SSE-based audio streaming with automatic resampling from the API's native 24kHz to any requested sample rate. Requires themistraloptional extra (pip install pipecat-ai[mistral]).
(PR #4251) -
Added
truncate_large_valuesparameter toLLMContext.get_messages(). WhenTrue, returns compact deep copies of messages with binary data (base64 images, audio) replaced by short placeholders and long string values in LLM-specific messages recursively truncated. Useful for serialization, logging, and debugging tools.
(PR #4272) -
CartesiaSTTServicenow supports runtime settings updates (e.g. changinglanguageormodelviaSTTUpdateSettingsFrame). The service automatically reconnects with the new parameters. Previously, settings updates were silently ignored.
(PR #4282) -
Added
pcm_32000andpcm_48000sample rate support to ElevenLabs TTS services.
(PR #4293) -
Added
enable_loggingparameter toElevenLabsHttpTTSService. Set toFalseto enable zero retention mode (enterprise only).
(PR #4293)
Changed
-
Updated
onnxruntimefrom 1.23.2 to 1.24.3, adding support for Python 3.14.
(PR #3984) -
MCPClient now requires async with MCPClient(...) as mcp: or explicit start()/close() calls to manage the connection lifecycle.
(PR #4034) -
⚠️ Updated
langchainextra to require langchain 1.x (from 0.3.x), langchain-community 0.4.x (from 0.3.x), and langchain-openai 1.x (from 0.3.x). If you pin these packages in your project, update your pins accordingly.
(PR #4192) -
WebsocketServicereconnection errors are now non-fatal. When a websocket service exhausts its reconnection attempts (either via exponential backoff or quick failure detection), it emits a non-fatalErrorFrameinstead of a fatal one. This allows application-level failover (e.g.ServiceSwitcher) to handle the failure instead of killing the entire pipeline.
(PR #4201) -
Changed
GrokLLMServicedefault model fromgrok-3-betatogrok-3, now that the model is generally available.
(PR #4209) -
GoogleImageGenServicenow defaults toimagen-4.0-generate-001(previouslyimagen-3.0-generate-002).
(PR #4213) -
⚠️
BaseOpenAILLMService.get_chat_completions()now accepts anLLMContextinstead ofOpenAILLMInvocationParams. If you override this method, update your signature accordingly.
(PR #4215) -
When multiple function calls are returned in a single LLM response, by default (when
group_parallel_tools=True) the LLM is now triggered exactly once after the last call in the batch completes, rather than waiting for all function calls.
(PR #4217) -
⚠️
LLMService.function_call_timeout_secsnow defaults toNoneinstead of10.0. Deferred function calls will run indefinitely unless a timeout is explicitly set at the service level or per-call. If you relied on the previous 10-second default, passfunction_call_timeout_secs=10.0explicitly.
(PR #4224) -
Updated
NvidiaTTSService:- Made
api_keyoptional for local NIM deployments. - Voice, language, and quality can be updated without reconnecting the gRPC client; new values take effect on the next synthesis turn, not for the current turn's in-flight requests.
- Replaced per-sentence synchronous
synthesize_onlinecalls with async queue-backed gRPC streaming. - Streaming now uses asyncio tasks with explicit gRPC cancellation on interruption and stale-response filtering when a stream is aborted or replaced.
- Renamed Riva references to Nemotron Speech in docs and messages.
- Disabled automatic TTS start frames at the service level (
push_start_frame=False) and emitTTSStartedFramewhen a stitched synthesis stream is started for a context.
(PR #4249)
- Made
Removed
-
⚠️ Removed
OpenPipeLLMServiceand theopenpipeextra. OpenPipe was acquired by CoreWeave and the package is no longer maintained. If you were usingopenpipeas an LLM provider, switch to the underlying provider directly (e.g.openai). The OpenPipe interface can still be used withOpenAILLMServiceby specifying abase_url.
(PR #4191) -
⚠️ Removed
NoisereduceFilter. Use system-level noise reduction or a service-based alternative instead.
(PR #4204) -
⚠️ Removed deprecated
vad_enabledandvad_audio_passthroughtransport params.
(PR #4204) -
⚠️ Removed deprecated
camera_in_enabled,camera_in_is_live,camera_in_width,camera_in_height,camera_out_enabled,camera_out_is_live,camera_out_width,camera_out_height, andcamera_out_colortransport params. Use thevideo_in_*andvideo_out_*equivalents instead.
(PR #4204) -
⚠️ Removed
FrameProcessor.wait_for_task(). Usecreate_task()and manage tasks with the built-inTaskManagerinstead.
(PR #4204) -
⚠️ Removed deprecated transport frames:
TransportMessageFrame,TransportMessageUrgentFrame,InputTransportMessageUrgentFrame,DailyTransportMessageFrame, andDailyTransportMessageUrgentFrame. UseOutputTransportMessageFrame,OutputTransportMessageUrgentFrame,InputTransportMessageFrame,DailyOutputTransportMessageFrame, andDailyOutputTransportMessageUrgentFrameinstead.
(PR #4204) -
⚠️ Removed
create_default_resampler()frompipecat.audio.utils.
(PR #4204) -
⚠️ Removed
DailyRunner.configure_with_args(). UsePipelineRunnerwithRunnerArgumentsinstead.
(PR #4204) -
⚠️ Removed deprecated
on_pipeline_ended,on_pipeline_cancelled, andon_pipeline_stoppedevents fromPipelineTask. Useon_pipeline_finishedinstead.
(PR #4204) -
⚠️ Removed single-argument function call support from
LLMService. Functions must use named parameters instead of a singleargumentsparameter.
(PR #4204) -
⚠️ Removed
FalSmartTurnAnalyzerandLocalSmartTurnAnalyzer.
(PR #4204) -
⚠️ Removed
RTVIObserver.errors_enabledparameter.
(PR #4204) -
⚠️ Removed deprecated RTVI models, frames, and processor methods including
RTVIConfig,RTVIServiceConfig,RTVIServiceOptionConfig, variousRTVI*Datamodels,RTVIActionFrame, andRTVIProcessor.handle_function_call/handle_function_call_start. Use the updated RTVI processor API instead.
(PR #4204) -
⚠️ Removed deprecated
KeypadEntryFramealias.
(PR #4204) -
⚠️ Removed deprecated interruption frames:
StartInterruptionFrameandBotInterruptionFrame. UseInterruptionFrameandInterruptionTaskFrameinstead.
(PR #4204) -
⚠️ Removed
LLMService.request_image_frame(). Push aUserImageRequestFrameinstead.
(PR #4204) -
⚠️ Removed
TTSService.say(). Push aTTSSpeakFrameinto the pipeline instead.
(PR #4204) -
⚠️ Removed
KrispFilter. Thekrispextra has been removed frompyproject.toml.
(PR #4204) -
⚠️ Removed
AudioBufferProcessor.user_continuous_streamparameter. Useuser_audio_passthroughinstead.
(PR #4204) -
⚠️ Removed
LLMService.start_callbackparameter. Register anon_llm_response_startevent handler instead.
(PR #4204) -
⚠️ Removed deprecated
observersfield fromPipelineParams. Pass observers directly toPipelineTaskconstructor instead.
(PR #4204) -
⚠️ Removed deprecated
pipecat.services.openai_realtimepackage. Usepipecat.services.openai.realtimeinstead.
(PR #4208) -
⚠️ Removed deprecated
pipecat.services.google.llm_vertexmodule. Usepipecat.services.google.vertex.llminstead.
(PR #4208) -
⚠️ Removed deprecated
GoogleLLMOpenAIBetaServicefrompipecat.services.google.openai. UseGoogleLLMServicefrompipecat.services.google.llminstead.
(PR #4208) -
⚠️ Removed deprecated
OpenAIRealtimeBetaLLMServiceandAzureRealtimeBetaLLMService. UseOpenAIRealtimeLLMServiceandAzureRealtimeLLMServicefrompipecat.services.openai.realtimeandpipecat.services.azure.realtimeinstead.
(PR #4208) -
⚠️ Removed deprecated
pipecat.services.ai_servicesmodule. Import frompipecat.services.ai_service,pipecat.services.llm_service,pipecat.services.stt_service,pipecat.services.tts_service, etc. instead.
(PR #4208) -
⚠️ Removed deprecated
pipecat.services.gemini_multimodal_livepackage. Usepipecat.services.google.gemini_liveinstead. Note that class names no longer include "Multimodal" (e.g.GeminiMultimodalLiveLLMService→GeminiLiveLLMService).
(PR #4208) -
⚠️ Removed deprecated
pipecat.services.google.gemini_live.llm_vertexmodule. Usepipecat.services.google.gemini_live.vertex.llminstead.
(PR #4208) -
⚠️ Removed deprecated
pipecat.services.nimpackage. Usepipecat.services.nvidia.llminstead (NimLLMService→NvidiaLLMService).
(PR #4208) -
⚠️ Removed deprecated
pipecat.services.deepgram.stt_sagemakerandpipecat.services.deepgram.tts_sagemakermodules. Usepipecat.services.deepgram.sagemaker.sttandpipecat.services.deepgram.sagemaker.ttsinstead.
(PR #4208) -
⚠️ Removed deprecated
pipecat.services.aws_nova_sonicpackage. Usepipecat.services.aws.nova_sonicinstead.
(PR #4208) -
⚠️ Removed deprecated
pipecat.services.rivapackage. Usepipecat.services.nvidia.sttandpipecat.services.nvidia.ttsinstead (RivaSTTService→NvidiaSTTService,RivaTTSService→NvidiaTTSService).
(PR #4208) -
⚠️ Removed deprecated compatibility modules:
pipecat.services.openai_realtime_beta(usepipecat.services.openai.realtime),pipecat.services.openai_realtime.context,pipecat.services.openai_realtime.frames,pipecat.services.openai.realtime.context,pipecat.services.openai.realtime.frames,pipecat.services.gemini_multimodal_live(usepipecat.services.google.gemini_live),pipecat.services.aws_nova_sonic.context(usepipecat.services.aws.nova_sonic),pipecat.services.google.openaiandpipecat.services.google.llm_openai(usepipecat.services.google.llm).
(PR #4215) -
⚠️ Removed
VisionImageFrameAggregator(frompipecat.processors.aggregators.vision_image_frame). Vision/image handling is now built intoLLMContext(frompipecat.processors.aggregators.llm_context). See the12*examples for the recommended replacement pattern.
(PR #4215) -
⚠️ Removed
OpenAILLMContext,OpenAILLMContextFrame, andOpenAILLMContext.from_messages(). UseLLMContext(frompipecat.processors.aggregators.llm_context) andLLMContextFrame(frompipecat.frames.frames) instead. All services now exclusively use the universalLLMContext.From the developer's point of view, migrating will usually be a matter of going from this:
context = OpenAILLMContext(messages, tools) context_aggregator = llm.create_context_aggregator(context)
To this:
from pipecat.processors.aggregators.llm_context import LLMContext from pipecat.processors.aggregators.llm_response_universal import LLMContextAggregatorPair context = LLMContext(messages, tools) context_aggregator = LLMContextAggregatorPair(context)
(PR #4215)
-
⚠️ Removed deprecated frame types
LLMMessagesFrameandOpenAILLMContextAssistantTimestampFramefrompipecat.frames.frames. Instead ofLLMMessagesFrame, useLLMContextFramewith the new messages, orLLMMessagesUpdateFramewithrun_llm=True.
(PR #4215) -
⚠️ Removed
GatedOpenAILLMContextAggregator(frompipecat.processors.aggregators.gated_open_ai_llm_context). UseGatedLLMContextAggregator(frompipecat.processors.aggregators.gated_llm_context) instead.
(PR #4215) -
⚠️ Removed deprecated service-specific context and aggregator machinery, which was superseded by the universal
LLMContextsystem.Service-specific classes removed:
AnthropicLLMContext,AnthropicContextAggregatorPair,AWSBedrockLLMContext,AWSBedrockContextAggregatorPair,OpenAIContextAggregatorPair, and their user/assistant aggregators. Also removedcreate_context_aggregator()fromLLMService,OpenAILLMService,AnthropicLLMService, andAWSBedrockLLMService.Base aggregator classes removed (from
pipecat.processors.aggregators.llm_response):BaseLLMResponseAggregator,LLMContextResponseAggregator,LLMUserContextAggregator,LLMAssistantContextAggregator,LLMUserResponseAggregator,LLMAssistantResponseAggregator.From the developer's point of view, migrating will usually be a matter of going from this:
context = OpenAILLMContext(messages, tools) context_aggregator = llm.create_context_aggregator(context)
To this:
from pipecat.processors.aggregators.llm_context import LLMContext from pipecat.processors.aggregators.llm_response_universal import LLMContextAggregatorPair context = LLMContext(messages, tools) context_aggregator = LLMContextAggregatorPair(context)
(PR #4215)
-
⚠️ Removed deprecated service parameters and shims that have been replaced by the
settings=Service.Settings(...)pattern or direct__init__parameters:PollyTTSServicealias (useAWSTTSService)TTSService:text_aggregator,text_filterinit paramsAWSNovaSonicLLMService:send_transcription_framesinit paramDeepgramSTTService:urlinit param (usebase_url)FishAudioTTSService:modelinit param (usereference_idorsettings)GladiaSTTService:languageandconfidencefromGladiaInputParams,InputParamsclass aliasGeminiTTSService:api_keyinit paramGeminiLiveLLMService:base_urlinit param (usehttp_options)GoogleVertexLLMService:InputParamsclass withlocation/project_idfields (use direct init params);project_idis now required,locationdefaults to"us-east4"MiniMaxHttpTTSService:english_normalizationfromInputParams(usetext_normalization)SimliVideoService:simli_configinit param (useapi_key/face_id),use_turn_serverinit param;api_keyandface_idare now requiredAnthropicLLMService:enable_prompt_caching_betafromInputParams(useenable_prompt_caching)
(PR #4220)
-
⚠️ Removed deprecated
pipecat.transports.servicesandpipecat.transports.networkmodule aliases. Update imports to usepipecat.transports.daily.transport,pipecat.transports.livekit.transport,pipecat.transports.websocket.*,pipecat.transports.webrtc.*, andpipecat.transports.daily.utilsrespectively.
(PR #4225) -
⚠️ Removed deprecated
pipecat.syncpackage. Usepipecat.utils.syncinstead.
(PR #4225) -
⚠️ Removed deprecated
TranscriptionMessage,ThoughtTranscriptionMessage, andTranscriptionUpdateFramefrompipecat.frames.frames.
(PR #4228) -
⚠️ Removed deprecated
allow_interruptionsparameter fromPipelineParams,StartFrame, andFrameProcessor. Interruptions are now always allowed by default. UseLLMUserAggregator'suser_turn_strategies/user_mute_strategiesparameters to control interruption behavior.
(PR #4228) -
⚠️ Removed deprecated
STTMuteFilter,STTMuteConfig, andSTTMuteStrategyfrompipecat.processors.filters.stt_mute_filter. Usepipecat.turns.user_mutestrategies withLLMUserAggregator'suser_mute_strategiesparameter instead.
(PR #4228) -
⚠️ Removed deprecated
pipecat.processors.transcript_processormodule (TranscriptProcessor,TranscriptProcessorConfig). Use pipeline observers instead.
(PR #4228) -
⚠️ Removed deprecated
EmulateUserStartedSpeakingFrameandEmulateUserStoppedSpeakingFrameframes, and theemulatedfield fromUserStartedSpeakingFrame/UserStoppedSpeakingFrame.
(PR #4228) -
⚠️ Removed deprecated
interruption_strategiesparameter fromPipelineParams,StartFrame, andFrameProcessor. UseLLMUserAggregator'suser_turn_strategiesparameter instead.
(PR #4228) -
⚠️ Removed deprecated
pipecat.audio.interruptionsmodule (BaseInterruptionStrategy,MinWordsInterruptionStrategy). Usepipecat.turns.user_start.MinWordsUserTurnStartStrategywithLLMUserAggregator'suser_turn_strategiesparameter instead.
(PR #4228) -
⚠️ Removed deprecated
pipecat.utils.tracing.class_decoratorsmodule. Usepipecat.utils.tracing.service_decoratorsinstead.
(PR #4228) -
⚠️ Removed deprecated
add_pattern_pairmethod fromPatternPairAggregator. Useadd_patterninstead.
(PR #4228) -
⚠️ Removed deprecated
UserResponseAggregatorclass frompipecat.processors.aggregators.user_response. UseLLMUserAggregatorinstead.
(PR #4228) -
⚠️ Removed
ExternalUserTurnStrategiesand the automatic fallback to it inLLMUserAggregatorwhen aSpeechControlParamsFramewas received from the transport.
(PR #4229) -
⚠️ Removed
vad_analyzerandturn_analyzerparameters fromTransportParamsand all transport input classes, along with all deprecated VAD/turn analysis logic inBaseInputTransport. VAD and turn detection are now handled entirely byLLMUserAggregator.
(PR #4229) -
⚠️ Removed deprecated
TranscriptionUserTurnStopStrategyalias (deprecated in 0.0.102). UseSpeechTimeoutUserTurnStopStrategyinstead.
(PR #4232) -
⚠️ Removed deprecated
vad_eventssetting andshould_interruptparameter fromDeepgramSTTService(deprecated in 0.0.99). Use Silero VAD for voice activity detection instead.
(PR #4232) -
⚠️ Removed deprecated
send_transcription_framesparameter fromOpenAIRealtimeLLMService(deprecated in 0.0.92). Transcription frames are always sent.
(PR #4232) -
⚠️ Removed deprecated
UserIdleProcessor(deprecated in 0.0.100). UseLLMUserAggregatorwith theuser_idle_timeoutparameter instead.
(PR #4232) -
⚠️ Removed deprecated
UserBotLatencyLogObserver(deprecated in 0.0.102). UseUserBotLatencyObserverwith itson_latency_measuredevent handler instead.
(PR #4232) -
⚠️ Removed the
rivainstall extra. Usenvidiainstead (pip install "pipecat-ai[nvidia]").
(PR #4235) -
Removed the empty
remote-smart-turninstall extra (was already a no-op).
(PR #4235) -
⚠️ Removed
DeprecatedModuleProxyand all service__init__.pyre-export shims. Flat imports likefrom pipecat.services.openai import OpenAILLMServiceno longer work. Use the full submodule path instead:from pipecat.services.openai.llm import OpenAILLMService. This is already the established pattern across all examples and internal code.
(PR #4239) -
⚠️ Removed deprecated
PIPECAT_OBSERVER_FILESenvironment variable support. UsePIPECAT_SETUP_FILESinstead.
(PR #4267)
Fixed
-
Fixed
IdleFrameProcessorwhereasyncio.Eventwas unconditionally cleared in afinallyblock instead of only on the success path.
(PR #3796) -
Fixed MCPClient opening a new connection for every tool call instead of reusing the session.
(PR #4034) -
GoogleLLMService now applies a low-latency thinking default (
thinking_level="minimal") for Gemini 3+ Flash models.
(PR #4067) -
Fixed
WebsocketServiceentering an infinite reconnection loop when a server accepts the WebSocket handshake but immediately closes the connection (e.g. invalid API key, close code 1008). The service now detects connections that fail repeatedly within seconds of being established and stops retrying after 3 consecutive quick failures.
(PR #4201) -
Fixed
InworldHttpTTSServicestreaming responses crashing withUnicodeDecodeErrorwhen multi-byte UTF-8 characters were split across chunk boundaries. This caused TTS audio to cut off mid-sentence intermittently.
(PR #4202) -
Fixed a crash (
JSONDecodeError) when a user interruption occurs while the LLM is streaming function call arguments. Previously, the incomplete JSON arguments were passed directly tojson.loads(), causing an unhandled exception. Affected services: OpenAI, Google (OpenAI-compatible), and SambaNova.
(PR #4203) -
Fixed
BaseOutputTransportdiscarding pendingUninterruptibleFrameitems (e.g. function-call context updates) when an interruption arrived. The audio task is now kept alive and only interruptible frames are drained when uninterruptible frames are present in the queue.
(PR #4217) -
Fixed spurious LLM inference being triggered when a function call result arrived while the user was actively speaking. The context frame is now suppressed until the user stops speaking.
(PR #4217) -
Fixed
CartesiaTTSServicefailing with "Context has closed" errors when switching voice, model, or language viaTTSUpdateSettingsFrame. The service now automatically flushes the current audio context and opens a fresh one when these settings change.
(PR #4220) -
Fixed duplicate LLM replies that could occur when multiple async function call results arrived while an LLM request was already queued.
(PR #4230) -
Fixed undefined
_warn_deprecated_paramcalls inOpenAIRealtimeLLMServiceandGrokRealtimeLLMServicefor the deprecatedsession_propertiesinit parameter.
(PR #4232) -
Fixed Gemini Live bot hanging after a session resumption reconnect. Audio, video, and text input were silently dropped after reconnecting because the internal
_ready_for_realtime_inputflag was not being reset.
(PR #4242) -
Fixed
VADControllergetting stuck in theSPEAKINGstate when audio frames stop arriving mid-speech (e.g. user mutes mic). A newaudio_idle_timeoutparameter (default 1s, set to 0 to disable) forces a transition back toQUIETand emitson_speech_stoppedwhen no audio is received while speaking.
(PR #4244) -
Fixed
PipelineRunner._gc_collect()blocking the event loop by runninggc.collect()synchronously. Now offloaded viaasyncio.to_threadto avoid stalling concurrent pipeline tasks.
(PR #4255) -
Fixed
ElevenLabsTTSServiceincorrectly enablingauto_modewhen usingTextAggregationMode.TOKEN. Auto mode disables server-side buffering and is designed for complete sentences — enabling it with token streaming degraded speech quality. The default is now derived automatically from the aggregation strategy:auto_mode=TrueforSENTENCE,auto_mode=FalseforTOKEN. Callers can still override by passingauto_modeexplicitly.
(PR #4265) -
Fixed
ValueError: write to closed fileduring pipeline shutdown when observers were active. Observer proxy tasks are now cancelled before observer resources are cleaned up.
(PR #4267) -
Fixed delayed turn completion when STT transcripts arrive after the p99 timeout. Previously, a late transcript (beyond the p99 window) would fall through to the 5-second
user_turn_stop_timeoutfallback. Now the turn stop triggers immediately when the late transcript arrives.
(PR #4283) -
Fixed
ElevenLabsTTSServiceignoringenable_logging=Falseandenable_ssml_parsing=False. The truthy check treatedFalsethe same asNone(both skipped), and Python'sstr(False)produced"False"instead of the lowercase"false"expected by the API.
(PR #4293) -
Fixed
on_assistant_turn_stoppednot resetting internal state when the LLM returned no text tokens. Addedinterruptedfield toAssistantTurnStoppedMessageto indicate whether the assistant turn was interrupted.
(PR #4294) -
Fixed
LLMContextSummarizerfailing with "No messages to summarize" when usingsystem_instructioninstead of a system-role message at the start of the context. The summarizer previously scanned the entire context for the first system message, which could match a mid-conversation injection (e.g. idle notifications) instead of the initial prompt, causing the summarization range to be empty.
(PR #4295)