diff --git a/dotnet/src/AutoGen.Core/Extension/GroupChatExtension.cs b/dotnet/src/AutoGen.Core/Extension/GroupChatExtension.cs index a5009e211556..6b17a2b93fd6 100644 --- a/dotnet/src/AutoGen.Core/Extension/GroupChatExtension.cs +++ b/dotnet/src/AutoGen.Core/Extension/GroupChatExtension.cs @@ -51,7 +51,10 @@ public static async IAsyncEnumerable SendAsync( yield break; } - chatHistory = messages; + // messages will contain the complete chat history, include initalize messages + // but we only need to add the last message to the chat history + // fix #3268 + chatHistory = chatHistory.Append(lastMessage); } } diff --git a/dotnet/test/AutoGen.Tests/GroupChat/GroupChatTests.cs b/dotnet/test/AutoGen.Tests/GroupChat/GroupChatTests.cs index 7a7a27be9b10..19ca02ae92fa 100644 --- a/dotnet/test/AutoGen.Tests/GroupChat/GroupChatTests.cs +++ b/dotnet/test/AutoGen.Tests/GroupChat/GroupChatTests.cs @@ -4,8 +4,10 @@ using System; using System.Collections.Generic; using System.Linq; +using System.Threading; using System.Threading.Tasks; using FluentAssertions; +using Moq; using Xunit; namespace AutoGen.Tests; @@ -51,4 +53,36 @@ public async Task ItTerminateConversationWhenAgentReturnTerminateKeyWord() chatHistory.Count().Should().Be(3); chatHistory.Last().From.Should().Be("Cathy"); } + + [Fact] + public async Task ItSendAsyncDoesntAddDuplicateInitializeMessagesTest() + { + // fix #3268 + var alice = new DefaultReplyAgent("Alice", "I am alice"); + var bob = new DefaultReplyAgent("Bob", "I am bob"); + var cathy = new DefaultReplyAgent("Cathy", $"I am cathy, {GroupChatExtension.TERMINATE}"); + + var roundRobinOrchestrator = new RoundRobinOrchestrator(); + var orchestrator = Mock.Of(); + Mock.Get(orchestrator).Setup(x => x.GetNextSpeakerAsync(It.IsAny(), It.IsAny())) + .Returns((OrchestrationContext context, CancellationToken token) => + { + // determine if initialize message is already sent and not added twice + context.ChatHistory.Where(x => x.From == alice.Name).Count().Should().Be(1); + + return roundRobinOrchestrator.GetNextSpeakerAsync(context, token); + }); + + var groupChat = new GroupChat([alice, bob, cathy], orchestrator); + groupChat.AddInitializeMessage(new TextMessage(Role.User, "Hello", from: alice.Name)); + + var maxRound = 2; + var chatHistory = new List(); + await foreach (var message in groupChat.SendAsync(chatHistory, maxRound)) + { + chatHistory.Add(message); + } + + chatHistory.Count().Should().Be(2); + } }