use serde_json::Value;
use crate::types::agent_state::AgentState;
use crate::types::completion::CompletionResponse;
pub trait Tracker: Send + Sync + 'static {
fn on_iteration(&self, state: &mut AgentState);
fn on_tool_call(&self, name: &str, args: &Value, state: &mut AgentState);
fn on_llm_response(&self, response: &CompletionResponse, state: &mut AgentState);
fn recommended_concurrency(&self, state: &AgentState) -> usize;
}
pub struct NoopTracker;
impl Tracker for NoopTracker {
fn on_iteration(&self, _state: &mut AgentState) {}
fn on_tool_call(&self, _name: &str, _args: &Value, _state: &mut AgentState) {}
fn on_llm_response(&self, _response: &CompletionResponse, _state: &mut AgentState) {}
fn recommended_concurrency(&self, _state: &AgentState) -> usize {
usize::MAX
}
}
#[cfg(test)]
mod tests {
use super::*;
use crate::types::agent_state::AgentState;
use crate::types::model_info::ModelTier;
#[test]
fn test_noop_tracker_recommended_concurrency() {
let tracker = NoopTracker;
let state = AgentState::new(ModelTier::Small, 4096);
assert_eq!(tracker.recommended_concurrency(&state), usize::MAX);
}
#[test]
fn test_noop_tracker_callbacks_do_nothing() {
let tracker = NoopTracker;
let mut state = AgentState::new(ModelTier::Small, 4096);
let initial_iter = state.iteration_count;
tracker.on_iteration(&mut state);
tracker.on_tool_call("test", &serde_json::json!({}), &mut state);
assert_eq!(state.iteration_count, initial_iter);
}
}