use serde::{Deserialize, Serialize};
use crate::ir::safety::SafetyRating;
#[derive(Clone, Debug, Default, Eq, PartialEq, Serialize, Deserialize)]
#[non_exhaustive]
pub struct Usage {
pub input_tokens: u32,
pub output_tokens: u32,
#[serde(default)]
pub cached_input_tokens: u32,
#[serde(default)]
pub cache_creation_input_tokens: u32,
#[serde(default)]
pub reasoning_tokens: u32,
#[serde(default)]
pub safety_ratings: Vec<SafetyRating>,
}
impl Usage {
#[must_use]
pub fn new(input_tokens: u32, output_tokens: u32) -> Self {
Self {
input_tokens,
output_tokens,
..Self::default()
}
}
#[must_use]
pub const fn with_cached_input_tokens(mut self, tokens: u32) -> Self {
self.cached_input_tokens = tokens;
self
}
#[must_use]
pub const fn with_cache_creation_input_tokens(mut self, tokens: u32) -> Self {
self.cache_creation_input_tokens = tokens;
self
}
#[must_use]
pub const fn with_reasoning_tokens(mut self, tokens: u32) -> Self {
self.reasoning_tokens = tokens;
self
}
#[must_use]
pub fn with_safety_ratings(mut self, ratings: Vec<SafetyRating>) -> Self {
self.safety_ratings = ratings;
self
}
#[must_use]
pub const fn billable_input(&self) -> u32 {
self.input_tokens
.saturating_add(self.cache_creation_input_tokens)
}
#[must_use]
pub const fn total(&self) -> u32 {
self.input_tokens.saturating_add(self.output_tokens)
}
}