openai 1.0.1 → 1.1.0
raw patch · 35 files changed
+348/−94 lines, 35 filesPVP ok
version bump matches the API change (PVP)
API changes (from Hackage documentation)
- OpenAI.V1.Usage: instance Data.Aeson.Types.FromJSON.FromJSON (OpenAI.V1.Usage.Usage (GHC.Maybe.Maybe GHC.Base.Void) (GHC.Maybe.Maybe GHC.Base.Void))
+ OpenAI.V1.Assistants: instance Data.Aeson.Types.FromJSON.FromJSON OpenAI.V1.Assistants.CreateAssistant
+ OpenAI.V1.Assistants: instance Data.Aeson.Types.FromJSON.FromJSON OpenAI.V1.Assistants.ModifyAssistant
+ OpenAI.V1.Assistants: instance Data.Aeson.Types.ToJSON.ToJSON OpenAI.V1.Assistants.AssistantObject
+ OpenAI.V1.Audio.Speech: instance Data.Aeson.Types.FromJSON.FromJSON OpenAI.V1.Audio.Speech.CreateSpeech
+ OpenAI.V1.Audio.Speech: instance Data.Aeson.Types.FromJSON.FromJSON OpenAI.V1.Audio.Speech.Format
+ OpenAI.V1.Audio.Speech: instance Data.Aeson.Types.FromJSON.FromJSON OpenAI.V1.Audio.Speech.Voice
+ OpenAI.V1.Audio.Transcriptions: instance Data.Aeson.Types.FromJSON.FromJSON OpenAI.V1.Audio.Transcriptions.CreateTranscription
+ OpenAI.V1.Audio.Transcriptions: instance Data.Aeson.Types.ToJSON.ToJSON OpenAI.V1.Audio.Transcriptions.CreateTranscription
+ OpenAI.V1.Audio.Transcriptions: instance Data.Aeson.Types.ToJSON.ToJSON OpenAI.V1.Audio.Transcriptions.Segment
+ OpenAI.V1.Audio.Transcriptions: instance Data.Aeson.Types.ToJSON.ToJSON OpenAI.V1.Audio.Transcriptions.TranscriptionObject
+ OpenAI.V1.Audio.Translations: instance Data.Aeson.Types.FromJSON.FromJSON OpenAI.V1.Audio.Translations.CreateTranslation
+ OpenAI.V1.Audio.Translations: instance Data.Aeson.Types.ToJSON.ToJSON OpenAI.V1.Audio.Translations.CreateTranslation
+ OpenAI.V1.Audio.Translations: instance Data.Aeson.Types.ToJSON.ToJSON OpenAI.V1.Audio.Translations.TranslationObject
+ OpenAI.V1.Batches: instance Data.Aeson.Types.FromJSON.FromJSON OpenAI.V1.Batches.CreateBatch
+ OpenAI.V1.Batches: instance Data.Aeson.Types.ToJSON.ToJSON OpenAI.V1.Batches.BatchObject
+ OpenAI.V1.Batches: instance Data.Aeson.Types.ToJSON.ToJSON OpenAI.V1.Batches.Counts
+ OpenAI.V1.Batches: instance Data.Aeson.Types.ToJSON.ToJSON OpenAI.V1.Batches.Status
+ OpenAI.V1.Chat.Completions: High :: ReasoningEffort
+ OpenAI.V1.Chat.Completions: Low :: ReasoningEffort
+ OpenAI.V1.Chat.Completions: Medium :: ReasoningEffort
+ OpenAI.V1.Chat.Completions: [$sel:reasoning_effort:ChatCompletionObject] :: ChatCompletionObject -> Maybe ReasoningEffort
+ OpenAI.V1.Chat.Completions: [$sel:reasoning_effort:CreateChatCompletion] :: CreateChatCompletion -> Maybe ReasoningEffort
+ OpenAI.V1.Chat.Completions: data ReasoningEffort
+ OpenAI.V1.Chat.Completions: instance Data.Aeson.Types.FromJSON.FromJSON OpenAI.V1.Chat.Completions.AudioFormat
+ OpenAI.V1.Chat.Completions: instance Data.Aeson.Types.FromJSON.FromJSON OpenAI.V1.Chat.Completions.AudioParameters
+ OpenAI.V1.Chat.Completions: instance Data.Aeson.Types.FromJSON.FromJSON OpenAI.V1.Chat.Completions.Content
+ OpenAI.V1.Chat.Completions: instance Data.Aeson.Types.FromJSON.FromJSON OpenAI.V1.Chat.Completions.CreateChatCompletion
+ OpenAI.V1.Chat.Completions: instance Data.Aeson.Types.FromJSON.FromJSON OpenAI.V1.Chat.Completions.ImageURL
+ OpenAI.V1.Chat.Completions: instance Data.Aeson.Types.FromJSON.FromJSON OpenAI.V1.Chat.Completions.InputAudio
+ OpenAI.V1.Chat.Completions: instance Data.Aeson.Types.FromJSON.FromJSON OpenAI.V1.Chat.Completions.Modality
+ OpenAI.V1.Chat.Completions: instance Data.Aeson.Types.FromJSON.FromJSON OpenAI.V1.Chat.Completions.Prediction
+ OpenAI.V1.Chat.Completions: instance Data.Aeson.Types.FromJSON.FromJSON OpenAI.V1.Chat.Completions.ReasoningEffort
+ OpenAI.V1.Chat.Completions: instance Data.Aeson.Types.FromJSON.FromJSON OpenAI.V1.Chat.Completions.Voice
+ OpenAI.V1.Chat.Completions: instance Data.Aeson.Types.ToJSON.ToJSON OpenAI.V1.Chat.Completions.ChatCompletionObject
+ OpenAI.V1.Chat.Completions: instance Data.Aeson.Types.ToJSON.ToJSON OpenAI.V1.Chat.Completions.Choice
+ OpenAI.V1.Chat.Completions: instance Data.Aeson.Types.ToJSON.ToJSON OpenAI.V1.Chat.Completions.FinishReason
+ OpenAI.V1.Chat.Completions: instance Data.Aeson.Types.ToJSON.ToJSON OpenAI.V1.Chat.Completions.LogProbs
+ OpenAI.V1.Chat.Completions: instance Data.Aeson.Types.ToJSON.ToJSON OpenAI.V1.Chat.Completions.ReasoningEffort
+ OpenAI.V1.Chat.Completions: instance Data.Aeson.Types.ToJSON.ToJSON OpenAI.V1.Chat.Completions.Token
+ OpenAI.V1.Chat.Completions: instance GHC.Generics.Generic OpenAI.V1.Chat.Completions.ReasoningEffort
+ OpenAI.V1.Chat.Completions: instance GHC.Show.Show OpenAI.V1.Chat.Completions.ReasoningEffort
+ OpenAI.V1.DeletionStatus: instance Data.Aeson.Types.ToJSON.ToJSON OpenAI.V1.DeletionStatus.DeletionStatus
+ OpenAI.V1.Embeddings: instance Data.Aeson.Types.FromJSON.FromJSON OpenAI.V1.Embeddings.CreateEmbeddings
+ OpenAI.V1.Embeddings: instance Data.Aeson.Types.FromJSON.FromJSON OpenAI.V1.Embeddings.EncodingFormat
+ OpenAI.V1.Embeddings: instance Data.Aeson.Types.ToJSON.ToJSON OpenAI.V1.Embeddings.EmbeddingObject
+ OpenAI.V1.Error: instance Data.Aeson.Types.ToJSON.ToJSON OpenAI.V1.Error.Error
+ OpenAI.V1.Files: instance Data.Aeson.Types.ToJSON.ToJSON OpenAI.V1.Files.FileObject
+ OpenAI.V1.FineTuning.Jobs: instance Data.Aeson.Types.FromJSON.FromJSON OpenAI.V1.FineTuning.Jobs.CreateFineTuningJob
+ OpenAI.V1.FineTuning.Jobs: instance Data.Aeson.Types.ToJSON.ToJSON OpenAI.V1.FineTuning.Jobs.CheckpointObject
+ OpenAI.V1.FineTuning.Jobs: instance Data.Aeson.Types.ToJSON.ToJSON OpenAI.V1.FineTuning.Jobs.EventObject
+ OpenAI.V1.FineTuning.Jobs: instance Data.Aeson.Types.ToJSON.ToJSON OpenAI.V1.FineTuning.Jobs.JobObject
+ OpenAI.V1.FineTuning.Jobs: instance Data.Aeson.Types.ToJSON.ToJSON OpenAI.V1.FineTuning.Jobs.Level
+ OpenAI.V1.FineTuning.Jobs: instance Data.Aeson.Types.ToJSON.ToJSON OpenAI.V1.FineTuning.Jobs.Metrics
+ OpenAI.V1.FineTuning.Jobs: instance Data.Aeson.Types.ToJSON.ToJSON OpenAI.V1.FineTuning.Jobs.Status
+ OpenAI.V1.Images.Edits: instance Data.Aeson.Types.FromJSON.FromJSON OpenAI.V1.Images.Edits.CreateImageEdit
+ OpenAI.V1.Images.Edits: instance Data.Aeson.Types.ToJSON.ToJSON OpenAI.V1.Images.Edits.CreateImageEdit
+ OpenAI.V1.Images.Generations: instance Data.Aeson.Types.FromJSON.FromJSON OpenAI.V1.Images.Generations.CreateImage
+ OpenAI.V1.Images.Generations: instance Data.Aeson.Types.FromJSON.FromJSON OpenAI.V1.Images.Generations.Quality
+ OpenAI.V1.Images.Generations: instance Data.Aeson.Types.FromJSON.FromJSON OpenAI.V1.Images.Generations.Style
+ OpenAI.V1.Images.Image: instance Data.Aeson.Types.ToJSON.ToJSON OpenAI.V1.Images.Image.ImageObject
+ OpenAI.V1.Images.ResponseFormat: instance Data.Aeson.Types.FromJSON.FromJSON OpenAI.V1.Images.ResponseFormat.ResponseFormat
+ OpenAI.V1.Images.Variations: instance Data.Aeson.Types.FromJSON.FromJSON OpenAI.V1.Images.Variations.CreateImageVariation
+ OpenAI.V1.Images.Variations: instance Data.Aeson.Types.ToJSON.ToJSON OpenAI.V1.Images.Variations.CreateImageVariation
+ OpenAI.V1.ListOf: instance Data.Aeson.Types.ToJSON.ToJSON a => Data.Aeson.Types.ToJSON.ToJSON (OpenAI.V1.ListOf.ListOf a)
+ OpenAI.V1.Message: instance Data.Aeson.Types.FromJSON.FromJSON OpenAI.V1.Message.Message
+ OpenAI.V1.Moderations: instance Data.Aeson.Types.FromJSON.FromJSON OpenAI.V1.Moderations.CreateModeration
+ OpenAI.V1.Moderations: instance Data.Aeson.Types.ToJSON.ToJSON OpenAI.V1.Moderations.InputType
+ OpenAI.V1.Moderations: instance Data.Aeson.Types.ToJSON.ToJSON OpenAI.V1.Moderations.Moderation
+ OpenAI.V1.Moderations: instance Data.Aeson.Types.ToJSON.ToJSON OpenAI.V1.Moderations.Result
+ OpenAI.V1.Order: instance Data.Aeson.Types.FromJSON.FromJSON OpenAI.V1.Order.Order
+ OpenAI.V1.Order: instance Data.Aeson.Types.ToJSON.ToJSON OpenAI.V1.Order.Order
+ OpenAI.V1.Order: instance GHC.Generics.Generic OpenAI.V1.Order.Order
+ OpenAI.V1.Order: instance GHC.Show.Show OpenAI.V1.Order.Order
+ OpenAI.V1.Threads: instance Data.Aeson.Types.FromJSON.FromJSON OpenAI.V1.Threads.ModifyThread
+ OpenAI.V1.Threads: instance Data.Aeson.Types.FromJSON.FromJSON OpenAI.V1.Threads.Thread
+ OpenAI.V1.Threads: instance Data.Aeson.Types.ToJSON.ToJSON OpenAI.V1.Threads.ThreadObject
+ OpenAI.V1.Threads.Messages: instance Data.Aeson.Types.FromJSON.FromJSON OpenAI.V1.Threads.Messages.ModifyMessage
+ OpenAI.V1.Threads.Messages: instance Data.Aeson.Types.ToJSON.ToJSON OpenAI.V1.Threads.Messages.Annotation
+ OpenAI.V1.Threads.Messages: instance Data.Aeson.Types.ToJSON.ToJSON OpenAI.V1.Threads.Messages.File
+ OpenAI.V1.Threads.Messages: instance Data.Aeson.Types.ToJSON.ToJSON OpenAI.V1.Threads.Messages.IncompleteDetails
+ OpenAI.V1.Threads.Messages: instance Data.Aeson.Types.ToJSON.ToJSON OpenAI.V1.Threads.Messages.MessageObject
+ OpenAI.V1.Threads.Messages: instance Data.Aeson.Types.ToJSON.ToJSON OpenAI.V1.Threads.Messages.Status
+ OpenAI.V1.Threads.Messages: instance Data.Aeson.Types.ToJSON.ToJSON OpenAI.V1.Threads.Messages.TextObject
+ OpenAI.V1.Threads.Runs: instance Data.Aeson.Types.FromJSON.FromJSON OpenAI.V1.Threads.Runs.CreateRun
+ OpenAI.V1.Threads.Runs: instance Data.Aeson.Types.FromJSON.FromJSON OpenAI.V1.Threads.Runs.CreateThreadAndRun
+ OpenAI.V1.Threads.Runs: instance Data.Aeson.Types.FromJSON.FromJSON OpenAI.V1.Threads.Runs.ModifyRun
+ OpenAI.V1.Threads.Runs: instance Data.Aeson.Types.FromJSON.FromJSON OpenAI.V1.Threads.Runs.SubmitToolOutputsToRun
+ OpenAI.V1.Threads.Runs: instance Data.Aeson.Types.FromJSON.FromJSON OpenAI.V1.Threads.Runs.ToolOutput
+ OpenAI.V1.Threads.Runs: instance Data.Aeson.Types.ToJSON.ToJSON OpenAI.V1.Threads.Runs.IncompleteDetails
+ OpenAI.V1.Threads.Runs: instance Data.Aeson.Types.ToJSON.ToJSON OpenAI.V1.Threads.Runs.RequiredAction
+ OpenAI.V1.Threads.Runs: instance Data.Aeson.Types.ToJSON.ToJSON OpenAI.V1.Threads.Runs.RunObject
+ OpenAI.V1.Threads.Runs: instance Data.Aeson.Types.ToJSON.ToJSON OpenAI.V1.Threads.Runs.Status
+ OpenAI.V1.Threads.Runs: instance Data.Aeson.Types.ToJSON.ToJSON OpenAI.V1.Threads.Runs.SubmitToolOutputs
+ OpenAI.V1.Threads.Runs.Steps: instance Data.Aeson.Types.ToJSON.ToJSON OpenAI.V1.Threads.Runs.Steps.CodeInterpreter
+ OpenAI.V1.Threads.Runs.Steps: instance Data.Aeson.Types.ToJSON.ToJSON OpenAI.V1.Threads.Runs.Steps.Content
+ OpenAI.V1.Threads.Runs.Steps: instance Data.Aeson.Types.ToJSON.ToJSON OpenAI.V1.Threads.Runs.Steps.FileSearch
+ OpenAI.V1.Threads.Runs.Steps: instance Data.Aeson.Types.ToJSON.ToJSON OpenAI.V1.Threads.Runs.Steps.Function
+ OpenAI.V1.Threads.Runs.Steps: instance Data.Aeson.Types.ToJSON.ToJSON OpenAI.V1.Threads.Runs.Steps.Image
+ OpenAI.V1.Threads.Runs.Steps: instance Data.Aeson.Types.ToJSON.ToJSON OpenAI.V1.Threads.Runs.Steps.Output
+ OpenAI.V1.Threads.Runs.Steps: instance Data.Aeson.Types.ToJSON.ToJSON OpenAI.V1.Threads.Runs.Steps.RankingOptions
+ OpenAI.V1.Threads.Runs.Steps: instance Data.Aeson.Types.ToJSON.ToJSON OpenAI.V1.Threads.Runs.Steps.Result
+ OpenAI.V1.Threads.Runs.Steps: instance Data.Aeson.Types.ToJSON.ToJSON OpenAI.V1.Threads.Runs.Steps.RunStepObject
+ OpenAI.V1.Threads.Runs.Steps: instance Data.Aeson.Types.ToJSON.ToJSON OpenAI.V1.Threads.Runs.Steps.Status
+ OpenAI.V1.Threads.Runs.Steps: instance Data.Aeson.Types.ToJSON.ToJSON OpenAI.V1.Threads.Runs.Steps.StepDetails
+ OpenAI.V1.Threads.Runs.Steps: instance Data.Aeson.Types.ToJSON.ToJSON OpenAI.V1.Threads.Runs.Steps.ToolCall
+ OpenAI.V1.Uploads: instance Data.Aeson.Types.FromJSON.FromJSON OpenAI.V1.Uploads.AddUploadPart
+ OpenAI.V1.Uploads: instance Data.Aeson.Types.FromJSON.FromJSON OpenAI.V1.Uploads.CompleteUpload
+ OpenAI.V1.Uploads: instance Data.Aeson.Types.FromJSON.FromJSON OpenAI.V1.Uploads.CreateUpload
+ OpenAI.V1.Uploads: instance Data.Aeson.Types.ToJSON.ToJSON (OpenAI.V1.Uploads.UploadObject (GHC.Maybe.Maybe GHC.Base.Void))
+ OpenAI.V1.Uploads: instance Data.Aeson.Types.ToJSON.ToJSON (OpenAI.V1.Uploads.UploadObject OpenAI.V1.Files.FileObject)
+ OpenAI.V1.Uploads: instance Data.Aeson.Types.ToJSON.ToJSON OpenAI.V1.Uploads.AddUploadPart
+ OpenAI.V1.Uploads: instance Data.Aeson.Types.ToJSON.ToJSON OpenAI.V1.Uploads.PartObject
+ OpenAI.V1.Uploads: instance Data.Aeson.Types.ToJSON.ToJSON OpenAI.V1.Uploads.Status
+ OpenAI.V1.Uploads: instance GHC.Generics.Generic OpenAI.V1.Uploads.AddUploadPart
+ OpenAI.V1.Uploads: instance GHC.Show.Show OpenAI.V1.Uploads.AddUploadPart
+ OpenAI.V1.Usage: instance Data.Aeson.Types.FromJSON.FromJSON (OpenAI.V1.Usage.Usage (GHC.Maybe.Maybe OpenAI.V1.Usage.CompletionTokensDetails) (GHC.Maybe.Maybe OpenAI.V1.Usage.PromptTokensDetails))
+ OpenAI.V1.Usage: instance Data.Aeson.Types.ToJSON.ToJSON (OpenAI.V1.Usage.Usage (GHC.Maybe.Maybe OpenAI.V1.Usage.CompletionTokensDetails) (GHC.Maybe.Maybe OpenAI.V1.Usage.PromptTokensDetails))
+ OpenAI.V1.Usage: instance Data.Aeson.Types.ToJSON.ToJSON (OpenAI.V1.Usage.Usage OpenAI.V1.Usage.CompletionTokensDetails OpenAI.V1.Usage.PromptTokensDetails)
+ OpenAI.V1.Usage: instance Data.Aeson.Types.ToJSON.ToJSON OpenAI.V1.Usage.CompletionTokensDetails
+ OpenAI.V1.Usage: instance Data.Aeson.Types.ToJSON.ToJSON OpenAI.V1.Usage.PromptTokensDetails
+ OpenAI.V1.VectorStores: instance Data.Aeson.Types.FromJSON.FromJSON OpenAI.V1.VectorStores.CreateVectorStore
+ OpenAI.V1.VectorStores: instance Data.Aeson.Types.FromJSON.FromJSON OpenAI.V1.VectorStores.ModifyVectorStore
+ OpenAI.V1.VectorStores: instance Data.Aeson.Types.ToJSON.ToJSON OpenAI.V1.VectorStores.Status
+ OpenAI.V1.VectorStores: instance Data.Aeson.Types.ToJSON.ToJSON OpenAI.V1.VectorStores.VectorStoreObject
+ OpenAI.V1.VectorStores.FileBatches: instance Data.Aeson.Types.FromJSON.FromJSON OpenAI.V1.VectorStores.FileBatches.CreateVectorStoreFileBatch
+ OpenAI.V1.VectorStores.FileBatches: instance Data.Aeson.Types.ToJSON.ToJSON OpenAI.V1.VectorStores.FileBatches.VectorStoreFilesBatchObject
+ OpenAI.V1.VectorStores.FileCounts: instance Data.Aeson.Types.ToJSON.ToJSON OpenAI.V1.VectorStores.FileCounts.FileCounts
+ OpenAI.V1.VectorStores.Files: instance Data.Aeson.Types.FromJSON.FromJSON OpenAI.V1.VectorStores.Files.CreateVectorStoreFile
+ OpenAI.V1.VectorStores.Files: instance Data.Aeson.Types.ToJSON.ToJSON OpenAI.V1.VectorStores.Files.VectorStoreFileObject
+ OpenAI.V1.VectorStores.Status: instance Data.Aeson.Types.ToJSON.ToJSON OpenAI.V1.VectorStores.Status.Status
- OpenAI.V1.Chat.Completions: ChatCompletionObject :: Text -> Vector Choice -> POSIXTime -> Model -> Maybe ServiceTier -> Text -> Text -> Usage CompletionTokensDetails PromptTokensDetails -> ChatCompletionObject
+ OpenAI.V1.Chat.Completions: ChatCompletionObject :: Text -> Vector Choice -> POSIXTime -> Model -> Maybe ReasoningEffort -> Maybe ServiceTier -> Maybe Text -> Text -> Usage CompletionTokensDetails PromptTokensDetails -> ChatCompletionObject
- 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 ResponseFormat -> Maybe Integer -> Maybe (AutoOr ServiceTier) -> Maybe (Vector Text) -> Maybe Double -> Maybe Double -> Maybe (Vector Tool) -> Maybe ToolChoice -> Maybe Bool -> Maybe Text -> 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 Double -> Maybe Double -> Maybe (Vector Tool) -> Maybe ToolChoice -> Maybe Bool -> Maybe Text -> CreateChatCompletion
- OpenAI.V1.Chat.Completions: [$sel:system_fingerprint:ChatCompletionObject] :: ChatCompletionObject -> Text
+ OpenAI.V1.Chat.Completions: [$sel:system_fingerprint:ChatCompletionObject] :: ChatCompletionObject -> Maybe Text
- OpenAI.V1.Threads.Runs: RunObject :: RunID -> Text -> POSIXTime -> ThreadID -> AssistantID -> Status -> Maybe RequiredAction -> Maybe Error -> Maybe POSIXTime -> Maybe POSIXTime -> Maybe POSIXTime -> Maybe POSIXTime -> Maybe POSIXTime -> Maybe IncompleteDetails -> Model -> Maybe Text -> Vector Tool -> Map Text Text -> Maybe (Usage (Maybe Void) (Maybe Void)) -> Maybe Double -> Maybe Double -> Maybe Natural -> Maybe Natural -> Maybe TruncationStrategy -> ToolChoice -> Bool -> AutoOr ResponseFormat -> RunObject
+ OpenAI.V1.Threads.Runs: RunObject :: RunID -> Text -> POSIXTime -> ThreadID -> AssistantID -> Status -> Maybe RequiredAction -> Maybe Error -> Maybe POSIXTime -> Maybe POSIXTime -> Maybe POSIXTime -> Maybe POSIXTime -> Maybe POSIXTime -> Maybe IncompleteDetails -> Model -> Maybe Text -> Vector Tool -> Map Text Text -> Maybe (Usage (Maybe CompletionTokensDetails) (Maybe PromptTokensDetails)) -> Maybe Double -> Maybe Double -> Maybe Natural -> Maybe Natural -> Maybe TruncationStrategy -> ToolChoice -> Bool -> AutoOr ResponseFormat -> RunObject
- OpenAI.V1.Threads.Runs: [$sel:usage:RunObject] :: RunObject -> Maybe (Usage (Maybe Void) (Maybe Void))
+ OpenAI.V1.Threads.Runs: [$sel:usage:RunObject] :: RunObject -> Maybe (Usage (Maybe CompletionTokensDetails) (Maybe PromptTokensDetails))
- OpenAI.V1.Usage: CompletionTokensDetails :: Natural -> Natural -> Natural -> Natural -> CompletionTokensDetails
+ OpenAI.V1.Usage: CompletionTokensDetails :: Maybe Natural -> Maybe Natural -> Maybe Natural -> Maybe Natural -> CompletionTokensDetails
- OpenAI.V1.Usage: PromptTokensDetails :: Natural -> Natural -> PromptTokensDetails
+ OpenAI.V1.Usage: PromptTokensDetails :: Maybe Natural -> Maybe Natural -> PromptTokensDetails
- OpenAI.V1.Usage: Usage :: Natural -> Natural -> Natural -> completionTokensDetails -> promptTokensDetails -> Usage completionTokensDetails promptTokensDetails
+ OpenAI.V1.Usage: Usage :: Natural -> Natural -> Natural -> Maybe completionTokensDetails -> Maybe promptTokensDetails -> Usage completionTokensDetails promptTokensDetails
- OpenAI.V1.Usage: [$sel:accepted_prediction_tokens:CompletionTokensDetails] :: CompletionTokensDetails -> Natural
+ OpenAI.V1.Usage: [$sel:accepted_prediction_tokens:CompletionTokensDetails] :: CompletionTokensDetails -> Maybe Natural
- OpenAI.V1.Usage: [$sel:audio_tokens:CompletionTokensDetails] :: CompletionTokensDetails -> Natural
+ OpenAI.V1.Usage: [$sel:audio_tokens:CompletionTokensDetails] :: CompletionTokensDetails -> Maybe Natural
- OpenAI.V1.Usage: [$sel:audio_tokens:PromptTokensDetails] :: PromptTokensDetails -> Natural
+ OpenAI.V1.Usage: [$sel:audio_tokens:PromptTokensDetails] :: PromptTokensDetails -> Maybe Natural
- OpenAI.V1.Usage: [$sel:cached_tokens:PromptTokensDetails] :: PromptTokensDetails -> Natural
+ OpenAI.V1.Usage: [$sel:cached_tokens:PromptTokensDetails] :: PromptTokensDetails -> Maybe Natural
- OpenAI.V1.Usage: [$sel:completion_tokens_details:Usage] :: Usage completionTokensDetails promptTokensDetails -> completionTokensDetails
+ OpenAI.V1.Usage: [$sel:completion_tokens_details:Usage] :: Usage completionTokensDetails promptTokensDetails -> Maybe completionTokensDetails
- OpenAI.V1.Usage: [$sel:prompt_tokens_details:Usage] :: Usage completionTokensDetails promptTokensDetails -> promptTokensDetails
+ OpenAI.V1.Usage: [$sel:prompt_tokens_details:Usage] :: Usage completionTokensDetails promptTokensDetails -> Maybe promptTokensDetails
- OpenAI.V1.Usage: [$sel:reasoning_tokens:CompletionTokensDetails] :: CompletionTokensDetails -> Natural
+ OpenAI.V1.Usage: [$sel:reasoning_tokens:CompletionTokensDetails] :: CompletionTokensDetails -> Maybe Natural
- OpenAI.V1.Usage: [$sel:rejected_prediction_tokens:CompletionTokensDetails] :: CompletionTokensDetails -> Natural
+ OpenAI.V1.Usage: [$sel:rejected_prediction_tokens:CompletionTokensDetails] :: CompletionTokensDetails -> Maybe Natural
Files
- CHANGELOG.md +11/−0
- openai.cabal +1/−1
- src/OpenAI/V1/Assistants.hs +7/−1
- src/OpenAI/V1/Audio/Speech.hs +7/−1
- src/OpenAI/V1/Audio/Transcriptions.hs +3/−2
- src/OpenAI/V1/Audio/Translations.hs +2/−1
- src/OpenAI/V1/Batches.hs +8/−2
- src/OpenAI/V1/Chat/Completions.hs +67/−15
- src/OpenAI/V1/ChunkingStrategy.hs +2/−4
- src/OpenAI/V1/DeletionStatus.hs +1/−1
- src/OpenAI/V1/Embeddings.hs +5/−2
- src/OpenAI/V1/Error.hs +1/−1
- src/OpenAI/V1/Files.hs +1/−1
- src/OpenAI/V1/FineTuning/Jobs.hs +12/−6
- src/OpenAI/V1/Images/Edits.hs +1/−0
- src/OpenAI/V1/Images/Generations.hs +9/−0
- src/OpenAI/V1/Images/Image.hs +1/−1
- src/OpenAI/V1/Images/ResponseFormat.hs +3/−0
- src/OpenAI/V1/Images/Variations.hs +1/−0
- src/OpenAI/V1/ListOf.hs +3/−0
- src/OpenAI/V1/Message.hs +9/−2
- src/OpenAI/V1/Moderations.hs +6/−3
- src/OpenAI/V1/Order.hs +7/−0
- src/OpenAI/V1/Threads.hs +5/−2
- src/OpenAI/V1/Threads/Messages.hs +19/−6
- src/OpenAI/V1/Threads/Runs.hs +29/−7
- src/OpenAI/V1/Threads/Runs/Steps.hs +40/−13
- src/OpenAI/V1/Uploads.hs +21/−2
- src/OpenAI/V1/Usage.hs +13/−11
- src/OpenAI/V1/VectorStores.hs +6/−3
- src/OpenAI/V1/VectorStores/FileBatches.hs +2/−2
- src/OpenAI/V1/VectorStores/FileCounts.hs +1/−1
- src/OpenAI/V1/VectorStores/Files.hs +2/−2
- src/OpenAI/V1/VectorStores/Status.hs +3/−0
- tasty/Main.hs +39/−1
CHANGELOG.md view
@@ -1,3 +1,14 @@+1.1.0:++- BREAKING CHANGE: Fix details representations for various types [[#44](https://github.com/MercuryTechnologies/openai/pull/44)] [[#45](https://github.com/MercuryTechnologies/openai/pull/45)] [[#50](https://github.com/MercuryTechnologies/openai/pull/50)] [[#51](https://github.com/MercuryTechnologies/openai/pull/51)]++ A few details-related fields were fixed to match the behavior of the OpenAI+ API.++- Add `FromJSON`/`ToJSON` instances for all types [[#42](https://github.com/MercuryTechnologies/openai/pull/42)] [[#47](https://github.com/MercuryTechnologies/openai/pull/47)]++- [Add support for `reasoning_effort` parameter in chat completions](https://github.com/MercuryTechnologies/openai/pull/48)+ 1.0.1: - Include `README`
openai.cabal view
@@ -1,6 +1,6 @@ cabal-version: 2.4 name: openai-version: 1.0.1+version: 1.1.0 synopsis: Servant bindings to OpenAI description: This package provides comprehensive and type-safe bindings to OpenAI, providing both a Servant interface and
src/OpenAI/V1/Assistants.hs view
@@ -49,6 +49,9 @@ , response_format :: Maybe (AutoOr ResponseFormat) } deriving stock (Generic, Show) +instance FromJSON CreateAssistant where+ parseJSON = genericParseJSON aesonOptions+ instance ToJSON CreateAssistant where toJSON = genericToJSON aesonOptions @@ -80,6 +83,9 @@ , response_format :: Maybe (AutoOr ResponseFormat) } deriving stock (Generic, Show) +instance FromJSON ModifyAssistant where+ parseJSON = genericParseJSON aesonOptions+ instance ToJSON ModifyAssistant where toJSON = genericToJSON aesonOptions @@ -113,7 +119,7 @@ , top_p :: Maybe Double , response_format :: AutoOr ResponseFormat } deriving stock (Generic, Show)- deriving anyclass (FromJSON)+ deriving anyclass (FromJSON, ToJSON) -- | Servant API type API =
src/OpenAI/V1/Audio/Speech.hs view
@@ -21,6 +21,9 @@ data Voice = Alloy | Echo | Fable | Onyx | Nova | Shimmer deriving stock (Bounded, Enum, Generic, Show) +instance FromJSON Voice where+ parseJSON = genericParseJSON aesonOptions+ instance ToJSON Voice where toJSON = genericToJSON aesonOptions @@ -28,6 +31,9 @@ data Format = MP3 | Opus | AAC | FLAC | WAV | PCM deriving stock (Bounded, Enum, Generic, Show) +instance FromJSON Format where+ parseJSON = genericParseJSON aesonOptions+ instance ToJSON Format where toJSON = genericToJSON aesonOptions @@ -39,7 +45,7 @@ , response_format :: Maybe Format , speed :: Maybe Double } deriving stock (Generic, Show)- deriving anyclass (ToJSON)+ deriving anyclass (FromJSON, ToJSON) -- | Default `CreateSpeech` _CreateSpeech :: CreateSpeech
src/OpenAI/V1/Audio/Transcriptions.hs view
@@ -26,6 +26,7 @@ , prompt :: Maybe Text , temperature :: Maybe Double } deriving stock (Generic, Show)+ deriving anyclass (FromJSON, ToJSON) instance ToMultipart Tmp CreateTranscription where toMultipart CreateTranscription{ model = Model model, ..} =@@ -67,7 +68,7 @@ , compression_ratio :: Double , no_speech_prob :: Double } deriving stock (Generic, Show)- deriving anyclass (FromJSON)+ deriving anyclass (FromJSON, ToJSON) -- | Represents a verbose json transcription response returned by model, based -- on the provided input.@@ -77,7 +78,7 @@ , text :: Text , segments :: Vector Segment } deriving stock (Generic, Show)- deriving anyclass (FromJSON)+ deriving anyclass (FromJSON, ToJSON) -- | Servant API type API =
src/OpenAI/V1/Audio/Translations.hs view
@@ -22,6 +22,7 @@ , prompt :: Maybe Text , temperature :: Maybe Double } deriving stock (Generic, Show)+ deriving anyclass (FromJSON, ToJSON) instance ToMultipart Tmp CreateTranslation where toMultipart CreateTranslation{ model = Model model, ..} = MultipartData{..}@@ -51,7 +52,7 @@ data TranslationObject = TranslationObject { text :: Text } deriving stock (Generic, Show)- deriving anyclass (FromJSON)+ deriving anyclass (FromJSON, ToJSON) -- | Servant API type API =
src/OpenAI/V1/Batches.hs view
@@ -28,7 +28,7 @@ , completion_window :: Text , metadata :: Maybe (Map Text Text) } deriving stock (Generic, Show)- deriving anyclass (ToJSON)+ deriving anyclass (FromJSON, ToJSON) -- | Default `CreateBatch` _CreateBatch :: CreateBatch@@ -51,13 +51,16 @@ instance FromJSON Status where parseJSON = genericParseJSON aesonOptions +instance ToJSON Status where+ toJSON = genericToJSON aesonOptions+ -- | The request counts for different statuses within the batch. data Counts = Counts { total :: Natural , completed :: Natural , failed :: Natural } deriving stock (Generic, Show)- deriving anyclass (FromJSON)+ deriving anyclass (FromJSON, ToJSON) -- | The batch object data BatchObject = BatchObject@@ -85,6 +88,9 @@ instance FromJSON BatchObject where parseJSON = genericParseJSON aesonOptions++instance ToJSON BatchObject where+ toJSON = genericToJSON aesonOptions -- | Servant API type API =
src/OpenAI/V1/Chat/Completions.hs view
@@ -21,6 +21,7 @@ , AudioParameters(..) , ResponseFormat(..) , ServiceTier(..)+ , ReasoningEffort(..) , FinishReason(..) , Token(..) , LogProbs(..)@@ -41,13 +42,16 @@ data InputAudio = InputAudio{ data_ :: Text, format :: AudioFormat } deriving stock (Generic, Show) +instance FromJSON InputAudio where+ parseJSON = genericParseJSON aesonOptions+ instance ToJSON InputAudio where toJSON = genericToJSON aesonOptions -- | Image content part data ImageURL = ImageURL{ url :: Text, detail :: Maybe (AutoOr Text) } deriving stock (Generic, Show)- deriving anyclass (ToJSON)+ deriving anyclass (FromJSON, ToJSON) -- | A content part data Content@@ -59,14 +63,21 @@ instance IsString Content where fromString string = Text{ text = fromString string } -instance ToJSON Content where- toJSON = genericToJSON aesonOptions+contentOptions :: Options+contentOptions =+ aesonOptions { sumEncoding = TaggedObject{ tagFieldName = "type", contentsFieldName = "" } , tagSingleConstructors = True } +instance FromJSON Content where+ parseJSON = genericParseJSON contentOptions++instance ToJSON Content where+ toJSON = genericToJSON contentOptions+ -- | Data about a previous audio response from the model. -- [Learn more](https://platform.openai.com/docs/guides/audio) data AudioData = AudioData{ id :: Text }@@ -131,10 +142,17 @@ data Modality = Modality_Text | Modality_Audio deriving stock (Generic, Show) -instance ToJSON Modality where- toJSON = genericToJSON aesonOptions+modalityOptions :: Options+modalityOptions =+ aesonOptions { constructorTagModifier = stripPrefix "Modality_" } +instance FromJSON Modality where+ parseJSON = genericParseJSON modalityOptions++instance ToJSON Modality where+ toJSON = genericToJSON modalityOptions+ -- | Configuration for a -- [Predicted Output](https://platform.openai.com/docs/guides/predicted-outputs), -- which can greatly improve response times when large parts of the model@@ -143,18 +161,28 @@ data Prediction = Content{ content :: Text } deriving stock (Generic, Show) -instance ToJSON Prediction where- toJSON = genericToJSON aesonOptions+predictionOptions :: Options+predictionOptions =+ aesonOptions { sumEncoding = TaggedObject{ tagFieldName = "type", contentsFieldName = "" } , tagSingleConstructors = True } +instance FromJSON Prediction where+ parseJSON = genericParseJSON predictionOptions++instance ToJSON Prediction where+ toJSON = genericToJSON predictionOptions+ -- | The voice the model uses to respond data Voice = Ash | Ballad | Coral | Sage | Verse deriving stock (Generic, Show) +instance FromJSON Voice where+ parseJSON = genericParseJSON aesonOptions+ instance ToJSON Voice where toJSON = genericToJSON aesonOptions @@ -162,6 +190,9 @@ data AudioFormat = WAV | MP3 | FLAC | Opus | PCM16 deriving stock (Generic, Show) +instance FromJSON AudioFormat where+ parseJSON = genericParseJSON aesonOptions+ instance ToJSON AudioFormat where toJSON = genericToJSON aesonOptions @@ -170,16 +201,28 @@ { voice :: Voice , format :: AudioFormat } deriving stock (Generic, Show)- deriving anyclass (ToJSON)+ deriving anyclass (FromJSON, ToJSON) -- | Specifies the latency tier to use for processing the request data ServiceTier = Default deriving stock (Generic, Show) +serviceOptions :: Options+serviceOptions = aesonOptions{ tagSingleConstructors = True }+ instance FromJSON ServiceTier where- parseJSON = genericParseJSON aesonOptions{ tagSingleConstructors = True }+ parseJSON = genericParseJSON serviceOptions instance ToJSON ServiceTier where+ toJSON = genericToJSON serviceOptions++data ReasoningEffort = Low | Medium | High+ deriving stock (Generic, Show)++instance FromJSON ReasoningEffort where+ parseJSON = genericParseJSON aesonOptions++instance ToJSON ReasoningEffort where toJSON = genericToJSON aesonOptions -- | Request body for @\/v1\/chat\/completions@@@ -198,6 +241,7 @@ , prediction :: Maybe Prediction , audio :: Maybe AudioParameters , presence_penalty :: Maybe Double+ , reasoning_effort :: Maybe ReasoningEffort , response_format :: Maybe ResponseFormat , seed :: Maybe Integer , service_tier :: Maybe (AutoOr ServiceTier)@@ -210,6 +254,9 @@ , user :: Maybe Text } deriving stock (Generic, Show) +instance FromJSON CreateChatCompletion where+ parseJSON = genericParseJSON aesonOptions+ instance ToJSON CreateChatCompletion where toJSON = genericToJSON aesonOptions @@ -228,6 +275,7 @@ , prediction = Nothing , audio = Nothing , presence_penalty = Nothing+ , reasoning_effort = Nothing , response_format = Nothing , seed = Nothing , service_tier = Nothing@@ -249,8 +297,11 @@ deriving stock (Generic, Show) instance FromJSON FinishReason where- parseJSON = genericParseJSON messageOptions+ parseJSON = genericParseJSON aesonOptions +instance ToJSON FinishReason where+ toJSON = genericToJSON aesonOptions+ -- | Message tokens with log probability information data Token = Token { token :: Text@@ -258,14 +309,14 @@ , bytes :: Maybe (Vector Word8) , top_logprobs :: Maybe (Vector Token) } deriving stock (Generic, Show)- deriving anyclass (FromJSON)+ deriving anyclass (FromJSON, ToJSON) -- | Log probability information for the choice data LogProbs = LogProbs { content :: Maybe (Vector Token) , refusal :: Maybe (Vector Token) } deriving stock (Generic, Show)- deriving anyclass (FromJSON)+ deriving anyclass (FromJSON, ToJSON) -- | A chat completion choice data Choice = Choice@@ -274,7 +325,7 @@ , message :: Message Text , logprobs :: Maybe LogProbs } deriving stock (Generic, Show)- deriving anyclass (FromJSON)+ deriving anyclass (FromJSON, ToJSON) -- | ChatCompletion body data ChatCompletionObject = ChatCompletionObject@@ -282,12 +333,13 @@ , choices :: Vector Choice , created :: POSIXTime , model :: Model+ , reasoning_effort :: Maybe ReasoningEffort , service_tier :: Maybe ServiceTier- , system_fingerprint :: Text+ , system_fingerprint :: Maybe Text , object :: Text , usage :: Usage CompletionTokensDetails PromptTokensDetails } deriving stock (Generic, Show)- deriving anyclass (FromJSON)+ deriving anyclass (FromJSON, ToJSON) -- | Servant API type API =
src/OpenAI/V1/ChunkingStrategy.hs view
@@ -30,10 +30,8 @@ , constructorTagModifier = stripPrefix "ChunkingStrategy_" } -instance ToJSON ChunkingStrategy where- toJSON = genericToJSON chunkingStrategyOptions- instance FromJSON ChunkingStrategy where parseJSON = genericParseJSON chunkingStrategyOptions -+instance ToJSON ChunkingStrategy where+ toJSON = genericToJSON chunkingStrategyOptions
src/OpenAI/V1/DeletionStatus.hs view
@@ -12,4 +12,4 @@ , object :: Text , deleted :: Bool } deriving stock (Generic, Show)- deriving anyclass (FromJSON)+ deriving anyclass (FromJSON, ToJSON)
src/OpenAI/V1/Embeddings.hs view
@@ -18,6 +18,9 @@ data EncodingFormat = Float | Base64 deriving stock (Generic, Show) +instance FromJSON EncodingFormat where+ parseJSON = genericParseJSON aesonOptions+ instance ToJSON EncodingFormat where toJSON = genericToJSON aesonOptions @@ -29,7 +32,7 @@ , dimensions :: Maybe Natural , user :: Maybe Text } deriving stock (Generic, Show)- deriving anyclass (ToJSON)+ deriving anyclass (FromJSON, ToJSON) -- | Default `CreateEmbeddings` _CreateEmbeddings :: CreateEmbeddings@@ -45,7 +48,7 @@ , embedding :: Vector Double , object :: Text } deriving stock (Generic, Show)- deriving anyclass (FromJSON)+ deriving anyclass (FromJSON, ToJSON) -- | Servant API type API =
src/OpenAI/V1/Error.hs view
@@ -17,4 +17,4 @@ , param :: Maybe Text , line :: Maybe Natural } deriving stock (Generic, Show)- deriving anyclass (FromJSON)+ deriving anyclass (FromJSON, ToJSON)
src/OpenAI/V1/Files.hs view
@@ -55,7 +55,7 @@ , object :: Text , purpose :: Purpose } deriving stock (Generic, Show)- deriving anyclass (FromJSON)+ deriving anyclass (FromJSON, ToJSON) -- | The intended purpose of the uploaded file. data Purpose
src/OpenAI/V1/FineTuning/Jobs.hs view
@@ -67,7 +67,7 @@ parseJSON = genericParseJSON integrationOptions instance ToJSON Integration where- toJSON = genericToJSON integrationOptions-- | CreateFineTuningJob body+ toJSON = genericToJSON integrationOptions -- | Request body for @\/v1\/fine_tuning\/jobs@ data CreateFineTuningJob = CreateFineTuningJob@@ -79,7 +79,7 @@ , integrations :: Maybe (Vector Integration) , seed :: Maybe Integer } deriving stock (Generic, Show)- deriving anyclass (ToJSON)+ deriving anyclass (FromJSON, ToJSON) -- | Default `CreateFineTuningJob` _CreateFineTuningJob :: CreateFineTuningJob@@ -104,6 +104,9 @@ instance FromJSON Status where parseJSON = genericParseJSON aesonOptions +instance ToJSON Status where+ toJSON = genericToJSON aesonOptions+ -- | The fine_tuning.job object represents a fine-tuning job that has been -- created through the API. data JobObject = JobObject@@ -125,7 +128,7 @@ , seed :: Integer , estimated_finish :: Maybe POSIXTime } deriving stock (Generic, Show)- deriving anyclass (FromJSON)+ deriving anyclass (FromJSON, ToJSON) -- | Log level data Level = Info | Warn | Error@@ -134,6 +137,9 @@ instance FromJSON Level where parseJSON = genericParseJSON aesonOptions +instance ToJSON Level where+ toJSON = genericToJSON aesonOptions+ -- | Fine-tuning job event object data EventObject = EventObject { id :: Text@@ -142,7 +148,7 @@ , message :: Text , object :: Text } deriving stock (Generic, Show)- deriving anyclass (FromJSON)+ deriving anyclass (FromJSON, ToJSON) -- | Metrics at the step number during the fine-tuning job. data Metrics = Metrics@@ -154,7 +160,7 @@ , full_valid_loss :: Double , full_valid_mean_token_accuracy :: Double } deriving stock (Generic, Show)- deriving anyclass (FromJSON)+ deriving anyclass (FromJSON, ToJSON) -- | The @fine_tuning.job.checkpoint@ object represents a model checkpoint for -- a fine-tuning job that is ready to use@@ -167,7 +173,7 @@ , fine_tuning_job_id :: FineTuningJobID , object :: Text } deriving stock (Generic, Show)- deriving anyclass (FromJSON)+ deriving anyclass (FromJSON, ToJSON) -- | Servant API type API =
src/OpenAI/V1/Images/Edits.hs view
@@ -28,6 +28,7 @@ , response_format :: Maybe ResponseFormat , user :: Maybe Text } deriving stock (Generic, Show)+ deriving anyclass (FromJSON, ToJSON) -- | Default `CreateImageEdit` _CreateImageEdit :: CreateImageEdit
src/OpenAI/V1/Images/Generations.hs view
@@ -20,6 +20,9 @@ data Quality = Standard | HD deriving stock (Generic, Show) +instance FromJSON Quality where+ parseJSON = genericParseJSON aesonOptions+ instance ToJSON Quality where toJSON = genericToJSON aesonOptions @@ -27,6 +30,9 @@ data Style = Vivid | Natural deriving stock (Generic, Show) +instance FromJSON Style where+ parseJSON = genericParseJSON aesonOptions+ instance ToJSON Style where toJSON = genericToJSON aesonOptions @@ -53,6 +59,9 @@ , style = Nothing , user = Nothing }++instance FromJSON CreateImage where+ parseJSON = genericParseJSON aesonOptions instance ToJSON CreateImage where toJSON = genericToJSON aesonOptions
src/OpenAI/V1/Images/Image.hs view
@@ -12,4 +12,4 @@ , url :: Maybe Text , revised_prompt :: Maybe Text } deriving stock (Generic, Show)- deriving anyclass (FromJSON)+ deriving anyclass (FromJSON, ToJSON)
src/OpenAI/V1/Images/ResponseFormat.hs view
@@ -10,6 +10,9 @@ data ResponseFormat = URL | B64_JSON deriving stock (Generic, Show) +instance FromJSON ResponseFormat where+ parseJSON = genericParseJSON aesonOptions+ instance ToJSON ResponseFormat where toJSON = genericToJSON aesonOptions
src/OpenAI/V1/Images/Variations.hs view
@@ -24,6 +24,7 @@ , size :: Maybe Text , user :: Maybe Text } deriving stock (Generic, Show)+ deriving anyclass (FromJSON, ToJSON) -- | Default `CreateImageVariation` _CreateImageVariation :: CreateImageVariation
src/OpenAI/V1/ListOf.hs view
@@ -14,3 +14,6 @@ instance FromJSON a => FromJSON (ListOf a) where parseJSON = genericParseJSON aesonOptions++instance ToJSON a => ToJSON (ListOf a) where+ toJSON = genericToJSON aesonOptions
src/OpenAI/V1/Message.hs view
@@ -70,9 +70,16 @@ } deriving stock (Generic, Show) -instance ToJSON Message where- toJSON = genericToJSON aesonOptions+messageOptions :: Options+messageOptions =+ aesonOptions { sumEncoding = TaggedObject{ tagFieldName = "role", contentsFieldName = "" } , tagSingleConstructors = True }++instance FromJSON Message where+ parseJSON = genericParseJSON messageOptions++instance ToJSON Message where+ toJSON = genericToJSON messageOptions
src/OpenAI/V1/Moderations.hs view
@@ -21,7 +21,7 @@ { input :: Text , model :: Maybe Model } deriving stock (Generic, Show)- deriving anyclass (ToJSON)+ deriving anyclass (FromJSON, ToJSON) -- | Default `CreateModeration` _CreateModeration :: CreateModeration@@ -36,6 +36,9 @@ instance FromJSON InputType where parseJSON = genericParseJSON aesonOptions +instance ToJSON InputType where+ toJSON = genericToJSON aesonOptions+ -- | A moderation result data Result = Result { flagged :: Bool@@ -45,7 +48,7 @@ -- According to the OpenAPI spec the `category_applied_input_types` -- field is required but their actual implementation omits this field. } deriving stock (Generic, Show)- deriving anyclass (FromJSON)+ deriving anyclass (FromJSON, ToJSON) -- | Represents if a given text input is potentially harmful. data Moderation = Moderation@@ -53,7 +56,7 @@ , model :: Model , results :: Vector Result } deriving stock (Generic, Show)- deriving anyclass (FromJSON)+ deriving anyclass (FromJSON, ToJSON) -- | Servant API type API =
src/OpenAI/V1/Order.hs view
@@ -8,6 +8,13 @@ -- | Sort order by the @created_at@ timestamp of the objects data Order = Desc | Asc+ deriving stock (Generic, Show)++instance FromJSON Order where+ parseJSON = genericParseJSON aesonOptions++instance ToJSON Order where+ toJSON = genericToJSON aesonOptions instance ToHttpApiData Order where toUrlPiece Desc = "desc"
src/OpenAI/V1/Threads.hs view
@@ -34,7 +34,7 @@ , tool_resources :: Maybe ToolResources , metadata :: Maybe (Map Text Text) } deriving stock (Generic, Show)- deriving anyclass (ToJSON)+ deriving anyclass (FromJSON, ToJSON) -- | Default `Thread` _Thread :: Thread@@ -50,6 +50,9 @@ , metadata :: Maybe (Map Text Text) } deriving stock (Generic, Show) +instance FromJSON ModifyThread where+ parseJSON = genericParseJSON aesonOptions+ instance ToJSON ModifyThread where toJSON = genericToJSON aesonOptions @@ -68,7 +71,7 @@ , tool_resources :: Maybe ToolResources , metadata :: Maybe (Map Text Text) } deriving stock (Generic, Show)- deriving anyclass (FromJSON)+ deriving anyclass (FromJSON, ToJSON) -- | Servant API type API =
src/OpenAI/V1/Threads/Messages.hs view
@@ -36,6 +36,9 @@ { metadata :: Maybe (Map Text Text) } deriving stock (Generic, Show) +instance FromJSON ModifyMessage where+ parseJSON = genericParseJSON aesonOptions+ instance ToJSON ModifyMessage where toJSON = genericToJSON aesonOptions @@ -52,17 +55,20 @@ instance FromJSON Status where parseJSON = genericParseJSON aesonOptions +instance ToJSON Status where+ toJSON = genericToJSON aesonOptions+ -- | On an incomplete message, details about why the message is incomplete. data IncompleteDetails = IncompleteDetails { reason :: Text } deriving (Generic, Show)- deriving anyclass (FromJSON)+ deriving anyclass (FromJSON, ToJSON) -- | File data File = File { file_id :: FileID } deriving stock (Generic, Show)- deriving anyclass (FromJSON)+ deriving anyclass (FromJSON, ToJSON) -- | An annotation data Annotation@@ -80,20 +86,27 @@ } deriving stock (Generic, Show) -instance FromJSON Annotation where- parseJSON = genericParseJSON aesonOptions+annotationOptions :: Options+annotationOptions =+ aesonOptions { sumEncoding = TaggedObject{ tagFieldName = "type", contentsFieldName = "" } , tagSingleConstructors = True } +instance FromJSON Annotation where+ parseJSON = genericParseJSON annotationOptions++instance ToJSON Annotation where+ toJSON = genericToJSON annotationOptions+ -- | The text content that is part of a message. data TextObject = TextObject { value :: Text , annotations :: Vector Annotation } deriving stock (Generic, Show)- deriving anyclass (FromJSON)+ deriving anyclass (FromJSON, ToJSON) instance IsString TextObject where fromString string =@@ -116,7 +129,7 @@ , attachments :: Maybe (Vector Attachment) , metadata :: Map Text Text } deriving (Generic, Show)- deriving anyclass (FromJSON)+ deriving anyclass (FromJSON, ToJSON) -- | Servant API type API =
src/OpenAI/V1/Threads/Runs.hs view
@@ -83,6 +83,9 @@ , response_format :: Maybe (AutoOr ResponseFormat) } deriving stock (Generic, Show) +instance FromJSON CreateRun where+ parseJSON = genericParseJSON aesonOptions+ instance ToJSON CreateRun where toJSON = genericToJSON aesonOptions @@ -124,6 +127,9 @@ , response_format :: Maybe (AutoOr ResponseFormat) } deriving stock (Generic, Show) +instance FromJSON CreateThreadAndRun where+ parseJSON = genericParseJSON aesonOptions+ instance ToJSON CreateThreadAndRun where toJSON = genericToJSON aesonOptions @@ -150,7 +156,7 @@ data SubmitToolOutputs = SubmitToolOutputs { tool_calls :: Vector ToolCall } deriving stock (Generic, Show)- deriving anyclass (FromJSON)+ deriving anyclass (FromJSON, ToJSON) -- | The status of the run data Status@@ -168,13 +174,17 @@ instance FromJSON Status where parseJSON = genericParseJSON aesonOptions +instance ToJSON Status where+ toJSON = genericToJSON aesonOptions+ -- | Details on the action required to continue the run data RequiredAction = RequiredAction_Submit_Tool_Outputs { submit_tool_outputs :: SubmitToolOutputs } deriving stock (Generic, Show) -instance FromJSON RequiredAction where- parseJSON = genericParseJSON aesonOptions+requiredActionOptions :: Options+requiredActionOptions =+ aesonOptions { sumEncoding = TaggedObject{ tagFieldName = "type" } @@ -183,11 +193,17 @@ , constructorTagModifier = stripPrefix "RequiredAction_" } +instance FromJSON RequiredAction where+ parseJSON = genericParseJSON requiredActionOptions++instance ToJSON RequiredAction where+ toJSON = genericToJSON requiredActionOptions+ -- | Details on why the run is incomplete data IncompleteDetails = IncompleteDetails { reason :: Text } deriving stock (Generic, Show)- deriving anyclass (FromJSON)+ deriving anyclass (FromJSON, ToJSON) -- | Represents an execution run on a thread. data RunObject = RunObject@@ -209,7 +225,7 @@ , instructions :: Maybe Text , tools :: Vector Tool , metadata :: Map Text Text- , usage :: Maybe (Usage (Maybe Void) (Maybe Void))+ , usage :: Maybe (Usage (Maybe CompletionTokensDetails) (Maybe PromptTokensDetails)) , temperature :: Maybe Double , top_p :: Maybe Double , max_prompt_tokens :: Maybe Natural@@ -219,13 +235,16 @@ , parallel_tool_calls :: Bool , response_format :: AutoOr ResponseFormat } deriving stock (Generic, Show)- deriving anyclass (FromJSON)+ deriving anyclass (FromJSON, ToJSON) -- | Request body for @\/v1\/threads\/:thread_id\/runs\/:run_id@ data ModifyRun = ModifyRun { metadata :: Maybe (Map Text Text) } deriving stock (Generic, Show) +instance FromJSON ModifyRun where+ parseJSON = genericParseJSON aesonOptions+ instance ToJSON ModifyRun where toJSON = genericToJSON aesonOptions @@ -238,12 +257,15 @@ { tool_call_id :: Maybe Text , output :: Text } deriving stock (Generic, Show)- deriving anyclass (ToJSON)+ deriving anyclass (FromJSON, ToJSON) -- | Request body for @\/v1\/threads\/:thread_id\/runs\/:run_id\/submit_tool_outputs@ data SubmitToolOutputsToRun = SubmitToolOutputsToRun { tool_outputs :: Vector ToolOutput } deriving stock (Generic, Show)++instance FromJSON SubmitToolOutputsToRun where+ parseJSON = genericParseJSON aesonOptions instance ToJSON SubmitToolOutputsToRun where toJSON = genericToJSON aesonOptions
src/OpenAI/V1/Threads/Runs/Steps.hs view
@@ -43,17 +43,21 @@ instance FromJSON Status where parseJSON = genericParseJSON aesonOptions +instance ToJSON Status where+ toJSON = genericToJSON aesonOptions+ -- | Code Interpreter image output data Image = Image{ file_id :: FileID } deriving stock (Generic, Show)- deriving anyclass (FromJSON)+ deriving anyclass (FromJSON, ToJSON) -- | An output from the Code Interpreter tool call data Output = Output_Logs{ logs :: Text } | Output_Image{ image :: Image } deriving stock (Generic, Show) -instance FromJSON Output where- parseJSON = genericParseJSON aesonOptions+outputOptions :: Options+outputOptions =+ aesonOptions { sumEncoding = TaggedObject{ tagFieldName = "type", contentsFieldName = "" } @@ -62,19 +66,25 @@ , constructorTagModifier = stripPrefix "Output_" } +instance FromJSON Output where+ parseJSON = genericParseJSON outputOptions++instance ToJSON Output where+ toJSON = genericToJSON outputOptions+ -- | A Code Interpreter tool call data CodeInterpreter = CodeInterpreter { input :: Text , outputs :: Vector Output } deriving stock (Generic, Show)- deriving anyclass (FromJSON)+ deriving anyclass (FromJSON, ToJSON) -- | The ranking options for the file search. data RankingOptions = RankingOptions { ranker :: Text , score_threshold :: Double } deriving stock (Generic, Show)- deriving anyclass (FromJSON)+ deriving anyclass (FromJSON, ToJSON) -- | The content of the result that was found data Content = Content@@ -85,6 +95,9 @@ instance FromJSON Content where parseJSON = genericParseJSON aesonOptions +instance ToJSON Content where+ toJSON = genericToJSON aesonOptions+ -- | Result of the file search data Result = Result { file_id :: FileID@@ -92,14 +105,14 @@ , score :: Double , content :: Vector Content } deriving stock (Generic, Show)- deriving anyclass (FromJSON)+ deriving anyclass (FromJSON, ToJSON) -- | A File Search tool call data FileSearch = FileSearch { ranking_options :: RankingOptions , results :: Vector Result } deriving stock (Generic, Show)- deriving anyclass (FromJSON)+ deriving anyclass (FromJSON, ToJSON) -- | The definition of the function that was called data Function = Function@@ -107,7 +120,7 @@ , arguments :: Text , output :: Maybe Text } deriving (Generic, Show)- deriving anyclass (FromJSON)+ deriving anyclass (FromJSON, ToJSON) -- | A tool call the run step was involved in data ToolCall@@ -116,8 +129,9 @@ | ToolCall_Function { id :: Text, function :: Function } deriving stock (Generic, Show) -instance FromJSON ToolCall where- parseJSON = genericParseJSON aesonOptions+toolCallOptions :: Options+toolCallOptions =+ aesonOptions { sumEncoding = TaggedObject{ tagFieldName = "type", contentsFieldName = "" } @@ -126,20 +140,33 @@ , constructorTagModifier = stripPrefix "ToolCall_" } +instance FromJSON ToolCall where+ parseJSON = genericParseJSON toolCallOptions++instance ToJSON ToolCall where+ toJSON = genericToJSON toolCallOptions+ -- | The details of the run step data StepDetails = Message_Creation{ message_id :: MessageID } | Tool_Calls{ tool_calls :: Vector ToolCall } deriving stock (Generic, Show) -instance FromJSON StepDetails where- parseJSON = genericParseJSON aesonOptions+stepDetailsOptions :: Options+stepDetailsOptions =+ aesonOptions { sumEncoding = TaggedObject{ tagFieldName = "type", contentsFieldName = "" } , tagSingleConstructors = True } +instance FromJSON StepDetails where+ parseJSON = genericParseJSON stepDetailsOptions++instance ToJSON StepDetails where+ toJSON = genericToJSON stepDetailsOptions+ -- | Represents a step in execution of a run. data RunStepObject = RunStepObject { id :: StepID@@ -158,7 +185,7 @@ , metadata :: Map Text Text , usage :: Maybe (Usage CompletionTokensDetails PromptTokensDetails) } deriving stock (Generic, Show)- deriving anyclass (FromJSON)+ deriving anyclass (FromJSON, ToJSON) -- | Servant API type API =
src/OpenAI/V1/Uploads.hs view
@@ -33,7 +33,7 @@ , bytes :: Natural , mime_type :: Text } deriving stock (Generic, Show)- deriving anyclass (ToJSON)+ deriving anyclass (FromJSON, ToJSON) -- | Default `CreateUpload` _CreateUpload :: CreateUpload@@ -41,7 +41,14 @@ -- | Request body for @\/v1\/uploads\/:upload_id\/parts@ data AddUploadPart = AddUploadPart{ data_ :: FilePath }+ deriving stock (Generic, Show) +instance FromJSON AddUploadPart where+ parseJSON = genericParseJSON aesonOptions++instance ToJSON AddUploadPart where+ toJSON = genericToJSON aesonOptions+ -- | Default `AddUploadPart` _AddUploadPart :: AddUploadPart _AddUploadPart = AddUploadPart{ }@@ -80,6 +87,13 @@ CompleteUpload{ md5 = Just "", .. } fix x = x +instance FromJSON CompleteUpload where+ parseJSON = fmap (fmap fix) (genericParseJSON aesonOptions)+ where+ fix CompleteUpload{ md5 = Just "", .. } =+ CompleteUpload{ md5 = Nothing, .. }+ fix x = x+ -- | The status of the Upload data Status = Pending@@ -91,6 +105,9 @@ instance FromJSON Status where parseJSON = genericParseJSON aesonOptions +instance ToJSON Status where+ toJSON = genericToJSON aesonOptions+ -- | The Upload object can accept byte chunks in the form of Parts. data UploadObject file = UploadObject { id :: UploadID@@ -106,6 +123,8 @@ instance FromJSON (UploadObject (Maybe Void)) instance FromJSON (UploadObject FileObject)+instance ToJSON (UploadObject (Maybe Void))+instance ToJSON (UploadObject FileObject) -- | The upload part represents a chunk of bytes we can add to an upload -- object@@ -115,7 +134,7 @@ , upload_id :: UploadID , object :: Text } deriving stock (Generic, Show)- deriving anyclass (FromJSON)+ deriving anyclass (FromJSON, ToJSON) -- | Servant API type API
src/OpenAI/V1/Usage.hs view
@@ -12,28 +12,30 @@ -- | Breakdown of tokens used in a completion data CompletionTokensDetails = CompletionTokensDetails- { accepted_prediction_tokens :: Natural- , audio_tokens :: Natural- , reasoning_tokens :: Natural- , rejected_prediction_tokens :: Natural+ { accepted_prediction_tokens :: Maybe Natural+ , audio_tokens :: Maybe Natural+ , reasoning_tokens :: Maybe Natural+ , rejected_prediction_tokens :: Maybe Natural } deriving stock (Generic, Show)- deriving anyclass (FromJSON)+ deriving anyclass (FromJSON, ToJSON) -- | Breakdown of tokens used in the prompt data PromptTokensDetails = PromptTokensDetails- { audio_tokens :: Natural- , cached_tokens :: Natural+ { audio_tokens :: Maybe Natural+ , cached_tokens :: Maybe Natural } deriving stock (Generic, Show)- deriving anyclass (FromJSON)+ deriving anyclass (FromJSON, ToJSON) -- | Usage statistics for the completion request data Usage completionTokensDetails promptTokensDetails = Usage { completion_tokens :: Natural , prompt_tokens :: Natural , total_tokens :: Natural- , completion_tokens_details :: completionTokensDetails- , prompt_tokens_details :: promptTokensDetails+ , completion_tokens_details :: Maybe completionTokensDetails+ , prompt_tokens_details :: Maybe promptTokensDetails } deriving stock (Generic, Show) instance FromJSON (Usage CompletionTokensDetails PromptTokensDetails)-instance FromJSON (Usage (Maybe Void) (Maybe Void))+instance FromJSON (Usage (Maybe CompletionTokensDetails) (Maybe PromptTokensDetails))+instance ToJSON (Usage CompletionTokensDetails PromptTokensDetails)+instance ToJSON (Usage (Maybe CompletionTokensDetails) (Maybe PromptTokensDetails))
src/OpenAI/V1/VectorStores.hs view
@@ -44,7 +44,7 @@ , chunking_strategy :: Maybe (AutoOr ChunkingStrategy) , metadata :: Maybe (Map Text Text) } deriving stock (Generic, Show)- deriving (ToJSON)+ deriving (FromJSON, ToJSON) -- | Default `CreateVectorStore` _CreateVectorStore :: CreateVectorStore@@ -61,7 +61,7 @@ , expires_after :: Maybe ExpiresAfter , metadata :: Maybe (Map Text Text) } deriving stock (Generic, Show)- deriving (ToJSON)+ deriving (FromJSON, ToJSON) -- | Default `ModifyVectorStore` _ModifyVectorStore :: ModifyVectorStore@@ -78,6 +78,9 @@ instance FromJSON Status where parseJSON = genericParseJSON aesonOptions +instance ToJSON Status where+ toJSON = genericToJSON aesonOptions+ -- | A vector store is a collection of processed files can be used by the -- @file_search@ tool. data VectorStoreObject = VectorStoreObject@@ -93,7 +96,7 @@ , last_active_at :: Maybe POSIXTime , metadata :: Map Text Text } deriving stock (Generic, Show)- deriving anyclass (FromJSON)+ deriving anyclass (FromJSON, ToJSON) -- | Servant API type API =
src/OpenAI/V1/VectorStores/FileBatches.hs view
@@ -28,7 +28,7 @@ { file_ids :: Vector FileID , chunking_strategy :: Maybe ChunkingStrategy } deriving stock (Generic, Show)- deriving anyclass (ToJSON)+ deriving anyclass (FromJSON, ToJSON) -- | Default `CreateVectorStoreFileBatch` _CreateVectorStoreFileBatch :: CreateVectorStoreFileBatch@@ -45,7 +45,7 @@ , status :: Status , file_counts :: Maybe FileCounts } deriving stock (Generic, Show)- deriving anyclass (FromJSON)+ deriving anyclass (FromJSON, ToJSON) -- | Servant API type API =
src/OpenAI/V1/VectorStores/FileCounts.hs view
@@ -14,4 +14,4 @@ , cancelled :: Natural , total :: Natural } deriving stock (Generic, Show)- deriving anyclass (FromJSON)+ deriving anyclass (FromJSON, ToJSON)
src/OpenAI/V1/VectorStores/Files.hs view
@@ -29,7 +29,7 @@ { file_id :: FileID , chunking_strategy :: Maybe ChunkingStrategy } deriving stock (Generic, Show)- deriving anyclass (ToJSON)+ deriving anyclass (FromJSON, ToJSON) -- | Default `CreateVectorStoreFile` _CreateVectorStoreFile :: CreateVectorStoreFile@@ -48,7 +48,7 @@ , last_error :: Maybe Error , chunking_strategy :: ChunkingStrategy } deriving stock (Generic, Show)- deriving anyclass (FromJSON)+ deriving anyclass (FromJSON, ToJSON) -- | Servant API type API =
src/OpenAI/V1/VectorStores/Status.hs view
@@ -13,6 +13,9 @@ instance FromJSON Status where parseJSON = genericParseJSON aesonOptions +instance ToJSON Status where+ toJSON = genericToJSON aesonOptions+ instance ToHttpApiData Status where toUrlPiece In_Progress = "in_progress" toUrlPiece Completed = "completed"
tasty/Main.hs view
@@ -89,7 +89,7 @@ let user = "openai Haskell package" let chatModel = "gpt-4o-mini"-+ let reasoningModel = "o3-mini" let Methods{..} = V1.makeMethods clientEnv (Text.pack key) -- Test each format to make sure we're handling each possible content type@@ -153,6 +153,7 @@ , prediction = Nothing , audio = Nothing , presence_penalty = Nothing+ , reasoning_effort = Nothing , response_format = Nothing , seed = Nothing , service_tier = Nothing@@ -167,6 +168,41 @@ return () + let completionsMinimalReasoningTest =+ HUnit.testCase "Create chat completion reasoning model - minimal" do+ _ <- createChatCompletion CreateChatCompletion+ { messages =+ [ Completions.User+ { content = [ "Hello, world!" ], name = Nothing }+ ]+ , model = reasoningModel+ , store = Nothing+ , metadata = Nothing+ , frequency_penalty = Nothing+ , logit_bias = Nothing+ , logprobs = Nothing+ , top_logprobs = Nothing+ , max_completion_tokens = Nothing+ , n = Nothing+ , modalities = Nothing+ , prediction = Nothing+ , audio = Nothing+ , presence_penalty = Nothing+ , reasoning_effort = Just Completions.Low+ , response_format = Nothing+ , seed = Nothing+ , service_tier = Nothing+ , stop = Nothing+ , temperature = Nothing+ , top_p = Nothing+ , tools = Nothing+ , tool_choice = Nothing+ , parallel_tool_calls = Nothing+ , user = Nothing+ }++ return ()+ let completionsMaximalTest = HUnit.testCase "Create chat completion - maximal" do _ <- createChatCompletion CreateChatCompletion@@ -208,6 +244,7 @@ , prediction = Nothing , audio = Nothing , presence_penalty = Just 0+ , reasoning_effort = Nothing , response_format = Just Completions.ResponseFormat_Text , seed = Just 0 , service_tier = Just Auto@@ -632,6 +669,7 @@ <> [ transcriptionTest , translationTest , completionsMinimalTest+ , completionsMinimalReasoningTest , completionsMaximalTest , embeddingsTest , fineTuningTest