use serde::{Deserialize, Serialize};
use super::candidate::PricingSku;
use super::ids::{ModelId, ProviderId, WireModelId};
#[derive(Debug, Clone, Copy, Default, PartialEq, Eq, Serialize, Deserialize)]
pub struct RouteLimits {
#[serde(default, skip_serializing_if = "Option::is_none")]
pub context_tokens: Option<u64>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub input_tokens: Option<u64>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub output_tokens: Option<u64>,
}
impl RouteLimits {
#[must_use]
pub const fn has_known_limit(self) -> bool {
self.context_tokens.is_some() || self.input_tokens.is_some() || self.output_tokens.is_some()
}
}
#[derive(Debug, Clone, PartialEq)]
pub struct ProviderModelOffering {
pub provider: ProviderId,
pub canonical_model: Option<ModelId>,
pub wire_model_id: WireModelId,
pub endpoint_key: String,
pub default_for_provider: bool,
pub limits: RouteLimits,
pub pricing: PricingSku,
}
struct OfferingSeed {
provider: &'static str,
canonical_model: Option<&'static str>,
wire_model_id: &'static str,
endpoint_key: &'static str,
default_for_provider: bool,
}
const OFFERING_SEEDS: &[OfferingSeed] = &[
OfferingSeed {
provider: "deepseek",
canonical_model: Some("deepseek-v4-pro"),
wire_model_id: "deepseek-v4-pro",
endpoint_key: "chat",
default_for_provider: true,
},
OfferingSeed {
provider: "deepseek",
canonical_model: Some("deepseek-v4-flash"),
wire_model_id: "deepseek-v4-flash",
endpoint_key: "chat",
default_for_provider: false,
},
OfferingSeed {
provider: "together",
canonical_model: Some("deepseek-v4-pro"),
wire_model_id: "deepseek-ai/DeepSeek-V4-Pro",
endpoint_key: "chat",
default_for_provider: true,
},
OfferingSeed {
provider: "openrouter",
canonical_model: Some("deepseek-v4-pro"),
wire_model_id: "deepseek/deepseek-v4-pro",
endpoint_key: "chat",
default_for_provider: true,
},
];
#[must_use]
pub fn bundled_offerings() -> Vec<ProviderModelOffering> {
OFFERING_SEEDS
.iter()
.map(|seed| ProviderModelOffering {
provider: ProviderId::from(seed.provider),
canonical_model: seed.canonical_model.map(ModelId::from),
wire_model_id: WireModelId::from(seed.wire_model_id),
endpoint_key: seed.endpoint_key.to_string(),
default_for_provider: seed.default_for_provider,
limits: RouteLimits::default(),
pricing: PricingSku::UnknownOrStale,
})
.collect()
}