@@ -15,21 +15,23 @@ class BaseCallbackHandler(BaseModel, ABC):
15
15
ignore_chain : bool = False
16
16
ignore_agent : bool = False
17
17
18
+ @property
19
+ def always_verbose (self ) -> bool :
20
+ """Whether to call verbose callbacks even if verbose is False."""
21
+ return False
22
+
18
23
@abstractmethod
19
24
def on_llm_start (
20
25
self , serialized : Dict [str , Any ], prompts : List [str ], ** kwargs : Any
21
26
) -> None :
22
27
"""Run when LLM starts running."""
23
28
24
29
@abstractmethod
25
- def on_llm_end (
26
- self ,
27
- response : LLMResult ,
28
- ) -> None :
30
+ def on_llm_end (self , response : LLMResult , ** kwargs : Any ) -> None :
29
31
"""Run when LLM ends running."""
30
32
31
33
@abstractmethod
32
- def on_llm_error (self , error : Exception ) -> None :
34
+ def on_llm_error (self , error : Exception , ** kwargs : Any ) -> None :
33
35
"""Run when LLM errors."""
34
36
35
37
@abstractmethod
@@ -39,11 +41,11 @@ def on_chain_start(
39
41
"""Run when chain starts running."""
40
42
41
43
@abstractmethod
42
- def on_chain_end (self , outputs : Dict [str , Any ]) -> None :
44
+ def on_chain_end (self , outputs : Dict [str , Any ], ** kwargs : Any ) -> None :
43
45
"""Run when chain ends running."""
44
46
45
47
@abstractmethod
46
- def on_chain_error (self , error : Exception ) -> None :
48
+ def on_chain_error (self , error : Exception , ** kwargs : Any ) -> None :
47
49
"""Run when chain errors."""
48
50
49
51
@abstractmethod
@@ -57,7 +59,7 @@ def on_tool_end(self, output: str, **kwargs: Any) -> None:
57
59
"""Run when tool ends running."""
58
60
59
61
@abstractmethod
60
- def on_tool_error (self , error : Exception ) -> None :
62
+ def on_tool_error (self , error : Exception , ** kwargs : Any ) -> None :
61
63
"""Run when tool errors."""
62
64
63
65
@abstractmethod
@@ -91,78 +93,110 @@ class CallbackManager(BaseCallbackManager):
91
93
handlers : List [BaseCallbackHandler ]
92
94
93
95
def on_llm_start (
94
- self , serialized : Dict [str , Any ], prompts : List [str ], ** kwargs : Any
96
+ self ,
97
+ serialized : Dict [str , Any ],
98
+ prompts : List [str ],
99
+ verbose : bool = False ,
100
+ ** kwargs : Any
95
101
) -> None :
96
102
"""Run when LLM starts running."""
97
103
for handler in self .handlers :
98
104
if not handler .ignore_llm :
99
- handler .on_llm_start (serialized , prompts , ** kwargs )
105
+ if verbose or handler .always_verbose :
106
+ handler .on_llm_start (serialized , prompts , ** kwargs )
100
107
101
108
def on_llm_end (
102
- self ,
103
- response : LLMResult ,
109
+ self , response : LLMResult , verbose : bool = False , ** kwargs : Any
104
110
) -> None :
105
111
"""Run when LLM ends running."""
106
112
for handler in self .handlers :
107
113
if not handler .ignore_llm :
108
- handler .on_llm_end (response )
114
+ if verbose or handler .always_verbose :
115
+ handler .on_llm_end (response )
109
116
110
- def on_llm_error (self , error : Exception ) -> None :
117
+ def on_llm_error (
118
+ self , error : Exception , verbose : bool = False , ** kwargs : Any
119
+ ) -> None :
111
120
"""Run when LLM errors."""
112
121
for handler in self .handlers :
113
122
if not handler .ignore_llm :
114
- handler .on_llm_error (error )
123
+ if verbose or handler .always_verbose :
124
+ handler .on_llm_error (error )
115
125
116
126
def on_chain_start (
117
- self , serialized : Dict [str , Any ], inputs : Dict [str , Any ], ** kwargs : Any
127
+ self ,
128
+ serialized : Dict [str , Any ],
129
+ inputs : Dict [str , Any ],
130
+ verbose : bool = False ,
131
+ ** kwargs : Any
118
132
) -> None :
119
133
"""Run when chain starts running."""
120
134
for handler in self .handlers :
121
135
if not handler .ignore_chain :
122
- handler .on_chain_start (serialized , inputs , ** kwargs )
136
+ if verbose or handler .always_verbose :
137
+ handler .on_chain_start (serialized , inputs , ** kwargs )
123
138
124
- def on_chain_end (self , outputs : Dict [str , Any ]) -> None :
139
+ def on_chain_end (
140
+ self , outputs : Dict [str , Any ], verbose : bool = False , ** kwargs : Any
141
+ ) -> None :
125
142
"""Run when chain ends running."""
126
143
for handler in self .handlers :
127
144
if not handler .ignore_chain :
128
- handler .on_chain_end (outputs )
145
+ if verbose or handler .always_verbose :
146
+ handler .on_chain_end (outputs )
129
147
130
- def on_chain_error (self , error : Exception ) -> None :
148
+ def on_chain_error (
149
+ self , error : Exception , verbose : bool = False , ** kwargs : Any
150
+ ) -> None :
131
151
"""Run when chain errors."""
132
152
for handler in self .handlers :
133
153
if not handler .ignore_chain :
134
- handler .on_chain_error (error )
154
+ if verbose or handler .always_verbose :
155
+ handler .on_chain_error (error )
135
156
136
157
def on_tool_start (
137
- self , serialized : Dict [str , Any ], action : AgentAction , ** kwargs : Any
158
+ self ,
159
+ serialized : Dict [str , Any ],
160
+ action : AgentAction ,
161
+ verbose : bool = False ,
162
+ ** kwargs : Any
138
163
) -> None :
139
164
"""Run when tool starts running."""
140
165
for handler in self .handlers :
141
166
if not handler .ignore_agent :
142
- handler .on_tool_start (serialized , action , ** kwargs )
167
+ if verbose or handler .always_verbose :
168
+ handler .on_tool_start (serialized , action , ** kwargs )
143
169
144
- def on_tool_end (self , output : str , ** kwargs : Any ) -> None :
170
+ def on_tool_end (self , output : str , verbose : bool = False , ** kwargs : Any ) -> None :
145
171
"""Run when tool ends running."""
146
172
for handler in self .handlers :
147
173
if not handler .ignore_agent :
148
- handler .on_tool_end (output , ** kwargs )
174
+ if verbose or handler .always_verbose :
175
+ handler .on_tool_end (output , ** kwargs )
149
176
150
- def on_tool_error (self , error : Exception ) -> None :
177
+ def on_tool_error (
178
+ self , error : Exception , verbose : bool = False , ** kwargs : Any
179
+ ) -> None :
151
180
"""Run when tool errors."""
152
181
for handler in self .handlers :
153
182
if not handler .ignore_agent :
154
- handler .on_tool_error (error )
183
+ if verbose or handler .always_verbose :
184
+ handler .on_tool_error (error )
155
185
156
- def on_text (self , text : str , ** kwargs : Any ) -> None :
186
+ def on_text (self , text : str , verbose : bool = False , ** kwargs : Any ) -> None :
157
187
"""Run on additional input from chains and agents."""
158
188
for handler in self .handlers :
159
- handler .on_text (text , ** kwargs )
189
+ if verbose or handler .always_verbose :
190
+ handler .on_text (text , ** kwargs )
160
191
161
- def on_agent_finish (self , finish : AgentFinish , ** kwargs : Any ) -> None :
192
+ def on_agent_finish (
193
+ self , finish : AgentFinish , verbose : bool = False , ** kwargs : Any
194
+ ) -> None :
162
195
"""Run on agent end."""
163
196
for handler in self .handlers :
164
197
if not handler .ignore_agent :
165
- handler .on_agent_finish (finish , ** kwargs )
198
+ if verbose or handler .always_verbose :
199
+ handler .on_agent_finish (finish , ** kwargs )
166
200
167
201
def add_handler (self , handler : BaseCallbackHandler ) -> None :
168
202
"""Add a handler to the callback manager."""
0 commit comments