diff --git a/CHANGELOG.md b/CHANGELOG.md
index 1fa18de48..549fc48c9 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,5 +1,130 @@
# Release History
+## 2.4.0 (2025-09-05)
+
+### Features Added
+
+- OpenAI.Audio:
+ - Added the `Endpoint` property to `AudioClient`.
+- OpenAI.Batch:
+ - Added the `Endpoint` property to `BatchClient`.
+- OpenAI.Chat:
+ - Added the `Endpoint` property to `ChatClient`.
+ - Added the `ServiceTier` property to `ChatCompletionOptions`, `ChatCompletion`, and `StreamingChatCompletionUpdate` to configure the policy that the server will use to process the request in terms of pricing, performance, etc.
+ - Added an explicit conversion operator to `ChatCompletion` and `ChatCompletionDeletionResult` to convert from `ClientResult`.
+- OpenAI.Containers:
+ - Added the `Endpoint` property to `ContainerClient`.
+ - Added convenience counterparts to the protocol methods of `ContainerClient` that use the strongly-typed model classes.
+ - Added automatic pagination support to the following methods of `ContainerClient`:
+ - `GetContainers` and `GetContainersAsync`
+ - `GetContainerFiles` and `GetContainerFilesAsync`
+ - Added an explicit conversion operator to `ContainerResource`, `ContainerFileResource`, `DeleteContainerResponse`, and `DeleteContainerFileResponse` to convert from `ClientResult`.
+- OpenAI.Embeddings:
+ - Added the `Endpoint` property to `EmbeddingsClient`.
+ - Added an explicit conversion operator to `OpenAIEmbeddingCollection` to convert from `ClientResult`.
+- OpenAI.Evals:
+ - Added the `Endpoint` property to `EvaluationClient`.
+- OpenAI.Files:
+ - Added the `Endpoint` property to `OpenAIFileClient`.
+ - Added an explicit conversion operator to `OpenAIFile`, `OpenAIFileCollection`, and `FileDeletionResult` to convert from `ClientResult`.
+- OpenAI.FineTuning:
+ - Added the `Endpoint` property to `FineTuningClient`.
+- OpenAI.Graders:
+ - Added the `Endpoint` property to `GraderClient`.
+ - Added an explicit conversion operator to `RunGraderResponse` and `ValidateGraderResponse` to convert from `ClientResult`.
+- OpenAI.Images:
+ - Added the `Endpoint` property to `ImageClient`.
+ - Added an explicit conversion operator to `GeneratedImageCollection` to convert from `ClientResult`.
+ - Added the `Background` property to `ImageEditOptions` to set transparency for the background of the generated image(s).
+ - Added the `Quality` property to `ImageEditOptions` to set the quality of the generated image(s).
+- OpenAI.Images:
+ - Added the `Endpoint` property to `ImageClient`.
+ - Added an explicit conversion operator to `GeneratedImageCollection` to convert from `ClientResult`.
+ - Added the `Background` property to `ImageEditOptions` to set transparency for the background of the generated image(s).
+ - Added the `Quality` property to `ImageEditOptions` to set the quality of the generated image(s).
+- OpenAI.Models:
+ - Added the `Endpoint` property to `OpenAIModelClient`.
+ - Added an explicit conversion operator to `OpenAIModel`, `OpenAIModelCollection`, and `ModelDeletionResult` to convert from `ClientResult`.
+- OpenAI.Moderations:
+ - Added the `Endpoint` property to `ModerationClient`.
+ - Added an explicit conversion operator to `ModerationResultCollection` to convert from `ClientResult`.
+- OpenAI.Realtime:
+ - Added a constructor that can take a string API key to `RealtimeClient`.
+ - Added constructors that can take a custom `AuthenticationPolicy` to `RealtimeClient`.
+ - Added the `Endpoint` property to `RealtimeClient`.
+ - Replaced the `RequestOptions` parameter of the following methods of `RealtimeClient` for a new `RealtimeSessionOptions` parameter and a `CancellationToken` parameter:
+ - `StartConversationSession` and `StartConversationSessionAsync`
+ - `StartTranscriptionSession` and `StartTranscriptionSessionAsync`
+ - `StartSession` and `StartSessionAsync`
+- OpenAI.Responses:
+ - Added the `Endpoint` property to `OpenAIResponseClient`.
+ - Added an explicit conversion operator to `OpenAIResponse` to convert from `ClientResult`.
+ - Added new classes derived from `ResponseTool` to facilitate certain scenarios:
+ - `FunctionTool`
+ - `FileSearchTool`
+ - `WebSearchTool`
+ - `ComputerTool`
+ - Added initial support for integrating with remote MCP servers via the Responses API in streaming and non-streaming scenarios.
+ - Users can add the new `McpTool` to the `Tools` property of their `ResponseCreationOptions` and configure it.
+ - Use the `AllowedTools` property to limit which of the server tools can be called by the model.
+ - Use the `ToolCallApprovalPolicy` property to specify which tools require an explicit approval before being called by the model.
+ - Support for selecting the `McpTool` via the `ToolChoice` property is coming soon.
+ - Support for configuring the `McpTool` with an access token that can be used to authenticate with the remote MCP server is coming soon.
+ - Support for connectors is coming soon.
+ - Added new classes derived from `ResponseMessageAnnotation` to facilitate certain scenarios:
+ - `FileCitationMessageAnnotation`
+ - `FilePathMessageAnnotation`
+ - `UriCitationMessageAnnotation`
+ - Added the `ServiceTier` property to `ResponseCreationOptions`, `OpenAIResponse`, and `StreamingChatCompletionUpdate` to configure the policy that the server will use to process the request in terms of pricing, performance, etc.
+- OpenAI.VectorStores:
+ - Added the `Endpoint` property to `OpenAIResponseClient`.
+ - Added an explicit conversion operator to `VectorStore`, `VectorStoreFile`, `VectorStoreFileBatch`, `VectorStoreDeletionResult`, and `FileFromStoreRemovalResult` to convert from `ClientResult`.
+
+### Bug Fixed
+
+- OpenAI.Realtime:
+ - Fixed an issue with the classes derived from `ResponseItem` (such as `ReasoningResponseItem`) missing some constructors or property setters, which made it difficult to use them as inputs.
+ - Fixed an issue with the HTTP pipeline of the `RealtimeClient` that was preventing the following methods from working correctly:
+ - `CreateEphemeralToken` and `CreateEphemeralTokenAsync`
+ - `CreateEphemeralTranscriptionToken` and `CreateEphemeralTranscriptionTokenAsync`
+
+### Breaking Changes in Preview APIs
+
+- OpenAI.Chat:
+ - Changed the type of the `options` parameter of the `GetChatCompletionMessages` method of the `ChatClient` from `ChatCompletionCollectionOptions` to `ChatCompletionMessageCollectionOptions`.
+- OpenAI.Realtime:
+ - Replaced the `RequestOptions` parameter for a new `RealtimeSessionOptions` parameter and a `CancellationToken` parameter.
+- OpenAI.Responses:
+ - Renamed the `Background` property to `BackgroundModeEnabled` for clarity.
+ - Renamed the `ComputerOutput` class to `ComputerCallOutput`.
+ - Changed the type of the `Delta` property of `StreamingResponseFunctionCallArgumentsDeltaUpdate` from `string` to `BinaryData`.
+ - Changed the type of the `Arguments` property of `StreamingResponseFunctionCallArgumentsDoneUpdate` from `string` to `BinaryData` and renamed it to `FunctionArguments`.
+ - Renamed the `WebSearchContextSize` class to `WebSearchToolContextSize`.
+ - Renamed the `WebSearchUserLocation` class to `WebSearchToolLocation`.
+ - Refactored the factory methods of `ResponseItem`.
+ - Refactored the factory methods of `ResponseTool`.
+ - Removed the properties of `ResponseMessageAnnotation` except for the `Kind` property and moved them to the new derived types.
+- OpenAI.VectorStores:
+ - Removed the `OperationResult` pattern along with the `CreateVectorStoreOperation` `AddFileToVectorStoreOperation`, and `CreateBatchFileJobOperation` classes.
+ - Renamed the `VectorStoreBatchFileJob` class to `VectorStoreFileBatch`
+ - Renamed the `VectorStoreFileAssociation` class to `VectorStoreFile`
+ - Renamed the `VectorStoreFileAssociationError` class to `VectorStoreFileError`
+ - Renamed the `VectorStoreFileAssociationStatus` class to `VectorStoreFileStatus`
+ - Renamed the `VectorStoreFileAssociationErrorCode` class to `VectorStoreFileErrorCode`
+ - Renamed the `VectorStoreFileAssociationCollectionOptions` class to `VectorStoreFileCollectionOptions`
+ - Renamed the `VectorStoreFileAssociationCollectionOrder` class to `VectorStoreFileCollectionOrder`
+ - Renamed the `CancelBatchFileJob` and `CancelBatchFileJobAsync` methods of `VectorStoreClient` to `CancelVectorStoreFileBatch` and `CancelVectorStoreFileBatchAsync`
+ - Renamed the `CreateBatchFileJob` and `CreateBatchFileJobAsync` methods of `VectorStoreClient` to `AddFileBatchToVectorStore` and `AddFileBatchToVectorStoreAsync`
+ - Renamed the `GetBatchFileJob` and `GetBatchFileJobAsync` methods of `VectorStoreClient` to `GetVectorStoreFileBatch` and `GetVectorStoreFileBatchAsync`
+ - Renamed the `GetFileAssociation` and `GetFileAssociationAsync` methods of `VectorStoreClient` to `GetVectorStoreFile` and `GetVectorStoreFileAsync`
+ - Renamed the `GetFileAssociations` and `GetFileAssociationsAsync` methods of `VectorStoreClient` to `GetVectorStoreFiles` and `GetVectorStoreFilesAsync`
+ - Renamed the `GetFileAssociationsInBatch` and `GetFileAssociationsInBatchAsync` methods of `VectorStoreClient` to `GetVectorStoreFilesInBatch` and `GetVectorStoreFilesInBatchAsync`
+ - Renamed the `RemoveFileFromStore` and `RemoveFileFromStoreAsync` methods of `VectorStoreClient` to `RemoveFileFromVectorStore` and `RemoveFileFromVectorStoreAsync`
+
+### Other Changes
+
+- Updated the `System.ClientModel` dependency to version 1.6.1.
+
## 2.3.0 (2025-08-01)
### Features Added
diff --git a/scripts/Export-Api.ps1 b/scripts/Export-Api.ps1
index 50708a4e8..10deef823 100644
--- a/scripts/Export-Api.ps1
+++ b/scripts/Export-Api.ps1
@@ -107,7 +107,7 @@ function Invoke-GenAPI {
Write-Output ""
# System.ClientModel
- $systemClientModelPath = Join-Path $nugetPackagesPath "system.clientmodel\1.4.2"
+ $systemClientModelPath = Join-Path $nugetPackagesPath "system.clientmodel\1.6.1"
$systemClientModelRef = $null
if (Test-Path $systemClientModelPath) {
$systemClientModelRef = Get-ChildItem `
@@ -152,7 +152,7 @@ function Invoke-GenAPI {
Write-Output ""
# System.Memory.Data
- $systemMemoryDataPath = Join-Path $nugetPackagesPath "system.memory.data\6.0.1"
+ $systemMemoryDataPath = Join-Path $nugetPackagesPath "system.memory.data\8.0.1"
$systemMemoryDataRef = $null
if (Test-Path $systemMemoryDataPath) {
$systemMemoryDataRef = Get-ChildItem `
@@ -168,7 +168,7 @@ function Invoke-GenAPI {
if ($TargetFramework -eq "netstandard2.0") {
# System.Diagnostics.DiagnosticSource
- $systemDiagnosticsDiagnosticSourcePath = Join-Path $nugetPackagesPath "system.diagnostics.diagnosticsource\6.0.1"
+ $systemDiagnosticsDiagnosticSourcePath = Join-Path $nugetPackagesPath "system.diagnostics.diagnosticsource\8.0.1"
$systemDiagnosticsDiagnosticSourceRef = $null
if (Test-Path $systemDiagnosticsDiagnosticSourcePath) {
$systemDiagnosticsDiagnosticSourceRef = Get-ChildItem `
@@ -183,7 +183,7 @@ function Invoke-GenAPI {
Write-Output ""
# Microsoft.Bcl.AsyncInterfaces
- $microsoftBclAsyncInterfacesPath = Join-Path $nugetPackagesPath "microsoft.bcl.asyncinterfaces\1.1.0"
+ $microsoftBclAsyncInterfacesPath = Join-Path $nugetPackagesPath "microsoft.bcl.asyncinterfaces\8.0.0"
$microsoftBclAsyncInterfacesRef = $null
if (Test-Path $microsoftBclAsyncInterfacesPath) {
$microsoftBclAsyncInterfacesRef = Get-ChildItem `
diff --git a/scripts/Test-ApiCompatibility.ps1 b/scripts/Test-ApiCompatibility.ps1
index f69ac9311..aed045b08 100644
--- a/scripts/Test-ApiCompatibility.ps1
+++ b/scripts/Test-ApiCompatibility.ps1
@@ -177,5 +177,5 @@ $experimentalNamespaces = @(
Invoke-APICompat -ProjectPath $projectPath `
-ReleasePath $releasePath `
-PackageName "OpenAI" `
- -BaselineVersion "2.2.0" `
+ -BaselineVersion "2.3.0" `
-IgnoredNamespaces $experimentalNamespaces
\ No newline at end of file
diff --git a/src/OpenAI.csproj b/src/OpenAI.csproj
index 27a8cf9a6..f269152bb 100644
--- a/src/OpenAI.csproj
+++ b/src/OpenAI.csproj
@@ -8,7 +8,7 @@
MIT
Copyright (c) 2024 OpenAI (https://openai.com)
- 2.3.0
+ 2.4.0
net8.0;netstandard2.0