use xberg::{ExtractionConfig, LlmConfig};
pub(crate) fn resolve_llm_api_key(cli_api_key: Option<&str>) -> Option<String> {
if let Some(key) = cli_api_key.map(str::trim).filter(|s| !s.is_empty()) {
tracing::info!(source = "cli_flag", "Resolved LLM API key from --api-key flag");
return Some(key.to_string());
}
if let Ok(value) = std::env::var("XBERG_LLM_API_KEY")
&& !value.is_empty()
{
tracing::info!(source = "xberg_env", "Resolved LLM API key from XBERG_LLM_API_KEY");
return Some(value);
}
None
}
pub(crate) fn apply_llm_api_key(config: &mut ExtractionConfig, key: &str) {
fn fill(slot: &mut LlmConfig, key: &str) {
if slot.api_key.is_none() {
slot.api_key = Some(key.to_string());
}
}
if let Some(ocr) = config.ocr.as_mut()
&& let Some(vlm) = ocr.vlm_config.as_mut()
{
fill(vlm, key);
}
if let Some(ext) = config.structured_extraction.as_mut() {
fill(&mut ext.llm, key);
}
if let Some(chunking) = config.chunking.as_mut()
&& let Some(embedding) = chunking.embedding.as_mut()
&& let xberg::EmbeddingModelType::Llm { llm } = &mut embedding.model
{
fill(llm, key);
}
if let Some(translation) = config.translation.as_mut() {
fill(&mut translation.llm, key);
}
if let Some(pc) = config.page_classification.as_mut() {
fill(&mut pc.llm, key);
}
if let Some(cap) = config.captioning.as_mut() {
fill(&mut cap.llm, key);
}
if let Some(sum) = config.summarization.as_mut()
&& let Some(llm) = sum.llm.as_mut()
{
fill(llm, key);
}
if let Some(ner) = config.ner.as_mut()
&& let Some(llm) = ner.llm.as_mut()
{
fill(llm, key);
}
}