openai_req/fine_tunes/
mod.rs

1use crate::{GetRequest, JsonRequest, ByUrlRequest, OpenAiClient};
2
3use reqwest::RequestBuilder;
4
5use derive_more::*;
6use serde::{Serialize,Deserialize};
7use with_id::WithRefId;
8
9
10///create fine-tune request as in https://platform.openai.com/docs/api-reference/fine-tunes/create
11/// # Usage example
12///```
13/// use openai_req::ByUrlRequest;
14/// use openai_req::files::FileInfoRequest;
15///
16/// let info_request= FileInfoRequest::new("training_file_id".to_string());
17/// let info = info_request.run(&client).await?;
18/// ```
19#[derive(Serialize, Deserialize, Debug, Clone)]
20pub struct FineTuneCreateRequest {
21    training_file: String,
22    #[serde(skip_serializing_if = "Option::is_none")]
23    validation_file: Option<String>,
24    #[serde(skip_serializing_if = "Option::is_none")]
25    model: Option<String>,
26    #[serde(skip_serializing_if = "Option::is_none")]
27    n_epochs: Option<i32>,
28    #[serde(skip_serializing_if = "Option::is_none")]
29    batch_size: Option<i32>,
30    #[serde(skip_serializing_if = "Option::is_none")]
31    learning_rate_multiplier: Option<f64>,
32    #[serde(skip_serializing_if = "Option::is_none")]
33    prompt_loss_weight: Option<f64>,
34    #[serde(skip_serializing_if = "Option::is_none")]
35    compute_classification_metrics: Option<bool>,
36    #[serde(skip_serializing_if = "Option::is_none")]
37    classification_n_classes: Option<i32>,
38    #[serde(skip_serializing_if = "Option::is_none")]
39    classification_positive_class: Option<String>,
40    #[serde(skip_serializing_if = "Option::is_none")]
41    classification_betas: Option<Vec<f64>>,
42    #[serde(skip_serializing_if = "Option::is_none")]
43    suffix: Option<String>,
44}
45
46impl JsonRequest<FineTune> for FineTuneCreateRequest{
47    const ENDPOINT: &'static str = "/fine-tunes";
48}
49
50impl FineTuneCreateRequest {
51    pub fn new(training_file: String) -> Self {
52        FineTuneCreateRequest {
53            training_file,
54            validation_file: None,
55            model: None,
56            n_epochs: None,
57            batch_size: None,
58            learning_rate_multiplier: None,
59            prompt_loss_weight: None,
60            compute_classification_metrics: None,
61            classification_n_classes: None,
62            classification_positive_class: None,
63            classification_betas: None,
64            suffix: None,
65        }
66    }
67
68    pub fn validation_file(mut self, validation_file: String) -> Self {
69        self.validation_file = Some(validation_file);
70        self
71    }
72
73    pub fn model(mut self, model: String) -> Self {
74        self.model = Some(model);
75        self
76    }
77
78    pub fn n_epochs(mut self, n_epochs: i32) -> Self {
79        self.n_epochs = Some(n_epochs);
80        self
81    }
82
83    pub fn batch_size(mut self, batch_size: i32) -> Self {
84        self.batch_size = Some(batch_size);
85        self
86    }
87
88    pub fn learning_rate_multiplier(mut self, learning_rate_multiplier: f64) -> Self {
89        self.learning_rate_multiplier = Some(learning_rate_multiplier);
90        self
91    }
92
93    pub fn prompt_loss_weight(mut self, prompt_loss_weight: f64) -> Self {
94        self.prompt_loss_weight = Some(prompt_loss_weight);
95        self
96    }
97
98    pub fn compute_classification_metrics(mut self, compute_classification_metrics: bool) -> Self {
99        self.compute_classification_metrics = Some(compute_classification_metrics);
100        self
101    }
102
103    pub fn classification_n_classes(mut self, classification_n_classes: i32) -> Self {
104        self.classification_n_classes = Some(classification_n_classes);
105        self
106    }
107
108    pub fn classification_positive_class(mut self, classification_positive_class: String) -> Self {
109        self.classification_positive_class = Some(classification_positive_class);
110        self
111    }
112
113    pub fn classification_betas(mut self, classification_betas: Vec<f64>) -> Self {
114        self.classification_betas = Some(classification_betas);
115        self
116    }
117
118    pub fn suffix(mut self, suffix: String) -> Self {
119        self.suffix = Some(suffix);
120        self
121    }
122}
123
124/// Cancel fine tune request.
125/// Details at https://platform.openai.com/docs/api-reference/fine-tunes/cancel
126/// # Usage example
127/// ```
128/// use openai_req::ByUrlRequest;
129/// use openai_req::fine_tunes::FineTuneCancelRequest;
130///
131/// let request = FineTuneCancelRequest::new("fine_tune_id".to_string());
132/// let result = request.run(&client).await?;
133/// ```
134#[derive(Serialize, Deserialize, Debug, Clone,WithRefId, Constructor)]
135pub struct FineTuneCancelRequest{
136    id:String
137}
138
139impl From<FineTuneListEntry> for FineTuneCancelRequest{
140    fn from(value: FineTuneListEntry) -> Self {
141        FineTuneCancelRequest{
142            id:value.id
143        }
144    }
145}
146
147impl From<FineTune> for FineTuneCancelRequest{
148    fn from(value: FineTune) -> Self {
149        FineTuneCancelRequest{
150            id: value.id
151        }
152    }
153}
154
155impl ByUrlRequest<FineTune> for FineTuneCancelRequest {
156    const ENDPOINT: &'static str = "/fine-tunes/";
157    const SUFFIX: &'static str = "/cancel";
158
159    fn builder(client:&OpenAiClient, final_url: String) -> RequestBuilder {
160        client.client.post(final_url)
161    }
162}
163
164///Get list of all available fine-tunes
165/// Details at https://platform.openai.com/docs/api-reference/fine-tunes/list
166/// # Usage example
167///```
168/// use openai_req::fine_tunes::FineTuneListResponse;
169/// use openai_req::GetRequest;
170///
171/// let fine_tunes = FineTuneListResponse::get(&client).await?;
172/// ```
173#[derive(Serialize, Deserialize, Debug, Clone)]
174pub struct FineTuneListResponse {
175    pub object: String,
176    pub data: Vec<FineTuneListEntry>
177}
178
179impl GetRequest for FineTuneListResponse {
180    const ENDPOINT: &'static str = "/fine-tunes";
181}
182
183#[derive(Serialize, Deserialize, Debug, Clone, WithRefId)]
184pub struct FineTuneListEntry {
185    pub id: String,
186    pub object: String,
187    pub model: String,
188    pub created_at: i64,
189    pub fine_tuned_model: Option<String>,
190    pub hyperparams: Hyperparams,
191    pub organization_id: String,
192    pub result_files: Vec<FineTuneFileInfo>,
193    pub status: String,
194    pub validation_files: Vec<FineTuneFileInfo>,
195    pub training_files: Vec<FineTuneFileInfo>,
196    pub updated_at: i64,
197}
198
199
200///Get information about single fine tune.
201/// Details at https://platform.openai.com/docs/api-reference/fine-tunes/retrieve
202/// # Usage example
203///```
204/// use openai_req::ByUrlRequest;
205/// use openai_req::fine_tunes::FineTuneGetRequest;
206///
207/// let req = FineTuneGetRequest::new("fine_tune_id".to_string());
208/// let res = req.run(&client).await?;
209/// ```
210#[derive(Serialize, Deserialize, Debug, Clone,WithRefId, Constructor)]
211pub struct FineTuneGetRequest{
212    id: String
213}
214
215impl From<FineTuneListEntry> for FineTuneGetRequest{
216    fn from(value: FineTuneListEntry) -> Self {
217        FineTuneGetRequest{
218            id: value.id
219        }
220    }
221}
222
223impl ByUrlRequest<FineTune> for FineTuneGetRequest {
224    const ENDPOINT: &'static str = "/fine-tunes/";
225    const SUFFIX: &'static str = "";
226}
227
228#[derive(Serialize, Deserialize, Debug, Clone, WithRefId)]
229pub struct FineTune {
230    pub id: String,
231    pub object: String,
232    pub model: String,
233    pub created_at: i64,
234    pub events: Vec<FineTuneEvent>,
235    pub fine_tuned_model: Option<String>,
236    pub hyperparams: Hyperparams,
237    pub organization_id: String,
238    pub result_files: Vec<FineTuneFileInfo>,
239    pub status: String,
240    pub validation_files: Vec<FineTuneFileInfo>,
241    pub training_files: Vec<FineTuneFileInfo>,
242    pub updated_at: i64,
243}
244
245
246#[derive(Serialize, Deserialize, Debug, Clone)]
247pub struct Hyperparams {
248    pub batch_size: Option<i64>,
249    pub learning_rate_multiplier: Option<f64>,
250    pub n_epochs: i64,
251    pub prompt_loss_weight: f64,
252}
253
254
255#[derive(Serialize, Deserialize, Debug, Clone)]
256pub struct FineTuneEvent {
257    pub object: String,
258    pub created_at: i64,
259    pub level: String,
260    pub message: String,
261}
262
263///Provides same fields as files::FileInfo(and can be converted `.into()` it)
264///but also provides additional status information in context of fine-tune.
265#[derive(Serialize, Deserialize, Debug, Clone)]
266pub struct FineTuneFileInfo{
267    pub id: String,
268    pub object: String,
269    pub bytes: i64,
270    pub created_at: i64,
271    pub filename: String,
272    pub purpose: String,
273    pub status: String,
274    pub status_details: Option<String>
275}
276
277/// Get fine-tune events for certain fine-tune.
278/// More details at https://platform.openai.com/docs/api-reference/fine-tunes/events
279/// # Usage example
280/// ```
281/// use openai_req::ByUrlRequest;
282/// use openai_req::fine_tunes::FineTuneEventsGetRequest;
283///
284/// let req = FineTuneEventsGetRequest::new("fine_tune_id".to_string());
285/// let events = req.run(&client).await?;
286/// ```
287#[derive(Serialize, Deserialize, Debug, Clone, WithRefId, Constructor)]
288pub struct FineTuneEventsGetRequest{
289    id: String
290}
291
292impl From<FineTuneListEntry> for FineTuneEventsGetRequest{
293    fn from(value: FineTuneListEntry) -> Self {
294        FineTuneEventsGetRequest{
295            id:value.id
296        }
297    }
298}
299
300impl From<FineTune> for FineTuneEventsGetRequest{
301    fn from(value: FineTune) -> Self {
302        FineTuneEventsGetRequest{
303            id: value.id
304        }
305    }
306}
307
308impl ByUrlRequest<FineTuneEventsResponse> for FineTuneEventsGetRequest{
309    const ENDPOINT: &'static str = "/fine-tunes/";
310    const SUFFIX: &'static str = "/events";
311}
312
313
314
315#[derive(Serialize, Deserialize, Debug, Clone)]
316pub struct FineTuneEventsResponse{
317    pub object: String,
318    pub data: Vec<FineTuneEvent>
319}
320
321
322
323
324