use std::time::Duration;
use defect_config::LangfuseConfig;
use defect_obs::LangfuseObserver;
use defect_obs::langfuse::{
DEFAULT_FLUSH_INTERVAL, DEFAULT_HOST, DEFAULT_MAX_BATCH, LangfuseSetup, build_observer,
};
pub fn build_langfuse_observer(
config: Option<&LangfuseConfig>,
http_stack_config: defect_http::HttpStackConfig,
) -> anyhow::Result<Option<LangfuseObserver>> {
let Some(cfg) = config.filter(|c| c.enabled) else {
return Ok(None);
};
let (Some(public_key), Some(secret_key)) = (cfg.public_key.clone(), cfg.secret_key.clone())
else {
tracing::warn!(
"tracing.langfuse.enabled = true but public_key / secret_key missing; \
langfuse reporting disabled"
);
return Ok(None);
};
let http = defect_http::build_http_stack(http_stack_config)
.map_err(|e| anyhow::anyhow!("langfuse http stack init failed: {e}"))?;
let setup = LangfuseSetup {
host: cfg.host.clone().unwrap_or_else(|| DEFAULT_HOST.to_string()),
public_key,
secret_key,
flush_interval: cfg
.flush_interval_ms
.map_or(DEFAULT_FLUSH_INTERVAL, Duration::from_millis),
max_batch: cfg.max_batch.unwrap_or(DEFAULT_MAX_BATCH),
};
Ok(Some(build_observer(setup, http)))
}