ai_agent/services/api/
empty_usage.rs1use serde::{Deserialize, Serialize};
4
5#[derive(Debug, Clone, Default, Serialize, Deserialize)]
7pub struct Usage {
8 #[serde(rename = "input_tokens")]
9 pub input_tokens: i64,
10 #[serde(rename = "output_tokens")]
11 pub output_tokens: i64,
12 #[serde(rename = "cache_creation_input_tokens")]
13 pub cache_creation_input_tokens: i64,
14 #[serde(rename = "cache_hit_input_tokens")]
15 pub cache_hit_input_tokens: i64,
16}
17
18impl Usage {
19 pub fn new() -> Self {
20 Self::default()
21 }
22
23 pub fn with_input_tokens(mut self, tokens: i64) -> Self {
24 self.input_tokens = tokens;
25 self
26 }
27
28 pub fn with_output_tokens(mut self, tokens: i64) -> Self {
29 self.output_tokens = tokens;
30 self
31 }
32
33 pub fn total(&self) -> i64 {
34 self.input_tokens + self.output_tokens
35 }
36}
37
38pub fn empty_usage() -> Usage {
40 Usage::default()
41}
42
43pub fn input_only_usage(tokens: i64) -> Usage {
45 Usage::new().with_input_tokens(tokens)
46}
47
48#[cfg(test)]
49mod tests {
50 use super::*;
51
52 #[test]
53 fn test_usage_default() {
54 let usage = Usage::default();
55 assert_eq!(usage.input_tokens, 0);
56 assert_eq!(usage.output_tokens, 0);
57 assert_eq!(usage.total(), 0);
58 }
59
60 #[test]
61 fn test_usage_with_tokens() {
62 let usage = Usage::new().with_input_tokens(100).with_output_tokens(50);
63
64 assert_eq!(usage.input_tokens, 100);
65 assert_eq!(usage.output_tokens, 50);
66 assert_eq!(usage.total(), 150);
67 }
68}