use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
#[serde(rename_all = "lowercase")]
pub enum LlmProvider {
Anthropic,
OpenAI,
Ollama,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct LlmConfig {
pub provider: LlmProvider,
pub api_key: String,
pub model: String,
#[serde(default)]
pub base_url: Option<String>,
}
impl LlmConfig {
pub fn endpoint(&self) -> String {
match &self.base_url {
Some(url) => url.clone(),
None => match self.provider {
LlmProvider::Anthropic => "https://api.anthropic.com/v1/messages".to_string(),
LlmProvider::OpenAI => "https://api.openai.com/v1/chat/completions".to_string(),
LlmProvider::Ollama => "http://localhost:11434/v1/chat/completions".to_string(),
},
}
}
pub fn default_model(&self) -> &str {
match self.provider {
LlmProvider::Anthropic => "claude-sonnet-4-20250514",
LlmProvider::OpenAI => "gpt-4o",
LlmProvider::Ollama => "qwen3:8b",
}
}
}
impl Default for LlmConfig {
fn default() -> Self {
Self {
provider: LlmProvider::Ollama,
api_key: String::new(),
model: "qwen3:8b".to_string(),
base_url: None,
}
}
}