ggen_cli_lib/cmds/ai/
models.rs

1//! List available AI models
2
3use clap::Args;
4use genai::adapter::AdapterKind;
5use genai::Client;
6use ggen_utils::error::Result;
7
8#[derive(Debug, Args)]
9pub struct ModelsArgs {
10    /// Specific adapter to list models for
11    #[arg(short, long)]
12    pub adapter: Option<String>,
13}
14
15pub async fn run(args: &ModelsArgs) -> Result<()> {
16    println!("Listing available AI models...");
17
18    let client = Client::default();
19
20    let adapters = if let Some(adapter_name) = &args.adapter {
21        match adapter_name.as_str() {
22            "openai" => vec![AdapterKind::OpenAI],
23            "ollama" => vec![AdapterKind::Ollama],
24            "anthropic" => vec![AdapterKind::Anthropic],
25            "gemini" => vec![AdapterKind::Gemini],
26            "groq" => vec![AdapterKind::Groq],
27            "cohere" => vec![AdapterKind::Cohere],
28            _ => {
29                println!("Unknown adapter: {}. Available: openai, ollama, anthropic, gemini, groq, cohere", adapter_name);
30                return Ok(());
31            }
32        }
33    } else {
34        vec![
35            AdapterKind::OpenAI,
36            AdapterKind::Ollama,
37            AdapterKind::Anthropic,
38            AdapterKind::Gemini,
39            AdapterKind::Groq,
40            AdapterKind::Cohere,
41        ]
42    };
43
44    for adapter in adapters {
45        println!("--- Models for {:?}", adapter);
46        match client.all_model_names(adapter).await {
47            Ok(models) => {
48                for model in models {
49                    println!("  - {}", model);
50                }
51            }
52            Err(e) => {
53                println!("  Error fetching models: {}", e);
54            }
55        }
56    }
57
58    Ok(())
59}