zai_rs/model/audio_to_text/
response.rs1use serde::{Deserialize, Serialize};
2
3#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
5pub struct AudioToTextResponse {
6 pub id: String,
8
9 #[serde(skip_serializing_if = "Option::is_none")]
11 pub created: Option<i64>,
12
13 #[serde(skip_serializing_if = "Option::is_none")]
15 pub request_id: Option<String>,
16
17 pub model: String,
19
20 pub text: String,
22}
23
24#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
26pub struct SpeechToTextEvent {
27 #[serde(skip_serializing_if = "Option::is_none")]
29 pub id: Option<String>,
30 #[serde(skip_serializing_if = "Option::is_none")]
32 pub created: Option<i64>,
33 #[serde(skip_serializing_if = "Option::is_none")]
35 pub model: Option<String>,
36 #[serde(rename = "type", skip_serializing_if = "Option::is_none")]
39 pub event_type: Option<String>,
40 #[serde(skip_serializing_if = "Option::is_none")]
42 pub delta: Option<String>,
43}
44
45#[cfg(test)]
46mod tests {
47 use super::*;
48
49 #[test]
50 fn nonstream_response_requires_id_model_and_text() {
51 for missing in ["id", "model", "text"] {
52 let mut value = serde_json::json!({
53 "id": "asr-1",
54 "model": "glm-asr-2512",
55 "text": "hello"
56 });
57 value.as_object_mut().unwrap().remove(missing);
58 assert!(serde_json::from_value::<AudioToTextResponse>(value).is_err());
59 }
60 }
61
62 #[test]
63 fn stream_event_preserves_open_event_type() {
64 let event: SpeechToTextEvent = serde_json::from_value(serde_json::json!({
65 "id": "asr-1",
66 "type": "transcript.text.future",
67 "delta": "hi"
68 }))
69 .unwrap();
70 assert_eq!(event.event_type.as_deref(), Some("transcript.text.future"));
71 assert_eq!(event.delta.as_deref(), Some("hi"));
72 }
73}