Skip to main content

zai_rs/model/text_tokenizer/
response.rs

1use serde::{Deserialize, Serialize};
2
3/// Top-level response from the tokenizer endpoint.
4#[derive(Debug, Clone, Serialize, Deserialize)]
5pub struct TokenizerResponse {
6    /// Unix timestamp (seconds) at which the result was created.
7    #[serde(skip_serializing_if = "Option::is_none")]
8    pub created: Option<i64>,
9    /// Response id.
10    pub id: String,
11    /// Client-side request id, if one was supplied.
12    #[serde(skip_serializing_if = "Option::is_none")]
13    pub request_id: Option<String>,
14    /// Token-usage statistics for the input.
15    pub usage: TokenizerUsage,
16}
17
18/// Token-usage statistics returned by the tokenizer.
19#[derive(Debug, Clone, Serialize, Deserialize)]
20pub struct TokenizerUsage {
21    /// Number of prompt tokens for the supplied messages.
22    #[serde(skip_serializing_if = "Option::is_none")]
23    pub prompt_tokens: Option<f64>,
24    /// Number of video tokens for the supplied messages.
25    #[serde(skip_serializing_if = "Option::is_none")]
26    pub video_tokens: Option<f64>,
27    /// Number of image tokens for the supplied messages.
28    #[serde(skip_serializing_if = "Option::is_none")]
29    pub image_tokens: Option<f64>,
30    /// Total number of tokens for the supplied messages.
31    #[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}