pub trait CallbackHandler: Send + Sync {
Show 17 methods
// Required methods
fn on_run_start<'life0, 'life1, 'async_trait>(
&'life0 self,
run: &'life1 RunTree,
) -> Pin<Box<dyn Future<Output = ()> + Send + 'async_trait>>
where Self: 'async_trait,
'life0: 'async_trait,
'life1: 'async_trait;
fn on_run_end<'life0, 'life1, 'async_trait>(
&'life0 self,
run: &'life1 RunTree,
) -> Pin<Box<dyn Future<Output = ()> + Send + 'async_trait>>
where Self: 'async_trait,
'life0: 'async_trait,
'life1: 'async_trait;
fn on_run_error<'life0, 'life1, 'life2, 'async_trait>(
&'life0 self,
run: &'life1 RunTree,
error: &'life2 str,
) -> Pin<Box<dyn Future<Output = ()> + Send + 'async_trait>>
where Self: 'async_trait,
'life0: 'async_trait,
'life1: 'async_trait,
'life2: 'async_trait;
// Provided methods
fn on_llm_start<'life0, 'life1, 'life2, 'async_trait>(
&'life0 self,
run: &'life1 RunTree,
_messages: &'life2 [Message],
) -> Pin<Box<dyn Future<Output = ()> + Send + 'async_trait>>
where Self: 'async_trait,
'life0: 'async_trait,
'life1: 'async_trait,
'life2: 'async_trait { ... }
fn on_llm_end<'life0, 'life1, 'life2, 'async_trait>(
&'life0 self,
run: &'life1 RunTree,
_response: &'life2 str,
) -> Pin<Box<dyn Future<Output = ()> + Send + 'async_trait>>
where Self: 'async_trait,
'life0: 'async_trait,
'life1: 'async_trait,
'life2: 'async_trait { ... }
fn on_llm_new_token<'life0, 'life1, 'life2, 'async_trait>(
&'life0 self,
_run: &'life1 RunTree,
_token: &'life2 str,
) -> Pin<Box<dyn Future<Output = ()> + Send + 'async_trait>>
where Self: 'async_trait,
'life0: 'async_trait,
'life1: 'async_trait,
'life2: 'async_trait { ... }
fn on_llm_thinking<'life0, 'life1, 'life2, 'async_trait>(
&'life0 self,
_run: &'life1 RunTree,
_thinking: &'life2 str,
) -> Pin<Box<dyn Future<Output = ()> + Send + 'async_trait>>
where Self: 'async_trait,
'life0: 'async_trait,
'life1: 'async_trait,
'life2: 'async_trait { ... }
fn on_llm_error<'life0, 'life1, 'life2, 'async_trait>(
&'life0 self,
run: &'life1 RunTree,
error: &'life2 str,
) -> Pin<Box<dyn Future<Output = ()> + Send + 'async_trait>>
where Self: 'async_trait,
'life0: 'async_trait,
'life1: 'async_trait,
'life2: 'async_trait { ... }
fn on_chain_start<'life0, 'life1, 'life2, 'async_trait>(
&'life0 self,
run: &'life1 RunTree,
_inputs: &'life2 Value,
) -> Pin<Box<dyn Future<Output = ()> + Send + 'async_trait>>
where Self: 'async_trait,
'life0: 'async_trait,
'life1: 'async_trait,
'life2: 'async_trait { ... }
fn on_chain_end<'life0, 'life1, 'life2, 'async_trait>(
&'life0 self,
run: &'life1 RunTree,
_outputs: &'life2 Value,
) -> Pin<Box<dyn Future<Output = ()> + Send + 'async_trait>>
where Self: 'async_trait,
'life0: 'async_trait,
'life1: 'async_trait,
'life2: 'async_trait { ... }
fn on_chain_error<'life0, 'life1, 'life2, 'async_trait>(
&'life0 self,
run: &'life1 RunTree,
error: &'life2 str,
) -> Pin<Box<dyn Future<Output = ()> + Send + 'async_trait>>
where Self: 'async_trait,
'life0: 'async_trait,
'life1: 'async_trait,
'life2: 'async_trait { ... }
fn on_tool_start<'life0, 'life1, 'life2, 'life3, 'async_trait>(
&'life0 self,
run: &'life1 RunTree,
_tool_name: &'life2 str,
_input: &'life3 str,
) -> Pin<Box<dyn Future<Output = ()> + Send + 'async_trait>>
where Self: 'async_trait,
'life0: 'async_trait,
'life1: 'async_trait,
'life2: 'async_trait,
'life3: 'async_trait { ... }
fn on_tool_end<'life0, 'life1, 'life2, 'async_trait>(
&'life0 self,
run: &'life1 RunTree,
_output: &'life2 str,
) -> Pin<Box<dyn Future<Output = ()> + Send + 'async_trait>>
where Self: 'async_trait,
'life0: 'async_trait,
'life1: 'async_trait,
'life2: 'async_trait { ... }
fn on_tool_error<'life0, 'life1, 'life2, 'async_trait>(
&'life0 self,
run: &'life1 RunTree,
error: &'life2 str,
) -> Pin<Box<dyn Future<Output = ()> + Send + 'async_trait>>
where Self: 'async_trait,
'life0: 'async_trait,
'life1: 'async_trait,
'life2: 'async_trait { ... }
fn on_retriever_start<'life0, 'life1, 'life2, 'async_trait>(
&'life0 self,
run: &'life1 RunTree,
_query: &'life2 str,
) -> Pin<Box<dyn Future<Output = ()> + Send + 'async_trait>>
where Self: 'async_trait,
'life0: 'async_trait,
'life1: 'async_trait,
'life2: 'async_trait { ... }
fn on_retriever_end<'life0, 'life1, 'life2, 'async_trait>(
&'life0 self,
run: &'life1 RunTree,
_documents: &'life2 [Value],
) -> Pin<Box<dyn Future<Output = ()> + Send + 'async_trait>>
where Self: 'async_trait,
'life0: 'async_trait,
'life1: 'async_trait,
'life2: 'async_trait { ... }
fn on_retriever_error<'life0, 'life1, 'life2, 'async_trait>(
&'life0 self,
run: &'life1 RunTree,
error: &'life2 str,
) -> Pin<Box<dyn Future<Output = ()> + Send + 'async_trait>>
where Self: 'async_trait,
'life0: 'async_trait,
'life1: 'async_trait,
'life2: 'async_trait { ... }
}Expand description
Callback handler trait for tracing and monitoring
Implement this trait to receive callbacks during execution. Can be used for logging, tracing, monitoring, etc.
§Two information layers
The trait is split into two layers:
- Generic lifecycle layer —
on_run_start,on_run_endandon_run_errorcarry the run’s lifecycle with only theRunTree(name, type, inputs/outputs, timing). They are type-agnostic: a chain, an LLM call, a tool and a retriever all funnel through the same three hooks. - Typed payload layer —
on_llm_*,on_chain_*,on_tool_*andon_retriever_*additionally receive the type-specific payload (messages, tokens, tool name, query, …). Their default implementations delegate to the generic layer, so a handler that only cares about lifecycle may override just the three generic methods, while a handler that needs typed data overrides the typed ones.
Handlers should prefer overriding the typed methods when they need more than
lifecycle signals; the built-in FileCallbackHandler
and GenericHandler do exactly that.
Required Methods§
Sourcefn on_run_start<'life0, 'life1, 'async_trait>(
&'life0 self,
run: &'life1 RunTree,
) -> Pin<Box<dyn Future<Output = ()> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
'life1: 'async_trait,
fn on_run_start<'life0, 'life1, 'async_trait>(
&'life0 self,
run: &'life1 RunTree,
) -> Pin<Box<dyn Future<Output = ()> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
'life1: 'async_trait,
Called when any run starts
Provided Methods§
Sourcefn on_llm_start<'life0, 'life1, 'life2, 'async_trait>(
&'life0 self,
run: &'life1 RunTree,
_messages: &'life2 [Message],
) -> Pin<Box<dyn Future<Output = ()> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
'life1: 'async_trait,
'life2: 'async_trait,
fn on_llm_start<'life0, 'life1, 'life2, 'async_trait>(
&'life0 self,
run: &'life1 RunTree,
_messages: &'life2 [Message],
) -> Pin<Box<dyn Future<Output = ()> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
'life1: 'async_trait,
'life2: 'async_trait,
Called when an LLM starts
Sourcefn on_llm_end<'life0, 'life1, 'life2, 'async_trait>(
&'life0 self,
run: &'life1 RunTree,
_response: &'life2 str,
) -> Pin<Box<dyn Future<Output = ()> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
'life1: 'async_trait,
'life2: 'async_trait,
fn on_llm_end<'life0, 'life1, 'life2, 'async_trait>(
&'life0 self,
run: &'life1 RunTree,
_response: &'life2 str,
) -> Pin<Box<dyn Future<Output = ()> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
'life1: 'async_trait,
'life2: 'async_trait,
Called when an LLM ends
Sourcefn on_llm_new_token<'life0, 'life1, 'life2, 'async_trait>(
&'life0 self,
_run: &'life1 RunTree,
_token: &'life2 str,
) -> Pin<Box<dyn Future<Output = ()> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
'life1: 'async_trait,
'life2: 'async_trait,
fn on_llm_new_token<'life0, 'life1, 'life2, 'async_trait>(
&'life0 self,
_run: &'life1 RunTree,
_token: &'life2 str,
) -> Pin<Box<dyn Future<Output = ()> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
'life1: 'async_trait,
'life2: 'async_trait,
Called for each new token during streaming
Sourcefn on_llm_thinking<'life0, 'life1, 'life2, 'async_trait>(
&'life0 self,
_run: &'life1 RunTree,
_thinking: &'life2 str,
) -> Pin<Box<dyn Future<Output = ()> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
'life1: 'async_trait,
'life2: 'async_trait,
fn on_llm_thinking<'life0, 'life1, 'life2, 'async_trait>(
&'life0 self,
_run: &'life1 RunTree,
_thinking: &'life2 str,
) -> Pin<Box<dyn Future<Output = ()> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
'life1: 'async_trait,
'life2: 'async_trait,
Called for each thinking token during streaming (extended thinking).
Anthropic’s extended thinking feature emits thinking content blocks before the final text response. This callback fires for each chunk of thinking content, allowing consumers to observe the model’s reasoning process in real time.
Sourcefn on_llm_error<'life0, 'life1, 'life2, 'async_trait>(
&'life0 self,
run: &'life1 RunTree,
error: &'life2 str,
) -> Pin<Box<dyn Future<Output = ()> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
'life1: 'async_trait,
'life2: 'async_trait,
fn on_llm_error<'life0, 'life1, 'life2, 'async_trait>(
&'life0 self,
run: &'life1 RunTree,
error: &'life2 str,
) -> Pin<Box<dyn Future<Output = ()> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
'life1: 'async_trait,
'life2: 'async_trait,
Called when an LLM errors
Sourcefn on_chain_start<'life0, 'life1, 'life2, 'async_trait>(
&'life0 self,
run: &'life1 RunTree,
_inputs: &'life2 Value,
) -> Pin<Box<dyn Future<Output = ()> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
'life1: 'async_trait,
'life2: 'async_trait,
fn on_chain_start<'life0, 'life1, 'life2, 'async_trait>(
&'life0 self,
run: &'life1 RunTree,
_inputs: &'life2 Value,
) -> Pin<Box<dyn Future<Output = ()> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
'life1: 'async_trait,
'life2: 'async_trait,
Called when a chain starts
Sourcefn on_chain_end<'life0, 'life1, 'life2, 'async_trait>(
&'life0 self,
run: &'life1 RunTree,
_outputs: &'life2 Value,
) -> Pin<Box<dyn Future<Output = ()> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
'life1: 'async_trait,
'life2: 'async_trait,
fn on_chain_end<'life0, 'life1, 'life2, 'async_trait>(
&'life0 self,
run: &'life1 RunTree,
_outputs: &'life2 Value,
) -> Pin<Box<dyn Future<Output = ()> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
'life1: 'async_trait,
'life2: 'async_trait,
Called when a chain ends
Sourcefn on_chain_error<'life0, 'life1, 'life2, 'async_trait>(
&'life0 self,
run: &'life1 RunTree,
error: &'life2 str,
) -> Pin<Box<dyn Future<Output = ()> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
'life1: 'async_trait,
'life2: 'async_trait,
fn on_chain_error<'life0, 'life1, 'life2, 'async_trait>(
&'life0 self,
run: &'life1 RunTree,
error: &'life2 str,
) -> Pin<Box<dyn Future<Output = ()> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
'life1: 'async_trait,
'life2: 'async_trait,
Called when a chain errors
Sourcefn on_tool_start<'life0, 'life1, 'life2, 'life3, 'async_trait>(
&'life0 self,
run: &'life1 RunTree,
_tool_name: &'life2 str,
_input: &'life3 str,
) -> Pin<Box<dyn Future<Output = ()> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
'life1: 'async_trait,
'life2: 'async_trait,
'life3: 'async_trait,
fn on_tool_start<'life0, 'life1, 'life2, 'life3, 'async_trait>(
&'life0 self,
run: &'life1 RunTree,
_tool_name: &'life2 str,
_input: &'life3 str,
) -> Pin<Box<dyn Future<Output = ()> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
'life1: 'async_trait,
'life2: 'async_trait,
'life3: 'async_trait,
Called when a tool starts
Sourcefn on_tool_end<'life0, 'life1, 'life2, 'async_trait>(
&'life0 self,
run: &'life1 RunTree,
_output: &'life2 str,
) -> Pin<Box<dyn Future<Output = ()> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
'life1: 'async_trait,
'life2: 'async_trait,
fn on_tool_end<'life0, 'life1, 'life2, 'async_trait>(
&'life0 self,
run: &'life1 RunTree,
_output: &'life2 str,
) -> Pin<Box<dyn Future<Output = ()> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
'life1: 'async_trait,
'life2: 'async_trait,
Called when a tool ends
Sourcefn on_tool_error<'life0, 'life1, 'life2, 'async_trait>(
&'life0 self,
run: &'life1 RunTree,
error: &'life2 str,
) -> Pin<Box<dyn Future<Output = ()> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
'life1: 'async_trait,
'life2: 'async_trait,
fn on_tool_error<'life0, 'life1, 'life2, 'async_trait>(
&'life0 self,
run: &'life1 RunTree,
error: &'life2 str,
) -> Pin<Box<dyn Future<Output = ()> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
'life1: 'async_trait,
'life2: 'async_trait,
Called when a tool errors
Sourcefn on_retriever_start<'life0, 'life1, 'life2, 'async_trait>(
&'life0 self,
run: &'life1 RunTree,
_query: &'life2 str,
) -> Pin<Box<dyn Future<Output = ()> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
'life1: 'async_trait,
'life2: 'async_trait,
fn on_retriever_start<'life0, 'life1, 'life2, 'async_trait>(
&'life0 self,
run: &'life1 RunTree,
_query: &'life2 str,
) -> Pin<Box<dyn Future<Output = ()> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
'life1: 'async_trait,
'life2: 'async_trait,
Called when a retriever starts
Sourcefn on_retriever_end<'life0, 'life1, 'life2, 'async_trait>(
&'life0 self,
run: &'life1 RunTree,
_documents: &'life2 [Value],
) -> Pin<Box<dyn Future<Output = ()> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
'life1: 'async_trait,
'life2: 'async_trait,
fn on_retriever_end<'life0, 'life1, 'life2, 'async_trait>(
&'life0 self,
run: &'life1 RunTree,
_documents: &'life2 [Value],
) -> Pin<Box<dyn Future<Output = ()> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
'life1: 'async_trait,
'life2: 'async_trait,
Called when a retriever ends
Sourcefn on_retriever_error<'life0, 'life1, 'life2, 'async_trait>(
&'life0 self,
run: &'life1 RunTree,
error: &'life2 str,
) -> Pin<Box<dyn Future<Output = ()> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
'life1: 'async_trait,
'life2: 'async_trait,
fn on_retriever_error<'life0, 'life1, 'life2, 'async_trait>(
&'life0 self,
run: &'life1 RunTree,
error: &'life2 str,
) -> Pin<Box<dyn Future<Output = ()> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
'life1: 'async_trait,
'life2: 'async_trait,
Called when a retriever errors
Dyn Compatibility§
This trait is dyn compatible.
In older versions of Rust, dyn compatibility was called "object safety".