only add the last message to chat history in SendAsync (#3272)

This commit is contained in:
Xiaoyun Zhang 2024-08-02 09:35:00 -07:00 committed by GitHub
parent 56007d1164
commit 3186bb7610
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 38 additions and 1 deletions

View File

@ -51,7 +51,10 @@ public static class GroupChatExtension
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);
}
}

View File

@ -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 class GroupChatTests
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<IOrchestrator>();
Mock.Get(orchestrator).Setup(x => x.GetNextSpeakerAsync(It.IsAny<OrchestrationContext>(), It.IsAny<CancellationToken>()))
.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<IMessage>();
await foreach (var message in groupChat.SendAsync(chatHistory, maxRound))
{
chatHistory.Add(message);
}
chatHistory.Count().Should().Be(2);
}
}