langsmith_rust/config/
env.rs

1use crate::error::{LangSmithError, Result};
2use once_cell::sync::Lazy;
3use std::sync::Mutex;
4
5#[derive(Debug, Clone)]
6pub struct Config {
7    pub tracing_enabled: bool,
8    pub endpoint: String,
9    pub api_key: String,
10    pub project: Option<String>,
11    pub tenant_id: Option<String>,
12}
13
14static CONFIG: Lazy<Mutex<Option<Config>>> = Lazy::new(|| Mutex::new(None));
15
16impl Config {
17    pub fn from_env() -> Result<Self> {
18        // Try to load .env file (ignore errors if it doesn't exist)
19        let _ = dotenvy::dotenv();
20
21        let tracing_enabled = std::env::var("LANGSMITH_TRACING")
22            .unwrap_or_else(|_| "false".to_string())
23            .parse::<bool>()
24            .unwrap_or(false);
25
26        let endpoint = std::env::var("LANGSMITH_ENDPOINT")
27            .unwrap_or_else(|_| "https://api.smith.langchain.com".to_string());
28
29        let api_key = std::env::var("LANGSMITH_API_KEY")
30            .map_err(|_| LangSmithError::Config("LANGSMITH_API_KEY not set".to_string()))?;
31
32        let project = std::env::var("LANGSMITH_PROJECT").ok();
33        let tenant_id = std::env::var("LANGSMITH_TENANT_ID").ok();
34
35        Ok(Config {
36            tracing_enabled,
37            endpoint,
38            api_key,
39            project,
40            tenant_id,
41        })
42    }
43
44    pub fn get() -> Result<Self> {
45        let mut config = CONFIG.lock().unwrap();
46        if config.is_none() {
47            *config = Some(Self::from_env()?);
48        }
49        Ok(config.as_ref().unwrap().clone())
50    }
51
52    pub fn is_tracing_enabled() -> bool {
53        Self::get()
54            .map(|c| c.tracing_enabled)
55            .unwrap_or(false)
56    }
57}
58