From 149ffa4f3c5863cd3c0f4d4ec02d54878d905202 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Aleix=20Conchillo=20Flaqu=C3=A9?= Date: Tue, 30 Sep 2025 13:40:48 -0700 Subject: [PATCH] RTVIObserver: add support system logs --- src/pipecat/processors/frameworks/rtvi.py | 24 +++++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/src/pipecat/processors/frameworks/rtvi.py b/src/pipecat/processors/frameworks/rtvi.py index 176005ffa..1ba799f8c 100644 --- a/src/pipecat/processors/frameworks/rtvi.py +++ b/src/pipecat/processors/frameworks/rtvi.py @@ -864,6 +864,14 @@ class RTVIBotAudioLevelMessage(BaseModel): data: RTVIAudioLevelMessageData +class RTVISystemLogMessage(BaseModel): + """Message including a system log.""" + + label: RTVIMessageLiteral = RTVI_MESSAGE_LABEL + type: Literal["system-log"] = "system-log" + data: RTVITextMessageData + + @dataclass class RTVIServerMessageFrame(SystemFrame): """A frame for sending server messages to the client. @@ -893,6 +901,7 @@ class RTVIObserverParams: user_transcription_enabled: Indicates if user's transcription messages should be sent. user_audio_level_enabled: Indicates if user's audio level messages should be sent. metrics_enabled: Indicates if metrics messages should be sent. + system_logs_enabled: Indicates if system logs should be sent. errors_enabled: [Deprecated] Indicates if errors messages should be sent. audio_level_period_secs: How often audio levels should be sent if enabled. """ @@ -906,6 +915,7 @@ class RTVIObserverParams: user_transcription_enabled: bool = True user_audio_level_enabled: bool = False metrics_enabled: bool = True + system_logs_enabled: bool = False errors_enabled: bool = True audio_level_period_secs: float = 0.15 @@ -946,6 +956,20 @@ class RTVIObserver(BaseObserver): self._last_user_audio_level = 0 self._last_bot_audio_level = 0 + if self._params.system_logs_enabled: + self._system_logger_id = logger.add(self._logger_sink) + + async def _logger_sink(self, message): + """Logger sink so we cna send system logs to RTVI clients.""" + message = RTVISystemLogMessage(data=RTVITextMessageData(text=message)) + await self.send_rtvi_message(message) + + async def cleanup(self): + """Cleanup RTVI observer resources.""" + await super().cleanup() + if self._params.system_logs_enabled: + logger.remove(self._system_logger_id) + async def send_rtvi_message(self, model: BaseModel, exclude_none: bool = True): """Send an RTVI message.