implement proportional token buffer: use 1.5x input tokens instead of fixed 2048

This commit is contained in:
Russell Ballestrini 2025-07-11 16:29:11 -04:00
parent 21349b9fcc
commit 54f05b0af0
4 changed files with 11 additions and 7 deletions

View file

@ -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";

View file

@ -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",

View file

@ -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(),

View file

@ -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",