From 54f05b0af0289fc0254f573d514868e839783df2 Mon Sep 17 00:00:00 2001 From: Russell Ballestrini Date: Fri, 11 Jul 2025 16:29:11 -0400 Subject: [PATCH] implement proportional token buffer: use 1.5x input tokens instead of fixed 2048 --- src/chat.js | 5 +++-- src/translation.js | 5 +++-- src/tts.js | 3 ++- src/ui.js | 5 +++-- 4 files changed, 11 insertions(+), 7 deletions(-) diff --git a/src/chat.js b/src/chat.js index de3551a..6626202 100644 --- a/src/chat.js +++ b/src/chat.js @@ -13,8 +13,9 @@ function estimateTokens(text) { function calculateAvailableTokens(chatHistory, maxTokens) { const inputText = chatHistory.map(msg => msg.content).join(''); const inputTokens = estimateTokens(inputText); - const availableTokens = Math.max(100, maxTokens - inputTokens - 2048); // Reserve 2048 tokens buffer - console.log(`Token calculation: max=${maxTokens}, input≈${inputTokens}, available≈${availableTokens}`); + const buffer = Math.max(2048, Math.floor(inputTokens * 1.5)); // Use 1.5x input tokens as buffer, minimum 2048 + const availableTokens = Math.max(100, maxTokens - inputTokens - buffer); + console.log(`Token calculation: max=${maxTokens}, input≈${inputTokens}, buffer=${buffer}, available≈${availableTokens}`); return availableTokens; } import { initializeChatHistory, saveConversationHistory } from "./storage.js"; diff --git a/src/translation.js b/src/translation.js index 9fd7547..9355077 100644 --- a/src/translation.js +++ b/src/translation.js @@ -74,11 +74,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 availableTokens = Math.max(100, modelMaxTokens - inputTokens - 2048); // 2048 token buffer + 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); console.log("Translation using endpoint:", apiUrl); console.log("Translation using model:", model); - console.log("Translation token calculation: max=" + modelMaxTokens + ", input≈" + inputTokens + ", available≈" + availableTokens); + console.log("Translation token calculation: max=" + modelMaxTokens + ", input≈" + inputTokens + ", buffer=" + buffer + ", available≈" + availableTokens); const response = await fetch(apiUrl, { method: "POST", diff --git a/src/tts.js b/src/tts.js index 70725a6..e078d15 100644 --- a/src/tts.js +++ b/src/tts.js @@ -144,7 +144,8 @@ Your task: Return only the article text ready for TTS, nothing else.`; const inputTokens = Math.ceil((systemPrompt + preCleanedContent).length / 4); - const availableTokens = Math.max(100, modelMaxTokens - inputTokens - 2048); + 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 payload = { model: getSelectedModel(), diff --git a/src/ui.js b/src/ui.js index e2a2ae3..0248e02 100644 --- a/src/ui.js +++ b/src/ui.js @@ -144,8 +144,9 @@ async function* sendMessageWithCustomHistory(messageHistory) { // Estimate input tokens for intro generation const inputText = messageHistory.map(msg => msg.content).join(''); const inputTokens = Math.ceil(inputText.length / 4); - const calculatedAvailable = Math.max(2048, modelMaxTokens - inputTokens - 50); - console.log("UI (intro generation) using calculated available tokens:", calculatedAvailable, "of model max:", modelMaxTokens); + const buffer = Math.max(2048, Math.floor(inputTokens * 1.5)); // Use 1.5x input tokens as buffer, minimum 2048 + const calculatedAvailable = Math.max(100, modelMaxTokens - inputTokens - buffer); + console.log("UI (intro generation) using calculated available tokens:", calculatedAvailable, "buffer:", buffer, "of model max:", modelMaxTokens); const response = await fetch(apiUrl, { method: "POST",