openai_tools/models/
mod.rs

1//! # Models Module
2//!
3//! This module provides functionality for interacting with the OpenAI Models API.
4//! It allows you to list, retrieve, and delete models available in the OpenAI platform.
5//!
6//! ## Key Features
7//!
8//! - **List Models**: Retrieve all available models in your organization
9//! - **Retrieve Model**: Get detailed information about a specific model
10//! - **Delete Model**: Remove fine-tuned models that you own
11//!
12//! ## Quick Start
13//!
14//! ```rust,no_run
15//! use openai_tools::models::request::Models;
16//!
17//! #[tokio::main]
18//! async fn main() -> Result<(), Box<dyn std::error::Error>> {
19//!     // Create a Models client
20//!     let models = Models::new()?;
21//!
22//!     // List all available models
23//!     let response = models.list().await?;
24//!     println!("Found {} models", response.data.len());
25//!
26//!     Ok(())
27//! }
28//! ```
29//!
30//! ## Usage Examples
31//!
32//! ### List All Models
33//!
34//! ```rust,no_run
35//! use openai_tools::models::request::Models;
36//!
37//! #[tokio::main]
38//! async fn main() -> Result<(), Box<dyn std::error::Error>> {
39//!     let models = Models::new()?;
40//!     let response = models.list().await?;
41//!
42//!     for model in &response.data {
43//!         println!("{}: owned by {}", model.id, model.owned_by);
44//!     }
45//!     Ok(())
46//! }
47//! ```
48//!
49//! ### Retrieve a Specific Model
50//!
51//! ```rust,no_run
52//! use openai_tools::models::request::Models;
53//!
54//! #[tokio::main]
55//! async fn main() -> Result<(), Box<dyn std::error::Error>> {
56//!     let models = Models::new()?;
57//!
58//!     // Get details of gpt-4o-mini
59//!     let model = models.retrieve("gpt-4o-mini").await?;
60//!     println!("Model: {}", model.id);
61//!     println!("Owned by: {}", model.owned_by);
62//!     println!("Created: {}", model.created);
63//!
64//!     Ok(())
65//! }
66//! ```
67//!
68//! ### Delete a Fine-tuned Model
69//!
70//! ```rust,no_run
71//! use openai_tools::models::request::Models;
72//!
73//! #[tokio::main]
74//! async fn main() -> Result<(), Box<dyn std::error::Error>> {
75//!     let models = Models::new()?;
76//!
77//!     // Delete a fine-tuned model (must be owned by you)
78//!     let result = models.delete("ft:gpt-4o-mini:my-org:my-suffix:id").await?;
79//!     if result.deleted {
80//!         println!("Successfully deleted: {}", result.id);
81//!     }
82//!
83//!     Ok(())
84//! }
85//! ```
86//!
87//! ## Response Structure
88//!
89//! ### Model Object
90//!
91//! Each model object contains:
92//! - `id`: Model identifier (e.g., "gpt-4o-mini")
93//! - `object`: Always "model"
94//! - `created`: Unix timestamp of creation
95//! - `owned_by`: Organization that owns the model
96//!
97//! ### Delete Response
98//!
99//! When deleting a model:
100//! - `id`: The deleted model's ID
101//! - `object`: Always "model"
102//! - `deleted`: Boolean indicating success
103
104pub mod request;
105pub mod response;
106
107#[cfg(test)]
108mod tests {
109    use crate::models::response::{DeleteResponse, Model, ModelsListResponse};
110
111    #[test]
112    fn test_model_deserialization() {
113        let json = r#"{
114            "id": "gpt-4o-mini",
115            "object": "model",
116            "created": 1686935002,
117            "owned_by": "openai"
118        }"#;
119
120        let model: Model = serde_json::from_str(json).expect("Should deserialize Model");
121        assert_eq!(model.id, "gpt-4o-mini");
122        assert_eq!(model.object, "model");
123        assert_eq!(model.created, 1686935002);
124        assert_eq!(model.owned_by, "openai");
125    }
126
127    #[test]
128    fn test_models_list_response_deserialization() {
129        let json = r#"{
130            "object": "list",
131            "data": [
132                {
133                    "id": "gpt-4o-mini",
134                    "object": "model",
135                    "created": 1686935002,
136                    "owned_by": "openai"
137                },
138                {
139                    "id": "text-embedding-3-small",
140                    "object": "model",
141                    "created": 1705948997,
142                    "owned_by": "openai"
143                }
144            ]
145        }"#;
146
147        let response: ModelsListResponse =
148            serde_json::from_str(json).expect("Should deserialize ModelsListResponse");
149        assert_eq!(response.object, "list");
150        assert_eq!(response.data.len(), 2);
151        assert_eq!(response.data[0].id, "gpt-4o-mini");
152        assert_eq!(response.data[1].id, "text-embedding-3-small");
153    }
154
155    #[test]
156    fn test_delete_response_deserialization() {
157        let json = r#"{
158            "id": "ft:gpt-4o-mini:my-org:my-suffix:abc123",
159            "object": "model",
160            "deleted": true
161        }"#;
162
163        let response: DeleteResponse =
164            serde_json::from_str(json).expect("Should deserialize DeleteResponse");
165        assert_eq!(response.id, "ft:gpt-4o-mini:my-org:my-suffix:abc123");
166        assert_eq!(response.object, "model");
167        assert!(response.deleted);
168    }
169
170    #[test]
171    fn test_model_serialization() {
172        let model = Model {
173            id: "gpt-4o-mini".to_string(),
174            object: "model".to_string(),
175            created: 1686935002,
176            owned_by: "openai".to_string(),
177        };
178
179        let json = serde_json::to_string(&model).expect("Should serialize Model");
180        assert!(json.contains("\"id\":\"gpt-4o-mini\""));
181        assert!(json.contains("\"object\":\"model\""));
182    }
183}