use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
#[serde(rename_all = "snake_case")]
pub enum FineTuningJobStatus {
ValidatingFiles,
Queued,
Running,
Succeeded,
Failed,
Cancelled,
}
#[derive(Debug, Clone, Serialize, Deserialize, Default)]
pub struct Hyperparameters {
#[serde(skip_serializing_if = "Option::is_none")]
pub n_epochs: Option<u32>,
#[serde(skip_serializing_if = "Option::is_none")]
pub batch_size: Option<u32>,
#[serde(skip_serializing_if = "Option::is_none")]
pub learning_rate_multiplier: Option<f64>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct FineTuningError {
pub code: String,
pub message: String,
pub param: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct Integration {
#[serde(rename = "type")]
pub integration_type: String,
#[serde(flatten)]
pub settings: serde_json::Value,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct MethodConfig {
#[serde(rename = "type")]
pub method_type: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub supervised: Option<SupervisedConfig>,
#[serde(skip_serializing_if = "Option::is_none")]
pub dpo: Option<DpoConfig>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct SupervisedConfig {
#[serde(skip_serializing_if = "Option::is_none")]
pub hyperparameters: Option<Hyperparameters>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct DpoConfig {
#[serde(skip_serializing_if = "Option::is_none")]
pub hyperparameters: Option<Hyperparameters>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct FineTuningJob {
pub id: String,
pub object: String,
pub model: String,
pub created_at: i64,
pub finished_at: Option<i64>,
pub fine_tuned_model: Option<String>,
pub organization_id: String,
pub result_files: Vec<String>,
pub status: FineTuningJobStatus,
pub validation_file: Option<String>,
pub training_file: String,
pub hyperparameters: Hyperparameters,
pub trained_tokens: Option<u64>,
pub error: Option<FineTuningError>,
pub seed: u64,
pub estimated_finish: Option<i64>,
pub integrations: Option<Vec<Integration>>,
pub method: Option<MethodConfig>,
pub user_provided_suffix: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct FineTuningJobListResponse {
pub object: String,
pub data: Vec<FineTuningJob>,
pub has_more: bool,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct FineTuningEvent {
pub id: String,
pub object: String,
pub created_at: i64,
pub level: String,
pub message: String,
pub data: Option<serde_json::Value>,
#[serde(rename = "type")]
pub event_type: String,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct FineTuningEventListResponse {
pub object: String,
pub data: Vec<FineTuningEvent>,
pub has_more: bool,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct CheckpointMetrics {
pub step: u32,
pub train_loss: f64,
pub train_mean_token_accuracy: f64,
pub valid_loss: Option<f64>,
pub valid_mean_token_accuracy: Option<f64>,
pub full_valid_loss: Option<f64>,
pub full_valid_mean_token_accuracy: Option<f64>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct FineTuningCheckpoint {
pub id: String,
pub object: String,
pub created_at: i64,
pub fine_tuning_job_id: String,
pub fine_tuned_model_checkpoint: String,
pub step_number: u32,
pub metrics: CheckpointMetrics,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct FineTuningCheckpointListResponse {
pub object: String,
pub data: Vec<FineTuningCheckpoint>,
pub first_id: Option<String>,
pub last_id: Option<String>,
pub has_more: bool,
}