diff --git a/public/script.js b/public/script.js index eaaec3045..5df017fe6 100644 --- a/public/script.js +++ b/public/script.js @@ -193,7 +193,7 @@ let converter; reloadMarkdownProcessor(); /* let bg_menu_toggle = false; */ -const systemUserName = "SillyTavern System"; +export const systemUserName = "SillyTavern System"; let default_user_name = "You"; let name1 = default_user_name; let name2 = "SillyTavern System"; @@ -1528,7 +1528,7 @@ async function Generate(type, { automatic_trigger, force_name2, resolve, reject, } if (selected_group && !is_group_generating) { - generateGroupWrapper(false, type); + generateGroupWrapper(false, type, null, { resolve, reject, quiet_prompt }); return; } diff --git a/public/scripts/extensions/stable-diffusion/index.js b/public/scripts/extensions/stable-diffusion/index.js index ba0546d45..a3c56ca4a 100644 --- a/public/scripts/extensions/stable-diffusion/index.js +++ b/public/scripts/extensions/stable-diffusion/index.js @@ -1,4 +1,10 @@ -import { substituteParams, saveSettingsDebounced } from "../../../script.js"; +import { + substituteParams, + saveSettingsDebounced, + systemUserName, + hideSwipeButtons, + showSwipeButtons +} from "../../../script.js"; import { getApiUrl, getContext, extension_settings, defaultRequestArgs } from "../../extensions.js"; import { stringFormat } from "../../utils.js"; @@ -6,6 +12,8 @@ import { stringFormat } from "../../utils.js"; const m = x => `${x}`; // Joins an array of strings with ' / ' const j = a => a.join(' / '); +// Wraps a string into paragraph block +const p = a => `

${a}

` const postHeaders = { 'Content-Type': 'application/json', @@ -26,10 +34,10 @@ const triggerWords = { } const quietPrompts = { - [generationMode.CHARACTER]: "Please provide a detailed description of {{char}}'s appearance", - [generationMode.USER]: "Please provide a detailed description of {{user}}'s appearance", - [generationMode.SCENARIO]: 'Please provide a detailed description of your surroundings and what you are doing right now', - [generationMode.FREE]: 'Please provide a detailed and vivid description of {0}', + [generationMode.CHARACTER]: "[Please provide a detailed description of {{char}}'s appearance]", + [generationMode.USER]: "[Please provide a detailed description of {{user}}'s appearance]", + [generationMode.SCENARIO]: '[Please provide a detailed description of your surroundings and what you are doing right now]', + [generationMode.FREE]: '[Please provide a detailed and vivid description of {0}]', } const helpString = [ @@ -234,6 +242,7 @@ async function generatePicture(_, trigger) { })); context.deactivateSendButtons(); + hideSwipeButtons(); const url = new URL(getApiUrl()); url.pathname = '/api/image'; @@ -258,11 +267,13 @@ async function generatePicture(_, trigger) { const base64Image = `data:image/jpeg;base64,${data.image}`; sendMessage(prompt, base64Image); } - } catch { + } catch (err) { + console.error(err); throw new Error('SD prompt text generation failed.') } finally { context.activateSendButtons(); + showSwipeButtons(); } } @@ -270,11 +281,12 @@ async function sendMessage(prompt, image) { const context = getContext(); const messageText = `[${context.name2} sends a picture that contains: ${prompt}]`; const message = { - name: context.name2, + name: context.groupId ? systemUserName : context.name2, + is_system: context.groupId ? true : false, is_user: false, is_name: true, send_date: Date.now(), - mes: messageText, + mes: context.groupId ? p(messageText) : messageText, extra: { image: image, title: prompt, diff --git a/public/scripts/group-chats.js b/public/scripts/group-chats.js index 562f2b2e3..20b2568e0 100644 --- a/public/scripts/group-chats.js +++ b/public/scripts/group-chats.js @@ -375,7 +375,7 @@ function getGroupAvatar(group) { } -async function generateGroupWrapper(by_auto_mode, type = null, force_chid = null) { +async function generateGroupWrapper(by_auto_mode, type = null, force_chid = null, params = {}) { if (online_status === "no_connection") { is_group_generating = false; setSendButtonState(false); @@ -423,6 +423,7 @@ async function generateGroupWrapper(by_auto_mode, type = null, force_chid = null let lastMessageText = lastMessage.mes; let activationText = ""; let isUserInput = false; + let isQuietGenDone = false; if (userInput && userInput.length && !by_auto_mode) { isUserInput = true; @@ -439,6 +440,23 @@ async function generateGroupWrapper(by_auto_mode, type = null, force_chid = null if (typeof force_chid == 'number') { activatedMembers = [force_chid]; + } else if (type === "quiet") { + activatedMembers = activateSwipe(group.members); + + if (activatedMembers.length === 0) { + activatedMembers = activateListOrder(group.members.slice(0, 1)); + } + + const resolveOriginal = params.resolve; + const rejectOriginal = params.reject; + params.resolve = function() { + isQuietGenDone = true; + resolveOriginal.apply(this, arguments); + }; + params.reject = function() { + isQuietGenDone = true; + rejectOriginal.apply(this, arguments); + } } else if (type === "swipe") { activatedMembers = activateSwipe(group.members); @@ -461,11 +479,11 @@ async function generateGroupWrapper(by_auto_mode, type = null, force_chid = null // now the real generation begins: cycle through every character for (const chId of activatedMembers) { - const generateType = type == "swipe" || type == "impersonate" ? type : "group_chat"; + const generateType = type == "swipe" || type == "impersonate" || type == "quiet" ? type : "group_chat"; setCharacterId(chId); setCharacterName(characters[chId].name) - await Generate(generateType, { automatic_trigger: by_auto_mode }); + await Generate(generateType, { automatic_trigger: by_auto_mode, ...(params || {}) }); if (type !== "swipe" && type !== "impersonate") { // update indicator and scroll down @@ -520,6 +538,13 @@ async function generateGroupWrapper(by_auto_mode, type = null, force_chid = null } } } + else if (type === 'quiet') { + if (isQuietGenDone) { + break; + } else { + await delay(100); + } + } else { messagesBefore++; break;