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`);