use std::sync::Arc;
use std::time::Duration;
use rskit_hook::HookRegistry;
use rskit_resilience::Policy;
use rskit_tool::Registry;
use crate::types::ContextStrategy;
pub struct AgentConfig {
pub tools: Option<Arc<Registry>>,
pub hooks: Option<Arc<HookRegistry>>,
pub system_prompt: String,
pub max_turns: u32,
pub max_tokens: usize,
pub wall_clock: Duration,
pub max_tool_calls: u32,
pub tool_concurrency: usize,
pub tool_timeout: Duration,
pub policy: Option<Policy>,
pub context_strategy: Option<Box<dyn ContextStrategy>>,
pub model: String,
}
impl AgentConfig {
#[must_use]
pub fn budget(&self) -> rskit_ai::Budget {
rskit_ai::Budget {
max_tokens: Some(self.max_tokens as u64),
max_calls: Some(u64::from(self.max_tool_calls)),
max_cost: None,
wall_clock: Some(self.wall_clock.as_secs()),
}
}
}
impl Default for AgentConfig {
fn default() -> Self {
Self {
tools: None,
hooks: None,
system_prompt: String::new(),
max_turns: 10,
max_tokens: 100_000,
wall_clock: Duration::from_mins(1),
max_tool_calls: 50,
tool_concurrency: 4,
tool_timeout: Duration::from_secs(30),
policy: None,
context_strategy: None,
model: String::new(),
}
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn budget_maps_config_limits_to_shared_genai_vocabulary() {
let config = AgentConfig {
max_tokens: 4_096,
max_tool_calls: 7,
wall_clock: Duration::from_secs(45),
..AgentConfig::default()
};
let budget = config.budget();
assert_eq!(budget.max_tokens, Some(4_096));
assert_eq!(budget.max_calls, Some(7));
assert_eq!(budget.wall_clock, Some(45));
assert_eq!(budget.max_cost, None);
}
}