Skip to content
33 changes: 28 additions & 5 deletions langfuse/langchain/CallbackHandler.py
Original file line number Diff line number Diff line change
Expand Up @@ -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},
Expand Down Expand Up @@ -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"

Expand All @@ -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()
Expand Down Expand Up @@ -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()
Expand Down Expand Up @@ -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()
Expand Down