Add {{maxContext}}, {{maxResponse}} macros and {{maxPromptTokens}} alias (#5176)

* Initial plan

* Add maxContext, maxResponse macros and maxPromptTokens alias

Co-authored-by: Cohee1207 <18619528+Cohee1207@users.noreply.github.com>

* Refactor getMaxContextSize to use getMaxContextTokens/getMaxResponseTokens and remove maxReply aliases

Co-authored-by: Cohee1207 <18619528+Cohee1207@users.noreply.github.com>

* Align aliases in single line

* Rename getMaxPromptTokens

---------

Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: Cohee1207 <18619528+Cohee1207@users.noreply.github.com>
This commit is contained in:
Copilot
2026-02-17 21:47:51 +02:00
committed by GitHub
parent 3bd1034639
commit eeda4d377e
4 changed files with 71 additions and 23 deletions
+38 -16
View File
@@ -326,6 +326,8 @@ export {
setCharacterSettingsOverrides as setScenarioOverride,
/** @deprecated Use appendMediaToMessage instead. */
appendMediaToMessage as appendImageToMessage,
/** @deprecated Use getMaxPromptTokens instead. */
getMaxPromptTokens as getMaxContextSize,
};
/**
@@ -4359,7 +4361,7 @@ export async function Generate(type, { automatic_trigger, force_name2, quiet_pro
}
// Determine token limit
let this_max_context = getMaxContextSize();
let this_max_context = getMaxPromptTokens();
if (!dryRun) {
console.debug('Running extension interceptors');
@@ -5720,21 +5722,15 @@ export async function sendMessageAsUser(messageText, messageBias, insertAt = nul
}
/**
* Gets the maximum usable context size for the current API.
* @param {number|null} overrideResponseLength Optional override for the response length.
* @returns {number} Maximum usable context size.
* Gets the maximum context token limit (the full context window size before subtracting response length).
* @returns {number} The maximum context token limit for the current API.
*/
export function getMaxContextSize(overrideResponseLength = null) {
if (typeof overrideResponseLength !== 'number' || overrideResponseLength <= 0 || isNaN(overrideResponseLength)) {
overrideResponseLength = null;
}
let this_max_context = 1487;
export function getMaxContextTokens() {
if (main_api == 'kobold' || main_api == 'koboldhorde' || main_api == 'textgenerationwebui') {
this_max_context = (max_context - (overrideResponseLength || amount_gen));
return max_context;
}
if (main_api == 'novel') {
this_max_context = Number(max_context);
let this_max_context = Number(max_context);
if (nai_settings.model_novel.includes('clio')) {
this_max_context = Math.min(max_context, 8192);
}
@@ -5754,13 +5750,39 @@ export function getMaxContextSize(overrideResponseLength = null) {
// Added special tokens and whatnot
this_max_context -= 10;
}
this_max_context = this_max_context - (overrideResponseLength || amount_gen);
return this_max_context;
}
if (main_api == 'openai') {
this_max_context = oai_settings.openai_max_context - (overrideResponseLength || oai_settings.openai_max_tokens);
return oai_settings.openai_max_context;
}
return this_max_context;
return 1487;
}
/**
* Gets the maximum response token limit (the max generation/reply length).
* @returns {number} The maximum response token limit for the current API.
*/
export function getMaxResponseTokens() {
if (main_api == 'kobold' || main_api == 'koboldhorde' || main_api == 'textgenerationwebui' || main_api == 'novel') {
return amount_gen;
}
if (main_api == 'openai') {
return oai_settings.openai_max_tokens;
}
return 0;
}
/**
* Gets the maximum usable prompt size for the current API.
* @param {number|null} overrideResponseLength Optional override for the response length.
* @returns {number} Maximum usable prompt size.
*/
export function getMaxPromptTokens(overrideResponseLength = null) {
if (typeof overrideResponseLength !== 'number' || overrideResponseLength <= 0 || isNaN(overrideResponseLength)) {
overrideResponseLength = null;
}
return getMaxContextTokens() - (overrideResponseLength || getMaxResponseTokens());
}
function parseTokenCounts(counts, thisPromptBits) {
+2 -2
View File
@@ -13,7 +13,7 @@ import {
saveSettingsDebounced,
substituteParamsExtended,
generateRaw,
getMaxContextSize,
getMaxPromptTokens,
setExtensionPrompt,
streamingProcessor,
animation_easing,
@@ -71,7 +71,7 @@ async function getSourceContextSize() {
return 1024 - 64;
}
return getMaxContextSize(overrideLength);
return getMaxPromptTokens(overrideLength);
}
const formatMemoryValue = function (value) {
+7 -2
View File
@@ -1,5 +1,5 @@
import { Handlebars, moment, seedrandom, droll } from '../lib.js';
import { chat, chat_metadata, main_api, getMaxContextSize, getCurrentChatId, substituteParams, eventSource, event_types, extension_prompts } from '../script.js';
import { chat, chat_metadata, main_api, getMaxPromptTokens, getMaxContextTokens, getMaxResponseTokens, getCurrentChatId, substituteParams, eventSource, event_types, extension_prompts } from '../script.js';
import { timestampToMoment, isDigitsOnly, getStringHash, escapeRegex, uuidv4 } from './utils.js';
import { textgenerationwebui_banned_in_macros } from './textgen-settings.js';
import { getInstructMacros } from './instruct-mode.js';
@@ -639,7 +639,12 @@ export function evaluateMacros(content, env, postProcessFn) {
* @type {Macro[]}
*/
const postEnvMacros = [
{ regex: /{{maxPrompt}}/gi, replace: () => String(getMaxContextSize()) },
{ regex: /{{maxPrompt}}/gi, replace: () => String(getMaxPromptTokens()) },
{ regex: /{{maxPromptTokens}}/gi, replace: () => String(getMaxPromptTokens()) },
{ regex: /{{maxContext}}/gi, replace: () => String(getMaxContextTokens()) },
{ regex: /{{maxContextTokens}}/gi, replace: () => String(getMaxContextTokens()) },
{ regex: /{{maxResponse}}/gi, replace: () => String(getMaxResponseTokens()) },
{ regex: /{{maxResponseTokens}}/gi, replace: () => String(getMaxResponseTokens()) },
{ regex: /{{lastMessage}}/gi, replace: () => getLastMessage() },
{ regex: /{{lastMessageId}}/gi, replace: () => String(getLastMessageId() ?? '') },
{ regex: /{{lastUserMessage}}/gi, replace: () => getLastUserMessage() },
@@ -1,5 +1,5 @@
import { seedrandom, droll } from '../../../lib.js';
import { chat_metadata, main_api, getMaxContextSize, extension_prompts, getCurrentChatId } from '../../../script.js';
import { chat_metadata, main_api, getMaxPromptTokens, getMaxContextTokens, getMaxResponseTokens, extension_prompts, getCurrentChatId } from '../../../script.js';
import { getStringHash, isFalseBoolean } from '../../utils.js';
import { textgenerationwebui_banned_in_macros } from '../../textgen-settings.js';
import { inject_ids } from '../../constants.js';
@@ -232,13 +232,34 @@ export function registerCoreMacros() {
handler: () => (/** @type {HTMLTextAreaElement} */(document.querySelector('#send_textarea')))?.value ?? '',
});
// {{maxPrompt}} -> max context size
// {{maxPrompt}} -> max context size (context minus response)
MacroRegistry.registerMacro('maxPrompt', {
aliases: [{ alias: 'maxPromptTokens', visible: true }],
category: MacroCategory.STATE,
description: 'Maximum prompt context size.',
returns: 'Maximum prompt context size.',
returnType: MacroValueType.INTEGER,
handler: () => String(getMaxContextSize()),
handler: () => String(getMaxPromptTokens()),
});
// {{maxContext}} -> max context token limit
MacroRegistry.registerMacro('maxContext', {
aliases: [{ alias: 'maxContextTokens', visible: true }],
category: MacroCategory.STATE,
description: 'Maximum context token limit.',
returns: 'Maximum context token limit.',
returnType: MacroValueType.INTEGER,
handler: () => String(getMaxContextTokens()),
});
// {{maxResponse}} -> max response token limit
MacroRegistry.registerMacro('maxResponse', {
aliases: [{ alias: 'maxResponseTokens', visible: true }],
category: MacroCategory.STATE,
description: 'Maximum response token limit.',
returns: 'Maximum response token limit.',
returnType: MacroValueType.INTEGER,
handler: () => String(getMaxResponseTokens()),
});
// String utilities