use std::sync::Arc;
use starweaver_model::{ModelAdapter, ModelRequestParameters, ModelSettings};
use starweaver_tools::{DynTool, DynToolset, ToolRegistry};
use starweaver_usage::UsageLimits;
use crate::{
agent::{Agent, AgentRuntimePolicy},
capability::{AgentCapability, CapabilityBundle},
executor::DynAgentExecutor,
instructions::DynDynamicInstruction,
output::{DynOutputFunction, OutputPolicy, OutputSchema, OutputValidator},
};
pub struct AgentOverride {
agent: Agent,
}
impl AgentOverride {
pub(super) const fn new(agent: Agent) -> Self {
Self { agent }
}
#[must_use]
pub fn model(mut self, model: Arc<dyn ModelAdapter>) -> Self {
self.agent.model = model;
self
}
#[must_use]
pub fn model_settings(mut self, settings: Option<ModelSettings>) -> Self {
self.agent.model_settings = settings;
self
}
#[must_use]
pub fn request_params(mut self, params: ModelRequestParameters) -> Self {
self.agent.request_params = params;
self
}
#[must_use]
pub fn with_tools(mut self, tools: ToolRegistry) -> Self {
self.agent.tools = tools;
self.agent.toolsets.clear();
self
}
#[must_use]
pub fn tool(mut self, tool: DynTool) -> Self {
self.agent.tools.insert(tool);
self
}
#[must_use]
pub fn toolset(mut self, toolset: &DynToolset) -> Self {
self.agent.toolsets.push(toolset.clone());
self
}
#[must_use]
pub fn append_tools(mut self, tools: &ToolRegistry) -> Self {
self.agent.tools.insert_registry(tools);
self
}
#[must_use]
pub const fn usage_limits(mut self, limits: Option<UsageLimits>) -> Self {
self.agent.usage_limits = limits;
self
}
#[must_use]
pub fn with_instructions(mut self, instructions: Vec<String>) -> Self {
self.agent.instructions = instructions;
self
}
#[must_use]
pub fn append_instructions(mut self, instructions: impl IntoIterator<Item = String>) -> Self {
self.agent.instructions.extend(instructions);
self
}
#[must_use]
pub fn dynamic_instructions(mut self, instructions: Vec<DynDynamicInstruction>) -> Self {
self.agent.dynamic_instructions = instructions;
self
}
#[must_use]
pub fn output_schema(mut self, schema: Option<OutputSchema>) -> Self {
self.agent.output_schema = schema;
self
}
#[must_use]
pub fn output_policy(mut self, policy: OutputPolicy) -> Self {
self.agent = self.agent.with_output_policy(policy);
self
}
#[must_use]
pub fn output_validators(mut self, validators: Vec<Arc<dyn OutputValidator>>) -> Self {
self.agent.output_validators = validators;
self
}
#[must_use]
pub fn output_functions(mut self, functions: Vec<DynOutputFunction>) -> Self {
self.agent.output_functions = functions;
self
}
#[must_use]
pub fn capabilities(mut self, capabilities: Vec<Arc<dyn AgentCapability>>) -> Self {
self.agent.capabilities = capabilities;
self
}
#[must_use]
pub fn executor(mut self, executor: DynAgentExecutor) -> Self {
self.agent.executor = executor;
self
}
#[must_use]
pub fn capability_bundle(mut self, bundle: &dyn CapabilityBundle) -> Self {
self.agent = self.agent.with_capability_bundle(bundle);
self
}
#[must_use]
pub const fn policy(mut self, policy: AgentRuntimePolicy) -> Self {
self.agent.policy = policy;
self
}
#[must_use]
pub fn build(self) -> Agent {
self.agent
}
}