packages feed

langchain-hs-0.0.5.0: test/Test/Langchain/Memory/EntitySpec.hs

{-# LANGUAGE OverloadedStrings #-}

module Test.Langchain.Memory.EntitySpec (tests) where

import Control.Monad.Except (runExceptT)
import qualified Data.Map.Strict as Map
import Test.Tasty
import Test.Tasty.HUnit

import Langchain.Core.Model (userMessage)
import Langchain.Memory.Core (BaseMemory (..))
import Langchain.Memory.Entity
import Test.Langchain.Provider.Mock (newMockModel)

tests :: TestTree
tests =
  testGroup
    "Langchain.Memory.EntitySpec"
    [ testCase "EntityMemory extracts and injects entities into conversation" $ do
        let mockModel = newMockModel "User: Likes Haskell and functional programming\nProject: Langchain-HS"
        mem <- newEntityMemory mockModel []
        res <- runExceptT $ do
          addMessage mem (userMessage "I am working on Langchain-HS and love functional programming")
          entities <- getEntities mem
          allMsgs <- messages mem
          pure (entities, allMsgs)
        case res of
          Left err -> assertFailure ("EntityMemory failed: " ++ show err)
          Right (entities, msgs) -> do
            Map.lookup "User" entities @?= Just "Likes Haskell and functional programming"
            Map.lookup "Project" entities @?= Just "Langchain-HS"
            assertBool "Includes system message with entities" (length msgs >= 2)
    ]