|
|
|
@ -15,6 +15,11 @@ class BaseCallbackHandler(BaseModel, ABC):
|
|
|
|
|
ignore_chain: bool = False
|
|
|
|
|
ignore_agent: bool = False
|
|
|
|
|
|
|
|
|
|
@property
|
|
|
|
|
def always_verbose(self) -> bool:
|
|
|
|
|
"""Whether to call verbose callbacks even if verbose is False."""
|
|
|
|
|
return False
|
|
|
|
|
|
|
|
|
|
@abstractmethod
|
|
|
|
|
def on_llm_start(
|
|
|
|
|
self, serialized: Dict[str, Any], prompts: List[str], **kwargs: Any
|
|
|
|
@ -22,14 +27,11 @@ class BaseCallbackHandler(BaseModel, ABC):
|
|
|
|
|
"""Run when LLM starts running."""
|
|
|
|
|
|
|
|
|
|
@abstractmethod
|
|
|
|
|
def on_llm_end(
|
|
|
|
|
self,
|
|
|
|
|
response: LLMResult,
|
|
|
|
|
) -> None:
|
|
|
|
|
def on_llm_end(self, response: LLMResult, **kwargs: Any) -> None:
|
|
|
|
|
"""Run when LLM ends running."""
|
|
|
|
|
|
|
|
|
|
@abstractmethod
|
|
|
|
|
def on_llm_error(self, error: Exception) -> None:
|
|
|
|
|
def on_llm_error(self, error: Exception, **kwargs: Any) -> None:
|
|
|
|
|
"""Run when LLM errors."""
|
|
|
|
|
|
|
|
|
|
@abstractmethod
|
|
|
|
@ -39,11 +41,11 @@ class BaseCallbackHandler(BaseModel, ABC):
|
|
|
|
|
"""Run when chain starts running."""
|
|
|
|
|
|
|
|
|
|
@abstractmethod
|
|
|
|
|
def on_chain_end(self, outputs: Dict[str, Any]) -> None:
|
|
|
|
|
def on_chain_end(self, outputs: Dict[str, Any], **kwargs: Any) -> None:
|
|
|
|
|
"""Run when chain ends running."""
|
|
|
|
|
|
|
|
|
|
@abstractmethod
|
|
|
|
|
def on_chain_error(self, error: Exception) -> None:
|
|
|
|
|
def on_chain_error(self, error: Exception, **kwargs: Any) -> None:
|
|
|
|
|
"""Run when chain errors."""
|
|
|
|
|
|
|
|
|
|
@abstractmethod
|
|
|
|
@ -57,7 +59,7 @@ class BaseCallbackHandler(BaseModel, ABC):
|
|
|
|
|
"""Run when tool ends running."""
|
|
|
|
|
|
|
|
|
|
@abstractmethod
|
|
|
|
|
def on_tool_error(self, error: Exception) -> None:
|
|
|
|
|
def on_tool_error(self, error: Exception, **kwargs: Any) -> None:
|
|
|
|
|
"""Run when tool errors."""
|
|
|
|
|
|
|
|
|
|
@abstractmethod
|
|
|
|
@ -91,78 +93,110 @@ class CallbackManager(BaseCallbackManager):
|
|
|
|
|
handlers: List[BaseCallbackHandler]
|
|
|
|
|
|
|
|
|
|
def on_llm_start(
|
|
|
|
|
self, serialized: Dict[str, Any], prompts: List[str], **kwargs: Any
|
|
|
|
|
self,
|
|
|
|
|
serialized: Dict[str, Any],
|
|
|
|
|
prompts: List[str],
|
|
|
|
|
verbose: bool = False,
|
|
|
|
|
**kwargs: Any
|
|
|
|
|
) -> None:
|
|
|
|
|
"""Run when LLM starts running."""
|
|
|
|
|
for handler in self.handlers:
|
|
|
|
|
if not handler.ignore_llm:
|
|
|
|
|
handler.on_llm_start(serialized, prompts, **kwargs)
|
|
|
|
|
if verbose or handler.always_verbose:
|
|
|
|
|
handler.on_llm_start(serialized, prompts, **kwargs)
|
|
|
|
|
|
|
|
|
|
def on_llm_end(
|
|
|
|
|
self,
|
|
|
|
|
response: LLMResult,
|
|
|
|
|
self, response: LLMResult, verbose: bool = False, **kwargs: Any
|
|
|
|
|
) -> None:
|
|
|
|
|
"""Run when LLM ends running."""
|
|
|
|
|
for handler in self.handlers:
|
|
|
|
|
if not handler.ignore_llm:
|
|
|
|
|
handler.on_llm_end(response)
|
|
|
|
|
if verbose or handler.always_verbose:
|
|
|
|
|
handler.on_llm_end(response)
|
|
|
|
|
|
|
|
|
|
def on_llm_error(self, error: Exception) -> None:
|
|
|
|
|
def on_llm_error(
|
|
|
|
|
self, error: Exception, verbose: bool = False, **kwargs: Any
|
|
|
|
|
) -> None:
|
|
|
|
|
"""Run when LLM errors."""
|
|
|
|
|
for handler in self.handlers:
|
|
|
|
|
if not handler.ignore_llm:
|
|
|
|
|
handler.on_llm_error(error)
|
|
|
|
|
if verbose or handler.always_verbose:
|
|
|
|
|
handler.on_llm_error(error)
|
|
|
|
|
|
|
|
|
|
def on_chain_start(
|
|
|
|
|
self, serialized: Dict[str, Any], inputs: Dict[str, Any], **kwargs: Any
|
|
|
|
|
self,
|
|
|
|
|
serialized: Dict[str, Any],
|
|
|
|
|
inputs: Dict[str, Any],
|
|
|
|
|
verbose: bool = False,
|
|
|
|
|
**kwargs: Any
|
|
|
|
|
) -> None:
|
|
|
|
|
"""Run when chain starts running."""
|
|
|
|
|
for handler in self.handlers:
|
|
|
|
|
if not handler.ignore_chain:
|
|
|
|
|
handler.on_chain_start(serialized, inputs, **kwargs)
|
|
|
|
|
if verbose or handler.always_verbose:
|
|
|
|
|
handler.on_chain_start(serialized, inputs, **kwargs)
|
|
|
|
|
|
|
|
|
|
def on_chain_end(self, outputs: Dict[str, Any]) -> None:
|
|
|
|
|
def on_chain_end(
|
|
|
|
|
self, outputs: Dict[str, Any], verbose: bool = False, **kwargs: Any
|
|
|
|
|
) -> None:
|
|
|
|
|
"""Run when chain ends running."""
|
|
|
|
|
for handler in self.handlers:
|
|
|
|
|
if not handler.ignore_chain:
|
|
|
|
|
handler.on_chain_end(outputs)
|
|
|
|
|
if verbose or handler.always_verbose:
|
|
|
|
|
handler.on_chain_end(outputs)
|
|
|
|
|
|
|
|
|
|
def on_chain_error(self, error: Exception) -> None:
|
|
|
|
|
def on_chain_error(
|
|
|
|
|
self, error: Exception, verbose: bool = False, **kwargs: Any
|
|
|
|
|
) -> None:
|
|
|
|
|
"""Run when chain errors."""
|
|
|
|
|
for handler in self.handlers:
|
|
|
|
|
if not handler.ignore_chain:
|
|
|
|
|
handler.on_chain_error(error)
|
|
|
|
|
if verbose or handler.always_verbose:
|
|
|
|
|
handler.on_chain_error(error)
|
|
|
|
|
|
|
|
|
|
def on_tool_start(
|
|
|
|
|
self, serialized: Dict[str, Any], action: AgentAction, **kwargs: Any
|
|
|
|
|
self,
|
|
|
|
|
serialized: Dict[str, Any],
|
|
|
|
|
action: AgentAction,
|
|
|
|
|
verbose: bool = False,
|
|
|
|
|
**kwargs: Any
|
|
|
|
|
) -> None:
|
|
|
|
|
"""Run when tool starts running."""
|
|
|
|
|
for handler in self.handlers:
|
|
|
|
|
if not handler.ignore_agent:
|
|
|
|
|
handler.on_tool_start(serialized, action, **kwargs)
|
|
|
|
|
if verbose or handler.always_verbose:
|
|
|
|
|
handler.on_tool_start(serialized, action, **kwargs)
|
|
|
|
|
|
|
|
|
|
def on_tool_end(self, output: str, **kwargs: Any) -> None:
|
|
|
|
|
def on_tool_end(self, output: str, verbose: bool = False, **kwargs: Any) -> None:
|
|
|
|
|
"""Run when tool ends running."""
|
|
|
|
|
for handler in self.handlers:
|
|
|
|
|
if not handler.ignore_agent:
|
|
|
|
|
handler.on_tool_end(output, **kwargs)
|
|
|
|
|
if verbose or handler.always_verbose:
|
|
|
|
|
handler.on_tool_end(output, **kwargs)
|
|
|
|
|
|
|
|
|
|
def on_tool_error(self, error: Exception) -> None:
|
|
|
|
|
def on_tool_error(
|
|
|
|
|
self, error: Exception, verbose: bool = False, **kwargs: Any
|
|
|
|
|
) -> None:
|
|
|
|
|
"""Run when tool errors."""
|
|
|
|
|
for handler in self.handlers:
|
|
|
|
|
if not handler.ignore_agent:
|
|
|
|
|
handler.on_tool_error(error)
|
|
|
|
|
if verbose or handler.always_verbose:
|
|
|
|
|
handler.on_tool_error(error)
|
|
|
|
|
|
|
|
|
|
def on_text(self, text: str, **kwargs: Any) -> None:
|
|
|
|
|
def on_text(self, text: str, verbose: bool = False, **kwargs: Any) -> None:
|
|
|
|
|
"""Run on additional input from chains and agents."""
|
|
|
|
|
for handler in self.handlers:
|
|
|
|
|
handler.on_text(text, **kwargs)
|
|
|
|
|
if verbose or handler.always_verbose:
|
|
|
|
|
handler.on_text(text, **kwargs)
|
|
|
|
|
|
|
|
|
|
def on_agent_finish(self, finish: AgentFinish, **kwargs: Any) -> None:
|
|
|
|
|
def on_agent_finish(
|
|
|
|
|
self, finish: AgentFinish, verbose: bool = False, **kwargs: Any
|
|
|
|
|
) -> None:
|
|
|
|
|
"""Run on agent end."""
|
|
|
|
|
for handler in self.handlers:
|
|
|
|
|
if not handler.ignore_agent:
|
|
|
|
|
handler.on_agent_finish(finish, **kwargs)
|
|
|
|
|
if verbose or handler.always_verbose:
|
|
|
|
|
handler.on_agent_finish(finish, **kwargs)
|
|
|
|
|
|
|
|
|
|
def add_handler(self, handler: BaseCallbackHandler) -> None:
|
|
|
|
|
"""Add a handler to the callback manager."""
|
|
|
|
|