use crate::{Agent, AgentTool, InstructionParam, Toolkit};
use llm_sdk::{AudioOptions, LanguageModel, Modality, ReasoningOptions, ResponseFormatOption};
use std::sync::Arc;
pub struct AgentParams<TCtx> {
pub name: String,
pub model: Arc<dyn LanguageModel + Send + Sync>,
pub instructions: Vec<InstructionParam<TCtx>>,
pub tools: Vec<Arc<dyn AgentTool<TCtx>>>,
pub toolkits: Vec<Arc<dyn Toolkit<TCtx>>>,
pub response_format: ResponseFormatOption,
pub max_turns: usize,
pub temperature: Option<f64>,
pub top_p: Option<f64>,
pub top_k: Option<i32>,
pub presence_penalty: Option<f64>,
pub frequency_penalty: Option<f64>,
pub modalities: Option<Vec<Modality>>,
pub audio: Option<AudioOptions>,
pub reasoning: Option<ReasoningOptions>,
}
impl<TCtx> AgentParams<TCtx>
where
TCtx: Send + Sync + 'static,
{
pub fn new(name: &str, model: Arc<dyn LanguageModel + Send + Sync>) -> Self {
Self {
name: name.to_string(),
model,
instructions: Vec::new(),
tools: Vec::new(),
toolkits: Vec::new(),
response_format: ResponseFormatOption::Text,
max_turns: 10,
temperature: None,
top_p: None,
top_k: None,
presence_penalty: None,
frequency_penalty: None,
audio: None,
reasoning: None,
modalities: None,
}
}
#[must_use]
pub fn add_instruction(mut self, instruction: impl Into<InstructionParam<TCtx>>) -> Self {
self.instructions.push(instruction.into());
self
}
#[must_use]
pub fn instructions(mut self, instructions: Vec<InstructionParam<TCtx>>) -> Self {
self.instructions = instructions;
self
}
#[must_use]
pub fn add_tool(mut self, tool: impl AgentTool<TCtx> + 'static) -> Self {
self.tools.push(Arc::new(tool));
self
}
#[must_use]
pub fn add_toolkit(mut self, toolkit: impl Toolkit<TCtx> + 'static) -> Self {
self.toolkits.push(Arc::new(toolkit));
self
}
#[must_use]
pub fn toolkits(mut self, toolkits: Vec<Arc<dyn Toolkit<TCtx>>>) -> Self {
self.toolkits = toolkits;
self
}
#[must_use]
pub fn response_format(mut self, response_format: ResponseFormatOption) -> Self {
self.response_format = response_format;
self
}
#[must_use]
pub fn max_turns(mut self, max_turns: usize) -> Self {
self.max_turns = max_turns;
self
}
#[must_use]
pub fn temperature(mut self, temperature: f64) -> Self {
self.temperature = Some(temperature);
self
}
#[must_use]
pub fn top_p(mut self, top_p: f64) -> Self {
self.top_p = Some(top_p);
self
}
#[must_use]
pub fn top_k(mut self, top_k: i32) -> Self {
self.top_k = Some(top_k);
self
}
#[must_use]
pub fn presence_penalty(mut self, presence_penalty: f64) -> Self {
self.presence_penalty = Some(presence_penalty);
self
}
#[must_use]
pub fn frequency_penalty(mut self, frequency_penalty: f64) -> Self {
self.frequency_penalty = Some(frequency_penalty);
self
}
#[must_use]
pub fn modalities(mut self, modalities: Vec<Modality>) -> Self {
self.modalities = Some(modalities);
self
}
#[must_use]
pub fn audio(mut self, audio: AudioOptions) -> Self {
self.audio = Some(audio);
self
}
#[must_use]
pub fn reasoning(mut self, reasoning: ReasoningOptions) -> Self {
self.reasoning = Some(reasoning);
self
}
#[must_use]
pub fn build(self) -> Agent<TCtx> {
Agent::new(self)
}
}