use crate::{CallbackContext, Content, LlmRequest, LlmResponse, ReadonlyContext, Result, Tool};
use std::future::Future;
use std::pin::Pin;
use std::sync::Arc;
pub type BeforeAgentCallback = Box<
dyn Fn(
Arc<dyn CallbackContext>,
) -> Pin<Box<dyn Future<Output = Result<Option<Content>>> + Send>>
+ Send
+ Sync,
>;
pub type AfterAgentCallback = Box<
dyn Fn(
Arc<dyn CallbackContext>,
) -> Pin<Box<dyn Future<Output = Result<Option<Content>>> + Send>>
+ Send
+ Sync,
>;
#[derive(Debug)]
pub enum BeforeModelResult {
Continue(LlmRequest),
Skip(LlmResponse),
}
pub type BeforeModelCallback = Box<
dyn Fn(
Arc<dyn CallbackContext>,
LlmRequest,
) -> Pin<Box<dyn Future<Output = Result<BeforeModelResult>> + Send>>
+ Send
+ Sync,
>;
pub type AfterModelCallback = Box<
dyn Fn(
Arc<dyn CallbackContext>,
LlmResponse,
) -> Pin<Box<dyn Future<Output = Result<Option<LlmResponse>>> + Send>>
+ Send
+ Sync,
>;
pub type BeforeToolCallback = Box<
dyn Fn(
Arc<dyn CallbackContext>,
) -> Pin<Box<dyn Future<Output = Result<Option<Content>>> + Send>>
+ Send
+ Sync,
>;
pub type AfterToolCallback = Box<
dyn Fn(
Arc<dyn CallbackContext>,
) -> Pin<Box<dyn Future<Output = Result<Option<Content>>> + Send>>
+ Send
+ Sync,
>;
pub type AfterToolCallbackFull = Box<
dyn Fn(
Arc<dyn CallbackContext>,
Arc<dyn Tool>,
serde_json::Value, // args
serde_json::Value, // tool response (success result or error JSON)
) -> Pin<Box<dyn Future<Output = Result<Option<serde_json::Value>>> + Send>>
+ Send
+ Sync,
>;
pub type InstructionProvider = Box<
dyn Fn(Arc<dyn ReadonlyContext>) -> Pin<Box<dyn Future<Output = Result<String>> + Send>>
+ Send
+ Sync,
>;
pub type GlobalInstructionProvider = InstructionProvider;
pub type OnToolErrorCallback = Box<
dyn Fn(
Arc<dyn CallbackContext>,
Arc<dyn Tool>,
serde_json::Value, // args
String, // error message
) -> Pin<Box<dyn Future<Output = Result<Option<serde_json::Value>>> + Send>>
+ Send
+ Sync,
>;
use crate::Event;
use async_trait::async_trait;
#[async_trait]
pub trait BaseEventsSummarizer: Send + Sync {
async fn summarize_events(&self, events: &[Event]) -> Result<Option<Event>>;
}
#[derive(Clone)]
pub struct EventsCompactionConfig {
pub compaction_interval: u32,
pub overlap_size: u32,
pub summarizer: Arc<dyn BaseEventsSummarizer>,
}