Skip to content

Commit f7a9cd1

Browse files
committed
keep multiple messages
1 parent 8d6b71f commit f7a9cd1

File tree

2 files changed

+23
-18
lines changed

2 files changed

+23
-18
lines changed

src/core/condense/index.ts

Lines changed: 21 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ import { ApiHandler } from "../../api"
33
import { ApiMessage } from "../task-persistence/apiMessages"
44

55
const CONTEXT_FRAC_FOR_SUMMARY = 0.5 // TODO(canyon): make this configurable
6+
const N_MESSAGES_TO_KEEP = 3
67

78
const SUMMARY_PROMPT = `\
89
Your task is to create a detailed summary of the conversation so far, paying close attention to the user's explicit requests and your previous actions.
@@ -67,19 +68,21 @@ export async function summarizeConversationIfNeeded(
6768
}
6869

6970
async function summarizeConversation(messages: ApiMessage[], apiHandler: ApiHandler): Promise<ApiMessage[]> {
70-
if (messages.length <= 2) {
71-
return messages
71+
const messagesToSummarize = getMessagesSinceLastSummary(messages.slice(0, -N_MESSAGES_TO_KEEP))
72+
if (messagesToSummarize.length <= 1) {
73+
return messages // Not enough messages to warrant a summary
7274
}
73-
if (messages[messages.length - 2].isSummary || messages[messages.length - 1].isSummary) {
74-
return messages
75+
const keepMessages = messages.slice(-N_MESSAGES_TO_KEEP)
76+
for (const message of keepMessages) {
77+
if (message.isSummary) {
78+
return messages // We recently summarized these messages; it's too soon to summarize again.
79+
}
7580
}
7681
const finalRequestMessage: Anthropic.MessageParam = {
7782
role: "user",
7883
content: "Summarize the conversation so far, as described in the prompt instructions.",
7984
}
80-
const messagesToSummarize = [...messages.slice(0, -1), finalRequestMessage]
81-
82-
const stream = apiHandler.createMessage(SUMMARY_PROMPT, messagesToSummarize)
85+
const stream = apiHandler.createMessage(SUMMARY_PROMPT, [...messagesToSummarize, finalRequestMessage])
8386
let summary = ""
8487
for await (const chunk of stream) {
8588
if (chunk.type === "text") {
@@ -98,5 +101,15 @@ async function summarizeConversation(messages: ApiMessage[], apiHandler: ApiHand
98101
isSummary: true,
99102
}
100103

101-
return [...messages.slice(0, -1), summaryMessage, messages[messages.length - 1]]
104+
return [...messages.slice(0, -N_MESSAGES_TO_KEEP), summaryMessage, ...keepMessages]
105+
}
106+
107+
/* Returns the list of all messages since the last summary message, including the summary. Returns all messages if there is no summary. */
108+
export function getMessagesSinceLastSummary(messages: ApiMessage[]): ApiMessage[] {
109+
let lastSummaryIndexReverse = [...messages].reverse().findIndex((message) => message.isSummary)
110+
if (lastSummaryIndexReverse === -1) {
111+
return messages
112+
}
113+
const lastSummaryIndex = messages.length - lastSummaryIndexReverse - 1
114+
return messages.slice(lastSummaryIndex)
102115
}

src/core/task/Task.ts

Lines changed: 2 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -79,7 +79,7 @@ import {
7979
} from "../checkpoints"
8080
import { processUserContentMentions } from "../mentions/processUserContentMentions"
8181
import { ApiMessage } from "../task-persistence/apiMessages"
82-
import { summarizeConversationIfNeeded } from "../condense"
82+
import { getMessagesSinceLastSummary, summarizeConversationIfNeeded } from "../condense"
8383

8484
export type ClineEvents = {
8585
message: [{ action: "created" | "updated"; message: ClineMessage }]
@@ -1483,15 +1483,7 @@ export class Task extends EventEmitter<ClineEvents> {
14831483
}
14841484
}
14851485

1486-
// Only include messages since the last summary message.
1487-
let messagesSinceLastSummary = this.apiConversationHistory
1488-
let lastSummaryIndexReverse = [...this.apiConversationHistory]
1489-
.reverse()
1490-
.findIndex((message) => message.isSummary)
1491-
if (lastSummaryIndexReverse !== -1) {
1492-
const lastSummaryIndex = this.apiConversationHistory.length - lastSummaryIndexReverse - 1
1493-
messagesSinceLastSummary = this.apiConversationHistory.slice(lastSummaryIndex)
1494-
}
1486+
const messagesSinceLastSummary = getMessagesSinceLastSummary(this.apiConversationHistory)
14951487

14961488
// Clean conversation history by:
14971489
// 1. Converting to Anthropic.MessageParam by spreading only the API-required properties.

0 commit comments

Comments
 (0)