use std::sync::Arc;
use super::{AnthropicProvider, LiteLlmProvider, LlmProvider, MistralProvider, OpenAiProvider};
pub struct Environment {
pub provider: Arc<dyn LlmProvider>,
pub model: String,
}
impl Environment {
pub fn detect_provider() -> Self {
if env("LITELLM_API_KEY").is_some() {
let (provider, model) = LiteLlmProvider::from_env();
return Self { provider: Arc::new(provider), model };
}
if let Ok((provider, model)) = MistralProvider::from_env() {
return Self { provider: Arc::new(provider), model };
}
if let Ok((provider, model)) = AnthropicProvider::from_env() {
return Self { provider: Arc::new(provider), model };
}
if let Ok((provider, model)) = OpenAiProvider::from_env() {
return Self { provider: Arc::new(provider), model };
}
if std::net::TcpStream::connect("127.0.0.1:4000").is_ok() {
let (provider, model) = LiteLlmProvider::from_env();
return Self { provider: Arc::new(provider), model };
}
panic!(
"No LLM provider found.\n\
Set one of: LITELLM_API_KEY, MISTRAL_API_KEY, ANTHROPIC_API_KEY, OPENAI_API_KEY\n\
Or start a LiteLLM proxy on localhost:4000"
);
}
}
fn env(name: &str) -> Option<String> {
std::env::var(name).ok().filter(|v| !v.is_empty())
}