mirror of
				https://github.com/SillyTavern/SillyTavern.git
				synced 2025-06-05 21:59:27 +02:00 
			
		
		
		
	Merge branch 'staging' of https://github.com/Tony-sama/SillyTavern into staging
This commit is contained in:
		
							
								
								
									
										319
									
								
								public/scripts/extensions/cfg/index.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										319
									
								
								public/scripts/extensions/cfg/index.js
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,319 @@
 | 
			
		||||
import {
 | 
			
		||||
    chat_metadata,
 | 
			
		||||
    eventSource,
 | 
			
		||||
    event_types,
 | 
			
		||||
    saveSettingsDebounced,
 | 
			
		||||
    this_chid,
 | 
			
		||||
} from "../../../script.js";
 | 
			
		||||
import { selected_group } from "../../group-chats.js";
 | 
			
		||||
import { extension_settings, saveMetadataDebounced } from "../../extensions.js";
 | 
			
		||||
import { getCharaFilename, delay } from "../../utils.js";
 | 
			
		||||
import { power_user } from "../../power-user.js";
 | 
			
		||||
import { metadataKeys } from "./util.js";
 | 
			
		||||
 | 
			
		||||
// Keep track of where your extension is located, name should match repo name
 | 
			
		||||
const extensionName = "cfg";
 | 
			
		||||
const extensionFolderPath = `scripts/extensions/${extensionName}`;
 | 
			
		||||
const defaultSettings = {
 | 
			
		||||
    global: {
 | 
			
		||||
        "guidance_scale": 1,
 | 
			
		||||
        "negative_prompt": ''
 | 
			
		||||
    },
 | 
			
		||||
    chara: []
 | 
			
		||||
};
 | 
			
		||||
const settingType = {
 | 
			
		||||
    guidance_scale: 0,
 | 
			
		||||
    negative_prompt: 1
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Used for character and chat CFG values
 | 
			
		||||
function updateSettings() {
 | 
			
		||||
    saveSettingsDebounced();
 | 
			
		||||
    loadSettings();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
function setCharCfg(tempValue, setting) {
 | 
			
		||||
    const avatarName = getCharaFilename();
 | 
			
		||||
 | 
			
		||||
    // Assign temp object
 | 
			
		||||
    let tempCharaCfg;
 | 
			
		||||
    switch(setting) {
 | 
			
		||||
        case settingType.guidance_scale:
 | 
			
		||||
            tempCharaCfg = {
 | 
			
		||||
                "name": avatarName,
 | 
			
		||||
                "guidance_scale": Number(tempValue)
 | 
			
		||||
            }
 | 
			
		||||
            break;
 | 
			
		||||
        case settingType.negative_prompt:
 | 
			
		||||
            tempCharaCfg = {
 | 
			
		||||
                "name": avatarName,
 | 
			
		||||
                "negative_prompt": tempValue
 | 
			
		||||
            }
 | 
			
		||||
            break;
 | 
			
		||||
        default:
 | 
			
		||||
            return false;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    let existingCharaCfgIndex;
 | 
			
		||||
    let existingCharaCfg;
 | 
			
		||||
 | 
			
		||||
    if (extension_settings.cfg.chara) {
 | 
			
		||||
        existingCharaCfgIndex = extension_settings.cfg.chara.findIndex((e) => e.name === avatarName);
 | 
			
		||||
        existingCharaCfg = extension_settings.cfg.chara[existingCharaCfgIndex];
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    if (extension_settings.cfg.chara && existingCharaCfg) {
 | 
			
		||||
        const tempAssign = Object.assign(existingCharaCfg, tempCharaCfg);
 | 
			
		||||
 | 
			
		||||
        // If both values are default, remove the entry
 | 
			
		||||
        if (!existingCharaCfg.useChara && (tempAssign.guidance_scale ?? 1.00) === 1.00 && (tempAssign.negative_prompt?.length ?? 0) === 0) {
 | 
			
		||||
            extension_settings.cfg.chara.splice(existingCharaCfgIndex, 1);
 | 
			
		||||
        }
 | 
			
		||||
    } else if (avatarName && tempValue.length > 0) {
 | 
			
		||||
        if (!extension_settings.cfg.chara) {
 | 
			
		||||
            extension_settings.cfg.chara = []
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        extension_settings.cfg.chara.push(tempCharaCfg);
 | 
			
		||||
    } else {
 | 
			
		||||
        console.debug("Character CFG error: No avatar name key could be found.");
 | 
			
		||||
 | 
			
		||||
        // Don't save settings if something went wrong
 | 
			
		||||
        return false;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    updateSettings();
 | 
			
		||||
 | 
			
		||||
    return true;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
function setChatCfg(tempValue, setting) {
 | 
			
		||||
    switch(setting) {
 | 
			
		||||
        case settingType.guidance_scale:
 | 
			
		||||
            chat_metadata[metadataKeys.guidance_scale] = tempValue;
 | 
			
		||||
            break;
 | 
			
		||||
        case settingType.negative_prompt:
 | 
			
		||||
            chat_metadata[metadataKeys.negative_prompt] = tempValue;
 | 
			
		||||
            break;
 | 
			
		||||
        default:
 | 
			
		||||
            return false;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    saveMetadataDebounced();
 | 
			
		||||
 | 
			
		||||
    return true;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// TODO: Only change CFG when character is selected
 | 
			
		||||
function onCfgMenuItemClick() {
 | 
			
		||||
    if (selected_group || this_chid) {
 | 
			
		||||
        //show CFG config if it's hidden
 | 
			
		||||
        if ($("#cfgConfig").css("display") !== 'flex') {
 | 
			
		||||
            $("#cfgConfig").addClass('resizing')
 | 
			
		||||
            $("#cfgConfig").css("display", "flex");
 | 
			
		||||
            $("#cfgConfig").css("opacity", 0.0);
 | 
			
		||||
            $("#cfgConfig").transition({
 | 
			
		||||
                opacity: 1.0,
 | 
			
		||||
                duration: 250,
 | 
			
		||||
            }, async function () {
 | 
			
		||||
                await delay(50);
 | 
			
		||||
                $("#cfgConfig").removeClass('resizing')
 | 
			
		||||
            });
 | 
			
		||||
 | 
			
		||||
            //auto-open the main AN inline drawer
 | 
			
		||||
            if ($("#CFGBlockToggle")
 | 
			
		||||
                .siblings('.inline-drawer-content')
 | 
			
		||||
                .css('display') !== 'block') {
 | 
			
		||||
                $("#floatingPrompt").addClass('resizing')
 | 
			
		||||
                $("#CFGBlockToggle").click();
 | 
			
		||||
            }
 | 
			
		||||
        } else {
 | 
			
		||||
            //hide AN if it's already displayed
 | 
			
		||||
            $("#cfgConfig").addClass('resizing')
 | 
			
		||||
            $("#cfgConfig").transition({
 | 
			
		||||
                opacity: 0.0,
 | 
			
		||||
                duration: 250,
 | 
			
		||||
            },
 | 
			
		||||
                async function () {
 | 
			
		||||
                    await delay(50);
 | 
			
		||||
                    $("#cfgConfig").removeClass('resizing')
 | 
			
		||||
                });
 | 
			
		||||
            setTimeout(function () {
 | 
			
		||||
                $("#cfgConfig").hide();
 | 
			
		||||
            }, 250);
 | 
			
		||||
 | 
			
		||||
        }
 | 
			
		||||
        //duplicate options menu close handler from script.js
 | 
			
		||||
        //because this listener takes priority
 | 
			
		||||
        $("#options").stop().fadeOut(250);
 | 
			
		||||
    } else {
 | 
			
		||||
        toastr.warning(`Select a character before trying to configure CFG`, '', { timeOut: 2000 });
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
async function onChatChanged() {
 | 
			
		||||
    loadSettings();
 | 
			
		||||
    await modifyCharaHtml();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Rearrange the panel if a group chat is present
 | 
			
		||||
async function modifyCharaHtml() {
 | 
			
		||||
    if (selected_group) {
 | 
			
		||||
        $("#chara_cfg_container").hide();
 | 
			
		||||
        $("#groupchat_cfg_use_chara_container").show();
 | 
			
		||||
    } else {
 | 
			
		||||
        $("#chara_cfg_container").show();
 | 
			
		||||
        $("#groupchat_cfg_use_chara_container").hide();
 | 
			
		||||
        // TODO: Remove chat checkbox here
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Reloads chat-specific settings
 | 
			
		||||
function loadSettings() {
 | 
			
		||||
    // Set chat CFG if it exists
 | 
			
		||||
    $('#chat_cfg_guidance_scale').val(chat_metadata[metadataKeys.guidance_scale] ?? 1.0.toFixed(2));
 | 
			
		||||
    $('#chat_cfg_guidance_scale_counter').text(chat_metadata[metadataKeys.guidance_scale]?.toFixed(2) ?? 1.0.toFixed(2));
 | 
			
		||||
    $('#chat_cfg_negative_prompt').val(chat_metadata[metadataKeys.negative_prompt] ?? '');
 | 
			
		||||
    $('#groupchat_cfg_use_chara').prop('checked', chat_metadata[metadataKeys.groupchat_individual_chars] ?? false);
 | 
			
		||||
    if (chat_metadata[metadataKeys.negative_combine]?.length > 0) {
 | 
			
		||||
        chat_metadata[metadataKeys.negative_combine].forEach((element) => {
 | 
			
		||||
            $(`input[name="cfg_negative_combine"][value="${element}"]`)
 | 
			
		||||
                .prop("checked", true);
 | 
			
		||||
        });
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    // Set character CFG if it exists
 | 
			
		||||
    if (!selected_group) {
 | 
			
		||||
        const charaCfg = extension_settings.cfg.chara.find((e) => e.name === getCharaFilename());
 | 
			
		||||
        $('#chara_cfg_guidance_scale').val(charaCfg?.guidance_scale ?? 1.00);
 | 
			
		||||
        $('#chara_cfg_guidance_scale_counter').text(charaCfg?.guidance_scale?.toFixed(2) ?? 1.0.toFixed(2));
 | 
			
		||||
        $('#chara_cfg_negative_prompt').val(charaCfg?.negative_prompt ?? '');
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Load initial extension settings
 | 
			
		||||
async function initialLoadSettings() {
 | 
			
		||||
    // Create the settings if they don't exist
 | 
			
		||||
    extension_settings[extensionName] = extension_settings[extensionName] || {};
 | 
			
		||||
    if (Object.keys(extension_settings[extensionName]).length === 0) {
 | 
			
		||||
        Object.assign(extension_settings[extensionName], defaultSettings);
 | 
			
		||||
        saveSettingsDebounced();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    // Set global CFG values on load
 | 
			
		||||
    $('#global_cfg_guidance_scale').val(extension_settings.cfg.global.guidance_scale);
 | 
			
		||||
    $('#global_cfg_guidance_scale_counter').text(extension_settings.cfg.global.guidance_scale.toFixed(2));
 | 
			
		||||
    $('#global_cfg_negative_prompt').val(extension_settings.cfg.global.negative_prompt);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
function migrateSettings() {
 | 
			
		||||
    let performSave = false;
 | 
			
		||||
 | 
			
		||||
    if (power_user.guidance_scale) {
 | 
			
		||||
        extension_settings.cfg.global.guidance_scale = power_user.guidance_scale;
 | 
			
		||||
        delete power_user['guidance_scale'];
 | 
			
		||||
        performSave = true;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    if (power_user.negative_prompt) {
 | 
			
		||||
        extension_settings.cfg.global.negative_prompt = power_user.negative_prompt;
 | 
			
		||||
        delete power_user['negative_prompt'];
 | 
			
		||||
        performSave = true;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    if (performSave) {
 | 
			
		||||
        saveSettingsDebounced();
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// This function is called when the extension is loaded
 | 
			
		||||
jQuery(async () => {
 | 
			
		||||
    // This is an example of loading HTML from a file
 | 
			
		||||
    const windowHtml = $(await $.get(`${extensionFolderPath}/window.html`));
 | 
			
		||||
 | 
			
		||||
    // Append settingsHtml to extensions_settings
 | 
			
		||||
    // extension_settings and extensions_settings2 are the left and right columns of the settings menu
 | 
			
		||||
    // Left should be extensions that deal with system functions and right should be visual/UI related 
 | 
			
		||||
    windowHtml.find('#CFGClose').on('click', function () {
 | 
			
		||||
        $("#cfgConfig").transition({
 | 
			
		||||
            opacity: 0,
 | 
			
		||||
            duration: 200,
 | 
			
		||||
            easing: 'ease-in-out',
 | 
			
		||||
        });
 | 
			
		||||
        setTimeout(function () { $('#cfgConfig').hide() }, 200);
 | 
			
		||||
    });
 | 
			
		||||
 | 
			
		||||
    windowHtml.find('#chat_cfg_guidance_scale').on('input', function() {
 | 
			
		||||
        const numberValue = Number($(this).val());
 | 
			
		||||
        const success = setChatCfg(numberValue, settingType.guidance_scale);
 | 
			
		||||
        if (success) {
 | 
			
		||||
            $('#chat_cfg_guidance_scale_counter').text(numberValue.toFixed(2));
 | 
			
		||||
        }
 | 
			
		||||
    });
 | 
			
		||||
 | 
			
		||||
    windowHtml.find('#chat_cfg_negative_prompt').on('input', function() {
 | 
			
		||||
        setChatCfg($(this).val(), settingType.negative_prompt);
 | 
			
		||||
    });
 | 
			
		||||
 | 
			
		||||
    windowHtml.find('#chara_cfg_guidance_scale').on('input', function() {
 | 
			
		||||
        const value = $(this).val();
 | 
			
		||||
        const success = setCharCfg(value, settingType.guidance_scale);
 | 
			
		||||
        if (success) {
 | 
			
		||||
            $('#chara_cfg_guidance_scale_counter').text(Number(value).toFixed(2));
 | 
			
		||||
        }
 | 
			
		||||
    });
 | 
			
		||||
 | 
			
		||||
    windowHtml.find('#chara_cfg_negative_prompt').on('input', function() {
 | 
			
		||||
        setCharCfg($(this).val(), settingType.negative_prompt);
 | 
			
		||||
    });
 | 
			
		||||
 | 
			
		||||
    windowHtml.find('#global_cfg_guidance_scale').on('input', function() {
 | 
			
		||||
        extension_settings.cfg.global.guidance_scale = Number($(this).val());
 | 
			
		||||
        $('#global_cfg_guidance_scale_counter').text(extension_settings.cfg.global.guidance_scale.toFixed(2));
 | 
			
		||||
        saveSettingsDebounced();
 | 
			
		||||
    });
 | 
			
		||||
 | 
			
		||||
    windowHtml.find('#global_cfg_negative_prompt').on('input', function() {
 | 
			
		||||
        extension_settings.cfg.global.negative_prompt = $(this).val();
 | 
			
		||||
        saveSettingsDebounced();
 | 
			
		||||
    });
 | 
			
		||||
 | 
			
		||||
    windowHtml.find(`input[name="cfg_negative_combine"]`).on('input', function() {
 | 
			
		||||
        const values = windowHtml.find(`input[name="cfg_negative_combine"]`)
 | 
			
		||||
            .filter(":checked")
 | 
			
		||||
            .map(function() { return parseInt($(this).val()) })
 | 
			
		||||
            .get()
 | 
			
		||||
            .filter((e) => e !== NaN) || [];
 | 
			
		||||
 | 
			
		||||
        chat_metadata[metadataKeys.negative_combine] = values;
 | 
			
		||||
        saveMetadataDebounced();
 | 
			
		||||
    });
 | 
			
		||||
 | 
			
		||||
    windowHtml.find('#groupchat_cfg_use_chara').on('input', function() {
 | 
			
		||||
        const checked = !!$(this).prop('checked');
 | 
			
		||||
        chat_metadata[metadataKeys.groupchat_individual_chars] = checked
 | 
			
		||||
 | 
			
		||||
        if (checked) {
 | 
			
		||||
            toastr.info("You can edit character CFG values in their respective character chats.");
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        saveMetadataDebounced();
 | 
			
		||||
    });
 | 
			
		||||
 | 
			
		||||
    $("#movingDivs").append(windowHtml);
 | 
			
		||||
 | 
			
		||||
    initialLoadSettings();
 | 
			
		||||
 | 
			
		||||
    if (extension_settings.cfg) {
 | 
			
		||||
        migrateSettings();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    const buttonHtml = $(await $.get(`${extensionFolderPath}/menuButton.html`));
 | 
			
		||||
    buttonHtml.on('click', onCfgMenuItemClick)
 | 
			
		||||
    buttonHtml.insertAfter("#option_toggle_AN");
 | 
			
		||||
 | 
			
		||||
    // Hook events
 | 
			
		||||
    eventSource.on(event_types.CHAT_CHANGED, async () => {
 | 
			
		||||
        await onChatChanged();
 | 
			
		||||
    });
 | 
			
		||||
});
 | 
			
		||||
							
								
								
									
										11
									
								
								public/scripts/extensions/cfg/manifest.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										11
									
								
								public/scripts/extensions/cfg/manifest.json
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,11 @@
 | 
			
		||||
{
 | 
			
		||||
    "display_name": "CFG",
 | 
			
		||||
    "loading_order": 1,
 | 
			
		||||
    "requires": [],
 | 
			
		||||
    "optional": [],
 | 
			
		||||
    "js": "index.js",
 | 
			
		||||
    "css": "style.css",
 | 
			
		||||
    "author": "kingbri",
 | 
			
		||||
    "version": "1.0.0",
 | 
			
		||||
    "homePage": "https://github.com/SillyTavern/SillyTavern"
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										4
									
								
								public/scripts/extensions/cfg/menuButton.html
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										4
									
								
								public/scripts/extensions/cfg/menuButton.html
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,4 @@
 | 
			
		||||
<a id="option_toggle_CFG">
 | 
			
		||||
    <i class="fa-lg fa-solid fa-scale-balanced"></i>
 | 
			
		||||
    <span data-i18n="CFG Scale">CFG Scale</span>
 | 
			
		||||
</a>
 | 
			
		||||
							
								
								
									
										0
									
								
								public/scripts/extensions/cfg/style.css
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										0
									
								
								public/scripts/extensions/cfg/style.css
									
									
									
									
									
										Normal file
									
								
							
							
								
								
									
										72
									
								
								public/scripts/extensions/cfg/util.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										72
									
								
								public/scripts/extensions/cfg/util.js
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,72 @@
 | 
			
		||||
import { chat_metadata, this_chid } from "../../../script.js";
 | 
			
		||||
import { extension_settings, getContext } from "../../extensions.js"
 | 
			
		||||
import { selected_group } from "../../group-chats.js";
 | 
			
		||||
import { getCharaFilename } from "../../utils.js";
 | 
			
		||||
 | 
			
		||||
export const cfgType = {
 | 
			
		||||
    chat: 0,
 | 
			
		||||
    chara: 1,
 | 
			
		||||
    global: 2
 | 
			
		||||
}
 | 
			
		||||
export const metadataKeys = {
 | 
			
		||||
    guidance_scale: "cfg_guidance_scale",
 | 
			
		||||
    negative_prompt: "cfg_negative_prompt",
 | 
			
		||||
    negative_combine: "cfg_negative_combine",
 | 
			
		||||
    groupchat_individual_chars: "cfg_groupchat_individual_chars"
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Gets the CFG value from hierarchy of chat -> character -> global
 | 
			
		||||
// Returns undefined values which should be handled in the respective backend APIs
 | 
			
		||||
export function getCfg() {
 | 
			
		||||
    let splitNegativePrompt = [];
 | 
			
		||||
    const charaCfg = extension_settings.cfg.chara?.find((e) => e.name === getCharaFilename(this_chid));
 | 
			
		||||
    const guidanceScale = getGuidanceScale(charaCfg);
 | 
			
		||||
    const chatNegativeCombine = chat_metadata[metadataKeys.negative_combine] ?? [];
 | 
			
		||||
 | 
			
		||||
    // If there's a guidance scale, continue. Otherwise assume undefined
 | 
			
		||||
    if (guidanceScale?.value && guidanceScale?.value !== 1) {
 | 
			
		||||
        if (guidanceScale.type === cfgType.chat || chatNegativeCombine.includes(cfgType.chat)) {
 | 
			
		||||
            splitNegativePrompt.push(chat_metadata[metadataKeys.negative_prompt]?.trim());
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        if (guidanceScale.type === cfgType.chara || chatNegativeCombine.includes(cfgType.chara)) {
 | 
			
		||||
            splitNegativePrompt.push(charaCfg.negative_prompt?.trim())
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        if (guidanceScale.type === cfgType.global || chatNegativeCombine.includes(cfgType.global)) {
 | 
			
		||||
            splitNegativePrompt.push(extension_settings.cfg.global.negative_prompt?.trim());
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        const combinedNegatives = splitNegativePrompt.filter((e) => e.length > 0).join(", ");
 | 
			
		||||
        console.debug(`Setting CFG with guidance scale: ${guidanceScale.value}, negatives: ${combinedNegatives}`)
 | 
			
		||||
 | 
			
		||||
        return {
 | 
			
		||||
            guidanceScale: guidanceScale.value,
 | 
			
		||||
            negativePrompt: combinedNegatives
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// If the guidance scale is 1, ignore the CFG negative prompt since it won't be used anyways
 | 
			
		||||
function getGuidanceScale(charaCfg) {
 | 
			
		||||
    const chatGuidanceScale = chat_metadata[metadataKeys.guidance_scale];
 | 
			
		||||
    const groupchatCharOverride = chat_metadata[metadataKeys.groupchat_individual_chars] ?? false;
 | 
			
		||||
    if (chatGuidanceScale && chatGuidanceScale !== 1 && !groupchatCharOverride) {
 | 
			
		||||
        return {
 | 
			
		||||
            type: cfgType.chat,
 | 
			
		||||
            value: chatGuidanceScale
 | 
			
		||||
        };
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    if ((!selected_group && charaCfg || groupchatCharOverride) && charaCfg?.guidance_scale !== 1) {
 | 
			
		||||
        return {
 | 
			
		||||
            type: cfgType.chara,
 | 
			
		||||
            value: charaCfg.guidance_scale
 | 
			
		||||
        };
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    return {
 | 
			
		||||
        type: cfgType.global,
 | 
			
		||||
        value: extension_settings.cfg.global.guidance_scale
 | 
			
		||||
    };
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										142
									
								
								public/scripts/extensions/cfg/window.html
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										142
									
								
								public/scripts/extensions/cfg/window.html
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,142 @@
 | 
			
		||||
<div id="cfgConfig" class="drawer-content flexGap5">
 | 
			
		||||
    <div class="panelControlBar flex-container">
 | 
			
		||||
        <div id="cfgConfigHeader" class="fa-solid fa-grip drag-grabber"></div>
 | 
			
		||||
        <div id="CFGClose" class="fa-solid fa-circle-xmark"></div>
 | 
			
		||||
    </div>
 | 
			
		||||
    <div name="cfgConfigHolder" class="scrollY">
 | 
			
		||||
        <div id="chat_cfg_container">
 | 
			
		||||
            <div class="inline-drawer">
 | 
			
		||||
                <div id="CFGBlockToggle" class="inline-drawer-toggle inline-drawer-header">
 | 
			
		||||
                    <b>Chat CFG</b>
 | 
			
		||||
                    <div class="inline-drawer-icon fa-solid fa-circle-chevron-down down"></div>
 | 
			
		||||
                </div>
 | 
			
		||||
                <div class="inline-drawer-content">
 | 
			
		||||
                    <small>
 | 
			
		||||
                        <b>Unique to this chat.</b><br>
 | 
			
		||||
                    </small>
 | 
			
		||||
                    <label for="chat_cfg_negative_prompt">
 | 
			
		||||
                        <span data-i18n="Scale">Scale</span>
 | 
			
		||||
                    </label>
 | 
			
		||||
                    <div class="range-block-range-and-counter">
 | 
			
		||||
                        <div class="range-block-range">
 | 
			
		||||
                            <input type="range" id="chat_cfg_guidance_scale" name="volume" min="0.10" max="4.00" step="0.05">
 | 
			
		||||
                        </div>
 | 
			
		||||
                        <div class="range-block-counter">
 | 
			
		||||
                            <div contenteditable="true" data-for="chat_cfg_guidance_scale" id="chat_cfg_guidance_scale_counter">
 | 
			
		||||
                                select
 | 
			
		||||
                            </div>
 | 
			
		||||
                        </div>
 | 
			
		||||
                    </div>
 | 
			
		||||
                    <div>
 | 
			
		||||
                        <label for="chat_cfg_negative_prompt">
 | 
			
		||||
                            <span data-i18n="Negative Prompt">Negative Prompt</span>
 | 
			
		||||
                        </label>
 | 
			
		||||
                        <textarea id="chat_cfg_negative_prompt" rows="2" class="text_pole textarea_compact" data-i18n="[placeholder]write short replies, write replies using past tense" placeholder="write short replies, write replies using past tense"></textarea>
 | 
			
		||||
                    </div>
 | 
			
		||||
                    <div id="groupchat_cfg_use_chara_container">
 | 
			
		||||
                        <label class="checkbox_label" for="groupchat_cfg_use_chara">
 | 
			
		||||
                            <input type="checkbox" id="groupchat_cfg_use_chara" />
 | 
			
		||||
                            <span data-i18n="Use character CFG scales">Use character CFG scales</span>
 | 
			
		||||
                        </label>
 | 
			
		||||
                    </div>
 | 
			
		||||
                </div>
 | 
			
		||||
            </div>
 | 
			
		||||
        </div>
 | 
			
		||||
        <div id="chara_cfg_container" style="display: none;">
 | 
			
		||||
            <hr class="sysHR">
 | 
			
		||||
            <div class="inline-drawer">
 | 
			
		||||
                <div id="charaANBlockToggle" class="inline-drawer-toggle inline-drawer-header">
 | 
			
		||||
                    <b>Character CFG</b>
 | 
			
		||||
                    <div class="inline-drawer-icon fa-solid fa-circle-chevron-down down"></div>
 | 
			
		||||
                </div>
 | 
			
		||||
                <div class="inline-drawer-content">
 | 
			
		||||
                    <small><b>Will be automatically added as the CFG for this character.</b></small>
 | 
			
		||||
                    <br />
 | 
			
		||||
                    <label for="chara_cfg_negative_prompt">
 | 
			
		||||
                        <span data-i18n="Scale">Scale</span>
 | 
			
		||||
                    </label>
 | 
			
		||||
                    <div class="range-block-range-and-counter">
 | 
			
		||||
                        <div class="range-block-range">
 | 
			
		||||
                            <input type="range" id="chara_cfg_guidance_scale" name="volume" min="0.10" max="4.00" step="0.05">
 | 
			
		||||
                        </div>
 | 
			
		||||
                        <div class="range-block-counter">
 | 
			
		||||
                            <div contenteditable="true" data-for="chara_cfg_guidance_scale" id="chara_cfg_guidance_scale_counter">
 | 
			
		||||
                                select
 | 
			
		||||
                            </div>
 | 
			
		||||
                        </div>
 | 
			
		||||
                    </div>
 | 
			
		||||
                    <div>
 | 
			
		||||
                        <label for="chara_cfg_negative_prompt">
 | 
			
		||||
                            <span data-i18n="Negative Prompt">Negative Prompt</span>
 | 
			
		||||
                        </label>
 | 
			
		||||
                        <textarea id="chara_cfg_negative_prompt" rows="2" class="text_pole textarea_compact" data-i18n="[placeholder]write short replies, write replies using past tense" placeholder="write short replies, write replies using past tense"></textarea>
 | 
			
		||||
                    </div>
 | 
			
		||||
                </div>
 | 
			
		||||
            </div>
 | 
			
		||||
        </div>
 | 
			
		||||
        <div id="global_cfg_container">
 | 
			
		||||
            <hr class="sysHR">
 | 
			
		||||
            <div class="inline-drawer">
 | 
			
		||||
                <div id="defaultANBlockToggle" class="inline-drawer-toggle inline-drawer-header">
 | 
			
		||||
                    <b>Global CFG</b>
 | 
			
		||||
                    <div class="inline-drawer-icon fa-solid fa-circle-chevron-down down"></div>
 | 
			
		||||
                </div>
 | 
			
		||||
                <div class="inline-drawer-content">
 | 
			
		||||
                    <small><b>Will be used as the default CFG options for every chat unless overridden.</b></small>
 | 
			
		||||
                    <br />
 | 
			
		||||
                    <label for="global_cfg_negative_prompt">
 | 
			
		||||
                        <span data-i18n="Scale">Scale</span>
 | 
			
		||||
                    </label>
 | 
			
		||||
                    <div class="range-block-range-and-counter">
 | 
			
		||||
                        <div class="range-block-range">
 | 
			
		||||
                            <input type="range" id="global_cfg_guidance_scale" name="volume" min="0.10" max="4.00" step="0.05">
 | 
			
		||||
                        </div>
 | 
			
		||||
                        <div class="range-block-counter">
 | 
			
		||||
                            <div contenteditable="true" data-for="global_cfg_guidance_scale" id="global_cfg_guidance_scale_counter">
 | 
			
		||||
                                select
 | 
			
		||||
                            </div>
 | 
			
		||||
                        </div>
 | 
			
		||||
                    </div>
 | 
			
		||||
                    <div>
 | 
			
		||||
                        <label for="global_cfg_negative_prompt">
 | 
			
		||||
                            <span data-i18n="Negative Prompt">Negative Prompt</span>
 | 
			
		||||
                        </label>
 | 
			
		||||
                        <textarea id="global_cfg_negative_prompt" rows="2" class="text_pole textarea_compact" data-i18n="[placeholder]write short replies, write replies using past tense" placeholder="write short replies, write replies using past tense"></textarea>
 | 
			
		||||
                    </div>
 | 
			
		||||
                </div>
 | 
			
		||||
            </div>
 | 
			
		||||
        </div>
 | 
			
		||||
        <div id="cfg_negative_combine_container">
 | 
			
		||||
            <hr class="sysHR">
 | 
			
		||||
            <div class="inline-drawer">
 | 
			
		||||
                <div id="defaultANBlockToggle" class="inline-drawer-toggle inline-drawer-header">
 | 
			
		||||
                    <b>Negative Cascading</b>
 | 
			
		||||
                    <div class="inline-drawer-icon fa-solid fa-circle-chevron-down down"></div>
 | 
			
		||||
                </div>
 | 
			
		||||
                <div class="inline-drawer-content">
 | 
			
		||||
                    <small>
 | 
			
		||||
                        <b>Combine negative prompts from other boxes.</b>
 | 
			
		||||
                        <br />
 | 
			
		||||
                        For example, ticking the chat, global, and character boxes combine all negative prompts into a comma-separated string.
 | 
			
		||||
                    </small>
 | 
			
		||||
                    <br />
 | 
			
		||||
                    <label for="cfg_negative_combine">
 | 
			
		||||
                        <span data-i18n="Scale">Always Include</span>
 | 
			
		||||
                    </label>
 | 
			
		||||
                    <label class="checkbox_label">
 | 
			
		||||
                        <input type="checkbox" name="cfg_negative_combine" value="0" />
 | 
			
		||||
                        <span data-i18n="Chat Negatives">Chat Negatives</span>
 | 
			
		||||
                    </label>
 | 
			
		||||
                    <label class="checkbox_label">
 | 
			
		||||
                        <input type="checkbox" name="cfg_negative_combine" value="1" />
 | 
			
		||||
                        <span data-i18n="Character Negatives">Character Negatives</span>
 | 
			
		||||
                    </label>
 | 
			
		||||
                    <label class="checkbox_label">
 | 
			
		||||
                        <input type="checkbox" name="cfg_negative_combine" value="2" />
 | 
			
		||||
                        <span data-i18n="Global Negatives">Global Negatives</span>
 | 
			
		||||
                    </label>
 | 
			
		||||
                </div>
 | 
			
		||||
            </div>
 | 
			
		||||
        </div>
 | 
			
		||||
    </div>
 | 
			
		||||
</div>
 | 
			
		||||
@@ -1,5 +1,5 @@
 | 
			
		||||
import { callPopup, cancelTtsPlay, eventSource, event_types, isMultigenEnabled, is_send_press, saveSettingsDebounced } from '../../../script.js'
 | 
			
		||||
import { ModuleWorkerWrapper, doExtrasFetch, extension_settings, getApiUrl, getContext } from '../../extensions.js'
 | 
			
		||||
import { ModuleWorkerWrapper, doExtrasFetch, extension_settings, getApiUrl, getContext, modules } from '../../extensions.js'
 | 
			
		||||
import { escapeRegex, getStringHash } from '../../utils.js'
 | 
			
		||||
import { EdgeTtsProvider } from './edge.js'
 | 
			
		||||
import { ElevenLabsTtsProvider } from './elevenlabs.js'
 | 
			
		||||
@@ -166,6 +166,11 @@ async function moduleWorker() {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
function talkingAnimation(switchValue) {
 | 
			
		||||
    if (!modules.includes('talkinghead')) {
 | 
			
		||||
        console.debug("Talking Animation module not loaded");
 | 
			
		||||
        return;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    const apiUrl = getApiUrl();
 | 
			
		||||
    const animationType = switchValue ? "start" : "stop";
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user