packages feed

openai 2.2.1 → 2.3.0

raw patch · 12 files changed

+627/−194 lines, 12 filesPVP ok

version bump matches the API change (PVP)

API changes (from Hackage documentation)

- OpenAI.V1.Tool: flattenToolValue :: Value -> Value
- OpenAI.V1.Tool: parseResponsesToolChoiceValue :: Value -> Parser ToolChoice
- OpenAI.V1.Tool: parseResponsesToolValue :: Value -> Parser Tool
- OpenAI.V1.Tool: toolChoiceAutoText :: Text
- OpenAI.V1.Tool: toolChoiceNoneText :: Text
- OpenAI.V1.Tool: toolChoiceRequiredText :: Text
- OpenAI.V1.Tool: toolChoiceToResponsesValue :: ToolChoice -> Value
- OpenAI.V1.Tool: toolToResponsesValue :: Tool -> Value
- OpenAI.V1.Tool: unflattenToolValue :: Value -> Value
+ OpenAI.V1: [cancelChatSession] :: Methods -> SessionID -> IO CancelChatSession
+ OpenAI.V1: [createChatKitSession] :: Methods -> CreateChatKitSession -> IO ChatSessionObject
+ OpenAI.V1: [deleteChatKitThread] :: Methods -> ThreadID -> IO DeletionStatus
+ OpenAI.V1: [listChatKitThreadItems] :: Methods -> ThreadID -> Maybe Text -> Maybe Text -> Maybe Natural -> Maybe Order -> IO (Vector ThreadItem)
+ OpenAI.V1: [listChatKitThreads] :: Methods -> Maybe Text -> Maybe Text -> Maybe Natural -> Maybe Order -> Maybe Text -> IO (Vector ThreadObject)
+ OpenAI.V1: [retrieveChatKitThread] :: Methods -> ThreadID -> IO ThreadObject
+ OpenAI.V1.Chat.Completions: ChatCompletionStreamOptions :: Maybe Bool -> Maybe Bool -> ChatCompletionStreamOptions
+ OpenAI.V1.Chat.Completions: [include_obfuscation] :: ChatCompletionStreamOptions -> Maybe Bool
+ OpenAI.V1.Chat.Completions: [include_usage] :: ChatCompletionStreamOptions -> Maybe Bool
+ OpenAI.V1.Chat.Completions: [stream_options] :: CreateChatCompletion -> Maybe ChatCompletionStreamOptions
+ OpenAI.V1.Chat.Completions: _ChatCompletionStreamOptions :: ChatCompletionStreamOptions
+ OpenAI.V1.Chat.Completions: data ChatCompletionStreamOptions
+ OpenAI.V1.Chat.Completions: instance Data.Aeson.Types.FromJSON.FromJSON OpenAI.V1.Chat.Completions.ChatCompletionStreamOptions
+ OpenAI.V1.Chat.Completions: instance Data.Aeson.Types.ToJSON.ToJSON OpenAI.V1.Chat.Completions.ChatCompletionStreamOptions
+ OpenAI.V1.Chat.Completions: instance GHC.Generics.Generic OpenAI.V1.Chat.Completions.ChatCompletionStreamOptions
+ OpenAI.V1.Chat.Completions: instance GHC.Show.Show OpenAI.V1.Chat.Completions.ChatCompletionStreamOptions
+ OpenAI.V1.ChatKit: Assistant_Message :: Vector AssistantContent -> POSIXTime -> Text -> Text -> Text -> ThreadItem
+ OpenAI.V1.ChatKit: Attachment :: Text -> Text -> Text -> Text -> Attachment
+ OpenAI.V1.ChatKit: AutomaticThreadTitling :: Maybe Bool -> AutomaticThreadTitling
+ OpenAI.V1.ChatKit: CancelChatSession :: SessionID -> Workflow -> Scope -> Natural -> NominalDiffTime -> Text -> POSIXTime -> CancelChatSession
+ OpenAI.V1.ChatKit: ChatKitConfiguration :: Maybe AutomaticThreadTitling -> Maybe FileUpload -> Maybe History -> ChatKitConfiguration
+ OpenAI.V1.ChatKit: ChatSessionObject :: ChatKitConfiguration -> Text -> POSIXTime -> SessionID -> Natural -> Text -> RateLimits -> Text -> Text -> Workflow -> ChatSessionObject
+ OpenAI.V1.ChatKit: Client_Tool_Call :: Text -> Text -> POSIXTime -> Text -> Text -> Text -> Text -> Text -> Text -> ThreadItem
+ OpenAI.V1.ChatKit: CreateChatKitSession :: Text -> Workflow -> Maybe ChatKitConfiguration -> Maybe ExpiresAfter -> Maybe RateLimits -> CreateChatKitSession
+ OpenAI.V1.ChatKit: Created_At :: NominalDiffTime -> ExpiresAfter
+ OpenAI.V1.ChatKit: File :: FileSource -> Annotation
+ OpenAI.V1.ChatKit: FileSource_File :: Text -> FileSource
+ OpenAI.V1.ChatKit: FileUpload :: Maybe Bool -> Maybe Natural -> Maybe Natural -> FileUpload
+ OpenAI.V1.ChatKit: History :: Maybe Bool -> Maybe Natural -> History
+ OpenAI.V1.ChatKit: InferenceOptions :: Text -> ToolChoice -> InferenceOptions
+ OpenAI.V1.ChatKit: Input_Text :: Text -> UserContent
+ OpenAI.V1.ChatKit: Output_Text :: Vector Annotation -> Text -> AssistantContent
+ OpenAI.V1.ChatKit: Quoted_Text :: Text -> UserContent
+ OpenAI.V1.ChatKit: RateLimits :: Maybe Natural -> RateLimits
+ OpenAI.V1.ChatKit: Scope :: Text -> Scope
+ OpenAI.V1.ChatKit: SessionID :: Text -> SessionID
+ OpenAI.V1.ChatKit: Task :: Text -> Text -> Task
+ OpenAI.V1.ChatKit: Task_Group :: POSIXTime -> Text -> Text -> Vector Task -> Text -> ThreadItem
+ OpenAI.V1.ChatKit: Task_Item :: POSIXTime -> Text -> Text -> Text -> Text -> Text -> Text -> ThreadItem
+ OpenAI.V1.ChatKit: ThreadID :: Text -> ThreadID
+ OpenAI.V1.ChatKit: ThreadObject :: POSIXTime -> ThreadID -> Text -> Status -> Maybe Text -> Text -> ThreadObject
+ OpenAI.V1.ChatKit: ToolChoice :: Text -> ToolChoice
+ OpenAI.V1.ChatKit: Tracing :: Maybe Bool -> Tracing
+ OpenAI.V1.ChatKit: URLSource_Url :: Text -> URLSource
+ OpenAI.V1.ChatKit: Url :: URLSource -> Annotation
+ OpenAI.V1.ChatKit: User_Message :: Vector Attachment -> Vector UserContent -> POSIXTime -> Text -> InferenceOptions -> Text -> Text -> ThreadItem
+ OpenAI.V1.ChatKit: Widget_Message :: POSIXTime -> Text -> Text -> Text -> Text -> ThreadItem
+ OpenAI.V1.ChatKit: Workflow :: Text -> Maybe (Map Text Value) -> Maybe Tracing -> Maybe Text -> Workflow
+ OpenAI.V1.ChatKit: [annotations] :: AssistantContent -> Vector Annotation
+ OpenAI.V1.ChatKit: [arguments] :: ThreadItem -> Text
+ OpenAI.V1.ChatKit: [assistant_content] :: ThreadItem -> Vector AssistantContent
+ OpenAI.V1.ChatKit: [attachments] :: ThreadItem -> Vector Attachment
+ OpenAI.V1.ChatKit: [automatic_thread_titling] :: ChatKitConfiguration -> Maybe AutomaticThreadTitling
+ OpenAI.V1.ChatKit: [call_id] :: ThreadItem -> Text
+ OpenAI.V1.ChatKit: [cancelled_at] :: CancelChatSession -> POSIXTime
+ OpenAI.V1.ChatKit: [chatkit_configuration] :: ChatSessionObject -> ChatKitConfiguration
+ OpenAI.V1.ChatKit: [client_secret] :: ChatSessionObject -> Text
+ OpenAI.V1.ChatKit: [content] :: ThreadItem -> Vector UserContent
+ OpenAI.V1.ChatKit: [created_at] :: ThreadItem -> POSIXTime
+ OpenAI.V1.ChatKit: [customer_id] :: Scope -> Text
+ OpenAI.V1.ChatKit: [enabled] :: History -> Maybe Bool
+ OpenAI.V1.ChatKit: [expires_after] :: CreateChatKitSession -> Maybe ExpiresAfter
+ OpenAI.V1.ChatKit: [expires_at] :: ChatSessionObject -> POSIXTime
+ OpenAI.V1.ChatKit: [file_upload] :: ChatKitConfiguration -> Maybe FileUpload
+ OpenAI.V1.ChatKit: [filename] :: FileSource -> Text
+ OpenAI.V1.ChatKit: [heading] :: Task -> Text
+ OpenAI.V1.ChatKit: [history] :: ChatKitConfiguration -> Maybe History
+ OpenAI.V1.ChatKit: [id] :: ToolChoice -> Text
+ OpenAI.V1.ChatKit: [inference_options] :: ThreadItem -> InferenceOptions
+ OpenAI.V1.ChatKit: [max_file_size] :: FileUpload -> Maybe Natural
+ OpenAI.V1.ChatKit: [max_files] :: FileUpload -> Maybe Natural
+ OpenAI.V1.ChatKit: [max_requests_per_1_minute] :: RateLimits -> Maybe Natural
+ OpenAI.V1.ChatKit: [mime_type] :: Attachment -> Text
+ OpenAI.V1.ChatKit: [model] :: InferenceOptions -> Text
+ OpenAI.V1.ChatKit: [name] :: Attachment -> Text
+ OpenAI.V1.ChatKit: [object] :: ThreadItem -> Text
+ OpenAI.V1.ChatKit: [output] :: ThreadItem -> Text
+ OpenAI.V1.ChatKit: [preview_url] :: Attachment -> Text
+ OpenAI.V1.ChatKit: [rate_limits] :: ChatSessionObject -> RateLimits
+ OpenAI.V1.ChatKit: [recent_threads] :: History -> Maybe Natural
+ OpenAI.V1.ChatKit: [scope] :: CancelChatSession -> Scope
+ OpenAI.V1.ChatKit: [seconds] :: ExpiresAfter -> NominalDiffTime
+ OpenAI.V1.ChatKit: [source] :: Annotation -> FileSource
+ OpenAI.V1.ChatKit: [state_variables] :: Workflow -> Maybe (Map Text Value)
+ OpenAI.V1.ChatKit: [status] :: ThreadItem -> Text
+ OpenAI.V1.ChatKit: [summary] :: Task -> Text
+ OpenAI.V1.ChatKit: [task_type] :: ThreadItem -> Text
+ OpenAI.V1.ChatKit: [tasks] :: ThreadItem -> Vector Task
+ OpenAI.V1.ChatKit: [text] :: AssistantContent -> Text
+ OpenAI.V1.ChatKit: [thread_id] :: ThreadItem -> Text
+ OpenAI.V1.ChatKit: [title] :: ThreadObject -> Maybe Text
+ OpenAI.V1.ChatKit: [tool_choice] :: InferenceOptions -> ToolChoice
+ OpenAI.V1.ChatKit: [tracing] :: Workflow -> Maybe Tracing
+ OpenAI.V1.ChatKit: [ttl_seconds] :: CancelChatSession -> NominalDiffTime
+ OpenAI.V1.ChatKit: [url] :: URLSource -> Text
+ OpenAI.V1.ChatKit: [url_source] :: Annotation -> URLSource
+ OpenAI.V1.ChatKit: [user] :: ThreadObject -> Text
+ OpenAI.V1.ChatKit: [version] :: Workflow -> Maybe Text
+ OpenAI.V1.ChatKit: [widget] :: ThreadItem -> Text
+ OpenAI.V1.ChatKit: [workflow] :: CancelChatSession -> Workflow
+ OpenAI.V1.ChatKit: _CreateChatKitSession :: CreateChatKitSession
+ OpenAI.V1.ChatKit: data Annotation
+ OpenAI.V1.ChatKit: data AssistantContent
+ OpenAI.V1.ChatKit: data Attachment
+ OpenAI.V1.ChatKit: data AutomaticThreadTitling
+ OpenAI.V1.ChatKit: data CancelChatSession
+ OpenAI.V1.ChatKit: data ChatKitConfiguration
+ OpenAI.V1.ChatKit: data ChatSessionObject
+ OpenAI.V1.ChatKit: data CreateChatKitSession
+ OpenAI.V1.ChatKit: data ExpiresAfter
+ OpenAI.V1.ChatKit: data FileSource
+ OpenAI.V1.ChatKit: data FileUpload
+ OpenAI.V1.ChatKit: data History
+ OpenAI.V1.ChatKit: data InferenceOptions
+ OpenAI.V1.ChatKit: data RateLimits
+ OpenAI.V1.ChatKit: data Scope
+ OpenAI.V1.ChatKit: data Task
+ OpenAI.V1.ChatKit: data ThreadItem
+ OpenAI.V1.ChatKit: data ThreadObject
+ OpenAI.V1.ChatKit: data ToolChoice
+ OpenAI.V1.ChatKit: data Tracing
+ OpenAI.V1.ChatKit: data URLSource
+ OpenAI.V1.ChatKit: data UserContent
+ OpenAI.V1.ChatKit: data Workflow
+ OpenAI.V1.ChatKit: instance Data.Aeson.Types.FromJSON.FromJSON OpenAI.V1.ChatKit.Annotation
+ OpenAI.V1.ChatKit: instance Data.Aeson.Types.FromJSON.FromJSON OpenAI.V1.ChatKit.AssistantContent
+ OpenAI.V1.ChatKit: instance Data.Aeson.Types.FromJSON.FromJSON OpenAI.V1.ChatKit.Attachment
+ OpenAI.V1.ChatKit: instance Data.Aeson.Types.FromJSON.FromJSON OpenAI.V1.ChatKit.AutomaticThreadTitling
+ OpenAI.V1.ChatKit: instance Data.Aeson.Types.FromJSON.FromJSON OpenAI.V1.ChatKit.CancelChatSession
+ OpenAI.V1.ChatKit: instance Data.Aeson.Types.FromJSON.FromJSON OpenAI.V1.ChatKit.ChatKitConfiguration
+ OpenAI.V1.ChatKit: instance Data.Aeson.Types.FromJSON.FromJSON OpenAI.V1.ChatKit.ChatSessionObject
+ OpenAI.V1.ChatKit: instance Data.Aeson.Types.FromJSON.FromJSON OpenAI.V1.ChatKit.CreateChatKitSession
+ OpenAI.V1.ChatKit: instance Data.Aeson.Types.FromJSON.FromJSON OpenAI.V1.ChatKit.ExpiresAfter
+ OpenAI.V1.ChatKit: instance Data.Aeson.Types.FromJSON.FromJSON OpenAI.V1.ChatKit.FileSource
+ OpenAI.V1.ChatKit: instance Data.Aeson.Types.FromJSON.FromJSON OpenAI.V1.ChatKit.FileUpload
+ OpenAI.V1.ChatKit: instance Data.Aeson.Types.FromJSON.FromJSON OpenAI.V1.ChatKit.History
+ OpenAI.V1.ChatKit: instance Data.Aeson.Types.FromJSON.FromJSON OpenAI.V1.ChatKit.InferenceOptions
+ OpenAI.V1.ChatKit: instance Data.Aeson.Types.FromJSON.FromJSON OpenAI.V1.ChatKit.RateLimits
+ OpenAI.V1.ChatKit: instance Data.Aeson.Types.FromJSON.FromJSON OpenAI.V1.ChatKit.Scope
+ OpenAI.V1.ChatKit: instance Data.Aeson.Types.FromJSON.FromJSON OpenAI.V1.ChatKit.SessionID
+ OpenAI.V1.ChatKit: instance Data.Aeson.Types.FromJSON.FromJSON OpenAI.V1.ChatKit.Status
+ OpenAI.V1.ChatKit: instance Data.Aeson.Types.FromJSON.FromJSON OpenAI.V1.ChatKit.Task
+ OpenAI.V1.ChatKit: instance Data.Aeson.Types.FromJSON.FromJSON OpenAI.V1.ChatKit.ThreadID
+ OpenAI.V1.ChatKit: instance Data.Aeson.Types.FromJSON.FromJSON OpenAI.V1.ChatKit.ThreadItem
+ OpenAI.V1.ChatKit: instance Data.Aeson.Types.FromJSON.FromJSON OpenAI.V1.ChatKit.ThreadObject
+ OpenAI.V1.ChatKit: instance Data.Aeson.Types.FromJSON.FromJSON OpenAI.V1.ChatKit.ToolChoice
+ OpenAI.V1.ChatKit: instance Data.Aeson.Types.FromJSON.FromJSON OpenAI.V1.ChatKit.Tracing
+ OpenAI.V1.ChatKit: instance Data.Aeson.Types.FromJSON.FromJSON OpenAI.V1.ChatKit.URLSource
+ OpenAI.V1.ChatKit: instance Data.Aeson.Types.FromJSON.FromJSON OpenAI.V1.ChatKit.UserContent
+ OpenAI.V1.ChatKit: instance Data.Aeson.Types.FromJSON.FromJSON OpenAI.V1.ChatKit.Workflow
+ OpenAI.V1.ChatKit: instance Data.Aeson.Types.ToJSON.ToJSON OpenAI.V1.ChatKit.Annotation
+ OpenAI.V1.ChatKit: instance Data.Aeson.Types.ToJSON.ToJSON OpenAI.V1.ChatKit.AssistantContent
+ OpenAI.V1.ChatKit: instance Data.Aeson.Types.ToJSON.ToJSON OpenAI.V1.ChatKit.Attachment
+ OpenAI.V1.ChatKit: instance Data.Aeson.Types.ToJSON.ToJSON OpenAI.V1.ChatKit.AutomaticThreadTitling
+ OpenAI.V1.ChatKit: instance Data.Aeson.Types.ToJSON.ToJSON OpenAI.V1.ChatKit.CancelChatSession
+ OpenAI.V1.ChatKit: instance Data.Aeson.Types.ToJSON.ToJSON OpenAI.V1.ChatKit.ChatKitConfiguration
+ OpenAI.V1.ChatKit: instance Data.Aeson.Types.ToJSON.ToJSON OpenAI.V1.ChatKit.ChatSessionObject
+ OpenAI.V1.ChatKit: instance Data.Aeson.Types.ToJSON.ToJSON OpenAI.V1.ChatKit.CreateChatKitSession
+ OpenAI.V1.ChatKit: instance Data.Aeson.Types.ToJSON.ToJSON OpenAI.V1.ChatKit.ExpiresAfter
+ OpenAI.V1.ChatKit: instance Data.Aeson.Types.ToJSON.ToJSON OpenAI.V1.ChatKit.FileSource
+ OpenAI.V1.ChatKit: instance Data.Aeson.Types.ToJSON.ToJSON OpenAI.V1.ChatKit.FileUpload
+ OpenAI.V1.ChatKit: instance Data.Aeson.Types.ToJSON.ToJSON OpenAI.V1.ChatKit.History
+ OpenAI.V1.ChatKit: instance Data.Aeson.Types.ToJSON.ToJSON OpenAI.V1.ChatKit.InferenceOptions
+ OpenAI.V1.ChatKit: instance Data.Aeson.Types.ToJSON.ToJSON OpenAI.V1.ChatKit.RateLimits
+ OpenAI.V1.ChatKit: instance Data.Aeson.Types.ToJSON.ToJSON OpenAI.V1.ChatKit.Scope
+ OpenAI.V1.ChatKit: instance Data.Aeson.Types.ToJSON.ToJSON OpenAI.V1.ChatKit.SessionID
+ OpenAI.V1.ChatKit: instance Data.Aeson.Types.ToJSON.ToJSON OpenAI.V1.ChatKit.Status
+ OpenAI.V1.ChatKit: instance Data.Aeson.Types.ToJSON.ToJSON OpenAI.V1.ChatKit.Task
+ OpenAI.V1.ChatKit: instance Data.Aeson.Types.ToJSON.ToJSON OpenAI.V1.ChatKit.ThreadID
+ OpenAI.V1.ChatKit: instance Data.Aeson.Types.ToJSON.ToJSON OpenAI.V1.ChatKit.ThreadItem
+ OpenAI.V1.ChatKit: instance Data.Aeson.Types.ToJSON.ToJSON OpenAI.V1.ChatKit.ThreadObject
+ OpenAI.V1.ChatKit: instance Data.Aeson.Types.ToJSON.ToJSON OpenAI.V1.ChatKit.ToolChoice
+ OpenAI.V1.ChatKit: instance Data.Aeson.Types.ToJSON.ToJSON OpenAI.V1.ChatKit.Tracing
+ OpenAI.V1.ChatKit: instance Data.Aeson.Types.ToJSON.ToJSON OpenAI.V1.ChatKit.URLSource
+ OpenAI.V1.ChatKit: instance Data.Aeson.Types.ToJSON.ToJSON OpenAI.V1.ChatKit.UserContent
+ OpenAI.V1.ChatKit: instance Data.Aeson.Types.ToJSON.ToJSON OpenAI.V1.ChatKit.Workflow
+ OpenAI.V1.ChatKit: instance Data.String.IsString OpenAI.V1.ChatKit.SessionID
+ OpenAI.V1.ChatKit: instance Data.String.IsString OpenAI.V1.ChatKit.ThreadID
+ OpenAI.V1.ChatKit: instance GHC.Generics.Generic OpenAI.V1.ChatKit.Annotation
+ OpenAI.V1.ChatKit: instance GHC.Generics.Generic OpenAI.V1.ChatKit.AssistantContent
+ OpenAI.V1.ChatKit: instance GHC.Generics.Generic OpenAI.V1.ChatKit.Attachment
+ OpenAI.V1.ChatKit: instance GHC.Generics.Generic OpenAI.V1.ChatKit.AutomaticThreadTitling
+ OpenAI.V1.ChatKit: instance GHC.Generics.Generic OpenAI.V1.ChatKit.CancelChatSession
+ OpenAI.V1.ChatKit: instance GHC.Generics.Generic OpenAI.V1.ChatKit.ChatKitConfiguration
+ OpenAI.V1.ChatKit: instance GHC.Generics.Generic OpenAI.V1.ChatKit.ChatSessionObject
+ OpenAI.V1.ChatKit: instance GHC.Generics.Generic OpenAI.V1.ChatKit.CreateChatKitSession
+ OpenAI.V1.ChatKit: instance GHC.Generics.Generic OpenAI.V1.ChatKit.ExpiresAfter
+ OpenAI.V1.ChatKit: instance GHC.Generics.Generic OpenAI.V1.ChatKit.FileSource
+ OpenAI.V1.ChatKit: instance GHC.Generics.Generic OpenAI.V1.ChatKit.FileUpload
+ OpenAI.V1.ChatKit: instance GHC.Generics.Generic OpenAI.V1.ChatKit.History
+ OpenAI.V1.ChatKit: instance GHC.Generics.Generic OpenAI.V1.ChatKit.InferenceOptions
+ OpenAI.V1.ChatKit: instance GHC.Generics.Generic OpenAI.V1.ChatKit.RateLimits
+ OpenAI.V1.ChatKit: instance GHC.Generics.Generic OpenAI.V1.ChatKit.Scope
+ OpenAI.V1.ChatKit: instance GHC.Generics.Generic OpenAI.V1.ChatKit.Status
+ OpenAI.V1.ChatKit: instance GHC.Generics.Generic OpenAI.V1.ChatKit.Task
+ OpenAI.V1.ChatKit: instance GHC.Generics.Generic OpenAI.V1.ChatKit.ThreadItem
+ OpenAI.V1.ChatKit: instance GHC.Generics.Generic OpenAI.V1.ChatKit.ThreadObject
+ OpenAI.V1.ChatKit: instance GHC.Generics.Generic OpenAI.V1.ChatKit.ToolChoice
+ OpenAI.V1.ChatKit: instance GHC.Generics.Generic OpenAI.V1.ChatKit.Tracing
+ OpenAI.V1.ChatKit: instance GHC.Generics.Generic OpenAI.V1.ChatKit.URLSource
+ OpenAI.V1.ChatKit: instance GHC.Generics.Generic OpenAI.V1.ChatKit.UserContent
+ OpenAI.V1.ChatKit: instance GHC.Generics.Generic OpenAI.V1.ChatKit.Workflow
+ OpenAI.V1.ChatKit: instance GHC.Show.Show OpenAI.V1.ChatKit.Annotation
+ OpenAI.V1.ChatKit: instance GHC.Show.Show OpenAI.V1.ChatKit.AssistantContent
+ OpenAI.V1.ChatKit: instance GHC.Show.Show OpenAI.V1.ChatKit.Attachment
+ OpenAI.V1.ChatKit: instance GHC.Show.Show OpenAI.V1.ChatKit.AutomaticThreadTitling
+ OpenAI.V1.ChatKit: instance GHC.Show.Show OpenAI.V1.ChatKit.CancelChatSession
+ OpenAI.V1.ChatKit: instance GHC.Show.Show OpenAI.V1.ChatKit.ChatKitConfiguration
+ OpenAI.V1.ChatKit: instance GHC.Show.Show OpenAI.V1.ChatKit.ChatSessionObject
+ OpenAI.V1.ChatKit: instance GHC.Show.Show OpenAI.V1.ChatKit.CreateChatKitSession
+ OpenAI.V1.ChatKit: instance GHC.Show.Show OpenAI.V1.ChatKit.ExpiresAfter
+ OpenAI.V1.ChatKit: instance GHC.Show.Show OpenAI.V1.ChatKit.FileSource
+ OpenAI.V1.ChatKit: instance GHC.Show.Show OpenAI.V1.ChatKit.FileUpload
+ OpenAI.V1.ChatKit: instance GHC.Show.Show OpenAI.V1.ChatKit.History
+ OpenAI.V1.ChatKit: instance GHC.Show.Show OpenAI.V1.ChatKit.InferenceOptions
+ OpenAI.V1.ChatKit: instance GHC.Show.Show OpenAI.V1.ChatKit.RateLimits
+ OpenAI.V1.ChatKit: instance GHC.Show.Show OpenAI.V1.ChatKit.Scope
+ OpenAI.V1.ChatKit: instance GHC.Show.Show OpenAI.V1.ChatKit.SessionID
+ OpenAI.V1.ChatKit: instance GHC.Show.Show OpenAI.V1.ChatKit.Status
+ OpenAI.V1.ChatKit: instance GHC.Show.Show OpenAI.V1.ChatKit.Task
+ OpenAI.V1.ChatKit: instance GHC.Show.Show OpenAI.V1.ChatKit.ThreadID
+ OpenAI.V1.ChatKit: instance GHC.Show.Show OpenAI.V1.ChatKit.ThreadItem
+ OpenAI.V1.ChatKit: instance GHC.Show.Show OpenAI.V1.ChatKit.ThreadObject
+ OpenAI.V1.ChatKit: instance GHC.Show.Show OpenAI.V1.ChatKit.ToolChoice
+ OpenAI.V1.ChatKit: instance GHC.Show.Show OpenAI.V1.ChatKit.Tracing
+ OpenAI.V1.ChatKit: instance GHC.Show.Show OpenAI.V1.ChatKit.URLSource
+ OpenAI.V1.ChatKit: instance GHC.Show.Show OpenAI.V1.ChatKit.UserContent
+ OpenAI.V1.ChatKit: instance GHC.Show.Show OpenAI.V1.ChatKit.Workflow
+ OpenAI.V1.ChatKit: instance Web.Internal.HttpApiData.ToHttpApiData OpenAI.V1.ChatKit.SessionID
+ OpenAI.V1.ChatKit: instance Web.Internal.HttpApiData.ToHttpApiData OpenAI.V1.ChatKit.ThreadID
+ OpenAI.V1.ChatKit: newtype SessionID
+ OpenAI.V1.ChatKit: newtype ThreadID
+ OpenAI.V1.ChatKit: type API = "chatkit" :> "sessions" :> ReqBody '[JSON] CreateChatKitSession :> Post '[JSON] ChatSessionObject :<|> "sessions" :> Capture "session_id" SessionID :> "cancel" :> Post '[JSON] CancelChatSession :<|> "threads" :> QueryParam "after" Text :> QueryParam "before" Text :> QueryParam "limit" Natural :> QueryParam "order" Order :> QueryParam "user" Text :> Get '[JSON] ListOf ThreadObject :<|> "threads" :> Capture "thread_id" ThreadID :> Get '[JSON] ThreadObject :<|> "threads" :> Capture "thread_id" ThreadID :> Delete '[JSON] DeletionStatus :<|> "threads" :> Capture "thread_id" ThreadID :> "items" :> QueryParam "after" Text :> QueryParam "before" Text :> QueryParam "limit" Natural :> QueryParam "order" Order :> Get '[JSON] ListOf ThreadItem
+ OpenAI.V1.Responses: Tool_Code_Interpreter :: Maybe CodeInterpreterContainer -> Tool
+ OpenAI.V1.Responses: Tool_File_Search :: Maybe Natural -> Maybe RankingOptions -> Tool
+ OpenAI.V1.Responses: Tool_Function :: Maybe Text -> Text -> Maybe Value -> Maybe Bool -> Tool
+ OpenAI.V1.Responses: Tool_Web_Search :: Tool
+ OpenAI.V1.Responses: [container] :: Tool -> Maybe CodeInterpreterContainer
+ OpenAI.V1.Responses: [description] :: Tool -> Maybe Text
+ OpenAI.V1.Responses: [max_num_results] :: Tool -> Maybe Natural
+ OpenAI.V1.Responses: [parameters] :: Tool -> Maybe Value
+ OpenAI.V1.Responses: [ranking_options] :: Tool -> Maybe RankingOptions
+ OpenAI.V1.Responses: [strict] :: Tool -> Maybe Bool
+ OpenAI.V1.Responses: data Tool
+ OpenAI.V1.Responses: instance Data.Aeson.Types.FromJSON.FromJSON OpenAI.V1.Responses.Tool
+ OpenAI.V1.Responses: instance Data.Aeson.Types.ToJSON.ToJSON OpenAI.V1.Responses.Tool
+ OpenAI.V1.Responses: instance GHC.Generics.Generic OpenAI.V1.Responses.Tool
+ OpenAI.V1.Responses: instance GHC.Show.Show OpenAI.V1.Responses.Tool
- OpenAI.V1: Methods :: (CreateSpeech -> IO ByteString) -> (CreateTranscription -> IO TranscriptionObject) -> (CreateTranslation -> IO TranslationObject) -> (CreateChatCompletion -> IO ChatCompletionObject) -> (CreateChatCompletion -> (Either Text Value -> IO ()) -> IO ()) -> (CreateChatCompletion -> (Either Text ChatCompletionStreamEvent -> IO ()) -> IO ()) -> (CreateResponse -> IO ResponseObject) -> (CreateResponse -> (Either Text Value -> IO ()) -> IO ()) -> (CreateEmbeddings -> IO (Vector EmbeddingObject)) -> (CreateResponse -> (Either Text ResponseStreamEvent -> IO ()) -> IO ()) -> (CreateFineTuningJob -> IO JobObject) -> (Maybe Text -> Maybe Natural -> IO (Vector JobObject)) -> (FineTuningJobID -> Maybe Text -> Maybe Natural -> IO (Vector EventObject)) -> (FineTuningJobID -> Maybe Text -> Maybe Natural -> IO (Vector CheckpointObject)) -> (FineTuningJobID -> IO JobObject) -> (FineTuningJobID -> IO JobObject) -> (CreateBatch -> IO BatchObject) -> (BatchID -> IO BatchObject) -> (BatchID -> IO BatchObject) -> (Maybe Text -> Maybe Natural -> IO (Vector BatchObject)) -> (UploadFile -> IO FileObject) -> (Maybe Purpose -> Maybe Natural -> Maybe Order -> Maybe Text -> IO (Vector FileObject)) -> (FileID -> IO FileObject) -> (FileID -> IO DeletionStatus) -> (FileID -> IO ByteString) -> (CreateUpload -> IO (UploadObject (Maybe Void))) -> (UploadID -> AddUploadPart -> IO PartObject) -> (UploadID -> CompleteUpload -> IO (UploadObject FileObject)) -> (UploadID -> IO (UploadObject (Maybe Void))) -> (CreateImage -> IO (Vector ImageObject)) -> (CreateImageEdit -> IO (Vector ImageObject)) -> (CreateImageVariation -> IO (Vector ImageObject)) -> IO (Vector ModelObject) -> (Model -> IO ModelObject) -> (Model -> IO DeletionStatus) -> (CreateModeration -> IO Moderation) -> (CreateAssistant -> IO AssistantObject) -> (Maybe Natural -> Maybe Order -> Maybe Text -> Maybe Text -> IO (Vector AssistantObject)) -> (AssistantID -> IO AssistantObject) -> (AssistantID -> ModifyAssistant -> IO AssistantObject) -> (AssistantID -> IO DeletionStatus) -> (Thread -> IO ThreadObject) -> (ThreadID -> IO ThreadObject) -> (ThreadID -> ModifyThread -> IO ThreadObject) -> (ThreadID -> IO DeletionStatus) -> (ThreadID -> Message -> IO MessageObject) -> (ThreadID -> IO (Vector MessageObject)) -> (ThreadID -> MessageID -> IO MessageObject) -> (ThreadID -> MessageID -> ModifyMessage -> IO MessageObject) -> (ThreadID -> MessageID -> IO DeletionStatus) -> (ThreadID -> Maybe Text -> CreateRun -> IO RunObject) -> (CreateThreadAndRun -> IO RunObject) -> (ThreadID -> Maybe Natural -> Maybe Order -> Maybe Text -> Maybe Text -> IO (Vector RunObject)) -> (ThreadID -> RunID -> IO RunObject) -> (ThreadID -> RunID -> ModifyRun -> IO RunObject) -> (ThreadID -> RunID -> SubmitToolOutputsToRun -> IO RunObject) -> (ThreadID -> RunID -> IO RunObject) -> (ThreadID -> RunID -> Maybe Natural -> Maybe Order -> Maybe Text -> Maybe Text -> Maybe Text -> IO (Vector RunStepObject)) -> (ThreadID -> RunID -> StepID -> Maybe Text -> IO RunStepObject) -> (Text -> IO ResponseObject) -> (Text -> IO ResponseObject) -> (Text -> IO (Vector InputItem)) -> (CreateVectorStore -> IO VectorStoreObject) -> (Maybe Natural -> Maybe Order -> Maybe Text -> Maybe Text -> IO (Vector VectorStoreObject)) -> (VectorStoreID -> IO VectorStoreObject) -> (VectorStoreID -> ModifyVectorStore -> IO VectorStoreObject) -> (VectorStoreID -> IO DeletionStatus) -> (VectorStoreID -> CreateVectorStoreFile -> IO VectorStoreFileObject) -> (VectorStoreID -> Maybe Natural -> Maybe Order -> Maybe Text -> Maybe Text -> Maybe Status -> IO (Vector VectorStoreFileObject)) -> (VectorStoreID -> VectorStoreFileID -> IO VectorStoreFileObject) -> (VectorStoreID -> VectorStoreFileID -> IO DeletionStatus) -> (VectorStoreID -> CreateVectorStoreFileBatch -> IO VectorStoreFilesBatchObject) -> (VectorStoreID -> VectorStoreFileBatchID -> IO VectorStoreFilesBatchObject) -> (VectorStoreID -> VectorStoreFileBatchID -> IO VectorStoreFilesBatchObject) -> (VectorStoreID -> VectorStoreFileBatchID -> Maybe Natural -> Maybe Order -> Maybe Text -> Maybe Text -> Maybe Status -> IO (Vector VectorStoreFilesBatchObject)) -> Methods
+ OpenAI.V1: Methods :: (CreateSpeech -> IO ByteString) -> (CreateTranscription -> IO TranscriptionObject) -> (CreateTranslation -> IO TranslationObject) -> (CreateChatCompletion -> IO ChatCompletionObject) -> (CreateChatKitSession -> IO ChatSessionObject) -> (SessionID -> IO CancelChatSession) -> (Maybe Text -> Maybe Text -> Maybe Natural -> Maybe Order -> Maybe Text -> IO (Vector ThreadObject)) -> (ThreadID -> IO ThreadObject) -> (ThreadID -> IO DeletionStatus) -> (ThreadID -> Maybe Text -> Maybe Text -> Maybe Natural -> Maybe Order -> IO (Vector ThreadItem)) -> (CreateChatCompletion -> (Either Text Value -> IO ()) -> IO ()) -> (CreateChatCompletion -> (Either Text ChatCompletionStreamEvent -> IO ()) -> IO ()) -> (CreateResponse -> IO ResponseObject) -> (CreateResponse -> (Either Text Value -> IO ()) -> IO ()) -> (CreateEmbeddings -> IO (Vector EmbeddingObject)) -> (CreateResponse -> (Either Text ResponseStreamEvent -> IO ()) -> IO ()) -> (CreateFineTuningJob -> IO JobObject) -> (Maybe Text -> Maybe Natural -> IO (Vector JobObject)) -> (FineTuningJobID -> Maybe Text -> Maybe Natural -> IO (Vector EventObject)) -> (FineTuningJobID -> Maybe Text -> Maybe Natural -> IO (Vector CheckpointObject)) -> (FineTuningJobID -> IO JobObject) -> (FineTuningJobID -> IO JobObject) -> (CreateBatch -> IO BatchObject) -> (BatchID -> IO BatchObject) -> (BatchID -> IO BatchObject) -> (Maybe Text -> Maybe Natural -> IO (Vector BatchObject)) -> (UploadFile -> IO FileObject) -> (Maybe Purpose -> Maybe Natural -> Maybe Order -> Maybe Text -> IO (Vector FileObject)) -> (FileID -> IO FileObject) -> (FileID -> IO DeletionStatus) -> (FileID -> IO ByteString) -> (CreateUpload -> IO (UploadObject (Maybe Void))) -> (UploadID -> AddUploadPart -> IO PartObject) -> (UploadID -> CompleteUpload -> IO (UploadObject FileObject)) -> (UploadID -> IO (UploadObject (Maybe Void))) -> (CreateImage -> IO (Vector ImageObject)) -> (CreateImageEdit -> IO (Vector ImageObject)) -> (CreateImageVariation -> IO (Vector ImageObject)) -> IO (Vector ModelObject) -> (Model -> IO ModelObject) -> (Model -> IO DeletionStatus) -> (CreateModeration -> IO Moderation) -> (CreateAssistant -> IO AssistantObject) -> (Maybe Natural -> Maybe Order -> Maybe Text -> Maybe Text -> IO (Vector AssistantObject)) -> (AssistantID -> IO AssistantObject) -> (AssistantID -> ModifyAssistant -> IO AssistantObject) -> (AssistantID -> IO DeletionStatus) -> (Thread -> IO ThreadObject) -> (ThreadID -> IO ThreadObject) -> (ThreadID -> ModifyThread -> IO ThreadObject) -> (ThreadID -> IO DeletionStatus) -> (ThreadID -> Message -> IO MessageObject) -> (ThreadID -> IO (Vector MessageObject)) -> (ThreadID -> MessageID -> IO MessageObject) -> (ThreadID -> MessageID -> ModifyMessage -> IO MessageObject) -> (ThreadID -> MessageID -> IO DeletionStatus) -> (ThreadID -> Maybe Text -> CreateRun -> IO RunObject) -> (CreateThreadAndRun -> IO RunObject) -> (ThreadID -> Maybe Natural -> Maybe Order -> Maybe Text -> Maybe Text -> IO (Vector RunObject)) -> (ThreadID -> RunID -> IO RunObject) -> (ThreadID -> RunID -> ModifyRun -> IO RunObject) -> (ThreadID -> RunID -> SubmitToolOutputsToRun -> IO RunObject) -> (ThreadID -> RunID -> IO RunObject) -> (ThreadID -> RunID -> Maybe Natural -> Maybe Order -> Maybe Text -> Maybe Text -> Maybe Text -> IO (Vector RunStepObject)) -> (ThreadID -> RunID -> StepID -> Maybe Text -> IO RunStepObject) -> (Text -> IO ResponseObject) -> (Text -> IO ResponseObject) -> (Text -> IO (Vector InputItem)) -> (CreateVectorStore -> IO VectorStoreObject) -> (Maybe Natural -> Maybe Order -> Maybe Text -> Maybe Text -> IO (Vector VectorStoreObject)) -> (VectorStoreID -> IO VectorStoreObject) -> (VectorStoreID -> ModifyVectorStore -> IO VectorStoreObject) -> (VectorStoreID -> IO DeletionStatus) -> (VectorStoreID -> CreateVectorStoreFile -> IO VectorStoreFileObject) -> (VectorStoreID -> Maybe Natural -> Maybe Order -> Maybe Text -> Maybe Text -> Maybe Status -> IO (Vector VectorStoreFileObject)) -> (VectorStoreID -> VectorStoreFileID -> IO VectorStoreFileObject) -> (VectorStoreID -> VectorStoreFileID -> IO DeletionStatus) -> (VectorStoreID -> CreateVectorStoreFileBatch -> IO VectorStoreFilesBatchObject) -> (VectorStoreID -> VectorStoreFileBatchID -> IO VectorStoreFilesBatchObject) -> (VectorStoreID -> VectorStoreFileBatchID -> IO VectorStoreFilesBatchObject) -> (VectorStoreID -> VectorStoreFileBatchID -> Maybe Natural -> Maybe Order -> Maybe Text -> Maybe Text -> Maybe Status -> IO (Vector VectorStoreFilesBatchObject)) -> Methods
- OpenAI.V1: type API = Header' '[Required, Strict] "Authorization" Text :> Header' '[Optional, Strict] "OpenAI-Organization" Text :> Header' '[Optional, Strict] "OpenAI-Project" Text :> "v1" :> API :<|> API :<|> API :<|> API :<|> API :<|> API :<|> API :<|> API :<|> API :<|> API :<|> API :<|> API :<|> API :<|> API :<|> API :<|> API :<|> API :<|> API :<|> API
+ OpenAI.V1: type API = Header' '[Required, Strict] "Authorization" Text :> Header' '[Optional, Strict] "OpenAI-Organization" Text :> Header' '[Optional, Strict] "OpenAI-Project" Text :> "v1" :> API :<|> API :<|> API :<|> API :<|> API :<|> API :<|> API :<|> API :<|> API :<|> API :<|> API :<|> API :<|> API :<|> API :<|> API :<|> API :<|> API :<|> API :<|> API :<|> API
- OpenAI.V1.Chat.Completions: CreateChatCompletion :: Vector (Message (Vector Content)) -> Model -> Maybe Bool -> Maybe (Map Text Text) -> Maybe Double -> Maybe (Map Word Int) -> Maybe Bool -> Maybe Word -> Maybe Natural -> Maybe Natural -> Maybe (Vector Modality) -> Maybe Prediction -> Maybe AudioParameters -> Maybe Double -> Maybe ReasoningEffort -> Maybe ResponseFormat -> Maybe Integer -> Maybe (AutoOr ServiceTier) -> Maybe (Vector Text) -> Maybe Bool -> Maybe Double -> Maybe Double -> Maybe (Vector Tool) -> Maybe ToolChoice -> Maybe Bool -> Maybe Text -> Maybe WebSearchOptions -> CreateChatCompletion
+ OpenAI.V1.Chat.Completions: CreateChatCompletion :: Vector (Message (Vector Content)) -> Model -> Maybe Bool -> Maybe (Map Text Text) -> Maybe Double -> Maybe (Map Word Int) -> Maybe Bool -> Maybe Word -> Maybe Natural -> Maybe Natural -> Maybe (Vector Modality) -> Maybe Prediction -> Maybe AudioParameters -> Maybe Double -> Maybe ReasoningEffort -> Maybe ResponseFormat -> Maybe Integer -> Maybe (AutoOr ServiceTier) -> Maybe (Vector Text) -> Maybe Bool -> Maybe ChatCompletionStreamOptions -> Maybe Double -> Maybe Double -> Maybe (Vector Tool) -> Maybe ToolChoice -> Maybe Bool -> Maybe Text -> Maybe WebSearchOptions -> CreateChatCompletion
- OpenAI.V1.Responses: [name] :: FunctionToolCall -> Text
+ OpenAI.V1.Responses: [name] :: Tool -> Text

Files

CHANGELOG.md view
@@ -1,3 +1,10 @@+2.3.0:++- Add `ChatCompletionStreamOptions` support for including usage in chat completion streams.+- Simplify Responses tool JSON encoding/decoding.+- Add support for `/v1/chatkit/*`.+- Add missing arguments in `makeMethods` in the create chat example.+ 2.2.1:  - [Add Chat Completion Streaming Support](https://github.com/MercuryTechnologies/openai/pull/78)
README.md view
@@ -26,7 +26,7 @@      clientEnv <- getClientEnv "https://api.openai.com" -    let Methods{ createChatCompletion } = makeMethods clientEnv (Text.pack key)+    let Methods{ createChatCompletion } = makeMethods clientEnv (Text.pack key) Nothing Nothing      text <- Text.IO.getLine 
examples/responses-stream-example/Main.hs view
@@ -5,6 +5,8 @@  module Main where +import OpenAI.V1.Responses (Tool(..))+import OpenAI.V1.Tool (CodeInterpreterContainer(..)) import System.Environment (getEnv) import System.IO (hFlush, hPutStrLn, stderr, stdout) @@ -12,7 +14,6 @@ import qualified Data.Text.IO as TIO import qualified OpenAI.V1 as V1 import qualified OpenAI.V1.Responses as Responses-import qualified OpenAI.V1.Tool as Tool  main :: IO () main = do@@ -56,7 +57,7 @@                     , Responses.status = Nothing                     }                 ])-            , Responses.tools = Just [ Tool.Tool_Web_Search ]+            , Responses.tools = Just [ Tool_Web_Search ]             }      createResponseStreamTyped reqSearch onEvent@@ -74,7 +75,13 @@                     , Responses.status = Nothing                     }                 ])-            , Responses.tools = Just [ Tool.codeInterpreterAuto ]+            , Responses.tools = Just+                [ Responses.Tool_Code_Interpreter+                    { container = Just CodeInterpreterContainer_Auto+                        { file_ids = Nothing+                        }+                    }+                ]             }      createResponseStreamTyped reqCode onEvent
examples/responses-tool-call-example/Main.hs view
@@ -6,19 +6,20 @@ module Main where  import Data.Aeson (FromJSON (..), (.:), (.=), withObject)-import qualified Data.Aeson as Aeson-import qualified Data.ByteString.Lazy as LBS import Data.Foldable (toList) import Data.Text (Text)+import OpenAI.V1 (Methods (..))+import OpenAI.V1.Responses (Tool(..))+import System.Environment (getEnv)++import qualified Data.Aeson as Aeson+import qualified Data.ByteString.Lazy as LBS import qualified Data.Text as Text import qualified Data.Text.Encoding as Text.Encoding import qualified Data.Text.IO as TextIO import qualified Data.Vector as Vector-import OpenAI.V1 (Methods (..)) import qualified OpenAI.V1 as V1 import qualified OpenAI.V1.Responses as Responses-import OpenAI.V1.Tool (Function (..), Tool (..))-import System.Environment (getEnv)  -- | Simple JSON payload for parsing function arguments newtype HoroscopeArgs = HoroscopeArgs { sign :: Text }@@ -34,25 +35,24 @@ horoscopeTool :: Tool horoscopeTool =     Tool_Function-        Function-            { description = Just "Get today's horoscope for an astrological sign."-            , name = "get_horoscope"-            , parameters =-                Just . Aeson.object $-                    [ "type" .= ("object" :: Text)-                    , "properties"-                        .= Aeson.object-                            [ "sign"-                                .= Aeson.object-                                    [ "type" .= ("string" :: Text)-                                    , "description" .= ("An astrological sign like Taurus or Aquarius" :: Text)-                                    ]-                            ]-                    , "required" .= (["sign"] :: [Text])-                    , "additionalProperties" .= False-                    ]-            , strict = Just True-            }+        { description = Just "Get today's horoscope for an astrological sign."+        , name = "get_horoscope"+        , parameters =+            Just . Aeson.object $+                [ "type" .= ("object" :: Text)+                , "properties"+                    .= Aeson.object+                        [ "sign"+                            .= Aeson.object+                                [ "type" .= ("string" :: Text)+                                , "description" .= ("An astrological sign like Taurus or Aquarius" :: Text)+                                ]+                        ]+                , "required" .= (["sign"] :: [Text])+                , "additionalProperties" .= False+                ]+        , strict = Just True+        }  main :: IO () main = do
openai.cabal view
@@ -1,6 +1,6 @@ cabal-version:      2.4 name:               openai-version:            2.2.1+version:            2.3.0 synopsis:           Servant bindings to OpenAI description:        This package provides comprehensive and type-safe bindings                     to OpenAI, providing both a Servant interface and@@ -53,6 +53,7 @@                         OpenAI.V1.AutoOr                         OpenAI.V1.Batches                         OpenAI.V1.Chat.Completions+                        OpenAI.V1.ChatKit                         OpenAI.V1.ChunkingStrategy                         OpenAI.V1.DeletionStatus                         OpenAI.V1.Embeddings
src/OpenAI/Prelude.hs view
@@ -15,6 +15,7 @@     , module Data.Map     , module Data.String     , module Data.Text+    , module Data.Time     , module Data.Time.Clock.POSIX     , module Data.Vector     , module Data.Void@@ -31,6 +32,7 @@ import Data.Map (Map) import Data.String (IsString(..)) import Data.Text (Text)+import Data.Time (NominalDiffTime) import Data.Time.Clock.POSIX (POSIXTime) import Data.Vector (Vector) import Data.Void (Void)
src/OpenAI/V1.hs view
@@ -24,7 +24,7 @@ -- --     clientEnv <- `OpenAI.V1.getClientEnv` \"https://api.openai.com\" -----     let `OpenAI.V1.Methods`{ createChatCompletion } = `OpenAI.V1.makeMethods` clientEnv (Text.`Data.Text.pack` key)+--     let `OpenAI.V1.Methods`{ createChatCompletion } = `OpenAI.V1.makeMethods` clientEnv (Text.`Data.Text.pack` key) Nothing Nothing -- --     text <- Text.IO.`Data.Text.IO.getLine` --@@ -77,6 +77,13 @@  import OpenAI.V1.Assistants     (AssistantID, AssistantObject, CreateAssistant, ModifyAssistant)+import OpenAI.V1.ChatKit+    ( CancelChatSession+    , CreateChatKitSession+    , ChatSessionObject+    , SessionID+    , ThreadItem+    ) import OpenAI.V1.FineTuning.Jobs     ( CheckpointObject     , CreateFineTuningJob@@ -127,6 +134,7 @@ import qualified OpenAI.V1.Audio as Audio import qualified OpenAI.V1.Batches as Batches import qualified OpenAI.V1.Chat.Completions as Chat.Completions+import qualified OpenAI.V1.ChatKit as ChatKit import qualified OpenAI.V1.Embeddings as Embeddings import qualified OpenAI.V1.Files as Files import qualified OpenAI.V1.FineTuning.Jobs as FineTuning.Jobs@@ -180,8 +188,15 @@     (       (     createSpeech             :<|>  createTranscription_             :<|>  createTranslation_-                    )+            )       :<|>  createChatCompletion+      :<|>  (     createChatKitSession+            :<|>  cancelChatSession+            :<|>  _listChatKitThreads+            :<|>  retrieveChatKitThread+            :<|>  deleteChatKitThread+            :<|>  _listChatKitThreadItems+            )       :<|>  (     createResponse             :<|>  retrieveResponse             :<|>  cancelResponse@@ -321,6 +336,8 @@     listVectorStoreFilesInABatch a b c d e f g =         toVector (listVectorStoreFilesInABatch_ a b c d e f g)     listResponseInputItems a = toVector (listResponseInputItems_ a)+    listChatKitThreads a b c d e = toVector (_listChatKitThreads a b c d e)+    listChatKitThreadItems a b c d e = toVector (_listChatKitThreadItems a b c d e)      -- Streaming implementation using http-client and SSE parsing     createResponseStream req onEvent = do@@ -481,6 +498,33 @@     , createTranscription :: CreateTranscription -> IO TranscriptionObject     , createTranslation :: CreateTranslation -> IO TranslationObject     , createChatCompletion :: CreateChatCompletion -> IO ChatCompletionObject+    , createChatKitSession :: CreateChatKitSession -> IO ChatSessionObject+    , cancelChatSession :: SessionID -> IO CancelChatSession+    , listChatKitThreads+        :: Maybe Text+        -- ^ after+        -> Maybe Text+        -- ^ before+        -> Maybe Natural+        -- ^ limit+        -> Maybe Order+        -- ^ order+        -> Maybe Text+        -- ^ user+        -> IO (Vector ChatKit.ThreadObject)+    , retrieveChatKitThread :: ChatKit.ThreadID -> IO ChatKit.ThreadObject+    , deleteChatKitThread :: ChatKit.ThreadID -> IO DeletionStatus+    , listChatKitThreadItems+        :: ChatKit.ThreadID+        -> Maybe Text+        -- ^ after+        -> Maybe Text+        -- ^ before+        -> Maybe Natural+        -- ^ limit+        -> Maybe Order+        -- ^ order+        -> IO (Vector ThreadItem)     , createChatCompletionStream         :: CreateChatCompletion         -> (Either Text Aeson.Value -> IO ())@@ -712,6 +756,7 @@     :>  "v1"     :>  (     Audio.API         :<|>  Chat.Completions.API+        :<|>  ChatKit.API         :<|>  Responses.API         :<|>  Embeddings.API         :<|>  FineTuning.Jobs.API
src/OpenAI/V1/Chat/Completions.hs view
@@ -15,6 +15,9 @@     , ChunkChoice(..)     , Delta(..)     , ChatCompletionStreamEvent+      -- * Stream options+    , ChatCompletionStreamOptions(..)+    , _ChatCompletionStreamOptions       -- * Other types     , InputAudio(..)     , ImageURL(..)@@ -282,6 +285,29 @@     } deriving stock (Generic, Show)       deriving anyclass (FromJSON, ToJSON) +-- | Options for streaming response. Only set this when you set @stream: true@.+data ChatCompletionStreamOptions = ChatCompletionStreamOptions+    { -- | If set, an additional chunk will be streamed before @data: [DONE]@+      -- with total usage in @usage@ and an empty @choices@ array. Other+      -- chunks include @usage: null@. If the stream is interrupted, you may+      -- not receive this final usage chunk.+      include_usage :: Maybe Bool+      -- | When @True@, stream obfuscation is enabled. This adds random+      -- characters to an obfuscation field on delta events to normalize+      -- payload sizes. Obfuscation is included by default; set this to+      -- @False@ to reduce bandwidth overhead when your network links are+      -- trusted.+    , include_obfuscation :: Maybe Bool+    } deriving stock (Generic, Show)+      deriving anyclass (FromJSON, ToJSON)++-- | Default `ChatCompletionStreamOptions`+_ChatCompletionStreamOptions :: ChatCompletionStreamOptions+_ChatCompletionStreamOptions = ChatCompletionStreamOptions+    { include_usage = Nothing+    , include_obfuscation = Nothing+    }+ -- | Request body for @\/v1\/chat\/completions@ data CreateChatCompletion = CreateChatCompletion     { messages :: Vector (Message (Vector Content))@@ -304,6 +330,7 @@     , service_tier :: Maybe (AutoOr ServiceTier)     , stop :: Maybe (Vector Text)     , stream :: Maybe Bool+    , stream_options :: Maybe ChatCompletionStreamOptions     , temperature :: Maybe Double     , top_p :: Maybe Double     , tools :: Maybe (Vector Tool)@@ -340,6 +367,7 @@     , service_tier = Nothing     , stop = Nothing     , stream = Nothing+    , stream_options = Nothing     , temperature = Nothing     , top_p = Nothing     , tools = Nothing
+ src/OpenAI/V1/ChatKit.hs view
@@ -0,0 +1,454 @@+-- | @\/v1\/chatkit@+module OpenAI.V1.ChatKit+    ( -- * Main types+      SessionID(..)+    , ThreadID(..)+    , CreateChatKitSession(..)+    , _CreateChatKitSession+    , ChatSessionObject(..)+    , CancelChatSession(..)+    , ThreadObject(..)+    , ThreadItem(..)+      -- * Other types+    , Workflow(..)+    , ChatKitConfiguration(..)+    , ExpiresAfter(..)+    , RateLimits(..)+    , Tracing(..)+    , AutomaticThreadTitling(..)+    , FileUpload(..)+    , History(..)+    , Scope(..)+    , Attachment(..)+    , UserContent(..)+    , InferenceOptions(..)+    , ToolChoice(..)+    , AssistantContent(..)+    , Annotation(..)+    , FileSource(..)+    , URLSource(..)+    , Task(..)+      -- * Servant+    , API+    ) where++import OpenAI.Prelude+import OpenAI.V1.DeletionStatus (DeletionStatus(..))+import OpenAI.V1.ListOf (ListOf(..))+import OpenAI.V1.Order (Order(..))++-- | Session ID+newtype SessionID = SessionID{ text :: Text }+    deriving newtype (FromJSON, IsString, Show, ToHttpApiData, ToJSON)++-- | Thread ID+newtype ThreadID = ThreadID{ text :: Text }+    deriving newtype (FromJSON, IsString, Show, ToHttpApiData, ToJSON)++-- | Request body for @\/v1\/chatkit\/sessions@+data CreateChatKitSession = CreateChatKitSession+    { user :: Text+    , workflow :: Workflow+    , chatkit_configuration :: Maybe ChatKitConfiguration+    , expires_after :: Maybe ExpiresAfter+    , rate_limits :: Maybe RateLimits+    } deriving stock (Generic, Show)+      deriving anyclass (FromJSON, ToJSON)++-- | Default `CreateChatKitSession`+_CreateChatKitSession :: CreateChatKitSession+_CreateChatKitSession = CreateChatKitSession+    { chatkit_configuration = Nothing+    , expires_after = Nothing+    , rate_limits = Nothing+    }++-- | Workflow that powers the session+data Workflow = Workflow+    { id :: Text+    , state_variables :: Maybe (Map Text Value)+    , tracing :: Maybe Tracing+    , version :: Maybe Text+    } deriving stock (Generic, Show)+      deriving anyclass (FromJSON, ToJSON)++-- | Tracing overrides for the workflow invocation+data Tracing = Tracing+    { enabled :: Maybe Bool+    } deriving stock (Generic, Show)+      deriving anyclass (FromJSON, ToJSON)++-- | Overrides for ChatKit runtime configuration features+data ChatKitConfiguration = ChatKitConfiguration+    { automatic_thread_titling :: Maybe AutomaticThreadTitling+    , file_upload :: Maybe FileUpload+    , history :: Maybe History+    } deriving stock (Generic, Show)+      deriving anyclass (FromJSON, ToJSON)++-- | Configuration for automatic thread titling+data AutomaticThreadTitling = AutomaticThreadTitling+    { enabled :: Maybe Bool+    } deriving stock (Generic, Show)+      deriving anyclass (FromJSON, ToJSON)++-- | Configuration for file upload enablement and limits+data FileUpload = FileUpload+    { enabled :: Maybe Bool+    , max_file_size :: Maybe Natural+    , max_files :: Maybe Natural+    } deriving stock (Generic, Show)+      deriving anyclass (FromJSON, ToJSON)++-- | Configuration for chat history retention+data History = History+    { enabled :: Maybe Bool+    , recent_threads :: Maybe Natural+    } deriving stock (Generic, Show)+      deriving anyclass (FromJSON, ToJSON)++-- | Override for session expiration timing+data ExpiresAfter = Created_At+    { seconds :: NominalDiffTime+    } deriving stock (Generic, Show)++expiresAfterOptions :: Options+expiresAfterOptions =+    aesonOptions+        { sumEncoding =+            TaggedObject+                { tagFieldName = "expires_after", contentsFieldName = "" }++        , tagSingleConstructors = True+        }++instance FromJSON ExpiresAfter where+    parseJSON = genericParseJSON expiresAfterOptions++instance ToJSON ExpiresAfter where+    toJSON = genericToJSON expiresAfterOptions++-- | Override for per-minute request limits+data RateLimits = RateLimits+    { max_requests_per_1_minute :: Maybe Natural+    } deriving stock (Generic, Show)+      deriving anyclass (FromJSON, ToJSON)++-- | A ChatKit session+data ChatSessionObject = ChatSessionObject+    { chatkit_configuration :: ChatKitConfiguration+    , client_secret :: Text+    , expires_at :: POSIXTime+    , id :: SessionID+    , max_requests_per_1_minute :: Natural+    , object :: Text+    , rate_limits :: RateLimits+    , status :: Text+    , user :: Text+    , workflow :: Workflow+    } deriving stock (Generic, Show)+      deriving anyclass (FromJSON, ToJSON)++-- | Response body for @\/v1\/chatkit\/sessions\/{session_id}\/cancel@+data CancelChatSession = CancelChatSession+    { id :: SessionID+    , workflow :: Workflow+    , scope :: Scope+    , max_requests_per_1_minute :: Natural+    , ttl_seconds :: NominalDiffTime+    , status :: Text+    , cancelled_at :: POSIXTime+    } deriving stock (Generic, Show)+      deriving anyclass (FromJSON, ToJSON)++-- | Scope+data Scope = Scope+    { customer_id :: Text+    } deriving stock (Generic, Show)+      deriving anyclass (FromJSON, ToJSON)++-- | A ChatKit thread+data ThreadObject = ThreadObject+    { created_at :: POSIXTime+    , id :: ThreadID+    , object :: Text+    , status :: Status+    , title :: Maybe Text+    , user :: Text+    } deriving stock (Generic, Show)+      deriving anyclass (FromJSON, ToJSON)++-- | Current status for the thread+data Status = Active+    deriving stock (Generic, Show)++statusOptions :: Options+statusOptions =+    aesonOptions+        { sumEncoding =+            TaggedObject{ tagFieldName = "type", contentsFieldName = "" }++        , tagSingleConstructors = True+        }++instance FromJSON Status where+    parseJSON = genericParseJSON statusOptions++instance ToJSON Status where+    toJSON = genericToJSON statusOptions++-- | A thread item+data ThreadItem+    = User_Message+        { attachments :: Vector Attachment+        , content :: Vector UserContent+        , created_at :: POSIXTime+        , id :: Text+        , inference_options :: InferenceOptions+        , object :: Text+        , thread_id :: Text+        }+    | Assistant_Message+        { assistant_content :: Vector AssistantContent+        , created_at :: POSIXTime+        , id :: Text+        , object :: Text+        , thread_id :: Text+        }+    | Widget_Message+        { created_at :: POSIXTime+        , id :: Text+        , object :: Text+        , thread_id :: Text+        , widget :: Text+        }+    | Client_Tool_Call+        { arguments :: Text+        , call_id :: Text+        , created_at :: POSIXTime+        , id :: Text+        , name :: Text+        , object :: Text+        , output :: Text+        , status :: Text+        , thread_id :: Text+        }+    | Task_Item+        { created_at :: POSIXTime+        , heading :: Text+        , id :: Text+        , object :: Text+        , summary :: Text+        , task_type+        , thread_id :: Text+        }+    | Task_Group+        { created_at :: POSIXTime+        , id :: Text+        , object :: Text+        , tasks :: Vector Task+        , thread_id :: Text+        } deriving stock (Generic, Show)++threadItemOptions :: Options+threadItemOptions =+    aesonOptions+        { sumEncoding =+            TaggedObject{ tagFieldName = "type", contentsFieldName = "" }++        , tagSingleConstructors = True++        , fieldLabelModifier = stripPrefix "assistant_"+        }++instance FromJSON ThreadItem where+    parseJSON = genericParseJSON threadItemOptions++instance ToJSON ThreadItem where+    toJSON = genericToJSON threadItemOptions++-- | Attachment associated with the user message+data Attachment = Attachment+    { id :: Text+    , mime_type :: Text+    , name :: Text+    , preview_url :: Text+    } deriving stock (Generic, Show)++instance FromJSON Attachment where+    parseJSON = genericParseJSON aesonOptions++instance ToJSON Attachment where+    toJSON = genericToJSON aesonOptions++-- | Content element supplied by the user+data UserContent+    = Input_Text{ text :: Text }+    | Quoted_Text{ text :: Text }+    deriving stock (Generic, Show)++userContentOptions :: Options+userContentOptions =+    aesonOptions+        { sumEncoding =+            TaggedObject{ tagFieldName = "type", contentsFieldName = "" }++        , tagSingleConstructors = True+        }++instance FromJSON UserContent where+    parseJSON = genericParseJSON userContentOptions++instance ToJSON UserContent where+    toJSON = genericToJSON userContentOptions++-- | Inference overrides applies to the message+data InferenceOptions = InferenceOptions+    { model :: Text+    , tool_choice :: ToolChoice+    } deriving stock (Generic, Show)+      deriving anyclass (FromJSON, ToJSON)++-- | Preferred tool to invoke+data ToolChoice = ToolChoice+    { id :: Text+    } deriving stock (Generic, Show)+      deriving anyclass (FromJSON, ToJSON)++-- | Assistant response segment+data AssistantContent = Output_Text+    { annotations :: Vector Annotation+    , text :: Text+    } deriving stock (Generic, Show)++assistantContentOptions :: Options+assistantContentOptions =+    aesonOptions+        { sumEncoding =+            TaggedObject{ tagFieldName = "type", contentsFieldName = "" }++        , tagSingleConstructors = True+        }++instance FromJSON AssistantContent where+    parseJSON = genericParseJSON assistantContentOptions++instance ToJSON AssistantContent where+    toJSON = genericToJSON assistantContentOptions++-- | Annotation+data Annotation+    = File+        { source :: FileSource+        }+    | Url+        { url_source :: URLSource+        }+    deriving stock (Generic, Show)++annotationOptions :: Options+annotationOptions =+    aesonOptions+        { sumEncoding =+            TaggedObject{ tagFieldName = "type", contentsFieldName = "" }++        , tagSingleConstructors = True++        , fieldLabelModifier = stripPrefix "url_"+        }++instance FromJSON Annotation where+    parseJSON = genericParseJSON annotationOptions++instance ToJSON Annotation where+    toJSON = genericToJSON annotationOptions++-- | File attachment+data FileSource = FileSource_File+    { filename :: Text+    } deriving stock (Generic, Show)++fileSourceOptions :: Options+fileSourceOptions =+    aesonOptions+        { sumEncoding =+            TaggedObject{ tagFieldName = "type", contentsFieldName = "" }++        , constructorTagModifier = stripPrefix "FileSource_"++        , tagSingleConstructors = True+        }++instance FromJSON FileSource where+    parseJSON = genericParseJSON fileSourceOptions++instance ToJSON FileSource where+    toJSON = genericToJSON fileSourceOptions++-- | URL+data URLSource = URLSource_Url+    { url :: Text+    } deriving stock (Generic, Show)++urlSourceOptions :: Options+urlSourceOptions =+    aesonOptions+        { sumEncoding =+            TaggedObject{ tagFieldName = "type", contentsFieldName = "" }++        , constructorTagModifier = stripPrefix "URLSource_"++        , tagSingleConstructors = True+        }++instance FromJSON URLSource where+    parseJSON = genericParseJSON urlSourceOptions++instance ToJSON URLSource where+    toJSON = genericToJSON urlSourceOptions++-- | Task+data Task = Task+    { heading :: Text+    , summary :: Text+    } deriving stock (Generic, Show)+      deriving anyclass (FromJSON, ToJSON)++-- | Servant API+type API =+          "chatkit"+    :>    (     (   "sessions"+                :>  ReqBody '[JSON] CreateChatKitSession+                :>  Post '[JSON] ChatSessionObject+                )+          :<|>  (   "sessions"+                :>  Capture "session_id" SessionID+                :>  "cancel"+                :>  Post '[JSON] CancelChatSession+                )+          :<|>  (   "threads"+                :>  QueryParam "after" Text+                :>  QueryParam "before" Text+                :>  QueryParam "limit" Natural+                :>  QueryParam "order" Order+                :>  QueryParam "user" Text+                :>  Get '[JSON] (ListOf ThreadObject)+                )+          :<|>  (   "threads"+                :>  Capture "thread_id" ThreadID+                :>  Get '[JSON] ThreadObject+                )+          :<|>  (   "threads"+                :>  Capture "thread_id" ThreadID+                :>  Delete '[JSON] DeletionStatus+                )+          :<|>  (   "threads"+                :>  Capture "thread_id" ThreadID+                :>  "items"+                :>  QueryParam "after" Text+                :>  QueryParam "before" Text+                :>  QueryParam "limit" Natural+                :>  QueryParam "order" Order+                :>  Get '[JSON] (ListOf ThreadItem)+                )+          )
src/OpenAI/V1/Responses.hs view
@@ -31,6 +31,7 @@     , ReasoningEffort(..)     , ServiceTier     , ResponseStreamEvent(..)+    , Tool(..)     , ResponseObject(..)     , ResponseUsage(..)     , InputTokensDetails(..)@@ -43,25 +44,13 @@     ) where  import Data.Aeson (Object)-import qualified Data.Aeson as Aeson import OpenAI.Prelude hiding (Input(..))--- no TH; inline JSON instances for payloads import OpenAI.V1.AutoOr (AutoOr(..)) import OpenAI.V1.ListOf (ListOf) import OpenAI.V1.Models (Model)-import qualified Data.Aeson.Key as Key-import qualified Data.Aeson.KeyMap as KeyMap-import qualified Data.Vector as Vector+ import OpenAI.V1.Tool-    ( Tool-    , ToolChoice-    , toolChoiceAutoText-    , toolChoiceNoneText-    , toolChoiceRequiredText-    , toolChoiceToResponsesValue-    , toolToResponsesValue-    , unflattenToolValue-    )+    (CodeInterpreterContainer, RankingOptions, ToolChoice(..))  -- | Status constants for function call outputs statusIncomplete, statusCompleted :: Text@@ -233,50 +222,6 @@ instance ToJSON InputItem where     toJSON = genericToJSON inputItemOptions -keyTools :: Key.Key-keyTools = Key.fromText "tools"--keyToolChoice :: Key.Key-keyToolChoice = Key.fromText "tool_choice"--flattenResponseToolFields-    :: Maybe (Vector Tool)-    -> Maybe ToolChoice-    -> KeyMap.KeyMap Value-    -> KeyMap.KeyMap Value-flattenResponseToolFields mTools mChoice o =-    let oWithTools = case mTools of-            Nothing -> o-            Just ts -> KeyMap.insert keyTools (Aeson.Array (Vector.map toolToResponsesValue ts)) o-        oWithChoice = case mChoice of-            Nothing -> oWithTools-            Just choice -> KeyMap.insert keyToolChoice (toolChoiceToResponsesValue choice) oWithTools-    in oWithChoice--unflattenResponseToolFields :: KeyMap.KeyMap Value -> KeyMap.KeyMap Value-unflattenResponseToolFields = adjustChoice . adjustTools-  where-    adjustTools = adjustKey keyTools (mapArrayValues unflattenToolValue)-    adjustChoice = adjustKey keyToolChoice unflattenChoice--    unflattenChoice (String s)-        | s `elem` ([toolChoiceNoneText, toolChoiceAutoText, toolChoiceRequiredText] :: [Text]) = String s-    unflattenChoice other = unflattenToolValue other--mapArrayValues :: (Value -> Value) -> Value -> Value-mapArrayValues f (Aeson.Array arr) = Aeson.Array (Vector.map f arr)-mapArrayValues _ other = other--adjustKey-    :: Key.Key-    -> (Value -> Value)-    -> KeyMap.KeyMap Value-    -> KeyMap.KeyMap Value-adjustKey key f obj =-    case KeyMap.lookup key obj of-        Nothing -> obj-        Just v -> KeyMap.insert key (f v) obj- -- | Output content from the model data OutputContent     = Output_Text@@ -798,7 +743,6 @@ instance ToJSON ResponseStreamEvent where     toJSON = genericToJSON responseStreamEventOptions - -- | Usage statistics for the response request data ResponseUsage = ResponseUsage     { input_tokens :: Natural@@ -819,6 +763,40 @@     } deriving stock (Generic, Show)       deriving anyclass (FromJSON, ToJSON) +-- | A tool enabled on the assistant+data Tool+    = Tool_Code_Interpreter+        { container :: Maybe CodeInterpreterContainer+        }+    | Tool_File_Search+        { max_num_results :: Maybe Natural+        , ranking_options :: Maybe RankingOptions+        }+    | Tool_Function+        { description :: Maybe Text+        , name :: Text+        , parameters :: Maybe Value+        , strict :: Maybe Bool+        }+    | Tool_Web_Search+    deriving stock (Generic, Show)++toolOptions :: Options+toolOptions = aesonOptions+    { sumEncoding =+        TaggedObject{ tagFieldName = "type", contentsFieldName = "" }++    , tagSingleConstructors = True++    , constructorTagModifier = stripPrefix "Tool_"+    }++instance FromJSON Tool where+    parseJSON = genericParseJSON toolOptions++instance ToJSON Tool where+    toJSON = genericToJSON toolOptions+ -- | Response object data ResponseObject = ResponseObject     { id :: Text@@ -844,19 +822,7 @@     , user :: Maybe Text     , metadata :: Maybe (Map Text Text)     } deriving stock (Generic, Show)--instance FromJSON ResponseObject where-    parseJSON (Aeson.Object o) =-        genericParseJSON aesonOptions (Aeson.Object (unflattenResponseToolFields o))-    parseJSON other = genericParseJSON aesonOptions other--instance ToJSON ResponseObject where-    toJSON response@ResponseObject{ tools = mTools, tool_choice = mChoice } =-        case genericToJSON aesonOptions response of-            Aeson.Object o ->-                Aeson.Object-                    (flattenResponseToolFields mTools mChoice o)-            other -> other+      deriving anyclass (FromJSON, ToJSON)  -- | Request body for \/v1/responses data CreateResponse = CreateResponse@@ -876,19 +842,7 @@     , tools :: Maybe (Vector Tool)     , tool_choice :: Maybe ToolChoice     } deriving stock (Generic, Show)--instance FromJSON CreateResponse where-    parseJSON (Aeson.Object o) =-        genericParseJSON aesonOptions (Aeson.Object (unflattenResponseToolFields o))-    parseJSON other = genericParseJSON aesonOptions other--instance ToJSON CreateResponse where-    toJSON request@CreateResponse{ tools = mTools, tool_choice = mChoice } =-        case genericToJSON aesonOptions request of-            Aeson.Object o ->-                Aeson.Object-                    (flattenResponseToolFields mTools mChoice o)-            other -> other+      deriving anyclass (FromJSON, ToJSON)  -- | Default CreateResponse _CreateResponse :: CreateResponse
src/OpenAI/V1/Tool.hs view
@@ -7,39 +7,18 @@     , Function(..)     , ToolChoice(..)     , CodeInterpreterContainer(..)-      -- * Constants-    , toolChoiceNoneText-    , toolChoiceAutoText-    , toolChoiceRequiredText       -- * Helpers     , codeInterpreter     , codeInterpreterAuto     , codeInterpreterWithFiles-    , toolToResponsesValue-    , parseResponsesToolValue-    , toolChoiceToResponsesValue-    , parseResponsesToolChoiceValue-    , flattenToolValue-    , unflattenToolValue     ) where  import Data.Aeson ((.:), (.:?), (.=))-import Data.Aeson.Types (Parser) import OpenAI.Prelude+ import qualified Data.Aeson as Aeson-import qualified Data.Aeson.Key as Key-import qualified Data.Aeson.KeyMap as KeyMap-import qualified Data.HashSet as HashSet-import Data.HashSet (HashSet)-import Data.List (partition) import qualified Data.Vector as V --- | Tool choice string constants-toolChoiceNoneText, toolChoiceAutoText, toolChoiceRequiredText :: Text-toolChoiceNoneText = "none"-toolChoiceAutoText = "auto"-toolChoiceRequiredText = "required"- -- | The ranking options for the file search data RankingOptions = RankingOptions     { ranker :: Maybe Text@@ -86,60 +65,6 @@  instance ToJSON Tool where     toJSON = genericToJSON toolOptions--toolToResponsesValue :: Tool -> Value-toolToResponsesValue = flattenToolValue . toJSON--parseResponsesToolValue :: Value -> Parser Tool-parseResponsesToolValue = parseJSON . unflattenToolValue--toolChoiceToResponsesValue :: ToolChoice -> Value-toolChoiceToResponsesValue ToolChoiceNone = String toolChoiceNoneText-toolChoiceToResponsesValue ToolChoiceAuto = String toolChoiceAutoText-toolChoiceToResponsesValue ToolChoiceRequired = String toolChoiceRequiredText-toolChoiceToResponsesValue (ToolChoiceTool tool) = toolToResponsesValue tool--parseResponsesToolChoiceValue :: Value -> Parser ToolChoice-parseResponsesToolChoiceValue (String s)-    | s == toolChoiceNoneText = pure ToolChoiceNone-    | s == toolChoiceAutoText = pure ToolChoiceAuto-    | s == toolChoiceRequiredText = pure ToolChoiceRequired-parseResponsesToolChoiceValue other = ToolChoiceTool <$> parseResponsesToolValue other--keyFunction, keyType :: Key.Key-keyFunction = Key.fromText "function"-keyType = Key.fromText "type"--functionFieldKeys :: HashSet Key.Key-functionFieldKeys = HashSet.fromList $ Key.fromText <$> ["description", "name", "parameters", "strict"]--isFunctionField :: Key.Key -> Bool-isFunctionField = (`HashSet.member` functionFieldKeys)--partitionFunctionFields-    :: KeyMap.KeyMap Value-    -> (KeyMap.KeyMap Value, KeyMap.KeyMap Value)-partitionFunctionFields obj =-    let (fnPairs, restPairs) = partition (isFunctionField . fst) (KeyMap.toList obj)-    in (KeyMap.fromList fnPairs, KeyMap.fromList restPairs)--flattenToolValue :: Value -> Value-flattenToolValue value@(Aeson.Object o) =-    maybe value flattenFunction (KeyMap.lookup keyFunction o)-  where-    flattenFunction (Aeson.Object fnFields) =-        Aeson.Object (KeyMap.delete keyFunction o <> fnFields)-    flattenFunction _ = value-flattenToolValue value = value--unflattenToolValue :: Value -> Value-unflattenToolValue value@(Aeson.Object o)-    | KeyMap.lookup keyType o == Just (String "function")-    , not (KeyMap.member keyFunction o) =-        let (fnFields, rest) = partitionFunctionFields o-        in Aeson.Object (KeyMap.insert keyFunction (Aeson.Object fnFields) rest)-    | otherwise = value-unflattenToolValue value = value  -- | Controls which (if any) tool is called by the model data ToolChoice
tasty/Main.hs view
@@ -23,7 +23,7 @@ import OpenAI.V1.Message (Message(..)) import OpenAI.V1.Moderations (CreateModeration(..)) import OpenAI.V1.Threads.Messages (MessageObject(..), ModifyMessage(..))-import OpenAI.V1.Tool (Tool(..), ToolChoice(..))+import OpenAI.V1.Tool (CodeInterpreterContainer(..), Tool(..), ToolChoice(..)) import OpenAI.V1.ToolCall (ToolCall(..)) import Prelude hiding (id) @@ -179,6 +179,7 @@                   service_tier = Nothing,                   stop = Nothing,                   stream = Nothing,+                  stream_options = Nothing,                   temperature = Nothing,                   top_p = Nothing,                   tools = Nothing,@@ -220,6 +221,7 @@                   service_tier = Nothing,                   stop = Nothing,                   stream = Nothing,+                  stream_options = Nothing,                   temperature = Nothing,                   top_p = Nothing,                   tools = Nothing,@@ -282,6 +284,7 @@                   service_tier = Just Auto,                   stop = Just [">>>"],                   stream = Nothing,+                  stream_options = Nothing,                   temperature = Just 1,                   top_p = Just 1,                   tools =@@ -334,6 +337,7 @@                           service_tier = Nothing,                           stop = Nothing,                           stream = Nothing,+                          stream_options = Nothing,                           temperature = Nothing,                           top_p = Nothing,                           tools = Nothing,@@ -1007,7 +1011,13 @@                     Responses.metadata = Nothing,                     Responses.temperature = Nothing,                     Responses.top_p = Nothing,-                    Responses.tools = Just [Tool.codeInterpreterAuto],+                    Responses.tools = Just+                      [ Responses.Tool_Code_Interpreter+                          { container = Just CodeInterpreterContainer_Auto+                              { file_ids = Nothing+                              }+                          }+                      ],                     Responses.tool_choice = Just Tool.ToolChoiceRequired                   }