11import { ModelConfig } from "@continuedev/config-yaml" ;
22import { BaseLlmApi } from "@continuedev/openai-adapters" ;
33import type { ChatHistoryItem } from "core/index.js" ;
4+ import type { ChatCompletionTool } from "openai/resources/chat/completions.mjs" ;
45
56import { services } from "../services/index.js" ;
67import { ToolCall } from "../tools/index.js" ;
@@ -17,6 +18,7 @@ export interface CompactionHelperOptions {
1718 isHeadless : boolean ;
1819 callbacks ?: StreamCallbacks ;
1920 systemMessage : string ;
21+ tools ?: ChatCompletionTool [ ] ;
2022}
2123
2224/**
@@ -26,8 +28,15 @@ export async function handlePreApiCompaction(
2628 chatHistory : ChatHistoryItem [ ] ,
2729 options : CompactionHelperOptions ,
2830) : Promise < { chatHistory : ChatHistoryItem [ ] ; wasCompacted : boolean } > {
29- const { model, llmApi, isCompacting, isHeadless, callbacks, systemMessage } =
30- options ;
31+ const {
32+ model,
33+ llmApi,
34+ isCompacting,
35+ isHeadless,
36+ callbacks,
37+ systemMessage,
38+ tools,
39+ } = options ;
3140
3241 if ( isCompacting ) {
3342 return { chatHistory, wasCompacted : false } ;
@@ -41,6 +50,7 @@ export async function handlePreApiCompaction(
4150 onContent : callbacks ?. onContent ,
4251 } ,
4352 systemMessage,
53+ tools,
4454 } ) ;
4555
4656 if ( wasCompacted ) {
@@ -67,7 +77,8 @@ export async function handlePostToolValidation(
6777 chatHistory : ChatHistoryItem [ ] ,
6878 options : CompactionHelperOptions ,
6979) : Promise < { chatHistory : ChatHistoryItem [ ] ; wasCompacted : boolean } > {
70- const { model, llmApi, isHeadless, callbacks, systemMessage } = options ;
80+ const { model, llmApi, isHeadless, callbacks, systemMessage, tools } =
81+ options ;
7182
7283 if ( toolCalls . length === 0 ) {
7384 return { chatHistory, wasCompacted : false } ;
@@ -82,21 +93,14 @@ export async function handlePostToolValidation(
8293 chatHistory = chatHistorySvc . getHistory ( ) ;
8394 }
8495
85- // Validate with system message to catch tool result overflow
86- const postToolSystemItem : ChatHistoryItem = {
87- message : {
88- role : "system" ,
89- content : systemMessage ,
90- } ,
91- contextItems : [ ] ,
92- } ;
93-
9496 const SAFETY_BUFFER = 100 ;
95- const postToolValidation = validateContextLength (
96- [ postToolSystemItem , ... chatHistory ] ,
97+ const postToolValidation = validateContextLength ( {
98+ chatHistory,
9799 model,
98- SAFETY_BUFFER ,
99- ) ;
100+ safetyBuffer : SAFETY_BUFFER ,
101+ systemMessage,
102+ tools,
103+ } ) ;
100104
101105 // If tool results pushed us over limit, force compaction regardless of threshold
102106 if ( ! postToolValidation . isValid ) {
@@ -114,6 +118,7 @@ export async function handlePostToolValidation(
114118 onContent : callbacks ?. onContent ,
115119 } ,
116120 systemMessage,
121+ tools,
117122 } ) ;
118123
119124 if ( wasCompacted ) {
@@ -127,11 +132,13 @@ export async function handlePostToolValidation(
127132 }
128133
129134 // Verify compaction brought us under the limit
130- const postCompactionValidation = validateContextLength (
131- [ postToolSystemItem , ... chatHistory ] ,
135+ const postCompactionValidation = validateContextLength ( {
136+ chatHistory,
132137 model,
133- SAFETY_BUFFER ,
134- ) ;
138+ safetyBuffer : SAFETY_BUFFER ,
139+ systemMessage,
140+ tools,
141+ } ) ;
135142
136143 if ( ! postCompactionValidation . isValid ) {
137144 logger . error (
@@ -171,7 +178,8 @@ export async function handleNormalAutoCompaction(
171178 shouldContinue : boolean ,
172179 options : CompactionHelperOptions ,
173180) : Promise < { chatHistory : ChatHistoryItem [ ] ; wasCompacted : boolean } > {
174- const { model, llmApi, isHeadless, callbacks, systemMessage } = options ;
181+ const { model, llmApi, isHeadless, callbacks, systemMessage, tools } =
182+ options ;
175183
176184 if ( ! shouldContinue ) {
177185 return { chatHistory, wasCompacted : false } ;
@@ -193,6 +201,7 @@ export async function handleNormalAutoCompaction(
193201 onContent : callbacks ?. onContent ,
194202 } ,
195203 systemMessage,
204+ tools,
196205 } ) ;
197206
198207 if ( wasCompacted ) {
0 commit comments