use traitclaw_openai_compat::{OpenAiCompatConfig, OpenAiCompatProvider};
const OPENAI_BASE: &str = "https://api.openai.com/v1";
const GROQ_BASE: &str = "https://api.groq.com/openai/v1";
const TOGETHER_BASE: &str = "https://api.together.xyz/v1";
const MISTRAL_BASE: &str = "https://api.mistral.ai/v1";
const OLLAMA_BASE: &str = "http://localhost:11434/v1";
const DEEPSEEK_BASE: &str = "https://api.deepseek.com/v1";
const XAI_BASE: &str = "https://api.x.ai/v1";
fn env_key(var: &str) -> String {
std::env::var(var).unwrap_or_default()
}
#[must_use]
pub fn openai(model: impl Into<String>) -> OpenAiCompatProvider {
OpenAiCompatProvider::new(OpenAiCompatConfig {
base_url: OPENAI_BASE.to_string(),
api_key: env_key("OPENAI_API_KEY"),
model: model.into(),
model_info: None,
})
}
#[must_use]
pub fn groq(model: impl Into<String>) -> OpenAiCompatProvider {
OpenAiCompatProvider::new(OpenAiCompatConfig {
base_url: GROQ_BASE.to_string(),
api_key: env_key("GROQ_API_KEY"),
model: model.into(),
model_info: None,
})
}
#[must_use]
pub fn together(model: impl Into<String>) -> OpenAiCompatProvider {
OpenAiCompatProvider::new(OpenAiCompatConfig {
base_url: TOGETHER_BASE.to_string(),
api_key: env_key("TOGETHER_API_KEY"),
model: model.into(),
model_info: None,
})
}
#[must_use]
pub fn mistral(model: impl Into<String>) -> OpenAiCompatProvider {
OpenAiCompatProvider::new(OpenAiCompatConfig {
base_url: MISTRAL_BASE.to_string(),
api_key: env_key("MISTRAL_API_KEY"),
model: model.into(),
model_info: None,
})
}
#[must_use]
pub fn ollama(model: impl Into<String>) -> OpenAiCompatProvider {
OpenAiCompatProvider::new(OpenAiCompatConfig {
base_url: OLLAMA_BASE.to_string(),
api_key: String::new(),
model: model.into(),
model_info: None,
})
}
#[must_use]
pub fn azure_openai(
resource: impl Into<String>,
deployment: impl Into<String>,
api_version: Option<&str>,
) -> OpenAiCompatProvider {
let resource = resource.into();
let deployment = deployment.into();
let api_version = api_version.unwrap_or("2024-02-01");
let base_url = format!(
"https://{resource}.openai.azure.com/openai/deployments/{deployment}?api-version={api_version}"
);
OpenAiCompatProvider::new(OpenAiCompatConfig {
base_url,
api_key: env_key("AZURE_OPENAI_API_KEY"),
model: deployment,
model_info: None,
})
}
#[must_use]
pub fn custom(
base_url: impl Into<String>,
model: impl Into<String>,
api_key: impl Into<String>,
) -> OpenAiCompatProvider {
OpenAiCompatProvider::new(OpenAiCompatConfig {
base_url: base_url.into(),
api_key: api_key.into(),
model: model.into(),
model_info: None,
})
}
#[must_use]
pub fn deepseek(model: impl Into<String>) -> OpenAiCompatProvider {
let api_key = env_key("DEEPSEEK_API_KEY");
if api_key.is_empty() {
tracing::warn!("DEEPSEEK_API_KEY is not set — requests will fail with HTTP 401");
}
OpenAiCompatProvider::new(OpenAiCompatConfig {
base_url: DEEPSEEK_BASE.to_string(),
api_key,
model: model.into(),
model_info: None,
})
}
#[must_use]
pub fn xai(model: impl Into<String>) -> OpenAiCompatProvider {
let api_key = env_key("XAI_API_KEY");
if api_key.is_empty() {
tracing::warn!("XAI_API_KEY is not set — requests will fail with HTTP 401");
}
OpenAiCompatProvider::new(OpenAiCompatConfig {
base_url: XAI_BASE.to_string(),
api_key,
model: model.into(),
model_info: None,
})
}