langchain-hs-core-0.0.5.0: test/Test/Langchain/Core/Model.hs
{-# LANGUAGE OverloadedStrings #-}
module Test.Langchain.Core.Model (tests) where
import Test.Tasty
import Test.Tasty.HUnit
import Control.Monad.Except (runExceptT)
import Data.List.NonEmpty (NonEmpty (..))
import qualified Data.Map.Strict as Map
import Langchain.Core.Model
import Test.Langchain.Core.TestModel (TestChatModel (..))
tests :: TestTree
tests =
testGroup
"Langchain.Core.Model"
[ testGroup
"Multi-Modal ContentBlock & Message"
[ testCase "textMessage creates User message with TextBlock" $ do
let msg = userMessage "Hello AI"
messageRole msg @?= User
extractMessageText msg @?= "Hello AI"
messageMetadata msg @?= Map.empty
, testCase "systemMessage creates System message" $ do
let msg = systemMessage "You are a assistant"
messageRole msg @?= System
extractMessageText msg @?= "You are a assistant"
, testCase "imageMessage creates ImageBlock message" $ do
let msg = imageMessage User "image/png" "base64data=="
messageRole msg @?= User
case messageContents msg of
(ImageBlock (ImageContent (ImageBase64 (Just mime) b64) Nothing Nothing) :| []) -> do
mime @?= "image/png"
b64 @?= "base64data=="
_ -> assertFailure "Expected ImageBlock"
]
, testGroup
"Effect-Polymorphic ChatModel"
[ testCase "invoke returns Assistant response" $ do
let model = TestChatModel "Hello human" "mock-gpt"
input = [userMessage "Hi"]
res <- runExceptT $ invoke model input Nothing
case res of
Left err -> assertFailure $ "Unexpected error: " ++ show err
Right msg -> do
messageRole msg @?= Assistant
extractMessageText msg @?= "Hello human"
, testCase "batch processes multiple inputs sequentially" $ do
let model = TestChatModel "Pong" "mock-gpt"
inputs = [[userMessage "Ping 1"], [userMessage "Ping 2"]]
res <- runExceptT $ batch model inputs Nothing
case res of
Left err -> assertFailure $ "Unexpected error: " ++ show err
Right msgs -> do
length msgs @?= 2
map extractMessageText msgs @?= ["Pong", "Pong"]
]
]