mirror of
https://github.com/SillyTavern/SillyTavern.git
synced 2025-06-05 21:59:27 +02:00
World Info: Add example messages insertion point
Allow insertion above and below mesExamples (also known as the "examples of dialogue") box. Signed-off-by: kingbri <bdashore3@proton.me>
This commit is contained in:
@@ -34,6 +34,7 @@ import {
|
||||
checkEmbeddedWorld,
|
||||
setWorldInfoButtonClass,
|
||||
importWorldInfo,
|
||||
wi_anchor_position,
|
||||
} from './scripts/world-info.js';
|
||||
|
||||
import {
|
||||
@@ -3223,32 +3224,6 @@ export async function Generate(type, { automatic_trigger, force_name2, quiet_pro
|
||||
setExtensionPrompt('DEPTH_PROMPT', depthPromptText, extension_prompt_types.IN_CHAT, depthPromptDepth, extension_settings.note.allowWIScan, depthPromptRole);
|
||||
}
|
||||
|
||||
// Parse example messages
|
||||
if (!mesExamples.startsWith('<START>')) {
|
||||
mesExamples = '<START>\n' + mesExamples.trim();
|
||||
}
|
||||
if (mesExamples.replace(/<START>/gi, '').trim().length === 0) {
|
||||
mesExamples = '';
|
||||
}
|
||||
const mesExamplesRaw = mesExamples;
|
||||
/**
|
||||
* Adds a block heading to the examples string.
|
||||
* @param {string} examplesStr
|
||||
* @returns {string[]} Examples array with block heading
|
||||
*/
|
||||
function addBlockHeading(examplesStr) {
|
||||
const exampleSeparator = power_user.context.example_separator ? `${substituteParams(power_user.context.example_separator)}\n` : '';
|
||||
const blockHeading = main_api === 'openai' ? '<START>\n' : (exampleSeparator || (isInstruct ? '<START>\n' : ''));
|
||||
return examplesStr.split(/<START>/gi).slice(1).map(block => `${blockHeading}${block.trim()}\n`);
|
||||
}
|
||||
|
||||
let mesExamplesArray = addBlockHeading(mesExamples);
|
||||
let mesExamplesRawArray = addBlockHeading(mesExamplesRaw);
|
||||
|
||||
if (mesExamplesArray && isInstruct) {
|
||||
mesExamplesArray = formatInstructModeExamples(mesExamplesArray, name1, name2);
|
||||
}
|
||||
|
||||
// First message in fresh 1-on-1 chat reacts to user/character settings changes
|
||||
if (chat.length) {
|
||||
chat[0].mes = substituteParams(chat[0].mes);
|
||||
@@ -3317,6 +3292,30 @@ export async function Generate(type, { automatic_trigger, force_name2, quiet_pro
|
||||
force_name2 = false;
|
||||
}
|
||||
|
||||
// TODO (kingbri): Migrate to a utility function
|
||||
/**
|
||||
* Parses an examples string.
|
||||
* @param {string} examplesStr
|
||||
* @returns {string[]} Examples array with block heading
|
||||
*/
|
||||
function parseMesExamples(examplesStr) {
|
||||
if (examplesStr.length === 0) {
|
||||
return [];
|
||||
}
|
||||
|
||||
if (!examplesStr.startsWith('<START>')) {
|
||||
examplesStr = '<START>\n' + examplesStr.trim();
|
||||
}
|
||||
|
||||
const exampleSeparator = power_user.context.example_separator ? `${substituteParams(power_user.context.example_separator)}\n` : '';
|
||||
const blockHeading = main_api === 'openai' ? '<START>\n' : (exampleSeparator || (isInstruct ? '<START>\n' : ''));
|
||||
const splitExamples = examplesStr.split(/<START>/gi).slice(1).map(block => `${blockHeading}${block.trim()}\n`);
|
||||
|
||||
return splitExamples;
|
||||
}
|
||||
|
||||
let mesExamplesArray = parseMesExamples(mesExamples);
|
||||
|
||||
//////////////////////////////////
|
||||
// Extension added strings
|
||||
// Set non-WI AN
|
||||
@@ -3326,9 +3325,35 @@ export async function Generate(type, { automatic_trigger, force_name2, quiet_pro
|
||||
// Make quiet prompt available for WIAN
|
||||
setExtensionPrompt('QUIET_PROMPT', quiet_prompt || '', extension_prompt_types.IN_PROMPT, 0, true);
|
||||
const chatForWI = coreChat.map(x => `${x.name}: ${x.mes}`).reverse();
|
||||
let { worldInfoString, worldInfoBefore, worldInfoAfter, worldInfoDepth } = await getWorldInfoPrompt(chatForWI, this_max_context, dryRun);
|
||||
let { worldInfoString, worldInfoBefore, worldInfoAfter, worldInfoExamples, worldInfoDepth } = await getWorldInfoPrompt(chatForWI, this_max_context, dryRun);
|
||||
setExtensionPrompt('QUIET_PROMPT', '', extension_prompt_types.IN_PROMPT, 0, true);
|
||||
|
||||
// Add message example WI
|
||||
for (const example of worldInfoExamples) {
|
||||
let exampleMessage = example.content;
|
||||
|
||||
if (exampleMessage.length === 0) {
|
||||
continue;
|
||||
}
|
||||
|
||||
let formattedExample = baseChatReplace(exampleMessage, name1, name2)
|
||||
const cleanedExample = parseMesExamples(formattedExample);
|
||||
|
||||
// Insert depending on before or after position
|
||||
if (example.position === wi_anchor_position.before) {
|
||||
mesExamplesArray.unshift(...cleanedExample);
|
||||
} else {
|
||||
mesExamplesArray.push(...cleanedExample);
|
||||
}
|
||||
}
|
||||
|
||||
// At this point, the raw message examples can be created
|
||||
const mesExamplesRawArray = [...mesExamplesArray]
|
||||
|
||||
if (mesExamplesArray && isInstruct) {
|
||||
mesExamplesArray = formatInstructModeExamples(mesExamplesArray, name1, name2);
|
||||
}
|
||||
|
||||
if (skipWIAN !== true) {
|
||||
console.log('skipWIAN not active, adding WIAN');
|
||||
// Add all depth WI entries to prompt
|
||||
|
Reference in New Issue
Block a user