diff --git a/dotnet/src/Microsoft.Agents.AI.AzureAI/ProjectResponsesClientExtensions.cs b/dotnet/src/Microsoft.Agents.AI.AzureAI/ProjectResponsesClientExtensions.cs
new file mode 100644
index 0000000000..5a899d5076
--- /dev/null
+++ b/dotnet/src/Microsoft.Agents.AI.AzureAI/ProjectResponsesClientExtensions.cs
@@ -0,0 +1,60 @@
+// Copyright (c) Microsoft. All rights reserved.
+
+using System.Diagnostics.CodeAnalysis;
+using Microsoft.Extensions.AI;
+using Microsoft.Shared.DiagnosticIds;
+using Microsoft.Shared.Diagnostics;
+using OpenAI.Responses;
+
+namespace Azure.AI.Extensions.OpenAI;
+
+///
+/// Provides extension methods for
+/// to simplify the creation of AI agents that work with Azure AI services.
+///
+[Experimental(DiagnosticIds.Experiments.AIOpenAIResponses)]
+public static class ProjectResponsesClientExtensions
+{
+ ///
+ /// Gets an for use with this that does not store responses for later retrieval.
+ ///
+ ///
+ /// This corresponds to setting the "store" property in the JSON representation to false.
+ ///
+ /// The client.
+ /// Optional deployment name (model) to use for requests.
+ ///
+ /// Includes an encrypted version of reasoning tokens in reasoning item outputs.
+ /// This enables reasoning items to be used in multi-turn conversations when using the Responses API statelessly
+ /// (like when the store parameter is set to false, or when an organization is enrolled in the zero data retention program).
+ /// Defaults to .
+ ///
+ /// An that can be used to converse via the that does not store responses for later retrieval.
+ /// is .
+ [Experimental(DiagnosticIds.Experiments.AgentsAIExperiments)]
+ public static IChatClient AsIChatClientWithStoredOutputDisabled(this ProjectResponsesClient responseClient, string? deploymentName = null, bool includeReasoningEncryptedContent = true)
+ {
+ return Throw.IfNull(responseClient)
+ .AsIChatClient(deploymentName)
+ .AsBuilder()
+ .ConfigureOptions(x =>
+ {
+ var previousFactory = x.RawRepresentationFactory;
+ x.RawRepresentationFactory = state =>
+ {
+ var responseOptions = previousFactory?.Invoke(state) as CreateResponseOptions ?? new CreateResponseOptions();
+
+ responseOptions.StoredOutputEnabled = false;
+
+ if (includeReasoningEncryptedContent &&
+ !responseOptions.IncludedProperties.Contains(IncludedResponseProperty.ReasoningEncryptedContent))
+ {
+ responseOptions.IncludedProperties.Add(IncludedResponseProperty.ReasoningEncryptedContent);
+ }
+
+ return responseOptions;
+ };
+ })
+ .Build();
+ }
+}
diff --git a/dotnet/src/Microsoft.Agents.AI.OpenAI/Extensions/OpenAIResponseClientExtensions.cs b/dotnet/src/Microsoft.Agents.AI.OpenAI/Extensions/OpenAIResponseClientExtensions.cs
index 5aee8eb046..4ceff75743 100644
--- a/dotnet/src/Microsoft.Agents.AI.OpenAI/Extensions/OpenAIResponseClientExtensions.cs
+++ b/dotnet/src/Microsoft.Agents.AI.OpenAI/Extensions/OpenAIResponseClientExtensions.cs
@@ -105,7 +105,7 @@ public static ChatClientAgent AsAIAgent(
/// This corresponds to setting the "store" property in the JSON representation to false.
///
/// The client.
- /// Optional default model ID to use for requests. Required when using a plain (not via Azure OpenAI).
+ /// Optional default model ID to use for requests.
///
/// Includes an encrypted version of reasoning tokens in reasoning item outputs.
/// This enables reasoning items to be used in multi-turn conversations when using the Responses API statelessly
diff --git a/dotnet/tests/Microsoft.Agents.AI.AzureAI.UnitTests/ProjectResponsesClientExtensionsTests.cs b/dotnet/tests/Microsoft.Agents.AI.AzureAI.UnitTests/ProjectResponsesClientExtensionsTests.cs
new file mode 100644
index 0000000000..d10ef861c9
--- /dev/null
+++ b/dotnet/tests/Microsoft.Agents.AI.AzureAI.UnitTests/ProjectResponsesClientExtensionsTests.cs
@@ -0,0 +1,169 @@
+// Copyright (c) Microsoft. All rights reserved.
+
+using System;
+using System.Reflection;
+using Azure.AI.Extensions.OpenAI;
+using Microsoft.Extensions.AI;
+using OpenAI.Responses;
+
+namespace Microsoft.Agents.AI.AzureAI.UnitTests;
+
+///
+/// Unit tests for the class.
+///
+public sealed class ProjectResponsesClientExtensionsTests
+{
+ private static ProjectResponsesClient CreateTestClient()
+ {
+ return new ProjectResponsesClient(new FakeAuthenticationTokenProvider());
+ }
+
+ ///
+ /// Verify that AsIChatClientWithStoredOutputDisabled throws ArgumentNullException when client is null.
+ ///
+ [Fact]
+ public void AsIChatClientWithStoredOutputDisabled_WithNullClient_ThrowsArgumentNullException()
+ {
+ // Act & Assert
+ var exception = Assert.Throws(() =>
+ ((ProjectResponsesClient)null!).AsIChatClientWithStoredOutputDisabled());
+
+ Assert.Equal("responseClient", exception.ParamName);
+ }
+
+ ///
+ /// Verify that AsIChatClientWithStoredOutputDisabled wraps the original ProjectResponsesClient,
+ /// which remains accessible via the service chain.
+ ///
+ [Fact]
+ public void AsIChatClientWithStoredOutputDisabled_InnerResponsesClientIsAccessible()
+ {
+ // Arrange
+ var responseClient = CreateTestClient();
+
+ // Act
+ var chatClient = responseClient.AsIChatClientWithStoredOutputDisabled();
+
+ // Assert - the inner ProjectResponsesClient should be accessible via GetService
+ var innerClient = chatClient.GetService();
+ Assert.NotNull(innerClient);
+ Assert.Same(responseClient, innerClient);
+ }
+
+ ///
+ /// Verify that AsIChatClientWithStoredOutputDisabled with includeReasoningEncryptedContent false
+ /// wraps the original ProjectResponsesClient, which remains accessible via the service chain.
+ ///
+ [Fact]
+ public void AsIChatClientWithStoredOutputDisabled_WithIncludeReasoningFalse_InnerResponsesClientIsAccessible()
+ {
+ // Arrange
+ var responseClient = CreateTestClient();
+
+ // Act
+ var chatClient = responseClient.AsIChatClientWithStoredOutputDisabled(includeReasoningEncryptedContent: false);
+
+ // Assert - the inner ProjectResponsesClient should be accessible via GetService
+ var innerClient = chatClient.GetService();
+ Assert.NotNull(innerClient);
+ Assert.Same(responseClient, innerClient);
+ }
+
+ ///
+ /// Verify that AsIChatClientWithStoredOutputDisabled with default parameter (includeReasoningEncryptedContent = true)
+ /// configures StoredOutputEnabled to false and includes ReasoningEncryptedContent in IncludedProperties.
+ ///
+ [Fact]
+ public void AsIChatClientWithStoredOutputDisabled_Default_ConfiguresStoredOutputDisabledWithReasoningEncryptedContent()
+ {
+ // Arrange
+ var responseClient = CreateTestClient();
+
+ // Act
+ var chatClient = responseClient.AsIChatClientWithStoredOutputDisabled();
+
+ // Assert
+ var createResponseOptions = GetCreateResponseOptionsFromPipeline(chatClient);
+ Assert.NotNull(createResponseOptions);
+ Assert.False(createResponseOptions.StoredOutputEnabled);
+ Assert.Contains(IncludedResponseProperty.ReasoningEncryptedContent, createResponseOptions.IncludedProperties);
+ }
+
+ ///
+ /// Verify that AsIChatClientWithStoredOutputDisabled with includeReasoningEncryptedContent explicitly set to true
+ /// configures StoredOutputEnabled to false and includes ReasoningEncryptedContent in IncludedProperties.
+ ///
+ [Fact]
+ public void AsIChatClientWithStoredOutputDisabled_WithIncludeReasoningTrue_ConfiguresStoredOutputDisabledWithReasoningEncryptedContent()
+ {
+ // Arrange
+ var responseClient = CreateTestClient();
+
+ // Act
+ var chatClient = responseClient.AsIChatClientWithStoredOutputDisabled(includeReasoningEncryptedContent: true);
+
+ // Assert
+ var createResponseOptions = GetCreateResponseOptionsFromPipeline(chatClient);
+ Assert.NotNull(createResponseOptions);
+ Assert.False(createResponseOptions.StoredOutputEnabled);
+ Assert.Contains(IncludedResponseProperty.ReasoningEncryptedContent, createResponseOptions.IncludedProperties);
+ }
+
+ ///
+ /// Verify that AsIChatClientWithStoredOutputDisabled with includeReasoningEncryptedContent set to false
+ /// configures StoredOutputEnabled to false and does not include ReasoningEncryptedContent in IncludedProperties.
+ ///
+ [Fact]
+ public void AsIChatClientWithStoredOutputDisabled_WithIncludeReasoningFalse_ConfiguresStoredOutputDisabledWithoutReasoningEncryptedContent()
+ {
+ // Arrange
+ var responseClient = CreateTestClient();
+
+ // Act
+ var chatClient = responseClient.AsIChatClientWithStoredOutputDisabled(includeReasoningEncryptedContent: false);
+
+ // Assert
+ var createResponseOptions = GetCreateResponseOptionsFromPipeline(chatClient);
+ Assert.NotNull(createResponseOptions);
+ Assert.False(createResponseOptions.StoredOutputEnabled);
+ Assert.DoesNotContain(IncludedResponseProperty.ReasoningEncryptedContent, createResponseOptions.IncludedProperties);
+ }
+
+ ///
+ /// Verify that AsIChatClientWithStoredOutputDisabled works with an optional deployment name.
+ ///
+ [Fact]
+ public void AsIChatClientWithStoredOutputDisabled_WithDeploymentName_ConfiguresStoredOutputDisabled()
+ {
+ // Arrange
+ var responseClient = CreateTestClient();
+
+ // Act
+ var chatClient = responseClient.AsIChatClientWithStoredOutputDisabled(deploymentName: "my-deployment");
+
+ // Assert
+ var createResponseOptions = GetCreateResponseOptionsFromPipeline(chatClient);
+ Assert.NotNull(createResponseOptions);
+ Assert.False(createResponseOptions.StoredOutputEnabled);
+ Assert.Contains(IncludedResponseProperty.ReasoningEncryptedContent, createResponseOptions.IncludedProperties);
+ }
+
+ ///
+ /// Extracts the produced by the ConfigureOptions pipeline
+ /// by using reflection to access the configure action and invoking it on a test .
+ ///
+ private static CreateResponseOptions? GetCreateResponseOptionsFromPipeline(IChatClient chatClient)
+ {
+ var configureField = chatClient.GetType().GetField("_configureOptions", BindingFlags.NonPublic | BindingFlags.Instance);
+ Assert.NotNull(configureField);
+
+ var configureAction = configureField.GetValue(chatClient) as Action;
+ Assert.NotNull(configureAction);
+
+ var options = new ChatOptions();
+ configureAction(options);
+
+ Assert.NotNull(options.RawRepresentationFactory);
+ return options.RawRepresentationFactory(chatClient) as CreateResponseOptions;
+ }
+}