gproxy_protocol/protocol/openai/
models.rs1use std::collections::BTreeMap;
2
3use serde::{Deserialize, Serialize};
4
5use super::common::*;
6
7pub type ModelsWireModel = OpenAiWireModel<(), ModelListResponse>;
8pub type ModelRetrieveWireModel = OpenAiWireModel<(), Model>;
9
10#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
11pub struct ModelListResponse {
12 pub data: Vec<Model>,
13 pub object: ListObjectType,
14 #[serde(default, flatten, skip_serializing_if = "BTreeMap::is_empty")]
15 pub extra: Extra,
16}
17
18#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
19pub struct Model {
20 pub id: OpenAiModelId,
21 #[serde(default, skip_serializing_if = "Option::is_none")]
25 pub created: Option<u64>,
26 pub object: ModelObjectType,
27 pub owned_by: String,
28 #[serde(default, flatten, skip_serializing_if = "BTreeMap::is_empty")]
29 pub extra: Extra,
30}
31
32#[cfg(test)]
33mod tests {
34 use super::*;
35
36 #[test]
39 fn model_decodes_without_created() {
40 let m: Model = serde_json::from_str(
41 r#"{"id":"deepseek-chat","object":"model","owned_by":"deepseek"}"#,
42 )
43 .expect("decode without created");
44 assert_eq!(m.created, None);
45 let s = serde_json::to_string(&m).unwrap();
47 assert!(!s.contains("created"), "{s}");
48 }
49}