1+ import Anthropic from "@anthropic-ai/sdk"
12import { ApiHandler } from "../../api"
23import { ApiMessage } from "../task-persistence/apiMessages"
34
@@ -40,10 +41,7 @@ Example summary structure:
4041 - [Task 2 details & next steps]
4142 - [...]
4243
43- The conversation history which you should summarize is included below. Output only the summary, without any additional commentary or explanation.
44- ### BEGIN CONVERSATION HISTORY
45- {messages}
46- ### END CONVERSATION HISTORY
44+ Output only the summary of the conversation so far, without any additional commentary or explanation.
4745`
4846
4947/**
@@ -69,12 +67,19 @@ export async function summarizeConversationIfNeeded(
6967}
7068
7169async function summarizeConversation ( messages : ApiMessage [ ] , apiHandler : ApiHandler ) : Promise < ApiMessage [ ] > {
72- if ( messages . length < 2 ) {
70+ if ( messages . length <= 2 ) {
7371 return messages
7472 }
75- const messagesToSummarize = messages . slice ( 0 , - 1 )
76- const summaryPrompt = getSummaryPrompt ( messagesToSummarize )
77- const stream = apiHandler . createMessage ( summaryPrompt , [ ] )
73+ if ( messages [ messages . length - 2 ] . isSummary || messages [ messages . length - 1 ] . isSummary ) {
74+ return messages
75+ }
76+ const finalRequestMessage : Anthropic . MessageParam = {
77+ role : "user" ,
78+ content : "Summarize the conversation so far, as described in the prompt instructions." ,
79+ }
80+ const messagesToSummarize = [ ...messages . slice ( 0 , - 1 ) , finalRequestMessage ]
81+
82+ const stream = apiHandler . createMessage ( SUMMARY_PROMPT , messagesToSummarize )
7883 let summary = ""
7984 for await ( const chunk of stream ) {
8085 if ( chunk . type === "text" ) {
@@ -93,24 +98,5 @@ async function summarizeConversation(messages: ApiMessage[], apiHandler: ApiHand
9398 isSummary : true ,
9499 }
95100
96- return [ ...messagesToSummarize , summaryMessage , messages [ messages . length - 1 ] ]
97- }
98-
99- function getSummaryPrompt ( messages : ApiMessage [ ] ) : string {
100- return SUMMARY_PROMPT . replace ( "{messages}" , getMessageStr ( messages ) )
101- }
102-
103- function getMessageStr ( messages : ApiMessage [ ] ) : string {
104- let messageStr = ""
105- for ( const message of messages ) {
106- if ( message . role === "user" ) {
107- messageStr += "# User:"
108- } else if ( message . role === "assistant" ) {
109- messageStr += "# Assistant:"
110- } else {
111- continue
112- }
113- messageStr += `\n${ message . content } \n\n`
114- }
115- return messageStr
101+ return [ ...messages . slice ( 0 , - 1 ) , summaryMessage , messages [ messages . length - 1 ] ]
116102}
0 commit comments