content: -- | @\/v1\/fine_tuning/jobs@
  module OpenAI.V1.FineTuning.Jobs
      ( -- * Main types
        FineTuningJobID(..)
      , CreateFineTuningJob(..)
      , _CreateFineTuningJob
      , JobObject(..)
      , EventObject(..)
      , CheckpointObject(..)
        -- * Other types
      , AutoOr(..)
      , Hyperparameters(..)
      , WAndB(..)
      , Integration(..)
      , Status(..)
      , Level(..)
      , Metrics(..)
        -- * Servant
      , API
      ) where
  
  import OpenAI.Prelude
  import OpenAI.V1.AutoOr
  import OpenAI.V1.Error
  import OpenAI.V1.Files (FileID)
  import OpenAI.V1.ListOf
  import OpenAI.V1.Models (Model)
  
  -- | Fine tuning job ID
  newtype FineTuningJobID = FineTuningJobID{ text :: Text }
      deriving newtype (FromJSON, IsString, Show, ToHttpApiData, ToJSON)
  
  -- | The hyperparameters used for the fine-tuning job
  data Hyperparameters = Hyperparameters
      { batch_size :: Maybe (AutoOr Natural)
      , learning_rate_multiplier :: Maybe (AutoOr Double)
      , n_epochs :: Maybe (AutoOr Natural)
      } deriving stock (Generic, Show)
        deriving anyclass (FromJSON, ToJSON)
  
  -- | The settings for your integration with Weights and
  data WAndB = WAndB
      { project :: Text
      , name :: Maybe Text
      , entity :: Maybe Text
      , tags :: Maybe (Vector Text)
      } deriving stock (Generic, Show)
        deriving anyclass (FromJSON, ToJSON)
  
  -- | An integration to enable for your fine-tuning job
  data Integration = Integration_WAndB{ wandb :: WAndB }
      deriving stock (Generic, Show)
  
  integrationOptions :: Options
  integrationOptions = aesonOptions
      { sumEncoding =
          TaggedObject{ tagFieldName = "type", contentsFieldName = "" }
  
      , tagSingleConstructors = True
  
      , constructorTagModifier = stripPrefix "Integration_"
      }
  
  instance FromJSON Integration where
      parseJSON = genericParseJSON integrationOptions
  
  instance ToJSON Integration where
      toJSON = genericToJSON integrationOptions
  
  -- | Request body for @\/v1\/fine_tuning\/jobs@
  data CreateFineTuningJob = CreateFineTuningJob
      { model :: Model
      , training_file :: FileID
      , hyperparameters :: Maybe Hyperparameters
      , suffix :: Maybe Text
      , validation_file :: Maybe FileID
      , integrations :: Maybe (Vector Integration)
      , seed :: Maybe Integer
      } deriving stock (Generic, Show)
        deriving anyclass (FromJSON, ToJSON)
  
  -- | Default `CreateFineTuningJob`
  _CreateFineTuningJob :: CreateFineTuningJob
  _CreateFineTuningJob = CreateFineTuningJob
      { hyperparameters = Nothing
      , suffix = Nothing
      , validation_file = Nothing
      , integrations = Nothing
      , seed = Nothing
      }
  
  -- | The current status of the fine-tuning job
  data Status
      = Validating_Files
      | Queued
      | Running
      | Succeeded
      | Failed
      | Cancelled
      deriving stock (Generic, Show)
  
  instance FromJSON Status where
      parseJSON = genericParseJSON aesonOptions
  
  instance ToJSON Status where
      toJSON = genericToJSON aesonOptions
  
  -- | The fine_tuning.job object represents a fine-tuning job that has been
  -- created through the API.
  data JobObject = JobObject
      { id :: FineTuningJobID
      , created_at :: POSIXTime
      , error :: Maybe Error
      , fine_tuned_model :: Maybe Model
      , finished_at :: Maybe POSIXTime
      , hyperparameters :: Hyperparameters
      , model :: Model
      , object :: Text
      , organization_id :: Text
      , result_files :: Vector FileID
      , status :: Status
      , trained_tokens :: Maybe Natural
      , training_file :: FileID
      , validation_file :: Maybe FileID
      , integrations :: Maybe (Vector Integration)
      , seed :: Integer
      , estimated_finish :: Maybe POSIXTime
      } deriving stock (Generic, Show)
        deriving anyclass (FromJSON, ToJSON)
  
  -- | Log level
  data Level = Info | Warn | Error
      deriving stock (Generic, Show)
  
  instance FromJSON Level where
      parseJSON = genericParseJSON aesonOptions
  
  instance ToJSON Level where
      toJSON = genericToJSON aesonOptions
  
  -- | Fine-tuning job event object
  data EventObject = EventObject
      { id :: Text
      , created_at :: POSIXTime
      , level :: Level
      , message :: Text
      , object :: Text
      } deriving stock (Generic, Show)
        deriving anyclass (FromJSON, ToJSON)
  
  -- | Metrics at the step number during the fine-tuning job.
  data Metrics = Metrics
      { step :: Double
      , train_loss :: Double
      , train_mean_token_accuracy :: Double
      , valid_loss :: Double
      , valid_mean_token_accuracy :: Double
      , full_valid_loss :: Double
      , full_valid_mean_token_accuracy :: Double
      } deriving stock (Generic, Show)
        deriving anyclass (FromJSON, ToJSON)
  
  -- | The @fine_tuning.job.checkpoint@ object represents a model checkpoint for
  -- a fine-tuning job that is ready to use
  data CheckpointObject = CheckpointObject
      { id :: Text
      , created_at :: POSIXTime
      , fine_tuned_model_checkpoint :: Text
      , step_number :: Natural
      , metrics :: Metrics
      , fine_tuning_job_id :: FineTuningJobID
      , object :: Text
      } deriving stock (Generic, Show)
        deriving anyclass (FromJSON, ToJSON)
  
  -- | Servant API
  type API =
          "fine_tuning"
      :>  "jobs"
      :>  (         ReqBody '[JSON] CreateFineTuningJob
                :>  Post '[JSON] JobObject
          :<|>      QueryParam "after" Text
                :>  QueryParam "limit" Natural
                :>  Get '[JSON] (ListOf JobObject)
          :<|>      Capture "fine_tuning_job_id" FineTuningJobID
                :>  "events"
                :>  QueryParam "after" Text
                :>  QueryParam "limit" Natural
                :>  Get '[JSON] (ListOf EventObject)
          :<|>      Capture "fine_tuning_job_id" FineTuningJobID
                :>  "checkpoints"
                :>  QueryParam "after" Text
                :>  QueryParam "limit" Natural
                :>  Get '[JSON] (ListOf CheckpointObject)
          :<|>      Capture "fine_tuning_job_id" FineTuningJobID
                :>  Get '[JSON] JobObject
          :<|>      Capture "fine_tuning_job_id" FineTuningJobID
                :>  "cancel"
                :>  Post '[JSON] JobObject
          )
  