From 23644ac6a78167d07a1959c017750438511d7896 Mon Sep 17 00:00:00 2001 From: Daichi Isami Date: Wed, 4 Mar 2026 13:40:34 -0800 Subject: [PATCH] .NET: bug fix for duplicate output on GitHubCopilotAgent (#3981) * bug fix for duplicate output on GitHubCopilotAgent * Add Test code for bug fix of duplicate output on GitHubCopilotAgenttT * update Test code for bug fix of duplicate output on GitHubCopilotAgenttT * update Test for duplicate output of GitHubCopilotAgent --------- Co-authored-by: Mark Wallace <127216156+markwallace-microsoft@users.noreply.github.com> Co-authored-by: Dmytro Struk <13853051+dmytrostruk@users.noreply.github.com> --- .../GitHubCopilotAgent.cs | 6 ++--- .../GitHubCopilotAgentTests.cs | 22 +++++++++++++++++++ 2 files changed, 25 insertions(+), 3 deletions(-) diff --git a/dotnet/src/Microsoft.Agents.AI.GitHub.Copilot/GitHubCopilotAgent.cs b/dotnet/src/Microsoft.Agents.AI.GitHub.Copilot/GitHubCopilotAgent.cs index c966f591fc..bbebd7a312 100644 --- a/dotnet/src/Microsoft.Agents.AI.GitHub.Copilot/GitHubCopilotAgent.cs +++ b/dotnet/src/Microsoft.Agents.AI.GitHub.Copilot/GitHubCopilotAgent.cs @@ -346,14 +346,14 @@ public sealed class GitHubCopilotAgent : AIAgent, IAsyncDisposable }; } - private AgentResponseUpdate ConvertToAgentResponseUpdate(AssistantMessageEvent assistantMessage) + internal AgentResponseUpdate ConvertToAgentResponseUpdate(AssistantMessageEvent assistantMessage) { - TextContent textContent = new(assistantMessage.Data?.Content ?? string.Empty) + AIContent content = new() { RawRepresentation = assistantMessage }; - return new AgentResponseUpdate(ChatRole.Assistant, [textContent]) + return new AgentResponseUpdate(ChatRole.Assistant, [content]) { AgentId = this.Id, ResponseId = assistantMessage.Data?.MessageId, diff --git a/dotnet/tests/Microsoft.Agents.AI.GitHub.Copilot.UnitTests/GitHubCopilotAgentTests.cs b/dotnet/tests/Microsoft.Agents.AI.GitHub.Copilot.UnitTests/GitHubCopilotAgentTests.cs index 5806636925..52ea0026dc 100644 --- a/dotnet/tests/Microsoft.Agents.AI.GitHub.Copilot.UnitTests/GitHubCopilotAgentTests.cs +++ b/dotnet/tests/Microsoft.Agents.AI.GitHub.Copilot.UnitTests/GitHubCopilotAgentTests.cs @@ -221,4 +221,26 @@ public sealed class GitHubCopilotAgentTests Assert.Null(result.ConfigDir); Assert.True(result.Streaming); } + + [Fact] + public void ConvertToAgentResponseUpdate_AssistantMessageEvent_DoesNotEmitTextContent() + { + var assistantMessage = new AssistantMessageEvent + { + Data = new AssistantMessageData + { + MessageId = "msg-456", + Content = "Some streamed content that was already delivered via delta events" + } + }; + CopilotClient copilotClient = new(new CopilotClientOptions { AutoStart = false }); + const string TestId = "agent-id"; + var agent = new GitHubCopilotAgent(copilotClient, ownsClient: false, id: TestId, tools: null); + AgentResponseUpdate result = agent.ConvertToAgentResponseUpdate(assistantMessage); + + // result.Text need to be empty because the content was already delivered via delta events, and we want to avoid emitting duplicate content in the response update. + // The content should be delivered through TextContent in the Contents collection instead. + Assert.Empty(result.Text); + Assert.DoesNotContain(result.Contents, c => c is TextContent); + } }