Migrate substituteParams calls to new engine (#4901)

b3708087536929469b2989d2364fabf0b160c0f1

Cohee <18619528+Cohee1207@users.noreply.github.com>

Signed
6 files changed, +47 -40Ignore whitespace
public/script.js+28 -19
@@ -3159,10 +3159,19 @@ export async function getExtensionPrompt(position = extension_prompt_types.IN_PR
31593159 return values;
31603160}
31613161
3162-export function baseChatReplace(value, name1, name2) {
3162+/**
3163- if (value !== undefined && value.length > 0) {
3163+ * Base chat replacement function for character card fields.
3164- const _ = undefined;
3164+ * 1. Substitutes macros using substituteParams.
3165- value = substituteParams(value, name1, name2, _, _, false);
3165+ * 2. Collapses newlines if enabled in power user settings.
3166+ * 3. Removes carriage return characters.
3167+ * @param {string} value Input string
3168+ * @param {string?} name1Override Override for name1
3169+ * @param {string?} name2Override Override for name2
3170+ * @returns {string} Processed string
3171+ */
3172+export function baseChatReplace(value, name1Override = null, name2Override = null) {
3173+ if (typeof value === 'string' && value.length > 0) {
3174+ value = substituteParams(value, { name1Override, name2Override, replaceCharacterCard: false });
31663175
31673176 if (power_user.collapse_newlines) {
31683177 value = collapseNewlines(value);
@@ -3229,47 +3238,47 @@ export function getCharacterCardFieldsLazy({ chid = undefined } = {}) {
32293238
32303239 /** @type {Record<string, () => string>} */
32313240 const resolvers = {
32323241 persona: () => baseChatReplace(power_user.persona_description?.trim(), name1, name2),
32333242 system: () => {
32343243 if (!character) return '';
32353244 const systemPrompt = chat_metadata['system_prompt'] || character.data?.system_prompt || '';
32363245 return power_user.prefer_character_prompt ? baseChatReplace(systemPrompt.trim(), name1, name2) : '';
32373246 },
32383247 jailbreak: () => {
32393248 if (!character) return '';
32403249 return power_user.prefer_character_jailbreak ? baseChatReplace(character.data?.post_history_instructions?.trim(), name1, name2) : '';
32413250 },
32423251 version: () => character?.data?.character_version ?? '',
32433252 charDepthPrompt: () => {
32443253 if (!character) return '';
32453254 return baseChatReplace(character.data?.extensions?.depth_prompt?.prompt?.trim(), name1, name2);
32463255 },
32473256 creatorNotes: () => {
32483257 if (!character) return '';
32493258 return baseChatReplace(character.data?.creator_notes?.trim(), name1, name2);
32503259 },
32513260 // These four fields may be overridden by group cards
32523261 description: () => {
32533262 if (groupCardsLazy) return groupCardsLazy.description;
32543263 if (!character) return '';
32553264 return baseChatReplace(character.description?.trim(), name1, name2);
32563265 },
32573266 personality: () => {
32583267 if (groupCardsLazy) return groupCardsLazy.personality;
32593268 if (!character) return '';
32603269 return baseChatReplace(character.personality?.trim(), name1, name2);
32613270 },
32623271 scenario: () => {
32633272 if (groupCardsLazy) return groupCardsLazy.scenario;
32643273 if (!character) return '';
32653274 const scenarioText = chat_metadata['scenario'] || character.scenario || '';
32663275 return baseChatReplace(scenarioText.trim(), name1, name2);
32673276 },
32683277 mesExamples: () => {
32693278 if (groupCardsLazy) return groupCardsLazy.mesExamples;
32703279 if (!character) return '';
32713280 const exampleDialog = chat_metadata['mes_example'] || character.mes_example || '';
32723281 return baseChatReplace(exampleDialog.trim(), name1, name2);
32733282 },
32743283 };
32753284
@@ -4404,7 +4413,7 @@ export async function Generate(type, { automatic_trigger, force_name2, quiet_pro
44044413 continue;
44054414 }
44064415
44074416 const formattedExample = baseChatReplace(exampleMessage, name1, name2);
44084417 const cleanedExample = parseMesExamples(formattedExample, isInstruct);
44094418
44104419 // Insert depending on before or after position
@@ -4448,9 +4457,9 @@ export async function Generate(type, { automatic_trigger, force_name2, quiet_pro
44484457 if (main_api !== 'openai') {
44494458 if (power_user.sysprompt.enabled) {
44504459 system = power_user.prefer_character_prompt && system
44514460 ? substituteParams(system, name1,{ name2,original: (power_user.sysprompt.content ?? '') })
44524461 : baseChatReplace(power_user.sysprompt.content, name1, name2);
44534462 system = isInstruct ? substituteParams(system, name1,{ name2,original: power_user.sysprompt.content ?? '' }) : system;
44544463 } else {
44554464 // Nullify if it's not enabled
44564465 system = '';
@@ -4508,8 +4517,8 @@ export async function Generate(type, { automatic_trigger, force_name2, quiet_pro
45084517
45094518 if (main_api !== 'openai' && power_user.sysprompt.enabled) {
45104519 jailbreak = power_user.prefer_character_jailbreak && jailbreak
45114520 ? substituteParams(jailbreak, name1,{ name2,original: (power_user.sysprompt.post_history ?? '') })
45124521 : baseChatReplace(power_user.sysprompt.post_history, name1, name2);
45134522
45144523 // Only inject the jb if there is one
45154524 if (jailbreak) {
public/scripts/PromptManager.js+3 -3
@@ -1280,10 +1280,10 @@ class PromptManager {
12801280 const preparedPrompt = new Prompt(prompt);
12811281
12821282 if (typeof original === 'string') {
12831283 if (0 < groupMembers.length) preparedPrompt.content = substituteParams(prompt.content ?? '', null, null,{ original, groupOverride: groupMembers.join(', ') });
12841284 else preparedPrompt.content = substituteParams(prompt.content, null, null,{ original });
12851285 } else {
12861286 if (0 < groupMembers.length) preparedPrompt.content = substituteParams(prompt.content ?? '', null, null,{ null,groupOverride: groupMembers.join(', ') });
12871287 else preparedPrompt.content = substituteParams(prompt.content);
12881288 }
12891289
public/scripts/extensions/regex/engine.js+1 -1
@@ -457,7 +457,7 @@ export function runRegexScript(regexScript, rawString, { characterOverride } = {
457457function filterString(rawString, trimStrings, { characterOverride } = {}) {
458458 let finalString = rawString;
459459 trimStrings.forEach((trimString) => {
460460 const subTrimString = substituteParams(trimString, undefined,{ name2Override: characterOverride });
461461 finalString = finalString.replaceAll(subTrimString, '');
462462 });
463463
public/scripts/extensions/translate/index.js+2 -2
@@ -210,7 +210,7 @@ async function translateIncomingMessage(messageId) {
210210 return;
211211 }
212212
213213 const textToTranslate = substituteParams(message.mes, context.name1,{ name2Override: message.name });
214214 const translation = await translate(textToTranslate, extension_settings.translate.target_language);
215215 message.extra.display_text = translation;
216216
@@ -238,7 +238,7 @@ async function translateIncomingMessageReasoning(messageId) {
238238 return false;
239239 }
240240
241241 const textToTranslate = substituteParams(message.extra.reasoning, context.name1,{ name2Override: message.name });
242242 const translation = await translate(textToTranslate, extension_settings.translate.target_language);
243243 message.extra.reasoning_display_text = translation;
244244
public/scripts/group-chats.js+6 -8
@@ -39,8 +39,6 @@ import {
3939 setCharacterName,
4040 setEditedMessageId,
4141 is_send_press,
42- name1,
43- name2,
4442 resetChatState,
4543 setSendButtonState,
4644 getCharacters,
@@ -459,7 +457,7 @@ export function getGroupDepthPrompts(groupId, characterId) {
459457 continue;
460458 }
461459
462460 const depthPromptText = baseChatReplace(character.data?.extensions?.depth_prompt?.prompt?.trim(), name1null, character.name) || '';
463461 const depthPromptDepth = character.data?.extensions?.depth_prompt?.depth ?? depth_prompt_depth_default;
464462 const depthPromptRole = character.data?.extensions?.depth_prompt?.role ?? depth_prompt_role_default;
465463
@@ -517,7 +515,7 @@ export function getGroupCharacterCardsLazy(groupId, characterId) {
517515 if (!value) return '';
518516 value = value.replace(/<FIELDNAME>/gi, fieldName);
519517 value = trim ? value.trim() : value;
520518 return baseChatReplace(value, name1null, characterName);
521519 }
522520
523521 /**
@@ -543,7 +541,7 @@ export function getGroupCharacterCardsLazy(groupId, characterId) {
543541 /**
544542 * Collects and joins field values from all group members
545543 * @param {string} fieldName Display name of the field
546544 * @param {function(import('../script.js').Character): string} getter Function to get field value from character
547545 * @param {function(string): string} [preprocess] Optional preprocess function
548546 * @returns {string} Combined field values
549547 */
@@ -567,8 +565,8 @@ export function getGroupCharacterCardsLazy(groupId, characterId) {
567565 return createLazyFields({
568566 description: () => collectField('Description', c => c.description),
569567 personality: () => collectField('Personality', c => c.personality),
570568 scenario: () => baseChatReplace(scenarioOverride?.trim(), name1, name2) || collectField('Scenario', c => c.scenario),
571569 mesExamples: () => baseChatReplace(mesExamplesOverride?.trim(), name1, name2) ||
572570 collectField('Example Messages', c => c.mes_example, x => !x.startsWith('<START>') ? `<START>\n${x}` : x),
573571 });
574572}
@@ -602,7 +600,7 @@ async function getFirstCharacterMessage(character) {
602600 mes['original_avatar'] = character.avatar;
603601 mes['extra'] = { 'gen_id': Date.now() * Math.random() * 1000000 };
604602 mes['mes'] = messageText
605603 ? substituteParams(messageText.trim(), name1,{ name2Override: character.name })
606604 : '';
607605 mes['force_avatar'] =
608606 character.avatar != 'none'
public/scripts/instruct-mode.js+7 -7
@@ -436,10 +436,10 @@ export function formatInstructModeChat(name, mes, isUser, isNarrator, forceAvata
436436 let suffix = getSuffix() || '';
437437
438438 if (instruct.macro) {
439439 prefix = substituteParams(prefix, { name1Override: name1, name2Override: name2 });
440440 prefix = prefix.replace(/{{name}}/gi, name || 'System');
441441
442442 suffix = substituteParams(suffix, { name1Override: name1, name2Override: name2 });
443443 suffix = suffix.replace(/{{name}}/gi, name || 'System');
444444 }
445445
@@ -524,10 +524,10 @@ export function formatInstructModeExamples(mesExamplesArray, name1, name2) {
524524 let outputSuffix = power_user.instruct.output_suffix || '';
525525
526526 if (power_user.instruct.macro) {
527527 inputPrefix = substituteParams(inputPrefix, { name1Override: name1, name2Override: name2 });
528528 outputPrefix = substituteParams(outputPrefix, { name1Override: name1, name2Override: name2 });
529529 inputSuffix = substituteParams(inputSuffix, { name1Override: name1, name2Override: name2 });
530530 outputSuffix = substituteParams(outputSuffix, { name1Override: name1, name2Override: name2 });
531531
532532 inputPrefix = inputPrefix.replace(/{{name}}/gi, name1);
533533 outputPrefix = outputPrefix.replace(/{{name}}/gi, name2);
@@ -631,7 +631,7 @@ export function formatInstructModePrompt(name, isImpersonate, promptBias, name1,
631631 }
632632
633633 if (instruct.macro) {
634634 sequence = substituteParams(sequence, { name1Override: name1, name2Override: name2 });
635635 sequence = sequence.replace(/{{name}}/gi, name || 'System');
636636 }
637637