use std::sync::Arc;
use agentyk_core::budget::BudgetChecker;
use agentyk_core::capability::Capability;
use agentyk_core::context::{ContextAssembler, PassthroughContextAssembler};
use agentyk_core::driver::{DriverRegistry, ModelSpec};
use agentyk_core::event::EventListener;
use agentyk_core::extensions::Extensions;
use agentyk_core::hook::Hook;
use agentyk_core::middleware::TurnMiddleware;
use agentyk_core::profile::ModelCatalog;
pub(crate) const DEFAULT_MAX_ITERATIONS: usize = 16;
pub(crate) struct AgentConfig {
pub(crate) name: String,
pub(crate) system_prompt: String,
pub(crate) model: Option<ModelSpec>,
pub(crate) capabilities: Vec<Arc<dyn Capability>>,
pub(crate) drivers: DriverRegistry,
pub(crate) listeners: Vec<Arc<dyn EventListener>>,
pub(crate) max_iterations: usize,
pub(crate) middleware: Vec<Arc<dyn TurnMiddleware>>,
pub(crate) hooks: Vec<Arc<dyn Hook>>,
pub(crate) budget_checker: Option<Arc<dyn BudgetChecker>>,
pub(crate) context_assembler: Arc<dyn ContextAssembler>,
pub(crate) context_token_limit: Option<usize>,
pub(crate) extensions: Extensions,
pub(crate) model_catalog: Option<Arc<dyn ModelCatalog>>,
}
impl Default for AgentConfig {
fn default() -> Self {
Self {
name: "agent".to_string(),
system_prompt: String::new(),
model: None,
capabilities: Vec::new(),
drivers: DriverRegistry::new(),
listeners: Vec::new(),
max_iterations: DEFAULT_MAX_ITERATIONS,
middleware: Vec::new(),
hooks: Vec::new(),
budget_checker: None,
context_assembler: Arc::new(PassthroughContextAssembler),
context_token_limit: None,
extensions: Extensions::new(),
model_catalog: None,
}
}
}
impl AgentConfig {
pub(crate) fn model(&self) -> &ModelSpec {
self.model
.as_ref()
.expect("a built agent always has a model")
}
}