merge staging

This commit is contained in:
LenAnderson
2024-06-24 16:44:33 -04:00
34 changed files with 613 additions and 628 deletions

View File

@@ -5,7 +5,7 @@ end_of_line = lf
insert_final_newline = true insert_final_newline = true
trim_trailing_whitespace = true trim_trailing_whitespace = true
[*.{js, conf, json}] [*.{js, conf, json, css, less, html}]
charset = utf-8 charset = utf-8
indent_style = space indent_style = space
indent_size = 4 indent_size = 4

View File

@@ -4,7 +4,8 @@
// List of extensions which should be recommended for users of this workspace. // List of extensions which should be recommended for users of this workspace.
"recommendations": [ "recommendations": [
"dbaeumer.vscode-eslint", "dbaeumer.vscode-eslint",
"EditorConfig.EditorConfig" "EditorConfig.EditorConfig",
"mrcrowl.easy-less"
], ],
// List of extensions recommended by VS Code that should not be recommended for users of this workspace. // List of extensions recommended by VS Code that should not be recommended for users of this workspace.
"unwantedRecommendations": [] "unwantedRecommendations": []

View File

@@ -97,114 +97,11 @@ input.extension_missing[type="checkbox"] {
flex-direction: column; flex-direction: column;
} }
/** LEFT COLUMN **/ /* Fixes order of settings for extensions */
/* Must be always on top */ .extension_container {
#extensions_settings>#assets_ui { display: contents;
order: -1;
} }
#extensions_settings>.expression_settings { #extensionsMenu>div.extension_container:empty {
order: 2; display: none;
}
#extensions_settings>.background_settings {
order: 3;
}
#extensions_settings>.sd_settings {
order: 4;
}
#extensions_settings>#tts_settings {
order: 5;
}
#extensions_settings>#rvc_settings {
order: 6;
}
#extensions_settings>.objective-settings {
order: 7;
}
#extensions_settings>#speech_recognition_settings {
order: 8;
}
#extensions_settings>#audio_settings {
order: 9;
}
/** RIGHT COLUMN **/
#extensions_settings2>.translation_settings {
order: 1;
}
#extensions_settings2>.caption_settings {
order: 2;
}
#extensions_settings2>.quickReplySettings {
order: 3;
}
#extensions_settings2>.idle-settings {
order: 4;
}
#extensions_settings2>#memory_settings {
order: 5;
}
#extensions_settings2>.hypebot_settings {
order: 6;
}
#extensions_settings2>.regex_settings {
order: 7;
}
#extensions_settings2>.vectors_settings {
order: 8;
}
#extensions_settings2>.chromadb_settings {
order: 9;
}
#extensions_settings2>.randomizer_settings {
order: 10;
}
/** WAND MENU **/
#extensionsMenu>#ttsExtensionMenuItem {
order: 1;
}
#extensionsMenu>#sd_gen {
order: 2;
}
#extensionsMenu>#send_picture {
order: 3;
}
#extensionsMenu>#token_counter {
order: 4;
}
#extensionsMenu>#objective-task-manual-check-menu-item {
order: 5;
}
#extensionsMenu>#roll_dice {
order: 6;
}
#extensionsMenu>#translate_chat {
order: 7;
}
#extensionsMenu>#translate_input_message {
order: 8;
} }

View File

@@ -1141,7 +1141,7 @@
<div class="fa-solid fa-circle-info opacity50p" title="Customize displayed samplers or add custom samplers." data-i18n="[title]Customize displayed samplers or add custom samplers."></div> <div class="fa-solid fa-circle-info opacity50p" title="Customize displayed samplers or add custom samplers." data-i18n="[title]Customize displayed samplers or add custom samplers."></div>
</small> </small>
</div> </div>
<div data-newbie-hidden data-tg-type="mancer, vllm, aphrodite, tabby" class="flex-container flexFlowColumn alignitemscenter flexBasis100p flexGrow flexShrink gap0"> <div data-newbie-hidden data-tg-type="mancer, vllm, aphrodite, tabby, infermaticai" class="flex-container flexFlowColumn alignitemscenter flexBasis100p flexGrow flexShrink gap0">
<small data-i18n="Multiple swipes per generation">Multiple swipes per generation</small> <small data-i18n="Multiple swipes per generation">Multiple swipes per generation</small>
<input type="number" id="n_textgenerationwebui" class="text_pole textAlignCenter" min="1" value="1" step="1" /> <input type="number" id="n_textgenerationwebui" class="text_pole textAlignCenter" min="1" value="1" step="1" />
</div> </div>
@@ -1263,7 +1263,7 @@
<input class="neo-range-slider" type="range" id="skew_textgenerationwebui" name="volume" min="-5" max="5" step="0.01" /> <input class="neo-range-slider" type="range" id="skew_textgenerationwebui" name="volume" min="-5" max="5" step="0.01" />
<input class="neo-range-input" type="number" min="-5" max="5" step="0.01" data-for="skew_textgenerationwebui" id="skew_counter_textgenerationwebui"> <input class="neo-range-input" type="number" min="-5" max="5" step="0.01" data-for="skew_textgenerationwebui" id="skew_counter_textgenerationwebui">
</div> </div>
<div data-newbie-hidden data-tg-type="mancer, ooba, tabby, dreamgen" class="alignitemscenter flex-container flexFlowColumn flexBasis30p flexGrow flexShrink gap0"> <div data-newbie-hidden data-tg-type="mancer, ooba, tabby, dreamgen, infermaticai" class="alignitemscenter flex-container flexFlowColumn flexBasis30p flexGrow flexShrink gap0">
<small data-i18n="Min Length">Min Length</small> <small data-i18n="Min Length">Min Length</small>
<input class="neo-range-slider" type="range" id="min_length_textgenerationwebui" name="volume" min="0" max="2000" step="1" /> <input class="neo-range-slider" type="range" id="min_length_textgenerationwebui" name="volume" min="0" max="2000" step="1" />
<input class="neo-range-input" type="number" min="0" max="2000" step="1" data-for="min_length_textgenerationwebui" id="min_length_counter_textgenerationwebui"> <input class="neo-range-input" type="number" min="0" max="2000" step="1" data-for="min_length_textgenerationwebui" id="min_length_counter_textgenerationwebui">
@@ -1446,7 +1446,7 @@
<div class="fa-solid fa-circle-info opacity50p " data-i18n="[title]Ban the eos_token. This forces the model to never end the generation prematurely" title="Ban the eos_token. This forces the model to never end the generation prematurely."></div> <div class="fa-solid fa-circle-info opacity50p " data-i18n="[title]Ban the eos_token. This forces the model to never end the generation prematurely" title="Ban the eos_token. This forces the model to never end the generation prematurely."></div>
</label> </label>
</label> </label>
<label data-tg-type="vllm, aphrodite" class="checkbox_label" for="ignore_eos_token_textgenerationwebui"> <label data-tg-type="vllm, aphrodite, infermaticai" class="checkbox_label" for="ignore_eos_token_textgenerationwebui">
<input type="checkbox" id="ignore_eos_token_textgenerationwebui" /> <input type="checkbox" id="ignore_eos_token_textgenerationwebui" />
<small data-i18n="Ignore EOS Token">Ignore EOS Token <small data-i18n="Ignore EOS Token">Ignore EOS Token
<div class="fa-solid fa-circle-info opacity50p " data-i18n="[title]Ignore the EOS Token even if it generates." title="Ignore the EOS Token even if it generates."></div> <div class="fa-solid fa-circle-info opacity50p " data-i18n="[title]Ignore the EOS Token even if it generates." title="Ignore the EOS Token even if it generates."></div>
@@ -1471,13 +1471,13 @@
</label> </label>
</label> </label>
<label data-tg-type="vllm, aphrodite" class="checkbox_label" for="spaces_between_special_tokens_textgenerationwebui"> <label data-tg-type="vllm, aphrodite, infermaticai" class="checkbox_label" for="spaces_between_special_tokens_textgenerationwebui">
<input type="checkbox" id="spaces_between_special_tokens_textgenerationwebui" /> <input type="checkbox" id="spaces_between_special_tokens_textgenerationwebui" />
<small data-i18n="Spaces Between Special Tokens">Spaces Between Special Tokens</small> <small data-i18n="Spaces Between Special Tokens">Spaces Between Special Tokens</small>
</label> </label>
</div> </div>
</div> </div>
<div data-tg-type="mancer, ooba, koboldcpp, vllm, aphrodite, llamacpp, ollama" data-newbie-hidden class="flex-container flexFlowColumn alignitemscenter flexBasis48p flexGrow flexShrink gap0"> <div data-tg-type="mancer, ooba, koboldcpp, vllm, aphrodite, llamacpp, ollama, infermaticai" data-newbie-hidden class="flex-container flexFlowColumn alignitemscenter flexBasis48p flexGrow flexShrink gap0">
<small data-i18n="Seed" class="textAlignCenter">Seed</small> <small data-i18n="Seed" class="textAlignCenter">Seed</small>
<input type="number" id="seed_textgenerationwebui" class="text_pole textAlignCenter" min="-1" value="-1" maxlength="100" /> <input type="number" id="seed_textgenerationwebui" class="text_pole textAlignCenter" min="-1" value="-1" maxlength="100" />
</div> </div>
@@ -4334,8 +4334,33 @@
</div> </div>
</div> </div>
<div id="extensions_settings" class="flex1 wide50p"> <div id="extensions_settings" class="flex1 wide50p">
<div id="assets_container" class="extension_container"></div>
<div id="expressions_container" class="extension_container"></div>
<div id="sd_container" class="extension_container"></div>
<div id="tts_container" class="extension_container"></div>
<div id="rvc_container" class="extension_container"></div>
<div id="stt_container" class="extension_container"></div>
<div id="audio_container" class="extension_container"></div>
<div id="silence_container" class="extension_container"></div>
<div id="objective_container" class="extension_container"></div>
<div id="blip_container" class="extension_container"></div>
<div id="live2d_container" class="extension_container"></div>
<div id="vrm_container" class="extension_container"></div>
<div id="timelines_container" class="extension_container"></div>
</div> </div>
<div id="extensions_settings2" class="flex1 wide50p"> <div id="extensions_settings2" class="flex1 wide50p">
<div id="websearch_container" class="extension_container"></div>
<div id="emulatorjs_container" class="extension_container"></div>
<div id="qr_container" class="extension_container"></div>
<div id="translation_container" class="extension_container"></div>
<div id="caption_container" class="extension_container"></div>
<div id="idle_container" class="extension_container"></div>
<div id="summarize_container" class="extension_container"></div>
<div id="hypebot_container" class="extension_container"></div>
<div id="regex_container" class="extension_container"></div>
<div id="vectors_container" class="extension_container"></div>
<div id="randomizer_container" class="extension_container"></div>
<div id="chromadb_container" class="extension_container"></div>
</div> </div>
<hr class="wide100p margin0"> <hr class="wide100p margin0">
<div class="alignitemscenter flex-container justifyCenter wide100p" style="justify-content: space-between;"> <div class="alignitemscenter flex-container justifyCenter wide100p" style="justify-content: space-between;">

View File

@@ -5032,6 +5032,7 @@ function parseAndSaveLogprobs(data, continueFrom) {
logprobs = data?.completion_probabilities?.map(x => parseTextgenLogprobs(x.content, [x])) || null; logprobs = data?.completion_probabilities?.map(x => parseTextgenLogprobs(x.content, [x])) || null;
} break; } break;
case textgen_types.VLLM: case textgen_types.VLLM:
case textgen_types.INFERMATICAI:
case textgen_types.APHRODITE: case textgen_types.APHRODITE:
case textgen_types.MANCER: case textgen_types.MANCER:
case textgen_types.TABBY: { case textgen_types.TABBY: {
@@ -5088,7 +5089,7 @@ function extractMultiSwipes(data, type) {
return swipes; return swipes;
} }
if (main_api === 'openai' || (main_api === 'textgenerationwebui' && [MANCER, VLLM, APHRODITE, TABBY].includes(textgen_settings.type))) { if (main_api === 'openai' || (main_api === 'textgenerationwebui' && [MANCER, VLLM, APHRODITE, TABBY, INFERMATICAI].includes(textgen_settings.type))) {
if (!Array.isArray(data.choices)) { if (!Array.isArray(data.choices)) {
return swipes; return swipes;
} }

View File

@@ -347,13 +347,11 @@ function autoConnectInputHandler() {
saveSettingsDebounced(); saveSettingsDebounced();
} }
function addExtensionsButtonAndMenu() { async function addExtensionsButtonAndMenu() {
const buttonHTML = const buttonHTML = await renderTemplateAsync('wandButton');
'<div id="extensionsMenuButton" style="display: none;" class="fa-solid fa-magic-wand-sparkles interactable" title="Extras Extensions" /></div>'; const extensionsMenuHTML = await renderTemplateAsync('wandMenu');
const extensionsMenuHTML = '<div id="extensionsMenu" class="options-content" style="display: none;"></div>';
$(document.body).append(extensionsMenuHTML); $(document.body).append(extensionsMenuHTML);
$('#leftSendForm').append(buttonHTML); $('#leftSendForm').append(buttonHTML);
const button = $('#extensionsMenuButton'); const button = $('#extensionsMenuButton');
@@ -961,8 +959,8 @@ export async function writeExtensionField(characterId, key, value) {
} }
} }
jQuery(function () { jQuery(async function () {
addExtensionsButtonAndMenu(); await addExtensionsButtonAndMenu();
$('#extensionsMenuButton').css('display', 'flex'); $('#extensionsMenuButton').css('display', 'flex');
$('#extensions_connect').on('click', connectClickHandler); $('#extensions_connect').on('click', connectClickHandler);

View File

@@ -440,7 +440,7 @@ jQuery(async () => {
}); });
windowHtml.find('#assets_filters').hide(); windowHtml.find('#assets_filters').hide();
$('#extensions_settings').append(windowHtml); $('#assets_container').append(windowHtml);
eventSource.on(event_types.OPEN_CHARACTER_LIBRARY, async (forceDefault) => { eventSource.on(event_types.OPEN_CHARACTER_LIBRARY, async (forceDefault) => {
openCharacterBrowser(forceDefault); openCharacterBrowser(forceDefault);

View File

@@ -0,0 +1,4 @@
<div id="attachFile" class="list-group-item flex-container flexGap5" title="Attach a file or image to a current chat.">
<div class="fa-fw fa-solid fa-paperclip extensionsMenuExtensionButton"></div>
<span data-i18n="Attach a File">Attach a File</span>
</div>

View File

@@ -197,8 +197,10 @@ async function enableDataBankAttachment(args, value) {
} }
jQuery(async () => { jQuery(async () => {
const buttons = await renderExtensionTemplateAsync('attachments', 'buttons', {}); const manageButton = await renderExtensionTemplateAsync('attachments', 'manage-button', {});
$('#extensionsMenu').prepend(buttons); const attachButton = await renderExtensionTemplateAsync('attachments', 'attach-button', {});
$('#data_bank_wand_container').append(manageButton);
$('#attach_file_wand_container').append(attachButton);
/** A collection of local enum providers for this context of data bank */ /** A collection of local enum providers for this context of data bank */
const localEnumProviders = { const localEnumProviders = {

View File

@@ -1,7 +1,4 @@
<div id="attachFile" class="list-group-item flex-container flexGap5" title="Attach a file or image to a current chat.">
<div class="fa-fw fa-solid fa-paperclip extensionsMenuExtensionButton"></div>
<span data-i18n="Attach a File">Attach a File</span>
</div>
<div id="manageAttachments" class="list-group-item flex-container flexGap5" title="View global, character, or data files."> <div id="manageAttachments" class="list-group-item flex-container flexGap5" title="View global, character, or data files.">
<div class="fa-fw fa-solid fa-book-open-reader extensionsMenuExtensionButton"></div> <div class="fa-fw fa-solid fa-book-open-reader extensionsMenuExtensionButton"></div>

View File

@@ -344,7 +344,7 @@ jQuery(async function () {
Generate Caption Generate Caption
</div>`); </div>`);
$('#extensionsMenu').prepend(sendButton); $('#caption_wand_container').append(sendButton);
$(sendButton).on('click', () => { $(sendButton).on('click', () => {
const hasCaptionModule = const hasCaptionModule =
(modules.includes('caption') && extension_settings.caption.source === 'extras') || (modules.includes('caption') && extension_settings.caption.source === 'extras') ||
@@ -409,7 +409,7 @@ jQuery(async function () {
} }
async function addSettings() { async function addSettings() {
const html = await renderExtensionTemplateAsync('caption', 'settings'); const html = await renderExtensionTemplateAsync('caption', 'settings');
$('#extensions_settings2').append(html); $('#caption_container').append(html);
} }
await addSettings(); await addSettings();

View File

@@ -1929,7 +1929,7 @@ function migrateSettings() {
} }
async function addSettings() { async function addSettings() {
const template = await renderExtensionTemplateAsync(MODULE_NAME, 'settings'); const template = await renderExtensionTemplateAsync(MODULE_NAME, 'settings');
$('#extensions_settings').append(template); $('#expressions_container').append(template);
$('#expression_override_button').on('click', onClickExpressionOverrideButton); $('#expression_override_button').on('click', onClickExpressionOverrideButton);
$('#expressions_show_default').on('input', onExpressionsShowDefaultInput); $('#expressions_show_default').on('input', onExpressionsShowDefaultInput);
$('#expression_upload_pack_button').on('click', onClickExpressionUploadPackButton); $('#expression_upload_pack_button').on('click', onClickExpressionUploadPackButton);

View File

@@ -900,7 +900,7 @@ function setupListeners() {
jQuery(async function () { jQuery(async function () {
async function addExtensionControls() { async function addExtensionControls() {
const settingsHtml = await renderExtensionTemplateAsync('memory', 'settings', { defaultSettings }); const settingsHtml = await renderExtensionTemplateAsync('memory', 'settings', { defaultSettings });
$('#extensions_settings2').append(settingsHtml); $('#summarize_container').append(settingsHtml);
setupListeners(); setupListeners();
$('#summaryExtensionPopoutButton').off('click').on('click', function (e) { $('#summaryExtensionPopoutButton').off('click').on('click', function (e) {
doPopout(e); doPopout(e);

View File

@@ -169,7 +169,7 @@ const init = async () => {
log('settings: ', settings); log('settings: ', settings);
manager = new SettingsUi(settings); manager = new SettingsUi(settings);
document.querySelector('#extensions_settings2').append(await manager.render()); document.querySelector('#qr_container').append(await manager.render());
buttons = new ButtonUi(settings); buttons = new ButtonUi(settings);
buttons.show(); buttons.show();

View File

@@ -691,3 +691,6 @@
.popup.qr--hide::backdrop { .popup.qr--hide::backdrop {
opacity: 0 !important; opacity: 0 !important;
} }
.popup.qr--hide::backdrop {
opacity: 0 !important;
}

View File

@@ -1,6 +1,6 @@
#qr--bar { #qr--bar {
outline: none; outline: none;
margin: 0; margin: 0;
transition: 0.3s; transition: 0.3s;
opacity: 0.7; opacity: 0.7;
display: flex; display: flex;
@@ -10,88 +10,99 @@
max-width: 100%; max-width: 100%;
overflow-x: auto; overflow-x: auto;
order: 1; order: 1;
padding-right: 2.5em; padding-right: 2.5em;
position: relative; position: relative;
> #qr--popoutTrigger {
position: absolute; >#qr--popoutTrigger {
right: 0.25em; position: absolute;
top: 0; right: 0.25em;
} top: 0;
}
} }
#qr--popout { #qr--popout {
display: flex; display: flex;
flex-direction: column; flex-direction: column;
padding: 0; padding: 0;
z-index: 31; z-index: 31;
> .qr--header {
flex: 0 0 auto; >.qr--header {
height: 2em; flex: 0 0 auto;
position: relative; height: 2em;
> .qr--controls { position: relative;
> .qr--close {
height: 15px; >.qr--controls {
aspect-ratio: 1 / 1; >.qr--close {
font-size: 20px; height: 15px;
opacity: 0.5; aspect-ratio: 1 / 1;
transition: all 250ms; font-size: 20px;
} opacity: 0.5;
} transition: all 250ms;
} }
> .qr--body { }
overflow-y: auto; }
}
>.qr--body {
overflow-y: auto;
}
} }
#qr--bar, #qr--popout > .qr--body {
> .qr--buttons {
margin: 0;
padding: 0;
display: flex;
justify-content: center;
flex-wrap: wrap;
gap: 5px;
width: 100%;
> .qr--buttons { #qr--bar,
display: contents; #qr--popout>.qr--body {
} >.qr--buttons {
margin: 0;
padding: 0;
display: flex;
justify-content: center;
flex-wrap: wrap;
gap: 5px;
width: 100%;
.qr--button { >.qr--buttons {
color: var(--SmartThemeBodyColor); display: contents;
// background-color: var(--black50a); }
border: 1px solid var(--SmartThemeBorderColor);
border-radius: 10px; .qr--button {
padding: 3px 5px; color: var(--SmartThemeBodyColor);
margin: 3px 0; // background-color: var(--black50a);
cursor: pointer; border: 1px solid var(--SmartThemeBorderColor);
transition: 0.3s; border-radius: 10px;
display: flex; padding: 3px 5px;
align-items: center; margin: 3px 0;
justify-content: center; cursor: pointer;
text-align: center; transition: 0.3s;
&:hover { display: flex;
opacity: 1; align-items: center;
filter: brightness(1.2); justify-content: center;
} text-align: center;
> .qr--button-expander {
display: none; &:hover {
} opacity: 1;
&.qr--hasCtx { filter: brightness(1.2);
> .qr--button-expander { }
display: block;
} >.qr--button-expander {
} display: none;
} }
}
&.qr--hasCtx {
>.qr--button-expander {
display: block;
}
}
}
}
} }
.qr--button-expander { .qr--button-expander {
border-left: 1px solid; border-left: 1px solid;
margin-left: 1em; margin-left: 1em;
text-align: center; text-align: center;
width: 2em; width: 2em;
&:hover {
font-weight: bold; &:hover {
} font-weight: bold;
}
} }
.ctx-blocker { .ctx-blocker {
@@ -153,75 +164,103 @@
#qr--settings { #qr--settings {
.qr--head { .qr--head {
display: flex; display: flex;
align-items: baseline; align-items: baseline;
gap: 1em; gap: 1em;
> .qr--title {
font-weight: bold; >.qr--title {
} font-weight: bold;
> .qr--actions { }
display: flex;
flex-direction: row; >.qr--actions {
align-items: baseline; display: flex;
gap: 0.5em; flex-direction: row;
} align-items: baseline;
} gap: 0.5em;
.qr--setList { }
> .qr--item { }
display: flex;
flex-direction: row; .qr--setList {
gap: 0.5em; >.qr--item {
align-items: baseline; display: flex;
padding: 0 0.5em; flex-direction: row;
> .drag-handle { gap: 0.5em;
padding: 0.75em; align-items: baseline;
} padding: 0 0.5em;
> .qr--visible {
flex: 0 0 auto; >.drag-handle {
display: flex; padding: 0.75em;
flex-direction: row; }
}
} >.qr--visible {
} flex: 0 0 auto;
#qr--set-settings { display: flex;
#qr--injectInputContainer { flex-direction: row;
flex-wrap: nowrap; }
} }
} }
#qr--set-qrList {
.qr--set-qrListContents > { #qr--set-settings {
padding: 0 0.5em; #qr--injectInputContainer {
> .qr--set-item { flex-wrap: nowrap;
display: flex; }
flex-direction: row; }
gap: 0.5em;
align-items: baseline; #qr--set-qrList {
padding: 0.25em 0; .qr--set-qrListContents> {
> :nth-child(1) { flex: 0 0 auto; } padding: 0 0.5em;
> :nth-child(2) { flex: 1 1 25%; }
> :nth-child(3) { flex: 0 0 auto; } >.qr--set-item {
> :nth-child(4) { flex: 1 1 75%; } display: flex;
> :nth-child(5) { flex: 0 0 auto; } flex-direction: row;
> .drag-handle { gap: 0.5em;
padding: 0.75em; align-items: baseline;
} padding: 0.25em 0;
.qr--set-itemLabel, .qr--action {
margin: 0; > :nth-child(1) {
} flex: 0 0 auto;
.qr--set-itemMessage { }
font-size: smaller;
} > :nth-child(2) {
} flex: 1 1 25%;
} }
}
.qr--set-qrListActions { > :nth-child(3) {
display: flex; flex: 0 0 auto;
flex-direction: row; }
gap: 0.5em;
justify-content: center; > :nth-child(4) {
padding-bottom: 0.5em; flex: 1 1 75%;
} }
> :nth-child(5) {
flex: 0 0 auto;
}
>.drag-handle {
padding: 0.75em;
}
.qr--set-itemLabel,
.qr--action {
margin: 0;
}
.qr--set-itemMessage {
font-size: smaller;
}
}
}
}
.qr--set-qrListActions {
display: flex;
flex-direction: row;
gap: 0.5em;
justify-content: center;
padding-bottom: 0.5em;
}
} }
@@ -229,38 +268,43 @@
#qr--qrOptions { #qr--qrOptions {
display: flex; display: flex;
flex-direction: column; flex-direction: column;
> #qr--ctxEditor {
.qr--ctxItem { >#qr--ctxEditor {
display: flex; .qr--ctxItem {
flex-direction: row; display: flex;
gap: 0.5em; flex-direction: row;
align-items: baseline; gap: 0.5em;
} align-items: baseline;
} }
}
} }
@media screen and (max-width: 750px) { @media screen and (max-width: 750px) {
body .popup:has(#qr--modalEditor) .popup-content>#qr--modalEditor { body .popup:has(#qr--modalEditor) .popup-content>#qr--modalEditor {
flex-direction: column; flex-direction: column;
overflow: auto; overflow: auto;
> #qr--main {
flex: 0 0 auto; >#qr--main {
} flex: 0 0 auto;
> #qr--main > .qr--labels { }
flex-direction: column;
} >#qr--main>.qr--labels {
> #qr--main > .qr--modal-messageContainer > #qr--modal-messageHolder { flex-direction: column;
min-height: 50svh; }
height: 50svh;
} >#qr--main>.qr--modal-messageContainer>#qr--modal-messageHolder {
} min-height: 50svh;
height: 50svh;
}
}
} }
.popup:has(#qr--modalEditor) { .popup:has(#qr--modalEditor) {
aspect-ratio: unset; aspect-ratio: unset;
&:has(.qr--isExecuting) { &:has(.qr--isExecuting) {
.popup-controls { .popup-controls {
@@ -284,16 +328,16 @@
} }
} }
.popup-content { .popup-content {
display: flex; display: flex;
flex-direction: column; flex-direction: column;
> #qr--modalEditor { >#qr--modalEditor {
flex: 1 1 auto; flex: 1 1 auto;
display: flex; display: flex;
flex-direction: row; flex-direction: row;
gap: 1em; gap: 1em;
overflow: hidden; overflow: hidden;
&.qr--isExecuting { &.qr--isExecuting {
#qr--main > h3:first-child, #qr--main > h3:first-child,
@@ -444,53 +488,65 @@
// hide editor is not working anyways // hide editor is not working anyways
display: none; display: none;
} }
#qr--modal-executeButtons { #qr--modal-executeButtons {
display: flex; display: flex;
gap: 1em; gap: 1em;
.qr--modal-executeButton {
border-width: 2px; .qr--modal-executeButton {
border-style: solid; border-width: 2px;
display: flex; border-style: solid;
flex-direction: row; display: flex;
gap: 0.5em; flex-direction: row;
padding: 0.5em 0.75em; gap: 0.5em;
.qr--modal-executeComboIcon { padding: 0.5em 0.75em;
display: flex;
} .qr--modal-executeComboIcon {
} display: flex;
#qr--modal-execute { }
transition: 200ms; }
filter: grayscale(0);
&.qr--busy { #qr--modal-execute {
cursor: wait; transition: 200ms;
opacity: 0.5; filter: grayscale(0);
filter: grayscale(1);
} &.qr--busy {
} cursor: wait;
#qr--modal-execute { opacity: 0.5;
border-color: rgb(81, 163, 81); filter: grayscale(1);
} }
#qr--modal-pause, #qr--modal-stop { }
cursor: default;
opacity: 0.5; #qr--modal-execute {
filter: grayscale(1); border-color: rgb(81, 163, 81);
pointer-events: none; }
}
.qr--busy { #qr--modal-pause,
~ #qr--modal-pause, ~ #qr--modal-stop { #qr--modal-stop {
cursor: pointer; cursor: default;
opacity: 1; opacity: 0.5;
filter: grayscale(0); filter: grayscale(1);
pointer-events: all; pointer-events: none;
} }
}
#qr--modal-pause { .qr--busy {
border-color: rgb(146, 190, 252);
} ~#qr--modal-pause,
#qr--modal-stop { ~#qr--modal-stop {
border-color: rgb(215, 136, 114); cursor: pointer;
} opacity: 1;
} filter: grayscale(0);
pointer-events: all;
}
}
#qr--modal-pause {
border-color: rgb(146, 190, 252);
}
#qr--modal-stop {
border-color: rgb(215, 136, 114);
}
}
#qr--modal-debugButtons { #qr--modal-debugButtons {
display: none; display: none;
gap: 1em; gap: 1em;
@@ -508,69 +564,84 @@
} }
} }
} }
#qr--modal-executeProgress {
--prog: 0; #qr--modal-executeProgress {
--progColor: rgb(146, 190, 252); --prog: 0;
--progFlashColor: rgb(215, 136, 114); --progColor: rgb(146, 190, 252);
--progSuccessColor: rgb(81, 163, 81); --progFlashColor: rgb(215, 136, 114);
--progErrorColor: rgb(189, 54, 47); --progSuccessColor: rgb(81, 163, 81);
--progAbortedColor: rgb(215, 136, 114); --progErrorColor: rgb(189, 54, 47);
height: 0.5em; --progAbortedColor: rgb(215, 136, 114);
background-color: var(--black50a); height: 0.5em;
position: relative; background-color: var(--black50a);
&:after { position: relative;
content: '';
background-color: var(--progColor); &:after {
position: absolute; content: '';
inset: 0; background-color: var(--progColor);
right: calc(100% - var(--prog) * 1%); position: absolute;
transition: 200ms; inset: 0;
} right: calc(100% - var(--prog) * 1%);
&.qr--paused:after { transition: 200ms;
animation-name: qr--progressPulse; }
animation-duration: 1500ms;
animation-timing-function: ease-in-out; &.qr--paused:after {
animation-delay: 0s; animation-name: qr--progressPulse;
animation-iteration-count: infinite; animation-duration: 1500ms;
} animation-timing-function: ease-in-out;
&.qr--aborted:after { animation-delay: 0s;
background-color: var(--progAbortedColor); animation-iteration-count: infinite;
} }
&.qr--success:after {
background-color: var(--progSuccessColor); &.qr--aborted:after {
} background-color: var(--progAbortedColor);
&.qr--error:after { }
background-color: var(--progErrorColor);
} &.qr--success:after {
} background-color: var(--progSuccessColor);
#qr--modal-executeErrors { }
display: none;
&.qr--hasErrors { &.qr--error:after {
display: block; background-color: var(--progErrorColor);
} }
text-align: left; }
font-size: smaller;
background-color: rgb(189, 54, 47); #qr--modal-executeErrors {
color: white; display: none;
padding: 0.5em;
overflow: auto; &.qr--hasErrors {
min-width: 100%; display: block;
width: 0; }
}
#qr--modal-executeResult { text-align: left;
display: none; font-size: smaller;
&.qr--hasResult { background-color: rgb(189, 54, 47);
display: block; color: white;
} padding: 0.5em;
&:before { content: 'Result: '; } overflow: auto;
text-align: left; min-width: 100%;
font-size: smaller; width: 0;
background-color: rgb(81, 163, 81); }
color: white;
padding: 0.5em; #qr--modal-executeResult {
overflow: auto; display: none;
min-width: 100%;
width: 0; &.qr--hasResult {
display: block;
}
&:before {
content: 'Result: ';
}
text-align: left;
font-size: smaller;
background-color: rgb(81, 163, 81);
color: white;
padding: 0.5em;
overflow: auto;
min-width: 100%;
width: 0;
white-space: pre-wrap; white-space: pre-wrap;
} }
#qr--modal-debugState { #qr--modal-debugState {
@@ -688,14 +759,18 @@
} }
} }
} }
} }
} }
} }
} }
@keyframes qr--progressPulse { @keyframes qr--progressPulse {
0%, 100% {
0%,
100% {
background-color: var(--progColor); background-color: var(--progColor);
} }
50% { 50% {
background-color: var(--progFlashColor); background-color: var(--progFlashColor);
} }
@@ -707,3 +782,7 @@
opacity: 0 !important; opacity: 0 !important;
} }
} }
.popup.qr--hide::backdrop {
opacity: 0 !important;
}

View File

@@ -470,7 +470,7 @@ jQuery(async () => {
} }
const settingsHtml = $(await renderExtensionTemplateAsync('regex', 'dropdown')); const settingsHtml = $(await renderExtensionTemplateAsync('regex', 'dropdown'));
$('#extensions_settings2').append(settingsHtml); $('#regex_container').append(settingsHtml);
$('#open_regex_editor').on('click', function () { $('#open_regex_editor').on('click', function () {
onRegexEditorOpenClick(false, false); onRegexEditorOpenClick(false, false);
}); });

View File

@@ -3158,7 +3158,7 @@ async function addSDGenButtons() {
const buttonHtml = await renderExtensionTemplateAsync('stable-diffusion', 'button'); const buttonHtml = await renderExtensionTemplateAsync('stable-diffusion', 'button');
const dropdownHtml = await renderExtensionTemplateAsync('stable-diffusion', 'dropdown'); const dropdownHtml = await renderExtensionTemplateAsync('stable-diffusion', 'dropdown');
$('#extensionsMenu').prepend(buttonHtml); $('#sd_wand_container').append(buttonHtml);
$(document.body).append(dropdownHtml); $(document.body).append(dropdownHtml);
const messageButton = $('.sd_message_gen'); const messageButton = $('.sd_message_gen');
@@ -3392,7 +3392,7 @@ jQuery(async () => {
const template = await renderExtensionTemplateAsync('stable-diffusion', 'settings', defaultSettings); const template = await renderExtensionTemplateAsync('stable-diffusion', 'settings', defaultSettings);
$('#extensions_settings').append(template); $('#sd_container').append(template);
$('#sd_source').on('change', onSourceChange); $('#sd_source').on('change', onSourceChange);
$('#sd_scale').on('input', onScaleInput); $('#sd_scale').on('input', onScaleInput);
$('#sd_steps').on('input', onStepsInput); $('#sd_steps').on('input', onStepsInput);

View File

@@ -2,27 +2,6 @@
display: block; display: block;
} }
#sd_gen {
/*order: 100;
width: 40px;
height: 40px;
margin: 0;
padding: 1px; */
outline: none;
border: none;
cursor: pointer;
transition: 0.3s;
opacity: 0.7;
display: flex;
align-items: center;
/* justify-content: center; */
}
#sd_gen:hover {
opacity: 1;
filter: brightness(1.2);
}
#sd_dropdown { #sd_dropdown {
z-index: 30000; z-index: 30000;
backdrop-filter: blur(--SmartThemeBlurStrength); backdrop-filter: blur(--SmartThemeBlurStrength);

View File

@@ -132,7 +132,7 @@ jQuery(() => {
<div class="fa-solid fa-1 extensionsMenuExtensionButton" /></div> <div class="fa-solid fa-1 extensionsMenuExtensionButton" /></div>
Token Counter Token Counter
</div>`; </div>`;
$('#extensionsMenu').prepend(buttonHtml); $('#token_counter_wand_container').append(buttonHtml);
$('#token_counter').on('click', doTokenCounter); $('#token_counter').on('click', doTokenCounter);
SlashCommandParser.addCommandObject(SlashCommand.fromProps({ name: 'count', SlashCommandParser.addCommandObject(SlashCommand.fromProps({ name: 'count',
callback: async () => String(await doCount()), callback: async () => String(await doCount()),

View File

@@ -476,6 +476,7 @@ async function onTranslateInputMessageClick() {
const toast = toastr.info('Input Message is translating', 'Please wait...'); const toast = toastr.info('Input Message is translating', 'Please wait...');
const translatedText = await translate(textarea.value, extension_settings.translate.internal_language); const translatedText = await translate(textarea.value, extension_settings.translate.internal_language);
textarea.value = translatedText; textarea.value = translatedText;
textarea.dispatchEvent(new Event('input', { bubbles: true }));
toastr.clear(toast); toastr.clear(toast);
} }
@@ -569,10 +570,10 @@ window['translate'] = translate;
jQuery(async () => { jQuery(async () => {
const html = await renderExtensionTemplateAsync('translate', 'index'); const html = await renderExtensionTemplateAsync('translate', 'index');
const buttonHtml = await renderExtensionTemplateAsync('translate', 'buttons'); const buttonHtml = await renderExtensionTemplateAsync('translate', 'buttons');
$('#extensionsMenu').append(buttonHtml);
$('#extensions_settings2').append(html); $('#translate_wand_container').append(buttonHtml);
$('#translation_container').append(html);
$('#translate_chat').on('click', onTranslateChatClick); $('#translate_chat').on('click', onTranslateChatClick);
$('#translate_input_message').on('click', onTranslateInputMessageClick); $('#translate_input_message').on('click', onTranslateInputMessageClick);
$('#translation_clear').on('click', onTranslationsClearClick); $('#translation_clear').on('click', onTranslationsClearClick);

View File

@@ -1,5 +1,5 @@
import { callPopup, cancelTtsPlay, eventSource, event_types, isStreamingEnabled, name2, saveSettingsDebounced, substituteParams } from '../../../script.js'; import { callPopup, cancelTtsPlay, eventSource, event_types, isStreamingEnabled, name2, saveSettingsDebounced, substituteParams } from '../../../script.js';
import { ModuleWorkerWrapper, doExtrasFetch, extension_settings, getApiUrl, getContext, modules } from '../../extensions.js'; import { ModuleWorkerWrapper, doExtrasFetch, extension_settings, getApiUrl, getContext, modules, renderExtensionTemplateAsync } from '../../extensions.js';
import { delay, escapeRegex, getBase64Async, getStringHash, onlyUnique } from '../../utils.js'; import { delay, escapeRegex, getBase64Async, getStringHash, onlyUnique } from '../../utils.js';
import { EdgeTtsProvider } from './edge.js'; import { EdgeTtsProvider } from './edge.js';
import { ElevenLabsTtsProvider } from './elevenlabs.js'; import { ElevenLabsTtsProvider } from './elevenlabs.js';
@@ -345,7 +345,7 @@ function onAudioControlClicked() {
function addAudioControl() { function addAudioControl() {
$('#extensionsMenu').prepend(` $('#tts_wand_container').append(`
<div id="ttsExtensionMenuItem" class="list-group-item flex-container flexGap5"> <div id="ttsExtensionMenuItem" class="list-group-item flex-container flexGap5">
<div id="tts_media_control" class="extensionsMenuExtensionButton "/></div> <div id="tts_media_control" class="extensionsMenuExtensionButton "/></div>
TTS Playback TTS Playback
@@ -592,6 +592,7 @@ function onEnableClick() {
); );
updateUiAudioPlayState(); updateUiAudioPlayState();
saveSettingsDebounced(); saveSettingsDebounced();
$('body').toggleClass('tts', extension_settings.tts.enabled);
} }
@@ -1075,94 +1076,10 @@ export async function initVoiceMap(unrestricted = false) {
updateVoiceMap(); updateVoiceMap();
} }
$(document).ready(function () { jQuery(async function () {
function addExtensionControls() { async function addExtensionControls() {
const settingsHtml = ` const settingsHtml = $(await renderExtensionTemplateAsync('tts', 'settings'));
<div id="tts_settings"> $('#tts_container').append(settingsHtml);
<div class="inline-drawer">
<div class="inline-drawer-toggle inline-drawer-header">
<b>TTS</b>
<div class="inline-drawer-icon fa-solid fa-circle-chevron-down down"></div>
</div>
<div class="inline-drawer-content">
<div id="tts_status">
</div>
<span>Select TTS Provider</span> </br>
<div class="tts_block">
<select id="tts_provider" class="flex1">
</select>
<input id="tts_refresh" class="menu_button" type="submit" value="Reload" />
</div>
<div>
<label class="checkbox_label" for="tts_enabled">
<input type="checkbox" id="tts_enabled" name="tts_enabled">
<small>Enabled</small>
</label>
<label class="checkbox_label" for="tts_narrate_user">
<input type="checkbox" id="tts_narrate_user">
<small>Narrate user messages</small>
</label>
<label class="checkbox_label" for="tts_auto_generation">
<input type="checkbox" id="tts_auto_generation">
<small>Auto Generation</small>
</label>
<label class="checkbox_label" for="tts_periodic_auto_generation" title="Requires auto generation to be enabled.">
<input type="checkbox" id="tts_periodic_auto_generation">
<small>Narrate by paragraphs (when streaming)</small>
</label>
<label class="checkbox_label" for="tts_narrate_quoted">
<input type="checkbox" id="tts_narrate_quoted">
<small>Only narrate "quotes"</small>
</label>
<label class="checkbox_label" for="tts_narrate_dialogues">
<input type="checkbox" id="tts_narrate_dialogues">
<small>Ignore *text, even "quotes", inside asterisks*</small>
</label>
<label class="checkbox_label" for="tts_narrate_translated_only">
<input type="checkbox" id="tts_narrate_translated_only">
<small>Narrate only the translated text</small>
</label>
<label class="checkbox_label" for="tts_skip_codeblocks">
<input type="checkbox" id="tts_skip_codeblocks">
<small>Skip codeblocks</small>
</label>
<label class="checkbox_label" for="tts_skip_tags">
<input type="checkbox" id="tts_skip_tags">
<small>Skip &lt;tagged&gt; blocks</small>
</label>
<label class="checkbox_label" for="tts_pass_asterisks">
<input type="checkbox" id="tts_pass_asterisks">
<small>Pass Asterisks to TTS Engine</small>
</label>
</div>
<div id="playback_rate_block" class="range-block">
<hr>
<div class="range-block-title justifyLeft" data-i18n="Audio Playback Speed">
<small>Audio Playback Speed</small>
</div>
<div class="range-block-range-and-counter">
<div class="range-block-range">
<input type="range" id="playback_rate" name="volume" min="0" max="3" step="0.05">
</div>
<div class="range-block-counter">
<input type="number" min="0" max="3" step="0.05" data-for="playback_rate" id="playback_rate_counter">
</div>
</div>
</div>
<div id="tts_voicemap_block">
</div>
<hr>
<form id="tts_provider_settings" class="inline-drawer-content">
</form>
<div class="tts_buttons">
<input id="tts_voices" class="menu_button" type="submit" value="Available voices" />
</div>
</div>
</div>
</div>
</div>
`;
$('#extensions_settings').append(settingsHtml);
$('#tts_refresh').on('click', onRefreshClick); $('#tts_refresh').on('click', onRefreshClick);
$('#tts_enabled').on('click', onEnableClick); $('#tts_enabled').on('click', onEnableClick);
$('#tts_narrate_dialogues').on('click', onNarrateDialoguesClick); $('#tts_narrate_dialogues').on('click', onNarrateDialoguesClick);
@@ -1190,7 +1107,7 @@ $(document).ready(function () {
$('#tts_provider').on('change', onTtsProviderChange); $('#tts_provider').on('change', onTtsProviderChange);
$(document).on('click', '.mes_narrate', onNarrateOneMessage); $(document).on('click', '.mes_narrate', onNarrateOneMessage);
} }
addExtensionControls(); // No init dependencies await addExtensionControls(); // No init dependencies
loadSettings(); // Depends on Extension Controls and loadTtsProvider loadSettings(); // Depends on Extension Controls and loadTtsProvider
loadTtsProvider(extension_settings.tts.currentProvider); // No dependencies loadTtsProvider(extension_settings.tts.currentProvider); // No dependencies
addAudioControl(); // Depends on Extension Controls addAudioControl(); // Depends on Extension Controls

View File

@@ -0,0 +1,83 @@
<div id="tts_settings">
<div class="inline-drawer">
<div class="inline-drawer-toggle inline-drawer-header">
<b>TTS</b>
<div class="inline-drawer-icon fa-solid fa-circle-chevron-down down"></div>
</div>
<div class="inline-drawer-content">
<div id="tts_status">
</div>
<span>Select TTS Provider</span> </br>
<div class="tts_block">
<select id="tts_provider" class="flex1">
</select>
<input id="tts_refresh" class="menu_button" type="submit" value="Reload" />
</div>
<div>
<label class="checkbox_label" for="tts_enabled">
<input type="checkbox" id="tts_enabled" name="tts_enabled">
<small>Enabled</small>
</label>
<label class="checkbox_label" for="tts_narrate_user">
<input type="checkbox" id="tts_narrate_user">
<small>Narrate user messages</small>
</label>
<label class="checkbox_label" for="tts_auto_generation">
<input type="checkbox" id="tts_auto_generation">
<small>Auto Generation</small>
</label>
<label class="checkbox_label" for="tts_periodic_auto_generation" title="Requires auto generation to be enabled.">
<input type="checkbox" id="tts_periodic_auto_generation">
<small>Narrate by paragraphs (when streaming)</small>
</label>
<label class="checkbox_label" for="tts_narrate_quoted">
<input type="checkbox" id="tts_narrate_quoted">
<small>Only narrate "quotes"</small>
</label>
<label class="checkbox_label" for="tts_narrate_dialogues">
<input type="checkbox" id="tts_narrate_dialogues">
<small>Ignore *text, even "quotes", inside asterisks*</small>
</label>
<label class="checkbox_label" for="tts_narrate_translated_only">
<input type="checkbox" id="tts_narrate_translated_only">
<small>Narrate only the translated text</small>
</label>
<label class="checkbox_label" for="tts_skip_codeblocks">
<input type="checkbox" id="tts_skip_codeblocks">
<small>Skip codeblocks</small>
</label>
<label class="checkbox_label" for="tts_skip_tags">
<input type="checkbox" id="tts_skip_tags">
<small>Skip &lt;tagged&gt; blocks</small>
</label>
<label class="checkbox_label" for="tts_pass_asterisks">
<input type="checkbox" id="tts_pass_asterisks">
<small>Pass Asterisks to TTS Engine</small>
</label>
</div>
<div id="playback_rate_block" class="range-block">
<hr>
<div class="range-block-title justifyLeft" data-i18n="Audio Playback Speed">
<small>Audio Playback Speed</small>
</div>
<div class="range-block-range-and-counter">
<div class="range-block-range">
<input type="range" id="playback_rate" name="volume" min="0" max="3" step="0.05">
</div>
<div class="range-block-counter">
<input type="number" min="0" max="3" step="0.05" data-for="playback_rate" id="playback_rate_counter">
</div>
</div>
</div>
<div id="tts_voicemap_block">
</div>
<hr>
<form id="tts_provider_settings" class="inline-drawer-content">
</form>
<div class="tts_buttons">
<input id="tts_voices" class="menu_button" type="submit" value="Available voices" />
</div>
</div>
</div>
</div>
</div>

View File

@@ -1,35 +1,3 @@
#tts_media_control {
/* order: 100; */
/* width: 40px;
height: 40px;
margin: 0;
padding: 1px; */
outline: none;
border: none;
cursor: pointer;
/* transition: 0.3s;
opacity: 0.7; */
display: flex;
align-items: center;
/* justify-content: center; */
}
#ttsExtensionMenuItem {
transition: 0.3s;
opacity: 0.7;
}
#ttsExtensionMenuItem:hover {
opacity: 1;
filter: brightness(1.2);
}
#tts_media_control:hover {
opacity: 1;
filter: brightness(1.2);
}
.voice_preview { .voice_preview {
margin: 0.25rem 0.5rem; margin: 0.25rem 0.5rem;
display: flex; display: flex;

View File

@@ -1279,7 +1279,7 @@ jQuery(async () => {
// Migrate from TensorFlow to Transformers // Migrate from TensorFlow to Transformers
settings.source = settings.source !== 'local' ? settings.source : 'transformers'; settings.source = settings.source !== 'local' ? settings.source : 'transformers';
const template = await renderExtensionTemplateAsync(MODULE_NAME, 'settings'); const template = await renderExtensionTemplateAsync(MODULE_NAME, 'settings');
$('#extensions_settings2').append(template); $('#vectors_container').append(template);
$('#vectors_enabled_chats').prop('checked', settings.enabled_chats).on('input', () => { $('#vectors_enabled_chats').prop('checked', settings.enabled_chats).on('input', () => {
settings.enabled_chats = $('#vectors_enabled_chats').prop('checked'); settings.enabled_chats = $('#vectors_enabled_chats').prop('checked');
Object.assign(extension_settings.vectors, settings); Object.assign(extension_settings.vectors, settings);

View File

@@ -1485,12 +1485,18 @@ function loadPowerUserSettings(settings, data) {
if (power_user.stscript.autocomplete.font === undefined) { if (power_user.stscript.autocomplete.font === undefined) {
power_user.stscript.autocomplete.font = defaultStscript.autocomplete.font; power_user.stscript.autocomplete.font = defaultStscript.autocomplete.font;
} }
if (power_user.stscript.autocomplete.style === undefined) {
power_user.stscript.autocomplete.style = power_user.stscript.autocomplete_style || defaultStscript.autocomplete.style;
}
} }
if (power_user.stscript.parser === undefined) { if (power_user.stscript.parser === undefined) {
power_user.stscript.parser = defaultStscript.parser; power_user.stscript.parser = defaultStscript.parser;
} else if (power_user.stscript.parser.flags === undefined) { } else if (power_user.stscript.parser.flags === undefined) {
power_user.stscript.parser.flags = defaultStscript.parser.flags; power_user.stscript.parser.flags = defaultStscript.parser.flags;
} }
// Cleanup old flags
delete power_user.stscript.autocomplete_style;
} }
if (data.themes !== undefined) { if (data.themes !== undefined) {
@@ -1643,8 +1649,8 @@ function loadPowerUserSettings(settings, data) {
$('#stscript_autocomplete_autoHide').prop('checked', power_user.stscript.autocomplete.autoHide ?? false).trigger('input'); $('#stscript_autocomplete_autoHide').prop('checked', power_user.stscript.autocomplete.autoHide ?? false).trigger('input');
$('#stscript_matching').val(power_user.stscript.matching ?? 'fuzzy'); $('#stscript_matching').val(power_user.stscript.matching ?? 'fuzzy');
$('#stscript_autocomplete_style').val(power_user.stscript.autocomplete_style ?? 'theme'); $('#stscript_autocomplete_style').val(power_user.stscript.autocomplete.style ?? 'theme');
document.body.setAttribute('data-stscript-style', power_user.stscript.autocomplete_style); document.body.setAttribute('data-stscript-style', power_user.stscript.autocomplete.style);
$('#stscript_parser_flag_strict_escaping').prop('checked', power_user.stscript.parser.flags[PARSER_FLAG.STRICT_ESCAPING] ?? false); $('#stscript_parser_flag_strict_escaping').prop('checked', power_user.stscript.parser.flags[PARSER_FLAG.STRICT_ESCAPING] ?? false);
$('#stscript_parser_flag_replace_getvar').prop('checked', power_user.stscript.parser.flags[PARSER_FLAG.REPLACE_GETVAR] ?? false); $('#stscript_parser_flag_replace_getvar').prop('checked', power_user.stscript.parser.flags[PARSER_FLAG.REPLACE_GETVAR] ?? false);
$('#stscript_autocomplete_font_scale').val(power_user.stscript.autocomplete.font.scale ?? defaultStscript.autocomplete.font.scale); $('#stscript_autocomplete_font_scale').val(power_user.stscript.autocomplete.font.scale ?? defaultStscript.autocomplete.font.scale);
@@ -3781,8 +3787,8 @@ $(document).ready(() => {
$('#stscript_autocomplete_style').on('change', function () { $('#stscript_autocomplete_style').on('change', function () {
const value = $(this).find(':selected').val(); const value = $(this).find(':selected').val();
power_user.stscript.autocomplete_style = String(value); power_user.stscript.autocomplete.style = String(value);
document.body.setAttribute('data-stscript-style', power_user.stscript.autocomplete_style); document.body.setAttribute('data-stscript-style', power_user.stscript.autocomplete.style);
saveSettingsDebounced(); saveSettingsDebounced();
}); });

View File

@@ -717,7 +717,7 @@ async function importTags(character, { forceShow = false } = {}) {
// Gather the tags to import based on the selected setting // Gather the tags to import based on the selected setting
const tagNamesToImport = await handleTagImport(character, { forceShow }); const tagNamesToImport = await handleTagImport(character, { forceShow });
if (!tagNamesToImport?.length) { if (!tagNamesToImport?.length) {
toastr.info('No tags imported', 'Importing Tags'); toastr.info('No tags to import', 'Importing Tags');
return; return;
} }
@@ -756,8 +756,12 @@ async function handleTagImport(character, { forceShow = false } = {}) {
return [...existingTags, ...newTags, ...folderTags].map(t => t.name); return [...existingTags, ...newTags, ...folderTags].map(t => t.name);
case tag_import_setting.ONLY_EXISTING: case tag_import_setting.ONLY_EXISTING:
return [...existingTags, ...folderTags].map(t => t.name); return [...existingTags, ...folderTags].map(t => t.name);
case tag_import_setting.ASK: case tag_import_setting.ASK: {
if (!existingTags.length && !newTags.length && !folderTags.length) {
return [];
}
return await showTagImportPopup(character, existingTags, newTags, folderTags); return await showTagImportPopup(character, existingTags, newTags, folderTags);
}
case tag_import_setting.NONE: case tag_import_setting.NONE:
return []; return [];
default: throw new Error(`Invalid tag import setting: ${setting}`); default: throw new Error(`Invalid tag import setting: ${setting}`);

View File

@@ -0,0 +1 @@
<div id="extensionsMenuButton" style="display: none;" class="fa-solid fa-magic-wand-sparkles interactable" title="Extensions" /></div>

View File

@@ -0,0 +1,16 @@
<div id="extensionsMenu" class="options-content" style="display: none;">
<div id="caption_wand_container" class="extension_container"></div>
<div id="data_bank_wand_container" class="extension_container"></div>
<div id="attach_file_wand_container" class="extension_container"></div>
<div id="sd_wand_container" class="extension_container"></div>
<div id="tts_wand_container" class="extension_container"></div>
<div id="emulatorjs_wand_container" class="extension_container"></div>
<div id="notebook_wand_container" class="extension_container"></div>
<div id="chess_wand_container" class="extension_container"></div>
<div id="screen_share_wand_container" class="extension_container"></div>
<div id="translate_wand_container" class="extension_container"></div>
<div id="dice_wand_container" class="extension_container"></div>
<div id="objective_wand_container" class="extension_container"></div>
<div id="token_counter_wand_container" class="extension_container"></div>
<div id="prompt_inspector_wand_container" class="extension_container"></div>
</div>

View File

@@ -905,6 +905,7 @@ export function parseTextgenLogprobs(token, logprobs) {
case VLLM: case VLLM:
case APHRODITE: case APHRODITE:
case MANCER: case MANCER:
case INFERMATICAI:
case OOBA: { case OOBA: {
/** @type {Record<string, number>[]} */ /** @type {Record<string, number>[]} */
const topLogprobs = logprobs.top_logprobs; const topLogprobs = logprobs.top_logprobs;
@@ -1020,7 +1021,7 @@ export function isJsonSchemaSupported() {
} }
function getLogprobsNumber() { function getLogprobsNumber() {
if (settings.type === VLLM) { if (settings.type === VLLM || settings.type === INFERMATICAI) {
return 5; return 5;
} }
@@ -1124,7 +1125,7 @@ export function getTextGenGenerationData(finalPrompt, maxTokens, isImpersonate,
'best_of': canMultiSwipe ? settings.n : 1, 'best_of': canMultiSwipe ? settings.n : 1,
'ignore_eos': settings.ignore_eos_token, 'ignore_eos': settings.ignore_eos_token,
'spaces_between_special_tokens': settings.spaces_between_special_tokens, 'spaces_between_special_tokens': settings.spaces_between_special_tokens,
'seed': settings.seed, 'seed': settings.seed >= 0 ? settings.seed : undefined,
}; };
const aphroditeParams = { const aphroditeParams = {
'n': canMultiSwipe ? settings.n : 1, 'n': canMultiSwipe ? settings.n : 1,
@@ -1162,6 +1163,7 @@ export function getTextGenGenerationData(finalPrompt, maxTokens, isImpersonate,
switch (settings.type) { switch (settings.type) {
case VLLM: case VLLM:
case INFERMATICAI:
params = Object.assign(params, vllmParams); params = Object.assign(params, vllmParams);
break; break;

View File

@@ -105,6 +105,7 @@ const MAX_SCAN_DEPTH = 1000;
* @property {number} hash Hash of the entry that triggered the effect * @property {number} hash Hash of the entry that triggered the effect
* @property {number} start The chat index where the effect starts * @property {number} start The chat index where the effect starts
* @property {number} end The chat index where the effect ends * @property {number} end The chat index where the effect ends
* @property {boolean} protected The protected effect can't be removed if the chat does not advance
*/ */
/** /**
@@ -362,11 +363,6 @@ class WorldInfoTimedEffects {
*/ */
#entries = []; #entries = [];
/**
* Set of entries to ignore chat advancement requirement for.
*/
#entryIgnoreAdvancement = [];
/** /**
* Buffer for active timed effects. * Buffer for active timed effects.
* @type {Record<TimedEffectType, WIScanEntry[]>} * @type {Record<TimedEffectType, WIScanEntry[]>}
@@ -392,12 +388,11 @@ class WorldInfoTimedEffects {
} }
const key = this.#getEntryKey(entry); const key = this.#getEntryKey(entry);
const effect = this.#getEntryTimedEffect(entry, 'cooldown'); const effect = this.#getEntryTimedEffect('cooldown', entry, true);
chat_metadata.timedWorldInfo.cooldown[key] = effect; chat_metadata.timedWorldInfo.cooldown[key] = effect;
console.log(`Adding cooldown entry ${key} on ended sticky: start=${effect.start}, end=${effect.end}`); console.log(`Adding cooldown entry ${key} on ended sticky: start=${effect.start}, end=${effect.end}, protected=${effect.protected}`);
// Set the cooldown immediately for this evaluation // Set the cooldown immediately for this evaluation
this.#buffer['cooldown'].push(entry); this.#buffer.cooldown.push(entry);
this.#entryIgnoreAdvancement.push(entry);
}, },
/** /**
@@ -470,27 +465,20 @@ class WorldInfoTimedEffects {
/** /**
* Gets a timed effect for a WI entry. * Gets a timed effect for a WI entry.
* @param {WIScanEntry} entry WI entry
* @param {TimedEffectType} type Type of timed effect * @param {TimedEffectType} type Type of timed effect
* @param {WIScanEntry} entry WI entry
* @param {boolean} isProtected If the effect should be protected
* @returns {WITimedEffect} Timed effect for the entry * @returns {WITimedEffect} Timed effect for the entry
*/ */
#getEntryTimedEffect(entry, type) { #getEntryTimedEffect(type, entry, isProtected) {
return { return {
hash: this.#getEntryHash(entry), hash: this.#getEntryHash(entry),
start: this.#chat.length, start: this.#chat.length,
end: this.#chat.length + Number(entry[type]), end: this.#chat.length + Number(entry[type]),
protected: !!isProtected,
}; };
} }
/**
* Gets if the entry should be ignored for chat advancement requirement.
* @param {WIScanEntry} entry WI entry
* @returns {boolean} True if the entry should be ignored
*/
#isChatAdvancementIgnored(entry) {
return entry && this.#entryIgnoreAdvancement.some(x => this.#getEntryHash(x) === this.#getEntryHash(entry));
}
/** /**
* Processes entries for a given type of timed effect. * Processes entries for a given type of timed effect.
* @param {TimedEffectType} type Identifier for the type of timed effect * @param {TimedEffectType} type Identifier for the type of timed effect
@@ -504,7 +492,7 @@ class WorldInfoTimedEffects {
console.log(`Processing ${type} entry ${key}`, value); console.log(`Processing ${type} entry ${key}`, value);
const entry = this.#entries.find(x => String(this.#getEntryHash(x)) === String(value.hash)); const entry = this.#entries.find(x => String(this.#getEntryHash(x)) === String(value.hash));
if (this.#chat.length <= Number(value.start) && !this.#isChatAdvancementIgnored(entry)) { if (this.#chat.length <= Number(value.start) && !value.protected) {
console.log(`Removing ${type} entry ${key} from timedWorldInfo: chat not advanced`, value); console.log(`Removing ${type} entry ${key} from timedWorldInfo: chat not advanced`, value);
delete chat_metadata.timedWorldInfo[type][key]; delete chat_metadata.timedWorldInfo[type][key];
continue; continue;
@@ -512,7 +500,7 @@ class WorldInfoTimedEffects {
// Missing entries (they could be from another character's lorebook) // Missing entries (they could be from another character's lorebook)
if (!entry) { if (!entry) {
if (this.#chat.length > Number(value.end)) { if (this.#chat.length >= Number(value.end)) {
console.log(`Removing ${type} entry from timedWorldInfo: entry not found and interval passed`, entry); console.log(`Removing ${type} entry from timedWorldInfo: entry not found and interval passed`, entry);
delete chat_metadata.timedWorldInfo[type][key]; delete chat_metadata.timedWorldInfo[type][key];
} }
@@ -526,7 +514,7 @@ class WorldInfoTimedEffects {
continue; continue;
} }
if (this.#chat.length > Number(value.end)) { if (this.#chat.length >= Number(value.end)) {
console.log(`Removing ${type} entry from timedWorldInfo: ${type} interval passed`, entry); console.log(`Removing ${type} entry from timedWorldInfo: ${type} interval passed`, entry);
delete chat_metadata.timedWorldInfo[type][key]; delete chat_metadata.timedWorldInfo[type][key];
if (typeof onEnded === 'function') { if (typeof onEnded === 'function') {
@@ -577,10 +565,10 @@ class WorldInfoTimedEffects {
const key = this.#getEntryKey(entry); const key = this.#getEntryKey(entry);
if (!chat_metadata.timedWorldInfo[type][key]) { if (!chat_metadata.timedWorldInfo[type][key]) {
const effect = this.#getEntryTimedEffect(entry, type); const effect = this.#getEntryTimedEffect(type, entry, false);
chat_metadata.timedWorldInfo[type][key] = effect; chat_metadata.timedWorldInfo[type][key] = effect;
console.log(`Adding ${type} entry ${key}: start=${effect.start}, end=${effect.end}`); console.log(`Adding ${type} entry ${key}: start=${effect.start}, end=${effect.end}, protected=${effect.protected}`);
} }
} }
@@ -610,9 +598,9 @@ class WorldInfoTimedEffects {
delete chat_metadata.timedWorldInfo[type][key]; delete chat_metadata.timedWorldInfo[type][key];
if (newState) { if (newState) {
const effect = this.#getEntryTimedEffect(entry, type); const effect = this.#getEntryTimedEffect(type, entry, false);
chat_metadata.timedWorldInfo[type][key] = effect; chat_metadata.timedWorldInfo[type][key] = effect;
console.log(`Adding ${type} entry ${key}: start=${effect.start}, end=${effect.end}`); console.log(`Adding ${type} entry ${key}: start=${effect.start}, end=${effect.end}, protected=${effect.protected}`);
} }
} }
@@ -646,7 +634,6 @@ class WorldInfoTimedEffects {
for (const buffer of Object.values(this.#buffer)) { for (const buffer of Object.values(this.#buffer)) {
buffer.splice(0, buffer.length); buffer.splice(0, buffer.length);
} }
this.#entryIgnoreAdvancement.splice(0, this.#entryIgnoreAdvancement.length);
} }
} }

View File

@@ -827,7 +827,7 @@ body .panelControlBar {
} }
.font-family-reset { .font-family-reset {
font-family: var(--mainFontFamily); font-family: var(--mainFontFamily);
font-size: var(--mainFontSize); font-size: var(--mainFontSize);
font-weight: 400; font-weight: 400;
} }
@@ -885,7 +885,8 @@ body .panelControlBar {
} }
.options-content a, .options-content a,
#extensionsMenu>div, #extensionsMenu>.extension_container>div,
#extensionsMenu>div:not(.extension_container),
.list-group>div, .list-group>div,
.list-group .list-group-item, .list-group .list-group-item,
#sd_dropdown .list-group span { #sd_dropdown .list-group span {
@@ -899,13 +900,15 @@ body .panelControlBar {
align-items: baseline; align-items: baseline;
} }
#extensionsMenu>div, #extensionsMenu>.extension_container>div,
#extensionsMenu>div:not(.extension_container),
.options-content a, .options-content a,
.list-group-item { .list-group-item {
opacity: 0.5; opacity: 0.5;
} }
#extensionsMenu>div:hover, #extensionsMenu>.extension_container>div:hover,
#extensionsMenu>div:not(.extension_container):hover,
.options-content a:hover, .options-content a:hover,
.list-group-item:hover { .list-group-item:hover {
opacity: 1; opacity: 1;

View File

@@ -224,6 +224,17 @@ const INFERMATICAI_KEYS = [
'repetition_penalty', 'repetition_penalty',
'stream', 'stream',
'stop', 'stop',
'presence_penalty',
'frequency_penalty',
'min_p',
'seed',
'ignore_eos',
'n',
'best_of',
'min_tokens',
'spaces_between_special_tokens',
'skip_special_tokens',
'logprobs',
]; ];
// https://dreamgen.com/docs/api#openai-text // https://dreamgen.com/docs/api#openai-text

View File

@@ -340,7 +340,7 @@ router.post('/generate', jsonParser, async function (request, response) {
// Map InfermaticAI response to OAI completions format // Map InfermaticAI response to OAI completions format
if (apiType === TEXTGEN_TYPES.INFERMATICAI) { if (apiType === TEXTGEN_TYPES.INFERMATICAI) {
data['choices'] = (data?.choices || []).map(choice => ({ text: choice?.message?.content || choice.text })); data['choices'] = (data?.choices || []).map(choice => ({ text: choice?.message?.content || choice.text, logprobs: choice?.logprobs, index: choice?.index }));
} }
return response.send(data); return response.send(data);