fix(coding-agent): truncate tool results in compaction summarization to prevent overflow, fixes #1796

This commit is contained in:
Mario Zechner
2026-03-06 16:56:47 +01:00
parent d8e3998d6e
commit c950c692a1
3 changed files with 97 additions and 1 deletions

View File

@@ -85,10 +85,26 @@ export function formatFileOperations(readFiles: string[], modifiedFiles: string[
// Message Serialization
// ============================================================================
/** Maximum characters for a tool result in serialized summaries. */
const TOOL_RESULT_MAX_CHARS = 2000;
/**
* Truncate text to a maximum character length for summarization.
* Keeps the beginning and appends a truncation marker.
*/
function truncateForSummary(text: string, maxChars: number): string {
if (text.length <= maxChars) return text;
const truncatedChars = text.length - maxChars;
return `${text.slice(0, maxChars)}\n\n[... ${truncatedChars} more characters truncated]`;
}
/**
* Serialize LLM messages to text for summarization.
* This prevents the model from treating it as a conversation to continue.
* Call convertToLlm() first to handle custom message types.
*
* Tool results are truncated to keep the summarization request within
* reasonable token budgets. Full content is not needed for summarization.
*/
export function serializeConversation(messages: Message[]): string {
const parts: string[] = [];
@@ -137,7 +153,7 @@ export function serializeConversation(messages: Message[]): string {
.map((c) => c.text)
.join("");
if (content) {
parts.push(`[Tool result]: ${content}`);
parts.push(`[Tool result]: ${truncateForSummary(content, TOOL_RESULT_MAX_CHARS)}`);
}
}
}