Migrate author's note to chat metadata

This commit is contained in:
SillyLossy
2023-04-07 21:17:24 +03:00
parent 2a86cf7905
commit 9aeeda3602
3 changed files with 168 additions and 75 deletions

View File

@ -84,6 +84,7 @@ import {
} from "./scripts/poe.js"; } from "./scripts/poe.js";
import { debounce, delay } from "./scripts/utils.js"; import { debounce, delay } from "./scripts/utils.js";
import { extension_settings, loadExtensionSettings } from "./scripts/extensions.js";
//exporting functions and vars for mods //exporting functions and vars for mods
export { export {
@ -2396,6 +2397,7 @@ async function getSettings(type) {
script.src = src; script.src = src;
$("body").append(script); $("body").append(script);
} }
loadExtensionSettings(settings);
} }
//get the character to auto-load //get the character to auto-load
@ -2449,6 +2451,7 @@ async function saveSettings(type) {
horde_settings: horde_settings, horde_settings: horde_settings,
power_user: power_user, power_user: power_user,
poe_settings: poe_settings, poe_settings: poe_settings,
extension_settings: extension_settings,
...nai_settings, ...nai_settings,
...kai_settings, ...kai_settings,
...oai_settings, ...oai_settings,

View File

@ -1,33 +1,65 @@
import { callPopup } from "../script.js"; import { callPopup, saveSettings, saveSettingsDebounced } from "../script.js";
import { isSubsetOf } from "./utils.js"; import { isSubsetOf } from "./utils.js";
export { export {
getContext, getContext,
getApiUrl, getApiUrl,
loadExtensionSettings,
defaultRequestArgs, defaultRequestArgs,
modules, modules,
extension_settings,
}; };
const extensionNames = ['caption', 'dice', 'expressions', 'floating-prompt', 'memory']; const extensionNames = ['caption', 'dice', 'expressions', 'floating-prompt', 'memory'];
const manifests = await getManifests(extensionNames); const manifests = await getManifests(extensionNames);
const extensions_urlKey = 'extensions_url';
const extensions_autoConnectKey = 'extensions_autoconnect'; // TODO: Delete in next release
const extensions_disabledKey = 'extensions_disabled'; function migrateFromLocalStorage() {
const extensions_urlKey = 'extensions_url';
const extensions_autoConnectKey = 'extensions_autoconnect';
const extensions_disabledKey = 'extensions_disabled';
const apiUrl = localStorage.getItem(extensions_urlKey);
const autoConnect = localStorage.getItem(extensions_autoConnectKey);
const extensionsDisabled = localStorage.getItem(extensions_disabledKey);
if (apiUrl !== null) {
extension_settings.apiUrl = apiUrl;
localStorage.removeItem(extensions_urlKey);
}
if (autoConnect !== null) {
extension_settings.autoConnect = autoConnect;
localStorage.removeItem(extensions_autoConnectKey);
}
if (extensionsDisabled !== null) {
extension_settings.disabledExtensions = JSON.parse(extensionsDisabled);
localStorage.removeItem(extensions_disabledKey);
}
}
const extension_settings = {
apiUrl: '',
autoConnect: '',
disabledExtensions: [],
memory: {},
note: {
default: '',
},
caption: {},
expressions: {},
dice: {},
};
let modules = []; let modules = [];
let disabledExtensions = getDisabledExtensions();
let activeExtensions = new Set(); let activeExtensions = new Set();
const getContext = () => window['TavernAI'].getContext(); const getContext = () => window['TavernAI'].getContext();
const getApiUrl = () => localStorage.getItem('extensions_url'); const getApiUrl = () => extension_settings.apiUrl;
const defaultUrl = "http://localhost:5100"; const defaultUrl = "http://localhost:5100";
const defaultRequestArgs = { method: 'GET', headers: { 'Bypass-Tunnel-Reminder': 'bypass' } }; const defaultRequestArgs = { method: 'GET', headers: { 'Bypass-Tunnel-Reminder': 'bypass' } };
let connectedToApi = false; let connectedToApi = false;
function getDisabledExtensions() {
const value = localStorage.getItem(extensions_disabledKey);
return value ? JSON.parse(value) : [];
}
function onDisableExtensionClick() { function onDisableExtensionClick() {
const name = $(this).data('name'); const name = $(this).data('name');
disableExtension(name); disableExtension(name);
@ -38,15 +70,15 @@ function onEnableExtensionClick() {
enableExtension(name); enableExtension(name);
} }
function enableExtension(name) { async function enableExtension(name) {
disabledExtensions = disabledExtensions.filter(x => x !== name); extension_settings.disabledExtensions = extension_settings.disabledExtensions.filter(x => x !== name);
localStorage.setItem(extensions_disabledKey, JSON.stringify(disabledExtensions)); await saveSettings();
location.reload(); location.reload();
} }
function disableExtension(name) { async function disableExtension(name) {
disabledExtensions.push(name); extension_settings.disabledExtensions.push(name);
localStorage.setItem(extensions_disabledKey, JSON.stringify(disabledExtensions)); await saveSettings();
location.reload(); location.reload();
} }
@ -77,7 +109,7 @@ async function activateExtensions() {
// all required modules are active (offline extensions require none) // all required modules are active (offline extensions require none)
if (isSubsetOf(modules, manifest.requires)) { if (isSubsetOf(modules, manifest.requires)) {
try { try {
const isDisabled = disabledExtensions.includes(name); const isDisabled = extension_settings.disabledExtensions.includes(name);
const li = document.createElement('li'); const li = document.createElement('li');
if (!isDisabled) { if (!isDisabled) {
@ -104,20 +136,27 @@ async function activateExtensions() {
async function connectClickHandler() { async function connectClickHandler() {
const baseUrl = $("#extensions_url").val(); const baseUrl = $("#extensions_url").val();
localStorage.setItem(extensions_urlKey, baseUrl); extension_settings.apiUrl = baseUrl;
saveSettingsDebounced();
await connectToApi(baseUrl); await connectToApi(baseUrl);
} }
function autoConnectInputHandler() { function autoConnectInputHandler() {
const value = $(this).prop('checked'); const value = $(this).prop('checked');
localStorage.setItem(extensions_autoConnectKey, value.toString()); extension_settings.autoConnect = !!value;
if (value && !connectedToApi) { if (value && !connectedToApi) {
$("#extensions_connect").trigger('click'); $("#extensions_connect").trigger('click');
} }
saveSettingsDebounced();
} }
async function connectToApi(baseUrl) { async function connectToApi(baseUrl) {
if (!baseUrl) {
return;
}
const url = new URL(baseUrl); const url = new URL(baseUrl);
url.pathname = '/api/modules'; url.pathname = '/api/modules';
@ -220,7 +259,7 @@ function showExtensionsDetails() {
} }
} }
} }
else if (disabledExtensions.includes(name)) { else if (extension_settings.disabledExtensions.includes(name)) {
html += `<p class="disabled">Extension is disabled. <a href="javascript:void" data-name=${name} class="enable_extension">Enable</a></p>`; html += `<p class="disabled">Extension is disabled. <a href="javascript:void" data-name=${name} class="enable_extension">Enable</a></p>`;
} }
else { else {
@ -234,17 +273,24 @@ function showExtensionsDetails() {
callPopup(`<div class="extensions_info">${html}</div>`, 'text'); callPopup(`<div class="extensions_info">${html}</div>`, 'text');
} }
$(document).ready(async function () { function loadExtensionSettings(settings) {
const url = localStorage.getItem(extensions_urlKey) ?? defaultUrl; migrateFromLocalStorage();
const autoConnect = localStorage.getItem(extensions_autoConnectKey) == 'true';
$("#extensions_url").val(url); if (settings.extension_settings) {
$("#extensions_connect").on('click', connectClickHandler); Object.assign(extension_settings, settings.extension_settings);
$("#extensions_autoconnect").on('input', autoConnectInputHandler); }
$("#extensions_autoconnect").prop('checked', autoConnect).trigger('input');
$("#extensions_details").on('click', showExtensionsDetails); $("#extensions_url").val(extension_settings.apiUrl);
$(document).on('click', '.disable_extension', onDisableExtensionClick); $("#extensions_autoconnect").prop('checked', extension_settings.autoConnect).trigger('input');
$(document).on('click', '.enable_extension', onEnableExtensionClick);
// Activate offline extensions // Activate offline extensions
activateExtensions(); activateExtensions();
}
$(document).ready(async function () {
$("#extensions_connect").on('click', connectClickHandler);
$("#extensions_autoconnect").on('input', autoConnectInputHandler);
$("#extensions_details").on('click', showExtensionsDetails);
$(document).on('click', '.disable_extension', onDisableExtensionClick);
$(document).on('click', '.enable_extension', onEnableExtensionClick);
}); });

View File

@ -1,46 +1,57 @@
import { getContext } from "../../extensions.js"; import { chat_metadata, saveSettingsDebounced } from "../../../script.js";
import { extension_settings, getContext } from "../../extensions.js";
import { debounce } from "../../utils.js";
export { MODULE_NAME }; export { MODULE_NAME };
const saveChatDebounced = debounce(async () => await getContext().saveChat(), 1000);
const MODULE_NAME = '2_floating_prompt'; // <= Deliberate, for sorting lower than memory const MODULE_NAME = '2_floating_prompt'; // <= Deliberate, for sorting lower than memory
const UPDATE_INTERVAL = 1000; const UPDATE_INTERVAL = 1000;
let lastMessageNumber = null; const DEFAULT_DEPTH = 4;
let promptInsertionInterval = 1; const DEFAULT_POSITION = 1;
let promptInsertionPosition = 1; const DEFAULT_INTERVAL = 1;
let promptInsertionDepth = 0;
let defaultNote = '';
function onExtensionFloatingPromptInput() { const metadata_keys = {
saveSettings(); prompt: 'note_prompt',
interval: 'note_interval',
depth: 'note_depth',
position: 'note_position',
} }
function onExtensionFloatingIntervalInput() { async function onExtensionFloatingPromptInput() {
promptInsertionInterval = Number($(this).val()); chat_metadata[metadata_keys.prompt] = $(this).val();
saveSettings(); saveChatDebounced();
} }
function onExtensionFloatingDepthInput() { async function onExtensionFloatingIntervalInput() {
chat_metadata[metadata_keys.interval] = Number($(this).val());
saveChatDebounced();
}
async function onExtensionFloatingDepthInput() {
let value = Number($(this).val()); let value = Number($(this).val());
if (promptInsertionDepth < 0) { if (value < 0) {
value = Math.abs(value); value = Math.abs(value);
$(this).val(value); $(this).val(value);
} }
promptInsertionDepth = value; chat_metadata[metadata_keys.depth] = value;
saveSettings(); saveChatDebounced();
} }
function onExtensionFloatingPositionInput(e) { async function onExtensionFloatingPositionInput(e) {
promptInsertionPosition = e.target.value; chat_metadata[metadata_keys.position] = e.target.value;
saveSettings(); saveChatDebounced();
} }
function onExtensionFloatingDefaultInput() { function onExtensionFloatingDefaultInput() {
defaultNote = $(this).val(); extension_settings.note.default = $(this).val();
saveSettings(); saveSettingsDebounced();
} }
// TODO Remove in next release
function getLocalStorageKeys() { function getLocalStorageKeys() {
const context = getContext(); const context = getContext();
@ -65,27 +76,60 @@ function getLocalStorageKeys() {
}; };
} }
function loadSettings() { function migrateFromLocalStorage() {
const keys = getLocalStorageKeys(); const keys = getLocalStorageKeys();
defaultNote = localStorage.getItem(keys.default) ?? ''; const defaultNote = localStorage.getItem(keys.default);
const prompt = localStorage.getItem(keys.prompt) ?? defaultNote ?? ''; const prompt = localStorage.getItem(keys.prompt);
const interval = localStorage.getItem(keys.interval) ?? 1; const interval = localStorage.getItem(keys.interval);
const position = localStorage.getItem(keys.position) ?? 1; const position = localStorage.getItem(keys.position);
const depth = localStorage.getItem(keys.depth) ?? 0; const depth = localStorage.getItem(keys.depth);
$('#extension_floating_prompt').val(prompt).trigger('input');
$('#extension_floating_interval').val(interval).trigger('input'); if (defaultNote !== null) {
$('#extension_floating_depth').val(depth).trigger('input'); if (typeof extension_settings.note !== 'object') {
$(`input[name="extension_floating_position"][value="${position}"]`).prop('checked', true).trigger('change'); extension_settings.note = {};
$('#extension_floating_default').val(defaultNote); }
extension_settings.note.default = defaultNote;
saveSettingsDebounced();
localStorage.removeItem(keys.default);
}
if (chat_metadata) {
if (interval !== null) {
chat_metadata[metadata_keys.interval] = interval;
localStorage.removeItem(keys.interval);
}
if (depth !== null) {
chat_metadata[metadata_keys.depth] = depth;
localStorage.removeItem(keys.depth);
}
if (position !== null) {
chat_metadata[metadata_keys.position] = position;
localStorage.removeItem(keys.position);
}
if (prompt !== null) {
chat_metadata[metadata_keys.prompt] = prompt;
localStorage.removeItem(keys.prompt);
saveChatDebounced();
}
}
} }
function saveSettings() {
const keys = getLocalStorageKeys(); function loadSettings() {
localStorage.setItem(keys.prompt, $('#extension_floating_prompt').val()); migrateFromLocalStorage();
localStorage.setItem(keys.interval, $('#extension_floating_interval').val()); chat_metadata[metadata_keys.prompt] = chat_metadata[metadata_keys.prompt] ?? extension_settings.note.default ?? '';
localStorage.setItem(keys.depth, $('#extension_floating_depth').val()); chat_metadata[metadata_keys.interval] = chat_metadata[metadata_keys.interval] ?? DEFAULT_INTERVAL;
localStorage.setItem(keys.position, $('input:radio[name="extension_floating_position"]:checked').val()); chat_metadata[metadata_keys.position] = chat_metadata[metadata_keys.position] ?? DEFAULT_POSITION;
localStorage.setItem(keys.default, defaultNote); chat_metadata[metadata_keys.depth] = chat_metadata[metadata_keys.depth] ?? DEFAULT_DEPTH;
$('#extension_floating_prompt').val(chat_metadata[metadata_keys.prompt]);
$('#extension_floating_interval').val(chat_metadata[metadata_keys.interval]);
$('#extension_floating_depth').val(chat_metadata[metadata_keys.depth]);
$(`input[name="extension_floating_position"][value="${chat_metadata[metadata_keys.position]}"]`).prop('checked', true);
$('#extension_floating_default').val(extension_settings.note.default);
} }
async function moduleWorker() { async function moduleWorker() {
@ -98,24 +142,24 @@ async function moduleWorker() {
loadSettings(); loadSettings();
// take the count of messages // take the count of messages
lastMessageNumber = Array.isArray(context.chat) && context.chat.length ? context.chat.filter(m => m.is_user).length : 0; let lastMessageNumber = Array.isArray(context.chat) && context.chat.length ? context.chat.filter(m => m.is_user).length : 0;
// special case for new chat // special case for new chat
if (Array.isArray(context.chat) && context.chat.length === 1) { if (Array.isArray(context.chat) && context.chat.length === 1) {
lastMessageNumber = 1; lastMessageNumber = 1;
} }
if (lastMessageNumber <= 0 || promptInsertionInterval <= 0) { if (lastMessageNumber <= 0 || chat_metadata[metadata_keys.interval] <= 0) {
$('#extension_floating_counter').text('No'); $('#extension_floating_counter').text('No');
return; return;
} }
const messagesTillInsertion = lastMessageNumber >= promptInsertionInterval const messagesTillInsertion = lastMessageNumber >= chat_metadata[metadata_keys.interval]
? (lastMessageNumber % promptInsertionInterval) ? (lastMessageNumber % chat_metadata[metadata_keys.interval])
: (promptInsertionInterval - lastMessageNumber); : (chat_metadata[metadata_keys.interval] - lastMessageNumber);
const shouldAddPrompt = messagesTillInsertion == 0; const shouldAddPrompt = messagesTillInsertion == 0;
const prompt = shouldAddPrompt ? $('#extension_floating_prompt').val() : ''; const prompt = shouldAddPrompt ? $('#extension_floating_prompt').val() : '';
context.setExtensionPrompt(MODULE_NAME, prompt, promptInsertionPosition, promptInsertionDepth); context.setExtensionPrompt(MODULE_NAME, prompt, chat_metadata[metadata_keys.position], chat_metadata[metadata_keys.depth]);
$('#extension_floating_counter').text(shouldAddPrompt ? 'This' : messagesTillInsertion); $('#extension_floating_counter').text(shouldAddPrompt ? 'This' : messagesTillInsertion);
} }