{-# LANGUAGE AllowAmbiguousTypes #-}
{-# LANGUAGE DeriveAnyClass #-}
{-# LANGUAGE DeriveGeneric #-}
{-# LANGUAGE DuplicateRecordFields #-}
{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE FunctionalDependencies #-}
{-# LANGUAGE GADTs #-}
{-# LANGUAGE GeneralizedNewtypeDeriving #-}
{-# LANGUAGE LambdaCase #-}
{-# LANGUAGE MultiParamTypeClasses #-}
{-# LANGUAGE OverloadedLists #-}
{-# LANGUAGE OverloadedRecordDot #-}
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE RankNTypes #-}
{-# LANGUAGE RecordWildCards #-}
{-# LANGUAGE ScopedTypeVariables #-}
{-# LANGUAGE TypeApplications #-}
{-# LANGUAGE TypeFamilies #-}

module IntelliMonad.Tools.DallE3 where

import Codec.Picture
import Control.Monad.IO.Class
import qualified Data.Aeson as A
import qualified Data.ByteString.Lazy as LBS
import Data.Maybe (fromMaybe)
import qualified Data.OSC1337 as OSC
import qualified Data.Sixel as Sixel
import Data.Text (Text)
import qualified Data.Text as T
import GHC.Generics
import IntelliMonad.Types
import Network.HTTP.Client (httpLbs, newManager, parseUrlThrow, responseBody)
import Network.HTTP.Client.TLS (tlsManagerSettings)
import qualified OpenAI.API as API
import qualified OpenAI.Types as API
import Servant.Client
import System.Environment (getEnv, lookupEnv)

putImage :: FilePath -> IO (Either String ())
putImage :: [Char] -> IO (Either [Char] ())
putImage [Char]
image' = do
  Maybe [Char]
termProgram <- [Char] -> IO (Maybe [Char])
lookupEnv [Char]
"TERM_PROGRAM"
  Either [Char] DynamicImage
imageBin <- [Char] -> IO (Either [Char] DynamicImage)
readImage [Char]
image'
  case Either [Char] DynamicImage
imageBin of
    Left [Char]
err -> Either [Char] () -> IO (Either [Char] ())
forall a. a -> IO a
forall (m :: * -> *) a. Monad m => a -> m a
return (Either [Char] () -> IO (Either [Char] ()))
-> Either [Char] () -> IO (Either [Char] ())
forall a b. (a -> b) -> a -> b
$ [Char] -> Either [Char] ()
forall a b. a -> Either a b
Left ([Char] -> Either [Char] ()) -> [Char] -> Either [Char] ()
forall a b. (a -> b) -> a -> b
$ [Char]
"Image file " [Char] -> [Char] -> [Char]
forall a. [a] -> [a] -> [a]
++ [Char]
image' [Char] -> [Char] -> [Char]
forall a. [a] -> [a] -> [a]
++ [Char]
" can not be read. : " [Char] -> [Char] -> [Char]
forall a. [a] -> [a] -> [a]
++ [Char] -> [Char]
forall a. Show a => a -> [Char]
show [Char]
err
    Right DynamicImage
imageBin' -> do
      let image :: Image PixelRGB8
image = DynamicImage -> Image PixelRGB8
convertRGB8 DynamicImage
imageBin'
      case Maybe [Char]
termProgram of
        Just [Char]
"iTerm.app" -> do
          Image PixelRGB8 -> IO ()
forall a. ToOSC a => a -> IO ()
OSC.putOSC Image PixelRGB8
image
          [Char] -> IO ()
putStrLn [Char]
""
        Just [Char]
"vscode" -> do
          Image PixelRGB8 -> IO ()
forall a. ToSixel a => a -> IO ()
Sixel.putSixel Image PixelRGB8
image
          [Char] -> IO ()
putStrLn [Char]
""
        Maybe [Char]
_ -> do
          Image PixelRGB8 -> IO ()
forall a. ToSixel a => a -> IO ()
Sixel.putSixel Image PixelRGB8
image
          [Char] -> IO ()
putStrLn [Char]
""
      Either [Char] () -> IO (Either [Char] ())
forall a. a -> IO a
forall (m :: * -> *) a. Monad m => a -> m a
return (Either [Char] () -> IO (Either [Char] ()))
-> Either [Char] () -> IO (Either [Char] ())
forall a b. (a -> b) -> a -> b
$ () -> Either [Char] ()
forall a b. b -> Either a b
Right ()

data DallE3 = DallE3
  { DallE3 -> Text
prompt :: T.Text,
    DallE3 -> Text
size :: T.Text
  }
  deriving (DallE3 -> DallE3 -> Bool
(DallE3 -> DallE3 -> Bool)
-> (DallE3 -> DallE3 -> Bool) -> Eq DallE3
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: DallE3 -> DallE3 -> Bool
== :: DallE3 -> DallE3 -> Bool
$c/= :: DallE3 -> DallE3 -> Bool
/= :: DallE3 -> DallE3 -> Bool
Eq, Int -> DallE3 -> [Char] -> [Char]
[DallE3] -> [Char] -> [Char]
DallE3 -> [Char]
(Int -> DallE3 -> [Char] -> [Char])
-> (DallE3 -> [Char])
-> ([DallE3] -> [Char] -> [Char])
-> Show DallE3
forall a.
(Int -> a -> [Char] -> [Char])
-> (a -> [Char]) -> ([a] -> [Char] -> [Char]) -> Show a
$cshowsPrec :: Int -> DallE3 -> [Char] -> [Char]
showsPrec :: Int -> DallE3 -> [Char] -> [Char]
$cshow :: DallE3 -> [Char]
show :: DallE3 -> [Char]
$cshowList :: [DallE3] -> [Char] -> [Char]
showList :: [DallE3] -> [Char] -> [Char]
Show, (forall x. DallE3 -> Rep DallE3 x)
-> (forall x. Rep DallE3 x -> DallE3) -> Generic DallE3
forall x. Rep DallE3 x -> DallE3
forall x. DallE3 -> Rep DallE3 x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cfrom :: forall x. DallE3 -> Rep DallE3 x
from :: forall x. DallE3 -> Rep DallE3 x
$cto :: forall x. Rep DallE3 x -> DallE3
to :: forall x. Rep DallE3 x -> DallE3
Generic, Schema
Schema -> JSONSchema DallE3
forall r. Schema -> JSONSchema r
$cschema :: Schema
schema :: Schema
JSONSchema, Maybe DallE3
Value -> Parser [DallE3]
Value -> Parser DallE3
(Value -> Parser DallE3)
-> (Value -> Parser [DallE3]) -> Maybe DallE3 -> FromJSON DallE3
forall a.
(Value -> Parser a)
-> (Value -> Parser [a]) -> Maybe a -> FromJSON a
$cparseJSON :: Value -> Parser DallE3
parseJSON :: Value -> Parser DallE3
$cparseJSONList :: Value -> Parser [DallE3]
parseJSONList :: Value -> Parser [DallE3]
$comittedField :: Maybe DallE3
omittedField :: Maybe DallE3
A.FromJSON, [DallE3] -> Value
[DallE3] -> Encoding
DallE3 -> Bool
DallE3 -> Value
DallE3 -> Encoding
(DallE3 -> Value)
-> (DallE3 -> Encoding)
-> ([DallE3] -> Value)
-> ([DallE3] -> Encoding)
-> (DallE3 -> Bool)
-> ToJSON DallE3
forall a.
(a -> Value)
-> (a -> Encoding)
-> ([a] -> Value)
-> ([a] -> Encoding)
-> (a -> Bool)
-> ToJSON a
$ctoJSON :: DallE3 -> Value
toJSON :: DallE3 -> Value
$ctoEncoding :: DallE3 -> Encoding
toEncoding :: DallE3 -> Encoding
$ctoJSONList :: [DallE3] -> Value
toJSONList :: [DallE3] -> Value
$ctoEncodingList :: [DallE3] -> Encoding
toEncodingList :: [DallE3] -> Encoding
$comitField :: DallE3 -> Bool
omitField :: DallE3 -> Bool
A.ToJSON)

instance HasFunctionObject DallE3 where
  getFunctionName :: [Char]
getFunctionName = [Char]
"image_generation"
  getFunctionDescription :: [Char]
getFunctionDescription = [Char]
"Creating images from scratch based on a text prompt"
  getFieldDescription :: [Char] -> [Char]
getFieldDescription [Char]
"prompt" = [Char]
"A text description of the desired image. The maximum length is 4000 characters."
  getFieldDescription [Char]
"size" = [Char]
"The size of the generated images. Must be one of 1024x1024, 1792x1024, or 1024x1792 for dall-e-3 models."

instance Tool DallE3 where
  data Output DallE3 = DallE3Output
    { Output DallE3 -> Int
code :: Int,
      Output DallE3 -> [Char]
stdout :: String,
      Output DallE3 -> [Char]
stderr :: String,
      Output DallE3 -> Text
url :: Text
    }
    deriving (Output DallE3 -> Output DallE3 -> Bool
(Output DallE3 -> Output DallE3 -> Bool)
-> (Output DallE3 -> Output DallE3 -> Bool) -> Eq (Output DallE3)
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: Output DallE3 -> Output DallE3 -> Bool
== :: Output DallE3 -> Output DallE3 -> Bool
$c/= :: Output DallE3 -> Output DallE3 -> Bool
/= :: Output DallE3 -> Output DallE3 -> Bool
Eq, Int -> Output DallE3 -> [Char] -> [Char]
[Output DallE3] -> [Char] -> [Char]
Output DallE3 -> [Char]
(Int -> Output DallE3 -> [Char] -> [Char])
-> (Output DallE3 -> [Char])
-> ([Output DallE3] -> [Char] -> [Char])
-> Show (Output DallE3)
forall a.
(Int -> a -> [Char] -> [Char])
-> (a -> [Char]) -> ([a] -> [Char] -> [Char]) -> Show a
$cshowsPrec :: Int -> Output DallE3 -> [Char] -> [Char]
showsPrec :: Int -> Output DallE3 -> [Char] -> [Char]
$cshow :: Output DallE3 -> [Char]
show :: Output DallE3 -> [Char]
$cshowList :: [Output DallE3] -> [Char] -> [Char]
showList :: [Output DallE3] -> [Char] -> [Char]
Show, (forall x. Output DallE3 -> Rep (Output DallE3) x)
-> (forall x. Rep (Output DallE3) x -> Output DallE3)
-> Generic (Output DallE3)
forall x. Rep (Output DallE3) x -> Output DallE3
forall x. Output DallE3 -> Rep (Output DallE3) x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cfrom :: forall x. Output DallE3 -> Rep (Output DallE3) x
from :: forall x. Output DallE3 -> Rep (Output DallE3) x
$cto :: forall x. Rep (Output DallE3) x -> Output DallE3
to :: forall x. Rep (Output DallE3) x -> Output DallE3
Generic, Maybe (Output DallE3)
Value -> Parser [Output DallE3]
Value -> Parser (Output DallE3)
(Value -> Parser (Output DallE3))
-> (Value -> Parser [Output DallE3])
-> Maybe (Output DallE3)
-> FromJSON (Output DallE3)
forall a.
(Value -> Parser a)
-> (Value -> Parser [a]) -> Maybe a -> FromJSON a
$cparseJSON :: Value -> Parser (Output DallE3)
parseJSON :: Value -> Parser (Output DallE3)
$cparseJSONList :: Value -> Parser [Output DallE3]
parseJSONList :: Value -> Parser [Output DallE3]
$comittedField :: Maybe (Output DallE3)
omittedField :: Maybe (Output DallE3)
A.FromJSON, [Output DallE3] -> Value
[Output DallE3] -> Encoding
Output DallE3 -> Bool
Output DallE3 -> Value
Output DallE3 -> Encoding
(Output DallE3 -> Value)
-> (Output DallE3 -> Encoding)
-> ([Output DallE3] -> Value)
-> ([Output DallE3] -> Encoding)
-> (Output DallE3 -> Bool)
-> ToJSON (Output DallE3)
forall a.
(a -> Value)
-> (a -> Encoding)
-> ([a] -> Value)
-> ([a] -> Encoding)
-> (a -> Bool)
-> ToJSON a
$ctoJSON :: Output DallE3 -> Value
toJSON :: Output DallE3 -> Value
$ctoEncoding :: Output DallE3 -> Encoding
toEncoding :: Output DallE3 -> Encoding
$ctoJSONList :: [Output DallE3] -> Value
toJSONList :: [Output DallE3] -> Value
$ctoEncodingList :: [Output DallE3] -> Encoding
toEncodingList :: [Output DallE3] -> Encoding
$comitField :: Output DallE3 -> Bool
omitField :: Output DallE3 -> Bool
A.ToJSON)
  toolExec :: forall p (m :: * -> *).
(MonadIO m, MonadFail m, PersistentBackend p) =>
DallE3 -> Prompt m (Output DallE3)
toolExec DallE3
args = IO (Output DallE3) -> StateT PromptEnv m (Output DallE3)
forall a. IO a -> StateT PromptEnv m a
forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO (IO (Output DallE3) -> StateT PromptEnv m (Output DallE3))
-> IO (Output DallE3) -> StateT PromptEnv m (Output DallE3)
forall a b. (a -> b) -> a -> b
$ do
    AuthClient
api_key <- (Text -> AuthClient
API.clientAuth (Text -> AuthClient) -> ([Char] -> Text) -> [Char] -> AuthClient
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [Char] -> Text
T.pack) ([Char] -> AuthClient) -> IO [Char] -> IO AuthClient
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> [Char] -> IO [Char]
getEnv [Char]
"OPENAI_API_KEY"
    BaseUrl
url <- [Char] -> IO BaseUrl
forall (m :: * -> *). MonadThrow m => [Char] -> m BaseUrl
parseBaseUrl [Char]
"https://api.openai.com/v1/"
    Manager
manager <- ManagerSettings -> IO Manager
newManager ManagerSettings
tlsManagerSettings
    let API.OpenAIBackend {AuthClient -> OpenAIClient ListModelsResponse
AuthClient
-> Maybe Int
-> Maybe Text
-> Maybe Text
-> Maybe Text
-> OpenAIClient ListAssistantsResponse
AuthClient -> Maybe Text -> OpenAIClient ListFilesResponse
AuthClient
-> Maybe Text
-> Maybe Int
-> OpenAIClient ListPaginatedFineTuningJobsResponse
AuthClient -> Text -> OpenAIClient Text
AuthClient -> Text -> OpenAIClient ThreadObject
AuthClient -> Text -> OpenAIClient OpenAIFile
AuthClient -> Text -> OpenAIClient Model
AuthClient -> Text -> OpenAIClient FineTuningJob
AuthClient -> Text -> OpenAIClient DeleteThreadResponse
AuthClient -> Text -> OpenAIClient DeleteModelResponse
AuthClient -> Text -> OpenAIClient DeleteFileResponse
AuthClient -> Text -> OpenAIClient DeleteAssistantResponse
AuthClient -> Text -> OpenAIClient AssistantObject
AuthClient
-> Text
-> Maybe Int
-> Maybe Text
-> Maybe Text
-> Maybe Text
-> OpenAIClient ListRunsResponse
AuthClient
-> Text
-> Maybe Int
-> Maybe Text
-> Maybe Text
-> Maybe Text
-> OpenAIClient ListMessagesResponse
AuthClient
-> Text
-> Maybe Int
-> Maybe Text
-> Maybe Text
-> Maybe Text
-> OpenAIClient ListAssistantFilesResponse
AuthClient
-> Text
-> Maybe Text
-> Maybe Int
-> OpenAIClient ListFineTuningJobEventsResponse
AuthClient -> Text -> Text -> OpenAIClient RunObject
AuthClient -> Text -> Text -> OpenAIClient MessageObject
AuthClient
-> Text -> Text -> OpenAIClient DeleteAssistantFileResponse
AuthClient -> Text -> Text -> OpenAIClient AssistantFileObject
AuthClient
-> Text
-> Text
-> Maybe Int
-> Maybe Text
-> Maybe Text
-> Maybe Text
-> OpenAIClient ListRunStepsResponse
AuthClient
-> Text
-> Text
-> Maybe Int
-> Maybe Text
-> Maybe Text
-> Maybe Text
-> OpenAIClient ListMessageFilesResponse
AuthClient -> Text -> Text -> Text -> OpenAIClient RunStepObject
AuthClient
-> Text -> Text -> Text -> OpenAIClient MessageFileObject
AuthClient
-> Text
-> Text
-> SubmitToolOutputsRunRequest
-> OpenAIClient RunObject
AuthClient
-> Text -> Text -> ModifyRunRequest -> OpenAIClient RunObject
AuthClient
-> Text
-> Text
-> ModifyMessageRequest
-> OpenAIClient MessageObject
AuthClient
-> Text -> ModifyThreadRequest -> OpenAIClient ThreadObject
AuthClient
-> Text -> ModifyAssistantRequest -> OpenAIClient AssistantObject
AuthClient -> Text -> CreateRunRequest -> OpenAIClient RunObject
AuthClient
-> Text -> CreateMessageRequest -> OpenAIClient MessageObject
AuthClient
-> Text
-> CreateAssistantFileRequest
-> OpenAIClient AssistantFileObject
AuthClient -> CreateThreadRequest -> OpenAIClient ThreadObject
AuthClient -> CreateThreadAndRunRequest -> OpenAIClient RunObject
AuthClient -> CreateSpeechRequest -> OpenAIClient ByteString
AuthClient
-> CreateModerationRequest -> OpenAIClient CreateModerationResponse
AuthClient -> CreateImageRequest -> OpenAIClient ImagesResponse
AuthClient
-> CreateFineTuningJobRequest -> OpenAIClient FineTuningJob
AuthClient
-> CreateEmbeddingRequest -> OpenAIClient CreateEmbeddingResponse
AuthClient
-> CreateCompletionRequest -> OpenAIClient CreateCompletionResponse
AuthClient
-> CreateChatCompletionRequest
-> OpenAIClient CreateChatCompletionResponse
AuthClient
-> CreateAssistantRequest -> OpenAIClient AssistantObject
AuthClient -> FormCreateFile -> OpenAIClient OpenAIFile
AuthClient -> FormCreateImageEdit -> OpenAIClient ImagesResponse
AuthClient
-> FormCreateImageVariation -> OpenAIClient ImagesResponse
AuthClient
-> FormCreateTranscription
-> OpenAIClient CreateTranscription200Response
AuthClient
-> FormCreateTranslation
-> OpenAIClient CreateTranslation200Response
cancelRun :: AuthClient -> Text -> Text -> OpenAIClient RunObject
createAssistant :: AuthClient
-> CreateAssistantRequest -> OpenAIClient AssistantObject
createAssistantFile :: AuthClient
-> Text
-> CreateAssistantFileRequest
-> OpenAIClient AssistantFileObject
createMessage :: AuthClient
-> Text -> CreateMessageRequest -> OpenAIClient MessageObject
createRun :: AuthClient -> Text -> CreateRunRequest -> OpenAIClient RunObject
createThread :: AuthClient -> CreateThreadRequest -> OpenAIClient ThreadObject
createThreadAndRun :: AuthClient -> CreateThreadAndRunRequest -> OpenAIClient RunObject
deleteAssistant :: AuthClient -> Text -> OpenAIClient DeleteAssistantResponse
deleteAssistantFile :: AuthClient
-> Text -> Text -> OpenAIClient DeleteAssistantFileResponse
deleteThread :: AuthClient -> Text -> OpenAIClient DeleteThreadResponse
getAssistant :: AuthClient -> Text -> OpenAIClient AssistantObject
getAssistantFile :: AuthClient -> Text -> Text -> OpenAIClient AssistantFileObject
getMessage :: AuthClient -> Text -> Text -> OpenAIClient MessageObject
getMessageFile :: AuthClient
-> Text -> Text -> Text -> OpenAIClient MessageFileObject
getRun :: AuthClient -> Text -> Text -> OpenAIClient RunObject
getRunStep :: AuthClient -> Text -> Text -> Text -> OpenAIClient RunStepObject
getThread :: AuthClient -> Text -> OpenAIClient ThreadObject
listAssistantFiles :: AuthClient
-> Text
-> Maybe Int
-> Maybe Text
-> Maybe Text
-> Maybe Text
-> OpenAIClient ListAssistantFilesResponse
listAssistants :: AuthClient
-> Maybe Int
-> Maybe Text
-> Maybe Text
-> Maybe Text
-> OpenAIClient ListAssistantsResponse
listMessageFiles :: AuthClient
-> Text
-> Text
-> Maybe Int
-> Maybe Text
-> Maybe Text
-> Maybe Text
-> OpenAIClient ListMessageFilesResponse
listMessages :: AuthClient
-> Text
-> Maybe Int
-> Maybe Text
-> Maybe Text
-> Maybe Text
-> OpenAIClient ListMessagesResponse
listRunSteps :: AuthClient
-> Text
-> Text
-> Maybe Int
-> Maybe Text
-> Maybe Text
-> Maybe Text
-> OpenAIClient ListRunStepsResponse
listRuns :: AuthClient
-> Text
-> Maybe Int
-> Maybe Text
-> Maybe Text
-> Maybe Text
-> OpenAIClient ListRunsResponse
modifyAssistant :: AuthClient
-> Text -> ModifyAssistantRequest -> OpenAIClient AssistantObject
modifyMessage :: AuthClient
-> Text
-> Text
-> ModifyMessageRequest
-> OpenAIClient MessageObject
modifyRun :: AuthClient
-> Text -> Text -> ModifyRunRequest -> OpenAIClient RunObject
modifyThread :: AuthClient
-> Text -> ModifyThreadRequest -> OpenAIClient ThreadObject
submitToolOuputsToRun :: AuthClient
-> Text
-> Text
-> SubmitToolOutputsRunRequest
-> OpenAIClient RunObject
createSpeech :: AuthClient -> CreateSpeechRequest -> OpenAIClient ByteString
createTranscription :: AuthClient
-> FormCreateTranscription
-> OpenAIClient CreateTranscription200Response
createTranslation :: AuthClient
-> FormCreateTranslation
-> OpenAIClient CreateTranslation200Response
createChatCompletion :: AuthClient
-> CreateChatCompletionRequest
-> OpenAIClient CreateChatCompletionResponse
createCompletion :: AuthClient
-> CreateCompletionRequest -> OpenAIClient CreateCompletionResponse
createEmbedding :: AuthClient
-> CreateEmbeddingRequest -> OpenAIClient CreateEmbeddingResponse
createFile :: AuthClient -> FormCreateFile -> OpenAIClient OpenAIFile
deleteFile :: AuthClient -> Text -> OpenAIClient DeleteFileResponse
downloadFile :: AuthClient -> Text -> OpenAIClient Text
listFiles :: AuthClient -> Maybe Text -> OpenAIClient ListFilesResponse
retrieveFile :: AuthClient -> Text -> OpenAIClient OpenAIFile
cancelFineTuningJob :: AuthClient -> Text -> OpenAIClient FineTuningJob
createFineTuningJob :: AuthClient
-> CreateFineTuningJobRequest -> OpenAIClient FineTuningJob
listFineTuningEvents :: AuthClient
-> Text
-> Maybe Text
-> Maybe Int
-> OpenAIClient ListFineTuningJobEventsResponse
listPaginatedFineTuningJobs :: AuthClient
-> Maybe Text
-> Maybe Int
-> OpenAIClient ListPaginatedFineTuningJobsResponse
retrieveFineTuningJob :: AuthClient -> Text -> OpenAIClient FineTuningJob
createImage :: AuthClient -> CreateImageRequest -> OpenAIClient ImagesResponse
createImageEdit :: AuthClient -> FormCreateImageEdit -> OpenAIClient ImagesResponse
createImageVariation :: AuthClient
-> FormCreateImageVariation -> OpenAIClient ImagesResponse
deleteModel :: AuthClient -> Text -> OpenAIClient DeleteModelResponse
listModels :: AuthClient -> OpenAIClient ListModelsResponse
retrieveModel :: AuthClient -> Text -> OpenAIClient Model
createModeration :: AuthClient
-> CreateModerationRequest -> OpenAIClient CreateModerationResponse
$sel:cancelRun:OpenAIBackend :: forall a (m :: * -> *).
OpenAIBackend a m -> a -> Text -> Text -> m RunObject
$sel:createAssistant:OpenAIBackend :: forall a (m :: * -> *).
OpenAIBackend a m
-> a -> CreateAssistantRequest -> m AssistantObject
$sel:createAssistantFile:OpenAIBackend :: forall a (m :: * -> *).
OpenAIBackend a m
-> a -> Text -> CreateAssistantFileRequest -> m AssistantFileObject
$sel:createMessage:OpenAIBackend :: forall a (m :: * -> *).
OpenAIBackend a m
-> a -> Text -> CreateMessageRequest -> m MessageObject
$sel:createRun:OpenAIBackend :: forall a (m :: * -> *).
OpenAIBackend a m -> a -> Text -> CreateRunRequest -> m RunObject
$sel:createThread:OpenAIBackend :: forall a (m :: * -> *).
OpenAIBackend a m -> a -> CreateThreadRequest -> m ThreadObject
$sel:createThreadAndRun:OpenAIBackend :: forall a (m :: * -> *).
OpenAIBackend a m -> a -> CreateThreadAndRunRequest -> m RunObject
$sel:deleteAssistant:OpenAIBackend :: forall a (m :: * -> *).
OpenAIBackend a m -> a -> Text -> m DeleteAssistantResponse
$sel:deleteAssistantFile:OpenAIBackend :: forall a (m :: * -> *).
OpenAIBackend a m
-> a -> Text -> Text -> m DeleteAssistantFileResponse
$sel:deleteThread:OpenAIBackend :: forall a (m :: * -> *).
OpenAIBackend a m -> a -> Text -> m DeleteThreadResponse
$sel:getAssistant:OpenAIBackend :: forall a (m :: * -> *).
OpenAIBackend a m -> a -> Text -> m AssistantObject
$sel:getAssistantFile:OpenAIBackend :: forall a (m :: * -> *).
OpenAIBackend a m -> a -> Text -> Text -> m AssistantFileObject
$sel:getMessage:OpenAIBackend :: forall a (m :: * -> *).
OpenAIBackend a m -> a -> Text -> Text -> m MessageObject
$sel:getMessageFile:OpenAIBackend :: forall a (m :: * -> *).
OpenAIBackend a m
-> a -> Text -> Text -> Text -> m MessageFileObject
$sel:getRun:OpenAIBackend :: forall a (m :: * -> *).
OpenAIBackend a m -> a -> Text -> Text -> m RunObject
$sel:getRunStep:OpenAIBackend :: forall a (m :: * -> *).
OpenAIBackend a m -> a -> Text -> Text -> Text -> m RunStepObject
$sel:getThread:OpenAIBackend :: forall a (m :: * -> *).
OpenAIBackend a m -> a -> Text -> m ThreadObject
$sel:listAssistantFiles:OpenAIBackend :: forall a (m :: * -> *).
OpenAIBackend a m
-> a
-> Text
-> Maybe Int
-> Maybe Text
-> Maybe Text
-> Maybe Text
-> m ListAssistantFilesResponse
$sel:listAssistants:OpenAIBackend :: forall a (m :: * -> *).
OpenAIBackend a m
-> a
-> Maybe Int
-> Maybe Text
-> Maybe Text
-> Maybe Text
-> m ListAssistantsResponse
$sel:listMessageFiles:OpenAIBackend :: forall a (m :: * -> *).
OpenAIBackend a m
-> a
-> Text
-> Text
-> Maybe Int
-> Maybe Text
-> Maybe Text
-> Maybe Text
-> m ListMessageFilesResponse
$sel:listMessages:OpenAIBackend :: forall a (m :: * -> *).
OpenAIBackend a m
-> a
-> Text
-> Maybe Int
-> Maybe Text
-> Maybe Text
-> Maybe Text
-> m ListMessagesResponse
$sel:listRunSteps:OpenAIBackend :: forall a (m :: * -> *).
OpenAIBackend a m
-> a
-> Text
-> Text
-> Maybe Int
-> Maybe Text
-> Maybe Text
-> Maybe Text
-> m ListRunStepsResponse
$sel:listRuns:OpenAIBackend :: forall a (m :: * -> *).
OpenAIBackend a m
-> a
-> Text
-> Maybe Int
-> Maybe Text
-> Maybe Text
-> Maybe Text
-> m ListRunsResponse
$sel:modifyAssistant:OpenAIBackend :: forall a (m :: * -> *).
OpenAIBackend a m
-> a -> Text -> ModifyAssistantRequest -> m AssistantObject
$sel:modifyMessage:OpenAIBackend :: forall a (m :: * -> *).
OpenAIBackend a m
-> a -> Text -> Text -> ModifyMessageRequest -> m MessageObject
$sel:modifyRun:OpenAIBackend :: forall a (m :: * -> *).
OpenAIBackend a m
-> a -> Text -> Text -> ModifyRunRequest -> m RunObject
$sel:modifyThread:OpenAIBackend :: forall a (m :: * -> *).
OpenAIBackend a m
-> a -> Text -> ModifyThreadRequest -> m ThreadObject
$sel:submitToolOuputsToRun:OpenAIBackend :: forall a (m :: * -> *).
OpenAIBackend a m
-> a -> Text -> Text -> SubmitToolOutputsRunRequest -> m RunObject
$sel:createSpeech:OpenAIBackend :: forall a (m :: * -> *).
OpenAIBackend a m -> a -> CreateSpeechRequest -> m ByteString
$sel:createTranscription:OpenAIBackend :: forall a (m :: * -> *).
OpenAIBackend a m
-> a -> FormCreateTranscription -> m CreateTranscription200Response
$sel:createTranslation:OpenAIBackend :: forall a (m :: * -> *).
OpenAIBackend a m
-> a -> FormCreateTranslation -> m CreateTranslation200Response
$sel:createChatCompletion:OpenAIBackend :: forall a (m :: * -> *).
OpenAIBackend a m
-> a
-> CreateChatCompletionRequest
-> m CreateChatCompletionResponse
$sel:createCompletion:OpenAIBackend :: forall a (m :: * -> *).
OpenAIBackend a m
-> a -> CreateCompletionRequest -> m CreateCompletionResponse
$sel:createEmbedding:OpenAIBackend :: forall a (m :: * -> *).
OpenAIBackend a m
-> a -> CreateEmbeddingRequest -> m CreateEmbeddingResponse
$sel:createFile:OpenAIBackend :: forall a (m :: * -> *).
OpenAIBackend a m -> a -> FormCreateFile -> m OpenAIFile
$sel:deleteFile:OpenAIBackend :: forall a (m :: * -> *).
OpenAIBackend a m -> a -> Text -> m DeleteFileResponse
$sel:downloadFile:OpenAIBackend :: forall a (m :: * -> *). OpenAIBackend a m -> a -> Text -> m Text
$sel:listFiles:OpenAIBackend :: forall a (m :: * -> *).
OpenAIBackend a m -> a -> Maybe Text -> m ListFilesResponse
$sel:retrieveFile:OpenAIBackend :: forall a (m :: * -> *).
OpenAIBackend a m -> a -> Text -> m OpenAIFile
$sel:cancelFineTuningJob:OpenAIBackend :: forall a (m :: * -> *).
OpenAIBackend a m -> a -> Text -> m FineTuningJob
$sel:createFineTuningJob:OpenAIBackend :: forall a (m :: * -> *).
OpenAIBackend a m
-> a -> CreateFineTuningJobRequest -> m FineTuningJob
$sel:listFineTuningEvents:OpenAIBackend :: forall a (m :: * -> *).
OpenAIBackend a m
-> a
-> Text
-> Maybe Text
-> Maybe Int
-> m ListFineTuningJobEventsResponse
$sel:listPaginatedFineTuningJobs:OpenAIBackend :: forall a (m :: * -> *).
OpenAIBackend a m
-> a
-> Maybe Text
-> Maybe Int
-> m ListPaginatedFineTuningJobsResponse
$sel:retrieveFineTuningJob:OpenAIBackend :: forall a (m :: * -> *).
OpenAIBackend a m -> a -> Text -> m FineTuningJob
$sel:createImage:OpenAIBackend :: forall a (m :: * -> *).
OpenAIBackend a m -> a -> CreateImageRequest -> m ImagesResponse
$sel:createImageEdit:OpenAIBackend :: forall a (m :: * -> *).
OpenAIBackend a m -> a -> FormCreateImageEdit -> m ImagesResponse
$sel:createImageVariation:OpenAIBackend :: forall a (m :: * -> *).
OpenAIBackend a m
-> a -> FormCreateImageVariation -> m ImagesResponse
$sel:deleteModel:OpenAIBackend :: forall a (m :: * -> *).
OpenAIBackend a m -> a -> Text -> m DeleteModelResponse
$sel:listModels:OpenAIBackend :: forall a (m :: * -> *).
OpenAIBackend a m -> a -> m ListModelsResponse
$sel:retrieveModel:OpenAIBackend :: forall a (m :: * -> *). OpenAIBackend a m -> a -> Text -> m Model
$sel:createModeration:OpenAIBackend :: forall a (m :: * -> *).
OpenAIBackend a m
-> a -> CreateModerationRequest -> m CreateModerationResponse
..} = OpenAIBackend AuthClient OpenAIClient
API.createOpenAIClient
    let request :: CreateImageRequest
request =
          API.CreateImageRequest
            { createImageRequestPrompt :: Text
createImageRequestPrompt = DallE3
args.prompt,
              createImageRequestModel :: Maybe CreateImageRequestModel
createImageRequestModel = CreateImageRequestModel -> Maybe CreateImageRequestModel
forall a. a -> Maybe a
Just (CreateImageRequestModel -> Maybe CreateImageRequestModel)
-> CreateImageRequestModel -> Maybe CreateImageRequestModel
forall a b. (a -> b) -> a -> b
$ Text -> CreateImageRequestModel
API.CreateImageRequestModel Text
"dall-e-3",
              createImageRequestN :: Maybe Int
createImageRequestN = Maybe Int
forall a. Maybe a
Nothing,
              createImageRequestQuality :: Maybe Text
createImageRequestQuality = Maybe Text
forall a. Maybe a
Nothing,
              createImageRequestResponseUnderscoreformat :: Maybe Text
createImageRequestResponseUnderscoreformat = Text -> Maybe Text
forall a. a -> Maybe a
Just Text
"url",
              createImageRequestSize :: Maybe Text
createImageRequestSize = Text -> Maybe Text
forall a. a -> Maybe a
Just DallE3
args.size,
              createImageRequestStyle :: Maybe Text
createImageRequestStyle = Maybe Text
forall a. Maybe a
Nothing,
              createImageRequestUser :: Maybe Text
createImageRequestUser = Maybe Text
forall a. Maybe a
Nothing
            }
    ImagesResponse
res <- ClientEnv -> OpenAIClient ImagesResponse -> IO ImagesResponse
forall (m :: * -> *) a.
(MonadIO m, MonadThrow m) =>
ClientEnv -> OpenAIClient a -> m a
API.callOpenAI (Manager -> BaseUrl -> ClientEnv
mkClientEnv Manager
manager BaseUrl
url) (OpenAIClient ImagesResponse -> IO ImagesResponse)
-> OpenAIClient ImagesResponse -> IO ImagesResponse
forall a b. (a -> b) -> a -> b
$ AuthClient -> CreateImageRequest -> OpenAIClient ImagesResponse
createImage AuthClient
api_key CreateImageRequest
request
    let url' :: Text
url' = case ImagesResponse
res of
          (API.ImagesResponse Int
_ (Image
img : [Image]
_)) -> Text -> Maybe Text -> Text
forall a. a -> Maybe a -> a
fromMaybe Text
"" (Image -> Maybe Text
API.imageUrl Image
img)
          ImagesResponse
_ -> Text
""
    let downloadImage :: IO ()
downloadImage = do
          Request
request' <- [Char] -> IO Request
forall (m :: * -> *). MonadThrow m => [Char] -> m Request
parseUrlThrow ([Char] -> IO Request) -> [Char] -> IO Request
forall a b. (a -> b) -> a -> b
$ Text -> [Char]
T.unpack Text
url'
          Manager
manager' <- ManagerSettings -> IO Manager
newManager ManagerSettings
tlsManagerSettings
          Response ByteString
response <- Request -> Manager -> IO (Response ByteString)
httpLbs Request
request' Manager
manager'
          let imageBytes :: ByteString
imageBytes = Response ByteString -> ByteString
forall body. Response body -> body
Network.HTTP.Client.responseBody Response ByteString
response
          [Char] -> ByteString -> IO ()
LBS.writeFile [Char]
"image.png" ByteString
imageBytes
    IO ()
downloadImage
    [Char]
err <- do
      IO [Char] -> IO [Char]
forall a. IO a -> IO a
forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO (IO [Char] -> IO [Char]) -> IO [Char] -> IO [Char]
forall a b. (a -> b) -> a -> b
$
        [Char] -> IO (Either [Char] ())
putImage [Char]
"image.png" IO (Either [Char] ())
-> (Either [Char] () -> IO [Char]) -> IO [Char]
forall a b. IO a -> (a -> IO b) -> IO b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= \case
          Left [Char]
err -> [Char] -> IO [Char]
forall a. a -> IO a
forall (m :: * -> *) a. Monad m => a -> m a
return [Char]
err
          Right ()
_ -> [Char] -> IO [Char]
forall a. a -> IO a
forall (m :: * -> *) a. Monad m => a -> m a
return [Char]
""
    Output DallE3 -> IO (Output DallE3)
forall a. a -> IO a
forall (m :: * -> *) a. Monad m => a -> m a
return (Output DallE3 -> IO (Output DallE3))
-> Output DallE3 -> IO (Output DallE3)
forall a b. (a -> b) -> a -> b
$ Int -> [Char] -> [Char] -> Text -> Output DallE3
DallE3Output Int
0 [Char]
"" [Char]
err Text
url'