Base Observer
All observers must inherit fromBaseObserver and can implement these methods:
on_push_frame(data: FramePushed): Called when a frame is pushed from one processor to anotheron_process_frame(data: FrameProcessed): Called when a frame is being processed by a processoron_pipeline_started(): Called after theStartFramehas been processed by all processors in the pipeline
Lifecycle and Cleanup
The pipeline callssetup() on each observer when it starts and cleanup() when it stops. If your observer spawns background work, use self.create_task() so the task is tracked by the pipeline’s task manager, and override cleanup() to cancel it. Always call super().cleanup(), which waits for any in-flight event handlers to finish.
If you give your observer a custom
__init__, you must call
super().__init__(). Skipping it leaves the observer partially initialized
and raises errors such as 'CustomObserver' object has no attribute '_name'
at runtime.Available Observers
Pipecat provides several built-in observers:- LLMLogObserver: Logs LLM activity and responses
- TranscriptionLogObserver: Logs speech-to-text transcription events
- RTVIObserver: Converts internal frames to RTVI protocol messages for server to client messaging
- StartupTimingObserver: Measures processor startup times and transport readiness
- UserBotLatencyObserver: Measures user-to-bot response latency
- TurnTrackingObserver: Tracks conversation turns and events
Using Multiple Observers
You can attach multiple observers to a pipeline worker. Each observer will be notified of all frames:Example: Debug Observer
Here’s an example observer that logs interruptions and bot speaking events:Common Use Cases
Observers are particularly useful for:- Debugging frame flow
- Logging specific events
- Monitoring pipeline behavior
- Collecting metrics
- Converting internal frames to external messages