Add author's note to floating prompt extension

This commit is contained in:
SillyLossy
2023-03-27 01:43:46 +03:00
parent 96faff5b2e
commit 9b3613c63c
5 changed files with 110 additions and 22 deletions

View File

@@ -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);
}

View File

@@ -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 = `
<h4>Floating Prompt</h4>
<h4>Floating Prompt / Author's Note</h4>
<div class="floating_prompt_settings">
<label for="extension_floating_prompt">Append the following text to the scenario:</label>
<label for="extension_floating_prompt">Append the following text:</label>
<textarea id="extension_floating_prompt" class="text_pole" rows="2"></textarea>
<label>
<input type="radio" name="extension_floating_position" value="0" />
After scenario
</label>
<label>
<input type="radio" name="extension_floating_position" value="1" />
In-chat
</label>
<label for="extension_floating_interval">Every N messages <b>you</b> send (set to 0 to disable):</label>
<input id="extension_floating_interval" class="text_pole" type="number" value="0" min="0" max="999" />
<label for="extension_floating_interval">Insertion depth (for in-chat positioning, set to 0 to disable):</label>
<input id="extension_floating_depth" class="text_pole" type="number" value="0" min="0" max="99" />
<span>Appending the prompt in next: <span id="extension_floating_counter">No</span> message(s)</span>
</div>
`;
@@ -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();

View File

@@ -1,5 +1,5 @@
{
"display_name": "Floating Prompt",
"display_name": "Floating Prompt / Author's Note",
"loading_order": 1,
"requires": [],
"js": "index.js",

View File

@@ -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);
}