diff --git a/src/pipecat/pipeline/task.py b/src/pipecat/pipeline/task.py index 8e35a240a..51b431e86 100644 --- a/src/pipecat/pipeline/task.py +++ b/src/pipecat/pipeline/task.py @@ -303,7 +303,7 @@ class PipelineTask(BasePipelineTask): # This task maneger will handle all the asyncio tasks created by this # PipelineTask and its frame processors. - self._task_manager = task_manager or TaskManager() + self._pipeline_task_manager = task_manager or TaskManager() # This queue is the queue used to push frames to the pipeline. self._push_queue = asyncio.Queue() @@ -386,7 +386,7 @@ class PipelineTask(BasePipelineTask): # The task observer acts as a proxy to the provided observers. This way, # we only need to pass a single observer (using the StartFrame) which # then just acts as a proxy. - self._observer = TaskObserver(observers=observers, task_manager=self._task_manager) + self._observer = TaskObserver(observers=observers) # These events can be used to check which frames make it to the source # or sink processors. Instead of calling the event handlers for every @@ -751,7 +751,7 @@ class PipelineTask(BasePipelineTask): async def _setup(self, params: PipelineTaskParams): """Set up the pipeline task and all processors.""" - await super().setup(self._task_manager) + await super().setup(self._pipeline_task_manager) mgr_params = TaskManagerParams(loop=params.loop) self.task_manager.setup(mgr_params) @@ -774,6 +774,7 @@ class PipelineTask(BasePipelineTask): await self._load_setup_files() # Start task observer. + await self._observer.setup(self.task_manager) await self._observer.start() async def _cleanup(self, cleanup_pipeline: bool): diff --git a/src/pipecat/pipeline/task_observer.py b/src/pipecat/pipeline/task_observer.py index 5b29850a6..819de93ed 100644 --- a/src/pipecat/pipeline/task_observer.py +++ b/src/pipecat/pipeline/task_observer.py @@ -17,7 +17,6 @@ from typing import Any from attr import dataclass from pipecat.observers.base_observer import BaseObserver, FrameProcessed, FramePushed -from pipecat.utils.asyncio.task_manager import BaseTaskManager @dataclass @@ -62,19 +61,16 @@ class TaskObserver(BaseObserver): self, *, observers: list[BaseObserver] | None = None, - task_manager: BaseTaskManager, **kwargs, ): """Initialize the TaskObserver. Args: observers: List of observers to manage. Defaults to empty list. - task_manager: Task manager for creating and managing observer tasks. **kwargs: Additional arguments passed to the base observer. """ super().__init__(**kwargs) self._observers = observers or [] - self._task_manager = task_manager self._proxies: dict[BaseObserver, Proxy] | None = ( None # Becomes a dict after start() is called ) @@ -106,7 +102,7 @@ class TaskObserver(BaseObserver): # Remove the proxy so it doesn't get called anymore. del self._proxies[observer] # Cancel the proxy task right away. - await self._task_manager.cancel_task(proxy.task) + await self.cancel_task(proxy.task) # Remove the observer from the list. if observer in self._observers: @@ -122,7 +118,7 @@ class TaskObserver(BaseObserver): return for proxy in self._proxies.values(): - await self._task_manager.cancel_task(proxy.task) + await self.cancel_task(proxy.task) async def cleanup(self): """Cleanup all proxy observers.""" @@ -157,9 +153,8 @@ class TaskObserver(BaseObserver): def _create_proxy(self, observer: BaseObserver) -> Proxy: """Create a proxy for a single observer.""" queue = asyncio.Queue() - task = self._task_manager.create_task( - self._proxy_task_handler(queue, observer), - f"TaskObserver::{observer}::_proxy_task_handler", + task = self.create_task( + self._proxy_task_handler(queue, observer), f"{observer}::_proxy_task_handler" ) proxy = Proxy(queue=queue, task=task, observer=observer) return proxy