use serde::{Deserialize, Serialize};
#[derive(Serialize, Deserialize, Debug, Clone)]
#[serde(rename_all = "lowercase")]
pub enum ProviderSortBy {
Price,
Throughput,
Latency,
}
#[derive(Serialize, Deserialize, Debug, Clone)]
#[serde(rename_all = "lowercase")]
pub enum DataCollectionPolicy {
Allow,
Deny,
}
#[derive(Serialize, Deserialize, Debug, Clone)]
#[serde(rename_all = "lowercase")]
pub enum Quantization {
Int4,
Int8,
Fp4,
Fp6,
Fp8,
Fp16,
Bf16,
Fp32,
Unknown,
}
#[derive(Serialize, Deserialize, Debug, Clone)]
#[serde(untagged)]
pub enum PerformancePreference {
Value(f64),
Percentiles(PercentileCutoffs),
}
#[derive(Serialize, Deserialize, Debug, Clone, Default)]
#[serde(default, deny_unknown_fields)]
pub struct PercentileCutoffs {
#[serde(skip_serializing_if = "Option::is_none")]
pub p50: Option<f64>,
#[serde(skip_serializing_if = "Option::is_none")]
pub p75: Option<f64>,
#[serde(skip_serializing_if = "Option::is_none")]
pub p90: Option<f64>,
#[serde(skip_serializing_if = "Option::is_none")]
pub p99: Option<f64>,
}
#[derive(Serialize, Deserialize, Debug, Clone)]
#[serde(untagged)]
pub enum PriceLimit {
Number(f64),
String(String),
}
impl From<f64> for PriceLimit {
fn from(value: f64) -> Self {
Self::Number(value)
}
}
impl From<String> for PriceLimit {
fn from(value: String) -> Self {
Self::String(value)
}
}
impl From<&str> for PriceLimit {
fn from(value: &str) -> Self {
Self::String(value.to_string())
}
}
#[derive(Serialize, Deserialize, Debug, Clone, Default)]
#[serde(default, deny_unknown_fields)]
pub struct MaxPrice {
#[serde(skip_serializing_if = "Option::is_none")]
pub prompt: Option<PriceLimit>,
#[serde(skip_serializing_if = "Option::is_none")]
pub completion: Option<PriceLimit>,
#[serde(skip_serializing_if = "Option::is_none")]
pub image: Option<PriceLimit>,
#[serde(skip_serializing_if = "Option::is_none")]
pub audio: Option<PriceLimit>,
#[serde(skip_serializing_if = "Option::is_none")]
pub request: Option<PriceLimit>,
}
#[derive(Serialize, Deserialize, Debug, Clone, Default)]
#[serde(default, deny_unknown_fields)]
pub struct ProviderPreferences {
#[serde(skip_serializing_if = "Option::is_none")]
pub allow_fallbacks: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub require_parameters: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub data_collection: Option<DataCollectionPolicy>,
#[serde(skip_serializing_if = "Option::is_none")]
pub zdr: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub enforce_distillable_text: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub order: Option<Vec<String>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub only: Option<Vec<String>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub ignore: Option<Vec<String>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub quantizations: Option<Vec<Quantization>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub sort: Option<ProviderSortBy>,
#[serde(skip_serializing_if = "Option::is_none")]
pub max_price: Option<MaxPrice>,
#[serde(skip_serializing_if = "Option::is_none")]
pub preferred_min_throughput: Option<PerformancePreference>,
#[serde(skip_serializing_if = "Option::is_none")]
pub preferred_max_latency: Option<PerformancePreference>,
}