From afd32d1f4d5b3db9a50391728a3f2cfd553c931f Mon Sep 17 00:00:00 2001 From: LenAnderson Date: Thu, 7 Dec 2023 12:56:28 +0000 Subject: [PATCH 1/7] better handling of array / object vars --- public/scripts/variables.js | 20 ++++++++++++++++++-- 1 file changed, 18 insertions(+), 2 deletions(-) diff --git a/public/scripts/variables.js b/public/scripts/variables.js index 6612dd01b..99175d9c4 100644 --- a/public/scripts/variables.js +++ b/public/scripts/variables.js @@ -11,7 +11,15 @@ function getLocalVariable(name, args = {}) { if (args.index !== undefined) { try { localVariable = JSON.parse(localVariable); - localVariable = localVariable[Number(args.index)]; + const numIndex = Number(args.index); + if (Number.isNaN(numIndex)) { + localVariable = localVariable[args.index]; + } else { + localVariable = localVariable[Number(args.index)]; + } + if (typeof localVariable == 'object') { + localVariable = JSON.stringify(localVariable); + } } catch { // that didn't work } @@ -35,7 +43,15 @@ function getGlobalVariable(name, args = {}) { if (args.index !== undefined) { try { globalVariable = JSON.parse(globalVariable); - globalVariable = globalVariable[Number(args.index)]; + const numIndex = Number(args.index); + if (Number.isNaN(numIndex)) { + globalVariable = globalVariable[args.index]; + } else { + globalVariable = globalVariable[Number(args.index)]; + } + if (typeof globalVariable == 'object') { + globalVariable = JSON.stringify(globalVariable); + } } catch { // that didn't work } From 2417ae9d8742217481f0ca10c97d69745885ece3 Mon Sep 17 00:00:00 2001 From: Cohee <18619528+Cohee1207@users.noreply.github.com> Date: Thu, 7 Dec 2023 16:57:47 +0200 Subject: [PATCH 2/7] #1484 Display version on close chat --- public/script.js | 1 + 1 file changed, 1 insertion(+) diff --git a/public/script.js b/public/script.js index 6ab1ddccc..3e62517cd 100644 --- a/public/script.js +++ b/public/script.js @@ -8427,6 +8427,7 @@ jQuery(async function () { select_rm_characters(); sendSystemMessage(system_message_types.WELCOME); eventSource.emit(event_types.CHAT_CHANGED, getCurrentChatId()); + await getClientVersion(); } else { toastr.info('Please stop the message generation first.'); } From 990f958f4f605c1eff29e75606c0dd1263d667a0 Mon Sep 17 00:00:00 2001 From: Cohee <18619528+Cohee1207@users.noreply.github.com> Date: Thu, 7 Dec 2023 16:59:53 +0200 Subject: [PATCH 3/7] #1484 Consolidate chat name template --- public/script.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/public/script.js b/public/script.js index 3e62517cd..79fb6a917 100644 --- a/public/script.js +++ b/public/script.js @@ -1291,7 +1291,7 @@ async function replaceCurrentChat() { // start new chat else { - characters[this_chid].chat = name2 + ' - ' + humanizedDateTime(); + characters[this_chid].chat = `${name2} - ${humanizedDateTime()}`; $('#selected_chat_pole').val(characters[this_chid].chat); saveCharacterDebounced(); await getChat(); @@ -8026,7 +8026,7 @@ jQuery(async function () { else { //RossAscends: added character name to new chat filenames and replaced Date.now() with humanizedDateTime; chat_metadata = {}; - characters[this_chid].chat = name2 + '-' + humanizedDateTime(); + characters[this_chid].chat = `${name2} - ${humanizedDateTime()}`; $('#selected_chat_pole').val(characters[this_chid].chat); await getChat(); await createOrEditCharacter(); From 72adb4c8aab4ee48051ac362e79693aafb70dff9 Mon Sep 17 00:00:00 2001 From: Cohee <18619528+Cohee1207@users.noreply.github.com> Date: Thu, 7 Dec 2023 17:42:06 +0200 Subject: [PATCH 4/7] Fix window.ai streaming --- public/scripts/openai.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/public/scripts/openai.js b/public/scripts/openai.js index 444f08717..30f4c6e29 100644 --- a/public/scripts/openai.js +++ b/public/scripts/openai.js @@ -1176,7 +1176,7 @@ async function sendWindowAIRequest(messages, signal, stream) { await delay(1); if (lastContent !== content) { - yield content; + yield { text: content, swipes: [] }; } lastContent = content; From b1f68d886c4e49168d07f902ad2c3b0b3aa0e44c Mon Sep 17 00:00:00 2001 From: Cohee <18619528+Cohee1207@users.noreply.github.com> Date: Thu, 7 Dec 2023 18:45:34 +0200 Subject: [PATCH 5/7] Fix WI field access for UID = 0 --- public/scripts/world-info.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/public/scripts/world-info.js b/public/scripts/world-info.js index d29cbe222..9810a47f4 100644 --- a/public/scripts/world-info.js +++ b/public/scripts/world-info.js @@ -295,7 +295,7 @@ function registerWorldInfoSlashCommands() { return ''; } - const entry = entries.find(x => x.uid === uid); + const entry = entries.find(x => String(x.uid) === String(uid)); if (!entry) { toastr.warning('Valid UID is required'); From e804f273682f99c9ad3bb3d51e96bb04d7f700a5 Mon Sep 17 00:00:00 2001 From: Cohee <18619528+Cohee1207@users.noreply.github.com> Date: Thu, 7 Dec 2023 19:37:55 +0200 Subject: [PATCH 6/7] Convert value to string for echo. Fix return value --- public/scripts/slash-commands.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/public/scripts/slash-commands.js b/public/scripts/slash-commands.js index 4ff362e63..8b9f084c4 100644 --- a/public/scripts/slash-commands.js +++ b/public/scripts/slash-commands.js @@ -597,7 +597,7 @@ async function generateCallback(args, value) { } async function echoCallback(args, value) { - const safeValue = DOMPurify.sanitize(value || ''); + const safeValue = DOMPurify.sanitize(String(value) || ''); if (safeValue === '') { console.warn('WARN: No argument provided for /echo command'); return; @@ -619,6 +619,7 @@ async function echoCallback(args, value) { toastr.info(safeValue, title); break; } + return value; } async function addSwipeCallback(_, arg) { From c84b6a51013035ccb410fe6088747adaa4680a76 Mon Sep 17 00:00:00 2001 From: Cohee <18619528+Cohee1207@users.noreply.github.com> Date: Thu, 7 Dec 2023 20:06:06 +0200 Subject: [PATCH 7/7] Add WI inclusion groups --- public/index.html | 42 ++++++++++-------- public/scripts/world-info.js | 85 +++++++++++++++++++++++++++++++++++- 2 files changed, 108 insertions(+), 19 deletions(-) diff --git a/public/index.html b/public/index.html index 1c149466d..da5b6e0cb 100644 --- a/public/index.html +++ b/public/index.html @@ -4122,24 +4122,32 @@
-
-
- - +
+
+
+ + +
+
+ +
-
- +
+ +
diff --git a/public/scripts/world-info.js b/public/scripts/world-info.js index 9810a47f4..a56879b85 100644 --- a/public/scripts/world-info.js +++ b/public/scripts/world-info.js @@ -1102,6 +1102,19 @@ function getWorldEntry(name, data, entry) { orderInput.val(entry.order).trigger('input'); orderInput.css('width', 'calc(3em + 15px)'); + // group + const groupInput = template.find('input[name="group"]'); + groupInput.data('uid', entry.uid); + groupInput.on('input', function () { + const uid = $(this).data('uid'); + const value = String($(this).val()).trim(); + + data.entries[uid].group = value; + setOriginalDataValue(data, uid, 'extensions.group', data.entries[uid].group); + saveWorldInfo(name, data); + }); + groupInput.val(entry.group ?? '').trigger('input'); + // probability if (entry.probability === undefined) { entry.probability = null; @@ -1810,8 +1823,8 @@ async function checkWorldInfo(chat, maxContext) { console.debug(`(NOT ANY Check) Activating WI Entry ${entry.uid}, no secondary keywords found.`); activatedNow.add(entry); } - // Handle cases where secondary is empty } else { + // Handle cases where secondary is empty console.debug(`WI UID ${entry.uid}: Activated without filter logic.`); activatedNow.add(entry); break primary; @@ -1827,11 +1840,13 @@ async function checkWorldInfo(chat, maxContext) { let newContent = ''; const textToScanTokens = getTokenCount(allActivatedText); const probabilityChecksBefore = failedProbabilityChecks.size; + + filterByInclusionGroups(newEntries, allActivatedEntries); + console.debug('-- PROBABILITY CHECKS BEGIN --'); for (const entry of newEntries) { const rollValue = Math.random() * 100; - if (entry.useProbability && rollValue > entry.probability) { console.debug(`WI entry ${entry.uid} ${entry.key} failed probability check, skipping`); failedProbabilityChecks.add(entry); @@ -1939,6 +1954,72 @@ async function checkWorldInfo(chat, maxContext) { return { worldInfoBefore, worldInfoAfter, WIDepthEntries }; } +/** + * Filters entries by inclusion groups. + * @param {object[]} newEntries Entries activated on current recursion level + * @param {Set} allActivatedEntries Set of all activated entries + */ +function filterByInclusionGroups(newEntries, allActivatedEntries) { + console.debug('-- INCLUSION GROUP CHECKS BEGIN --'); + const grouped = newEntries.filter(x => x.group).reduce((acc, item) => { + if (!acc[item.group]) { + acc[item.group] = []; + } + acc[item.group].push(item); + return acc; + }, {}); + + if (Object.keys(grouped).length === 0) { + console.debug('No inclusion groups found'); + return; + } + + for (const [key, group] of Object.entries(grouped)) { + console.debug(`Checking inclusion group '${key}' with ${group.length} entries`, group); + + if (!Array.isArray(group) || group.length <= 1) { + console.debug('Skipping inclusion group check, only one entry'); + continue; + } + + if (Array.from(allActivatedEntries).some(x => x.group === key)) { + console.debug(`Skipping inclusion group check, group already activated '${key}'`); + continue; + } + + // Do weighted random using probability of entry as weight + const totalWeight = group.reduce((acc, item) => acc + item.probability, 0); + const rollValue = Math.random() * totalWeight; + let currentWeight = 0; + let winner = null; + + for (const entry of group) { + currentWeight += entry.probability; + + if (rollValue <= currentWeight) { + console.debug(`Activated inclusion group '${key}' with entry '${entry.uid}'`, entry); + winner = entry; + break; + } + } + + if (!winner) { + console.debug(`Failed to activate inclusion group '${key}', no winner found`); + continue; + } + + // Remove every group item from newEntries but the winner + for (const entry of group) { + if (entry === winner) { + continue; + } + + console.debug(`Removing loser from inclusion group '${key}' entry '${entry.uid}'`, entry); + newEntries.splice(newEntries.indexOf(entry), 1); + } + } +} + function matchKeys(haystack, needle) { const transformedString = transformString(needle);