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#[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#[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#[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#[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#[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#[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