use chrono::{DateTime, Utc};
use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, PartialEq, Eq, Hash, Serialize, Deserialize)]
pub struct ProviderKey(pub String);
#[derive(Debug, Clone, Copy, PartialEq, Serialize, Deserialize)]
pub struct TokenCounts {
pub input: u64,
pub output: u64,
}
#[derive(Debug, Clone, Copy, PartialEq, Serialize, Deserialize)]
pub struct PricingRate {
pub input_per_m: f64,
pub output_per_m: f64,
pub use_default: bool,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ModelPricing {
pub provider: String,
pub model: String,
pub input_per_m: f64,
pub output_per_m: f64,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ProviderPrices {
pub provider: String,
pub models: Vec<ModelPricing>,
pub updated_at: DateTime<Utc>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ProviderHarness {
pub provider: String,
pub model: String,
pub input_cost: f64,
pub output_cost: f64,
pub p50_latency_ms: Option<f64>,
pub p95_latency_ms: Option<f64>,
pub success_rate: f64,
}
#[derive(Debug, Clone, Copy, PartialEq, Serialize, Deserialize, Default)]
pub enum RoutingCriteria {
Cost,
Latency,
#[default]
Balanced,
}
impl std::fmt::Display for RoutingCriteria {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
match self {
RoutingCriteria::Cost => write!(f, "cost"),
RoutingCriteria::Latency => write!(f, "latency"),
RoutingCriteria::Balanced => write!(f, "balanced"),
}
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize, Default, clap::ValueEnum)]
pub enum OnUnpricedAction {
Skip,
Error,
#[default]
Warn,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize, Default)]
pub enum MissingCostStrategy {
#[default]
Skip,
UseProviderDefault,
BestEffort,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct PricingAudit {
pub provider: String,
pub model: String,
pub input_tokens: u64,
pub output_tokens: u64,
pub input_cost: f64,
pub output_cost: f64,
pub total_cost: f64,
pub latency_ms: Option<f64>,
pub timestamp: DateTime<Utc>,
pub provider_price_per_m: Option<ModelPricing>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct PricingLint {
pub severity: LintSeverity,
pub provider: String,
pub model: String,
pub message: String,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
pub enum LintSeverity {
Error,
Warn,
Info,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct CostSnapshot {
pub id: String,
pub provider: String,
pub model: String,
pub input_tokens: u64,
pub output_tokens: u64,
pub input_cost: f64,
pub output_cost: f64,
pub total_cost: f64,
pub latency_ms: Option<f64>,
pub timestamp: DateTime<Utc>,
pub routing_criteria: Option<String>,
pub routing_score: Option<f64>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct CostAggregate {
pub total_input_tokens: u64,
pub total_output_tokens: u64,
pub total_input_cost: f64,
pub total_output_cost: f64,
pub total_cost: f64,
pub call_count: usize,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ProviderCostAggregate {
pub provider: String,
pub total_input_tokens: u64,
pub total_output_tokens: u64,
pub total_input_cost: f64,
pub total_output_cost: f64,
pub total_cost: f64,
pub call_count: usize,
pub avg_latency_ms: Option<f64>,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize, Default)]
pub enum OutputFormat {
#[default]
Table,
Json,
Csv,
Markdown,
}
impl std::fmt::Display for OutputFormat {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
match self {
OutputFormat::Table => write!(f, "table"),
OutputFormat::Json => write!(f, "json"),
OutputFormat::Csv => write!(f, "csv"),
OutputFormat::Markdown => write!(f, "markdown"),
}
}
}