openai_oxide/resources/
models.rs1use crate::client::OpenAI;
4use crate::error::OpenAIError;
5use crate::types::model::{Model, ModelDeleted, ModelList};
6
7pub struct Models<'a> {
11 client: &'a OpenAI,
12}
13
14impl<'a> Models<'a> {
15 pub(crate) fn new(client: &'a OpenAI) -> Self {
16 Self { client }
17 }
18
19 pub async fn list(&self) -> Result<ModelList, OpenAIError> {
23 self.client.get("/models").await
24 }
25
26 pub async fn retrieve(&self, model: &str) -> Result<Model, OpenAIError> {
30 self.client.get(&format!("/models/{model}")).await
31 }
32
33 pub async fn delete(&self, model: &str) -> Result<ModelDeleted, OpenAIError> {
37 self.client.delete(&format!("/models/{model}")).await
38 }
39}
40
41#[cfg(test)]
42mod tests {
43 use crate::OpenAI;
44 use crate::config::ClientConfig;
45
46 #[tokio::test]
47 async fn test_models_list() {
48 let mut server = mockito::Server::new_async().await;
49 let mock = server
50 .mock("GET", "/models")
51 .match_header("authorization", "Bearer sk-test")
52 .with_status(200)
53 .with_header("content-type", "application/json")
54 .with_body(
55 r#"{
56 "object": "list",
57 "data": [
58 {"id": "gpt-4o", "object": "model", "created": 1687882411, "owned_by": "openai"},
59 {"id": "gpt-3.5-turbo", "object": "model", "created": 1677610602, "owned_by": "openai"}
60 ]
61 }"#,
62 )
63 .create_async()
64 .await;
65
66 let client = OpenAI::with_config(ClientConfig::new("sk-test").base_url(server.url()));
67 let response = client.models().list().await.unwrap();
68 assert_eq!(response.data.len(), 2);
69 assert_eq!(response.data[0].id, "gpt-4o");
70 mock.assert_async().await;
71 }
72
73 #[tokio::test]
74 async fn test_models_retrieve() {
75 let mut server = mockito::Server::new_async().await;
76 let mock = server
77 .mock("GET", "/models/gpt-4o")
78 .with_status(200)
79 .with_header("content-type", "application/json")
80 .with_body(
81 r#"{"id": "gpt-4o", "object": "model", "created": 1687882411, "owned_by": "openai"}"#,
82 )
83 .create_async()
84 .await;
85
86 let client = OpenAI::with_config(ClientConfig::new("sk-test").base_url(server.url()));
87 let model = client.models().retrieve("gpt-4o").await.unwrap();
88 assert_eq!(model.id, "gpt-4o");
89 assert_eq!(model.owned_by, "openai");
90 mock.assert_async().await;
91 }
92
93 #[tokio::test]
94 async fn test_models_delete() {
95 let mut server = mockito::Server::new_async().await;
96 let mock = server
97 .mock("DELETE", "/models/ft:gpt-4o:org:custom:id")
98 .with_status(200)
99 .with_header("content-type", "application/json")
100 .with_body(r#"{"id": "ft:gpt-4o:org:custom:id", "object": "model", "deleted": true}"#)
101 .create_async()
102 .await;
103
104 let client = OpenAI::with_config(ClientConfig::new("sk-test").base_url(server.url()));
105 let resp = client
106 .models()
107 .delete("ft:gpt-4o:org:custom:id")
108 .await
109 .unwrap();
110 assert!(resp.deleted);
111 mock.assert_async().await;
112 }
113}