diff --git a/langfuse/langchain/CallbackHandler.py b/langfuse/langchain/CallbackHandler.py index a2e9816da..6ed6f7339 100644 --- a/langfuse/langchain/CallbackHandler.py +++ b/langfuse/langchain/CallbackHandler.py @@ -255,11 +255,19 @@ def on_retriever_error( self._log_debug_event( "on_retriever_error", run_id, parent_run_id, error=error ) + if any(isinstance(error, t) for t in CONTROL_FLOW_EXCEPTION_TYPES): + level = "DEFAULT" + else: + level = "ERROR" + observation = self._detach_observation(run_id) if observation is not None: observation.update( - level="ERROR", + level=cast( + Optional[Literal["DEBUG", "DEFAULT", "WARNING", "ERROR"]], + level, + ), status_message=str(error), input=kwargs.get("inputs"), cost_details={"total": 0}, @@ -581,7 +589,7 @@ def on_chain_error( try: self._log_debug_event("on_chain_error", run_id, parent_run_id, error=error) if any(isinstance(error, t) for t in CONTROL_FLOW_EXCEPTION_TYPES): - level = None + level = "DEFAULT" else: level = "ERROR" @@ -593,7 +601,7 @@ def on_chain_error( Optional[Literal["DEBUG", "DEFAULT", "WARNING", "ERROR"]], level, ), - status_message=str(error) if level else None, + status_message=str(error), input=kwargs.get("inputs"), cost_details={"total": 0}, ).end() @@ -803,12 +811,20 @@ def on_tool_error( ) -> Any: try: self._log_debug_event("on_tool_error", run_id, parent_run_id, error=error) + if any(isinstance(error, t) for t in CONTROL_FLOW_EXCEPTION_TYPES): + level = "DEFAULT" + else: + level = "ERROR" + observation = self._detach_observation(run_id) if observation is not None: observation.update( + level=cast( + Optional[Literal["DEBUG", "DEFAULT", "WARNING", "ERROR"]], + level, + ), status_message=str(error), - level="ERROR", input=kwargs.get("inputs"), cost_details={"total": 0}, ).end() @@ -997,13 +1013,20 @@ def on_llm_error( ) -> Any: try: self._log_debug_event("on_llm_error", run_id, parent_run_id, error=error) + if any(isinstance(error, t) for t in CONTROL_FLOW_EXCEPTION_TYPES): + level = "DEFAULT" + else: + level = "ERROR" generation = self._detach_observation(run_id) if generation is not None: generation.update( + level=cast( + Optional[Literal["DEBUG", "DEFAULT", "WARNING", "ERROR"]], + level, + ), status_message=str(error), - level="ERROR", input=kwargs.get("inputs"), cost_details={"total": 0}, ).end()