Middleware

Trait Middleware 

Source
pub trait Middleware:
    Send
    + Sync
    + 'static {
    // Required method
    fn name(&self) -> &str;

    // Provided methods
    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 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 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 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 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_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_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 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 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 { ... }
}
Expand description

Middleware hooks — all optional, implement only what you need.

§Examples

use async_trait::async_trait;
use gemini_adk_rs::middleware::Middleware;
use gemini_adk_rs::error::AgentError;
use gemini_genai_rs::prelude::FunctionCall;

struct AuditMiddleware;

#[async_trait]
impl Middleware for AuditMiddleware {
    fn name(&self) -> &str { "audit" }

    async fn before_tool(&self, call: &FunctionCall) -> Result<(), AgentError> {
        println!("Calling tool: {}", call.name);
        Ok(())
    }
}

Required Methods§

Source

fn name(&self) -> &str

Unique name for this middleware (used in logging/debugging).

Provided Methods§

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,

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,

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,

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,

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,

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,

Called when an agent event is emitted.

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,

Called when an agent error occurs.

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,

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,

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.

Implementors§