[LLMonitor Callback Handler]: Add error handling (#11563)

Wraps every callback handler method in error handlers to avoid breaking
users' programs when an error occurs inside the handler.

Thanks @valdo99 for the suggestion 🙂
This commit is contained in:
Hugues Chocart
2023-10-09 22:26:35 +02:00
committed by GitHub
parent 2aabfafe1e
commit 258ae1ba5f

View File

@@ -1,3 +1,4 @@
import logging
import os
import traceback
from contextvars import ContextVar
@@ -242,6 +243,7 @@ class LLMonitorCallbackHandler(BaseCallbackHandler):
metadata: Union[Dict[str, Any], None] = None,
**kwargs: Any,
) -> None:
try:
user_id = _get_user_id(metadata)
user_props = _get_user_props(metadata)
@@ -260,6 +262,8 @@ class LLMonitorCallbackHandler(BaseCallbackHandler):
event["userProps"] = user_props
self.__send_event(event)
except Exception as e:
logging.warning(f"[LLMonitor] An error occurred in on_llm_start: {e}")
def on_chat_model_start(
self,
@@ -272,6 +276,7 @@ class LLMonitorCallbackHandler(BaseCallbackHandler):
metadata: Union[Dict[str, Any], None] = None,
**kwargs: Any,
) -> Any:
try:
user_id = _get_user_id(metadata)
user_props = _get_user_props(metadata)
@@ -290,6 +295,10 @@ class LLMonitorCallbackHandler(BaseCallbackHandler):
event["userProps"] = user_props
self.__send_event(event)
except Exception as e:
logging.warning(
f"[LLMonitor] An error occurred in on_chat_model_start: " f"{e}"
)
def on_llm_end(
self,
@@ -299,6 +308,7 @@ class LLMonitorCallbackHandler(BaseCallbackHandler):
parent_run_id: Union[UUID, None] = None,
**kwargs: Any,
) -> None:
try:
token_usage = (response.llm_output or {}).get("token_usage", {})
parsed_output = [
@@ -332,6 +342,8 @@ class LLMonitorCallbackHandler(BaseCallbackHandler):
},
}
self.__send_event(event)
except Exception as e:
logging.warning(f"[LLMonitor] An error occurred in on_llm_end: {e}")
def on_tool_start(
self,
@@ -344,6 +356,7 @@ class LLMonitorCallbackHandler(BaseCallbackHandler):
metadata: Union[Dict[str, Any], None] = None,
**kwargs: Any,
) -> None:
try:
user_id = _get_user_id(metadata)
user_props = _get_user_props(metadata)
@@ -362,6 +375,8 @@ class LLMonitorCallbackHandler(BaseCallbackHandler):
event["userProps"] = user_props
self.__send_event(event)
except Exception as e:
logging.warning(f"[LLMonitor] An error occurred in on_tool_start: {e}")
def on_tool_end(
self,
@@ -372,6 +387,7 @@ class LLMonitorCallbackHandler(BaseCallbackHandler):
tags: Union[List[str], None] = None,
**kwargs: Any,
) -> None:
try:
event = {
"event": "end",
"type": "tool",
@@ -380,6 +396,8 @@ class LLMonitorCallbackHandler(BaseCallbackHandler):
"output": output,
}
self.__send_event(event)
except Exception as e:
logging.warning(f"[LLMonitor] An error occurred in on_tool_end: {e}")
def on_chain_start(
self,
@@ -392,6 +410,7 @@ class LLMonitorCallbackHandler(BaseCallbackHandler):
metadata: Union[Dict[str, Any], None] = None,
**kwargs: Any,
) -> Any:
try:
name = serialized.get("id", [None, None, None, None])[3]
type = "chain"
metadata = metadata or {}
@@ -427,6 +446,8 @@ class LLMonitorCallbackHandler(BaseCallbackHandler):
event["userProps"] = user_props
self.__send_event(event)
except Exception as e:
logging.warning(f"[LLMonitor] An error occurred in on_chain_start: {e}")
def on_chain_end(
self,
@@ -436,6 +457,7 @@ class LLMonitorCallbackHandler(BaseCallbackHandler):
parent_run_id: Union[UUID, None] = None,
**kwargs: Any,
) -> Any:
try:
event = {
"event": "end",
"type": "chain",
@@ -443,6 +465,8 @@ class LLMonitorCallbackHandler(BaseCallbackHandler):
"output": _parse_output(outputs),
}
self.__send_event(event)
except Exception as e:
logging.warning(f"[LLMonitor] An error occurred in on_chain_end: {e}")
def on_agent_action(
self,
@@ -452,6 +476,7 @@ class LLMonitorCallbackHandler(BaseCallbackHandler):
parent_run_id: Union[UUID, None] = None,
**kwargs: Any,
) -> Any:
try:
event = {
"event": "start",
"type": "tool",
@@ -461,6 +486,8 @@ class LLMonitorCallbackHandler(BaseCallbackHandler):
"input": _parse_input(action.tool_input),
}
self.__send_event(event)
except Exception as e:
logging.warning(f"[LLMonitor] An error occurred in on_agent_action: {e}")
def on_agent_finish(
self,
@@ -470,6 +497,7 @@ class LLMonitorCallbackHandler(BaseCallbackHandler):
parent_run_id: Union[UUID, None] = None,
**kwargs: Any,
) -> Any:
try:
event = {
"event": "end",
"type": "agent",
@@ -478,6 +506,8 @@ class LLMonitorCallbackHandler(BaseCallbackHandler):
"output": _parse_output(finish.return_values),
}
self.__send_event(event)
except Exception as e:
logging.warning(f"[LLMonitor] An error occurred in on_agent_finish: {e}")
def on_chain_error(
self,
@@ -487,6 +517,7 @@ class LLMonitorCallbackHandler(BaseCallbackHandler):
parent_run_id: Union[UUID, None] = None,
**kwargs: Any,
) -> Any:
try:
event = {
"event": "error",
"type": "chain",
@@ -495,6 +526,8 @@ class LLMonitorCallbackHandler(BaseCallbackHandler):
"error": {"message": str(error), "stack": traceback.format_exc()},
}
self.__send_event(event)
except Exception as e:
logging.warning(f"[LLMonitor] An error occurred in on_chain_error: {e}")
def on_tool_error(
self,
@@ -504,6 +537,7 @@ class LLMonitorCallbackHandler(BaseCallbackHandler):
parent_run_id: Union[UUID, None] = None,
**kwargs: Any,
) -> Any:
try:
event = {
"event": "error",
"type": "tool",
@@ -512,6 +546,8 @@ class LLMonitorCallbackHandler(BaseCallbackHandler):
"error": {"message": str(error), "stack": traceback.format_exc()},
}
self.__send_event(event)
except Exception as e:
logging.warning(f"[LLMonitor] An error occurred in on_tool_error: {e}")
def on_llm_error(
self,
@@ -521,6 +557,7 @@ class LLMonitorCallbackHandler(BaseCallbackHandler):
parent_run_id: Union[UUID, None] = None,
**kwargs: Any,
) -> Any:
try:
event = {
"event": "error",
"type": "llm",
@@ -529,6 +566,8 @@ class LLMonitorCallbackHandler(BaseCallbackHandler):
"error": {"message": str(error), "stack": traceback.format_exc()},
}
self.__send_event(event)
except Exception as e:
logging.warning(f"[LLMonitor] An error occurred in on_llm_error: {e}")
__all__ = ["LLMonitorCallbackHandler", "identify"]