#[derive(Debug, Clone, Copy)]
pub struct ModelCost {
pub prompt_per_1k: f64,
pub completion_per_1k: f64,
}
impl ModelCost {
pub fn calculate(&self, prompt_tokens: u32, completion_tokens: u32) -> f64 {
(prompt_tokens as f64 / 1000.0) * self.prompt_per_1k
+ (completion_tokens as f64 / 1000.0) * self.completion_per_1k
}
}
pub const GPT4O: ModelCost = ModelCost {
prompt_per_1k: 0.0025,
completion_per_1k: 0.010,
};
pub const GPT4O_MINI: ModelCost = ModelCost {
prompt_per_1k: 0.000150,
completion_per_1k: 0.000600,
};
pub const GPT35_TURBO: ModelCost = ModelCost {
prompt_per_1k: 0.0005,
completion_per_1k: 0.0015,
};
pub const GPT4_TURBO: ModelCost = ModelCost {
prompt_per_1k: 0.010,
completion_per_1k: 0.030,
};
pub const CLAUDE_35_SONNET: ModelCost = ModelCost {
prompt_per_1k: 0.003,
completion_per_1k: 0.015,
};
pub const CLAUDE_35_HAIKU: ModelCost = ModelCost {
prompt_per_1k: 0.0008,
completion_per_1k: 0.004,
};
pub const CLAUDE_3_OPUS: ModelCost = ModelCost {
prompt_per_1k: 0.015,
completion_per_1k: 0.075,
};
pub const CLAUDE_3_HAIKU: ModelCost = ModelCost {
prompt_per_1k: 0.00025,
completion_per_1k: 0.00125,
};
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_cost_calculation() {
let cost = GPT4O_MINI.calculate(1000, 500);
let expected = 0.000150 + 0.000300;
assert!((cost - expected).abs() < 1e-9);
}
}