{-# LANGUAGE RecordWildCards #-}
module Langchain.Embeddings.Ollama
( OllamaEmbeddings (..)
) where
import Data.Maybe
import Data.Ollama.Embeddings
import Data.Text (Text)
import Langchain.DocumentLoader.Core
import Langchain.Embeddings.Core
data OllamaEmbeddings = OllamaEmbeddings
{ OllamaEmbeddings -> Text
model :: Text
, OllamaEmbeddings -> Maybe Bool
defaultTruncate :: Maybe Bool
, OllamaEmbeddings -> Maybe Text
defaultKeepAlive :: Maybe Text
}
deriving (Int -> OllamaEmbeddings -> ShowS
[OllamaEmbeddings] -> ShowS
OllamaEmbeddings -> String
(Int -> OllamaEmbeddings -> ShowS)
-> (OllamaEmbeddings -> String)
-> ([OllamaEmbeddings] -> ShowS)
-> Show OllamaEmbeddings
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> OllamaEmbeddings -> ShowS
showsPrec :: Int -> OllamaEmbeddings -> ShowS
$cshow :: OllamaEmbeddings -> String
show :: OllamaEmbeddings -> String
$cshowList :: [OllamaEmbeddings] -> ShowS
showList :: [OllamaEmbeddings] -> ShowS
Show, OllamaEmbeddings -> OllamaEmbeddings -> Bool
(OllamaEmbeddings -> OllamaEmbeddings -> Bool)
-> (OllamaEmbeddings -> OllamaEmbeddings -> Bool)
-> Eq OllamaEmbeddings
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: OllamaEmbeddings -> OllamaEmbeddings -> Bool
== :: OllamaEmbeddings -> OllamaEmbeddings -> Bool
$c/= :: OllamaEmbeddings -> OllamaEmbeddings -> Bool
/= :: OllamaEmbeddings -> OllamaEmbeddings -> Bool
Eq)
go :: EmbeddingResp -> Either String [Float]
go :: EmbeddingResp -> Either String [Float]
go EmbeddingResp
embResp =
case [[Float]] -> Maybe [Float]
forall a. [a] -> Maybe a
listToMaybe (EmbeddingResp -> [[Float]]
embedding_ EmbeddingResp
embResp) of
Maybe [Float]
Nothing -> String -> Either String [Float]
forall a b. a -> Either a b
Left String
"Embeddings are empty"
Just [Float]
x -> [Float] -> Either String [Float]
forall a b. b -> Either a b
Right [Float]
x
instance Embeddings OllamaEmbeddings where
embedDocuments :: OllamaEmbeddings -> [Document] -> IO (Either String [[Float]])
embedDocuments (OllamaEmbeddings {Maybe Bool
Maybe Text
Text
model :: OllamaEmbeddings -> Text
defaultTruncate :: OllamaEmbeddings -> Maybe Bool
defaultKeepAlive :: OllamaEmbeddings -> Maybe Text
model :: Text
defaultTruncate :: Maybe Bool
defaultKeepAlive :: Maybe Text
..}) [Document]
docs = do
[Either String EmbeddingResp]
results <- (Document -> IO (Either String EmbeddingResp))
-> [Document] -> IO [Either String EmbeddingResp]
forall (t :: * -> *) (m :: * -> *) a b.
(Traversable t, Monad m) =>
(a -> m b) -> t a -> m (t b)
forall (m :: * -> *) a b. Monad m => (a -> m b) -> [a] -> m [b]
mapM (\Document
doc -> Text
-> Text
-> Maybe Bool
-> Maybe Text
-> IO (Either String EmbeddingResp)
embeddingOps Text
model (Document -> Text
pageContent Document
doc) Maybe Bool
defaultTruncate Maybe Text
defaultKeepAlive) [Document]
docs
Either String [[Float]] -> IO (Either String [[Float]])
forall a. a -> IO a
forall (m :: * -> *) a. Monad m => a -> m a
return (Either String [[Float]] -> IO (Either String [[Float]]))
-> Either String [[Float]] -> IO (Either String [[Float]])
forall a b. (a -> b) -> a -> b
$
[Either String EmbeddingResp] -> Either String [EmbeddingResp]
forall (t :: * -> *) (m :: * -> *) a.
(Traversable t, Monad m) =>
t (m a) -> m (t a)
forall (m :: * -> *) a. Monad m => [m a] -> m [a]
sequence [Either String EmbeddingResp]
results Either String [EmbeddingResp]
-> ([EmbeddingResp] -> Either String [[Float]])
-> Either String [[Float]]
forall a b.
Either String a -> (a -> Either String b) -> Either String b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= \[EmbeddingResp]
resps ->
(EmbeddingResp -> Either String [Float])
-> [EmbeddingResp] -> Either String [[Float]]
forall (t :: * -> *) (m :: * -> *) a b.
(Traversable t, Monad m) =>
(a -> m b) -> t a -> m (t b)
forall (m :: * -> *) a b. Monad m => (a -> m b) -> [a] -> m [b]
mapM EmbeddingResp -> Either String [Float]
go [EmbeddingResp]
resps
embedQuery :: OllamaEmbeddings -> Text -> IO (Either String [Float])
embedQuery (OllamaEmbeddings {Maybe Bool
Maybe Text
Text
model :: OllamaEmbeddings -> Text
defaultTruncate :: OllamaEmbeddings -> Maybe Bool
defaultKeepAlive :: OllamaEmbeddings -> Maybe Text
model :: Text
defaultTruncate :: Maybe Bool
defaultKeepAlive :: Maybe Text
..}) Text
query = do
Either String EmbeddingResp
res <- Text
-> Text
-> Maybe Bool
-> Maybe Text
-> IO (Either String EmbeddingResp)
embeddingOps Text
model Text
query Maybe Bool
defaultTruncate Maybe Text
defaultKeepAlive
case (EmbeddingResp -> [[Float]])
-> Either String EmbeddingResp -> Either String [[Float]]
forall a b. (a -> b) -> Either String a -> Either String b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap EmbeddingResp -> [[Float]]
embedding_ Either String EmbeddingResp
res of
Left String
err -> Either String [Float] -> IO (Either String [Float])
forall a. a -> IO a
forall (f :: * -> *) a. Applicative f => a -> f a
pure (Either String [Float] -> IO (Either String [Float]))
-> Either String [Float] -> IO (Either String [Float])
forall a b. (a -> b) -> a -> b
$ String -> Either String [Float]
forall a b. a -> Either a b
Left String
err
Right [[Float]]
lst ->
case [[Float]] -> Maybe [Float]
forall a. [a] -> Maybe a
listToMaybe [[Float]]
lst of
Maybe [Float]
Nothing -> Either String [Float] -> IO (Either String [Float])
forall a. a -> IO a
forall (f :: * -> *) a. Applicative f => a -> f a
pure (Either String [Float] -> IO (Either String [Float]))
-> Either String [Float] -> IO (Either String [Float])
forall a b. (a -> b) -> a -> b
$ String -> Either String [Float]
forall a b. a -> Either a b
Left String
"Embeddings are empty"
Just [Float]
x -> Either String [Float] -> IO (Either String [Float])
forall a. a -> IO a
forall (f :: * -> *) a. Applicative f => a -> f a
pure (Either String [Float] -> IO (Either String [Float]))
-> Either String [Float] -> IO (Either String [Float])
forall a b. (a -> b) -> a -> b
$ [Float] -> Either String [Float]
forall a b. b -> Either a b
Right [Float]
x