mirror of
https://github.com/SillyTavern/SillyTavern.git
synced 2025-06-05 21:59:27 +02:00
New exports
This commit is contained in:
@ -398,23 +398,26 @@ export function formatInstructModeChat(name, mes, isUser, isNarrator, forceAvata
|
||||
/**
|
||||
* Formats instruct mode system prompt.
|
||||
* @param {string} systemPrompt System prompt string.
|
||||
* @param {InstructSettings} customInstruct Custom instruct mode settings.
|
||||
* @returns {string} Formatted instruct mode system prompt.
|
||||
*/
|
||||
export function formatInstructModeSystemPrompt(systemPrompt) {
|
||||
export function formatInstructModeSystemPrompt(systemPrompt, customInstruct = null) {
|
||||
if (!systemPrompt) {
|
||||
return '';
|
||||
}
|
||||
|
||||
const separator = power_user.instruct.wrap ? '\n' : '';
|
||||
const instruct = customInstruct ?? power_user.instruct;
|
||||
|
||||
if (power_user.instruct.system_sequence_prefix) {
|
||||
const separator = instruct.wrap ? '\n' : '';
|
||||
|
||||
if (instruct.system_sequence_prefix) {
|
||||
// TODO: Replace with a proper 'System' prompt entity name input
|
||||
const prefix = power_user.instruct.system_sequence_prefix.replace(/{{name}}/gi, 'System');
|
||||
const prefix = instruct.system_sequence_prefix.replace(/{{name}}/gi, 'System');
|
||||
systemPrompt = prefix + separator + systemPrompt;
|
||||
}
|
||||
|
||||
if (power_user.instruct.system_sequence_suffix) {
|
||||
systemPrompt = systemPrompt + separator + power_user.instruct.system_sequence_suffix;
|
||||
if (instruct.system_sequence_suffix) {
|
||||
systemPrompt = systemPrompt + separator + instruct.system_sequence_suffix;
|
||||
}
|
||||
|
||||
return systemPrompt;
|
||||
|
@ -705,16 +705,18 @@ export function parseExampleIntoIndividual(messageExampleString, appendNamesForG
|
||||
return result;
|
||||
}
|
||||
|
||||
function formatWorldInfo(value) {
|
||||
export function formatWorldInfo(value, { wiFormat = null } = {}) {
|
||||
if (!value) {
|
||||
return '';
|
||||
}
|
||||
|
||||
if (!oai_settings.wi_format.trim()) {
|
||||
const format = wiFormat || oai_settings.wi_format;
|
||||
|
||||
if (!format.trim()) {
|
||||
return value;
|
||||
}
|
||||
|
||||
return stringFormat(oai_settings.wi_format, value);
|
||||
return stringFormat(format, value);
|
||||
}
|
||||
|
||||
/**
|
||||
@ -952,7 +954,7 @@ async function populateDialogueExamples(prompts, chatCompletion, messageExamples
|
||||
* @param {number} position - Prompt position in the extensions object.
|
||||
* @returns {string|false} - The prompt position for prompt collection.
|
||||
*/
|
||||
function getPromptPosition(position) {
|
||||
export function getPromptPosition(position) {
|
||||
if (position == extension_prompt_types.BEFORE_PROMPT) {
|
||||
return 'start';
|
||||
}
|
||||
@ -969,7 +971,7 @@ function getPromptPosition(position) {
|
||||
* @param {number} role Role of the prompt.
|
||||
* @returns {string} Mapped role.
|
||||
*/
|
||||
function getPromptRole(role) {
|
||||
export function getPromptRole(role) {
|
||||
switch (role) {
|
||||
case extension_prompt_roles.SYSTEM:
|
||||
return 'system';
|
||||
|
@ -1985,15 +1985,21 @@ export function fuzzySearchGroups(searchValue, fuzzySearchCaches = null) {
|
||||
/**
|
||||
* Renders a story string template with the given parameters.
|
||||
* @param {object} params Template parameters.
|
||||
* @param {object} [options] Additional options.
|
||||
* @param {string} [options.customStoryString] Custom story string template.
|
||||
* @param {InstructSettings} [options.customInstructSettings] Custom instruct settings.
|
||||
* @returns {string} The rendered story string.
|
||||
*/
|
||||
export function renderStoryString(params) {
|
||||
export function renderStoryString(params, { customStoryString = null, customInstructSettings = null } = {}) {
|
||||
try {
|
||||
const storyString = customStoryString ?? power_user.context.story_string;
|
||||
const instructSettings = customInstructSettings ?? power_user.instruct;
|
||||
|
||||
// Validate and log possible warnings/errors
|
||||
validateStoryString(power_user.context.story_string, params);
|
||||
validateStoryString(storyString, params);
|
||||
|
||||
// compile the story string template into a function, with no HTML escaping
|
||||
const compiledTemplate = Handlebars.compile(power_user.context.story_string, { noEscape: true });
|
||||
const compiledTemplate = Handlebars.compile(storyString, { noEscape: true });
|
||||
|
||||
// render the story string template with the given params
|
||||
let output = compiledTemplate(params);
|
||||
@ -2006,7 +2012,7 @@ export function renderStoryString(params) {
|
||||
|
||||
// add a newline to the end of the story string if it doesn't have one
|
||||
if (output.length > 0 && !output.endsWith('\n')) {
|
||||
if (!power_user.instruct.enabled || power_user.instruct.wrap) {
|
||||
if (!instructSettings.enabled || instructSettings.wrap) {
|
||||
output += '\n';
|
||||
}
|
||||
}
|
||||
|
@ -49,6 +49,7 @@ import {
|
||||
clearChat,
|
||||
unshallowCharacter,
|
||||
deleteLastMessage,
|
||||
getCharacterCardFields,
|
||||
} from '../script.js';
|
||||
import {
|
||||
extension_settings,
|
||||
@ -78,7 +79,7 @@ import { ToolManager } from './tool-calling.js';
|
||||
import { accountStorage } from './util/AccountStorage.js';
|
||||
import { timestampToMoment, uuidv4 } from './utils.js';
|
||||
import { getGlobalVariable, getLocalVariable, setGlobalVariable, setLocalVariable } from './variables.js';
|
||||
import { convertCharacterBook, loadWorldInfo, saveWorldInfo, updateWorldInfoList } from './world-info.js';
|
||||
import { convertCharacterBook, getWorldInfoPrompt, loadWorldInfo, saveWorldInfo, updateWorldInfoList } from './world-info.js';
|
||||
import { ChatCompletionService, TextCompletionService } from './custom-request.js';
|
||||
import { ConnectionManagerRequestService } from './extensions/shared.js';
|
||||
import { updateReasoningUI, parseReasoningFromString } from './reasoning.js';
|
||||
@ -189,6 +190,7 @@ export function getContext() {
|
||||
textCompletionSettings: textgenerationwebui_settings,
|
||||
powerUserSettings: power_user,
|
||||
getCharacters,
|
||||
getCharacterCardFields,
|
||||
uuidv4,
|
||||
humanizedDateTime,
|
||||
updateMessageBlock,
|
||||
@ -207,6 +209,7 @@ export function getContext() {
|
||||
saveWorldInfo,
|
||||
updateWorldInfoList,
|
||||
convertCharacterBook,
|
||||
getWorldInfoPrompt,
|
||||
CONNECT_API_MAP,
|
||||
getTextGenServer,
|
||||
extractMessageFromData,
|
||||
|
@ -756,7 +756,7 @@ export const worldInfoCache = new StructuredCloneMap({ cloneOnGet: true, cloneOn
|
||||
* @param {string[]} chat The chat messages to scan, in reverse order.
|
||||
* @param {number} maxContext The maximum context size of the generation.
|
||||
* @param {boolean} isDryRun If true, the function will not emit any events.
|
||||
* @typedef {{worldInfoString: string, worldInfoBefore: string, worldInfoAfter: string, worldInfoExamples: any[], worldInfoDepth: any[]}} WIPromptResult
|
||||
* @typedef {{worldInfoString: string, worldInfoBefore: string, worldInfoAfter: string, worldInfoExamples: any[], worldInfoDepth: any[], anBefore: any[], anAfter: any[]}} WIPromptResult
|
||||
* @returns {Promise<WIPromptResult>} The world info string and depth.
|
||||
*/
|
||||
export async function getWorldInfoPrompt(chat, maxContext, isDryRun) {
|
||||
@ -778,6 +778,8 @@ export async function getWorldInfoPrompt(chat, maxContext, isDryRun) {
|
||||
worldInfoAfter,
|
||||
worldInfoExamples: activatedWorldInfo.EMEntries ?? [],
|
||||
worldInfoDepth: activatedWorldInfo.WIDepthEntries ?? [],
|
||||
anBefore: activatedWorldInfo.ANBeforeEntries ?? [],
|
||||
anAfter: activatedWorldInfo.ANAfterEntries ?? [],
|
||||
};
|
||||
}
|
||||
|
||||
@ -3862,7 +3864,7 @@ function parseDecorators(content) {
|
||||
* @param {string[]} chat The chat messages to scan, in reverse order.
|
||||
* @param {number} maxContext The maximum context size of the generation.
|
||||
* @param {boolean} isDryRun Whether to perform a dry run.
|
||||
* @typedef {{ worldInfoBefore: string, worldInfoAfter: string, EMEntries: any[], WIDepthEntries: any[], allActivatedEntries: Set<any> }} WIActivated
|
||||
* @typedef {{ worldInfoBefore: string, worldInfoAfter: string, EMEntries: any[], WIDepthEntries: any[], ANBeforeEntries: any[], ANAfterEntries: any[], allActivatedEntries: Set<any> }} WIActivated
|
||||
* @returns {Promise<WIActivated>} The world info activated.
|
||||
*/
|
||||
export async function checkWorldInfo(chat, maxContext, isDryRun) {
|
||||
@ -3906,7 +3908,7 @@ export async function checkWorldInfo(chat, maxContext, isDryRun) {
|
||||
timedEffects.checkTimedEffects();
|
||||
|
||||
if (sortedEntries.length === 0) {
|
||||
return { worldInfoBefore: '', worldInfoAfter: '', WIDepthEntries: [], EMEntries: [], allActivatedEntries: new Set() };
|
||||
return { worldInfoBefore: '', worldInfoAfter: '', WIDepthEntries: [], EMEntries: [], ANBeforeEntries: [], ANAfterEntries: [], allActivatedEntries: new Set() };
|
||||
}
|
||||
|
||||
/** @type {number[]} Represents the delay levels for entries that are delayed until recursion */
|
||||
@ -4355,7 +4357,7 @@ export async function checkWorldInfo(chat, maxContext, isDryRun) {
|
||||
console.log(`[WI] ${isDryRun ? 'Hypothetically adding' : 'Adding'} ${allActivatedEntries.size} entries to prompt`, Array.from(allActivatedEntries.values()));
|
||||
console.debug(`[WI] --- DONE${isDryRun ? ' (DRY RUN)' : ''} ---`);
|
||||
|
||||
return { worldInfoBefore, worldInfoAfter, EMEntries, WIDepthEntries, allActivatedEntries: new Set(allActivatedEntries.values()) };
|
||||
return { worldInfoBefore, worldInfoAfter, EMEntries, WIDepthEntries, ANBeforeEntries: ANTopEntries, ANAfterEntries: ANBottomEntries, allActivatedEntries: new Set(allActivatedEntries.values()) };
|
||||
}
|
||||
|
||||
/**
|
||||
|
Reference in New Issue
Block a user