{-# LANGUAGE DeriveAnyClass #-}
{-# LANGUAGE DeriveGeneric #-}
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE RecordWildCards #-}
module Langchain.LLM.Core
(
LLM (..)
, Message (..)
, Role (..)
, ChatMessage
, MessageData (..)
, Params (..)
, StreamHandler (..)
, defaultParams
, defaultMessageData
) where
import Data.Aeson
import Data.List.NonEmpty
import Data.Text (Text)
import GHC.Generics
data Params = Params
{ Params -> Maybe Double
temperature :: Maybe Double
, Params -> Maybe Integer
maxTokens :: Maybe Integer
,
Params -> Maybe Double
topP :: Maybe Double
, Params -> Maybe Int
n :: Maybe Int
, Params -> Maybe [Text]
stop :: Maybe [Text]
}
deriving (Int -> Params -> ShowS
[Params] -> ShowS
Params -> String
(Int -> Params -> ShowS)
-> (Params -> String) -> ([Params] -> ShowS) -> Show Params
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> Params -> ShowS
showsPrec :: Int -> Params -> ShowS
$cshow :: Params -> String
show :: Params -> String
$cshowList :: [Params] -> ShowS
showList :: [Params] -> ShowS
Show, Params -> Params -> Bool
(Params -> Params -> Bool)
-> (Params -> Params -> Bool) -> Eq Params
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: Params -> Params -> Bool
== :: Params -> Params -> Bool
$c/= :: Params -> Params -> Bool
/= :: Params -> Params -> Bool
Eq)
data StreamHandler = StreamHandler
{ StreamHandler -> Text -> IO ()
onToken :: Text -> IO ()
, StreamHandler -> IO ()
onComplete :: IO ()
}
data Role
=
System
|
User
|
Assistant
|
Tool
deriving (Role -> Role -> Bool
(Role -> Role -> Bool) -> (Role -> Role -> Bool) -> Eq Role
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: Role -> Role -> Bool
== :: Role -> Role -> Bool
$c/= :: Role -> Role -> Bool
/= :: Role -> Role -> Bool
Eq, Int -> Role -> ShowS
[Role] -> ShowS
Role -> String
(Int -> Role -> ShowS)
-> (Role -> String) -> ([Role] -> ShowS) -> Show Role
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> Role -> ShowS
showsPrec :: Int -> Role -> ShowS
$cshow :: Role -> String
show :: Role -> String
$cshowList :: [Role] -> ShowS
showList :: [Role] -> ShowS
Show, (forall x. Role -> Rep Role x)
-> (forall x. Rep Role x -> Role) -> Generic Role
forall x. Rep Role x -> Role
forall x. Role -> Rep Role x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cfrom :: forall x. Role -> Rep Role x
from :: forall x. Role -> Rep Role x
$cto :: forall x. Rep Role x -> Role
to :: forall x. Rep Role x -> Role
Generic, [Role] -> Value
[Role] -> Encoding
Role -> Bool
Role -> Value
Role -> Encoding
(Role -> Value)
-> (Role -> Encoding)
-> ([Role] -> Value)
-> ([Role] -> Encoding)
-> (Role -> Bool)
-> ToJSON Role
forall a.
(a -> Value)
-> (a -> Encoding)
-> ([a] -> Value)
-> ([a] -> Encoding)
-> (a -> Bool)
-> ToJSON a
$ctoJSON :: Role -> Value
toJSON :: Role -> Value
$ctoEncoding :: Role -> Encoding
toEncoding :: Role -> Encoding
$ctoJSONList :: [Role] -> Value
toJSONList :: [Role] -> Value
$ctoEncodingList :: [Role] -> Encoding
toEncodingList :: [Role] -> Encoding
$comitField :: Role -> Bool
omitField :: Role -> Bool
ToJSON, Maybe Role
Value -> Parser [Role]
Value -> Parser Role
(Value -> Parser Role)
-> (Value -> Parser [Role]) -> Maybe Role -> FromJSON Role
forall a.
(Value -> Parser a)
-> (Value -> Parser [a]) -> Maybe a -> FromJSON a
$cparseJSON :: Value -> Parser Role
parseJSON :: Value -> Parser Role
$cparseJSONList :: Value -> Parser [Role]
parseJSONList :: Value -> Parser [Role]
$comittedField :: Maybe Role
omittedField :: Maybe Role
FromJSON)
data Message = Message
{ Message -> Role
role :: Role
, Message -> Text
content :: Text
, Message -> MessageData
messageData :: MessageData
}
deriving (Message -> Message -> Bool
(Message -> Message -> Bool)
-> (Message -> Message -> Bool) -> Eq Message
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: Message -> Message -> Bool
== :: Message -> Message -> Bool
$c/= :: Message -> Message -> Bool
/= :: Message -> Message -> Bool
Eq, Int -> Message -> ShowS
[Message] -> ShowS
Message -> String
(Int -> Message -> ShowS)
-> (Message -> String) -> ([Message] -> ShowS) -> Show Message
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> Message -> ShowS
showsPrec :: Int -> Message -> ShowS
$cshow :: Message -> String
show :: Message -> String
$cshowList :: [Message] -> ShowS
showList :: [Message] -> ShowS
Show)
data MessageData = MessageData
{ MessageData -> Maybe Text
name :: Maybe Text
, MessageData -> Maybe [Text]
toolCalls :: Maybe [Text]
}
deriving (MessageData -> MessageData -> Bool
(MessageData -> MessageData -> Bool)
-> (MessageData -> MessageData -> Bool) -> Eq MessageData
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: MessageData -> MessageData -> Bool
== :: MessageData -> MessageData -> Bool
$c/= :: MessageData -> MessageData -> Bool
/= :: MessageData -> MessageData -> Bool
Eq, Int -> MessageData -> ShowS
[MessageData] -> ShowS
MessageData -> String
(Int -> MessageData -> ShowS)
-> (MessageData -> String)
-> ([MessageData] -> ShowS)
-> Show MessageData
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> MessageData -> ShowS
showsPrec :: Int -> MessageData -> ShowS
$cshow :: MessageData -> String
show :: MessageData -> String
$cshowList :: [MessageData] -> ShowS
showList :: [MessageData] -> ShowS
Show)
instance ToJSON MessageData where
toJSON :: MessageData -> Value
toJSON MessageData {Maybe [Text]
Maybe Text
name :: MessageData -> Maybe Text
toolCalls :: MessageData -> Maybe [Text]
name :: Maybe Text
toolCalls :: Maybe [Text]
..} =
[Pair] -> Value
object
[ Key
"name" Key -> Maybe Text -> Pair
forall v. ToJSON v => Key -> v -> Pair
forall e kv v. (KeyValue e kv, ToJSON v) => Key -> v -> kv
.= Maybe Text
name
, Key
"tool_calls" Key -> Maybe [Text] -> Pair
forall v. ToJSON v => Key -> v -> Pair
forall e kv v. (KeyValue e kv, ToJSON v) => Key -> v -> kv
.= Maybe [Text]
toolCalls
]
instance FromJSON MessageData where
parseJSON :: Value -> Parser MessageData
parseJSON = String
-> (Object -> Parser MessageData) -> Value -> Parser MessageData
forall a. String -> (Object -> Parser a) -> Value -> Parser a
withObject String
"MessageData" ((Object -> Parser MessageData) -> Value -> Parser MessageData)
-> (Object -> Parser MessageData) -> Value -> Parser MessageData
forall a b. (a -> b) -> a -> b
$ \Object
v ->
Maybe Text -> Maybe [Text] -> MessageData
MessageData
(Maybe Text -> Maybe [Text] -> MessageData)
-> Parser (Maybe Text) -> Parser (Maybe [Text] -> MessageData)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Object
v Object -> Key -> Parser (Maybe Text)
forall a. FromJSON a => Object -> Key -> Parser (Maybe a)
.:? Key
"name"
Parser (Maybe [Text] -> MessageData)
-> Parser (Maybe [Text]) -> Parser MessageData
forall a b. Parser (a -> b) -> Parser a -> Parser b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
v Object -> Key -> Parser (Maybe [Text])
forall a. FromJSON a => Object -> Key -> Parser (Maybe a)
.:? Key
"tool_calls"
type ChatMessage = NonEmpty Message
defaultMessageData :: MessageData
defaultMessageData :: MessageData
defaultMessageData =
MessageData
{ name :: Maybe Text
name = Maybe Text
forall a. Maybe a
Nothing
, toolCalls :: Maybe [Text]
toolCalls = Maybe [Text]
forall a. Maybe a
Nothing
}
class LLM m where
generate :: m
-> Text
-> Maybe Params
-> IO (Either String Text)
chat :: m
-> ChatMessage
-> Maybe Params
-> IO (Either String Text)
stream :: m -> ChatMessage -> StreamHandler -> Maybe Params -> IO (Either String ())
defaultParams :: Params
defaultParams :: Params
defaultParams =
Params
{ temperature :: Maybe Double
temperature = Maybe Double
forall a. Maybe a
Nothing
, maxTokens :: Maybe Integer
maxTokens = Maybe Integer
forall a. Maybe a
Nothing
, topP :: Maybe Double
topP = Maybe Double
forall a. Maybe a
Nothing
, n :: Maybe Int
n = Maybe Int
forall a. Maybe a
Nothing
, stop :: Maybe [Text]
stop = Maybe [Text]
forall a. Maybe a
Nothing
}