From 96778996009b30e55d5f3d8135640a79fcada5c8 Mon Sep 17 00:00:00 2001 From: Trung Hieu <81826098+htilssu@users.noreply.github.com> Date: Thu, 16 Oct 2025 16:24:00 +0700 Subject: [PATCH] .NET: Duplicate System Instruction when creating a ChatClientAgentOptions instance with the constructor (#1382) * unit test for using create agent option by constructor * remove this for prevent duplicate when ChatClientAgentOption and ChatOption has same Instruction * update unit test for ChatClientAgentOptions --- .../ChatClient/ChatClientAgentOptions.cs | 5 ---- .../ChatClient/ChatClientAgentOptionsTests.cs | 17 +++++++------ .../ChatClient/ChatClientAgentTests.cs | 25 +++++++++++++++++++ 3 files changed, 35 insertions(+), 12 deletions(-) diff --git a/dotnet/src/Microsoft.Agents.AI/ChatClient/ChatClientAgentOptions.cs b/dotnet/src/Microsoft.Agents.AI/ChatClient/ChatClientAgentOptions.cs index b51b86c64e..aede5ef3cb 100644 --- a/dotnet/src/Microsoft.Agents.AI/ChatClient/ChatClientAgentOptions.cs +++ b/dotnet/src/Microsoft.Agents.AI/ChatClient/ChatClientAgentOptions.cs @@ -44,11 +44,6 @@ public class ChatClientAgentOptions { (this.ChatOptions ??= new()).Tools = tools; } - - if (instructions is not null) - { - (this.ChatOptions ??= new()).Instructions = instructions; - } } /// diff --git a/dotnet/tests/Microsoft.Agents.AI.UnitTests/ChatClient/ChatClientAgentOptionsTests.cs b/dotnet/tests/Microsoft.Agents.AI.UnitTests/ChatClient/ChatClientAgentOptionsTests.cs index 71768d83d2..dc983ef202 100644 --- a/dotnet/tests/Microsoft.Agents.AI.UnitTests/ChatClient/ChatClientAgentOptionsTests.cs +++ b/dotnet/tests/Microsoft.Agents.AI.UnitTests/ChatClient/ChatClientAgentOptionsTests.cs @@ -61,9 +61,7 @@ public class ChatClientAgentOptionsTests Assert.Null(options.Name); Assert.Equal(Instructions, options.Instructions); Assert.Null(options.Description); - Assert.NotNull(options.ChatOptions); - Assert.Equal(Instructions, options.ChatOptions.Instructions); - Assert.Null(options.ChatOptions.Tools); + Assert.Null(options.ChatOptions); } [Fact] @@ -107,7 +105,7 @@ public class ChatClientAgentOptionsTests Assert.Equal(Instructions, options.Instructions); Assert.Null(options.Description); Assert.NotNull(options.ChatOptions); - Assert.Equal(Instructions, options.ChatOptions.Instructions); + Assert.Null(options.ChatOptions.Instructions); Assert.Same(tools, options.ChatOptions.Tools); } @@ -132,7 +130,7 @@ public class ChatClientAgentOptionsTests Assert.Equal(Instructions, options.Instructions); Assert.Equal(Description, options.Description); Assert.NotNull(options.ChatOptions); - Assert.Equal(Instructions, options.ChatOptions.Instructions); + Assert.Null(options.ChatOptions.Instructions); Assert.Same(tools, options.ChatOptions.Tools); } @@ -165,8 +163,13 @@ public class ChatClientAgentOptionsTests const string Name = "Test name"; const string Description = "Test description"; var tools = new List { AIFunctionFactory.Create(() => "test") }; - static ChatMessageStore ChatMessageStoreFactory(ChatClientAgentOptions.ChatMessageStoreFactoryContext ctx) => new Mock().Object; - static AIContextProvider AIContextProviderFactory(ChatClientAgentOptions.AIContextProviderFactoryContext ctx) => new Mock().Object; + + static ChatMessageStore ChatMessageStoreFactory( + ChatClientAgentOptions.ChatMessageStoreFactoryContext ctx) => new Mock().Object; + + static AIContextProvider AIContextProviderFactory( + ChatClientAgentOptions.AIContextProviderFactoryContext ctx) => + new Mock().Object; var original = new ChatClientAgentOptions(Instructions, Name, Description, tools) { diff --git a/dotnet/tests/Microsoft.Agents.AI.UnitTests/ChatClient/ChatClientAgentTests.cs b/dotnet/tests/Microsoft.Agents.AI.UnitTests/ChatClient/ChatClientAgentTests.cs index 9b9f0736ac..f20f7fe082 100644 --- a/dotnet/tests/Microsoft.Agents.AI.UnitTests/ChatClient/ChatClientAgentTests.cs +++ b/dotnet/tests/Microsoft.Agents.AI.UnitTests/ChatClient/ChatClientAgentTests.cs @@ -1012,6 +1012,31 @@ public partial class ChatClientAgentTests Assert.Equal("test instructions", capturedChatOptions.Instructions); } + [Fact] + public async Task ChatOptionsMergingUsesAgentOptionsConstructorWhenRequestHasNoneAsync() + { + Mock mockService = new(); + ChatOptions? capturedChatOptions = null; + mockService.Setup( + s => s.GetResponseAsync( + It.IsAny>(), + It.IsAny(), + It.IsAny())) + .Callback, ChatOptions, CancellationToken>((msgs, opts, ct) => + capturedChatOptions = opts) + .ReturnsAsync(new ChatResponse([new(ChatRole.Assistant, "response")])); + + ChatClientAgent agent = new(mockService.Object, options: new("test instructions")); + var messages = new List { new(ChatRole.User, "test") }; + + // Act + await agent.RunAsync(messages); + + // Assert + Assert.NotNull(capturedChatOptions); + Assert.Equal("test instructions", capturedChatOptions.Instructions); + } + /// /// Verify that ChatOptions merging works when request has ChatOptions but agent doesn't. ///