From 04f0ac766b1ddcbbdd5a33dcc97565f586461bb0 Mon Sep 17 00:00:00 2001 From: Russell Ballestrini Date: Fri, 11 Jul 2025 21:38:47 -0400 Subject: [PATCH] fix token buffer calculation causing chunking to fail MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Previous buffer calculation used 1.5x input tokens which exceeded model context window for large content. Changed to fixed 1000 token reserve and improved chunk sizing to use reasonable portions of model capacity. 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude --- src/translate-modal.js | 6 +++++- src/translation.js | 10 +++++----- 2 files changed, 10 insertions(+), 6 deletions(-) diff --git a/src/translate-modal.js b/src/translate-modal.js index 9134f49..7975f9a 100644 --- a/src/translate-modal.js +++ b/src/translate-modal.js @@ -336,8 +336,12 @@ export function openTranslateModal() { // Calculate actual tokens that will be sent to AI (including preservation and chunking) let totalTokens = 0; + // Import all needed functions + const { getSelectedModelMaxTokens, getSelectedModel } = await import("./models.js"); + const { countTokensWithUpstream } = await import("./token_estimator.js"); + const { preserveSpecialContent, estimateProcessingTime, SUPPORTED_LANGUAGES } = await import("./translation.js"); + // Simulate the same chunking logic that translateHTML will use - const { getSelectedModelMaxTokens } = await import("./models.js"); const maxTokens = getSelectedModelMaxTokens() || 8192; const reserveTokens = 1000; const availableTokens = Math.max(maxTokens - reserveTokens, 2000); diff --git a/src/translation.js b/src/translation.js index 608243c..4fad771 100644 --- a/src/translation.js +++ b/src/translation.js @@ -125,12 +125,12 @@ async function* sendMessageWithHistory(messageHistory) { const modelMaxTokens = getSelectedModelMaxTokens(); const inputText = messageHistory.map(msg => msg.content).join(''); const inputTokens = Math.ceil(inputText.length / 4); // Simple token estimation - const buffer = Math.max(2048, Math.floor(inputTokens * 1.5)); // Use 1.5x input tokens as buffer, minimum 2048 - const availableTokens = Math.max(100, modelMaxTokens - inputTokens - buffer); + const reserveTokens = 1000; // Reserve for output tokens + const availableTokens = Math.max(100, modelMaxTokens - inputTokens - reserveTokens); console.log("Translation using endpoint:", apiUrl); console.log("Translation using model:", model); - console.log("Translation token calculation: max=" + modelMaxTokens + ", input≈" + inputTokens + ", buffer=" + buffer + ", available≈" + availableTokens); + console.log("Translation token calculation: max=" + modelMaxTokens + ", input≈" + inputTokens + ", reserve=" + reserveTokens + ", available≈" + availableTokens); const response = await fetch(apiUrl, { method: "POST", @@ -542,8 +542,8 @@ export async function translateHTML(htmlContent, targetLanguage, sourceUrl = nul console.log(`Content requires chunking: ${totalEstimatedTokens} total tokens > ${availableTokens} limit`); // Split the original HTML content into semantic chunks - // Reduce chunk size to account for translation expansion - const maxChunkInputTokens = Math.floor(availableTokens / 2.8); // Account for 1.8x expansion + overhead + // Use reasonable chunk size for the model's context window + const maxChunkInputTokens = Math.floor((maxTokens - 1500) / 2.5); // Leave room for prompt + expansion const chunks = await splitHTMLIntoChunks(processedContent, maxChunkInputTokens, getSelectedModel()); console.log(`Split into ${chunks.length} chunks for parallel translation`);