langsmith_rust/config/
env.rs1use 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 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