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