{-# 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'