packages feed

openai-2.4.0: examples/responses-example/Main.hs

{-# LANGUAGE DuplicateRecordFields #-}
{-# LANGUAGE NamedFieldPuns        #-}
{-# LANGUAGE OverloadedLists       #-}
{-# LANGUAGE OverloadedStrings     #-}

module Main where

import Data.Foldable (toList)
import System.Environment (getEnv)

import qualified Data.Aeson as Aeson
import qualified Data.Text as Text
import qualified Data.Text.IO as TextIO
import qualified OpenAI.V1 as V1
import qualified OpenAI.V1.Responses as Responses

main :: IO ()
main = do
    key <- Text.pack <$> getEnv "OPENAI_KEY"
    env <- V1.getClientEnv "https://api.openai.com"

    let V1.Methods{ createResponse } = V1.makeMethods env key Nothing Nothing

    let classicRequest = Responses._CreateResponse
            { Responses.model = "gpt-5"
            , Responses.input = Just (Responses.Input
                [ Responses.Item_Input_Message
                    { Responses.role = Responses.User
                    , Responses.content = [ Responses.Input_Text{ Responses.text = "Tell me a three sentence bedtime story about a unicorn." } ]
                    , Responses.status = Nothing
                    }
                ])
            , Responses.reasoning = Just Responses._Reasoning
                { Responses.effort = Just Responses.ReasoningEffort_Minimal }
            }

    classicResponse <- createResponse classicRequest
    TextIO.putStrLn "--- Classic response ---"
    mapM_ TextIO.putStrLn (collectText classicResponse)

    let schemaObject = Aeson.object
            [ "type" Aeson..= ("object" :: Text.Text)
            , "properties" Aeson..= Aeson.object
                [ "story" Aeson..= Aeson.object [ "type" Aeson..= ("string" :: Text.Text) ]
                ]
            , "required" Aeson..= (["story"] :: [Text.Text])
            , "additionalProperties" Aeson..= False
            ]
        structuredRequest = Responses._CreateResponse
            { Responses.model = "gpt-5"
            , Responses.input = Just (Responses.Input
                [ Responses.Item_Input_Message
                    { Responses.role = Responses.User
                    , Responses.content = [ Responses.Input_Text{ Responses.text = "Return a bedtime story JSON object." } ]
                    , Responses.status = Nothing
                    }
                ])
            , Responses.text = Just Responses._TextConfig
                { Responses.format = Responses.TextFormat_JSON_Schema
                    { Responses.description = Just "A bedtime story payload"
                    , Responses.name = "bedtime_story"
                    , Responses.schema = Just schemaObject
                    , Responses.strict = Just True
                    }
                }
            , Responses.reasoning = Just Responses._Reasoning
                { Responses.effort = Just Responses.ReasoningEffort_Minimal }
            }

    structuredResponse <- createResponse structuredRequest
    TextIO.putStrLn "--- Structured response ---"
    mapM_ TextIO.putStrLn (collectText structuredResponse)

collectText :: Responses.ResponseObject -> [Text.Text]
collectText Responses.ResponseObject{ Responses.output } = do
    Responses.Item_OutputMessage{ Responses.message_content } <- toList output
    Responses.Output_Text{ Responses.text } <- toList message_content
    return text