use clap::{Parser, Subcommand};
use std::sync::Arc;
use std::fs;
use cerebro::prelude::*;
use cerebro::swarm::prelude::*;
#[derive(Parser, Debug)]
#[command(author, version, about, long_about = None)]
struct Cli {
#[command(subcommand)]
command: Commands,
}
#[derive(Subcommand, Debug)]
enum Commands {
Run {
#[arg(short, long)]
input: String,
#[arg(short, long, default_value = "analyst,reviewer")]
agents: String,
},
Serve {
#[arg(short, long, default_value = "3000")]
port: u16,
}
}
#[tokio::main]
async fn main() -> anyhow::Result<()> {
let cli = Cli::parse();
let engine = Arc::new(MemoryEngine::new(
Arc::new(RecursiveCharacterChunker::new(512, 50)),
Arc::new(MockEmbedder::new(1536)),
Arc::new(MemoryVectorStore::new()),
));
let memory = Arc::new(CerebroMemoryBus::new(engine, Arc::new(MemoryKVStore::new())));
let mut swarm = SwarmOrchestrator::new(memory.clone());
swarm.register_agent(AgentConfig {
id: "analyst".into(),
name: "Data Analyst".into(),
system_prompt: "You are an expert data analyst. Breakdown the user request and find key entities.".into(),
model: LlmProvider::Ollama { model: "llama3".into(), base_url: "http://localhost:11434".into() },
tools: vec![],
handoff_targets: vec![],
max_steps: 10,
});
swarm.register_agent(AgentConfig {
id: "reviewer".into(),
name: "Security Reviewer".into(),
system_prompt: "You review the previous analysis for security logic flaws and synthesize a final report.".into(),
model: LlmProvider::Ollama { model: "llama3".into(), base_url: "http://localhost:11434".into() },
tools: vec![],
handoff_targets: vec![],
max_steps: 10,
});
match &cli.command {
Commands::Run { input, agents } => {
let order: Vec<String> = agents.split(',').map(|s| s.trim().to_string()).collect();
let pattern = SwarmPattern::Sequential { agent_order: order };
let _res = swarm.execute(pattern, input).await?;
}
Commands::Serve { port } => {
#[cfg(feature = "api")]
{
let app = cerebro::swarm::gateway::create_router(Arc::new(swarm));
let addr = format!("0.0.0.0:{}", port);
let listener = tokio::net::TcpListener::bind(&addr).await?;
println!("🚀 Swarm Gateway running on http://{}", addr);
axum::serve(listener, app).await?;
}
#[cfg(not(feature = "api"))]
{
eprintln!("Error: The 'api' feature is not enabled. Compile with --features api");
}
}
}
Ok(())
}