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>

eeda4d377ee2d4fb21f536ae793cda6d1673b449

Copilot <198982749+Copilot@users.noreply.github.com>

Signed
4 files changed, +70 -22Ignore whitespace
public/script.js+37 -15
@@ -326,6 +326,8 @@ export {
326326 setCharacterSettingsOverrides as setScenarioOverride,
327327 /** @deprecated Use appendMediaToMessage instead. */
328328 appendMediaToMessage as appendImageToMessage,
329+ /** @deprecated Use getMaxPromptTokens instead. */
330+ getMaxPromptTokens as getMaxContextSize,
329331};
330332
331333/**
@@ -4359,7 +4361,7 @@ export async function Generate(type, { automatic_trigger, force_name2, quiet_pro
43594361 }
43604362
43614363 // Determine token limit
43624364 let this_max_context = getMaxContextSizegetMaxPromptTokens();
43634365
43644366 if (!dryRun) {
43654367 console.debug('Running extension interceptors');
@@ -5720,21 +5722,15 @@ export async function sendMessageAsUser(messageText, messageBias, insertAt = nul
57205722}
57215723
57225724/**
57235725 * Gets the maximum usablecontext token limit (the full context window size forbefore thesubtracting currentresponse APIlength).
57245726 * @paramreturns {number|null} overrideResponseLengthThe Optionalmaximum overridecontext token limit for the responsecurrent lengthAPI.
5725- * @returns {number} Maximum usable context size.
57265727 */
57275728export function getMaxContextSizegetMaxContextTokens(overrideResponseLength = null) {
5728- if (typeof overrideResponseLength !== 'number' || overrideResponseLength <= 0 || isNaN(overrideResponseLength)) {
5729- overrideResponseLength = null;
5730- }
5731-
5732- let this_max_context = 1487;
57335729 if (main_api == 'kobold' || main_api == 'koboldhorde' || main_api == 'textgenerationwebui') {
5734- this_max_context = (max_context - (overrideResponseLength || amount_gen));
5730+ return max_context;
57355731 }
57365732 if (main_api == 'novel') {
57375733 let this_max_context = Number(max_context);
57385734 if (nai_settings.model_novel.includes('clio')) {
57395735 this_max_context = Math.min(max_context, 8192);
57405736 }
@@ -5754,13 +5750,39 @@ export function getMaxContextSize(overrideResponseLength = null) {
57545750 // Added special tokens and whatnot
57555751 this_max_context -= 10;
57565752 }
5753+ return this_max_context;
5754+ }
5755+ if (main_api == 'openai') {
5756+ return oai_settings.openai_max_context;
5757+ }
5758+ return 1487;
5759+}
57575760
5758- this_max_context = this_max_context - (overrideResponseLength || amount_gen);
5761+/**
5762+ * Gets the maximum response token limit (the max generation/reply length).
5763+ * @returns {number} The maximum response token limit for the current API.
5764+ */
5765+export function getMaxResponseTokens() {
5766+ if (main_api == 'kobold' || main_api == 'koboldhorde' || main_api == 'textgenerationwebui' || main_api == 'novel') {
5767+ return amount_gen;
57595768 }
57605769 if (main_api == 'openai') {
5761- this_max_context = oai_settings.openai_max_context - (overrideResponseLength || oai_settings.openai_max_tokens);
5770+ return oai_settings.openai_max_tokens;
5771+ }
5772+ return 0;
5773+}
5774+
5775+/**
5776+ * Gets the maximum usable prompt size for the current API.
5777+ * @param {number|null} overrideResponseLength Optional override for the response length.
5778+ * @returns {number} Maximum usable prompt size.
5779+ */
5780+export function getMaxPromptTokens(overrideResponseLength = null) {
5781+ if (typeof overrideResponseLength !== 'number' || overrideResponseLength <= 0 || isNaN(overrideResponseLength)) {
5782+ overrideResponseLength = null;
57625783 }
5763- return this_max_context;
5784+
5785+ return getMaxContextTokens() - (overrideResponseLength || getMaxResponseTokens());
57645786}
57655787
57665788function parseTokenCounts(counts, thisPromptBits) {
public/scripts/extensions/memory/index.js+2 -2
@@ -13,7 +13,7 @@ import {
1313 saveSettingsDebounced,
1414 substituteParamsExtended,
1515 generateRaw,
1616 getMaxContextSizegetMaxPromptTokens,
1717 setExtensionPrompt,
1818 streamingProcessor,
1919 animation_easing,
@@ -71,7 +71,7 @@ async function getSourceContextSize() {
7171 return 1024 - 64;
7272 }
7373
7474 return getMaxContextSizegetMaxPromptTokens(overrideLength);
7575}
7676
7777const formatMemoryValue = function (value) {
public/scripts/macros.js+7 -2
@@ -1,5 +1,5 @@
11import { Handlebars, moment, seedrandom, droll } from '../lib.js';
22import { chat, chat_metadata, main_api, getMaxContextSizegetMaxPromptTokens, getMaxContextTokens, getMaxResponseTokens, getCurrentChatId, substituteParams, eventSource, event_types, extension_prompts } from '../script.js';
33import { timestampToMoment, isDigitsOnly, getStringHash, escapeRegex, uuidv4 } from './utils.js';
44import { textgenerationwebui_banned_in_macros } from './textgen-settings.js';
55import { getInstructMacros } from './instruct-mode.js';
@@ -639,7 +639,12 @@ export function evaluateMacros(content, env, postProcessFn) {
639639 * @type {Macro[]}
640640 */
641641 const postEnvMacros = [
642642 { regex: /{{maxPrompt}}/gi, replace: () => String(getMaxContextSizegetMaxPromptTokens()) },
643+ { regex: /{{maxPromptTokens}}/gi, replace: () => String(getMaxPromptTokens()) },
644+ { regex: /{{maxContext}}/gi, replace: () => String(getMaxContextTokens()) },
645+ { regex: /{{maxContextTokens}}/gi, replace: () => String(getMaxContextTokens()) },
646+ { regex: /{{maxResponse}}/gi, replace: () => String(getMaxResponseTokens()) },
647+ { regex: /{{maxResponseTokens}}/gi, replace: () => String(getMaxResponseTokens()) },
643648 { regex: /{{lastMessage}}/gi, replace: () => getLastMessage() },
644649 { regex: /{{lastMessageId}}/gi, replace: () => String(getLastMessageId() ?? '') },
645650 { regex: /{{lastUserMessage}}/gi, replace: () => getLastUserMessage() },
public/scripts/macros/definitions/core-macros.js+24 -3
@@ -1,5 +1,5 @@
11import { seedrandom, droll } from '../../../lib.js';
22import { chat_metadata, main_api, getMaxContextSizegetMaxPromptTokens, getMaxContextTokens, getMaxResponseTokens, extension_prompts, getCurrentChatId } from '../../../script.js';
33import { getStringHash, isFalseBoolean } from '../../utils.js';
44import { textgenerationwebui_banned_in_macros } from '../../textgen-settings.js';
55import { inject_ids } from '../../constants.js';
@@ -232,13 +232,34 @@ export function registerCoreMacros() {
232232 handler: () => (/** @type {HTMLTextAreaElement} */(document.querySelector('#send_textarea')))?.value ?? '',
233233 });
234234
235235 // {{maxPrompt}} -> max context size (context minus response)
236236 MacroRegistry.registerMacro('maxPrompt', {
237+ aliases: [{ alias: 'maxPromptTokens', visible: true }],
237238 category: MacroCategory.STATE,
238239 description: 'Maximum prompt context size.',
239240 returns: 'Maximum prompt context size.',
240241 returnType: MacroValueType.INTEGER,
241242 handler: () => String(getMaxContextSizegetMaxPromptTokens()),
243+ });
244+
245+ // {{maxContext}} -> max context token limit
246+ MacroRegistry.registerMacro('maxContext', {
247+ aliases: [{ alias: 'maxContextTokens', visible: true }],
248+ category: MacroCategory.STATE,
249+ description: 'Maximum context token limit.',
250+ returns: 'Maximum context token limit.',
251+ returnType: MacroValueType.INTEGER,
252+ handler: () => String(getMaxContextTokens()),
253+ });
254+
255+ // {{maxResponse}} -> max response token limit
256+ MacroRegistry.registerMacro('maxResponse', {
257+ aliases: [{ alias: 'maxResponseTokens', visible: true }],
258+ category: MacroCategory.STATE,
259+ description: 'Maximum response token limit.',
260+ returns: 'Maximum response token limit.',
261+ returnType: MacroValueType.INTEGER,
262+ handler: () => String(getMaxResponseTokens()),
242263 });
243264
244265 // String utilities