use crate::agent::react::run::pipeline::ToolExecutionPipeline;
use crate::agent::subagent::team::TeamAgent;
use crate::agent::ReactAgent;
use crate::context::ContextAssembler;
use crate::eval::EvalRunner;
use crate::prelude::ReactAgentBuilder;
use crate::trace::RunStore;
use std::sync::Arc;
pub struct AgentRunner {
model: String,
system_prompt: String,
agent_name: String,
context_engine: Option<ContextAssembler>,
tool_pipeline: Option<ToolExecutionPipeline>,
orchestrator: Option<TeamAgent>,
eval_recorder: Option<EvalRunner>,
run_store: Option<Arc<dyn RunStore>>,
max_iterations: usize,
enable_tools: bool,
}
impl Default for AgentRunner {
fn default() -> Self {
Self::new()
}
}
impl AgentRunner {
pub fn new() -> Self {
Self {
model: String::new(),
system_prompt: "You are a helpful assistant".into(),
agent_name: "echo-agent".into(),
context_engine: None,
tool_pipeline: None,
orchestrator: None,
eval_recorder: None,
run_store: None,
max_iterations: 10,
enable_tools: true,
}
}
pub fn model(mut self, model: impl Into<String>) -> Self {
self.model = model.into();
self
}
pub fn system_prompt(mut self, prompt: impl Into<String>) -> Self {
self.system_prompt = prompt.into();
self
}
pub fn agent_name(mut self, name: impl Into<String>) -> Self {
self.agent_name = name.into();
self
}
pub fn max_iterations(mut self, max: usize) -> Self {
self.max_iterations = max;
self
}
pub fn enable_tools(mut self, enable: bool) -> Self {
self.enable_tools = enable;
self
}
pub fn with_context_engine(mut self, assembler: ContextAssembler) -> Self {
self.context_engine = Some(assembler);
self
}
pub fn with_tool_pipeline(mut self, pipeline: ToolExecutionPipeline) -> Self {
self.tool_pipeline = Some(pipeline);
self
}
pub fn with_orchestrator(mut self, team: TeamAgent) -> Self {
self.orchestrator = Some(team);
self
}
pub fn with_eval_recorder(mut self, runner: EvalRunner) -> Self {
self.eval_recorder = Some(runner);
self
}
pub fn with_run_store(mut self, store: Arc<dyn RunStore>) -> Self {
self.run_store = Some(store);
self
}
pub fn build(self) -> crate::error::Result<ReactAgent> {
let mut builder = ReactAgentBuilder::new()
.model(&self.model)
.system_prompt(&self.system_prompt)
.name(&self.agent_name)
.max_iterations(self.max_iterations);
if self.enable_tools {
builder = builder.enable_tools();
}
if let Some(assembler) = self.context_engine {
builder = builder.with_context_assembler(assembler);
}
if let Some(pipeline) = self.tool_pipeline {
builder = builder.tool_execution_pipeline(pipeline);
}
if let Some(store) = self.run_store {
builder = builder.with_run_store(store);
}
builder.build()
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_runner_basic() {
let runner = AgentRunner::new()
.model("test-model")
.system_prompt("test prompt")
.max_iterations(5);
assert_eq!(runner.model, "test-model");
assert_eq!(runner.max_iterations, 5);
}
#[test]
fn test_runner_build_requires_model() {
let result = AgentRunner::new().build();
assert!(result.is_err());
}
}