Skip to main content

openai_oxide/resources/
models.rs

1// Models resource — client.models().list() / retrieve() / delete()
2
3use crate::client::OpenAI;
4use crate::error::OpenAIError;
5use crate::types::model::{Model, ModelDeleted, ModelList};
6
7/// Access model endpoints.
8///
9/// API reference: <https://platform.openai.com/docs/api-reference/models>
10pub 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    /// List available models.
20    ///
21    /// `GET /models`
22    pub async fn list(&self) -> Result<ModelList, OpenAIError> {
23        self.client.get("/models").await
24    }
25
26    /// Retrieve a model by ID.
27    ///
28    /// `GET /models/{model}`
29    pub async fn retrieve(&self, model: &str) -> Result<Model, OpenAIError> {
30        self.client.get(&format!("/models/{model}")).await
31    }
32
33    /// Delete a fine-tuned model.
34    ///
35    /// `DELETE /models/{model}`
36    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}