{-# LANGUAGE TypeFamilies #-}
module Langchain.Runnable.Core
( Runnable (..)
) where
import Control.Monad.IO.Class (MonadIO, liftIO)
import Langchain.Error (LangchainResult)
class Runnable r where
type RunnableInput r
type RunnableOutput r
invoke :: r -> RunnableInput r -> IO (LangchainResult (RunnableOutput r))
invokeM :: MonadIO m => r -> RunnableInput r -> m (LangchainResult (RunnableOutput r))
invokeM r
runnable RunnableInput r
input = IO (LangchainResult (RunnableOutput r))
-> m (LangchainResult (RunnableOutput r))
forall a. IO a -> m a
forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO (IO (LangchainResult (RunnableOutput r))
-> m (LangchainResult (RunnableOutput r)))
-> IO (LangchainResult (RunnableOutput r))
-> m (LangchainResult (RunnableOutput r))
forall a b. (a -> b) -> a -> b
$ r -> RunnableInput r -> IO (LangchainResult (RunnableOutput r))
forall r.
Runnable r =>
r -> RunnableInput r -> IO (LangchainResult (RunnableOutput r))
invoke r
runnable RunnableInput r
input
batch :: r -> [RunnableInput r] -> IO (LangchainResult [RunnableOutput r])
batchM :: MonadIO m => r -> [RunnableInput r] -> m (LangchainResult [RunnableOutput r])
batchM r
runnable [RunnableInput r]
inputs = IO (LangchainResult [RunnableOutput r])
-> m (LangchainResult [RunnableOutput r])
forall a. IO a -> m a
forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO (IO (LangchainResult [RunnableOutput r])
-> m (LangchainResult [RunnableOutput r]))
-> IO (LangchainResult [RunnableOutput r])
-> m (LangchainResult [RunnableOutput r])
forall a b. (a -> b) -> a -> b
$ r -> [RunnableInput r] -> IO (LangchainResult [RunnableOutput r])
forall r.
Runnable r =>
r -> [RunnableInput r] -> IO (LangchainResult [RunnableOutput r])
batch r
runnable [RunnableInput r]
inputs
batch r
r [RunnableInput r]
inputs = do
results <- (RunnableInput r -> IO (LangchainResult (RunnableOutput r)))
-> [RunnableInput r] -> IO [LangchainResult (RunnableOutput r)]
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 (r -> RunnableInput r -> IO (LangchainResult (RunnableOutput r))
forall r.
Runnable r =>
r -> RunnableInput r -> IO (LangchainResult (RunnableOutput r))
invoke r
r) [RunnableInput r]
inputs
return $ sequence results
stream :: r -> RunnableInput r -> (RunnableOutput r -> IO ()) -> IO (LangchainResult ())
stream r
r RunnableInput r
input RunnableOutput r -> IO ()
callback = do
result <- r -> RunnableInput r -> IO (LangchainResult (RunnableOutput r))
forall r.
Runnable r =>
r -> RunnableInput r -> IO (LangchainResult (RunnableOutput r))
invoke r
r RunnableInput r
input
case result of
Left LangchainError
err -> LangchainResult () -> IO (LangchainResult ())
forall a. a -> IO a
forall (m :: * -> *) a. Monad m => a -> m a
return (LangchainResult () -> IO (LangchainResult ()))
-> LangchainResult () -> IO (LangchainResult ())
forall a b. (a -> b) -> a -> b
$ LangchainError -> LangchainResult ()
forall a b. a -> Either a b
Left LangchainError
err
Right RunnableOutput r
output -> do
RunnableOutput r -> IO ()
callback RunnableOutput r
output
LangchainResult () -> IO (LangchainResult ())
forall a. a -> IO a
forall (m :: * -> *) a. Monad m => a -> m a
return (LangchainResult () -> IO (LangchainResult ()))
-> LangchainResult () -> IO (LangchainResult ())
forall a b. (a -> b) -> a -> b
$ () -> LangchainResult ()
forall a b. b -> Either a b
Right ()
streamM ::
MonadIO m => r -> RunnableInput r -> (RunnableOutput r -> IO ()) -> m (LangchainResult ())
streamM r
runnable RunnableInput r
input RunnableOutput r -> IO ()
callback = IO (LangchainResult ()) -> m (LangchainResult ())
forall a. IO a -> m a
forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO (IO (LangchainResult ()) -> m (LangchainResult ()))
-> IO (LangchainResult ()) -> m (LangchainResult ())
forall a b. (a -> b) -> a -> b
$ r
-> RunnableInput r
-> (RunnableOutput r -> IO ())
-> IO (LangchainResult ())
forall r.
Runnable r =>
r
-> RunnableInput r
-> (RunnableOutput r -> IO ())
-> IO (LangchainResult ())
stream r
runnable RunnableInput r
input RunnableOutput r -> IO ()
callback