use systemprompt_models::services::{GatewayConfig, ModelPricing, ProviderRegistry};
pub fn resolve(
provider: &str,
candidates: &[&str],
gateway: Option<&GatewayConfig>,
registry: &ProviderRegistry,
) -> ModelPricing {
for model in candidates.iter().filter(|m| !m.is_empty()) {
if let Some(p) = lookup(model, gateway, registry) {
return p;
}
}
tracing::warn!(
provider = provider,
candidates = ?candidates,
"Gateway pricing lookup: no override and no registry entry — cost_microdollars will be 0"
);
ModelPricing::default()
}
fn lookup(
model: &str,
gateway: Option<&GatewayConfig>,
registry: &ProviderRegistry,
) -> Option<ModelPricing> {
if let Some(gw) = gateway
&& let Some(route) = gw.find_route(model)
&& let Some(p) = route.pricing
{
return Some(p);
}
registry_pricing(registry, gateway, model)
}
fn registry_pricing(
registry: &ProviderRegistry,
gateway: Option<&GatewayConfig>,
model: &str,
) -> Option<ModelPricing> {
if let Some(route) = gateway.and_then(|gw| gw.find_route(model))
&& let Some(m) = route
.resolve(registry)
.and_then(|entry| entry.find_model(model))
{
return Some(m.pricing);
}
registry
.providers
.iter()
.find_map(|entry| entry.find_model(model))
.map(|m| m.pricing)
}