diff --git a/changelog/4126.fixed.md b/changelog/4126.fixed.md new file mode 100644 index 000000000..205568bae --- /dev/null +++ b/changelog/4126.fixed.md @@ -0,0 +1 @@ +- Fixed ElevenLabs WebSocket disconnections (1008 "Maximum simultaneous contexts exceeded") caused by rapid user interruptions. When interruptions arrived before any TTS text was generated, phantom contexts were created on the ElevenLabs server that were never closed, eventually exceeding the 5-context limit. diff --git a/src/pipecat/services/tts_service.py b/src/pipecat/services/tts_service.py index 7a4f8dd24..c1790dce2 100644 --- a/src/pipecat/services/tts_service.py +++ b/src/pipecat/services/tts_service.py @@ -682,7 +682,12 @@ class TTSService(AIService): await self.remove_audio_context(self._turn_context_id) # Flush any pending audio so the TTS service closes the current context. - await self.flush_audio(context_id=self._turn_context_id) + # Only flush if the context was actually opened (text reached run_tts). + # When an interruption arrives before any text flows, the turn context ID + # exists but was never registered via create_audio_context, so flushing + # would send a message for a context the provider never opened. + if self._turn_context_id and self.audio_context_available(self._turn_context_id): + await self.flush_audio(context_id=self._turn_context_id) # Reset the turn context ID self._turn_context_id = None