Skip to main content

phi_agent/config/
llm.rs

1use anyhow::{anyhow, Result};
2
3const DEFAULT_MODEL: &str = "copilot";
4const DEFAULT_BASE_URL: &str = "https://api.openai.com/v1";
5
6/// LLM configuration
7#[derive(Clone, Debug)]
8pub struct LlmConfig {
9    pub api_key: String,
10    pub model: String,
11    pub base_url: String,
12}
13
14/// Resolve LLM configuration (API key, model, base_url).
15///
16/// Priority: CLI arg > environment variable (.env) > default
17pub fn resolve_llm_config(model: Option<&str>, base_url: Option<&str>) -> Result<LlmConfig> {
18    let api_key = super::optional_env("LLM_API_KEY")
19        .or_else(|| super::optional_env("OPENAI_API_KEY"))
20        .ok_or_else(|| {
21            anyhow!("Missing environment variable LLM_API_KEY. Please configure it in .env.")
22        })?;
23
24    let resolved_model = model
25        .map(|s| s.to_string())
26        .or_else(|| super::optional_env("LLM_MODEL"))
27        .or_else(|| super::optional_env("OPENAI_MODEL"))
28        .unwrap_or_else(|| DEFAULT_MODEL.to_string());
29
30    let resolved_base_url = base_url
31        .map(|s| s.to_string())
32        .or_else(|| super::optional_env("LLM_BASE_URL"))
33        .or_else(|| super::optional_env("OPENAI_BASE_URL"))
34        .unwrap_or_else(|| DEFAULT_BASE_URL.to_string());
35
36    Ok(LlmConfig {
37        api_key,
38        model: resolved_model,
39        base_url: resolved_base_url,
40    })
41}