use crate::brain::provider_spec::{ProviderKey, normalize_in};
use crate::config::Config;
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum ProviderSource {
PerCall,
Config,
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct ChildPair {
pub provider: Option<String>,
pub model: Option<String>,
pub source: ProviderSource,
}
pub fn child_pair(
config: &Config,
call_provider: Option<&str>,
call_model: Option<&str>,
) -> ChildPair {
let (provider, source) = match call_provider {
Some(p) => (Some(p), ProviderSource::PerCall),
None => (
config.agent.subagent_provider.as_deref(),
ProviderSource::Config,
),
};
let model = call_model.or(config.agent.subagent_model.as_deref());
let Some(provider) = provider else {
return ChildPair {
provider: None,
model: model.map(str::to_string),
source,
};
};
let pair = normalize_in(config, ProviderKey::SUBAGENT, provider, model);
if let Some(note) = pair.note.as_deref() {
tracing::warn!(
"Sub-agent provider corrected to '{}': {note}",
pair.provider
);
}
ChildPair {
provider: Some(pair.provider),
model: pair.model,
source,
}
}