From 3224d1419c04545a995f548b976765c864f108b2 Mon Sep 17 00:00:00 2001 From: Canyon Robins Date: Fri, 30 May 2025 12:49:57 -0700 Subject: [PATCH 1/6] [Condense] Fix bug where bedrock requires a user message first --- src/core/condense/index.ts | 69 ++++++++++++++++++++++++-------------- src/core/task/Task.ts | 2 +- 2 files changed, 44 insertions(+), 27 deletions(-) diff --git a/src/core/condense/index.ts b/src/core/condense/index.ts index 07c52713ef..8950a07990 100644 --- a/src/core/condense/index.ts +++ b/src/core/condense/index.ts @@ -6,6 +6,7 @@ import { t } from "../../i18n" import { ApiHandler } from "../../api" import { ApiMessage } from "../task-persistence/apiMessages" import { maybeRemoveImageBlocks } from "../../api/transform/image-cleaning" +import { AwsBedrockHandler } from "../../api/providers" export const N_MESSAGES_TO_KEEP = 3 @@ -98,7 +99,30 @@ export async function summarizeConversation( ) const response: SummarizeResponse = { messages, cost: 0, summary: "" } - const messagesToSummarize = getMessagesSinceLastSummary(messages.slice(0, -N_MESSAGES_TO_KEEP)) + + // Use condensing API handler if provided, otherwise use main API handler + let handlerToUse = condensingApiHandler || apiHandler + + // Check if the chosen handler supports the required functionality + if (!handlerToUse || typeof handlerToUse.createMessage !== "function") { + console.warn( + "Chosen API handler for condensing does not support message creation or is invalid, falling back to main apiHandler.", + ) + + handlerToUse = apiHandler // Fallback to the main, presumably valid, apiHandler + + // Ensure the main apiHandler itself is valid before this point or add another check. + if (!handlerToUse || typeof handlerToUse.createMessage !== "function") { + // This case should ideally not happen if main apiHandler is always valid. + // Consider throwing an error or returning a specific error response. + console.error("Main API handler is also invalid for condensing. Cannot proceed.") + // Return an appropriate error structure for SummarizeResponse + const error = t("common:errors.condense_handler_invalid") + return { ...response, error } + } + } + + const messagesToSummarize = getMessagesSinceLastSummary(messages.slice(0, -N_MESSAGES_TO_KEEP), handlerToUse) if (messagesToSummarize.length <= 1) { const error = @@ -126,32 +150,10 @@ export async function summarizeConversation( ({ role, content }) => ({ role, content }), ) - // Note: this doesn't need to be a stream, consider using something like apiHandler.completePrompt // Use custom prompt if provided and non-empty, otherwise use the default SUMMARY_PROMPT const promptToUse = customCondensingPrompt?.trim() ? customCondensingPrompt.trim() : SUMMARY_PROMPT - // Use condensing API handler if provided, otherwise use main API handler - let handlerToUse = condensingApiHandler || apiHandler - - // Check if the chosen handler supports the required functionality - if (!handlerToUse || typeof handlerToUse.createMessage !== "function") { - console.warn( - "Chosen API handler for condensing does not support message creation or is invalid, falling back to main apiHandler.", - ) - - handlerToUse = apiHandler // Fallback to the main, presumably valid, apiHandler - - // Ensure the main apiHandler itself is valid before this point or add another check. - if (!handlerToUse || typeof handlerToUse.createMessage !== "function") { - // This case should ideally not happen if main apiHandler is always valid. - // Consider throwing an error or returning a specific error response. - console.error("Main API handler is also invalid for condensing. Cannot proceed.") - // Return an appropriate error structure for SummarizeResponse - const error = t("common:errors.condense_handler_invalid") - return { ...response, error } - } - } - + // Note: this doesn't need to be a stream, consider using something like apiHandler.completePrompt const stream = handlerToUse.createMessage(promptToUse, requestMessages) let summary = "" @@ -205,7 +207,7 @@ export async function summarizeConversation( } /* Returns the list of all messages since the last summary message, including the summary. Returns all messages if there is no summary. */ -export function getMessagesSinceLastSummary(messages: ApiMessage[]): ApiMessage[] { +export function getMessagesSinceLastSummary(messages: ApiMessage[], apiHandler: ApiHandler): ApiMessage[] { let lastSummaryIndexReverse = [...messages].reverse().findIndex((message) => message.isSummary) if (lastSummaryIndexReverse === -1) { @@ -213,5 +215,20 @@ export function getMessagesSinceLastSummary(messages: ApiMessage[]): ApiMessage[ } const lastSummaryIndex = messages.length - lastSummaryIndexReverse - 1 - return messages.slice(lastSummaryIndex) + const messagesSinceSummary = messages.slice(lastSummaryIndex) + return maybePrependUserMessage(messagesSinceSummary, apiHandler) +} + +function maybePrependUserMessage(messages: ApiMessage[], apiHandler: ApiHandler): ApiMessage[] { + if (messages.length === 0 || !messages[0].isSummary || !(apiHandler instanceof AwsBedrockHandler)) { + return messages + } + // Bedrock requires the first message to be a user message. + // See https://github.com/RooCodeInc/Roo-Code/issues/4147 + const userMessage: ApiMessage = { + role: "user", + content: "Please continue from the following summary:", + ts: messages[0]?.ts ? messages[0].ts - 1 : Date.now(), + } + return [userMessage, ...messages] } diff --git a/src/core/task/Task.ts b/src/core/task/Task.ts index ac3b1cb7d8..cc5f191071 100644 --- a/src/core/task/Task.ts +++ b/src/core/task/Task.ts @@ -1650,7 +1650,7 @@ export class Task extends EventEmitter { } } - const messagesSinceLastSummary = getMessagesSinceLastSummary(this.apiConversationHistory) + const messagesSinceLastSummary = getMessagesSinceLastSummary(this.apiConversationHistory, this.api) const cleanConversationHistory = maybeRemoveImageBlocks(messagesSinceLastSummary, this.api).map( ({ role, content }) => ({ role, content }), ) From 4bbeb5fb1e40577cc5ac0cfb347a157cd28cc1a1 Mon Sep 17 00:00:00 2001 From: Canyon Robins Date: Fri, 30 May 2025 12:59:29 -0700 Subject: [PATCH 2/6] update tests --- src/core/condense/__tests__/index.test.ts | 61 +++++++++++++++++++++-- 1 file changed, 57 insertions(+), 4 deletions(-) diff --git a/src/core/condense/__tests__/index.test.ts b/src/core/condense/__tests__/index.test.ts index 81994f3f5b..70b7b733a9 100644 --- a/src/core/condense/__tests__/index.test.ts +++ b/src/core/condense/__tests__/index.test.ts @@ -5,6 +5,7 @@ import { describe, expect, it, jest, beforeEach } from "@jest/globals" import { TelemetryService } from "@roo-code/telemetry" import { ApiHandler } from "../../../api" +import { AwsBedrockHandler } from "../../../api/providers" import { ApiMessage } from "../../task-persistence/apiMessages" import { maybeRemoveImageBlocks } from "../../../api/transform/image-cleaning" import { summarizeConversation, getMessagesSinceLastSummary, N_MESSAGES_TO_KEEP } from "../index" @@ -25,6 +26,12 @@ const taskId = "test-task-id" const DEFAULT_PREV_CONTEXT_TOKENS = 1000 describe("getMessagesSinceLastSummary", () => { + let mockApiHandler: ApiHandler + + beforeEach(() => { + mockApiHandler = {} as unknown as ApiHandler + }) + it("should return all messages when there is no summary", () => { const messages: ApiMessage[] = [ { role: "user", content: "Hello", ts: 1 }, @@ -32,7 +39,7 @@ describe("getMessagesSinceLastSummary", () => { { role: "user", content: "How are you?", ts: 3 }, ] - const result = getMessagesSinceLastSummary(messages) + const result = getMessagesSinceLastSummary(messages, mockApiHandler) expect(result).toEqual(messages) }) @@ -45,7 +52,7 @@ describe("getMessagesSinceLastSummary", () => { { role: "assistant", content: "I'm good", ts: 5 }, ] - const result = getMessagesSinceLastSummary(messages) + const result = getMessagesSinceLastSummary(messages, mockApiHandler) expect(result).toEqual([ { role: "assistant", content: "Summary of conversation", ts: 3, isSummary: true }, { role: "user", content: "How are you?", ts: 4 }, @@ -62,7 +69,7 @@ describe("getMessagesSinceLastSummary", () => { { role: "user", content: "What's new?", ts: 5 }, ] - const result = getMessagesSinceLastSummary(messages) + const result = getMessagesSinceLastSummary(messages, mockApiHandler) expect(result).toEqual([ { role: "assistant", content: "Second summary", ts: 4, isSummary: true }, { role: "user", content: "What's new?", ts: 5 }, @@ -70,9 +77,55 @@ describe("getMessagesSinceLastSummary", () => { }) it("should handle empty messages array", () => { - const result = getMessagesSinceLastSummary([]) + const result = getMessagesSinceLastSummary([], mockApiHandler) expect(result).toEqual([]) }) + + it("should prepend user message when using AwsBedrockHandler with summary as first message", () => { + const mockAwsBedrockHandler = new AwsBedrockHandler({ + apiModelId: "anthropic.claude-3-5-sonnet-20241022-v2:0", + awsAccessKey: "test-key", + awsSecretKey: "test-secret", + awsRegion: "us-east-1", + }) + + const messages: ApiMessage[] = [ + { role: "user", content: "Hello", ts: 1 }, + { role: "assistant", content: "Hi there", ts: 2 }, + { role: "assistant", content: "Summary of conversation", ts: 1000, isSummary: true }, + { role: "user", content: "How are you?", ts: 1001 }, + { role: "assistant", content: "I'm good", ts: 1002 }, + ] + + const result = getMessagesSinceLastSummary(messages, mockAwsBedrockHandler) + + // Should prepend user message before the summary + expect(result).toEqual([ + { role: "user", content: "Please continue from the following summary:", ts: 999 }, + { role: "assistant", content: "Summary of conversation", ts: 1000, isSummary: true }, + { role: "user", content: "How are you?", ts: 1001 }, + { role: "assistant", content: "I'm good", ts: 1002 }, + ]) + }) + + it("should not prepend user message when using non-AwsBedrockHandler", () => { + const messages: ApiMessage[] = [ + { role: "user", content: "Hello", ts: 1 }, + { role: "assistant", content: "Hi there", ts: 2 }, + { role: "assistant", content: "Summary of conversation", ts: 1000, isSummary: true }, + { role: "user", content: "How are you?", ts: 1001 }, + { role: "assistant", content: "I'm good", ts: 1002 }, + ] + + const result = getMessagesSinceLastSummary(messages, mockApiHandler) + + // Should not prepend user message for non-AwsBedrockHandler + expect(result).toEqual([ + { role: "assistant", content: "Summary of conversation", ts: 1000, isSummary: true }, + { role: "user", content: "How are you?", ts: 1001 }, + { role: "assistant", content: "I'm good", ts: 1002 }, + ]) + }) }) describe("summarizeConversation", () => { From 6cd810e26169d4e197c274da5816ac4c5a20e48d Mon Sep 17 00:00:00 2001 From: Canyon Robins Date: Fri, 30 May 2025 13:06:20 -0700 Subject: [PATCH 3/6] Revert previous commits --- src/core/condense/__tests__/index.test.ts | 61 ++------------------ src/core/condense/index.ts | 69 +++++++++-------------- src/core/task/Task.ts | 2 +- 3 files changed, 31 insertions(+), 101 deletions(-) diff --git a/src/core/condense/__tests__/index.test.ts b/src/core/condense/__tests__/index.test.ts index 70b7b733a9..81994f3f5b 100644 --- a/src/core/condense/__tests__/index.test.ts +++ b/src/core/condense/__tests__/index.test.ts @@ -5,7 +5,6 @@ import { describe, expect, it, jest, beforeEach } from "@jest/globals" import { TelemetryService } from "@roo-code/telemetry" import { ApiHandler } from "../../../api" -import { AwsBedrockHandler } from "../../../api/providers" import { ApiMessage } from "../../task-persistence/apiMessages" import { maybeRemoveImageBlocks } from "../../../api/transform/image-cleaning" import { summarizeConversation, getMessagesSinceLastSummary, N_MESSAGES_TO_KEEP } from "../index" @@ -26,12 +25,6 @@ const taskId = "test-task-id" const DEFAULT_PREV_CONTEXT_TOKENS = 1000 describe("getMessagesSinceLastSummary", () => { - let mockApiHandler: ApiHandler - - beforeEach(() => { - mockApiHandler = {} as unknown as ApiHandler - }) - it("should return all messages when there is no summary", () => { const messages: ApiMessage[] = [ { role: "user", content: "Hello", ts: 1 }, @@ -39,7 +32,7 @@ describe("getMessagesSinceLastSummary", () => { { role: "user", content: "How are you?", ts: 3 }, ] - const result = getMessagesSinceLastSummary(messages, mockApiHandler) + const result = getMessagesSinceLastSummary(messages) expect(result).toEqual(messages) }) @@ -52,7 +45,7 @@ describe("getMessagesSinceLastSummary", () => { { role: "assistant", content: "I'm good", ts: 5 }, ] - const result = getMessagesSinceLastSummary(messages, mockApiHandler) + const result = getMessagesSinceLastSummary(messages) expect(result).toEqual([ { role: "assistant", content: "Summary of conversation", ts: 3, isSummary: true }, { role: "user", content: "How are you?", ts: 4 }, @@ -69,7 +62,7 @@ describe("getMessagesSinceLastSummary", () => { { role: "user", content: "What's new?", ts: 5 }, ] - const result = getMessagesSinceLastSummary(messages, mockApiHandler) + const result = getMessagesSinceLastSummary(messages) expect(result).toEqual([ { role: "assistant", content: "Second summary", ts: 4, isSummary: true }, { role: "user", content: "What's new?", ts: 5 }, @@ -77,55 +70,9 @@ describe("getMessagesSinceLastSummary", () => { }) it("should handle empty messages array", () => { - const result = getMessagesSinceLastSummary([], mockApiHandler) + const result = getMessagesSinceLastSummary([]) expect(result).toEqual([]) }) - - it("should prepend user message when using AwsBedrockHandler with summary as first message", () => { - const mockAwsBedrockHandler = new AwsBedrockHandler({ - apiModelId: "anthropic.claude-3-5-sonnet-20241022-v2:0", - awsAccessKey: "test-key", - awsSecretKey: "test-secret", - awsRegion: "us-east-1", - }) - - const messages: ApiMessage[] = [ - { role: "user", content: "Hello", ts: 1 }, - { role: "assistant", content: "Hi there", ts: 2 }, - { role: "assistant", content: "Summary of conversation", ts: 1000, isSummary: true }, - { role: "user", content: "How are you?", ts: 1001 }, - { role: "assistant", content: "I'm good", ts: 1002 }, - ] - - const result = getMessagesSinceLastSummary(messages, mockAwsBedrockHandler) - - // Should prepend user message before the summary - expect(result).toEqual([ - { role: "user", content: "Please continue from the following summary:", ts: 999 }, - { role: "assistant", content: "Summary of conversation", ts: 1000, isSummary: true }, - { role: "user", content: "How are you?", ts: 1001 }, - { role: "assistant", content: "I'm good", ts: 1002 }, - ]) - }) - - it("should not prepend user message when using non-AwsBedrockHandler", () => { - const messages: ApiMessage[] = [ - { role: "user", content: "Hello", ts: 1 }, - { role: "assistant", content: "Hi there", ts: 2 }, - { role: "assistant", content: "Summary of conversation", ts: 1000, isSummary: true }, - { role: "user", content: "How are you?", ts: 1001 }, - { role: "assistant", content: "I'm good", ts: 1002 }, - ] - - const result = getMessagesSinceLastSummary(messages, mockApiHandler) - - // Should not prepend user message for non-AwsBedrockHandler - expect(result).toEqual([ - { role: "assistant", content: "Summary of conversation", ts: 1000, isSummary: true }, - { role: "user", content: "How are you?", ts: 1001 }, - { role: "assistant", content: "I'm good", ts: 1002 }, - ]) - }) }) describe("summarizeConversation", () => { diff --git a/src/core/condense/index.ts b/src/core/condense/index.ts index 8950a07990..07c52713ef 100644 --- a/src/core/condense/index.ts +++ b/src/core/condense/index.ts @@ -6,7 +6,6 @@ import { t } from "../../i18n" import { ApiHandler } from "../../api" import { ApiMessage } from "../task-persistence/apiMessages" import { maybeRemoveImageBlocks } from "../../api/transform/image-cleaning" -import { AwsBedrockHandler } from "../../api/providers" export const N_MESSAGES_TO_KEEP = 3 @@ -99,30 +98,7 @@ export async function summarizeConversation( ) const response: SummarizeResponse = { messages, cost: 0, summary: "" } - - // Use condensing API handler if provided, otherwise use main API handler - let handlerToUse = condensingApiHandler || apiHandler - - // Check if the chosen handler supports the required functionality - if (!handlerToUse || typeof handlerToUse.createMessage !== "function") { - console.warn( - "Chosen API handler for condensing does not support message creation or is invalid, falling back to main apiHandler.", - ) - - handlerToUse = apiHandler // Fallback to the main, presumably valid, apiHandler - - // Ensure the main apiHandler itself is valid before this point or add another check. - if (!handlerToUse || typeof handlerToUse.createMessage !== "function") { - // This case should ideally not happen if main apiHandler is always valid. - // Consider throwing an error or returning a specific error response. - console.error("Main API handler is also invalid for condensing. Cannot proceed.") - // Return an appropriate error structure for SummarizeResponse - const error = t("common:errors.condense_handler_invalid") - return { ...response, error } - } - } - - const messagesToSummarize = getMessagesSinceLastSummary(messages.slice(0, -N_MESSAGES_TO_KEEP), handlerToUse) + const messagesToSummarize = getMessagesSinceLastSummary(messages.slice(0, -N_MESSAGES_TO_KEEP)) if (messagesToSummarize.length <= 1) { const error = @@ -150,10 +126,32 @@ export async function summarizeConversation( ({ role, content }) => ({ role, content }), ) + // Note: this doesn't need to be a stream, consider using something like apiHandler.completePrompt // Use custom prompt if provided and non-empty, otherwise use the default SUMMARY_PROMPT const promptToUse = customCondensingPrompt?.trim() ? customCondensingPrompt.trim() : SUMMARY_PROMPT - // Note: this doesn't need to be a stream, consider using something like apiHandler.completePrompt + // Use condensing API handler if provided, otherwise use main API handler + let handlerToUse = condensingApiHandler || apiHandler + + // Check if the chosen handler supports the required functionality + if (!handlerToUse || typeof handlerToUse.createMessage !== "function") { + console.warn( + "Chosen API handler for condensing does not support message creation or is invalid, falling back to main apiHandler.", + ) + + handlerToUse = apiHandler // Fallback to the main, presumably valid, apiHandler + + // Ensure the main apiHandler itself is valid before this point or add another check. + if (!handlerToUse || typeof handlerToUse.createMessage !== "function") { + // This case should ideally not happen if main apiHandler is always valid. + // Consider throwing an error or returning a specific error response. + console.error("Main API handler is also invalid for condensing. Cannot proceed.") + // Return an appropriate error structure for SummarizeResponse + const error = t("common:errors.condense_handler_invalid") + return { ...response, error } + } + } + const stream = handlerToUse.createMessage(promptToUse, requestMessages) let summary = "" @@ -207,7 +205,7 @@ export async function summarizeConversation( } /* Returns the list of all messages since the last summary message, including the summary. Returns all messages if there is no summary. */ -export function getMessagesSinceLastSummary(messages: ApiMessage[], apiHandler: ApiHandler): ApiMessage[] { +export function getMessagesSinceLastSummary(messages: ApiMessage[]): ApiMessage[] { let lastSummaryIndexReverse = [...messages].reverse().findIndex((message) => message.isSummary) if (lastSummaryIndexReverse === -1) { @@ -215,20 +213,5 @@ export function getMessagesSinceLastSummary(messages: ApiMessage[], apiHandler: } const lastSummaryIndex = messages.length - lastSummaryIndexReverse - 1 - const messagesSinceSummary = messages.slice(lastSummaryIndex) - return maybePrependUserMessage(messagesSinceSummary, apiHandler) -} - -function maybePrependUserMessage(messages: ApiMessage[], apiHandler: ApiHandler): ApiMessage[] { - if (messages.length === 0 || !messages[0].isSummary || !(apiHandler instanceof AwsBedrockHandler)) { - return messages - } - // Bedrock requires the first message to be a user message. - // See https://github.com/RooCodeInc/Roo-Code/issues/4147 - const userMessage: ApiMessage = { - role: "user", - content: "Please continue from the following summary:", - ts: messages[0]?.ts ? messages[0].ts - 1 : Date.now(), - } - return [userMessage, ...messages] + return messages.slice(lastSummaryIndex) } diff --git a/src/core/task/Task.ts b/src/core/task/Task.ts index cc5f191071..ac3b1cb7d8 100644 --- a/src/core/task/Task.ts +++ b/src/core/task/Task.ts @@ -1650,7 +1650,7 @@ export class Task extends EventEmitter { } } - const messagesSinceLastSummary = getMessagesSinceLastSummary(this.apiConversationHistory, this.api) + const messagesSinceLastSummary = getMessagesSinceLastSummary(this.apiConversationHistory) const cleanConversationHistory = maybeRemoveImageBlocks(messagesSinceLastSummary, this.api).map( ({ role, content }) => ({ role, content }), ) From 93ce54452c871e6075871c2cb8d3ca3a0cf3e325 Mon Sep 17 00:00:00 2001 From: Canyon Robins Date: Fri, 30 May 2025 13:08:51 -0700 Subject: [PATCH 4/6] always prepend user message --- src/core/condense/index.ts | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/src/core/condense/index.ts b/src/core/condense/index.ts index 07c52713ef..8a8b57bb0c 100644 --- a/src/core/condense/index.ts +++ b/src/core/condense/index.ts @@ -213,5 +213,14 @@ export function getMessagesSinceLastSummary(messages: ApiMessage[]): ApiMessage[ } const lastSummaryIndex = messages.length - lastSummaryIndexReverse - 1 - return messages.slice(lastSummaryIndex) + const messagesSinceSummary = messages.slice(lastSummaryIndex) + + // Bedrock requires the first message to be a user message. + // See https://github.com/RooCodeInc/Roo-Code/issues/4147 + const userMessage: ApiMessage = { + role: "user", + content: "Please continue from the following summary:", + ts: messages[0]?.ts ? messages[0].ts - 1 : Date.now(), + } + return [userMessage, ...messagesSinceSummary] } From 88c90a2367e8f40918755a3de78dd460f4e852cb Mon Sep 17 00:00:00 2001 From: Canyon Robins Date: Fri, 30 May 2025 13:11:40 -0700 Subject: [PATCH 5/6] fix tests --- src/core/condense/__tests__/index.test.ts | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/core/condense/__tests__/index.test.ts b/src/core/condense/__tests__/index.test.ts index 81994f3f5b..468ddbd575 100644 --- a/src/core/condense/__tests__/index.test.ts +++ b/src/core/condense/__tests__/index.test.ts @@ -36,7 +36,7 @@ describe("getMessagesSinceLastSummary", () => { expect(result).toEqual(messages) }) - it("should return messages since the last summary", () => { + it("should return messages since the last summary with prepended user message", () => { const messages: ApiMessage[] = [ { role: "user", content: "Hello", ts: 1 }, { role: "assistant", content: "Hi there", ts: 2 }, @@ -47,13 +47,14 @@ describe("getMessagesSinceLastSummary", () => { const result = getMessagesSinceLastSummary(messages) expect(result).toEqual([ + { role: "user", content: "Please continue from the following summary:", ts: 0 }, { role: "assistant", content: "Summary of conversation", ts: 3, isSummary: true }, { role: "user", content: "How are you?", ts: 4 }, { role: "assistant", content: "I'm good", ts: 5 }, ]) }) - it("should handle multiple summary messages and return since the last one", () => { + it("should handle multiple summary messages and return since the last one with prepended user message", () => { const messages: ApiMessage[] = [ { role: "user", content: "Hello", ts: 1 }, { role: "assistant", content: "First summary", ts: 2, isSummary: true }, @@ -64,6 +65,7 @@ describe("getMessagesSinceLastSummary", () => { const result = getMessagesSinceLastSummary(messages) expect(result).toEqual([ + { role: "user", content: "Please continue from the following summary:", ts: 0 }, { role: "assistant", content: "Second summary", ts: 4, isSummary: true }, { role: "user", content: "What's new?", ts: 5 }, ]) From 49f1f7e29da45fd4ced1e04c8d416d1501fab467 Mon Sep 17 00:00:00 2001 From: Canyon Robins Date: Fri, 30 May 2025 13:13:51 -0700 Subject: [PATCH 6/6] changeset --- .changeset/little-news-warn.md | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 .changeset/little-news-warn.md diff --git a/.changeset/little-news-warn.md b/.changeset/little-news-warn.md new file mode 100644 index 0000000000..d7b898bacf --- /dev/null +++ b/.changeset/little-news-warn.md @@ -0,0 +1,5 @@ +--- +"roo-cline": major +--- + +Fixes bug with context condensing on Amazon Bedrock