pub struct RetryMiddleware { /* private fields */ }Expand description
Advisory middleware that tracks errors and provides retry guidance.
The Middleware trait hooks are lifecycle callbacks, not control-flow points.
RetryMiddleware counts errors via Middleware::on_error and exposes a
RetryMiddleware::should_retry method the caller can query to decide
whether to re-invoke the agent.
§Examples
ⓘ
use std::sync::Arc;
use gemini_adk_rs::middleware::RetryMiddleware;
let retry = Arc::new(RetryMiddleware::new(3));
// ... run agent, on_error is called by the middleware chain ...
while retry.should_retry() {
retry.record_attempt();
// re-run the agent
}Implementations§
Source§impl RetryMiddleware
impl RetryMiddleware
Sourcepub fn new(max_retries: u32) -> Self
pub fn new(max_retries: u32) -> Self
Create a new retry middleware with the given maximum retry count.
Sourcepub fn should_retry(&self) -> bool
pub fn should_retry(&self) -> bool
Returns true if the number of attempts is below max_retries
and at least one error has been recorded since the last reset.
Sourcepub fn record_attempt(&self)
pub fn record_attempt(&self)
Record that a retry attempt is being made. Call this before re-invoking the agent.
Sourcepub fn max_retries(&self) -> u32
pub fn max_retries(&self) -> u32
Returns the configured maximum number of retries.
Trait Implementations§
Source§impl Middleware for RetryMiddleware
impl Middleware for RetryMiddleware
Source§fn on_error<'life0, 'life1, 'async_trait>(
&'life0 self,
_err: &'life1 AgentError,
) -> Pin<Box<dyn Future<Output = Result<(), AgentError>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
'life1: 'async_trait,
fn on_error<'life0, 'life1, 'async_trait>(
&'life0 self,
_err: &'life1 AgentError,
) -> Pin<Box<dyn Future<Output = Result<(), AgentError>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
'life1: 'async_trait,
Called when an agent error occurs.
Source§fn before_agent<'life0, 'life1, 'async_trait>(
&'life0 self,
_ctx: &'life1 InvocationContext,
) -> Pin<Box<dyn Future<Output = Result<(), AgentError>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
'life1: 'async_trait,
fn before_agent<'life0, 'life1, 'async_trait>(
&'life0 self,
_ctx: &'life1 InvocationContext,
) -> Pin<Box<dyn Future<Output = Result<(), AgentError>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
'life1: 'async_trait,
Called before an agent begins execution.
Source§fn after_agent<'life0, 'life1, 'async_trait>(
&'life0 self,
_ctx: &'life1 InvocationContext,
) -> Pin<Box<dyn Future<Output = Result<(), AgentError>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
'life1: 'async_trait,
fn after_agent<'life0, 'life1, 'async_trait>(
&'life0 self,
_ctx: &'life1 InvocationContext,
) -> Pin<Box<dyn Future<Output = Result<(), AgentError>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
'life1: 'async_trait,
Called after an agent completes execution.
Source§fn before_tool<'life0, 'life1, 'async_trait>(
&'life0 self,
_call: &'life1 FunctionCall,
) -> Pin<Box<dyn Future<Output = Result<(), AgentError>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
'life1: 'async_trait,
fn before_tool<'life0, 'life1, 'async_trait>(
&'life0 self,
_call: &'life1 FunctionCall,
) -> Pin<Box<dyn Future<Output = Result<(), AgentError>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
'life1: 'async_trait,
Called before a tool is invoked.
Source§fn after_tool<'life0, 'life1, 'life2, 'async_trait>(
&'life0 self,
_call: &'life1 FunctionCall,
_result: &'life2 Value,
) -> Pin<Box<dyn Future<Output = Result<(), AgentError>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
'life1: 'async_trait,
'life2: 'async_trait,
fn after_tool<'life0, 'life1, 'life2, 'async_trait>(
&'life0 self,
_call: &'life1 FunctionCall,
_result: &'life2 Value,
) -> Pin<Box<dyn Future<Output = Result<(), AgentError>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
'life1: 'async_trait,
'life2: 'async_trait,
Called after a tool completes successfully.
Source§fn on_tool_error<'life0, 'life1, 'life2, 'async_trait>(
&'life0 self,
_call: &'life1 FunctionCall,
_err: &'life2 ToolError,
) -> Pin<Box<dyn Future<Output = Result<(), AgentError>> + 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,
_call: &'life1 FunctionCall,
_err: &'life2 ToolError,
) -> Pin<Box<dyn Future<Output = Result<(), AgentError>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
'life1: 'async_trait,
'life2: 'async_trait,
Called when a tool execution fails.
Source§fn on_event<'life0, 'life1, 'async_trait>(
&'life0 self,
_event: &'life1 AgentEvent,
) -> Pin<Box<dyn Future<Output = Result<(), AgentError>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
'life1: 'async_trait,
fn on_event<'life0, 'life1, 'async_trait>(
&'life0 self,
_event: &'life1 AgentEvent,
) -> Pin<Box<dyn Future<Output = Result<(), AgentError>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
'life1: 'async_trait,
Called when an agent event is emitted.
Source§fn before_model<'life0, 'life1, 'async_trait>(
&'life0 self,
_request: &'life1 LlmRequest,
) -> Pin<Box<dyn Future<Output = Result<Option<LlmResponse>, AgentError>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
'life1: 'async_trait,
fn before_model<'life0, 'life1, 'async_trait>(
&'life0 self,
_request: &'life1 LlmRequest,
) -> Pin<Box<dyn Future<Output = Result<Option<LlmResponse>, AgentError>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
'life1: 'async_trait,
Called before an LLM model call is made. Return
Some(LlmResponse) to skip the LLM call
and use the returned response instead (e.g., for caching, guardrails). Return None to proceed.Source§fn after_model<'life0, 'life1, 'life2, 'async_trait>(
&'life0 self,
_request: &'life1 LlmRequest,
_response: &'life2 LlmResponse,
) -> Pin<Box<dyn Future<Output = Result<Option<LlmResponse>, AgentError>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
'life1: 'async_trait,
'life2: 'async_trait,
fn after_model<'life0, 'life1, 'life2, 'async_trait>(
&'life0 self,
_request: &'life1 LlmRequest,
_response: &'life2 LlmResponse,
) -> Pin<Box<dyn Future<Output = Result<Option<LlmResponse>, AgentError>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
'life1: 'async_trait,
'life2: 'async_trait,
Called after an LLM model call completes. Return
Some(LlmResponse) to replace the model’s
response (e.g., for output filtering, safety). Return None to use the original response.Auto Trait Implementations§
impl !Freeze for RetryMiddleware
impl RefUnwindSafe for RetryMiddleware
impl Send for RetryMiddleware
impl Sync for RetryMiddleware
impl Unpin for RetryMiddleware
impl UnwindSafe for RetryMiddleware
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Mutably borrows from an owned value. Read more