use futures_util::future::BoxFuture;
use serde_json::Value;
use yapi_ai::registry::Auth;
use yapi_types::event::{AgentEvent, ToolResult};
use yapi_types::message::{AssistantMessage, Message, ToolCall, ToolResultMessage, Usage};
use yapi_types::model::Model;
#[derive(Debug)]
pub struct BeforeToolCall<'a> {
pub assistant_message: &'a AssistantMessage,
pub tool_call: &'a ToolCall,
pub args: &'a mut Value,
pub messages: &'a [Message],
pub parent_tool_call_id: Option<&'a str>,
}
#[derive(Clone, Debug, Default, PartialEq)]
pub struct Block {
pub reason: Option<String>,
pub terminate: bool,
}
#[derive(Debug)]
pub struct AfterToolCall<'a> {
pub assistant_message: &'a AssistantMessage,
pub tool_call: &'a ToolCall,
pub args: &'a Value,
pub result: &'a ToolResult,
pub is_error: bool,
pub parent_tool_call_id: Option<&'a str>,
}
#[derive(Clone, Debug, Default, PartialEq)]
pub struct ResultPatch {
pub content: Option<Vec<yapi_types::message::ContentBlock>>,
pub details: Option<Value>,
pub structured_content: Option<Value>,
pub is_error: Option<bool>,
pub usage: Option<Usage>,
pub terminate: Option<bool>,
}
#[derive(Clone, Debug, Default, PartialEq)]
pub struct TurnDecision {
pub continue_run: bool,
}
pub trait AgentHooks: Send + Sync {
fn on_event<'a>(&'a self, _event: &'a AgentEvent) -> BoxFuture<'a, ()> {
Box::pin(async {})
}
fn transform_context(&self, messages: Vec<Message>) -> BoxFuture<'_, Vec<Message>> {
Box::pin(async { messages })
}
fn convert_to_llm(&self, messages: Vec<Message>) -> Vec<Message> {
messages
}
fn auth<'a>(&'a self, _model: &'a Model) -> BoxFuture<'a, Auth> {
Box::pin(async { Auth::default() })
}
fn before_tool_call<'a>(&'a self, _call: BeforeToolCall<'a>) -> BoxFuture<'a, Option<Block>> {
Box::pin(async { None })
}
fn after_tool_call<'a>(
&'a self,
_call: AfterToolCall<'a>,
) -> BoxFuture<'a, Option<ResultPatch>> {
Box::pin(async { None })
}
fn finish_turn<'a>(
&'a self,
_message: &'a AssistantMessage,
_tool_results: &'a [ToolResultMessage],
) -> BoxFuture<'a, TurnDecision> {
Box::pin(async { TurnDecision::default() })
}
fn finish_message(&self, message: Message) -> BoxFuture<'_, Message> {
Box::pin(async { message })
}
fn complete_tool_result(&self, _message: &mut ToolResultMessage) {}
fn next_turn_messages(&self) -> BoxFuture<'_, Result<Option<Vec<Message>>, String>> {
Box::pin(async { Ok(None) })
}
fn current_tools(&self) -> BoxFuture<'_, Option<Vec<std::sync::Arc<dyn crate::Tool>>>> {
Box::pin(async { None })
}
fn steering_messages(&self) -> BoxFuture<'_, Vec<Message>> {
Box::pin(async { Vec::new() })
}
fn follow_up_messages(&self) -> BoxFuture<'_, Vec<Message>> {
Box::pin(async { Vec::new() })
}
}