use std::collections::BTreeMap;
use http::Method;
use serde::{Deserialize, Serialize};
use serde_json::Value;
use crate::generated::endpoints;
use crate::json_payload::JsonPayload;
use super::{
DeleteResponse, FineTuningAlphaGradersResource, FineTuningAlphaResource, FineTuningCheckpoint,
FineTuningCheckpointPermission, FineTuningCheckpointPermissionsResource, FineTuningJob,
FineTuningJobCheckpointsResource, FineTuningJobCreateRequestBuilder, FineTuningJobEvent,
FineTuningJobsResource, FineTuningResource, GradersResource, JsonRequestBuilder,
ListRequestBuilder, encode_path_segment,
};
#[derive(Debug, Clone, Serialize, Deserialize, Default)]
pub struct GraderRunResponse {
pub metadata: Option<GraderRunMetadata>,
#[serde(default)]
pub model_grader_token_usage_per_model: BTreeMap<String, Value>,
pub reward: Option<f64>,
#[serde(default)]
pub sub_rewards: BTreeMap<String, Value>,
#[serde(flatten)]
pub extra: BTreeMap<String, Value>,
}
#[derive(Debug, Clone, Serialize, Deserialize, Default)]
pub struct GraderRunMetadata {
pub errors: Option<GraderRunErrors>,
pub execution_time: Option<f64>,
pub name: Option<String>,
pub sampled_model_name: Option<String>,
#[serde(default)]
pub scores: BTreeMap<String, Value>,
pub token_usage: Option<u64>,
#[serde(rename = "type")]
pub grader_type: Option<String>,
#[serde(flatten)]
pub extra: BTreeMap<String, Value>,
}
#[derive(Debug, Clone, Serialize, Deserialize, Default)]
pub struct GraderRunErrors {
#[serde(default)]
pub formula_parse_error: bool,
#[serde(default)]
pub invalid_variable_error: bool,
#[serde(default)]
pub model_grader_parse_error: bool,
#[serde(default)]
pub model_grader_refusal_error: bool,
#[serde(default)]
pub model_grader_server_error: bool,
pub model_grader_server_error_details: Option<String>,
#[serde(default)]
pub other_error: bool,
#[serde(default)]
pub python_grader_runtime_error: bool,
pub python_grader_runtime_error_details: Option<String>,
#[serde(default)]
pub python_grader_server_error: bool,
pub python_grader_server_error_type: Option<String>,
#[serde(default)]
pub sample_parse_error: bool,
#[serde(default)]
pub truncated_observation_error: bool,
#[serde(default)]
pub unresponsive_reward_error: bool,
#[serde(flatten)]
pub extra: BTreeMap<String, Value>,
}
#[derive(Debug, Clone, Serialize, Deserialize, Default)]
pub struct GraderValidateResponse {
pub grader: Option<JsonPayload>,
#[serde(flatten)]
pub extra: BTreeMap<String, Value>,
}
#[derive(Debug, Clone, Serialize, Deserialize, Default)]
pub struct GraderModelCatalog {
pub object: Option<String>,
#[serde(default)]
pub data: Vec<GraderModel>,
#[serde(flatten)]
pub extra: BTreeMap<String, Value>,
}
#[derive(Debug, Clone, Serialize, Deserialize, Default)]
pub struct GraderModel {
pub id: Option<String>,
pub name: Option<String>,
#[serde(rename = "type")]
pub grader_type: Option<String>,
#[serde(flatten)]
pub extra: BTreeMap<String, Value>,
}
impl FineTuningResource {
pub fn jobs(&self) -> FineTuningJobsResource {
FineTuningJobsResource::new(self.client.clone())
}
pub fn checkpoints(&self) -> FineTuningCheckpointPermissionsResource {
FineTuningCheckpointPermissionsResource::new(self.client.clone())
}
pub fn alpha(&self) -> FineTuningAlphaResource {
FineTuningAlphaResource::new(self.client.clone())
}
}
impl FineTuningJobsResource {
pub fn create(&self) -> FineTuningJobCreateRequestBuilder {
FineTuningJobCreateRequestBuilder::new(self.client.clone())
}
pub fn retrieve(&self, job_id: impl Into<String>) -> JsonRequestBuilder<FineTuningJob> {
JsonRequestBuilder::new(
self.client.clone(),
"fine_tuning.jobs.retrieve",
Method::GET,
format!("/fine_tuning/jobs/{}", encode_path_segment(job_id.into())),
)
}
pub fn list(&self) -> ListRequestBuilder<FineTuningJob> {
ListRequestBuilder::new(
self.client.clone(),
"fine_tuning.jobs.list",
"/fine_tuning/jobs",
)
}
pub fn cancel(&self, job_id: impl Into<String>) -> JsonRequestBuilder<FineTuningJob> {
JsonRequestBuilder::new(
self.client.clone(),
"fine_tuning.jobs.cancel",
Method::POST,
format!(
"/fine_tuning/jobs/{}/cancel",
encode_path_segment(job_id.into())
),
)
}
pub fn pause(&self, job_id: impl Into<String>) -> JsonRequestBuilder<FineTuningJob> {
JsonRequestBuilder::new(
self.client.clone(),
"fine_tuning.jobs.pause",
Method::POST,
format!(
"/fine_tuning/jobs/{}/pause",
encode_path_segment(job_id.into())
),
)
}
pub fn resume(&self, job_id: impl Into<String>) -> JsonRequestBuilder<FineTuningJob> {
JsonRequestBuilder::new(
self.client.clone(),
"fine_tuning.jobs.resume",
Method::POST,
format!(
"/fine_tuning/jobs/{}/resume",
encode_path_segment(job_id.into())
),
)
}
pub fn list_events(&self, job_id: impl Into<String>) -> ListRequestBuilder<FineTuningJobEvent> {
ListRequestBuilder::new(
self.client.clone(),
"fine_tuning.jobs.list_events",
format!(
"/fine_tuning/jobs/{}/events",
encode_path_segment(job_id.into())
),
)
}
pub fn checkpoints(&self) -> FineTuningJobCheckpointsResource {
FineTuningJobCheckpointsResource::new(self.client.clone())
}
}
impl FineTuningJobCheckpointsResource {
pub fn list(&self, job_id: impl Into<String>) -> ListRequestBuilder<FineTuningCheckpoint> {
ListRequestBuilder::new(
self.client.clone(),
"fine_tuning.jobs.checkpoints.list",
format!(
"/fine_tuning/jobs/{}/checkpoints",
encode_path_segment(job_id.into())
),
)
}
}
impl FineTuningCheckpointPermissionsResource {
pub fn create(
&self,
checkpoint_id: impl Into<String>,
) -> JsonRequestBuilder<FineTuningCheckpointPermission> {
JsonRequestBuilder::new(
self.client.clone(),
"fine_tuning.checkpoints.permissions.create",
Method::POST,
format!(
"/fine_tuning/checkpoints/{}/permissions",
encode_path_segment(checkpoint_id.into())
),
)
}
pub fn retrieve(
&self,
checkpoint_id: impl Into<String>,
permission_id: impl Into<String>,
) -> JsonRequestBuilder<FineTuningCheckpointPermission> {
JsonRequestBuilder::new(
self.client.clone(),
"fine_tuning.checkpoints.permissions.retrieve",
Method::GET,
format!(
"/fine_tuning/checkpoints/{}/permissions/{}",
encode_path_segment(checkpoint_id.into()),
encode_path_segment(permission_id.into())
),
)
}
pub fn list(
&self,
checkpoint_id: impl Into<String>,
) -> ListRequestBuilder<FineTuningCheckpointPermission> {
ListRequestBuilder::new(
self.client.clone(),
"fine_tuning.checkpoints.permissions.list",
format!(
"/fine_tuning/checkpoints/{}/permissions",
encode_path_segment(checkpoint_id.into())
),
)
}
pub fn delete(
&self,
checkpoint_id: impl Into<String>,
permission_id: impl Into<String>,
) -> JsonRequestBuilder<DeleteResponse> {
JsonRequestBuilder::new(
self.client.clone(),
"fine_tuning.checkpoints.permissions.delete",
Method::DELETE,
format!(
"/fine_tuning/checkpoints/{}/permissions/{}",
encode_path_segment(checkpoint_id.into()),
encode_path_segment(permission_id.into())
),
)
}
}
impl FineTuningAlphaResource {
pub fn graders(&self) -> FineTuningAlphaGradersResource {
FineTuningAlphaGradersResource::new(self.client.clone())
}
}
impl FineTuningAlphaGradersResource {
pub fn run(&self) -> JsonRequestBuilder<GraderRunResponse> {
let endpoint = endpoints::fine_tuning::FINE_TUNING_ALPHA_GRADERS_RUN;
JsonRequestBuilder::new(
self.client.clone(),
endpoint.id,
Method::POST,
endpoint.template,
)
}
pub fn validate(&self) -> JsonRequestBuilder<GraderValidateResponse> {
let endpoint = endpoints::fine_tuning::FINE_TUNING_ALPHA_GRADERS_VALIDATE;
JsonRequestBuilder::new(
self.client.clone(),
endpoint.id,
Method::POST,
endpoint.template,
)
}
}
impl GradersResource {
pub fn grader_models(&self) -> JsonRequestBuilder<GraderModelCatalog> {
let endpoint = endpoints::fine_tuning::GRADERS_GRADER_MODELS;
JsonRequestBuilder::new(
self.client.clone(),
endpoint.id,
Method::GET,
endpoint.template,
)
}
}