{-# LANGUAGE DeriveAnyClass #-} {-# LANGUAGE DeriveGeneric #-} {-# LANGUAGE LambdaCase #-} {-# LANGUAGE OverloadedLists #-} {-# LANGUAGE OverloadedStrings #-} {-# LANGUAGE TypeApplications #-} {-# LANGUAGE TypeFamilies #-} module Main where import Control.Monad.Trans.State (runStateT) import Data.Proxy import IntelliMonad.Persist import IntelliMonad.Prompt import IntelliMonad.Types data Haruhi = Haruhi instance CustomInstruction Haruhi where customHeader = [(Content System (Message "あなたは涼宮ハルヒとして会話してください。話す時は'haruhi: 'をつけて話してください。") "" defaultUTCTime)] customFooter = [] data Kyon = Kyon instance CustomInstruction Kyon where customHeader = [(Content System (Message "あなたは涼宮ハルヒの同級生のキョンとして会話してください。話す時は'kyon: 'をつけて話してください。") "" defaultUTCTime)] customFooter = [] data Env = Env instance CustomInstruction Env where customHeader = [(Content System (Message "あなたは涼宮ハルヒの世界の環境として状況を設定してください。話す時は'env: 'をつけて話してください。") "" defaultUTCTime)] customFooter = [] toUser :: Content -> Content toUser c = if contentUser c == Assistant then c {contentUser = User} else c main :: IO () main = do e <- initializePrompt @StatelessConf [] [CustomInstructionProxy (Proxy @Env)] "env" (fromModel "gpt-4") h <- initializePrompt @StatelessConf [] [CustomInstructionProxy (Proxy @Haruhi)] "haruhi" (fromModel "gpt-4") k <- initializePrompt @StatelessConf [] [CustomInstructionProxy (Proxy @Kyon)] "kyon" (fromModel "gpt-4") let init' = [Content User (Message "ある駄菓子屋の前での出来ことで話を作ってください。Let's start!") "default" defaultUTCTime] loop init' [] [] [] e h k where loop init' env haruhi kyon e h k = do (env, e) <- runStateT (callWithContents @StatelessConf (map toUser (init' <> haruhi <> kyon))) e print "--env--" showContents env (haruhi, h) <- runStateT (callWithContents @StatelessConf (map toUser (kyon <> env))) h print "--haruhi--" showContents haruhi (kyon, k) <- runStateT (callWithContents @StatelessConf (map toUser (env <> haruhi))) k print "--kyon--" showContents kyon loop [] env haruhi kyon e h k