use futures::future::BoxFuture;
use crate::agent::AgentOutcome;
use crate::client::{ChatRequest, ChatResponse, TokenUsage};
use crate::ids::{RunId, SessionId};
use crate::tools::{ToolCall, ToolContext};
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct RunInfo {
pub run_id: RunId,
pub session_id: Option<SessionId>,
pub steps_used: u32,
pub max_steps: u32,
pub usage: TokenUsage,
}
#[allow(clippy::derive_partial_eq_without_eq)]
#[derive(Debug, Clone, PartialEq)]
pub enum HookAction {
Continue,
Modify(serde_json::Value),
Block(String),
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct ToolOutput {
pub content: String,
pub is_error: bool,
}
pub trait AgentHooks: Send + Sync + std::fmt::Debug {
fn before_model<'a>(
&'a self,
_request: &'a mut ChatRequest,
_info: &'a RunInfo,
) -> BoxFuture<'a, ()> {
Box::pin(std::future::ready(()))
}
fn after_model<'a>(
&'a self,
_response: &'a ChatResponse,
_info: &'a RunInfo,
) -> BoxFuture<'a, ()> {
Box::pin(std::future::ready(()))
}
fn before_tool<'a>(
&'a self,
_call: &'a ToolCall,
_ctx: &'a ToolContext,
) -> BoxFuture<'a, HookAction> {
Box::pin(std::future::ready(HookAction::Continue))
}
fn after_tool<'a>(
&'a self,
_call: &'a ToolCall,
_output: &'a ToolOutput,
_ctx: &'a ToolContext,
) -> BoxFuture<'a, ()> {
Box::pin(std::future::ready(()))
}
fn on_outcome<'a>(
&'a self,
_outcome: &'a AgentOutcome,
_info: &'a RunInfo,
) -> BoxFuture<'a, ()> {
Box::pin(std::future::ready(()))
}
}