Autoswipe: Fix endless loop if blacklist empty

c32e0bdde74838ae84b071e380d6fb448cd14be4

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

2 files changed, +47 -57Ignore whitespace
public/script.js+7 -57
@@ -95,6 +95,7 @@ import {
95 resetMovableStyles,95 resetMovableStyles,
96 forceCharacterEditorTokenize,96 forceCharacterEditorTokenize,
97 applyPowerUserSettings,97 applyPowerUserSettings,
98 generatedTextFiltered,
98} from './scripts/power-user.js';99} from './scripts/power-user.js';
99100
100import {101import {
@@ -3290,39 +3291,11 @@ class StreamingProcessor {
3290 unblockGeneration();3291 unblockGeneration();
3291 generatedPromptCache = '';3292 generatedPromptCache = '';
32923293
3293 //console.log("Generated text size:", text.length, text)
3294
3295 const isAborted = this.abortController.signal.aborted;3294 const isAborted = this.abortController.signal.aborted;
3296 if (power_user.auto_swipe && !isAborted) {3295 if (!isAborted && power_user.auto_swipe && generatedTextFiltered(text)) {
3297 function containsBlacklistedWords(str, blacklist, threshold) {3296 return swipe_right();
3298 const regex = new RegExp(`\\b(${blacklist.join('|')})\\b`, 'gi');
3299 const matches = str.match(regex) || [];
3300 return matches.length >= threshold;
3301 }
3302
3303 const generatedTextFiltered = (text) => {
3304 if (text) {
3305 if (power_user.auto_swipe_minimum_length) {
3306 if (text.length < power_user.auto_swipe_minimum_length && text.length !== 0) {
3307 console.log('Generated text size too small');
3308 return true;
3309 }
3310 }
3311 if (power_user.auto_swipe_blacklist_threshold) {
3312 if (containsBlacklistedWords(text, power_user.auto_swipe_blacklist, power_user.auto_swipe_blacklist_threshold)) {
3313 console.log('Generated text has blacklisted words');
3314 return true;
3315 }
3316 }
3317 }
3318 return false;
3319 };
3320
3321 if (generatedTextFiltered(text)) {
3322 swipe_right();
3323 return;
3324 }
3325 }3297 }
3298
3326 playMessageSound();3299 playMessageSound();
3327 }3300 }
33283301
@@ -4862,32 +4835,9 @@ export async function Generate(type, { automatic_trigger, force_name2, quiet_pro
4862 }4835 }
48634836
4864 const isAborted = abortController && abortController.signal.aborted;4837 const isAborted = abortController && abortController.signal.aborted;
4865 if (power_user.auto_swipe && !isAborted) {4838 if (!isAborted && power_user.auto_swipe && generatedTextFiltered(getMessage)) {
4866 console.debug('checking for autoswipeblacklist on non-streaming message');4839 is_send_press = false;
4867 function containsBlacklistedWords(getMessage, blacklist, threshold) {4840 return swipe_right();
4868 console.debug('checking blacklisted words');
4869 const regex = new RegExp(`\\b(${blacklist.join('|')})\\b`, 'gi');
4870 const matches = getMessage.match(regex) || [];
4871 return matches.length >= threshold;
4872 }
4873
4874 const generatedTextFiltered = (getMessage) => {
4875 if (power_user.auto_swipe_blacklist_threshold) {
4876 if (containsBlacklistedWords(getMessage, power_user.auto_swipe_blacklist, power_user.auto_swipe_blacklist_threshold)) {
4877 console.debug('Generated text has blacklisted words');
4878 return true;
4879 }
4880 }
4881
4882 return false;
4883 };
4884 if (generatedTextFiltered(getMessage)) {
4885 console.debug('swiping right automatically');
4886 is_send_press = false;
4887 swipe_right();
4888 // TODO: do we want to resolve after an auto-swipe?
4889 return;
4890 }
4891 }4841 }
48924842
4893 console.debug('/api/chats/save called by /Generate');4843 console.debug('/api/chats/save called by /Generate');
public/scripts/power-user.js+40 -0
@@ -2917,6 +2917,46 @@ export function flushEphemeralStoppingStrings() {
2917}2917}
29182918
2919/**2919/**
2920 * Checks if the generated text should be filtered based on the auto-swipe settings.
2921 * @param {string} text The text to check
2922 * @returns {boolean} If the generated text should be filtered
2923 */
2924export function generatedTextFiltered(text) {
2925 /**
2926 * Checks if the given text contains any of the blacklisted words.
2927 * @param {string} text The text to check
2928 * @param {string[]} blacklist The list of blacklisted words
2929 * @param {number} threshold The number of blacklisted words that need to be present to trigger the check
2930 * @returns {boolean} Whether the text contains blacklisted words
2931 */
2932 function containsBlacklistedWords(text, blacklist, threshold) {
2933 const regex = new RegExp(`\\b(${blacklist.join('|')})\\b`, 'gi');
2934 const matches = text.match(regex) || [];
2935 return matches.length >= threshold;
2936 }
2937
2938 // Make sure a generated text is non-empty
2939 // Otherwise we might get in a loop with a broken API
2940 text = text.trim();
2941 if (text.length > 0) {
2942 if (power_user.auto_swipe_minimum_length) {
2943 if (text.length < power_user.auto_swipe_minimum_length) {
2944 console.log('Generated text size too small');
2945 return true;
2946 }
2947 }
2948 if (power_user.auto_swipe_blacklist.length && power_user.auto_swipe_blacklist_threshold) {
2949 if (containsBlacklistedWords(text, power_user.auto_swipe_blacklist, power_user.auto_swipe_blacklist_threshold)) {
2950 console.log('Generated text has blacklisted words');
2951 return true;
2952 }
2953 }
2954 }
2955
2956 return false;
2957}
2958
2959/**
2920 * Gets the custom stopping strings from the power user settings.2960 * Gets the custom stopping strings from the power user settings.
2921 * @param {number | undefined} limit Number of strings to return. If 0 or undefined, returns all strings.2961 * @param {number | undefined} limit Number of strings to return. If 0 or undefined, returns all strings.
2922 * @returns {string[]} An array of custom stopping strings2962 * @returns {string[]} An array of custom stopping strings