mirror of
https://github.com/RooVetGit/Roo-Code.git
synced 2026-09-07 08:26:51 +00:00
fix: include first message in condense summarization
- Modified summarizeConversation to include the first message when creating summary - Added test to verify first message is included in summarization content - Fixes issue where initial task context was lost after condensation Fixes #8293
This commit is contained in:
parent
d3d0967fc3
commit
6e02901e52
3 changed files with 46 additions and 3 deletions
1
.tmp/review/Roo-Code
Submodule
1
.tmp/review/Roo-Code
Submodule
|
|
@ -0,0 +1 @@
|
|||
Subproject commit 8dbd8c4b1b72fb48be3990a8e78285a787a1828c
|
||||
|
|
@ -10,7 +10,7 @@ import { summarizeConversation, getMessagesSinceLastSummary, N_MESSAGES_TO_KEEP
|
|||
|
||||
// Create a mock ApiHandler for testing
|
||||
class MockApiHandler extends BaseProvider {
|
||||
createMessage(): any {
|
||||
createMessage(systemPrompt: string, messages: Anthropic.Messages.MessageParam[], metadata?: any): any {
|
||||
// Mock implementation for testing - returns an async iterable stream
|
||||
const mockStream = {
|
||||
async *[Symbol.asyncIterator]() {
|
||||
|
|
@ -204,6 +204,48 @@ describe("Condense", () => {
|
|||
expect(result.messages).toEqual(messages)
|
||||
expect(result.cost).toBeGreaterThan(0)
|
||||
})
|
||||
|
||||
it("should include the first message in the summarization content", async () => {
|
||||
// Create a mock handler that captures what messages are sent for summarization
|
||||
let capturedMessages: any[] = []
|
||||
class CapturingMockApiHandler extends MockApiHandler {
|
||||
override createMessage(
|
||||
systemPrompt: string,
|
||||
messages: Anthropic.Messages.MessageParam[],
|
||||
metadata?: any,
|
||||
): any {
|
||||
// Capture the messages sent for summarization (excluding the final request message)
|
||||
capturedMessages = messages.slice(0, -1)
|
||||
return super.createMessage(systemPrompt, messages, metadata)
|
||||
}
|
||||
}
|
||||
|
||||
const capturingHandler = new CapturingMockApiHandler()
|
||||
const messages: ApiMessage[] = [
|
||||
{ role: "user", content: "Initial task: Create a TODO app" },
|
||||
{ role: "assistant", content: "I'll help you create a TODO app" },
|
||||
{ role: "user", content: "Add user authentication" },
|
||||
{ role: "assistant", content: "Adding authentication" },
|
||||
{ role: "user", content: "Add database support" },
|
||||
{ role: "assistant", content: "Setting up database" },
|
||||
{ role: "user", content: "Add API endpoints" },
|
||||
{ role: "assistant", content: "Creating API endpoints" },
|
||||
{ role: "user", content: "Deploy it" },
|
||||
]
|
||||
|
||||
await summarizeConversation(messages, capturingHandler, "System prompt", taskId, 5000, false)
|
||||
|
||||
// Verify that the first message was included in what gets summarized
|
||||
expect(capturedMessages.length).toBeGreaterThan(0)
|
||||
expect(capturedMessages[0]).toEqual({
|
||||
role: "user",
|
||||
content: "Initial task: Create a TODO app",
|
||||
})
|
||||
|
||||
// Verify all messages except the last N_MESSAGES_TO_KEEP were included
|
||||
const expectedMessagesToSummarize = messages.slice(0, -N_MESSAGES_TO_KEEP)
|
||||
expect(capturedMessages).toEqual(expectedMessagesToSummarize)
|
||||
})
|
||||
})
|
||||
|
||||
describe("getMessagesSinceLastSummary", () => {
|
||||
|
|
|
|||
|
|
@ -103,8 +103,8 @@ export async function summarizeConversation(
|
|||
|
||||
// Always preserve the first message (which may contain slash command content)
|
||||
const firstMessage = messages[0]
|
||||
// Get messages to summarize, excluding the first message and last N messages
|
||||
const messagesToSummarize = getMessagesSinceLastSummary(messages.slice(1, -N_MESSAGES_TO_KEEP))
|
||||
// Get messages to summarize, including the first message but excluding last N messages
|
||||
const messagesToSummarize = getMessagesSinceLastSummary(messages.slice(0, -N_MESSAGES_TO_KEEP))
|
||||
|
||||
if (messagesToSummarize.length <= 1) {
|
||||
const error =
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue