Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -104,7 +104,8 @@ public static int LocateSafeReductionIndex(
int offsetCount = 0,
bool hasSystemMessage = false)
{
targetCount -= hasSystemMessage ? 1 : 0;
// The system message counts toward the target, but at least one other message is always retained
targetCount = Math.Max(1, targetCount - (hasSystemMessage ? 1 : 0));

// Compute the index of the truncation threshold
int thresholdIndex = chatHistory.Count - (thresholdCount ?? 0) - targetCount;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -245,6 +245,27 @@ public async Task VerifySystemMessageIsNotReducedAsync()
Assert.Contains(messages, m => m.Role == AuthorRole.System);
}

/// <summary>
/// Validate history summarized and the latest message retained when the target count is one and a system message is present.
/// </summary>
[Fact]
public async Task VerifySystemMessageWithSingleTargetCountAsync()
{
// Arrange
Mock<IChatCompletionService> mockCompletionService = this.CreateMockCompletionService();
IReadOnlyList<ChatMessageContent> sourceHistory = MockChatHistoryGenerator.CreateSimpleHistory(20, includeSystemMessage: true).ToArray();
ChatHistorySummarizationReducer reducer = new(mockCompletionService.Object, 1);

// Act
IEnumerable<ChatMessageContent>? reducedHistory = await reducer.ReduceAsync(sourceHistory);

// Assert
ChatMessageContent[] messages = VerifyReducedHistory(reducedHistory, 3);
Assert.Equal(AuthorRole.System, messages[0].Role);
VerifySummarization(messages[1]);
Assert.Same(sourceHistory[^1], messages[2]);
}

private static ChatMessageContent[] VerifyReducedHistory(IEnumerable<ChatMessageContent>? reducedHistory, int expectedCount)
{
Assert.NotNull(reducedHistory);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -155,6 +155,25 @@ public async Task VerifySystemMessageIsNotReducedAsync()
Assert.Contains(reducedHistory!, m => m.Role == AuthorRole.System);
}

/// <summary>
/// Validate history reduced to the system message and the latest message when the target count is one.
/// </summary>
[Fact]
public async Task VerifySystemMessageWithSingleTargetCountAsync()
{
// Arrange
IReadOnlyList<ChatMessageContent> sourceHistory = MockChatHistoryGenerator.CreateSimpleHistory(20, includeSystemMessage: true).ToArray();
ChatHistoryTruncationReducer reducer = new(1);

// Act
IEnumerable<ChatMessageContent>? reducedHistory = await reducer.ReduceAsync(sourceHistory);

// Assert
VerifyReducedHistory(reducedHistory, 2);
Assert.Equal(AuthorRole.System, reducedHistory!.First().Role);
Assert.Same(sourceHistory[^1], reducedHistory!.Last());
}

private static void VerifyReducedHistory(IEnumerable<ChatMessageContent>? reducedHistory, int expectedCount)
{
Assert.NotNull(reducedHistory);
Expand Down
Loading