diff --git a/public/script.js b/public/script.js index 94a65a67d..649f00991 100644 --- a/public/script.js +++ b/public/script.js @@ -101,6 +101,7 @@ export { openCharacterChat, saveChat, messageFormating, + getExtensionPrompt, chat, this_chid, settings, @@ -120,6 +121,7 @@ export { system_message_types, talkativeness_default, default_ch_mes, + extension_prompt_types, } // API OBJECT FOR EXTERNAL WIRING @@ -183,6 +185,11 @@ const system_message_types = { BOOKMARK_BACK: "bookmark_back", }; +const extension_prompt_types = { + AFTER_SCENARIO: 0, + IN_CHAT: 1 +}; + const system_messages = { help: { name: systemUserName, @@ -195,6 +202,7 @@ const system_messages = { '
    ', '
  1. *text* – format the actions that your character does
  2. ', '
  3. {*text*} – set the behavioral bias for your character
  4. ', + '
  5. {} – cancel a previously set bias
  6. ', '
', 'Need more help? Visit our wiki – TavernAI Wiki!' ].join('') @@ -767,7 +775,7 @@ function messageFormating(mes, ch_name, isSystem, forceAvatar) { .replace(/\n/g, "
"); } else if (!isSystem) { mes = converter.makeHtml(mes); - mes = mes.replace(/{([^}]+)}/g, ""); + mes = mes.replace(/{.*}/g, ""); mes = mes.replace(/\n/g, "
"); mes = mes.trim(); } @@ -945,7 +953,11 @@ function extractMessageBias(message) { } if (!found.length) { - return ""; + // cancels a bias + if (message.includes('{') && message.includes('}')) { + return ''; + } + return null; } return ` ${found.join(" ")} `; @@ -970,11 +982,12 @@ function cleanGroupMessage(getMessage) { return getMessage; } -function getExtensionPrompt() { +function getExtensionPrompt(position = 0, depth) { let extension_prompt = Object.keys(extension_prompts) .sort() .map((x) => extension_prompts[x]) - .filter(x => x) + .filter(x => x.position == position && x.value && (depth === undefined || x.depth == depth)) + .map(x => x.value) .join("\n"); if (extension_prompt.length && !extension_prompt.startsWith("\n")) { extension_prompt = "\n" + extension_prompt; @@ -1058,9 +1071,12 @@ async function Generate(type, automatic_trigger, force_name2) {//encode("dsfs"). let messageBias = extractMessageBias(textareaText); // gets bias of the latest message where it was applied - for (let mes of chat) { + for (let mes of chat.slice().reverse()) { if (mes && mes.is_user && mes.extra && mes.extra.bias) { - promptBias = mes.extra.bias; + if (mes.extra.bias.trim().length > 0) { + promptBias = mes.extra.bias; + } + break; } } @@ -1220,7 +1236,7 @@ async function Generate(type, automatic_trigger, force_name2) {//encode("dsfs"). } // replace bias markup - chat2[i] = (chat2[i] ?? '').replace(/{([^}]+)}/g, ''); + chat2[i] = (chat2[i] ?? '').replace(/{.*}/g, ''); //console.log('replacing chat2 {}s'); j++; } @@ -1246,7 +1262,7 @@ async function Generate(type, automatic_trigger, force_name2) {//encode("dsfs"). } let { worldInfoString, worldInfoBefore, worldInfoAfter } = getWorldInfoPrompt(chat2); - let extension_prompt = getExtensionPrompt(); + let extension_prompt = getExtensionPrompt(extension_prompt_types.AFTER_SCENARIO); /////////////////////// swipecode if (type == 'swipe') { @@ -1356,6 +1372,24 @@ async function Generate(type, automatic_trigger, force_name2) {//encode("dsfs"). item = item.replace(name1 + ':', 'You:'); } } + + if (i === 0) { + // Process those that couldn't get that far + for (let upperDepth = 100; upperDepth >= arrMes.length; upperDepth--) { + const upperAnchor = getExtensionPrompt(extension_prompt_types.IN_CHAT, upperDepth); + if (upperAnchor && upperAnchor.length) { + item = upperAnchor + item; + } + } + } + + const anchorDepth = Math.abs(i - arrMes.length + 1); + const extensionAnchor = getExtensionPrompt(extension_prompt_types.IN_CHAT, anchorDepth); + + if (extensionAnchor && extensionAnchor.length) { + item += extensionAnchor; + } + mesSend[mesSend.length] = item; }); @@ -2619,8 +2653,8 @@ function select_rm_characters() { setRightTabSelectedClass('rm_button_characters'); } -function setExtensionPrompt(key, value) { - extension_prompts[key] = value; +function setExtensionPrompt(key, value, position, depth) { + extension_prompts[key] = { value, position, depth }; } function callPopup(text, type) { diff --git a/public/scripts/extensions/dice/style.css b/public/scripts/extensions/dice/style.css index 14a30b69a..3d7d069e6 100644 --- a/public/scripts/extensions/dice/style.css +++ b/public/scripts/extensions/dice/style.css @@ -25,17 +25,25 @@ padding-left: 0; margin-top: 0; margin-bottom: 3px; + overflow: hidden; + background-color: black; + border: 1px solid #666; + border-radius: 15px; + box-shadow: 0 0 5px black; + text-shadow: 0 0 3px black; +} + +.list-group-item:hover { + background-color: rgba(255, 255, 255, 0.3); } .list-group-item { + color: rgba(229, 224, 216, 1); position: relative; display: block; padding: 0.75rem 1.25rem; margin-bottom: -1px; - background-color: rgba(0,0,0,0.5); - border: 1px solid rgba(0,0,0,0.7); box-sizing: border-box; user-select: none; cursor: pointer; - backdrop-filter: blur(10px); } \ No newline at end of file diff --git a/public/scripts/extensions/floating-prompt/index.js b/public/scripts/extensions/floating-prompt/index.js index ce3381d3e..6b688f9c3 100644 --- a/public/scripts/extensions/floating-prompt/index.js +++ b/public/scripts/extensions/floating-prompt/index.js @@ -6,6 +6,8 @@ const UPDATE_INTERVAL = 1000; let lastMessageNumber = null; let promptInsertionInterval = 0; +let promptInsertionPosition = 0; +let promptInsertionDepth = 0; function onExtensionFloatingPromptInput() { saveSettings(); @@ -16,24 +18,45 @@ function onExtensionFloatingIntervalInput() { saveSettings(); } +function onExtensionFloatingDepthInput() { + promptInsertionDepth = Number($(this).val()); + saveSettings(); +} + +function onExtensionFloatingPositionInput(e) { + promptInsertionPosition = e.target.value; + saveSettings(); +} + function getLocalStorageKeys() { const context = getContext(); const keySuffix = context.groupId ? context.groupId : `${context.characters[context.characterId].name}_${context.chatId}`; - return { prompt: `extensions_floating_prompt_${keySuffix}`, interval: `extensions_floating_interval_${keySuffix}` }; + return { + prompt: `extensions_floating_prompt_${keySuffix}`, + interval: `extensions_floating_interval_${keySuffix}`, + depth: `extensions_floating_depth_${keySuffix}`, + position: `extensions_floating_position_${keySuffix}`, + }; } function loadSettings() { const keys = getLocalStorageKeys(); const prompt = localStorage.getItem(keys.prompt) ?? ''; const interval = localStorage.getItem(keys.interval) ?? 0; + const position = localStorage.getItem(keys.position) ?? 0; + const depth = localStorage.getItem(keys.depth) ?? 0; $('#extension_floating_prompt').val(prompt).trigger('input'); $('#extension_floating_interval').val(interval).trigger('input'); + $('#extension_floating_depth').val(depth).trigger('input'); + $(`input[name="extension_floating_position"][value="${position}"]`).prop('checked', true).trigger('change'); } function saveSettings() { const keys = getLocalStorageKeys(); localStorage.setItem(keys.prompt, $('#extension_floating_prompt').val()); localStorage.setItem(keys.interval, $('#extension_floating_interval').val()); + localStorage.setItem(keys.depth, $('#extension_floating_depth').val()); + localStorage.setItem(keys.position, $('input:radio[name="extension_floating_position"]:checked').val()); } async function moduleWorker() { @@ -61,21 +84,31 @@ async function moduleWorker() { const messagesTillInsertion = lastMessageNumber >= promptInsertionInterval ? (lastMessageNumber % promptInsertionInterval) : (promptInsertionInterval - lastMessageNumber); - const shouldAddPrompt = messagesTillInsertion == 0; + const shouldAddPrompt = messagesTillInsertion == 0 && (promptInsertionPosition == 0 || promptInsertionDepth > 0); const prompt = shouldAddPrompt ? $('#extension_floating_prompt').val() : ''; - context.setExtensionPrompt(MODULE_NAME, prompt); + context.setExtensionPrompt(MODULE_NAME, prompt, promptInsertionPosition, promptInsertionDepth); $('#extension_floating_counter').text(shouldAddPrompt ? 'This' : messagesTillInsertion); } (function() { function addExtensionsSettings() { const settingsHtml = ` -

Floating Prompt

+

Floating Prompt / Author's Note

- + + + + + Appending the prompt in next: No message(s)
`; @@ -83,6 +116,8 @@ async function moduleWorker() { $('#extensions_settings').append(settingsHtml); $('#extension_floating_prompt').on('input', onExtensionFloatingPromptInput); $('#extension_floating_interval').on('input', onExtensionFloatingIntervalInput); + $('#extension_floating_depth').on('input', onExtensionFloatingDepthInput); + $('input[name="extension_floating_position"]').on('change', onExtensionFloatingPositionInput); } addExtensionsSettings(); diff --git a/public/scripts/extensions/floating-prompt/manifest.json b/public/scripts/extensions/floating-prompt/manifest.json index 93cf233d4..f559c076c 100644 --- a/public/scripts/extensions/floating-prompt/manifest.json +++ b/public/scripts/extensions/floating-prompt/manifest.json @@ -1,5 +1,5 @@ { - "display_name": "Floating Prompt", + "display_name": "Floating Prompt / Author's Note", "loading_order": 1, "requires": [], "js": "index.js", diff --git a/public/scripts/openai.js b/public/scripts/openai.js index 05b20bc58..464700c26 100644 --- a/public/scripts/openai.js +++ b/public/scripts/openai.js @@ -13,9 +13,11 @@ import { saveChat, checkOnlineStatus, setOnlineStatus, + getExtensionPrompt, token, name1, name2, + extension_prompt_types, } from "../script.js"; import { groups, selected_group } from "./group-chats.js"; @@ -94,13 +96,21 @@ function setOpenAIMessages(chat) { } // replace bias markup - content = (content ?? '').replace(/{([^}]+)}/g, ''); + content = (content ?? '').replace(/{.*}/g, ''); // Apply the "wrap in quotes" option if (role == 'user' && oai_settings.wrap_in_quotes) content = `"${content}"`; openai_msgs[i] = { "role": role, "content": content }; j++; } + + for (let i = 1; i < 100; i++) { + const anchor = getExtensionPrompt(extension_prompt_types.IN_CHAT, i); + + if (anchor && anchor.length) { + openai_msgs.splice(i, 0, { "role": 'system', 'content': anchor.trim() }) + } + } } function setOpenAIMessageExamples(mesExamplesArray) { @@ -130,6 +140,7 @@ function generateOpenAIPromptCache(charPersonality, topAnchorDepth, anchorTop, a if (i >= openai_msgs.length - 1 && count_view_mes > 8 && $.trim(item).substr(0, (name1 + ":").length) == name1 + ":") {//For add anchor in end item = anchorBottom + "\n" + item; } + msg["content"] = item; openai_msgs[i] = msg; }); @@ -232,8 +243,8 @@ function prepareOpenAIMessages(name2, storyString, worldInfoBefore, worldInfoAft let start_chat_count = countTokens([new_chat_msg]); let total_count = countTokens([prompt_msg], true) + start_chat_count; - if (bias) { - let bias_msg = { "role": "system", "content": bias }; + if (bias && bias.trim().length) { + let bias_msg = { "role": "system", "content": bias.trim() }; openai_msgs.push(bias_msg); total_count += countTokens([bias_msg], true); }