use std::sync::Arc;
use anyhow::{Result, anyhow};
use crate::provider::{Provider, ProviderRegistry};
pub const DEFAULT_ROUTER_MODEL: &str = "zai/glm-5.1";
pub fn resolve_router_model(
registry: &ProviderRegistry,
model_ref: &str,
) -> Result<(Arc<dyn Provider>, String)> {
if let Some((prov_name, model_name)) = model_ref.split_once('/') {
if let Some(prov) = registry.get(prov_name) {
return Ok((prov, model_name.to_string()));
}
let first = registry
.list()
.first()
.copied()
.ok_or_else(|| anyhow!("router provider '{prov_name}' not available and no providers configured"))?;
let prov = registry
.get(first)
.ok_or_else(|| anyhow!("provider '{first}' missing"))?;
tracing::warn!(
requested = prov_name,
requested_model = model_name,
fallback_provider = first,
"router provider unavailable; falling back to first registered provider"
);
return Ok((prov, model_name.to_string()));
}
let first = registry
.list()
.first()
.copied()
.ok_or_else(|| anyhow!("no providers configured"))?;
let prov = registry
.get(first)
.ok_or_else(|| anyhow!("provider '{first}' missing"))?;
Ok((prov, model_ref.to_string()))
}