{-# LANGUAGE AllowAmbiguousTypes #-}
{-# LANGUAGE DeriveAnyClass #-}
{-# LANGUAGE DeriveGeneric #-}
{-# LANGUAGE DuplicateRecordFields #-}
{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE FunctionalDependencies #-}
{-# LANGUAGE GADTs #-}
{-# LANGUAGE GeneralizedNewtypeDeriving #-}
{-# LANGUAGE LambdaCase #-}
{-# LANGUAGE MultiParamTypeClasses #-}
{-# LANGUAGE OverloadedLists #-}
{-# LANGUAGE OverloadedRecordDot #-}
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE RankNTypes #-}
{-# LANGUAGE RecordWildCards #-}
{-# LANGUAGE ScopedTypeVariables #-}
{-# LANGUAGE TypeApplications #-}
{-# LANGUAGE TypeFamilies #-}

module IntelliMonad.CustomInstructions where

import qualified Data.Aeson as A
import Data.Proxy
import GHC.Generics
import IntelliMonad.Types
import qualified OpenAI.Types as API

defaultCustomInstructions :: [CustomInstructionProxy]
defaultCustomInstructions :: [CustomInstructionProxy]
defaultCustomInstructions = []

data ValidateNumber = ValidateNumber
  { ValidateNumber -> Double
number :: Double
  }
  deriving (ValidateNumber -> ValidateNumber -> Bool
(ValidateNumber -> ValidateNumber -> Bool)
-> (ValidateNumber -> ValidateNumber -> Bool) -> Eq ValidateNumber
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: ValidateNumber -> ValidateNumber -> Bool
== :: ValidateNumber -> ValidateNumber -> Bool
$c/= :: ValidateNumber -> ValidateNumber -> Bool
/= :: ValidateNumber -> ValidateNumber -> Bool
Eq, Int -> ValidateNumber -> ShowS
[ValidateNumber] -> ShowS
ValidateNumber -> String
(Int -> ValidateNumber -> ShowS)
-> (ValidateNumber -> String)
-> ([ValidateNumber] -> ShowS)
-> Show ValidateNumber
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> ValidateNumber -> ShowS
showsPrec :: Int -> ValidateNumber -> ShowS
$cshow :: ValidateNumber -> String
show :: ValidateNumber -> String
$cshowList :: [ValidateNumber] -> ShowS
showList :: [ValidateNumber] -> ShowS
Show, (forall x. ValidateNumber -> Rep ValidateNumber x)
-> (forall x. Rep ValidateNumber x -> ValidateNumber)
-> Generic ValidateNumber
forall x. Rep ValidateNumber x -> ValidateNumber
forall x. ValidateNumber -> Rep ValidateNumber x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cfrom :: forall x. ValidateNumber -> Rep ValidateNumber x
from :: forall x. ValidateNumber -> Rep ValidateNumber x
$cto :: forall x. Rep ValidateNumber x -> ValidateNumber
to :: forall x. Rep ValidateNumber x -> ValidateNumber
Generic, Schema
Schema -> JSONSchema ValidateNumber
forall r. Schema -> JSONSchema r
$cschema :: Schema
schema :: Schema
JSONSchema, Maybe ValidateNumber
Value -> Parser [ValidateNumber]
Value -> Parser ValidateNumber
(Value -> Parser ValidateNumber)
-> (Value -> Parser [ValidateNumber])
-> Maybe ValidateNumber
-> FromJSON ValidateNumber
forall a.
(Value -> Parser a)
-> (Value -> Parser [a]) -> Maybe a -> FromJSON a
$cparseJSON :: Value -> Parser ValidateNumber
parseJSON :: Value -> Parser ValidateNumber
$cparseJSONList :: Value -> Parser [ValidateNumber]
parseJSONList :: Value -> Parser [ValidateNumber]
$comittedField :: Maybe ValidateNumber
omittedField :: Maybe ValidateNumber
A.FromJSON, [ValidateNumber] -> Value
[ValidateNumber] -> Encoding
ValidateNumber -> Bool
ValidateNumber -> Value
ValidateNumber -> Encoding
(ValidateNumber -> Value)
-> (ValidateNumber -> Encoding)
-> ([ValidateNumber] -> Value)
-> ([ValidateNumber] -> Encoding)
-> (ValidateNumber -> Bool)
-> ToJSON ValidateNumber
forall a.
(a -> Value)
-> (a -> Encoding)
-> ([a] -> Value)
-> ([a] -> Encoding)
-> (a -> Bool)
-> ToJSON a
$ctoJSON :: ValidateNumber -> Value
toJSON :: ValidateNumber -> Value
$ctoEncoding :: ValidateNumber -> Encoding
toEncoding :: ValidateNumber -> Encoding
$ctoJSONList :: [ValidateNumber] -> Value
toJSONList :: [ValidateNumber] -> Value
$ctoEncodingList :: [ValidateNumber] -> Encoding
toEncodingList :: [ValidateNumber] -> Encoding
$comitField :: ValidateNumber -> Bool
omitField :: ValidateNumber -> Bool
A.ToJSON)

instance HasFunctionObject ValidateNumber where
  getFunctionName :: String
getFunctionName = String
"output_number"
  getFunctionDescription :: String
getFunctionDescription = String
"validate input number"
  getFieldDescription :: ShowS
getFieldDescription String
"number" = String
"A number that system outputs."

instance Tool ValidateNumber where
  data Output ValidateNumber = ValidateNumberOutput
    { Output ValidateNumber -> Int
code :: Int,
      Output ValidateNumber -> String
stdout :: String,
      Output ValidateNumber -> String
stderr :: String
    }
    deriving (Output ValidateNumber -> Output ValidateNumber -> Bool
(Output ValidateNumber -> Output ValidateNumber -> Bool)
-> (Output ValidateNumber -> Output ValidateNumber -> Bool)
-> Eq (Output ValidateNumber)
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: Output ValidateNumber -> Output ValidateNumber -> Bool
== :: Output ValidateNumber -> Output ValidateNumber -> Bool
$c/= :: Output ValidateNumber -> Output ValidateNumber -> Bool
/= :: Output ValidateNumber -> Output ValidateNumber -> Bool
Eq, Int -> Output ValidateNumber -> ShowS
[Output ValidateNumber] -> ShowS
Output ValidateNumber -> String
(Int -> Output ValidateNumber -> ShowS)
-> (Output ValidateNumber -> String)
-> ([Output ValidateNumber] -> ShowS)
-> Show (Output ValidateNumber)
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> Output ValidateNumber -> ShowS
showsPrec :: Int -> Output ValidateNumber -> ShowS
$cshow :: Output ValidateNumber -> String
show :: Output ValidateNumber -> String
$cshowList :: [Output ValidateNumber] -> ShowS
showList :: [Output ValidateNumber] -> ShowS
Show, (forall x. Output ValidateNumber -> Rep (Output ValidateNumber) x)
-> (forall x.
    Rep (Output ValidateNumber) x -> Output ValidateNumber)
-> Generic (Output ValidateNumber)
forall x. Rep (Output ValidateNumber) x -> Output ValidateNumber
forall x. Output ValidateNumber -> Rep (Output ValidateNumber) x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cfrom :: forall x. Output ValidateNumber -> Rep (Output ValidateNumber) x
from :: forall x. Output ValidateNumber -> Rep (Output ValidateNumber) x
$cto :: forall x. Rep (Output ValidateNumber) x -> Output ValidateNumber
to :: forall x. Rep (Output ValidateNumber) x -> Output ValidateNumber
Generic, Maybe (Output ValidateNumber)
Value -> Parser [Output ValidateNumber]
Value -> Parser (Output ValidateNumber)
(Value -> Parser (Output ValidateNumber))
-> (Value -> Parser [Output ValidateNumber])
-> Maybe (Output ValidateNumber)
-> FromJSON (Output ValidateNumber)
forall a.
(Value -> Parser a)
-> (Value -> Parser [a]) -> Maybe a -> FromJSON a
$cparseJSON :: Value -> Parser (Output ValidateNumber)
parseJSON :: Value -> Parser (Output ValidateNumber)
$cparseJSONList :: Value -> Parser [Output ValidateNumber]
parseJSONList :: Value -> Parser [Output ValidateNumber]
$comittedField :: Maybe (Output ValidateNumber)
omittedField :: Maybe (Output ValidateNumber)
A.FromJSON, [Output ValidateNumber] -> Value
[Output ValidateNumber] -> Encoding
Output ValidateNumber -> Bool
Output ValidateNumber -> Value
Output ValidateNumber -> Encoding
(Output ValidateNumber -> Value)
-> (Output ValidateNumber -> Encoding)
-> ([Output ValidateNumber] -> Value)
-> ([Output ValidateNumber] -> Encoding)
-> (Output ValidateNumber -> Bool)
-> ToJSON (Output ValidateNumber)
forall a.
(a -> Value)
-> (a -> Encoding)
-> ([a] -> Value)
-> ([a] -> Encoding)
-> (a -> Bool)
-> ToJSON a
$ctoJSON :: Output ValidateNumber -> Value
toJSON :: Output ValidateNumber -> Value
$ctoEncoding :: Output ValidateNumber -> Encoding
toEncoding :: Output ValidateNumber -> Encoding
$ctoJSONList :: [Output ValidateNumber] -> Value
toJSONList :: [Output ValidateNumber] -> Value
$ctoEncodingList :: [Output ValidateNumber] -> Encoding
toEncodingList :: [Output ValidateNumber] -> Encoding
$comitField :: Output ValidateNumber -> Bool
omitField :: Output ValidateNumber -> Bool
A.ToJSON)
  toolExec :: forall p (m :: * -> *).
(MonadIO m, MonadFail m, PersistentBackend p) =>
ValidateNumber -> Prompt m (Output ValidateNumber)
toolExec ValidateNumber
_ = do
    Output ValidateNumber -> Prompt m (Output ValidateNumber)
forall a. a -> StateT PromptEnv m a
forall (m :: * -> *) a. Monad m => a -> m a
return (Output ValidateNumber -> Prompt m (Output ValidateNumber))
-> Output ValidateNumber -> Prompt m (Output ValidateNumber)
forall a b. (a -> b) -> a -> b
$ Int -> String -> String -> Output ValidateNumber
ValidateNumberOutput Int
0 String
"" String
""

data Math = Math

instance CustomInstruction Math where
  customHeader :: Math -> Contents
customHeader Math
_ = [(User -> Message -> Text -> UTCTime -> Content
Content User
System (Text -> Message
Message Text
"Calcurate user input, then output just the number. Then call 'output_number' function.") Text
"" UTCTime
defaultUTCTime)]
  customFooter :: Math -> Contents
customFooter Math
_ = []

headers :: [CustomInstructionProxy] -> Contents
headers :: [CustomInstructionProxy] -> Contents
headers [] = []
headers (CustomInstructionProxy
tool : [CustomInstructionProxy]
tools') =
  case CustomInstructionProxy
tool of
    (CustomInstructionProxy t
a) -> t -> Contents
forall a. CustomInstruction a => a -> Contents
customHeader t
a Contents -> Contents -> Contents
forall a. Semigroup a => a -> a -> a
<> [CustomInstructionProxy] -> Contents
headers [CustomInstructionProxy]
tools'

footers :: [CustomInstructionProxy] -> Contents
footers :: [CustomInstructionProxy] -> Contents
footers [] = []
footers (CustomInstructionProxy
tool : [CustomInstructionProxy]
tools') =
  case CustomInstructionProxy
tool of
    (CustomInstructionProxy t
a) -> t -> Contents
forall a. CustomInstruction a => a -> Contents
customFooter t
a Contents -> Contents -> Contents
forall a. Semigroup a => a -> a -> a
<> [CustomInstructionProxy] -> Contents
footers [CustomInstructionProxy]
tools'

toolHeaders :: [ToolProxy] -> Contents
toolHeaders :: [ToolProxy] -> Contents
toolHeaders [] = []
toolHeaders (ToolProxy
tool : [ToolProxy]
tools') =
  case ToolProxy
tool of
    (ToolProxy (Proxy t
_ :: Proxy a)) -> forall a. Tool a => Contents
toolHeader @a Contents -> Contents -> Contents
forall a. Semigroup a => a -> a -> a
<> [ToolProxy] -> Contents
toolHeaders [ToolProxy]
tools'

toolFooters :: [ToolProxy] -> Contents
toolFooters :: [ToolProxy] -> Contents
toolFooters [] = []
toolFooters (ToolProxy
tool : [ToolProxy]
tools') =
  case ToolProxy
tool of
    (ToolProxy (Proxy t
_ :: Proxy a)) -> forall a. Tool a => Contents
toolFooter @a Contents -> Contents -> Contents
forall a. Semigroup a => a -> a -> a
<> [ToolProxy] -> Contents
toolFooters [ToolProxy]
tools'