use std::sync::Arc;
use futures::future::BoxFuture;
use serde_json::Value;
use crate::error::Result;
use crate::genai_types::Content;
use crate::core::context::{InvocationContext, ToolContext};
use crate::core::llm_request::LlmRequest;
use crate::core::llm_response::LlmResponse;
use crate::core::tool_object::DynTool;
#[derive(Clone)]
pub struct ReadonlyContext {
pub invocation: Arc<InvocationContext>,
}
impl ReadonlyContext {
#[must_use]
pub fn new(invocation: Arc<InvocationContext>) -> Self {
Self { invocation }
}
}
#[derive(Clone)]
pub struct CallbackContext {
pub invocation: Arc<InvocationContext>,
}
impl CallbackContext {
#[must_use]
pub fn new(invocation: Arc<InvocationContext>) -> Self {
Self { invocation }
}
}
pub type BeforeAgentCallback = Arc<
dyn for<'a> Fn(&'a mut CallbackContext) -> BoxFuture<'a, Result<Option<Content>>> + Send + Sync,
>;
pub type AfterAgentCallback = BeforeAgentCallback;
pub type BeforeModelCallback = Arc<
dyn for<'a> Fn(
&'a mut CallbackContext,
&'a mut LlmRequest,
) -> BoxFuture<'a, Result<Option<LlmResponse>>>
+ Send
+ Sync,
>;
pub type AfterModelCallback = Arc<
dyn for<'a> Fn(
&'a mut CallbackContext,
&'a mut LlmResponse,
) -> BoxFuture<'a, Result<Option<LlmResponse>>>
+ Send
+ Sync,
>;
pub type OnModelErrorCallback = Arc<
dyn for<'a> Fn(
&'a mut CallbackContext,
&'a mut LlmRequest,
&'a crate::error::Error,
) -> BoxFuture<'a, Result<Option<LlmResponse>>>
+ Send
+ Sync,
>;
pub type BeforeToolCallback = Arc<
dyn for<'a> Fn(
&'a mut ToolContext,
&'a Arc<dyn DynTool>,
&'a mut Value,
) -> BoxFuture<'a, Result<Option<Value>>>
+ Send
+ Sync,
>;
pub type AfterToolCallback = Arc<
dyn for<'a> Fn(
&'a mut ToolContext,
&'a Arc<dyn DynTool>,
&'a Value,
&'a mut Value,
) -> BoxFuture<'a, Result<Option<Value>>>
+ Send
+ Sync,
>;
pub type OnToolErrorCallback = Arc<
dyn for<'a> Fn(
&'a mut ToolContext,
&'a Arc<dyn DynTool>,
&'a Value,
&'a crate::error::Error,
) -> BoxFuture<'a, Result<Option<Value>>>
+ Send
+ Sync,
>;
#[macro_export]
macro_rules! before_agent_callback {
($f:expr) => {{
let f = $f;
::std::sync::Arc::new(
move |ctx: &mut $crate::core::callback::CallbackContext| -> ::futures::future::BoxFuture<
'_,
$crate::core::Result<::std::option::Option<$crate::core::types::Content>>,
> { ::std::boxed::Box::pin((f)(ctx)) },
) as $crate::core::callback::BeforeAgentCallback
}};
}