batch_mode_batch_schema/
batch_token_details.rs1crate::ix!();
3
4#[derive(Debug,Serialize,Deserialize)]
5pub struct BatchTokenDetails {
6 cached_tokens: Option<u32>,
7 audio_tokens: Option<u32>,
8 reasoning_tokens: Option<u32>,
9 accepted_prediction_tokens: Option<u32>,
10 rejected_prediction_tokens: Option<u32>,
11}
12
13impl BatchTokenDetails {
14
15 pub fn cached_tokens(&self) -> Option<u32> {
16 self.cached_tokens
17 }
18
19 pub fn audio_tokens(&self) -> Option<u32> {
20 self.audio_tokens
21 }
22
23 pub fn reasoning_tokens(&self) -> Option<u32> {
24 self.reasoning_tokens
25 }
26
27 pub fn accepted_prediction_tokens(&self) -> Option<u32> {
28 self.accepted_prediction_tokens
29 }
30
31 pub fn rejected_prediction_tokens(&self) -> Option<u32> {
32 self.rejected_prediction_tokens
33 }
34
35 pub fn total_tokens(&self) -> u32 {
37 self.cached_tokens.unwrap_or(0)
38 + self.audio_tokens.unwrap_or(0)
39 + self.reasoning_tokens.unwrap_or(0)
40 + self.accepted_prediction_tokens.unwrap_or(0)
41 + self.rejected_prediction_tokens.unwrap_or(0)
42 }
43}
44
45#[cfg(test)]
46mod tests {
47 use super::*;
48 use serde_json::json;
49
50 #[test]
51 fn test_batch_token_details_full() {
52 let json_data = json!({
53 "cached_tokens": 10,
54 "audio_tokens": 20,
55 "reasoning_tokens": 30,
56 "accepted_prediction_tokens": 40,
57 "rejected_prediction_tokens": 50
58 });
59
60 let token_details: BatchTokenDetails = serde_json::from_value(json_data).unwrap();
61
62 assert_eq!(token_details.cached_tokens(), Some(10));
63 assert_eq!(token_details.audio_tokens(), Some(20));
64 assert_eq!(token_details.reasoning_tokens(), Some(30));
65 assert_eq!(token_details.accepted_prediction_tokens(), Some(40));
66 assert_eq!(token_details.rejected_prediction_tokens(), Some(50));
67 assert_eq!(token_details.total_tokens(), 150);
68 }
69
70 #[test]
71 fn test_batch_token_details_partial() {
72 let json_data = json!({
73 "audio_tokens": 25,
74 "accepted_prediction_tokens": 35
75 });
77
78 let token_details: BatchTokenDetails = serde_json::from_value(json_data).unwrap();
79
80 assert_eq!(token_details.cached_tokens(), None);
81 assert_eq!(token_details.audio_tokens(), Some(25));
82 assert_eq!(token_details.reasoning_tokens(), None);
83 assert_eq!(token_details.accepted_prediction_tokens(), Some(35));
84 assert_eq!(token_details.rejected_prediction_tokens(), None);
85 assert_eq!(token_details.total_tokens(), 60);
86 }
87
88 #[test]
89 fn test_batch_token_details_all_missing() {
90 let json_data = json!({});
91
92 let token_details: BatchTokenDetails = serde_json::from_value(json_data).unwrap();
93
94 assert!(token_details.cached_tokens().is_none());
95 assert!(token_details.audio_tokens().is_none());
96 assert!(token_details.reasoning_tokens().is_none());
97 assert!(token_details.accepted_prediction_tokens().is_none());
98 assert!(token_details.rejected_prediction_tokens().is_none());
99 assert_eq!(token_details.total_tokens(), 0);
100 }
101}