packages feed

openai 2.5.0 → 2.5.1

raw patch · 3 files changed

+230/−4 lines, 3 files

Files

CHANGELOG.md view
@@ -1,3 +1,8 @@+2.5.1:++- Add 28 missing `ResponseStreamEvent` constructors covering all event types from the OpenAPI spec (lifecycle, reasoning, refusal, audio, image generation, MCP, and custom tool call events).+- Add `UnknownEvent` fallback constructor that gracefully handles unrecognized event types instead of crashing the parser.+ 2.5.0:  - **BREAKING (streaming imports):** move chat-completion streaming payload types (`ChatCompletionChunk`, `ChunkChoice`, `Delta`, `ChatCompletionStreamEvent`) from `OpenAI.V1.Chat.Completions` to `OpenAI.V1.Chat.Completions.Stream` to avoid selector ambiguity on `choices`/`usage` in non-streaming imports.
openai.cabal view
@@ -1,6 +1,6 @@ cabal-version:      2.4 name:               openai-version:            2.5.0+version:            2.5.1 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/Responses.hs view
@@ -51,8 +51,9 @@     , API     ) where +import Control.Applicative ((<|>)) import Data.Aeson (Object)-import OpenAI.Prelude hiding (Input(..))+import OpenAI.Prelude hiding (Input(..), input) import OpenAI.V1.AutoOr (AutoOr(..)) import OpenAI.V1.ListOf (ListOf) import OpenAI.V1.Models (Model)@@ -783,6 +784,185 @@         , code :: Text         , sequence_number :: Natural         }+    | ResponseFunctionCallArgumentsDeltaEvent+        { item_id :: Text+        , output_index :: Natural+        , delta :: Text+        , sequence_number :: Natural+        }+    | ResponseFunctionCallArgumentsDoneEvent+        { item_id :: Text+        , output_index :: Natural+        , name :: Text+        , arguments :: Text+        , sequence_number :: Natural+        }+    -- Lifecycle+    | ResponseQueuedEvent+        { response :: ResponseObject+        , sequence_number :: Natural+        }+    | ResponseIncompleteEvent+        { response :: ResponseObject+        , sequence_number :: Natural+        }+    -- Reasoning+    | ResponseReasoningSummaryPartAddedEvent+        { item_id :: Text+        , output_index :: Natural+        , summary_index :: Natural+        , summary_part :: SummaryPart+        , sequence_number :: Natural+        }+    | ResponseReasoningSummaryPartDoneEvent+        { item_id :: Text+        , output_index :: Natural+        , summary_index :: Natural+        , summary_part :: SummaryPart+        , sequence_number :: Natural+        }+    | ResponseReasoningSummaryTextDeltaEvent+        { item_id :: Text+        , output_index :: Natural+        , summary_index :: Natural+        , delta :: Text+        , sequence_number :: Natural+        }+    | ResponseReasoningSummaryTextDoneEvent+        { item_id :: Text+        , output_index :: Natural+        , summary_index :: Natural+        , text :: Text+        , sequence_number :: Natural+        }+    | ResponseReasoningTextDeltaEvent+        { item_id :: Text+        , output_index :: Natural+        , content_index :: Natural+        , delta :: Text+        , sequence_number :: Natural+        }+    | ResponseReasoningTextDoneEvent+        { item_id :: Text+        , output_index :: Natural+        , content_index :: Natural+        , text :: Text+        , sequence_number :: Natural+        }+    -- Refusal+    | ResponseRefusalDeltaEvent+        { item_id :: Text+        , output_index :: Natural+        , content_index :: Natural+        , delta :: Text+        , sequence_number :: Natural+        }+    | ResponseRefusalDoneEvent+        { item_id :: Text+        , output_index :: Natural+        , content_index :: Natural+        , refusal :: Text+        , sequence_number :: Natural+        }+    -- Audio+    | ResponseAudioDeltaEvent+        { delta :: Text+        , sequence_number :: Natural+        }+    | ResponseAudioDoneEvent+        { sequence_number :: Natural+        }+    | ResponseAudioTranscriptDeltaEvent+        { delta :: Text+        , sequence_number :: Natural+        }+    | ResponseAudioTranscriptDoneEvent+        { sequence_number :: Natural+        }+    -- Image generation+    | ResponseImageGenerationCallInProgressEvent+        { output_index :: Natural+        , item_id :: Text+        , sequence_number :: Natural+        }+    | ResponseImageGenerationCallGeneratingEvent+        { output_index :: Natural+        , item_id :: Text+        , sequence_number :: Natural+        }+    | ResponseImageGenerationCallCompletedEvent+        { output_index :: Natural+        , item_id :: Text+        , sequence_number :: Natural+        }+    | ResponseImageGenerationCallPartialImageEvent+        { output_index :: Natural+        , item_id :: Text+        , partial_image_index :: Natural+        , partial_image_b64 :: Text+        , sequence_number :: Natural+        }+    -- MCP+    | ResponseMcpCallInProgressEvent+        { output_index :: Natural+        , item_id :: Text+        , sequence_number :: Natural+        }+    | ResponseMcpCallCompletedEvent+        { output_index :: Natural+        , item_id :: Text+        , sequence_number :: Natural+        }+    | ResponseMcpCallFailedEvent+        { output_index :: Natural+        , item_id :: Text+        , sequence_number :: Natural+        }+    | ResponseMcpCallArgumentsDeltaEvent+        { output_index :: Natural+        , item_id :: Text+        , delta :: Text+        , sequence_number :: Natural+        }+    | ResponseMcpCallArgumentsDoneEvent+        { output_index :: Natural+        , item_id :: Text+        , arguments :: Text+        , sequence_number :: Natural+        }+    | ResponseMcpListToolsInProgressEvent+        { output_index :: Natural+        , item_id :: Text+        , sequence_number :: Natural+        }+    | ResponseMcpListToolsCompletedEvent+        { output_index :: Natural+        , item_id :: Text+        , sequence_number :: Natural+        }+    | ResponseMcpListToolsFailedEvent+        { output_index :: Natural+        , item_id :: Text+        , sequence_number :: Natural+        }+    -- Custom tool call+    | ResponseCustomToolCallInputDeltaEvent+        { output_index :: Natural+        , item_id :: Text+        , delta :: Text+        , sequence_number :: Natural+        }+    | ResponseCustomToolCallInputDoneEvent+        { output_index :: Natural+        , item_id :: Text+        , input :: Text+        , sequence_number :: Natural+        }+    -- Unknown / future events+    | UnknownEvent+        { unknownEventType :: Text+        , unknownEventPayload :: Value+        }     | ErrorEvent         { error_code :: Maybe Text         , error_message :: Text@@ -801,6 +981,11 @@         "error_message" -> "message"         "error_param" -> "param"         "error_sequence_number" -> "sequence_number"+        -- Reasoning summary part events use summary_part to avoid type conflict with part :: OutputContent+        "summary_part" -> "part"+        -- UnknownEvent fields (not serialized, but needed for completeness)+        "unknownEventType" -> "type"+        "unknownEventPayload" -> "payload"         -- Keep all other fields as-is         other -> other     , constructorTagModifier = \s -> case s of@@ -826,12 +1011,48 @@         "ResponseCodeInterpreterCallCompletedEvent" -> "response.code_interpreter_call.completed"         "ResponseCodeInterpreterCallCodeDeltaEvent" -> "response.code_interpreter_call_code.delta"         "ResponseCodeInterpreterCallCodeDoneEvent" -> "response.code_interpreter_call_code.done"+        "ResponseFunctionCallArgumentsDeltaEvent" -> "response.function_call_arguments.delta"+        "ResponseFunctionCallArgumentsDoneEvent" -> "response.function_call_arguments.done"+        "ResponseQueuedEvent" -> "response.queued"+        "ResponseIncompleteEvent" -> "response.incomplete"+        "ResponseReasoningSummaryPartAddedEvent" -> "response.reasoning_summary_part.added"+        "ResponseReasoningSummaryPartDoneEvent" -> "response.reasoning_summary_part.done"+        "ResponseReasoningSummaryTextDeltaEvent" -> "response.reasoning_summary_text.delta"+        "ResponseReasoningSummaryTextDoneEvent" -> "response.reasoning_summary_text.done"+        "ResponseReasoningTextDeltaEvent" -> "response.reasoning_text.delta"+        "ResponseReasoningTextDoneEvent" -> "response.reasoning_text.done"+        "ResponseRefusalDeltaEvent" -> "response.refusal.delta"+        "ResponseRefusalDoneEvent" -> "response.refusal.done"+        "ResponseAudioDeltaEvent" -> "response.audio.delta"+        "ResponseAudioDoneEvent" -> "response.audio.done"+        "ResponseAudioTranscriptDeltaEvent" -> "response.audio.transcript.delta"+        "ResponseAudioTranscriptDoneEvent" -> "response.audio.transcript.done"+        "ResponseImageGenerationCallInProgressEvent" -> "response.image_generation_call.in_progress"+        "ResponseImageGenerationCallGeneratingEvent" -> "response.image_generation_call.generating"+        "ResponseImageGenerationCallCompletedEvent" -> "response.image_generation_call.completed"+        "ResponseImageGenerationCallPartialImageEvent" -> "response.image_generation_call.partial_image"+        "ResponseMcpCallInProgressEvent" -> "response.mcp_call.in_progress"+        "ResponseMcpCallCompletedEvent" -> "response.mcp_call.completed"+        "ResponseMcpCallFailedEvent" -> "response.mcp_call.failed"+        "ResponseMcpCallArgumentsDeltaEvent" -> "response.mcp_call_arguments.delta"+        "ResponseMcpCallArgumentsDoneEvent" -> "response.mcp_call_arguments.done"+        "ResponseMcpListToolsInProgressEvent" -> "response.mcp_list_tools.in_progress"+        "ResponseMcpListToolsCompletedEvent" -> "response.mcp_list_tools.completed"+        "ResponseMcpListToolsFailedEvent" -> "response.mcp_list_tools.failed"+        "ResponseCustomToolCallInputDeltaEvent" -> "response.custom_tool_call_input.delta"+        "ResponseCustomToolCallInputDoneEvent" -> "response.custom_tool_call_input.done"         "ErrorEvent" -> "error"-        _ -> Prelude.error "Unknown ResponseStreamEvent constructor"+        other -> other     }  instance FromJSON ResponseStreamEvent where-    parseJSON = genericParseJSON responseStreamEventOptions+    parseJSON value =+        genericParseJSON responseStreamEventOptions value+            <|> flip (Aeson.withObject "ResponseStreamEvent") value (\o ->+                    UnknownEvent+                        <$> o Aeson..: "type"+                        <*> pure value+                )  instance ToJSON ResponseStreamEvent where     toJSON = genericToJSON responseStreamEventOptions