use serde::{Deserialize, Serialize};
use std::collections::HashMap;
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
pub struct BillingConfig {
#[serde(default)]
pub model_pricing: HashMap<String, ModelPricingConfig>,
}
impl BillingConfig {
pub fn pricing_for(
&self,
provider_name: &str,
model_name: &str,
) -> Option<&ModelPricingConfig> {
let provider_key = pricing_key(provider_name);
let model_key = pricing_key(model_name);
self.model_pricing.values().find(|pricing| {
pricing_key(&pricing.provider) == provider_key
&& pricing_key(&pricing.model) == model_key
})
}
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ModelPricingConfig {
pub provider: String,
pub model: String,
pub input_usd_per_million_tokens: Option<f64>,
pub output_usd_per_million_tokens: Option<f64>,
#[serde(default = "default_billing_currency")]
pub currency: String,
}
fn default_billing_currency() -> String {
"USD".to_string()
}
fn pricing_key(value: &str) -> String {
value.trim().to_ascii_lowercase()
}