use clap::Parser;
use picocode::{create_agent, AgentConfig, ConsoleOutput};
use std::sync::Arc;
#[derive(Parser, Debug)]
#[command(author, version, about = "Minimal coding assistant")]
struct Args {
#[arg(short, long, default_value = "anthropic")]
provider: String,
#[arg(short, long)]
model: Option<String>,
#[arg(short, long, default_value_t = true)]
interactive: bool,
#[arg(long)]
input: Option<String>,
#[arg(long)]
bash: bool,
#[arg(long)]
yolo: bool,
#[arg(short, long)]
quiet: bool,
#[arg(long, default_value = "10")]
tool_call_limit: usize,
}
#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
let args = Args::parse();
let output: Arc<dyn picocode::Output> = if args.quiet {
Arc::new(picocode::QuietOutput::new())
} else {
Arc::new(ConsoleOutput::new())
};
let system_message_extension = picocode::agent::load_agents_md();
let model = args.model.clone().unwrap_or_else(|| match args.provider.as_str() {
"anthropic" => "claude-3-5-sonnet-20241022".to_string(),
"openai" => "gpt-4o-mini".to_string(),
"azure" => "gpt-4o".to_string(),
"cohere" => "command-r-plus".to_string(),
"deepseek" => "deepseek-chat".to_string(),
"galadriel" => "llama3-70b".to_string(),
"groq" => "llama3-70b-8192".to_string(),
"huggingface" => "meta-llama/Llama-3-70b-chat-hf".to_string(),
"hyperbolic" => "meta-llama/Llama-3-70b-instruct".to_string(),
"mira" => "mira-v1".to_string(),
"mistral" => "mistral-large-latest".to_string(),
"moonshot" => "moonshot-v1-8k".to_string(),
"ollama" => "llama3".to_string(),
"openrouter" => "meta-llama/llama-3-70b-instruct".to_string(),
"perplexity" => "llama-3-sonar-large-32k-online".to_string(),
"together" => "meta-llama/Llama-3-70b-chat-hf".to_string(),
"xai" => "grok-1".to_string(),
"gemini" | "google" => "gemini-1.5-pro".to_string(),
_ => "unknown".to_string(),
});
let agent = create_agent(AgentConfig {
provider: args.provider.clone(),
model,
output,
use_bash: args.bash,
yolo: args.yolo,
tool_call_limit: args.tool_call_limit,
system_message_extension,
}).await?;
match args.input {
Some(p) => {
let response = agent.run_once(p).await?;
if args.quiet {
println!("{}", response);
}
}
None => agent.run_interactive().await?,
}
Ok(())
}