use crate::client::GroqClient;
use crate::error::GroqError;
use serde::{Deserialize, Serialize};
#[derive(Serialize, Clone)]
pub struct FineTuningCreateRequest {
pub base_model: String,
pub input_file_id: String,
pub name: String,
pub type_: String,
}
#[derive(Deserialize, Debug, Clone)]
pub struct FineTuning {
pub id: String,
pub name: String,
pub base_model: String,
pub type_: String,
pub input_file_id: String,
pub created_at: u64,
pub status: String,
pub fine_tuned_model: Option<String>,
pub training_progress: Option<serde_json::Value>,
pub error: Option<serde_json::Value>,
}
#[derive(Deserialize, Debug, Clone)]
pub struct FineTuningList {
pub object: String,
pub data: Vec<FineTuning>,
pub has_more: bool,
}
pub struct FineTuningRequestBuilder<'a> {
client: &'a GroqClient,
}
impl<'a> FineTuningRequestBuilder<'a> {
pub fn new(client: &'a GroqClient) -> Self {
Self { client }
}
pub async fn create(self, req: FineTuningCreateRequest) -> Result<FineTuning, GroqError> {
let body = serde_json::to_value(req)?;
let response = self.client.transport.post_json("fine_tuning/jobs", &body).await?;
serde_json::from_value(response).map_err(GroqError::from)
}
pub async fn retrieve(self, fine_tuning_id: String) -> Result<FineTuning, GroqError> {
let path = format!("fine_tuning/jobs/{}", fine_tuning_id);
let response = self.client.transport.get_json(&path).await?;
serde_json::from_value(response).map_err(GroqError::from)
}
pub async fn list(self, after: Option<String>, limit: Option<u32>) -> Result<FineTuningList, GroqError> {
let mut params = Vec::new();
if let Some(after_id) = after {
params.push(("after", after_id));
}
if let Some(limit_val) = limit {
params.push(("limit", limit_val.to_string()));
}
if params.is_empty() {
let response = self.client.transport.get_json("fine_tuning/jobs").await?;
serde_json::from_value(response).map_err(GroqError::from)
} else {
let response = self.client.transport.get_with_params("fine_tuning/jobs", ¶ms).await?;
serde_json::from_value(response).map_err(GroqError::from)
}
}
pub async fn cancel(self, fine_tuning_id: String) -> Result<FineTuning, GroqError> {
let path = format!("fine_tuning/jobs/{}/cancel", fine_tuning_id);
let body = serde_json::Value::Null;
let response = self.client.transport.post_json(&path, &body).await?;
serde_json::from_value(response).map_err(GroqError::from)
}
}