-- | @\/v1\/threads/:thread_id/messages@
module OpenAI.V1.Threads.Messages
    ( -- * Main types
        MessageID(..)
      , Message(..)
      , ModifyMessage(..)
      , _ModifyMessage
      , MessageObject(..)

      -- * Other types
      , Status(..)
      , IncompleteDetails(..)
      , File(..)
      , Annotation(..)
      , TextObject(..)

      -- * Servant
      , API
    ) where

import OpenAI.Prelude
import OpenAI.V1.Assistants (AssistantID)
import OpenAI.V1.DeletionStatus
import OpenAI.V1.Files (FileID)
import OpenAI.V1.ListOf
import OpenAI.V1.Message
import OpenAI.V1.Threads (ThreadID)
import OpenAI.V1.Threads.Runs (RunID)

-- | Message ID
newtype MessageID = MessageID{ MessageID -> Text
text :: Text }
    deriving newtype (Maybe MessageID
Value -> Parser [MessageID]
Value -> Parser MessageID
(Value -> Parser MessageID)
-> (Value -> Parser [MessageID])
-> Maybe MessageID
-> FromJSON MessageID
forall a.
(Value -> Parser a)
-> (Value -> Parser [a]) -> Maybe a -> FromJSON a
$cparseJSON :: Value -> Parser MessageID
parseJSON :: Value -> Parser MessageID
$cparseJSONList :: Value -> Parser [MessageID]
parseJSONList :: Value -> Parser [MessageID]
$comittedField :: Maybe MessageID
omittedField :: Maybe MessageID
FromJSON, String -> MessageID
(String -> MessageID) -> IsString MessageID
forall a. (String -> a) -> IsString a
$cfromString :: String -> MessageID
fromString :: String -> MessageID
IsString, Int -> MessageID -> ShowS
[MessageID] -> ShowS
MessageID -> String
(Int -> MessageID -> ShowS)
-> (MessageID -> String)
-> ([MessageID] -> ShowS)
-> Show MessageID
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> MessageID -> ShowS
showsPrec :: Int -> MessageID -> ShowS
$cshow :: MessageID -> String
show :: MessageID -> String
$cshowList :: [MessageID] -> ShowS
showList :: [MessageID] -> ShowS
Show, MessageID -> Text
MessageID -> ByteString
MessageID -> Builder
(MessageID -> Text)
-> (MessageID -> Builder)
-> (MessageID -> ByteString)
-> (MessageID -> Text)
-> (MessageID -> Builder)
-> ToHttpApiData MessageID
forall a.
(a -> Text)
-> (a -> Builder)
-> (a -> ByteString)
-> (a -> Text)
-> (a -> Builder)
-> ToHttpApiData a
$ctoUrlPiece :: MessageID -> Text
toUrlPiece :: MessageID -> Text
$ctoEncodedUrlPiece :: MessageID -> Builder
toEncodedUrlPiece :: MessageID -> Builder
$ctoHeader :: MessageID -> ByteString
toHeader :: MessageID -> ByteString
$ctoQueryParam :: MessageID -> Text
toQueryParam :: MessageID -> Text
$ctoEncodedQueryParam :: MessageID -> Builder
toEncodedQueryParam :: MessageID -> Builder
ToHttpApiData, [MessageID] -> Value
[MessageID] -> Encoding
MessageID -> Bool
MessageID -> Value
MessageID -> Encoding
(MessageID -> Value)
-> (MessageID -> Encoding)
-> ([MessageID] -> Value)
-> ([MessageID] -> Encoding)
-> (MessageID -> Bool)
-> ToJSON MessageID
forall a.
(a -> Value)
-> (a -> Encoding)
-> ([a] -> Value)
-> ([a] -> Encoding)
-> (a -> Bool)
-> ToJSON a
$ctoJSON :: MessageID -> Value
toJSON :: MessageID -> Value
$ctoEncoding :: MessageID -> Encoding
toEncoding :: MessageID -> Encoding
$ctoJSONList :: [MessageID] -> Value
toJSONList :: [MessageID] -> Value
$ctoEncodingList :: [MessageID] -> Encoding
toEncodingList :: [MessageID] -> Encoding
$comitField :: MessageID -> Bool
omitField :: MessageID -> Bool
ToJSON)

-- | Request body for @\/v1\/threads\/:thread_id\/messages\/:message_id@
data ModifyMessage = ModifyMessage
    { ModifyMessage -> Maybe (Map Text Text)
metadata :: Maybe (Map Text Text)
    } deriving stock ((forall x. ModifyMessage -> Rep ModifyMessage x)
-> (forall x. Rep ModifyMessage x -> ModifyMessage)
-> Generic ModifyMessage
forall x. Rep ModifyMessage x -> ModifyMessage
forall x. ModifyMessage -> Rep ModifyMessage x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cfrom :: forall x. ModifyMessage -> Rep ModifyMessage x
from :: forall x. ModifyMessage -> Rep ModifyMessage x
$cto :: forall x. Rep ModifyMessage x -> ModifyMessage
to :: forall x. Rep ModifyMessage x -> ModifyMessage
Generic, Int -> ModifyMessage -> ShowS
[ModifyMessage] -> ShowS
ModifyMessage -> String
(Int -> ModifyMessage -> ShowS)
-> (ModifyMessage -> String)
-> ([ModifyMessage] -> ShowS)
-> Show ModifyMessage
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> ModifyMessage -> ShowS
showsPrec :: Int -> ModifyMessage -> ShowS
$cshow :: ModifyMessage -> String
show :: ModifyMessage -> String
$cshowList :: [ModifyMessage] -> ShowS
showList :: [ModifyMessage] -> ShowS
Show)

instance ToJSON ModifyMessage where
    toJSON :: ModifyMessage -> Value
toJSON = Options -> ModifyMessage -> Value
forall a.
(Generic a, GToJSON' Value Zero (Rep a)) =>
Options -> a -> Value
genericToJSON Options
aesonOptions

-- | Default `ModifyMessage`
_ModifyMessage :: ModifyMessage
_ModifyMessage :: ModifyMessage
_ModifyMessage = ModifyMessage
    { $sel:metadata:ModifyMessage :: Maybe (Map Text Text)
metadata = Maybe (Map Text Text)
forall a. Maybe a
Nothing
    }

-- | The status of the message
data Status = In_Progress | Incomplete | Completed
    deriving stock ((forall x. Status -> Rep Status x)
-> (forall x. Rep Status x -> Status) -> Generic Status
forall x. Rep Status x -> Status
forall x. Status -> Rep Status x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cfrom :: forall x. Status -> Rep Status x
from :: forall x. Status -> Rep Status x
$cto :: forall x. Rep Status x -> Status
to :: forall x. Rep Status x -> Status
Generic, Int -> Status -> ShowS
[Status] -> ShowS
Status -> String
(Int -> Status -> ShowS)
-> (Status -> String) -> ([Status] -> ShowS) -> Show Status
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> Status -> ShowS
showsPrec :: Int -> Status -> ShowS
$cshow :: Status -> String
show :: Status -> String
$cshowList :: [Status] -> ShowS
showList :: [Status] -> ShowS
Show)

instance FromJSON Status where
    parseJSON :: Value -> Parser Status
parseJSON = Options -> Value -> Parser Status
forall a.
(Generic a, GFromJSON Zero (Rep a)) =>
Options -> Value -> Parser a
genericParseJSON Options
aesonOptions

-- | On an incomplete message, details about why the message is incomplete.
data IncompleteDetails = IncompleteDetails
    { IncompleteDetails -> Text
reason :: Text
    } deriving ((forall x. IncompleteDetails -> Rep IncompleteDetails x)
-> (forall x. Rep IncompleteDetails x -> IncompleteDetails)
-> Generic IncompleteDetails
forall x. Rep IncompleteDetails x -> IncompleteDetails
forall x. IncompleteDetails -> Rep IncompleteDetails x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cfrom :: forall x. IncompleteDetails -> Rep IncompleteDetails x
from :: forall x. IncompleteDetails -> Rep IncompleteDetails x
$cto :: forall x. Rep IncompleteDetails x -> IncompleteDetails
to :: forall x. Rep IncompleteDetails x -> IncompleteDetails
Generic, Int -> IncompleteDetails -> ShowS
[IncompleteDetails] -> ShowS
IncompleteDetails -> String
(Int -> IncompleteDetails -> ShowS)
-> (IncompleteDetails -> String)
-> ([IncompleteDetails] -> ShowS)
-> Show IncompleteDetails
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> IncompleteDetails -> ShowS
showsPrec :: Int -> IncompleteDetails -> ShowS
$cshow :: IncompleteDetails -> String
show :: IncompleteDetails -> String
$cshowList :: [IncompleteDetails] -> ShowS
showList :: [IncompleteDetails] -> ShowS
Show)
      deriving anyclass (Maybe IncompleteDetails
Value -> Parser [IncompleteDetails]
Value -> Parser IncompleteDetails
(Value -> Parser IncompleteDetails)
-> (Value -> Parser [IncompleteDetails])
-> Maybe IncompleteDetails
-> FromJSON IncompleteDetails
forall a.
(Value -> Parser a)
-> (Value -> Parser [a]) -> Maybe a -> FromJSON a
$cparseJSON :: Value -> Parser IncompleteDetails
parseJSON :: Value -> Parser IncompleteDetails
$cparseJSONList :: Value -> Parser [IncompleteDetails]
parseJSONList :: Value -> Parser [IncompleteDetails]
$comittedField :: Maybe IncompleteDetails
omittedField :: Maybe IncompleteDetails
FromJSON)

-- | File
data File = File
    { File -> FileID
file_id :: FileID
    } deriving stock ((forall x. File -> Rep File x)
-> (forall x. Rep File x -> File) -> Generic File
forall x. Rep File x -> File
forall x. File -> Rep File x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cfrom :: forall x. File -> Rep File x
from :: forall x. File -> Rep File x
$cto :: forall x. Rep File x -> File
to :: forall x. Rep File x -> File
Generic, Int -> File -> ShowS
[File] -> ShowS
File -> String
(Int -> File -> ShowS)
-> (File -> String) -> ([File] -> ShowS) -> Show File
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> File -> ShowS
showsPrec :: Int -> File -> ShowS
$cshow :: File -> String
show :: File -> String
$cshowList :: [File] -> ShowS
showList :: [File] -> ShowS
Show)
      deriving anyclass (Maybe File
Value -> Parser [File]
Value -> Parser File
(Value -> Parser File)
-> (Value -> Parser [File]) -> Maybe File -> FromJSON File
forall a.
(Value -> Parser a)
-> (Value -> Parser [a]) -> Maybe a -> FromJSON a
$cparseJSON :: Value -> Parser File
parseJSON :: Value -> Parser File
$cparseJSONList :: Value -> Parser [File]
parseJSONList :: Value -> Parser [File]
$comittedField :: Maybe File
omittedField :: Maybe File
FromJSON)

-- | An annotation
data Annotation
    = File_Citation
        { Annotation -> Text
text :: Text
        , Annotation -> File
file_citation :: File
        , Annotation -> Natural
start_index :: Natural
        , Annotation -> Natural
end_index :: Natural
        }
    | File_Path
        { text :: Text
        , Annotation -> File
file_path :: File
        , start_index :: Natural
        , end_index :: Natural
        }
    deriving stock ((forall x. Annotation -> Rep Annotation x)
-> (forall x. Rep Annotation x -> Annotation) -> Generic Annotation
forall x. Rep Annotation x -> Annotation
forall x. Annotation -> Rep Annotation x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cfrom :: forall x. Annotation -> Rep Annotation x
from :: forall x. Annotation -> Rep Annotation x
$cto :: forall x. Rep Annotation x -> Annotation
to :: forall x. Rep Annotation x -> Annotation
Generic, Int -> Annotation -> ShowS
[Annotation] -> ShowS
Annotation -> String
(Int -> Annotation -> ShowS)
-> (Annotation -> String)
-> ([Annotation] -> ShowS)
-> Show Annotation
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> Annotation -> ShowS
showsPrec :: Int -> Annotation -> ShowS
$cshow :: Annotation -> String
show :: Annotation -> String
$cshowList :: [Annotation] -> ShowS
showList :: [Annotation] -> ShowS
Show)

instance FromJSON Annotation where
    parseJSON :: Value -> Parser Annotation
parseJSON = Options -> Value -> Parser Annotation
forall a.
(Generic a, GFromJSON Zero (Rep a)) =>
Options -> Value -> Parser a
genericParseJSON Options
aesonOptions
        { sumEncoding =
            TaggedObject{ tagFieldName = "type", contentsFieldName = "" }

        , tagSingleConstructors = True
        }

-- | The text content that is part of a message.
data TextObject = TextObject
    { TextObject -> Text
value :: Text
    , TextObject -> Vector Annotation
annotations :: Vector Annotation
    } deriving stock ((forall x. TextObject -> Rep TextObject x)
-> (forall x. Rep TextObject x -> TextObject) -> Generic TextObject
forall x. Rep TextObject x -> TextObject
forall x. TextObject -> Rep TextObject x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cfrom :: forall x. TextObject -> Rep TextObject x
from :: forall x. TextObject -> Rep TextObject x
$cto :: forall x. Rep TextObject x -> TextObject
to :: forall x. Rep TextObject x -> TextObject
Generic, Int -> TextObject -> ShowS
[TextObject] -> ShowS
TextObject -> String
(Int -> TextObject -> ShowS)
-> (TextObject -> String)
-> ([TextObject] -> ShowS)
-> Show TextObject
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> TextObject -> ShowS
showsPrec :: Int -> TextObject -> ShowS
$cshow :: TextObject -> String
show :: TextObject -> String
$cshowList :: [TextObject] -> ShowS
showList :: [TextObject] -> ShowS
Show)
      deriving anyclass (Maybe TextObject
Value -> Parser [TextObject]
Value -> Parser TextObject
(Value -> Parser TextObject)
-> (Value -> Parser [TextObject])
-> Maybe TextObject
-> FromJSON TextObject
forall a.
(Value -> Parser a)
-> (Value -> Parser [a]) -> Maybe a -> FromJSON a
$cparseJSON :: Value -> Parser TextObject
parseJSON :: Value -> Parser TextObject
$cparseJSONList :: Value -> Parser [TextObject]
parseJSONList :: Value -> Parser [TextObject]
$comittedField :: Maybe TextObject
omittedField :: Maybe TextObject
FromJSON)

instance IsString TextObject where
    fromString :: String -> TextObject
fromString String
string =
        TextObject{ $sel:value:TextObject :: Text
value = String -> Text
forall a. IsString a => String -> a
fromString String
string, $sel:annotations:TextObject :: Vector Annotation
annotations = [] }

-- | Represents a message within a thread.
data MessageObject = MessageObject
    { MessageObject -> MessageID
id :: MessageID
    , MessageObject -> Text
object :: Text
    , MessageObject -> POSIXTime
created_at :: POSIXTime
    , MessageObject -> ThreadID
thread_id :: ThreadID
    , MessageObject -> Maybe Status
status :: Maybe Status
    , MessageObject -> Maybe IncompleteDetails
incomplete_details :: Maybe IncompleteDetails
    , MessageObject -> Maybe POSIXTime
completed_at :: Maybe POSIXTime
    , MessageObject -> Maybe POSIXTime
incomplete_at :: Maybe POSIXTime
    , MessageObject -> Text
role :: Text
    , MessageObject -> Vector (Content TextObject)
content :: Vector (Content TextObject)
    , MessageObject -> Maybe AssistantID
assistant_id :: Maybe AssistantID
    , MessageObject -> Maybe RunID
run_id :: Maybe RunID
    , MessageObject -> Maybe (Vector Attachment)
attachments :: Maybe (Vector Attachment)
    , MessageObject -> Map Text Text
metadata :: Map Text Text
    } deriving ((forall x. MessageObject -> Rep MessageObject x)
-> (forall x. Rep MessageObject x -> MessageObject)
-> Generic MessageObject
forall x. Rep MessageObject x -> MessageObject
forall x. MessageObject -> Rep MessageObject x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cfrom :: forall x. MessageObject -> Rep MessageObject x
from :: forall x. MessageObject -> Rep MessageObject x
$cto :: forall x. Rep MessageObject x -> MessageObject
to :: forall x. Rep MessageObject x -> MessageObject
Generic, Int -> MessageObject -> ShowS
[MessageObject] -> ShowS
MessageObject -> String
(Int -> MessageObject -> ShowS)
-> (MessageObject -> String)
-> ([MessageObject] -> ShowS)
-> Show MessageObject
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> MessageObject -> ShowS
showsPrec :: Int -> MessageObject -> ShowS
$cshow :: MessageObject -> String
show :: MessageObject -> String
$cshowList :: [MessageObject] -> ShowS
showList :: [MessageObject] -> ShowS
Show)
      deriving anyclass (Maybe MessageObject
Value -> Parser [MessageObject]
Value -> Parser MessageObject
(Value -> Parser MessageObject)
-> (Value -> Parser [MessageObject])
-> Maybe MessageObject
-> FromJSON MessageObject
forall a.
(Value -> Parser a)
-> (Value -> Parser [a]) -> Maybe a -> FromJSON a
$cparseJSON :: Value -> Parser MessageObject
parseJSON :: Value -> Parser MessageObject
$cparseJSONList :: Value -> Parser [MessageObject]
parseJSONList :: Value -> Parser [MessageObject]
$comittedField :: Maybe MessageObject
omittedField :: Maybe MessageObject
FromJSON)

-- | Servant API
type API =
        Header' '[Required, Strict] "OpenAI-Beta" Text
    :>  "threads"
    :>  (         Capture "thread_id" ThreadID
              :>  "messages"
              :>  ReqBody '[JSON] Message
              :>  Post '[JSON] MessageObject
        :<|>      Capture "thread_id" ThreadID
              :>  "messages"
              :>  Get '[JSON] (ListOf MessageObject)
        :<|>      Capture "thread_id" ThreadID
              :>  "messages"
              :>  Capture "message_id" MessageID
              :>  Get '[JSON] MessageObject
        :<|>      Capture "thread_id" ThreadID
              :>  "messages"
              :>  Capture "message_id" MessageID
              :>  ReqBody '[JSON] ModifyMessage
              :>  Post '[JSON] MessageObject
        :<|>      Capture "thread_id" ThreadID
              :>  "messages"
              :>  Capture "message_id" MessageID
              :>  Delete '[JSON] DeletionStatus
        )