packages feed

langchain-hs-core-0.0.5.0: test/Test/Langchain/Core/Stream.hs

{-# LANGUAGE OverloadedStrings #-}

module Test.Langchain.Core.Stream (tests) where

import Test.Tasty
import Test.Tasty.HUnit

import Control.Monad.Except (runExceptT)
import Control.Monad.Trans.Resource (runResourceT)

import Langchain.Core.Model
import Langchain.Core.Stream
import Test.Langchain.Core.TestModel (TestChatModel (..))

tests :: TestTree
tests =
  testGroup
    "Langchain.Core.Stream"
    [ testCase "stream emits LLMStart, LLMChunk, LLMEnd events" $ do
        let model = TestChatModel "Streamed content" "mock-gpt"
            input = [userMessage "Stream test"]
        res <- runResourceT $ runExceptT $ collectEvents (stream model input Nothing)
        case res of
          Left err -> assertFailure $ "Unexpected stream error: " ++ show err
          Right events -> do
            length events @?= 3
            case events of
              [s@LLMStart {}, c@LLMChunk {}, e@LLMEnd {}] -> do
                modelName s @?= "mock-gpt"
                chunkText c @?= "Streamed content"
                extractMessageText (finalMessage e) @?= "Streamed content"
              _ -> assertFailure $ "Unexpected event sequence: " ++ show events
    ]