From 62e45f466aa7abd6744c1898e965b25731630a7a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Aleix=20Conchillo=20Flaqu=C3=A9?= Date: Sun, 2 Nov 2025 00:45:27 -0700 Subject: [PATCH] EndFrame: add reason field to indicate why pipeline is being ended --- CHANGELOG.md | 3 +++ src/pipecat/frames/frames.py | 16 ++++++++++++++-- src/pipecat/pipeline/task.py | 2 +- 3 files changed, 18 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 2a6ccc102..93d43a82f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,6 +9,9 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Added +- `EndFrame` and `EndTaskFrame` have an optional `reason` field to indicate why + the pipeline is being ended. + - `CancelFrame` and `CancelTaskFrame` have an optional `reason` field to indicate why the pipeline is being canceled. This can be also specified when you cancel a task with `PipelineTask.cancel(reason="cancellation your diff --git a/src/pipecat/frames/frames.py b/src/pipecat/frames/frames.py index fd02ba52a..5db02c856 100644 --- a/src/pipecat/frames/frames.py +++ b/src/pipecat/frames/frames.py @@ -1372,9 +1372,15 @@ class EndTaskFrame(TaskFrame): This is used to notify the pipeline task that the pipeline should be closed nicely (flushing all the queued frames) by pushing an EndFrame downstream. This frame should be pushed upstream. + + Parameters: + reason: Optional reason for pushing an end frame. """ - pass + reason: Optional[str] = None + + def __str__(self): + return f"{self.name}(reason: {self.reason})" @dataclass @@ -1463,9 +1469,15 @@ class EndFrame(ControlFrame): sending frames to its output channel(s) and close all its threads. Note, that this is a control frame, which means it will be received in the order it was sent. + + Parameters: + reason: Optional reason for pushing an end frame. """ - pass + reason: Optional[str] = None + + def __str__(self): + return f"{self.name}(reason: {self.reason})" @dataclass diff --git a/src/pipecat/pipeline/task.py b/src/pipecat/pipeline/task.py index d2451bfd0..ebcb9146d 100644 --- a/src/pipecat/pipeline/task.py +++ b/src/pipecat/pipeline/task.py @@ -724,7 +724,7 @@ class PipelineTask(BasePipelineTask): if isinstance(frame, EndTaskFrame): # Tell the task we should end nicely. logger.debug(f"{self}: received end task frame {frame}") - await self.queue_frame(EndFrame()) + await self.queue_frame(EndFrame(reason=frame.reason)) elif isinstance(frame, CancelTaskFrame): # Tell the task we should end right away. logger.debug(f"{self}: received cancel task frame {frame}")