packages feed

openai-1.0.0: src/OpenAI/V1/Images/Edits.hs

-- | @\/v1\/images\/edits@
module OpenAI.V1.Images.Edits
    ( -- * Main types
      CreateImageEdit(..)
    , _CreateImageEdit
      -- * Other types
    , ResponseFormat(..)
      -- * Servant
    , API
    ) where

import OpenAI.Prelude
import OpenAI.V1.Images.Image
import OpenAI.V1.Images.ResponseFormat
import OpenAI.V1.ListOf
import OpenAI.V1.Models (Model(..))

import qualified Data.Text as Text

-- | Request body for @\/v1\/images\/edits@
data CreateImageEdit = CreateImageEdit
    { image :: FilePath
    , prompt :: Text
    , mask :: Maybe FilePath
    , model :: Maybe Model
    , n :: Maybe Natural
    , size :: Maybe Text
    , response_format :: Maybe ResponseFormat
    , user :: Maybe Text
    } deriving stock (Generic, Show)

-- | Default `CreateImageEdit`
_CreateImageEdit :: CreateImageEdit
_CreateImageEdit = CreateImageEdit
    { mask = Nothing
    , model = Nothing
    , n = Nothing
    , size = Nothing
    , response_format = Nothing
    , user = Nothing
    }

instance ToMultipart Tmp CreateImageEdit where
    toMultipart CreateImageEdit{ ..} = MultipartData{..}
      where
        inputs =
                input "prompt" prompt
            <>  foldMap (input "model" . text) model
            <>  foldMap (input "n" . renderIntegral) n
            <>  foldMap (input "size") size
            <>  foldMap (input "response_format" . toUrlPiece) response_format
            <>  foldMap (input "user") user

        files = file0 : files1
          where
            file0 = FileData{..}
              where
                fdInputName = "image"
                fdFileName = Text.pack image
                fdFileCType = "image/" <> getExtension image
                fdPayload = image

            files1 = case mask of
                Nothing -> [ ]
                Just m -> [ FileData{..} ]
                  where
                    fdInputName = "mask"
                    fdFileName = Text.pack m
                    fdFileCType = "image/" <> getExtension m
                    fdPayload = m

-- | Servant API
type API =
        "edits"
    :>  MultipartForm Tmp CreateImageEdit
    :>  Post '[JSON] (ListOf ImageObject)