use std::env;
use std::str::FromStr;
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum Provider {
LMStudio,
Ollama,
LlamaCpp,
VLLM,
}
impl Provider {
pub fn default_url(&self) -> &'static str {
match self {
Provider::LMStudio => "http://localhost:1234/v1",
Provider::Ollama => "http://localhost:11434/v1",
Provider::LlamaCpp => "http://localhost:8080/v1",
Provider::VLLM => "http://localhost:8000/v1",
}
}
}
impl FromStr for Provider {
type Err = String;
fn from_str(s: &str) -> Result<Self, Self::Err> {
match s.to_lowercase().as_str() {
"lmstudio" | "lm-studio" | "lm_studio" => Ok(Provider::LMStudio),
"ollama" => Ok(Provider::Ollama),
"llamacpp" | "llama-cpp" | "llama_cpp" | "llama.cpp" => Ok(Provider::LlamaCpp),
"vllm" => Ok(Provider::VLLM),
_ => Err(format!("Unknown provider: {}", s)),
}
}
}
pub fn get_base_url(provider: Option<Provider>, fallback: Option<&str>) -> String {
if let Ok(url) = env::var("OPEN_AGENT_BASE_URL") {
return url;
}
if let Some(p) = provider {
return p.default_url().to_string();
}
fallback
.unwrap_or(Provider::LMStudio.default_url())
.to_string()
}
pub fn get_model(fallback: Option<&str>, prefer_env: bool) -> Option<String> {
if prefer_env {
if let Ok(model) = env::var("OPEN_AGENT_MODEL") {
return Some(model);
}
}
fallback.map(|s| s.to_string())
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_provider_default_urls() {
assert_eq!(Provider::LMStudio.default_url(), "http://localhost:1234/v1");
assert_eq!(Provider::Ollama.default_url(), "http://localhost:11434/v1");
assert_eq!(Provider::LlamaCpp.default_url(), "http://localhost:8080/v1");
assert_eq!(Provider::VLLM.default_url(), "http://localhost:8000/v1");
}
#[test]
fn test_provider_from_str() {
assert_eq!("lmstudio".parse::<Provider>(), Ok(Provider::LMStudio));
assert_eq!("LM-Studio".parse::<Provider>(), Ok(Provider::LMStudio));
assert_eq!("ollama".parse::<Provider>(), Ok(Provider::Ollama));
assert_eq!("llamacpp".parse::<Provider>(), Ok(Provider::LlamaCpp));
assert_eq!("llama.cpp".parse::<Provider>(), Ok(Provider::LlamaCpp));
assert_eq!("vllm".parse::<Provider>(), Ok(Provider::VLLM));
assert!("unknown".parse::<Provider>().is_err());
}
}