{-# LANGUAGE OverloadedStrings #-}
module Data.Ollama.Embeddings
(
embedding
, embeddingOps
, embeddingM
, embeddingOpsM
, defaultEmbeddingOps
, EmbeddingOps (..)
, EmbeddingResp (..)
, ModelOptions (..)
, defaultModelOptions
) where
import Control.Monad.IO.Class (MonadIO (liftIO))
import Data.Aeson
import Data.Ollama.Common.Config (OllamaConfig)
import Data.Ollama.Common.Error (OllamaError)
import Data.Ollama.Common.Types (ModelOptions (..))
import Data.Ollama.Common.Utils as CU
import Data.Text (Text)
defaultEmbeddingOps :: EmbeddingOps
defaultEmbeddingOps :: EmbeddingOps
defaultEmbeddingOps =
EmbeddingOps
{ model :: Text
model = Text
"llama3.2"
, input :: [Text]
input = []
, truncateInput :: Maybe Bool
truncateInput = Maybe Bool
forall a. Maybe a
Nothing
, keepAliveEmbed :: Maybe Int
keepAliveEmbed = Maybe Int
forall a. Maybe a
Nothing
, modelOptions :: Maybe ModelOptions
modelOptions = Maybe ModelOptions
forall a. Maybe a
Nothing
}
data EmbeddingOps = EmbeddingOps
{ EmbeddingOps -> Text
model :: !Text
, EmbeddingOps -> [Text]
input :: ![Text]
, EmbeddingOps -> Maybe Bool
truncateInput :: !(Maybe Bool)
, EmbeddingOps -> Maybe Int
keepAliveEmbed :: !(Maybe Int)
, EmbeddingOps -> Maybe ModelOptions
modelOptions :: !(Maybe ModelOptions)
}
deriving (Int -> EmbeddingOps -> ShowS
[EmbeddingOps] -> ShowS
EmbeddingOps -> String
(Int -> EmbeddingOps -> ShowS)
-> (EmbeddingOps -> String)
-> ([EmbeddingOps] -> ShowS)
-> Show EmbeddingOps
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> EmbeddingOps -> ShowS
showsPrec :: Int -> EmbeddingOps -> ShowS
$cshow :: EmbeddingOps -> String
show :: EmbeddingOps -> String
$cshowList :: [EmbeddingOps] -> ShowS
showList :: [EmbeddingOps] -> ShowS
Show, EmbeddingOps -> EmbeddingOps -> Bool
(EmbeddingOps -> EmbeddingOps -> Bool)
-> (EmbeddingOps -> EmbeddingOps -> Bool) -> Eq EmbeddingOps
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: EmbeddingOps -> EmbeddingOps -> Bool
== :: EmbeddingOps -> EmbeddingOps -> Bool
$c/= :: EmbeddingOps -> EmbeddingOps -> Bool
/= :: EmbeddingOps -> EmbeddingOps -> Bool
Eq)
data EmbeddingResp = EmbeddingResp
{ EmbeddingResp -> Text
respondedModel :: !Text
, EmbeddingResp -> [[Float]]
respondedEmbeddings :: ![[Float]]
}
deriving (Int -> EmbeddingResp -> ShowS
[EmbeddingResp] -> ShowS
EmbeddingResp -> String
(Int -> EmbeddingResp -> ShowS)
-> (EmbeddingResp -> String)
-> ([EmbeddingResp] -> ShowS)
-> Show EmbeddingResp
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> EmbeddingResp -> ShowS
showsPrec :: Int -> EmbeddingResp -> ShowS
$cshow :: EmbeddingResp -> String
show :: EmbeddingResp -> String
$cshowList :: [EmbeddingResp] -> ShowS
showList :: [EmbeddingResp] -> ShowS
Show, EmbeddingResp -> EmbeddingResp -> Bool
(EmbeddingResp -> EmbeddingResp -> Bool)
-> (EmbeddingResp -> EmbeddingResp -> Bool) -> Eq EmbeddingResp
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: EmbeddingResp -> EmbeddingResp -> Bool
== :: EmbeddingResp -> EmbeddingResp -> Bool
$c/= :: EmbeddingResp -> EmbeddingResp -> Bool
/= :: EmbeddingResp -> EmbeddingResp -> Bool
Eq)
instance FromJSON EmbeddingResp where
parseJSON :: Value -> Parser EmbeddingResp
parseJSON = String
-> (Object -> Parser EmbeddingResp)
-> Value
-> Parser EmbeddingResp
forall a. String -> (Object -> Parser a) -> Value -> Parser a
withObject String
"EmbeddingResp" ((Object -> Parser EmbeddingResp) -> Value -> Parser EmbeddingResp)
-> (Object -> Parser EmbeddingResp)
-> Value
-> Parser EmbeddingResp
forall a b. (a -> b) -> a -> b
$ \Object
v ->
Text -> [[Float]] -> EmbeddingResp
EmbeddingResp
(Text -> [[Float]] -> EmbeddingResp)
-> Parser Text -> Parser ([[Float]] -> EmbeddingResp)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Object
v Object -> Key -> Parser Text
forall a. FromJSON a => Object -> Key -> Parser a
.: Key
"model"
Parser ([[Float]] -> EmbeddingResp)
-> Parser [[Float]] -> Parser EmbeddingResp
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 [[Float]]
forall a. FromJSON a => Object -> Key -> Parser a
.: Key
"embeddings"
instance ToJSON EmbeddingOps where
toJSON :: EmbeddingOps -> Value
toJSON (EmbeddingOps Text
model_ [Text]
input_ Maybe Bool
truncate' Maybe Int
keepAlive_ Maybe ModelOptions
ops) =
[Pair] -> Value
object
[ Key
"model" Key -> Text -> Pair
forall v. ToJSON v => Key -> v -> Pair
forall e kv v. (KeyValue e kv, ToJSON v) => Key -> v -> kv
.= Text
model_
, Key
"input" Key -> [Text] -> Pair
forall v. ToJSON v => Key -> v -> Pair
forall e kv v. (KeyValue e kv, ToJSON v) => Key -> v -> kv
.= [Text]
input_
, Key
"truncate" Key -> Maybe Bool -> Pair
forall v. ToJSON v => Key -> v -> Pair
forall e kv v. (KeyValue e kv, ToJSON v) => Key -> v -> kv
.= Maybe Bool
truncate'
, Key
"keep_alive" Key -> Maybe Int -> Pair
forall v. ToJSON v => Key -> v -> Pair
forall e kv v. (KeyValue e kv, ToJSON v) => Key -> v -> kv
.= Maybe Int
keepAlive_
, Key
"options" Key -> Maybe ModelOptions -> Pair
forall v. ToJSON v => Key -> v -> Pair
forall e kv v. (KeyValue e kv, ToJSON v) => Key -> v -> kv
.= Maybe ModelOptions
ops
]
embeddingOps ::
Text ->
[Text] ->
Maybe Bool ->
Maybe Int ->
Maybe ModelOptions ->
Maybe OllamaConfig ->
IO (Either OllamaError EmbeddingResp)
embeddingOps :: Text
-> [Text]
-> Maybe Bool
-> Maybe Int
-> Maybe ModelOptions
-> Maybe OllamaConfig
-> IO (Either OllamaError EmbeddingResp)
embeddingOps Text
modelName [Text]
input_ Maybe Bool
mTruncate Maybe Int
mKeepAlive Maybe ModelOptions
mbOptions Maybe OllamaConfig
mbConfig = do
Text
-> ByteString
-> Maybe EmbeddingOps
-> Maybe OllamaConfig
-> (Response BodyReader -> IO (Either OllamaError EmbeddingResp))
-> IO (Either OllamaError EmbeddingResp)
forall payload response.
ToJSON payload =>
Text
-> ByteString
-> Maybe payload
-> Maybe OllamaConfig
-> (Response BodyReader -> IO (Either OllamaError response))
-> IO (Either OllamaError response)
withOllamaRequest
Text
"/api//embed"
ByteString
"POST"
( EmbeddingOps -> Maybe EmbeddingOps
forall a. a -> Maybe a
Just (EmbeddingOps -> Maybe EmbeddingOps)
-> EmbeddingOps -> Maybe EmbeddingOps
forall a b. (a -> b) -> a -> b
$
EmbeddingOps
{ model :: Text
model = Text
modelName
, input :: [Text]
input = [Text]
input_
, truncateInput :: Maybe Bool
truncateInput = Maybe Bool
mTruncate
, keepAliveEmbed :: Maybe Int
keepAliveEmbed = Maybe Int
mKeepAlive
, modelOptions :: Maybe ModelOptions
modelOptions = Maybe ModelOptions
mbOptions
}
)
Maybe OllamaConfig
mbConfig
Response BodyReader -> IO (Either OllamaError EmbeddingResp)
forall a.
FromJSON a =>
Response BodyReader -> IO (Either OllamaError a)
commonNonStreamingHandler
embedding ::
Text ->
[Text] ->
IO (Either OllamaError EmbeddingResp)
embedding :: Text -> [Text] -> IO (Either OllamaError EmbeddingResp)
embedding Text
modelName [Text]
input_ =
Text
-> [Text]
-> Maybe Bool
-> Maybe Int
-> Maybe ModelOptions
-> Maybe OllamaConfig
-> IO (Either OllamaError EmbeddingResp)
embeddingOps Text
modelName [Text]
input_ Maybe Bool
forall a. Maybe a
Nothing Maybe Int
forall a. Maybe a
Nothing Maybe ModelOptions
forall a. Maybe a
Nothing Maybe OllamaConfig
forall a. Maybe a
Nothing
embeddingM :: MonadIO m => Text -> [Text] -> m (Either OllamaError EmbeddingResp)
embeddingM :: forall (m :: * -> *).
MonadIO m =>
Text -> [Text] -> m (Either OllamaError EmbeddingResp)
embeddingM Text
m [Text]
ip = IO (Either OllamaError EmbeddingResp)
-> m (Either OllamaError EmbeddingResp)
forall a. IO a -> m a
forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO (IO (Either OllamaError EmbeddingResp)
-> m (Either OllamaError EmbeddingResp))
-> IO (Either OllamaError EmbeddingResp)
-> m (Either OllamaError EmbeddingResp)
forall a b. (a -> b) -> a -> b
$ Text -> [Text] -> IO (Either OllamaError EmbeddingResp)
embedding Text
m [Text]
ip
embeddingOpsM ::
MonadIO m =>
Text ->
[Text] ->
Maybe Bool ->
Maybe Int ->
Maybe ModelOptions ->
Maybe OllamaConfig ->
m (Either OllamaError EmbeddingResp)
embeddingOpsM :: forall (m :: * -> *).
MonadIO m =>
Text
-> [Text]
-> Maybe Bool
-> Maybe Int
-> Maybe ModelOptions
-> Maybe OllamaConfig
-> m (Either OllamaError EmbeddingResp)
embeddingOpsM Text
m [Text]
ip Maybe Bool
mbTruncate Maybe Int
mbKeepAlive Maybe ModelOptions
mbOptions Maybe OllamaConfig
mbCfg =
IO (Either OllamaError EmbeddingResp)
-> m (Either OllamaError EmbeddingResp)
forall a. IO a -> m a
forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO (IO (Either OllamaError EmbeddingResp)
-> m (Either OllamaError EmbeddingResp))
-> IO (Either OllamaError EmbeddingResp)
-> m (Either OllamaError EmbeddingResp)
forall a b. (a -> b) -> a -> b
$ Text
-> [Text]
-> Maybe Bool
-> Maybe Int
-> Maybe ModelOptions
-> Maybe OllamaConfig
-> IO (Either OllamaError EmbeddingResp)
embeddingOps Text
m [Text]
ip Maybe Bool
mbTruncate Maybe Int
mbKeepAlive Maybe ModelOptions
mbOptions Maybe OllamaConfig
mbCfg