use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
#[cfg_attr(feature = "structured", derive(schemars::JsonSchema))]
#[non_exhaustive]
pub enum FineTuningStatus {
#[serde(rename = "validating_files")]
ValidatingFiles,
#[serde(rename = "queued")]
Queued,
#[serde(rename = "running")]
Running,
#[serde(rename = "succeeded")]
Succeeded,
#[serde(rename = "failed")]
Failed,
#[serde(rename = "cancelled")]
Cancelled,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
#[cfg_attr(feature = "structured", derive(schemars::JsonSchema))]
#[non_exhaustive]
pub enum FineTuningEventLevel {
#[serde(rename = "info")]
Info,
#[serde(rename = "warn")]
Warn,
#[serde(rename = "error")]
Error,
}
#[derive(Debug, Clone, Serialize)]
pub struct FineTuningJobCreateRequest {
pub model: String,
pub training_file: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub hyperparameters: Option<Hyperparameters>,
#[serde(skip_serializing_if = "Option::is_none")]
pub suffix: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub validation_file: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub seed: Option<i64>,
}
impl FineTuningJobCreateRequest {
pub fn new(model: impl Into<String>, training_file: impl Into<String>) -> Self {
Self {
model: model.into(),
training_file: training_file.into(),
hyperparameters: None,
suffix: None,
validation_file: None,
seed: None,
}
}
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct Hyperparameters {
#[serde(skip_serializing_if = "Option::is_none")]
pub n_epochs: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub batch_size: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub learning_rate_multiplier: Option<String>,
}
#[derive(Debug, Clone, Deserialize)]
pub struct FineTuningError {
pub code: String,
pub message: String,
#[serde(default)]
pub param: Option<String>,
}
#[derive(Debug, Clone, Deserialize)]
pub struct FineTuningJob {
pub id: String,
pub object: String,
pub created_at: i64,
pub model: String,
pub training_file: String,
pub status: FineTuningStatus,
#[serde(default)]
pub fine_tuned_model: Option<String>,
#[serde(default)]
pub finished_at: Option<i64>,
#[serde(default)]
pub error: Option<FineTuningError>,
#[serde(default)]
pub hyperparameters: Option<Hyperparameters>,
pub organization_id: String,
#[serde(default)]
pub result_files: Vec<String>,
#[serde(default)]
pub trained_tokens: Option<i64>,
#[serde(default)]
pub validation_file: Option<String>,
#[serde(default)]
pub estimated_finish: Option<i64>,
pub seed: i64,
}
#[derive(Debug, Clone, Deserialize)]
pub struct FineTuningJobList {
pub object: String,
pub data: Vec<FineTuningJob>,
#[serde(default)]
pub has_more: Option<bool>,
}
#[derive(Debug, Clone, Deserialize)]
pub struct FineTuningJobEvent {
pub id: String,
pub object: String,
pub created_at: i64,
pub level: FineTuningEventLevel,
pub message: String,
#[serde(default)]
pub data: Option<serde_json::Value>,
#[serde(default, rename = "type")]
pub type_: Option<String>,
}
#[derive(Debug, Clone, Deserialize)]
pub struct FineTuningJobEventList {
pub object: String,
pub data: Vec<FineTuningJobEvent>,
#[serde(default)]
pub has_more: Option<bool>,
}
#[derive(Debug, Clone, Default)]
pub struct FineTuningJobListParams {
pub after: Option<String>,
pub limit: Option<i64>,
}
impl FineTuningJobListParams {
pub fn new() -> Self {
Self::default()
}
pub fn after(mut self, after: impl Into<String>) -> Self {
self.after = Some(after.into());
self
}
pub fn limit(mut self, limit: i64) -> Self {
self.limit = Some(limit);
self
}
pub fn to_query(&self) -> Vec<(String, String)> {
let mut q = Vec::new();
if let Some(ref after) = self.after {
q.push(("after".into(), after.clone()));
}
if let Some(limit) = self.limit {
q.push(("limit".into(), limit.to_string()));
}
q
}
}
#[derive(Debug, Clone, Default)]
pub struct FineTuningEventListParams {
pub after: Option<String>,
pub limit: Option<i64>,
}
impl FineTuningEventListParams {
pub fn new() -> Self {
Self::default()
}
pub fn after(mut self, after: impl Into<String>) -> Self {
self.after = Some(after.into());
self
}
pub fn limit(mut self, limit: i64) -> Self {
self.limit = Some(limit);
self
}
pub fn to_query(&self) -> Vec<(String, String)> {
let mut q = Vec::new();
if let Some(ref after) = self.after {
q.push(("after".into(), after.clone()));
}
if let Some(limit) = self.limit {
q.push(("limit".into(), limit.to_string()));
}
q
}
}