use anyhow::Result;
use clap::Parser;
use tracing::info;
use crate::runtime::ask::{self, is_known_provider};
#[derive(Parser, Debug, Clone)]
pub struct Args {
#[arg(value_name = "PROVIDER", default_value = "")]
pub provider: String,
#[arg(trailing_var_arg = true, value_name = "PROMPT")]
pub prompt: Vec<String>,
#[arg(long)]
pub all: bool,
#[arg(short, long)]
pub save: bool,
#[arg(long)]
pub no_synthesis: bool,
#[arg(short, long, value_delimiter = ',')]
pub providers: Vec<String>,
#[arg(short, long, default_value = "60")]
pub timeout: u64,
}
pub(crate) async fn run(args: Args) -> Result<()> {
let mut provider = args.provider;
let mut prompt_parts = args.prompt;
if !provider.is_empty() && !is_known_provider(&provider) {
prompt_parts.insert(0, provider);
provider = String::new();
}
let prompt = prompt_parts.join(" ");
if prompt.is_empty() {
anyhow::bail!("Prompt is required");
}
let all = args.all || provider.is_empty();
if all || !args.providers.is_empty() {
let providers = if args.providers.is_empty() {
ask::available_providers().await
} else {
args.providers.iter().map(|s| s.as_str()).collect()
};
if providers.is_empty() {
anyhow::bail!("No provider CLIs are installed");
}
info!(providers = ?providers, "Asking providers");
let outputs = ask::ask_providers(&providers, &prompt, args.save, args.timeout).await?;
if !args.no_synthesis && ask::is_provider_installed("kimi").await && outputs.len() > 1 {
info!("Synthesizing with Kimi");
let synthesis = ask::synthesize(&prompt, &outputs, args.save).await?;
println!("{}", synthesis);
} else {
if args.no_synthesis {
info!("Synthesis disabled");
}
for (provider_name, output) in &outputs {
println!("## {}\n\n{}\n", provider_name, output);
}
}
} else {
info!(provider = %provider, "Asking single provider");
let output = ask::ask_single(&provider, &prompt, args.save, args.timeout).await?;
println!("{}", output);
}
Ok(())
}