use crate::llm::capabilities::{DecisionLimits, DecisionProtocol, DecisionQuestionKind};
use crate::llm_config::{self, ModelOperation};
#[derive(Debug, Clone, PartialEq)]
pub struct DecisionContract {
pub protocol: DecisionProtocol,
pub question_kinds: Vec<DecisionQuestionKind>,
pub limits: Option<DecisionLimits>,
pub input_price_per_mtok: Option<f64>,
pub output_price_per_mtok: Option<f64>,
pub served_model_id: String,
}
pub fn decision_contract_for_route(provider: &str, model: &str) -> Option<DecisionContract> {
let catalog_id = llm_config::model_catalog_id_for_route(provider, model)?;
let entry = llm_config::model_catalog_entry(&catalog_id)?;
if !entry.supports_operation(ModelOperation::Decision) {
return None;
}
let caps = crate::llm::capabilities::lookup(provider, model);
let protocol = caps.decision_protocol?;
if caps.decision_question_kinds.is_empty() {
return None;
}
let pricing = entry.pricing.as_ref();
Some(DecisionContract {
protocol,
question_kinds: caps.decision_question_kinds.clone(),
limits: caps.decision_limits,
input_price_per_mtok: pricing.map(|pricing| pricing.input_per_mtok),
output_price_per_mtok: pricing.map(|pricing| pricing.output_per_mtok),
served_model_id: entry.wire_model.clone().unwrap_or(catalog_id),
})
}