zai_rs/model/text_tokenizer/
response.rs1use serde::{Deserialize, Serialize};
2
3#[derive(Debug, Clone, Serialize, Deserialize)]
5pub struct TokenizerResponse {
6 #[serde(skip_serializing_if = "Option::is_none")]
8 pub created: Option<i64>,
9 pub id: String,
11 #[serde(skip_serializing_if = "Option::is_none")]
13 pub request_id: Option<String>,
14 pub usage: TokenizerUsage,
16}
17
18#[derive(Debug, Clone, Serialize, Deserialize)]
20pub struct TokenizerUsage {
21 #[serde(skip_serializing_if = "Option::is_none")]
23 pub prompt_tokens: Option<f64>,
24 #[serde(skip_serializing_if = "Option::is_none")]
26 pub video_tokens: Option<f64>,
27 #[serde(skip_serializing_if = "Option::is_none")]
29 pub image_tokens: Option<f64>,
30 #[serde(skip_serializing_if = "Option::is_none")]
32 pub total_tokens: Option<f64>,
33}
34
35#[cfg(test)]
36mod tests {
37 use super::TokenizerResponse;
38
39 #[test]
40 fn accepts_optional_metadata_and_usage_fields() {
41 let response: TokenizerResponse = serde_json::from_value(serde_json::json!({
42 "id": "tokenizer-1",
43 "usage": {}
44 }))
45 .expect("created, request_id, and usage properties are optional");
46
47 assert_eq!(response.created, None);
48 assert_eq!(response.usage.prompt_tokens, None);
49 assert_eq!(response.usage.total_tokens, None);
50 }
51
52 #[test]
53 fn rejects_missing_required_top_level_fields() {
54 for value in [
55 serde_json::json!({}),
56 serde_json::json!({ "id": "tokenizer-1" }),
57 serde_json::json!({ "usage": {} }),
58 ] {
59 assert!(serde_json::from_value::<TokenizerResponse>(value).is_err());
60 }
61 }
62}