use crate::agents::agent::AgentGPT;
use crate::agents::architect::ArchitectGPT;
use crate::agents::backend::BackendGPT;
#[cfg(feature = "img")]
use crate::agents::designer::DesignerGPT;
use crate::agents::frontend::FrontendGPT;
#[cfg(feature = "git")]
use crate::agents::git::GitGPT;
use crate::agents::optimizer::OptimizerGPT;
use crate::common::utils::Task;
use crate::traits::agent::Agent;
use crate::traits::functions::{AsyncFunctions, Functions};
use anyhow::Result;
#[derive(Debug, Clone)]
pub enum AgentType {
Architect(ArchitectGPT),
Backend(BackendGPT),
Frontend(FrontendGPT),
#[cfg(feature = "img")]
Designer(DesignerGPT),
#[cfg(feature = "git")]
Git(GitGPT),
Optimize(OptimizerGPT),
}
impl Default for AgentType {
fn default() -> Self {
AgentType::Architect(ArchitectGPT::default())
}
}
impl AgentType {
pub async fn execute(
&mut self,
tasks: &mut Task,
execute: bool,
browse: bool,
max_tries: u64,
) -> Result<()> {
match self {
AgentType::Architect(agent) => agent.execute(tasks, execute, browse, max_tries).await,
AgentType::Backend(agent) => agent.execute(tasks, execute, browse, max_tries).await,
AgentType::Frontend(agent) => agent.execute(tasks, execute, browse, max_tries).await,
#[cfg(feature = "img")]
AgentType::Designer(agent) => agent.execute(tasks, execute, browse, max_tries).await,
#[cfg(feature = "git")]
AgentType::Git(agent) => agent.execute(tasks, execute, browse, max_tries).await,
AgentType::Optimize(agent) => agent.execute(tasks, execute, browse, max_tries).await,
}
}
pub fn position(&self) -> String {
match self {
AgentType::Architect(agent) => agent.get_agent().position().to_string(),
AgentType::Backend(agent) => agent.get_agent().position().to_string(),
AgentType::Frontend(agent) => agent.get_agent().position().to_string(),
AgentType::Optimize(agent) => agent.get_agent().position().to_string(),
#[cfg(feature = "img")]
AgentType::Designer(agent) => agent.get_agent().position().to_string(),
#[cfg(feature = "git")]
AgentType::Git(agent) => agent.get_agent().position().to_string(),
}
}
pub fn get_agent(&self) -> &AgentGPT {
match self {
AgentType::Architect(agent) => agent.get_agent(),
AgentType::Backend(agent) => agent.get_agent(),
AgentType::Frontend(agent) => agent.get_agent(),
AgentType::Optimize(agent) => agent.get_agent(),
#[cfg(feature = "img")]
AgentType::Designer(agent) => agent.get_agent(),
#[cfg(feature = "git")]
AgentType::Git(agent) => agent.get_agent(),
}
}
}