|
1 | 1 | # Release History |
2 | 2 |
|
| 3 | +## 2.9.0 (2026-02-27) |
| 4 | + |
| 5 | +### Acknowledgments |
| 6 | + |
| 7 | +Thank you to our developer community members who helped to make the OpenAI client library better with their contributions to this release: |
| 8 | + |
| 9 | +- [@mokarchi](https://github.com/mokarchi) |
| 10 | +- [@alty-ir](https://github.com/alty-ir) |
| 11 | +- [@peibekwe](https://github.com/peibekwe) |
| 12 | +- [@crickman](https://github.com/crickman) |
| 13 | +- [@jpaarhuis](https://github.com/jpaarhuis) |
| 14 | +- [@salmanmkc](https://github.com/salmanmkc) |
| 15 | + |
| 16 | +### Features Added |
| 17 | + |
| 18 | +- OpenAI.Audio: |
| 19 | + - Added support for `AudioClient` configuration and dependency injection via the new `AudioClientSettings` class. |
| 20 | +- OpenAI.Batch: |
| 21 | + - Added support for `BatchClient` configuration and dependency injection via the new `BatchClientSettings` class. |
| 22 | +- OpenAI.Chat: |
| 23 | + - Added support for `ChatClient` configuration and dependency injection via the new `ChatClientSettings` class. |
| 24 | + - Added value of `None` to `ChatReasoningEffortLevel` enum to allow opting out of reasoning. |
| 25 | +- OpenAI.Containers: |
| 26 | + - Added support for `ContainerClient` configuration and dependency injection via the new `ContainerClientSettings` class. |
| 27 | +- OpenAI.Conversations: |
| 28 | + - Added support for `ConversationClient` configuration and dependency injection via the new `ConversationClientSettings` class. |
| 29 | +- OpenAI.Embeddings: |
| 30 | + - Added support for `EmbeddingClient` configuration and dependency injection via the new `EmbeddingClientSettings` class. |
| 31 | +- OpenAI.Evals: |
| 32 | + - Added support for `EvaluationClient` configuration and dependency injection via the new `EvaluationClientSettings` class. |
| 33 | +- OpenAI.Files: |
| 34 | + - Added support for `OpenAIFileClient` configuration and dependency injection via the new `OpenAIFileClientSettings` class. |
| 35 | + - Added support for retrieving files using pagination via new overloads of the `GetFiles` and `GetFilesAsync` methods in the `OpenAIFileClient`. |
| 36 | +- OpenAI.FineTuning: |
| 37 | + - Added support for `FineTuningClient` configuration and dependency injection via the new `FineTuningClientSettings` class. |
| 38 | +- OpenAI.Graders: |
| 39 | + - Added support for `GraderClient` configuration and dependency injection via the new `GraderClientSettings` class. |
| 40 | +- OpenAI.Images: |
| 41 | + - Added support for `ImageClient` configuration and dependency injection via the new `ImageClientSettings` class. |
| 42 | + - Added value of `HighQuality` to `GeneratedImageQuality` enum to allow generating higher quality images. |
| 43 | + - Added `InputFidelity` property to `ImageEditOptions` to control how closely distinctive features from the input are preserved. |
| 44 | + - Added `OutputCompressionFactor` property to `ImageEditOptions` to set the compression level (0-100%) for `jpeg` or `webp` outputs. |
| 45 | + - Added `OutputFileFormat` property to `ImageEditOptions` to set the file format in which the generated images are returned. |
| 46 | + - Added `Background` property to `GeneratedImageCollection`. |
| 47 | + - Added `OutputFileFormat` property to `GeneratedImageCollection`. |
| 48 | + - Added `Quality` property to `GeneratedImageCollection`. |
| 49 | + - Added `Size` property to `GeneratedImageCollection`. |
| 50 | +- OpenAI.Models: |
| 51 | + - Added support for `OpenAIModelClient` configuration and dependency injection via the new `OpenAIModelClientSettings` class. |
| 52 | +- OpenAI.Moderations: |
| 53 | + - Added support for `ModerationClient` configuration and dependency injection via the new `ModerationClientSettings` class. |
| 54 | + - Added support for classifying multi-modal inputs via new `ClassifyInputs` and `ClassifyInputsAsync` methods in the `ModerationClient`. |
| 55 | + - Use the new `ModerationInputPart` class to create text or image inputs for classication. |
| 56 | + - Use the new `ApplicableInputKinds` property of the `ModerationCategory` class to understand to which parts of the input the moderation results apply. |
| 57 | +- OpenAI.Realtime: |
| 58 | + - Added support for the stable version of the Realtime REST API. |
| 59 | + - Added support for `RealtimeClient` configuration and dependency injection via the new `RealtimeClientSettings` class. |
| 60 | + - Added support for integrating with remote MCP servers. |
| 61 | + - Users can add the new `RealtimeMcpTool` to the `Tools` property of their `RealtimeConversationSessionOptions` and configure it. |
| 62 | + - Use the `AllowedTools` property to limit which of the server tools can be called by the model. |
| 63 | + - Use the `ToolCallApprovalPolicy` property to specify which tools require an explicit approval before being called by the model. |
| 64 | + - Use the `AuthorizationToken` property to specify the access token to used when authenticating with the remote MCP server. |
| 65 | + - Use the `ConnectorId` property to use the OpenAI-maintained MCP wrappers for popular services like Microsoft Outlook or Dropbox. |
| 66 | + - Added a new `RealtimeClientCommand` class that represents client events to be used with the new `SendCommand` and `SendCommandAsync` overloads in the `RealtimeSessionClient` and exposed all supported client events as derived types: |
| 67 | + - `RealtimeClientCommandConversationItemCreate` |
| 68 | + - `RealtimeClientCommandConversationItemDelete` |
| 69 | + - `RealtimeClientCommandConversationItemRetrieve` |
| 70 | + - `RealtimeClientCommandConversationItemTruncate` |
| 71 | + - `RealtimeClientCommandInputAudioBufferAppend` |
| 72 | + - `RealtimeClientCommandInputAudioBufferClear` |
| 73 | + - `RealtimeClientCommandInputAudioBufferCommit` |
| 74 | + - `RealtimeClientCommandOutputAudioBufferClear` |
| 75 | + - `RealtimeClientCommandResponseCancel` |
| 76 | + - `RealtimeClientCommandResponseCreate` |
| 77 | + - `RealtimeClientCommandSessionUpdate` |
| 78 | + - Added support for System.Client.Model's `JsonPatch`, which enables users to get and set additional JSON properties in response and request payloads. |
| 79 | +- OpenAI.Responses: |
| 80 | + - Added support for `ResponsesClient` configuration and dependency injection via the new `ResponsesClientSettings` class. |
| 81 | + - Added support for compacting conversations via the new `CompactResponse` and `CompactResponseAsync` protocol methods in the `ResponsesClient`. |
| 82 | + - Added support for returning the number of input tokens that a Response would consume via the new `GetInputTokenCount` and `GetInputTokenCountAsync` protocol methods in the `ResponsesClient`. |
| 83 | + - Added value of `None` to `ResponseReasoningEffortLevel` enum to allow opting out of reasoning. |
| 84 | + - Added `InputImageUri` property to `ResponseContentPart` to manage image inputs as URIs. |
| 85 | + - Added implicit conversion operators to `McpToolCallApprovalPolicy` to facilitate its assignment. |
| 86 | +- OpenAI.VectorStores: |
| 87 | + - Added support for `VectorStoreClient` configuration and dependency injection via the new `VectorStoreClientSettings` class. |
| 88 | +- OpenAI.Videos: |
| 89 | + - Added support for `VideoClient` configuration and dependency injection via the new `VideoClientSettings` class. |
| 90 | + |
| 91 | +### Bugs Fixed |
| 92 | + |
| 93 | +- OpenAI.Chat: |
| 94 | + - Fixed a concurrency issue corrupting the state of the `ChatCompletionOptions` argument when the same instance was passed into concurrent calls of `CompleteChat`/`CompleteChatAsync` and/or `CompleteChatStreaming`/`CompleteChatStreamingAsync`. |
| 95 | +- OpenAI.Realtime: |
| 96 | + - Fixed an issue causing permanent state corruption when sending audio was cancelled in `RealtimeSessionClient`. |
| 97 | + - Fixed an issue with `RealtimeSessionClient` always requiring an API key. |
| 98 | +- OpenAI.Responses: |
| 99 | + - Fixed a concurrency issue corrupting the state of the `CreateResponseOptions` argument when the same instance was passed into concurrent calls of `CreateResponse`/`CreateResponseAsync` and/or `CreateResponseStreaming`/`CreateResponseStreamingAsync`. |
| 100 | + |
| 101 | +### Other Changes |
| 102 | + |
| 103 | +- Updated the `System.ClientModel` dependency to version 1.9.0. For more information, see the [System.ClientModel changelog](https://github.com/Azure/azure-sdk-for-net/blob/System.ClientModel_1.9.0/sdk/core/System.ClientModel/CHANGELOG.md). |
| 104 | + |
| 105 | +### Breaking Changes in Preview APIs |
| 106 | + |
| 107 | +- OpenAI.Images: |
| 108 | + - Changed the type of the `InputTokenCount`, `OutputTokenCount`, and `TotalTokenCount` properties of `ImageTokenUsage` from `int` to `long`. |
| 109 | +- OpenAI.Realtime: |
| 110 | + - This release migrates the implementation of the Realtime API from the beta REST API to the GA REST API. As such, it contains numerous breaking changes, including the following: |
| 111 | + - Renamed `RealtimeSession` to `RealtimeSessionClient`. |
| 112 | + - Renamed `ConversationTool` to `RealtimeTool` and exposed all supported tools as derived types: |
| 113 | + - `RealtimeFunctionTool` |
| 114 | + - `RealtimeMcpTool` |
| 115 | + - Changed `RealtimeItem` into a class hierarchy and exposed all supported item types as derived types: |
| 116 | + - `RealtimeMessageItem` |
| 117 | + - `RealtimeFunctionCallItem` |
| 118 | + - `RealtimeFunctionCallOutputItem` |
| 119 | + - `RealtimeMcpToolCallItem` |
| 120 | + - `RealtimeMcpToolDefinitionListItem` |
| 121 | + - `RealtimeMcpToolCallApprovalRequestItem` |
| 122 | + - `RealtimeMcpToolCallApprovalResponseItem` |
| 123 | + - Renamed `RealtimeUpdate` to `RealtimeServerUpdate` and exposed all supported server events as derived types: |
| 124 | + - `RealtimeServerUpdateConversationCreated` |
| 125 | + - `RealtimeServerUpdateConversationItemAdded` |
| 126 | + - `RealtimeServerUpdateConversationItemCreated` |
| 127 | + - `RealtimeServerUpdateConversationItemDeleted` |
| 128 | + - `RealtimeServerUpdateConversationItemDone` |
| 129 | + - `RealtimeServerUpdateConversationItemInputAudioTranscriptionCompleted` |
| 130 | + - `RealtimeServerUpdateConversationItemInputAudioTranscriptionDelta` |
| 131 | + - `RealtimeServerUpdateConversationItemInputAudioTranscriptionFailed` |
| 132 | + - `RealtimeServerUpdateConversationItemInputAudioTranscriptionSegment` |
| 133 | + - `RealtimeServerUpdateConversationItemRetrieved` |
| 134 | + - `RealtimeServerUpdateConversationItemTruncated` |
| 135 | + - `RealtimeServerUpdateError` |
| 136 | + - `RealtimeServerUpdateInputAudioBufferCleared` |
| 137 | + - `RealtimeServerUpdateInputAudioBufferCommitted` |
| 138 | + - `RealtimeServerUpdateInputAudioBufferDtmfEventReceived` |
| 139 | + - `RealtimeServerUpdateInputAudioBufferSpeechStarted` |
| 140 | + - `RealtimeServerUpdateInputAudioBufferSpeechStopped` |
| 141 | + - `RealtimeServerUpdateInputAudioBufferTimeoutTriggered` |
| 142 | + - `RealtimeServerUpdateMcpListToolsCompleted` |
| 143 | + - `RealtimeServerUpdateMcpListToolsFailed` |
| 144 | + - `RealtimeServerUpdateMcpListToolsInProgress` |
| 145 | + - `RealtimeServerUpdateOutputAudioBufferCleared` |
| 146 | + - `RealtimeServerUpdateOutputAudioBufferStarted` |
| 147 | + - `RealtimeServerUpdateOutputAudioBufferStopped` |
| 148 | + - `RealtimeServerUpdateRateLimitsUpdated` |
| 149 | + - `RealtimeServerUpdateResponseContentPartAdded` |
| 150 | + - `RealtimeServerUpdateResponseContentPartDone` |
| 151 | + - `RealtimeServerUpdateResponseCreated` |
| 152 | + - `RealtimeServerUpdateResponseDone` |
| 153 | + - `RealtimeServerUpdateResponseFunctionCallArgumentsDelta` |
| 154 | + - `RealtimeServerUpdateResponseFunctionCallArgumentsDone` |
| 155 | + - `RealtimeServerUpdateResponseMcpCallArgumentsDelta` |
| 156 | + - `RealtimeServerUpdateResponseMcpCallArgumentsDone` |
| 157 | + - `RealtimeServerUpdateResponseMcpCallCompleted` |
| 158 | + - `RealtimeServerUpdateResponseMcpCallFailed` |
| 159 | + - `RealtimeServerUpdateResponseMcpCallInProgress` |
| 160 | + - `RealtimeServerUpdateResponseOutputAudioDelta` |
| 161 | + - `RealtimeServerUpdateResponseOutputAudioDone` |
| 162 | + - `RealtimeServerUpdateResponseOutputAudioTranscriptDelta` |
| 163 | + - `RealtimeServerUpdateResponseOutputAudioTranscriptDone` |
| 164 | + - `RealtimeServerUpdateResponseOutputItemAdded` |
| 165 | + - `RealtimeServerUpdateResponseOutputItemDone` |
| 166 | + - `RealtimeServerUpdateResponseOutputTextDelta` |
| 167 | + - `RealtimeServerUpdateResponseOutputTextDone` |
| 168 | + - `RealtimeServerUpdateSessionCreated` |
| 169 | + - `RealtimeServerUpdateSessionUpdated` |
| 170 | + - We recommend checking out our [examples](https://github.com/openai/openai-dotnet/tree/main/examples/Realtime) and tests as well as the [migration guide](https://developers.openai.com/api/docs/guides/realtime/#beta-to-ga-migration) for tips on how to use the new API surface. |
| 171 | +- OpenAI.Responses: |
| 172 | + - Removed the `Model` property of the `ResponsesClient` in favor of specifying the model on a per-call basis when calling `CreateResponse`/`CreateResponseAsync` or `CreateResponseStreaming`/`CreateResponseStreamingAsync`. To do this, set the `Model` property of the `CreateResponseOptions` parameter. With this change, users no longer have to provide a model unless it is actually needed. |
| 173 | + - Changed the type of the `Instructions` property of `ResponseResult` from `string` to `IList<ResponseItem>` to handle multi-item instructions. |
| 174 | + |
3 | 175 | ## 2.8.0 (2025-12-11) |
4 | 176 |
|
5 | 177 | ### Features Added |
|
0 commit comments