llm 1.3.8

A Rust library unifying multiple LLM backends.
Documentation
use clap::Parser;
use std::path::PathBuf;

#[derive(Parser, Debug)]
#[command(
    name = "llm",
    about = "Interactive CLI interface for chatting with LLM providers",
    allow_hyphen_values = true
)]
pub struct CliArgs {
    #[arg(index = 1)]
    pub command: Option<String>,
    #[arg(index = 2)]
    pub provider_or_key: Option<String>,
    #[arg(index = 3)]
    pub prompt_or_value: Option<String>,
    #[arg(long, short = 'p')]
    pub provider: Option<String>,
    #[arg(long, short = 'm')]
    pub model: Option<String>,
    #[arg(long)]
    pub system: Option<String>,
    #[arg(long)]
    pub api_key: Option<String>,
    #[arg(long)]
    pub base_url: Option<String>,
    #[arg(long)]
    pub temperature: Option<f32>,
    #[arg(long)]
    pub max_tokens: Option<u32>,
    #[arg(long, short = 'c')]
    pub config: Option<PathBuf>,
    #[arg(long)]
    pub conversation: Option<String>,
    #[arg(long)]
    pub new: bool,
    #[arg(long)]
    pub prompt: Option<String>,
    #[arg(long)]
    pub list_providers: bool,
    #[arg(long)]
    pub list_models: bool,
}

#[derive(Clone, Copy, Debug, Eq, PartialEq)]
pub enum CommandKind {
    Set,
    Get,
    Delete,
    Default,
    Chat,
}

impl CommandKind {
    pub fn parse(raw: &str) -> Option<Self> {
        match raw.to_lowercase().as_str() {
            "set" => Some(Self::Set),
            "get" => Some(Self::Get),
            "delete" => Some(Self::Delete),
            "default" => Some(Self::Default),
            "chat" => Some(Self::Chat),
            _ => None,
        }
    }
}

impl CliArgs {
    pub fn command_kind(&self) -> Option<CommandKind> {
        self.command.as_deref().and_then(CommandKind::parse)
    }

    pub fn has_non_interactive_prompt(&self) -> bool {
        self.prompt.is_some() || self.prompt_or_value.is_some()
    }
}