From b6f21ab15da08a6577a6ebbcf401346229273e01 Mon Sep 17 00:00:00 2001 From: Paul Kompfner Date: Tue, 24 Feb 2026 17:07:20 -0500 Subject: [PATCH] =?UTF-8?q?Make=20`ServiceUpdateSettingsFrame`=20uninterru?= =?UTF-8?q?ptible=E2=80=94settings=20updates=20are=20generally=20independe?= =?UTF-8?q?nt=20of=20specific=20utterances.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Before this change, settings updates were often not applied. For example, a `TTSUpdateSettingsFrame` queued while the bot was speaking would only have an effect at the end of the bot's reply, and any interruption before the end of the reply would "cancel" the update. --- changelog/3819.changed.md | 4 ++++ src/pipecat/frames/frames.py | 2 +- 2 files changed, 5 insertions(+), 1 deletion(-) create mode 100644 changelog/3819.changed.md diff --git a/changelog/3819.changed.md b/changelog/3819.changed.md new file mode 100644 index 000000000..7b43c399c --- /dev/null +++ b/changelog/3819.changed.md @@ -0,0 +1,4 @@ +- `ServiceSettingsUpdateFrame`s are now `UninterruptibleFrame`s. Generally speaking, you don't want a user interruption to prevent a service setting change from going into effect. Note that you usually don't use `ServiceSettingsUpdateFrame` directly, you use one of its subclasses: + - `LLMUpdateSettingsFrame` + - `TTSUpdateSettingsFrame` + - `STTUpdateSettingsFrame` diff --git a/src/pipecat/frames/frames.py b/src/pipecat/frames/frames.py index c69ddc931..d359bcfb1 100644 --- a/src/pipecat/frames/frames.py +++ b/src/pipecat/frames/frames.py @@ -2118,7 +2118,7 @@ class TTSStoppedFrame(ControlFrame): @dataclass -class ServiceUpdateSettingsFrame(ControlFrame): +class ServiceUpdateSettingsFrame(ControlFrame, UninterruptibleFrame): """Base frame for updating service settings. Supports both a ``settings`` dict (for backward compatibility) and a