pipecat version
0.0.98
Python version
3.12
Operating System
macOS (darwin 25.2.0)
Issue description
When using OpenAIRealtimeLLMService with turn_detection=False for push-to-talk, sending an InterruptionFrame when the bot is not actively responding causes a fatal WebSocket disconnection.
When you send a ResponseCancelEvent, the OpenAI API returns a response_cancel_not_active error, and _receive_task_handler treats all unhandled errors as fatal — exiting the receive loop and tearing down the connection. response_cancel_not_active should not be a fatal error.
Reproduction steps
- Configure
OpenAIRealtimeLLMService with turn_detection=False in AudioInput
- Start a conversation and let the bot finish its initial response
- Send an InterruptionFrame
- The InterruptionFrame triggers _handle_interruption() which sends ResponseCancelEvent even though no response is active
Expected behavior
The response_cancel_not_active error should be treated as non-fatal. The WebSocket connection should remain open and the conversation should continue normally.
Actual behavior
The receive loop in _receive_task_handler treats the error as fatal, exits the loop, and the WebSocket connection is destroyed.
Logs
pipecat version
0.0.98
Python version
3.12
Operating System
macOS (darwin 25.2.0)
Issue description
When using
OpenAIRealtimeLLMServicewithturn_detection=Falsefor push-to-talk, sending anInterruptionFramewhen the bot is not actively responding causes a fatal WebSocket disconnection.When you send a
ResponseCancelEvent, the OpenAI API returns aresponse_cancel_not_activeerror, and_receive_task_handlertreats all unhandled errors as fatal — exiting the receive loop and tearing down the connection.response_cancel_not_activeshould not be a fatal error.Reproduction steps
OpenAIRealtimeLLMServicewithturn_detection=Falsein AudioInputExpected behavior
The
response_cancel_not_activeerror should be treated as non-fatal. The WebSocket connection should remain open and the conversation should continue normally.Actual behavior
The receive loop in _receive_task_handler treats the error as fatal, exits the loop, and the WebSocket connection is destroyed.
Logs