diff --git a/src/pipecat/processors/frameworks/langchain.py b/src/pipecat/processors/frameworks/langchain.py index b8a472a3d..1ec2b8276 100644 --- a/src/pipecat/processors/frameworks/langchain.py +++ b/src/pipecat/processors/frameworks/langchain.py @@ -24,7 +24,7 @@ try: from langchain_core.messages import AIMessageChunk from langchain_core.runnables import Runnable except ModuleNotFoundError as e: - logger.exception("In order to use Langchain, you need to `pip install pipecat-ai[langchain]`. ") + logger.error("In order to use Langchain, you need to `pip install pipecat-ai[langchain]`. ") raise Exception(f"Missing module: {e}") @@ -113,6 +113,6 @@ class LangchainProcessor(FrameProcessor): except GeneratorExit: logger.warning(f"{self} generator was closed prematurely") except Exception as e: - logger.exception(f"{self} an unknown error occurred: {e}") + await self.push_error(exception=e) finally: await self.push_frame(LLMFullResponseEndFrame()) diff --git a/src/pipecat/processors/frameworks/strands_agents.py b/src/pipecat/processors/frameworks/strands_agents.py index 323a4e921..6a6302da9 100644 --- a/src/pipecat/processors/frameworks/strands_agents.py +++ b/src/pipecat/processors/frameworks/strands_agents.py @@ -23,7 +23,7 @@ try: from strands import Agent from strands.multiagent.graph import Graph except ModuleNotFoundError as e: - logger.exception("In order to use Strands Agents, you need to `pip install strands-agents`.") + logger.error("In order to use Strands Agents, you need to `pip install strands-agents`.") raise Exception(f"Missing module: {e}") @@ -143,7 +143,7 @@ class StrandsAgentsProcessor(FrameProcessor): except GeneratorExit: logger.warning(f"{self} generator was closed prematurely") except Exception as e: - logger.exception(f"{self} an unknown error occurred: {e}") + await self.push_error(exception=e) finally: if ttfb_tracking: await self.stop_ttfb_metrics() diff --git a/src/pipecat/serializers/plivo.py b/src/pipecat/serializers/plivo.py index 51ae11151..b49acc664 100644 --- a/src/pipecat/serializers/plivo.py +++ b/src/pipecat/serializers/plivo.py @@ -199,7 +199,7 @@ class PlivoFrameSerializer(FrameSerializer): ) except Exception as e: - logger.exception(f"Failed to hang up Plivo call: {e}") + logger.error(f"Failed to hang up Plivo call: {e}") async def deserialize(self, data: str | bytes) -> Frame | None: """Deserializes Plivo WebSocket data to Pipecat frames. diff --git a/src/pipecat/serializers/telnyx.py b/src/pipecat/serializers/telnyx.py index 7603c9bf7..26dca7dac 100644 --- a/src/pipecat/serializers/telnyx.py +++ b/src/pipecat/serializers/telnyx.py @@ -225,7 +225,7 @@ class TelnyxFrameSerializer(FrameSerializer): ) except Exception as e: - logger.exception(f"Failed to hang up Telnyx call: {e}") + logger.error(f"Failed to hang up Telnyx call: {e}") async def deserialize(self, data: str | bytes) -> Frame | None: """Deserializes Telnyx WebSocket data to Pipecat frames. diff --git a/src/pipecat/serializers/twilio.py b/src/pipecat/serializers/twilio.py index d61b29295..240fb2853 100644 --- a/src/pipecat/serializers/twilio.py +++ b/src/pipecat/serializers/twilio.py @@ -236,7 +236,7 @@ class TwilioFrameSerializer(FrameSerializer): ) except Exception as e: - logger.exception(f"Failed to hang up Twilio call: {e}") + logger.error(f"Failed to hang up Twilio call: {e}") async def deserialize(self, data: str | bytes) -> Frame | None: """Deserializes Twilio WebSocket data to Pipecat frames. diff --git a/src/pipecat/services/aws/llm.py b/src/pipecat/services/aws/llm.py index ccbac43b7..a3fe13892 100644 --- a/src/pipecat/services/aws/llm.py +++ b/src/pipecat/services/aws/llm.py @@ -1136,7 +1136,7 @@ class AWSBedrockLLMService(LLMService): except (ReadTimeoutError, asyncio.TimeoutError): await self._call_event_handler("on_completion_timeout") except Exception as e: - logger.exception(f"{self} exception: {e}") + await self.push_error(exception=e) finally: await self.stop_processing_metrics() await self.push_frame(LLMFullResponseEndFrame()) diff --git a/src/pipecat/services/aws/tts.py b/src/pipecat/services/aws/tts.py index f22c42399..47e40d6cf 100644 --- a/src/pipecat/services/aws/tts.py +++ b/src/pipecat/services/aws/tts.py @@ -312,7 +312,7 @@ class AWSPollyTTSService(TTSService): yield TTSStoppedFrame() except (BotoCoreError, ClientError) as error: - logger.exception(f"{self} error generating TTS: {error}") + logger.error(f"{self} error generating TTS: {error}") error_message = f"AWS Polly TTS error: {str(error)}" yield ErrorFrame(error=error_message) diff --git a/src/pipecat/services/deepgram/tts.py b/src/pipecat/services/deepgram/tts.py index f75d40b09..49e101d81 100644 --- a/src/pipecat/services/deepgram/tts.py +++ b/src/pipecat/services/deepgram/tts.py @@ -227,5 +227,5 @@ class DeepgramHttpTTSService(TTSService): yield TTSStoppedFrame() except Exception as e: - logger.exception(f"{self} exception: {e}") + logger.error(f"{self} exception: {e}") yield ErrorFrame(f"Error getting audio: {str(e)}") diff --git a/src/pipecat/services/google/llm.py b/src/pipecat/services/google/llm.py index 883932b76..4bfa7e1d7 100644 --- a/src/pipecat/services/google/llm.py +++ b/src/pipecat/services/google/llm.py @@ -793,7 +793,7 @@ class GoogleLLMService(LLMService): return generation_params.setdefault("thinking_config", {})["thinking_budget"] = 0 except Exception as e: - logger.exception(f"Failed to unset thinking budget: {e}") + logger.error(f"Failed to unset thinking budget: {e}") async def _stream_content( self, params_from_context: GeminiLLMInvocationParams @@ -983,7 +983,7 @@ class GoogleLLMService(LLMService): except DeadlineExceeded: await self._call_event_handler("on_completion_timeout") except Exception as e: - logger.exception(f"{self} exception: {e}") + logger.error(f"{self} exception: {e}") finally: if grounding_metadata and isinstance(grounding_metadata, dict): llm_search_frame = LLMSearchResponseFrame( diff --git a/src/pipecat/services/heygen/client.py b/src/pipecat/services/heygen/client.py index e142aab04..ba517090c 100644 --- a/src/pipecat/services/heygen/client.py +++ b/src/pipecat/services/heygen/client.py @@ -179,7 +179,7 @@ class HeyGenClient: await self._task_manager.cancel_task(self._event_task) self._event_task = None except Exception as e: - logger.exception(f"Exception during cleanup: {e}") + logger.error(f"Exception during cleanup: {e}") async def start(self, frame: StartFrame, audio_chunk_size: int) -> None: """Start the client and establish all necessary connections. diff --git a/src/pipecat/services/openai/tts.py b/src/pipecat/services/openai/tts.py index 23cb75324..bb2d08883 100644 --- a/src/pipecat/services/openai/tts.py +++ b/src/pipecat/services/openai/tts.py @@ -206,5 +206,5 @@ class OpenAITTSService(TTSService): yield frame yield TTSStoppedFrame() except BadRequestError as e: - logger.exception(f"{self} error generating TTS: {e}") + logger.error(f"{self} error generating TTS: {e}") yield ErrorFrame(error=f"{self} error: {e}") diff --git a/src/pipecat/services/simli/video.py b/src/pipecat/services/simli/video.py index e6514ca7b..cb3c90dad 100644 --- a/src/pipecat/services/simli/video.py +++ b/src/pipecat/services/simli/video.py @@ -256,7 +256,7 @@ class SimliVideoService(FrameProcessor): await self._simli_client.send(audioBytes) return except Exception as e: - logger.exception(f"{self} exception: {e}") + logger.error(f"{self} exception: {e}") elif isinstance(frame, TTSStoppedFrame): try: if self._previously_interrupted and len(self._audio_buffer) > 0: @@ -264,7 +264,7 @@ class SimliVideoService(FrameProcessor): self._previously_interrupted = False self._audio_buffer = bytearray() except Exception as e: - logger.exception(f"{self} exception: {e}") + logger.error(f"{self} exception: {e}") return elif isinstance(frame, (EndFrame, CancelFrame)): await self._stop() diff --git a/src/pipecat/transports/daily/transport.py b/src/pipecat/transports/daily/transport.py index d5e80aa47..b3cc8acf7 100644 --- a/src/pipecat/transports/daily/transport.py +++ b/src/pipecat/transports/daily/transport.py @@ -2565,7 +2565,7 @@ class DailyTransport(BaseTransport): except asyncio.TimeoutError: logger.error(f"Timeout handling dialin-ready event ({url})") except Exception as e: - logger.exception(f"Error handling dialin-ready event ({url}): {e}") + logger.error(f"Error handling dialin-ready event ({url}): {e}") async def _on_dialin_connected(self, data): """Handle dial-in connected events.""" diff --git a/src/pipecat/transports/smallwebrtc/connection.py b/src/pipecat/transports/smallwebrtc/connection.py index 60dd7798c..ef353417f 100644 --- a/src/pipecat/transports/smallwebrtc/connection.py +++ b/src/pipecat/transports/smallwebrtc/connection.py @@ -316,7 +316,7 @@ class SmallWebRTCConnection(BaseObject): logger.debug("Client not connected. Queuing app-message.") self._pending_app_messages.append(json_message) except Exception as e: - logger.exception(f"Error parsing JSON message {message}, {e}") + logger.error(f"Error parsing JSON message {message}, {e}") # Despite the fact that aiortc provides this listener, they don't have a status for "disconnected" # So, in case we loose connection, this event will not be triggered diff --git a/src/pipecat/transports/tavus/transport.py b/src/pipecat/transports/tavus/transport.py index 40ffeeed7..be1ff9afe 100644 --- a/src/pipecat/transports/tavus/transport.py +++ b/src/pipecat/transports/tavus/transport.py @@ -265,7 +265,7 @@ class TavusTransportClient: try: await self._client.cleanup() except Exception as e: - logger.exception(f"Exception during cleanup: {e}") + logger.error(f"Exception during cleanup: {e}") async def _on_joined(self, data): """Handle joined event.""" diff --git a/src/pipecat/utils/asyncio/task_manager.py b/src/pipecat/utils/asyncio/task_manager.py index 78c2ff0f1..cf433edb1 100644 --- a/src/pipecat/utils/asyncio/task_manager.py +++ b/src/pipecat/utils/asyncio/task_manager.py @@ -162,7 +162,7 @@ class TaskManager(BaseTaskManager): # Re-raise the exception to ensure the task is cancelled. raise except Exception as e: - logger.exception(f"{name}: unexpected exception: {e}") + logger.error(f"{name}: unexpected exception: {e}") if not self._params: raise Exception("TaskManager is not setup: unable to get event loop") @@ -197,7 +197,7 @@ class TaskManager(BaseTaskManager): # Here are sure the task is cancelled properly. pass except Exception as e: - logger.exception(f"{name}: unexpected exception while cancelling task: {e}") + logger.error(f"{name}: unexpected exception while cancelling task: {e}") except BaseException as e: logger.critical(f"{name}: fatal base exception while cancelling task: {e}") raise diff --git a/src/pipecat/utils/base_object.py b/src/pipecat/utils/base_object.py index 4a62e5e4d..bace5e64b 100644 --- a/src/pipecat/utils/base_object.py +++ b/src/pipecat/utils/base_object.py @@ -187,7 +187,7 @@ class BaseObject(ABC): else: handler(self, *args, **kwargs) except Exception as e: - logger.exception(f"Exception in event handler {event_name}: {e}") + logger.error(f"Exception in event handler {event_name}: {e}") def _event_task_finished(self, task: asyncio.Task): """Clean up completed event handler tasks.