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}