diff --git a/public/index.html b/public/index.html
index d6a724ebd..e1995d1fa 100644
--- a/public/index.html
+++ b/public/index.html
@@ -18,6 +18,7 @@
+
@@ -818,16 +819,6 @@
-
-
-
diff --git a/public/script.js b/public/script.js
index 8b9a489ab..2eb256640 100644
--- a/public/script.js
+++ b/public/script.js
@@ -1,8 +1,27 @@
+import { humanizedDateTime } from "./scripts/RossAscends-mods.js";
+
+//RossAscends: exporting functions and vars for RA mods.
+export {
+ Generate,
+ getSettings,
+ saveSettings,
+ printMessages,
+ clearChat,
+ getChat,
+ this_chid,
+ settings,
+ characters,
+ online_status,
+ main_api,
+ api_server,
+ api_key_novel,
+ getCharacters,
+ is_send_press
+}
+
// API OBJECT FOR EXTERNAL WIRING
window['TavernAI'] = {};
-import { encode, decode } from "../scripts/gpt-2-3-tokenizer/mod.js";
-$(document).ready(function () {
const VERSION = '1.2.8';
var converter = new showdown.Converter({ emoji: 'true' });
var bg_menu_toggle = false;
@@ -16,26 +35,6 @@ $(document).ready(function () {
var safetychat = [{ name: 'Chloe', is_user: false, is_name: true, create_date: 0, mes: '\n*You deleted a character/chat and arrived back here for safety reasons! Pick another character!*\n\n' }];
var chat_create_date = 0;
- //RossAscends: Added function to format dates used in files and chat timestamps to a humanized format.
- //Mostly I wanted this to be for file names, but couldn't figure out exactly where the filename save code was as everything seemed to be connected.
- //During testing, this performs the same as previous date.now() structure.
- //It also does not break old characters/chats, as the code just uses whatever timestamp exists in the chat.
- //New chats made with characters will use this new formatting.
- //Useable variable is (( humanizedISO8601Datetime ))
-
- function humanizedISO8601DateTime() {
- let baseDate = new Date(Date.now());
- let humanYear = baseDate.getFullYear();
- let humanMonth = (baseDate.getMonth() + 1);
- let humanDate = baseDate.getDate();
- let humanHour = (baseDate.getHours() < 10 ? '0' : '') + baseDate.getHours();
- let humanMinute = (baseDate.getMinutes() < 10 ? '0' : '') + baseDate.getMinutes();
- let humanSecond = (baseDate.getSeconds() < 10 ? '0' : '') + baseDate.getSeconds();
- let humanMillisecond = (baseDate.getMilliseconds() < 10 ? '0' : '') + baseDate.getMilliseconds();
- let HumanizedDateTime = (humanYear + "-" + humanMonth + "-" + humanDate + " @" + humanHour + "h " + humanMinute + "m " + humanSecond + "s " + humanMillisecond + "ms");
- return HumanizedDateTime;
- };
-
let prev_selected_char = null;
var default_ch_mes = "Hello";
var count_view_mes = 0;
@@ -216,57 +215,2665 @@ $(document).ready(function () {
var colab_ini_step = 1;
- setInterval(function () {
- switch (colab_ini_step) {
- case 0:
- $('#colab_popup_text').html('
Initialization ');
- colab_ini_step = 1;
- break
- case 1:
- $('#colab_popup_text').html('
Initialization. ');
- colab_ini_step = 2;
- break
- case 2:
- $('#colab_popup_text').html('
Initialization.. ');
- colab_ini_step = 3;
- break
- case 3:
- $('#colab_popup_text').html('
Initialization... ');
- colab_ini_step = 0;
- break
- }
- }, 500);
- /////////////
+
var token;
- $.ajaxPrefilter((options, originalOptions, xhr) => {
- xhr.setRequestHeader("X-CSRF-Token", token);
- });
- $.get("/csrf-token")
- .then(data => {
- token = data.token;
- getCharacters();
- getSettings("def");
- getLastVersion();
- //getCharacters();
+ setInterval(function () {
+ switch (colab_ini_step) {
+ case 0:
+ $('#colab_popup_text').html('
Initialization ');
+ colab_ini_step = 1;
+ break
+ case 1:
+ $('#colab_popup_text').html('
Initialization. ');
+ colab_ini_step = 2;
+ break
+ case 2:
+ $('#colab_popup_text').html('
Initialization.. ');
+ colab_ini_step = 3;
+ break
+ case 3:
+ $('#colab_popup_text').html('
Initialization... ');
+ colab_ini_step = 0;
+ break
+ }
+ }, 500);
+ /////////////
+
+ $.ajaxPrefilter((options, originalOptions, xhr) => {
+ xhr.setRequestHeader("X-CSRF-Token", token);
+ });
+
+
+ $.get("/csrf-token")
+ .then(data => {
+ token = data.token;
+ getCharacters();
+ getSettings("def");
+ getLastVersion();
+ //getCharacters();
+ printMessages();
+ getBackgrounds();
+ getUserAvatars();
+ });
+
+ function flushSettings() {
+ $('#settings_perset').empty();
+ $('#settings_perset_novel').empty();
+ $('#world_info').empty();
+ $('#settings_perset').append('
GUI KoboldAI Settings ');
+ $('#world_info').append('
None ');
+ }
+ function checkOnlineStatus() {
+ //console.log(online_status);
+ if (online_status == 'no_connection') {
+ $("#send_textarea").attr('placeholder', "Not connected to API!"); //Input bar placeholder tells users they are not connected
+ $("#send_form").css("background-color", "rgba(100,0,0,0.7)"); //entire input form area is red when not connected
+ $("#send_but").css("display", "none"); //send button is hidden when not connected
+
+ $("#online_status_indicator2").css("background-color", "red");
+ $("#online_status_text2").html("No connection...");
+ $("#online_status_indicator3").css("background-color", "red");
+ $("#online_status_text3").html("No connection...");
+ is_get_status = false;
+ is_get_status_novel = false;
+ } else {
+ $("#send_textarea").attr('placeholder', 'Type a message...'); //on connect, placeholder tells user to type message
+ $("#send_form").css("background-color", "rgba(0,0,0,0.7)"); //on connect, form BG changes to transprent black
+ $("#send_but").css("display", "inline"); //on connect, send button shows up
+
+ $("#online_status_indicator2").css("background-color", "green");
+ $("#online_status_text2").html(online_status);
+ $("#online_status_indicator3").css("background-color", "green");
+ $("#online_status_text3").html(online_status);
+ $("#online_status_indicator4").css("background-color", "green");
+ $("#online_status_text4").html(online_status);
+ }
+ }
+ async function getLastVersion() {
+
+ jQuery.ajax({
+ type: 'POST', //
+ url: '/getlastversion', //
+ data: JSON.stringify({
+ '': ''
+ }),
+ beforeSend: function () {
+
+
+ },
+ cache: false,
+ dataType: "json",
+ contentType: "application/json",
+ //processData: false,
+ success: function (data) {
+ var getVersion = data.version;
+ if (getVersion !== 'error' && getVersion != undefined) {
+ if (compareVersions(getVersion, VERSION) === 1) {
+ $('#verson').append('
(v.' + getVersion + ') ');
+ }
+ }
+
+ },
+ error: function (jqXHR, exception) {
+ console.log(exception);
+ console.log(jqXHR);
+
+ }
+ });
+
+ }
+ async function getStatus() {
+ if (is_get_status) {
+ jQuery.ajax({
+ type: 'POST', //
+ url: '/getstatus', //
+ data: JSON.stringify({
+ api_server: (main_api == "kobold" ? api_server : api_server_textgenerationwebui),
+ main_api: main_api,
+ }),
+ beforeSend: function () {
+ if (is_api_button_press) {
+ //$("#api_loading").css("display", 'inline-block');
+ //$("#api_button").css("display", 'none');
+ }
+ //$('#create_button').attr('value','Creating...'); //
+
+ },
+ cache: false,
+ dataType: "json",
+ crossDomain: true,
+ contentType: "application/json",
+ //processData: false,
+ success: function (data) {
+ online_status = data.result;
+ if (online_status == undefined) {
+ online_status = 'no_connection';
+ }
+ if (online_status.toLowerCase().indexOf('pygmalion') != -1) {
+ is_pygmalion = true;
+ online_status += " (Pyg. formatting on)";
+ } else {
+ is_pygmalion = false;
+ }
+
+ //console.log(online_status);
+ resultCheckStatus();
+ if (online_status !== 'no_connection') {
+ var checkStatusNow = setTimeout(getStatus, 3000);//getStatus();
+ }
+ },
+ error: function (jqXHR, exception) {
+ console.log(exception);
+ console.log(jqXHR);
+ online_status = 'no_connection';
+
+ resultCheckStatus();
+ }
+ });
+ } else {
+ if (is_get_status_novel != true) {
+ online_status = 'no_connection';
+ }
+ }
+ }
+ function resultCheckStatus() {
+ is_api_button_press = false;
+ checkOnlineStatus();
+ $("#api_loading").css("display", 'none');
+ $("#api_button").css("display", 'inline-block');
+ $("#api_loading_textgenerationwebui").css("display", 'none');
+ $("#api_button_textgenerationwebui").css("display", 'inline-block');
+ }
+
+ async function getSoftPromptsList() {
+ if (!api_server) {
+ return;
+ }
+
+ const response = await fetch('/getsoftprompts', {
+ method: 'POST',
+ headers: {
+ "Content-Type": "application/json",
+ "X-CSRF-Token": token,
+ },
+ body: JSON.stringify({ api_server: api_server }),
+ });
+
+ if (response.ok) {
+ const data = await response.json();
+ updateSoftPromptsList(data.soft_prompts);
+ }
+ }
+
+ function clearSoftPromptsList() {
+ $('#softprompt option[value!=""]').each(function () {
+ $(this).remove();
+ });
+ }
+
+ function updateSoftPromptsList(soft_prompts) {
+ // Delete SPs removed from Kobold
+ $('#softprompt option').each(function () {
+ const value = $(this).attr('value');
+
+ if (value == '') {
+ return;
+ }
+
+ const prompt = soft_prompts.find(x => x.name === value);
+ if (!prompt) {
+ $(this).remove();
+ }
+ });
+
+ // Add SPs added to Kobold
+ soft_prompts.forEach((prompt) => {
+ if ($(`#softprompt option[value="${prompt.name}"]`).length === 0) {
+ $('#softprompt').append(`
${prompt.name} `);
+
+ if (prompt.selected) {
+ $('#softprompt').val(prompt.name);
+ }
+ }
+ });
+
+ // No SP selected or no SPs
+ if (soft_prompts.length === 0 || !(soft_prompts.some(x => x.selected))) {
+ $('#softprompt').val('');
+ }
+ }
+
+ function printCharacters() {
+ //console.log('printCharacters() entered');
+
+ $("#rm_print_characters_block").empty();
+ //console.log('printCharacters() -- sees '+characters.length+' characters.');
+ characters.forEach(function (item, i, arr) {
+
+ var this_avatar = default_avatar;
+ if (item.avatar != 'none') {
+ this_avatar = "characters/" + item.avatar + "?" + Date.now();
+
+ } //RossAscends: changed 'prepend' to 'append' to make alphabetical sorting display correctly.
+ $("#rm_print_characters_block").append('
');
+ //console.log('printcharacters() -- printing -- ChID '+i+' ('+item.name+')');
+ });
+ printGroups();
+
+ }
+
+ function printGroups() {
+ for (let group of groups) {
+ const template = $('#group_list_template .group_select').clone();
+ template.data('id', group.id);
+ template.find('.ch_name').html(group.name);
+ $('#rm_print_characters_block').prepend(template);
+ updateGroupAvatar(group);
+ }
+ }
+
+ function updateGroupAvatar(group) {
+ $('#rm_print_characters_block .group_select').each(function () {
+ if ($(this).data('id') == group.id) {
+ const avatar = getGroupAvatar(group);
+ if (avatar) {
+ $(this).find('.avatar').replaceWith(avatar);
+ }
+ }
+ })
+ }
+
+ function getGroupAvatar(group) {
+ const memberAvatars = [];
+ if (group && Array.isArray(group.members) && group.members.length) {
+ for (const member of group.members) {
+ const charIndex = characters.findIndex(x => x.name === member);
+ if (charIndex !== -1 && characters[charIndex].avatar !== 'none') {
+ const this_avatar = `characters/${characters[charIndex].avatar}#${Date.now()}`;
+ memberAvatars.push(this_avatar);
+ }
+ if (memberAvatars.length === 4) {
+ break;
+ }
+ }
+ }
+
+ // Cohee: there's probably a smarter way to do this..
+ if (memberAvatars.length === 1) {
+ const groupAvatar = $('#group_avatars_template .collage_1').clone();
+ groupAvatar.find('.img_1').attr('src', memberAvatars[0]);
+ return groupAvatar;
+ }
+
+ if (memberAvatars.length === 2) {
+ const groupAvatar = $('#group_avatars_template .collage_2').clone();
+ groupAvatar.find('.img_1').attr('src', memberAvatars[0]);
+ groupAvatar.find('.img_2').attr('src', memberAvatars[1]);
+ return groupAvatar;
+ }
+
+ if (memberAvatars.length === 3) {
+ const groupAvatar = $('#group_avatars_template .collage_3').clone();
+ groupAvatar.find('.img_1').attr('src', memberAvatars[0]);
+ groupAvatar.find('.img_2').attr('src', memberAvatars[1]);
+ groupAvatar.find('.img_3').attr('src', memberAvatars[2]);
+ return groupAvatar;
+ }
+
+ if (memberAvatars.length === 4) {
+ const groupAvatar = $('#group_avatars_template .collage_4').clone();
+ groupAvatar.find('.img_1').attr('src', memberAvatars[0]);
+ groupAvatar.find('.img_2').attr('src', memberAvatars[1]);
+ groupAvatar.find('.img_3').attr('src', memberAvatars[2]);
+ groupAvatar.find('.img_4').attr('src', memberAvatars[3]);
+ return groupAvatar;
+ }
+
+ // default avatar
+ const groupAvatar = $('#group_avatars_template .collage_1').clone();
+ groupAvatar.find('.img_1').attr('src', group.avatar_url);
+ return groupAvatar;
+ }
+
+ async function getCharacters() {
+ await getGroups();
+
+ //console.log('getCharacters() -- entered');
+ //console.log(characters);
+ var response = await fetch("/getcharacters", { //RossAscends: changed from const
+ method: "POST",
+ headers: {
+ "Content-Type": "application/json",
+ "X-CSRF-Token": token
+ },
+ body: JSON.stringify({
+ "": ""
+ })
+ });
+ if (response.ok === true) {
+
+ var getData = ''; //RossAscends: reset to force array to update to account for deleted character.
+ var getData = await response.json(); //RossAscends: changed from const
+ //console.log(getData);
+
+ //var aa = JSON.parse(getData[0]);
+
+ var load_ch_count = Object.getOwnPropertyNames(getData); //RossAscends: change from const to create dynamic character load amounts.
+ var charCount = load_ch_count.length;
+ //console.log('/getcharacters -- expecting to load '+charCount+' characters.')
+ for (var i = 0; i < load_ch_count.length; i++) {
+ characters[i] = [];
+ characters[i] = getData[i];
+ //console.log('/getcharacters -- loaded character #'+(i+1)+' ('+characters[i].name+')');
+ }
+ //RossAscends: updated character sorting to be alphabetical
+ characters.sort(function (a, b) {
+ //console.log('sorting characters: '+a.name+' vs '+b.name);
+ if (a.name < b.name) {
+ return -1
+ }
+ if (a.name > b.name) {
+ return 1;
+ }
+ return 0;
+
+ });
+ //console.log(characters);
+
+ //characters.reverse();
+ //console.log('/getcharacters -- this_chid -- '+this_chid);
+ if (this_chid != undefined && this_chid != 'invalid-safety-id') {
+ $("#avatar_url_pole").val(characters[this_chid].avatar);
+ }
+
+
+ //console.log('/getcharacters -- sending '+i+' characters to /printcharacters');
+ printCharacters();
+ //console.log(propOwn.length);
+ //return JSON.parse(getData[0]);
+ //const getData = await response.json();
+ //var getMessage = getData.results[0].text;
+ }
+ }
+ async function getBackgrounds() {
+
+ const response = await fetch("/getbackgrounds", {
+ method: "POST",
+ headers: {
+ "Content-Type": "application/json",
+ "X-CSRF-Token": token
+ },
+ body: JSON.stringify({
+ "": ""
+ })
+
+ });
+ if (response.ok === true) {
+ const getData = await response.json();
+ //background = getData;
+ //console.log(getData.length);
+ for (var i = 0; i < getData.length; i++) {
+ //console.log(1);
+ $("#bg_menu_content").append("
");
+ }
+ //var aa = JSON.parse(getData[0]);
+ //const load_ch_coint = Object.getOwnPropertyNames(getData);
+
+
+ }
+ }
+ async function isColab() {
+ is_checked_colab = true;
+ const response = await fetch("/iscolab", {
+ method: "POST",
+ headers: {
+ "Content-Type": "application/json",
+ "X-CSRF-Token": token
+ },
+ body: JSON.stringify({
+ "": ""
+ })
+
+ });
+ if (response.ok === true) {
+ const getData = await response.json();
+ if (getData.colaburl != false) {
+ $('#colab_shadow_popup').css('display', 'none');
+ is_colab = true;
+ let url = String(getData.colaburl).split("flare.com")[0] + "flare.com";
+ url = String(url).split("loca.lt")[0] + "loca.lt";
+ $('#api_url_text').val(url);
+ setTimeout(function () {
+ $('#api_button').click();
+ }, 2000);
+ }
+
+
+ }
+ }
+ async function setBackground(bg) {
+ /*
+ const response = await fetch("/setbackground", {
+ method: "POST",
+ headers: { "Content-Type": "application/json" },
+ body: JSON.stringify({
+ "bg": bg
+ })
+
+ });
+ if (response.ok === true) {
+ //const getData = await response.json();
+ //background = getData;
+
+ //var aa = JSON.parse(getData[0]);
+ //const load_ch_coint = Object.getOwnPropertyNames(getData);
+ }*/
+ //console.log(bg);
+ jQuery.ajax({
+ type: 'POST', //
+ url: '/setbackground', //
+ data: JSON.stringify({
+ bg: bg
+ }),
+ beforeSend: function () {
+ //$('#create_button').attr('value','Creating...'); //
+ },
+ cache: false,
+ dataType: "json",
+ contentType: "application/json",
+ //processData: false,
+ success: function (html) {
+ //setBackground(html);
+ //$('body').css('background-image', 'linear-gradient(rgba(19,21,44,0.75), rgba(19,21,44,0.75)), url('+e.target.result+')');
+ //$("#form_bg_download").after("
");
+ },
+ error: function (jqXHR, exception) {
+ console.log(exception);
+ console.log(jqXHR);
+ }
+ });
+ }
+ async function delBackground(bg) {
+ const response = await fetch("/delbackground", {
+ method: "POST",
+ headers: {
+ "Content-Type": "application/json",
+ "X-CSRF-Token": token
+ },
+ body: JSON.stringify({
+ "bg": bg
+ })
+
+ });
+ if (response.ok === true) {
+ //const getData = await response.json();
+ //background = getData;
+
+ //var aa = JSON.parse(getData[0]);
+ //const load_ch_coint = Object.getOwnPropertyNames(getData);
+
+
+ }
+ }
+ function printMessages() {
+ //console.log(chat);
+ //console.log('printMessages() -- printing messages for -- '+this_chid+' '+active_character+' '+characters[this_chid]);
+ chat.forEach(function (item, i, arr) {
+ addOneMessage(item);
+ });
+ }
+ function clearChat() {
+ count_view_mes = 0;
+ extension_prompts = {};
+ $('#chat').html('');
+ }
+ function messageFormating(mes, ch_name, isSystem, forceAvatar) {
+ if (this_chid != undefined && !isSystem) mes = mes.replaceAll("<", "<").replaceAll(">", ">");//for Chloe
+ if (this_chid === undefined) {
+ mes = mes.replace(/\*\*(.+?)\*\*/g, '
$1 ').replace(/\*(.+?)\*/g, '
$1 ').replace(/\n/g, '
');
+
+ } else if (!isSystem) {
+ mes = converter.makeHtml(mes);
+ mes = mes.replace(/{([^}]+)}/g, '');
+ mes = mes.replace(/\n/g, '
');
+ mes = mes.trim();
+ }
+
+ if (forceAvatar) {
+ mes = mes.replaceAll(ch_name + ":", "");
+ }
+
+ if (ch_name !== name1) {
+ mes = mes.replaceAll(name2 + ":", "");
+ }
+ return mes;
+ }
+ function appendImageToMessage(mes, messageElement) {
+ if (mes.extra?.image) {
+ const image = document.createElement('img');
+ image.src = mes.extra?.image;
+ image.classList.add('img_extra');
+ messageElement.find('.mes_text').prepend(image);
+ }
+ }
+ function addOneMessage(mes) {
+ //var message = mes['mes'];
+ //message = mes['mes'].replace(/^\s+/g, '');
+ //console.log(message.indexOf(name1+":"));
+ var messageText = mes['mes'];
+ var characterName = name1;
+ var avatarImg = "User Avatars/" + user_avatar;
+ const isSystem = mes.is_system;
+ generatedPromtCache = '';
+ //thisText = thisText.split("\n").join("
");
+ var avatarImg = "User Avatars/" + user_avatar;
+ if (!mes['is_user']) {
+ if (mes.force_avatar) {
+ avatarImg = mes.force_avatar;
+ }
+ else if (this_chid == undefined || this_chid == "invalid-safety-id") {
+ avatarImg = "img/chloe.png";
+ }
+ else {
+ if (characters[this_chid].avatar != 'none') {
+ avatarImg = "characters/" + characters[this_chid].avatar;
+ if (is_mes_reload_avatar !== false) {
+ avatarImg += "?" + is_mes_reload_avatar;
+ //console.log(avatarImg);
+ }
+ } else {
+ avatarImg = "img/fluffy.png";
+ }
+ }
+
+ characterName = mes.is_system || mes.force_avatar ? mes.name : name2;
+ }
+
+ //Formating
+ //messageText = messageText.replace(/\*\*(.+?)\*\*/g, '
$1 ').replace(/\*(.+?)\*/g, '
$1 ').replace(/\n/g, '
');
+ //if(characterName != name1){
+ //messageText = messageText.replaceAll(name2+":", "");
+ //}
+ //console.log(messageText);
+ if (count_view_mes == 0) {
+ messageText = messageText.replace(/{{user}}/gi, name1);
+ messageText = messageText.replace(/{{char}}/gi, name2);
+ messageText = messageText.replace(/
/gi, name1);
+ messageText = messageText.replace(//gi, name2);
+ }
+ messageText = messageFormating(messageText, characterName, isSystem, mes.force_avatar);
+ const bias = messageFormating(mes.extra?.bias ?? '');
+
+ $("#chat").append("`);
+
+ const newMessage = $(`#chat [mesid="${count_view_mes}"]`);
+ newMessage.data('isSystem', isSystem);
+
+ appendImageToMessage(mes, newMessage);
+
+ if (isSystem) {
+ newMessage.find('.mes_edit').hide();
+ }
+
+ if (!if_typing_text) {
+ //console.log(messageText);
+ $("#chat").children().filter('[mesid="' + count_view_mes + '"]').children('.mes_block').children('.mes_text').append(messageText);
+ } else {
+ typeWriter($("#chat").children().filter('[mesid="' + count_view_mes + '"]').children('.mes_block').children('.mes_text'), messageText, 50, 0);
+ }
+ count_view_mes++;
+ if (!add_mes_without_animation) {
+ $('#chat').children().last().css("opacity", 1.0);
+ $('#chat').children().last().transition({
+ opacity: 1.0,
+ duration: 700,
+ easing: "",
+ complete: function () { }
+ });
+ } else {
+ add_mes_without_animation = false;
+ }
+ var $textchat = $('#chat');
+ $textchat.scrollTop($textchat[0].scrollHeight);
+ }
+ function typeWriter(target, text, speed, i) {
+ if (i < text.length) {
+ //target.append(text.charAt(i));
+ target.html(target.html() + text.charAt(i));
+ i++;
+ setTimeout(() => typeWriter(target, text, speed, i), speed);
+ }
+ }
+ function newMesPattern(name) { //Patern which denotes a new message
+ name = name + ':';
+ return name;
+ }
+
+ function substituteParams(content) {
+ content = content.replace(/{{user}}/gi, name1);
+ content = content.replace(/{{char}}/gi, name2);
+ content = content.replace(//gi, name1);
+ content = content.replace(//gi, name2);
+ return content;
+ }
+
+ function checkWorldInfo(chat) {
+ if (world_info_data.entries.length == 0) {
+ return '';
+ }
+
+ const messagesToLookBack = world_info_depth * 2;
+ let textToScan = chat.slice(0, messagesToLookBack).join('').toLowerCase();
+ let worldInfoBefore = '';
+ let worldInfoAfter = '';
+ let needsToScan = true;
+ let allActivatedEntries = new Set();
+
+ const sortedEntries = Object.keys(world_info_data.entries).map(x => world_info_data.entries[x]).sort((a, b) => b.order - a.order);
+ while (needsToScan) {
+ let activatedNow = new Set();
+
+ for (let entry of sortedEntries) {
+ if (allActivatedEntries.has(entry.uid)) {
+ continue;
+ }
+
+ if (entry.constant) {
+ activatedNow.add(entry.uid);
+ }
+
+ if (Array.isArray(entry.key) && entry.key.length) {
+ primary: for (let key of entry.key) {
+ if (key && textToScan.includes(key.trim().toLowerCase())) {
+ if (entry.selective && Array.isArray(entry.keysecondary) && entry.keysecondary.length) {
+ secondary: for (let keysecondary of entry.keysecondary) {
+ if (keysecondary && textToScan.includes(keysecondary.trim().toLowerCase())) {
+ activatedNow.add(entry.uid);
+ break secondary;
+ }
+ }
+ } else {
+ activatedNow.add(entry.uid);
+ break primary;
+ }
+ }
+ }
+ }
+ }
+
+ needsToScan = activatedNow.size > 0;
+ const newEntries = [...activatedNow]
+ .map(x => world_info_data.entries[x])
+ .sort((a, b) => sortedEntries.indexOf(a) - sortedEntries.indexOf(b));
+
+ for (const entry of newEntries) {
+ if (entry.position === world_info_position.after) {
+ worldInfoAfter = `${substituteParams(entry.content)}\n${worldInfoAfter}`;
+ }
+ else {
+ worldInfoBefore = `${substituteParams(entry.content)}\n${worldInfoBefore}`;
+ }
+
+ if (encode(worldInfoBefore + worldInfoAfter).length >= world_info_budget) {
+ needsToScan = false;
+ break;
+ }
+ }
+
+ if (needsToScan) {
+ textToScan = newEntries.map(x => x.content).join('\n').toLowerCase() + textToScan;
+ }
+
+ allActivatedEntries = new Set([...allActivatedEntries, ...activatedNow]);
+ }
+
+ return { worldInfoBefore, worldInfoAfter };
+ }
+
+ function isHelpRequest(message) {
+ const helpTokens = ['/?', '/help'];
+ return helpTokens.includes(message.trim().toLowerCase());
+ }
+
+ function sendSystemMessage(type, text) {
+ const systemMessage = system_messages[type];
+
+ if (!systemMessage) {
+ return;
+ }
+
+ const newMessage = { ...systemMessage, 'send_date': humanizedDateTime() };
+
+ if (text) {
+ newMessage.mes = text;
+ }
+
+ chat.push(newMessage);
+ addOneMessage(newMessage);
+ is_send_press = false;
+ }
+
+ function extractMessageBias(message) {
+ if (!message) {
+ return null;
+ }
+
+ const found = [];
+ const rxp = /{([^}]+)}/g;
+ let curMatch;
+
+ while (curMatch = rxp.exec(message)) {
+ found.push(curMatch[1].trim());
+ }
+
+ if (!found.length) {
+ return '';
+ }
+
+ return ` ${found.join(' ')} `;
+ }
+ async function Generate(type, automatic_trigger) {//encode("dsfs").length
+ tokens_already_generated = 0;
+ message_already_generated = name2 + ': ';
+
+ if (isHelpRequest($("#send_textarea").val())) {
+ sendSystemMessage(system_message_types.HELP);
+ $("#send_textarea").val('').trigger('input');
+ return;
+ }
+
+ if (selected_group && !is_group_generating) {
+ generateGroupWrapper(false);
+ return;
+ }
+
+ if (online_status != 'no_connection' && this_chid != undefined && this_chid !== 'invalid-safety-id') {
+ if (type !== 'regenerate') {
+ is_send_press = true;
+ var textareaText = $("#send_textarea").val();
+ //console.log('Not a Regenerate call, so posting normall with input of: ' +textareaText);
+ $("#send_textarea").val('').trigger('input');
+
+ } else {
+ //console.log('Regenerate call detected')
+ var textareaText = "";
+ if (chat[chat.length - 1]['is_user']) {//If last message from You
+
+ } else {
+ //console.log('about to remove last msg')
+ chat.length = chat.length - 1;
+ count_view_mes -= 1;
+ //console.log('removing last msg')
+ $('#chat').children().last().remove();
+ }
+ }
+
+ $("#send_but").css("display", "none");
+ $("#loading_mes").css("display", "inline-block");
+
+ let promptBias = null;
+ let messageBias = extractMessageBias(textareaText);
+
+ // gets bias of the latest message where it was applied
+ for (let mes of chat) {
+ if (mes && mes.is_user && mes.extra && mes.extra.bias) {
+ promptBias = mes.extra.bias;
+ }
+ }
+
+ // bias from the latest message is top priority
+ promptBias = messageBias ?? promptBias ?? '';
+
+ var storyString = "";
+ var userSendString = "";
+ var finalPromt = "";
+
+ var postAnchorChar = "talks a lot with descriptions";//'Talk a lot with description what is going on around';// in asterisks
+ var postAnchorStyle = "Writing style: very long messages";//"[Genre: roleplay chat][Tone: very long messages with descriptions]";
+
+
+ var anchorTop = '';
+ var anchorBottom = '';
+ var topAnchorDepth = 8;
+
+ if (character_anchor && !is_pygmalion) {
+ if (anchor_order === 0) {
+ anchorTop = name2 + " " + postAnchorChar;
+ } else {
+ anchorBottom = "[" + name2 + " " + postAnchorChar + "]";
+ }
+ }
+ if (style_anchor && !is_pygmalion) {
+ if (anchor_order === 1) {
+ anchorTop = postAnchorStyle;
+ } else {
+ anchorBottom = "[" + postAnchorStyle + "]";
+ }
+ }
+
+ //*********************************
+ //PRE FORMATING STRING
+ //*********************************
+ if (textareaText != "" && !automatic_trigger) {
+ chat[chat.length] = {};
+ chat[chat.length - 1]['name'] = name1;
+ chat[chat.length - 1]['is_user'] = true;
+ chat[chat.length - 1]['is_name'] = true;
+ chat[chat.length - 1]['send_date'] = humanizedDateTime();
+ chat[chat.length - 1]['mes'] = textareaText;
+ chat[chat.length - 1]['extra'] = {};
+
+ if (messageBias) {
+ chat[chat.length - 1]['extra']['bias'] = messageBias;
+ }
+
+ addOneMessage(chat[chat.length - 1]);
+ }
+ var chatString = '';
+ var arrMes = [];
+ var mesSend = [];
+ var charDescription = $.trim(characters[this_chid].description);
+ var charPersonality = $.trim(characters[this_chid].personality);
+ var Scenario = $.trim(characters[this_chid].scenario);
+ var mesExamples = $.trim(characters[this_chid].mes_example);
+ var checkMesExample = $.trim(mesExamples.replace(//gi, ''));//for check length without tag
+ if (checkMesExample.length == 0) mesExamples = '';
+ var mesExamplesArray = [];
+ //***Base replace***
+ if (mesExamples !== undefined) {
+ if (mesExamples.length > 0) {
+ if (is_pygmalion) {
+ mesExamples = mesExamples.replace(/{{user}}:/gi, 'You:');
+ mesExamples = mesExamples.replace(/:/gi, 'You:');
+ }
+ mesExamples = mesExamples.replace(/{{user}}/gi, name1);
+ mesExamples = mesExamples.replace(/{{char}}/gi, name2);
+ mesExamples = mesExamples.replace(//gi, name1);
+ mesExamples = mesExamples.replace(//gi, name2);
+ //mesExamples = mesExamples.replaceAll('', '[An example of how '+name2+' responds]');
+ let blocks = mesExamples.split(//gi);
+ mesExamplesArray = blocks.slice(1).map(block => `\n${block.trim()}\n`);
+ }
+ }
+ if (charDescription !== undefined) {
+ if (charDescription.length > 0) {
+ charDescription = charDescription.replace(/{{user}}/gi, name1);
+ charDescription = charDescription.replace(/{{char}}/gi, name2);
+ charDescription = charDescription.replace(//gi, name1);
+ charDescription = charDescription.replace(//gi, name2);
+ }
+ }
+ if (charPersonality !== undefined) {
+ if (charPersonality.length > 0) {
+ charPersonality = charPersonality.replace(/{{user}}/gi, name1);
+ charPersonality = charPersonality.replace(/{{char}}/gi, name2);
+ charPersonality = charPersonality.replace(//gi, name1);
+ charPersonality = charPersonality.replace(//gi, name2);
+ }
+ }
+ if (Scenario !== undefined) {
+ if (Scenario.length > 0) {
+ Scenario = Scenario.replace(/{{user}}/gi, name1);
+ Scenario = Scenario.replace(/{{char}}/gi, name2);
+ Scenario = Scenario.replace(//gi, name1);
+ Scenario = Scenario.replace(//gi, name2);
+ }
+ }
+
+
+ if (is_pygmalion) {
+ if (charDescription.length > 0) {
+ storyString = name2 + "'s Persona: " + charDescription + "\n";
+ }
+ if (charPersonality.length > 0) {
+ storyString += 'Personality: ' + charPersonality + '\n';
+ }
+ if (Scenario.length > 0) {
+ storyString += 'Scenario: ' + Scenario + '\n';
+ }
+ } else {
+ if (charDescription !== undefined) {
+ if (charPersonality.length > 0) {
+ charPersonality = name2 + "'s personality: " + charPersonality;//"["+name2+"'s personality: "+charPersonality+"]";
+ }
+ }
+ if (charDescription !== undefined) {
+ if ($.trim(charDescription).length > 0) {
+ if (charDescription.slice(-1) !== ']' || charDescription.substr(0, 1) !== '[') {
+ //charDescription = '['+charDescription+']';
+ }
+ storyString += charDescription + '\n';
+ }
+ }
+
+ if (count_view_mes < topAnchorDepth) {
+ storyString += charPersonality + '\n';
+ }
+
+
+ }
+
+ var count_exm_add = 0;
+ var chat2 = [];
+ var j = 0;
+ for (var i = chat.length - 1; i >= 0; i--) {
+ if (j == 0) {
+ chat[j]['mes'] = chat[j]['mes'].replace(/{{user}}/gi, name1);
+ chat[j]['mes'] = chat[j]['mes'].replace(/{{char}}/gi, name2);
+ chat[j]['mes'] = chat[j]['mes'].replace(//gi, name1);
+ chat[j]['mes'] = chat[j]['mes'].replace(//gi, name2);
+ }
+ let this_mes_ch_name = '';
+ if (chat[j]['is_user']) {
+ this_mes_ch_name = name1;
+ } else {
+ this_mes_ch_name = name2;
+ }
+ if (chat[j]['is_name']) {
+ chat2[i] = this_mes_ch_name + ': ' + chat[j]['mes'] + '\n';
+ } else {
+ chat2[i] = chat[j]['mes'] + '\n';
+ }
+ // system messages produce no text
+ if (chat[j]['is_system']) {
+ chat2[i] = '';
+ }
+ // replace bias markup
+ chat2[i] = (chat2[i] ?? '').replace(/{([^}]+)}/g, '');
+ j++;
+ }
+ //chat2 = chat2.reverse();
+ var this_max_context = 1487;
+ if (main_api == 'kobold') this_max_context = max_context;
+ if (main_api == 'novel') {
+ if (novel_tier === 1) {
+ this_max_context = 1024;
+ } else {
+ this_max_context = 2048 - 60;//fix for fat tokens
+ if (model_novel == 'krake-v2') {
+ this_max_context -= 160;
+ }
+ }
+ }
+
+ let worldInfoString = '', worldInfoBefore = '', worldInfoAfter = '';
+
+ if (world_info && world_info_data) {
+ const activatedWorldInfo = checkWorldInfo(chat2);
+ worldInfoBefore = activatedWorldInfo.worldInfoBefore;
+ worldInfoAfter = activatedWorldInfo.worldInfoAfter;
+ worldInfoString = worldInfoBefore + worldInfoAfter;
+ }
+
+ let extension_prompt = Object.keys(extension_prompts).sort().map(x => extension_prompts[x]).filter(x => x).join('\n');
+ if (extension_prompt.length && !extension_prompt.endsWith('\n')) {
+ extension_prompt += '\n';
+ }
+
+ var i = 0;
+
+ for (var item of chat2) {//console.log(encode("dsfs").length);
+ chatString = item + chatString;
+ if (encode(JSON.stringify(worldInfoString + storyString + chatString + anchorTop + anchorBottom + charPersonality + promptBias + extension_prompt)).length + 120 < this_max_context) { //(The number of tokens in the entire promt) need fix, it must count correctly (added +120, so that the description of the character does not hide)
+
+
+ //if (is_pygmalion && i == chat2.length-1) item='\n'+item;
+ arrMes[arrMes.length] = item;
+ } else {
+ i = chat.length - 1;
+ }
+ await delay(1); //For disable slow down (encode gpt-2 need fix)
+ //console.log(i+' '+chat.length);
+ count_exm_add = 0;
+ if (i == chat.length - 1) {
+ //arrMes[arrMes.length-1] = '\n'+arrMes[arrMes.length-1];
+ let mesExmString = '';
+ for (let iii = 0; iii < mesExamplesArray.length; iii++) {//mesExamplesArray It need to make from end to start
+ mesExmString = mesExmString + mesExamplesArray[iii];
+ if (encode(JSON.stringify(worldInfoString + storyString + mesExmString + chatString + anchorTop + anchorBottom + charPersonality + promptBias + extension_prompt)).length + 120 < this_max_context) { //example of dialogs
+ if (!is_pygmalion) {
+ mesExamplesArray[iii] = mesExamplesArray[iii].replace(//i, 'This is how ' + name2 + ' should talk');//An example of how '+name2+' responds
+ }
+ count_exm_add++;
+ await delay(1);
+
+ //arrMes[arrMes.length] = item;
+ } else {
+
+ iii = mesExamplesArray.length;
+ }
+
+ }
+
+ if (!is_pygmalion) {
+ if (Scenario !== undefined) {
+ if (Scenario.length > 0) {
+ storyString += 'Circumstances and context of the dialogue: ' + Scenario + '\n';
+ }
+ }
+ //storyString+='\nThen the roleplay chat between '+name1+' and '+name2+' begins.\n';
+ }
+ runGenerate();
+ return;
+ }
+ i++;
+
+
+ }
+
+ function runGenerate(cycleGenerationPromt = '') {
+
+
+ generatedPromtCache += cycleGenerationPromt;
+ if (generatedPromtCache.length == 0) {
+ chatString = "";
+ arrMes = arrMes.reverse();
+ var is_add_personality = false;
+ arrMes.forEach(function (item, i, arr) {//For added anchors and others
+
+ if (i >= arrMes.length - 1 && $.trim(item).substr(0, (name1 + ":").length) != name1 + ":") {
+ if (textareaText == "") {
+ item = item.substr(0, item.length - 1);
+ }
+ }
+ if (i === arrMes.length - topAnchorDepth && count_view_mes >= topAnchorDepth && !is_add_personality) {
+
+ is_add_personality = true;
+ //chatString = chatString.substr(0,chatString.length-1);
+ //anchorAndPersonality = "[Genre: roleplay chat][Tone: very long messages with descriptions]";
+ if ((anchorTop != "" || charPersonality != "") && !is_pygmalion) {
+ if (anchorTop != "") charPersonality += ' ';
+ item += "[" + charPersonality + anchorTop + ']\n';
+ }
+ }
+ if (i >= arrMes.length - 1 && count_view_mes > 8 && $.trim(item).substr(0, (name1 + ":").length) == name1 + ":" && !is_pygmalion) {//For add anchor in end
+ item = item.substr(0, item.length - 1);
+ //chatString+=postAnchor+"\n";//"[Writing style: very long messages]\n";
+ item = item + anchorBottom + "\n";
+ }
+ if (is_pygmalion) {
+ if (i >= arrMes.length - 1 && $.trim(item).substr(0, (name1 + ":").length) == name1 + ":") {//for add name2 when user sent
+ item = item + name2 + ":";
+ }
+ if (i >= arrMes.length - 1 && $.trim(item).substr(0, (name1 + ":").length) != name1 + ":") {//for add name2 when continue
+ if (textareaText == "") {
+ item = item + '\n' + name2 + ":";
+ }
+ }
+ if ($.trim(item).indexOf(name1) === 0) {
+ item = item.replace(name1 + ':', 'You:');
+ }
+ }
+ mesSend[mesSend.length] = item;
+ //chatString = chatString+item;
+ });
+ }
+ //finalPromt +=chatString;
+ //console.log(storyString);
+
+ //console.log(encode(characters[this_chid].description+chatString).length);
+ //console.log(encode(JSON.stringify(characters[this_chid].description+chatString)).length);
+ if (type == 'force_name2') {
+ finalPromt += name2 + ':';
+ }
+ //console.log(JSON.stringify(storyString));
+ //Send story string
+ var mesSendString = '';
+ var mesExmString = '';
+
+ function setPromtString() {
+ mesSendString = '';
+ mesExmString = '';
+ for (let j = 0; j < count_exm_add; j++) {
+ mesExmString += mesExamplesArray[j];
+ }
+ for (let j = 0; j < mesSend.length; j++) {
+ mesSendString += mesSend[j];
+ }
+ }
+
+ function checkPromtSize() {
+ setPromtString();
+ let thisPromtContextSize = encode(JSON.stringify(worldInfoString + storyString + mesExmString + mesSendString + anchorTop + anchorBottom + charPersonality + generatedPromtCache + promptBias + extension_prompt)).length + 120;
+
+ if (thisPromtContextSize > this_max_context) { //if the prepared prompt is larger than the max context size...
+
+ if (count_exm_add > 0) { // ..and we have example mesages..
+ //console.log('Context size: '+thisPromtContextSize+' -- too big, removing example message');
+ //mesExamplesArray.length = mesExamplesArray.length-1;
+ count_exm_add--; // remove the example messages...
+ checkPromtSize(); // and try agin...
+ } else if (mesSend.length > 0) { // if the chat history is longer than 0
+ //console.log('Context size: '+thisPromtContextSize+' -- too big, removing oldest chat message');
+ mesSend.shift(); // remove the first (oldest) chat entry..
+ checkPromtSize(); // and check size again..
+ } else {
+ //end
+ }
+ }
+ }
+
+
+
+ if (generatedPromtCache.length > 0) {
+ //console.log('Generated Prompt Cache length: '+generatedPromtCache.length);
+ checkPromtSize();
+ } else {
+ setPromtString();
+ }
+
+ if (!is_pygmalion) {
+ mesSendString = '\nThen the roleplay chat between ' + name1 + ' and ' + name2 + ' begins.\n' + mesSendString;
+ } else {
+ mesSendString = '\n' + mesSendString;
+ //mesSendString = mesSendString; //This edit simply removes the first "" that is prepended to all context prompts
+ }
+ finalPromt = worldInfoBefore + storyString + worldInfoAfter + extension_prompt + mesExmString + mesSendString + generatedPromtCache + promptBias;
+ finalPromt = finalPromt.replace(/\r/gm, '');
+
+ //if we aren't using the kobold GUI settings...
+ if (main_api == 'textgenerationwebui' || main_api == 'kobold' && preset_settings != 'gui') {
+ var this_settings = koboldai_settings[koboldai_setting_names[preset_settings]];
+
+ var this_amount_gen = parseInt(amount_gen); // how many tokens the AI will be requested to generate
+ if (is_pygmalion) { // if we are using a pygmalion model...
+ if (tokens_already_generated === 0) { // if nothing has been generated yet..
+ if (parseInt(amount_gen) >= 50) { // if the max gen setting is > 50...(
+ this_amount_gen = 50; // then only try to make 50 this cycle..
+ }
+ else {
+ this_amount_gen = parseInt(amount_gen); // otherwise, make as much as the max amount request.
+ }
+ }
+ else { // if we already recieved some generated text...
+ if (parseInt(amount_gen) - tokens_already_generated < tokens_cycle_count) { // if the remaining tokens to be made is less than next potential cycle count
+ this_amount_gen = parseInt(amount_gen) - tokens_already_generated; // subtract already generated amount from the desired max gen amount
+ }
+ else {
+ this_amount_gen = tokens_cycle_count; // otherwise make the standard cycle amont (frist 50, and 30 after that)
+ }
+ }
+ }
+ }
+
+ var generate_data;
+ if (main_api == 'kobold') {
+ var generate_data = { prompt: finalPromt, gui_settings: true, max_length: amount_gen, temperature: temp, max_context_length: max_context };
+ if (preset_settings != 'gui') {
+
+ generate_data = {
+ prompt: finalPromt,
+ gui_settings: false,
+ sampler_order: this_settings.sampler_order,
+ max_context_length: parseInt(max_context),//this_settings.max_length,
+ max_length: this_amount_gen,//parseInt(amount_gen),
+ rep_pen: parseFloat(rep_pen),
+ rep_pen_range: parseInt(rep_pen_size),
+ rep_pen_slope: this_settings.rep_pen_slope,
+ temperature: parseFloat(temp),
+ tfs: this_settings.tfs,
+ top_a: this_settings.top_a,
+ top_k: this_settings.top_k,
+ top_p: this_settings.top_p,
+ typical: this_settings.typical,
+ s1: this_settings.sampler_order[0],
+ s2: this_settings.sampler_order[1],
+ s3: this_settings.sampler_order[2],
+ s4: this_settings.sampler_order[3],
+ s5: this_settings.sampler_order[4],
+ s6: this_settings.sampler_order[5],
+ s7: this_settings.sampler_order[6],
+ use_world_info: false,
+ };
+ }
+ }
+
+ if (main_api == 'textgenerationwebui') {
+ const doSample = textgenerationwebui_settings.penalty_alpha == 0;
+ var generate_data = {
+ data: [
+ finalPromt,
+ this_amount_gen, // min_length
+ doSample, // do_sample
+ textgenerationwebui_settings.temp, // temperature
+ textgenerationwebui_settings.top_p, // top_p
+ textgenerationwebui_settings.typical_p, // typical_p
+ textgenerationwebui_settings.rep_pen, // repetition_penalty
+ textgenerationwebui_settings.top_k, // top_k
+ 0, // min_length
+ textgenerationwebui_settings.rep_pen_size, // no_repeat_ngram_size
+ 1, // num_beams
+ textgenerationwebui_settings.penalty_alpha, // penalty_alpha
+ 1, // length_penalty
+ false, // early_stopping
+ name1, // name1
+ name2, // name2
+ "", // Context
+ true, // stop at newline
+ max_context, // Maximum prompt size in tokens
+ 1, // num attempts
+ ]
+ };
+ }
+
+ if (main_api == 'novel') {
+ var this_settings = novelai_settings[novelai_setting_names[preset_settings_novel]];
+ generate_data = {
+ "input": finalPromt,
+ "model": model_novel,
+ "use_string": true,
+ "temperature": parseFloat(temp_novel),
+ "max_length": this_settings.max_length,
+ "min_length": this_settings.min_length,
+ "tail_free_sampling": this_settings.tail_free_sampling,
+ "repetition_penalty": parseFloat(rep_pen_novel),
+ "repetition_penalty_range": parseInt(rep_pen_size_novel),
+ "repetition_penalty_frequency": this_settings.repetition_penalty_frequency,
+ "repetition_penalty_presence": this_settings.repetition_penalty_presence,
+ //"stop_sequences": {{187}},
+ //bad_words_ids = {{50256}, {0}, {1}};
+ //generate_until_sentence = true;
+ "use_cache": false,
+ //use_string = true;
+ "return_full_text": false,
+ "prefix": "vanilla",
+ "order": this_settings.order
+ };
+ }
+ var generate_url = '';
+ if (main_api == 'kobold') {
+ generate_url = '/generate';
+ } else if (main_api == 'textgenerationwebui') {
+ generate_url = '/generate_textgenerationwebui';
+ } else if (main_api == 'novel') {
+ generate_url = '/generate_novelai';
+ }
+ jQuery.ajax({
+ type: 'POST', //
+ url: generate_url, //
+ data: JSON.stringify(generate_data),
+ beforeSend: function () {
+ //$('#create_button').attr('value','Creating...');
+ },
+ cache: false,
+ dataType: "json",
+ contentType: "application/json",
+ success: function (data) {
+ tokens_already_generated += this_amount_gen; // add new gen amt to any prev gen counter..
+
+
+ //console.log('Tokens requested in total: '+tokens_already_generated);
+ //$("#send_textarea").focus();
+ //$("#send_textarea").removeAttr('disabled');
+ is_send_press = false;
+ if (!data.error) {
+ //const getData = await response.json();
+ var getMessage = "";
+ if (main_api == 'kobold') {
+ getMessage = data.results[0].text;
+ } else if (main_api == 'textgenerationwebui') {
+ getMessage = data.data[0];
+ if (getMessage == null || data.error) {
+ popup_type = 'default';
+ callPopup('Got empty response from Text generation web UI. Try restarting the API with recommended options. ');
+ return;
+ }
+ getMessage = getMessage.substring(finalPromt.length);
+ } else if (main_api == 'novel') {
+ getMessage = data.output;
+ }
+
+ if (collapse_newlines) {
+ getMessage = getMessage.replaceAll(/\n+/g, "\n");
+ }
+
+ //Pygmalion run again // to make it continue generating so long as it's under max_amount and hasn't signaled
+ // an end to the character's response via typing "You:" or adding ""
+ if (is_pygmalion) {
+ if_typing_text = false;
+ message_already_generated += getMessage;
+ promptBias = '';
+ //console.log('AI Response so far: '+message_already_generated);
+ if (message_already_generated.indexOf('You:') === -1 && //if there is no 'You:' in the response msg
+ message_already_generated.indexOf('<|endoftext|>') === -1 && //if there is no stamp in the response msg
+ tokens_already_generated < parseInt(amount_gen) && //if the gen'd msg is less than the max response length..
+ getMessage.length > 0) { //if we actually have gen'd text at all...
+ runGenerate(getMessage); //generate again with the 'GetMessage' argument..
+ return;
+ }
+
+ getMessage = message_already_generated;
+
+ }
+ //Formating
+ getMessage = $.trim(getMessage);
+ if (is_pygmalion) {
+ getMessage = getMessage.replace(new RegExp('', "g"), name1);
+ getMessage = getMessage.replace(new RegExp('', "g"), name2);
+ getMessage = getMessage.replace(new RegExp('You:', "g"), name1 + ':');
+ }
+ if (getMessage.indexOf(name1 + ":") != -1) {
+ getMessage = getMessage.substr(0, getMessage.indexOf(name1 + ":"));
+
+ }
+ if (getMessage.indexOf('<|endoftext|>') != -1) {
+ getMessage = getMessage.substr(0, getMessage.indexOf('<|endoftext|>'));
+
+ }
+ // clean-up group message from excessive generations
+ if (type == 'group_chat' && selected_group) {
+ const group = groups.find(x => x.id == selected_group);
+
+ if (group && Array.isArray(group.members) && group.members) {
+ for (let member of group.members) {
+ // Skip current speaker.
+ if (member === name2) {
+ continue;
+ }
+
+ const indexOfMember = getMessage.indexOf(member + ":");
+ if (indexOfMember != -1) {
+ getMessage = getMessage.substr(0, indexOfMember);
+ }
+ }
+ }
+ }
+ let this_mes_is_name = true;
+ if (getMessage.indexOf(name2 + ":") === 0) {
+ getMessage = getMessage.replace(name2 + ':', '');
+ getMessage = getMessage.trimStart();
+ } else {
+ this_mes_is_name = false;
+ }
+ if (type === 'force_name2') this_mes_is_name = true;
+ //getMessage = getMessage.replace(/^\s+/g, '');
+ if (getMessage.length > 0) {
+ chat[chat.length] = {};
+ chat[chat.length - 1]['name'] = name2;
+ chat[chat.length - 1]['is_user'] = false;
+ chat[chat.length - 1]['is_name'] = this_mes_is_name;
+ chat[chat.length - 1]['send_date'] = humanizedDateTime();
+ getMessage = $.trim(getMessage);
+ chat[chat.length - 1]['mes'] = getMessage;
+
+ if (type === 'group_chat') {
+ let avatarImg = 'img/fluffy.png';
+ if (characters[this_chid].avatar != 'none') {
+ avatarImg = `characters/${characters[this_chid].avatar}?${Date.now()}`;
+ }
+ chat[chat.length - 1]['is_name'] = true;
+ chat[chat.length - 1]['force_avatar'] = avatarImg;
+ }
+
+ addOneMessage(chat[chat.length - 1]);
+ $("#send_but").css("display", "inline");
+ $("#loading_mes").css("display", "none");
+
+ if (type == 'group_chat' && selected_group) {
+ saveGroupChat(selected_group);
+ } else {
+ saveChat();
+ }
+ //console.log('/savechat called by /Generate');
+ //let final_message_length = encode(JSON.stringify(getMessage)).length;
+ //console.log('AI Response: +'+getMessage+ '('+final_message_length+' tokens)');
+ } else {
+ Generate('force_name2');
+ }
+ } else {
+ $("#send_but").css("display", "inline");
+ $("#loading_mes").css("display", "none");
+ }
+ },
+ error: function (jqXHR, exception) {
+
+ $("#send_textarea").removeAttr('disabled');
+ is_send_press = false;
+ $("#send_but").css("display", "inline");
+ $("#loading_mes").css("display", "none");
+ console.log(exception);
+ console.log(jqXHR);
+ }
+ });
+ }
+ } else {
+ if (this_chid == undefined || this_chid == 'invalid-safety-id') {
+ //send ch sel
+ popup_type = 'char_not_selected';
+ callPopup('Сharacter is not selected ');
+ }
+ is_send_press = false;
+ }
+ }
+ async function saveChat() {
+ chat.forEach(function (item, i) {
+ if (item['is_user']) {
+ var str = item['mes'].replace(name1 + ':', default_user_name + ':');
+ chat[i]['mes'] = str;
+ chat[i]['name'] = default_user_name;
+ }
+ });
+ var save_chat = [{ user_name: default_user_name, character_name: name2, create_date: chat_create_date }, ...chat];
+ jQuery.ajax({
+ type: 'POST',
+ url: '/savechat',
+ data: JSON.stringify({ ch_name: characters[this_chid].name, file_name: characters[this_chid].chat, chat: save_chat, avatar_url: characters[this_chid].avatar }),
+ beforeSend: function () {
+ //$('#create_button').attr('value','Creating...');
+ },
+ cache: false,
+ dataType: "json",
+ contentType: "application/json",
+ success: function (data) {
+
+ },
+ error: function (jqXHR, exception) {
+
+ console.log(exception);
+ console.log(jqXHR);
+ }
+ });
+ }
+ async function getChat() {
+ console.log('/getchat -- entered for -- ' + characters[this_chid].name);
+ jQuery.ajax({
+ type: 'POST',
+ url: '/getchat',
+ data: JSON.stringify({ ch_name: characters[this_chid].name, file_name: characters[this_chid].chat, avatar_url: characters[this_chid].avatar }),
+ beforeSend: function () {
+ //$('#create_button').attr('value','Creating...');
+ },
+ cache: false,
+ dataType: "json",
+ contentType: "application/json",
+ success: function (data) {
+ //console.log(data);
+ //chat.length = 0;
+ if (data[0] !== undefined) {
+ for (let key in data) {
+ chat.push(data[key]);
+ }
+ //chat = data;
+ chat_create_date = chat[0]['create_date'];
+ //console.log('/getchat saw chat_create_date: '+chat_create_date);
+ chat.shift();
+
+ } else {
+ chat_create_date = humanizedDateTime();
+ }
+ //console.log(chat);
+ getChatResult();
+ saveChat();
+ },
+ error: function (jqXHR, exception) {
+ getChatResult();
+ console.log(exception);
+ console.log(jqXHR);
+ }
+ });
+ }
+ function getChatResult() {
+ name2 = characters[this_chid].name;
+ if (chat.length > 1) {
+
+ chat.forEach(function (item, i) {
+ if (item['is_user']) {
+ var str = item['mes'].replace(default_user_name + ':', name1 + ':');
+ chat[i]['mes'] = str;
+ chat[i]['name'] = name1;
+ }
+ });
+
+
+ } else {
+ //console.log(characters[this_chid].first_mes);
+ chat[0] = {};
+ chat[0]['name'] = name2;
+ chat[0]['is_user'] = false;
+ chat[0]['is_name'] = true;
+ chat[0]['send_date'] = humanizedDateTime();
+ if (characters[this_chid].first_mes != "") {
+ chat[0]['mes'] = characters[this_chid].first_mes;
+ } else {
+ chat[0]['mes'] = default_ch_mes;
+ }
+ }
printMessages();
- getBackgrounds();
- getUserAvatars();
- autoloadchat();
- autoconnect();
+ select_selected_character(this_chid);
+ }
+ async function generateGroupWrapper(by_auto_mode) {
+ if (online_status === 'no_connection') {
+ is_group_generating = false;
+ is_send_press = false;
+ return;
+ }
+
+ const group = groups.find(x => x.id === selected_group);
+
+ if (!group || !Array.isArray(group.members) || !group.members.length) {
+ sendSystemMessage(system_message_types.EMPTY);
+ return;
+ }
+
+ try {
+ is_group_generating = true;
+ this_chid = undefined;
+ name2 = '';
+ const userInput = $("#send_textarea").val();
+
+ let typingIndicator = $('#chat .typing_indicator');
+
+ if (typingIndicator.length === 0) {
+ typingIndicator = $('#typing_indicator_template .typing_indicator').clone();
+ typingIndicator.hide();
+ $('#chat').append(typingIndicator);
+ }
+
+ let messagesBefore = chat.length;
+ let activationText = '';
+ if (userInput && userInput.length && !by_auto_mode) {
+ activationText = userInput;
+ messagesBefore++;
+ } else {
+ const lastMessage = chat[chat.length - 1];
+ if (lastMessage && !lastMessage.is_system) {
+ activationText = lastMessage.mes;
+ }
+ }
+
+ const activatedMembers = activateMembers(group.members, activationText);
+ // now the real generation begins: cycle through every character
+ for (const chId of activatedMembers) {
+ this_chid = chId;
+ name2 = characters[chId].name;
+
+ await Generate('group_chat', by_auto_mode);
+
+ // update indicator and scroll down
+ typingIndicator.find('.typing_indicator_name').text(characters[chId].name);
+ $('#chat').append(typingIndicator);
+ typingIndicator.show(250, function () {
+ typingIndicator.get(0).scrollIntoView({ behavior: 'smooth' });
+ });
+
+ while (true) {
+ // check if message generated already
+ if (chat.length == messagesBefore) {
+ await delay(10);
+ } else {
+ messagesBefore++;
+ break;
+ }
+ }
+
+ // hide and reapply the indicator to the bottom of the list
+ typingIndicator.hide(250);
+ $('#chat').append(typingIndicator);
+ }
+
+ } finally {
+ is_group_generating = false;
+ is_send_press = false;
+ this_chid = undefined;
+ }
+ }
+ function activateMembers(members, input) {
+ let activatedNames = [];
+
+ // find mentions
+ if (input && input.length) {
+ for (let inputWord of extractAllWords(input)) {
+ for (let member of members) {
+ if (extractAllWords(member).includes(inputWord)) {
+ activatedNames.push(member);
+ break;
+ }
+ }
+ }
+ }
+
+ // activation by talkativeness (in shuffled order)
+ const shuffledMembers = shuffle([...members]);
+ for (let member of shuffledMembers) {
+ const character = characters.find(x => x.name === member);
+
+ if (!character) {
+ continue;
+ }
+
+ const rollValue = Math.random();
+ let talkativeness = Number(character.talkativeness);
+ talkativeness = Number.isNaN(talkativeness) ? talkativeness_default : talkativeness;
+ if (talkativeness >= rollValue) {
+ activatedNames.push(member);
+ }
+ }
+
+ // pick 1 at random if no one was activated
+ if (activatedNames.length === 0) {
+ const randomIndex = Math.floor(Math.random() * members.length);
+ activatedNames.push(members[randomIndex]);
+ }
+
+ // de-duplicate array of names
+ activatedNames = activatedNames.filter(onlyUnique);
+
+ // map to character ids
+ const memberIds = activatedNames.map(x => characters.findIndex(y => y.name === x)).filter(x => x !== -1);
+ return memberIds;
+ }
+ function extractAllWords(value) {
+ const words = [];
+
+ if (!value) {
+ return words;
+ }
+
+ const matches = value.matchAll(/\b\w+\b/gmi);
+ for (let match of matches) {
+ words.push(match[0].toLowerCase());
+ }
+ return words;
+ }
+ async function getGroupChat(id) {
+ const response = await fetch('/getgroupchat', {
+ method: 'POST',
+ headers: {
+ "Content-Type": "application/json",
+ "X-CSRF-Token": token,
+ },
+ body: JSON.stringify({ id: id }),
+ });
+
+ if (response.ok) {
+ const data = await response.json();
+ if (Array.isArray(data) && data.length) {
+ for (let key of data) {
+ chat.push(key);
+ }
+ printMessages();
+ }
+ else {
+ sendSystemMessage(system_message_types.GROUP);
+ const group = groups.find(x => x.id === id);
+ if (group && Array.isArray(group.members)) {
+ for (let name of group.members) {
+ const character = characters.find(x => x.name === name);
+
+ if (!character) {
+ continue;
+ }
+
+ const mes = {};
+ mes['is_user'] = false;
+ mes['is_system'] = false;
+ mes['name'] = character.name;
+ mes['is_name'] = true;
+ mes['send_date'] = humanizedDateTime();
+ mes['mes'] = character.first_mes ? substituteParams(character.first_mes.trim()) : mes['mes'] = default_ch_mes;
+ mes['force_avatar'] = character.avatar != 'none' ? `characters/${character.avatar}?${Date.now()}` : 'img/fluffy.png';
+ chat.push(mes);
+ addOneMessage(mes);
+ }
+ }
+ }
+
+ await saveGroupChat(id);
+ }
+ }
+ async function saveGroupChat(id) {
+ const response = await fetch('/savegroupchat', {
+ method: 'POST',
+ headers: {
+ "Content-Type": "application/json",
+ "X-CSRF-Token": token,
+ },
+ body: JSON.stringify({ id: id, chat: [...chat] })
+ });
+ }
+ async function getGroups() {
+ const response = await fetch('/getgroups', {
+ method: 'POST',
+ headers: {
+ "Content-Type": "application/json",
+ "X-CSRF-Token": token,
+ },
+ });
+
+ if (response.ok) {
+ const data = await response.json();
+ groups = data.sort((a, b) => a.id - b.id);
+ }
+ }
+ async function deleteGroup(id) {
+ const response = await fetch('/deletegroup', {
+ method: 'POST',
+ headers: {
+ "Content-Type": "application/json",
+ "X-CSRF-Token": token,
+ },
+ body: JSON.stringify({ id: id }),
+ });
+
+ if (response.ok) {
+ active_character = 'invalid-safety-id'; //unsets the chid in settings (this prevents AutoLoadChat from trying to load the wrong ChID
+ this_chid = 'invalid-safety-id'; //unsets expected chid before reloading (related to getCharacters/printCharacters from using old arrays)
+ selected_group = null;
+ characters.length = 0; // resets the characters array, forcing getcharacters to reset
+ name2 = "Chloe"; // replaces deleted charcter name with Chloe, since she wil be displayed next.
+ chat = [...safetychat]; // sets up chloe to tell user about having deleted a character
+
+ /* QuickRefresh(); */
+ $('#rm_info_avatar').html('');
+ $('#rm_info_block').transition({ opacity: 0, duration: 0 });
+ select_rm_info("Group deleted!");
+ $('#rm_info_block').transition({ opacity: 1.0, duration: 2000 });
+ }
+
+ }
+ async function editGroup(id, immediately) {
+ const group = groups.find(x => x.id == id);
+
+ if (!group) {
+ return;
+ }
+
+ async function _save() {
+ const response = await fetch('/editgroup', {
+ method: 'POST',
+ headers: {
+ "Content-Type": "application/json",
+ "X-CSRF-Token": token,
+ },
+ body: JSON.stringify(group),
+ });
+ }
+
+ if (immediately) {
+ return await _save();
+ }
+
+ clearTimeout(timerGroupSave);
+ timerGroupSave = setTimeout(async () => await _save(), durationSaveEdit);
+ }
+ async function groupChatAutoModeWorker() {
+ if (!is_group_automode_enabled || online_status === 'no_connection') {
+ return;
+ }
+
+ if (!selected_group || is_send_press || is_group_generating) {
+ return;
+ }
+
+ const group = groups.find(x => x.id === selected_group);
+
+ if (!group || !Array.isArray(group.members) || !group.members.length) {
+ return;
+ }
+
+ await generateGroupWrapper(true);
+ }
+
+ function select_group_chats(chat_id) {
+ menu_type = 'group_chats';
+ const group = chat_id && groups.find(x => x.id == chat_id);
+ const groupName = group?.name ?? '';
+
+ $('#rm_group_chat_name').val(groupName);
+ $('#rm_group_chat_name').off();
+ $('#rm_group_chat_name').on('input', async function () {
+ if (chat_id) {
+ group.name = $(this).val();
+ await editGroup(chat_id);
+ }
+ });
+ $('#rm_group_filter').val('').trigger('input');
+ $("#rm_group_chats_block").css("display", "flex");
+ $('#rm_group_chats_block').css('opacity', 0.0);
+ $('#rm_group_chats_block').transition({
+ opacity: 1.0,
+ duration: animation_rm_duration,
+ easing: animation_rm_easing,
+ complete: function () { }
+ });
+
+ $("#rm_ch_create_block").css("display", "none");
+ $("#rm_characters_block").css("display", "none");
+
+ async function memberClickHandler(event) {
+ event.stopPropagation();
+ const id = $(this).data('id');
+ const isDelete = !!($(this).closest('#rm_group_members').length);
+ const template = $(this).clone();
+ template.data('id', id);
+ template.click(memberClickHandler);
+
+ if (isDelete) {
+ template.find('.plus').show();
+ template.find('.minus').hide();
+ $('#rm_group_add_members').prepend(template);
+ } else {
+ template.find('.plus').hide();
+ template.find('.minus').show();
+ $('#rm_group_members').prepend(template);
+ }
+
+ if (group) {
+ if (isDelete) {
+ const index = group.members.findIndex(x => x === id);
+ if (index !== -1) {
+ group.members.splice(index, 1);
+ }
+ } else {
+ group.members.push(id);
+ }
+ await editGroup(chat_id);
+ updateGroupAvatar(group);
+ }
+
+ $(this).remove();
+ const groupHasMembers = !!$('#rm_group_members').children().length;
+ $("#rm_group_submit").prop('disabled', !groupHasMembers);
+ }
+
+ // render characters list
+ $('#rm_group_add_members').empty();
+ $('#rm_group_members').empty();
+ for (let character of characters) {
+ const avatar = character.avatar != 'none' ? `characters/${character.avatar}#${Date.now()}` : default_avatar;
+ const template = $('#group_member_template .group_member').clone();
+ template.data('id', character.name);
+ template.find('.avatar img').attr('src', avatar);
+ template.find('.ch_name').html(character.name);
+ template.click(memberClickHandler);
+
+ if (group && Array.isArray(group.members) && group.members.includes(character.name)) {
+ template.find('.plus').hide();
+ template.find('.minus').show();
+ $('#rm_group_members').append(template);
+ } else {
+ template.find('.plus').show();
+ template.find('.minus').hide();
+ $('#rm_group_add_members').append(template);
+ }
+ }
+
+ const groupHasMembers = !!$('#rm_group_members').children().length;
+ $("#rm_group_submit").prop('disabled', !groupHasMembers);
+
+ // bottom buttons
+ if (chat_id) {
+ $('#rm_group_submit').hide();
+ $('#rm_group_delete').show();
+ } else {
+ $('#rm_group_submit').show();
+ $('#rm_group_delete').hide();
+ }
+
+ $('#rm_group_delete').off();
+ $('#rm_group_delete').on('click', function () {
+ popup_type = 'del_group';
+ $('#dialogue_popup').data('group_id', chat_id);
+ callPopup('Delete the group? ');
+ });
+
+ // top bar
+ if (group) {
+ var display_name = groupName;
+ $("#rm_button_selected_ch").children("h2").css(deselected_button_style);
+ $("#rm_button_selected_ch").children("h2").text('');
+ }
+ }
+ function openNavToggle() {
+ if (!$('#nav-toggle').prop('checked')) {
+ $('#nav-toggle').trigger('click');
+ }
+ }
+ function changeMainAPI() {
+ if ($('#main_api').find(":selected").val() == 'kobold') {
+ $('#kobold_api').css("display", "block");
+ $('#novel_api').css("display", "none");
+ $('#textgenerationwebui_api').css("display", "none");
+ main_api = 'kobold';
+ $('#max_context_block').css('display', 'block');
+ $('#amount_gen_block').css('display', 'block');
+ $('#softprompt_block').css('display', 'block');
+ $('#settings_perset').trigger('change');
+ }
+ if ($('#main_api').find(":selected").val() == 'textgenerationwebui') {
+ $('#kobold_api').css("display", "none");
+ $('#novel_api').css("display", "none");
+ $('#textgenerationwebui_api').css("display", "block");
+ main_api = 'textgenerationwebui';
+ $('#max_context_block').css('display', 'block');
+ $('#amount_gen_block').css('display', 'block');
+ $('#softprompt_block').css('display', 'block');
+ $("#amount_gen_block").children().prop("disabled", false);
+ $("#amount_gen_block").css('opacity', 1.0);
+ }
+
+ if ($('#main_api').find(":selected").val() == 'novel') {
+ $('#kobold_api').css("display", "none");
+ $('#novel_api').css("display", "block");
+ $('#textgenerationwebui_api').css("display", "none");
+ main_api = 'novel';
+ $('#max_context_block').css('display', 'none');
+ $('#amount_gen_block').css('display', 'none');
+ $('#softprompt_block').css('display', 'none');
+ }
+ }
+ async function getUserAvatars() {
+ $("#user_avatar_block").html(""); //RossAscends: necessary to avoid doubling avatars each QuickRefresh.
+ $('#user_avatar_block').append('+
');
+ const response = await fetch("/getuseravatars", {
+ method: "POST",
+ headers: {
+ "Content-Type": "application/json",
+ "X-CSRF-Token": token
+ },
+ body: JSON.stringify({
+ "": ""
+ })
+
+ });
+ if (response.ok === true) {
+ const getData = await response.json();
+ //background = getData;
+ //console.log(getData.length);
+
+ for (var i = 0; i < getData.length; i++) {
+ //console.log(1);
+ appendUserAvatar(getData[i]);
+ }
+ //var aa = JSON.parse(getData[0]);
+ //const load_ch_coint = Object.getOwnPropertyNames(getData);
+
+
+ }
+ }
+
+ function highlightSelectedAvatar() {
+ $("#user_avatar_block").find('.avatar').removeClass('selected');
+ $("#user_avatar_block").find(`.avatar[imgfile='${user_avatar}']`).addClass('selected');
+ }
+
+ function appendUserAvatar(name) {
+ const block = $("#user_avatar_block").append('');
+ highlightSelectedAvatar();
+ }
+ //***************SETTINGS****************//
+ ///////////////////////////////////////////
+ async function getSettings(type) {//timer
+
+ //console.log('getSettings() pinging server for settings request');
+ jQuery.ajax({
+ type: 'POST',
+ url: '/getsettings',
+ data: JSON.stringify({}),
+ beforeSend: function () {
+
+
+ },
+ cache: false,
+ dataType: "json",
+ contentType: "application/json",
+ //processData: false,
+ success: function (data) {
+ if (data.result != 'file not find' && data.settings) {
+ settings = JSON.parse(data.settings);
+ if (settings.username !== undefined) {
+ if (settings.username !== '') {
+ name1 = settings.username;
+ $('#your_name').val(name1);
+ }
+ }
+
+ //Load which API we are using
+ if (settings.main_api != undefined) {
+ main_api = settings.main_api;
+ $("#main_api option[value=" + main_api + "]").attr('selected', 'true');
+ changeMainAPI();
+ }
+ //load Novel API KEY is exists
+ if (settings.api_key_novel != undefined) {
+ api_key_novel = settings.api_key_novel;
+ $("#api_key_novel").val(api_key_novel);
+ }
+ //load the rest of the Novel settings without any checks
+ model_novel = settings.model_novel;
+ $("#model_novel_select option[value=" + model_novel + "]").attr('selected', 'true');
+
+ novelai_setting_names = data.novelai_setting_names;
+ novelai_settings = data.novelai_settings;
+ novelai_settings.forEach(function (item, i, arr) {
+ novelai_settings[i] = JSON.parse(item);
+ });
+ var arr_holder = {};
+
+ $("#settings_perset_novel").empty();
+
+ novelai_setting_names.forEach(function (item, i, arr) {
+ arr_holder[item] = i;
+ $('#settings_perset_novel').append('
' + item + ' ');
+
+ });
+ novelai_setting_names = {};
+ novelai_setting_names = arr_holder;
+
+ preset_settings_novel = settings.preset_settings_novel;
+ $("#settings_perset_novel option[value=" + novelai_setting_names[preset_settings_novel] + "]").attr('selected', 'true');
+
+ //Load KoboldAI settings
+ koboldai_setting_names = data.koboldai_setting_names;
+ koboldai_settings = data.koboldai_settings;
+ koboldai_settings.forEach(function (item, i, arr) {
+ koboldai_settings[i] = JSON.parse(item);
+ });
+ var arr_holder = {};
+
+ $("#settings_perset").empty(); //RossAscends: uncommented this to prevent settings selector from doubling preset list on QuickRefresh
+ $("#settings_perset").append('
GUI KoboldAI Settings '); //adding in the GUI settings, since it is not loaded dynamically
+
+ koboldai_setting_names.forEach(function (item, i, arr) {
+ arr_holder[item] = i;
+ $('#settings_perset').append('
' + item + ' ');
+ //console.log('loading preset #'+i+' -- '+item);
+
+ });
+ koboldai_setting_names = {};
+ koboldai_setting_names = arr_holder;
+ preset_settings = settings.preset_settings;
+
+ //Load AI model config settings (temp, context length, anchors, and anchor order)
+
+ textgenerationwebui_settings = settings.textgenerationwebui_settings || textgenerationwebui_settings;
+
+ temp = settings.temp;
+ amount_gen = settings.amount_gen;
+ if (settings.max_context !== undefined) max_context = parseInt(settings.max_context);
+ if (settings.anchor_order !== undefined) anchor_order = parseInt(settings.anchor_order);
+ if (settings.style_anchor !== undefined) style_anchor = !!settings.style_anchor;
+ if (settings.character_anchor !== undefined) character_anchor = !!settings.character_anchor;
+ if (settings.world_info_depth !== undefined) world_info_depth = Number(settings.world_info_depth);
+ if (settings.world_info_budget !== undefined) world_info_budget = Number(settings.world_info_budget);
+
+ //load poweruser options
+ if (settings.auto_connect !== undefined) auto_connect = !!settings.auto_connect;
+ if (settings.auto_load_chat !== undefined) auto_load_chat = !!settings.auto_load_chat;
+
+ rep_pen = settings.rep_pen;
+ rep_pen_size = settings.rep_pen_size;
+
+ var addZeros = "";
+ if (isInt(temp)) addZeros = ".00";
+ $('#temp').val(temp);
+ $('#temp_counter').html(temp + addZeros);
+
+ $('#style_anchor').prop('checked', style_anchor);
+ $('#character_anchor').prop('checked', character_anchor);
+ $("#anchor_order option[value=" + anchor_order + "]").attr('selected', 'true');
+
+ $('#auto-connect-checkbox').prop('checked', auto_connect);
+ $('#auto-load-chat-checkbox').prop('checked', auto_load_chat);
+
+ $('#max_context').val(max_context);
+ $('#max_context_counter').html(max_context + ' Tokens');
+
+ $('#amount_gen').val(amount_gen);
+ $('#amount_gen_counter').html(amount_gen + ' Tokens');
+
+ $('#world_info_depth_counter').html(`${world_info_depth} Messages`);
+ $('#world_info_depth').val(world_info_depth);
+
+ $('#world_info_budget_counter').html(`${world_info_budget} Tokens`);
+ $('#world_info_budget').val(world_info_budget);
+
+ addZeros = "";
+ if (isInt(rep_pen)) addZeros = ".00";
+ $('#rep_pen').val(rep_pen);
+ $('#rep_pen_counter').html(rep_pen + addZeros);
+
+ $('#rep_pen_size').val(rep_pen_size);
+ $('#rep_pen_size_counter').html(rep_pen_size + " Tokens");
+
+ //Novel
+ temp_novel = settings.temp_novel;
+ rep_pen_novel = settings.rep_pen_novel;
+ rep_pen_size_novel = settings.rep_pen_size_novel;
+
+ addZeros = "";
+ if (isInt(temp_novel)) addZeros = ".00";
+ $('#temp_novel').val(temp_novel);
+ $('#temp_counter_novel').html(temp_novel + addZeros);
+
+ addZeros = "";
+ if (isInt(rep_pen_novel)) addZeros = ".00";
+ $('#rep_pen_novel').val(rep_pen_novel);
+ $('#rep_pen_counter_novel').html(rep_pen_novel + addZeros);
+
+ $('#rep_pen_size_novel').val(rep_pen_size_novel);
+ $('#rep_pen_size_counter_novel').html(rep_pen_size_novel + " Tokens");
+
+ //Enable GUI deference settings if GUI is selected for Kobold
+ if (preset_settings == 'gui') {
+ $("#settings_perset option[value=gui]").attr('selected', 'true').trigger('change');
+ $("#range_block").children().prop("disabled", true);
+ $("#range_block").css('opacity', 0.5);
+
+ $("#amount_gen_block").children().prop("disabled", true);
+ $("#amount_gen_block").css('opacity', 0.45);
+ } else {
+ if (typeof koboldai_setting_names[preset_settings] !== 'undefined') {
+
+ $("#settings_perset option[value=" + koboldai_setting_names[preset_settings] + "]").attr('selected', 'true').trigger('change');
+ } else {
+ $("#range_block").children().prop("disabled", true);
+ $("#range_block").css('opacity', 0.5);
+ $("#amount_gen_block").children().prop("disabled", true);
+ $("#amount_gen_block").css('opacity', 0.45);
+
+ preset_settings = 'gui';
+ $("#settings_perset option[value=gui]").attr('selected', 'true').trigger('change');
+ }
+ }
+
+ //Load User's Name and Avatar
+
+ user_avatar = settings.user_avatar;
+ $('.mes').each(function () {
+ if ($(this).attr('ch_name') == name1) {
+ $(this).children('.avatar').children('img').attr('src', 'User Avatars/' + user_avatar);
+ }
+ });
+
+ //Load the API server URL from settings
+ api_server = settings.api_server;
+ $('#api_url_text').val(api_server);
+
+ // world info settings
+ world_names = data.world_names?.length ? data.world_names : [];
+
+ if (settings.world_info != undefined) {
+ if (world_names.includes(settings.world_info)) {
+ world_info = settings.world_info;
+ }
+ }
+
+ world_names.forEach((item, i) => {
+ $('#world_info').append(`
${item} `);
+ // preselect world if saved
+ if (item == world_info) {
+ $('#world_info').val(i).change();
+ }
+ });
+ // end world info settings
+
+ if (data.enable_extensions) {
+ const src = 'scripts/extensions.js';
+ if ($(`script[src="${src}"]`).length === 0) {
+ const script = document.createElement('script');
+ script.type = 'text/javascript';
+ script.src = src;
+ $('body').append(script);
+ }
+ }
+
+ //get the character to auto-load
+ if (settings.active_character !== undefined) {
+ if (settings.active_character !== '') {
+ active_character = settings.active_character;
+ }
+ }
+
+ api_server_textgenerationwebui = settings.api_server_textgenerationwebui;
+ $("#textgenerationwebui_api_url_text").val(api_server_textgenerationwebui);
+
+
+ for (var i of ["temp", "rep_pen", "rep_pen_size", "top_k", "top_p", "typical_p", "penalty_alpha"]) {
+ $("#" + i + "_textgenerationwebui")
+ .val(textgenerationwebui_settings[i]);
+ $("#" + i + "_counter_textgenerationwebui")
+ .html(textgenerationwebui_settings[i]);
+ }
+/* //RossAscends: getting variables added/adjusted/applied with RA-mods
+ active_character = settings.active_character;
+ this_chid = settings.active_character; //forcing variable sameness for chid and this_chid with active_character in order to load RA_ALC
+ var chid = settings.active_character; //forcing variable sameness for chid and this_chid with active_character in order to load RA_ALC
+ console.log(
+ "getSettings -- loaded from file -- active_character : " +
+ settings.active_character
+ );
+ auto_connect = settings.auto_connect;
+ auto_load_chat = settings.auto_load_chat; */
+ selected_button = settings.selected_button;
+/* NavOpenClosePref = settings.NavOpenClosePref;
+ stickyNavPref = settings.stickyNavPref; */
+/* $("#nav-toggle").prop("checked", NavOpenClosePref);
+ $("#rm_button_panel_pin").prop("checked", stickyNavPref);
+ $("#auto-connect-checkbox").prop("checked", auto_connect);
+ $("#auto-load-chat-checkbox").prop("checked", auto_load_chat); */
+ }
+
+ if (!is_checked_colab) isColab();
+ },
+ error: function (jqXHR, exception) {
+ console.log(exception);
+ console.log(jqXHR);
+
+ }
});
- function flushSettings() {
- $('#settings_perset').empty();
- $('#settings_perset_novel').empty();
- $('#world_info').empty();
- $('#settings_perset').append('
GUI KoboldAI Settings ');
- $('#world_info').append('
None ');
+ collapse_newlines = localStorage.getItem(storage_keys.collapse_newlines) == 'true';
+ $('#collapse-newlines-checkbox').prop('checked', collapse_newlines);
}
- //RossAscends: a smaller load-up function to be used instead of refreshing the page in cases like deleting a character and changing username
+ async function saveSettings(type) {
+ //console.log('Entering settings with name1 = '+name1);
+ jQuery.ajax({
+ type: 'POST',
+ url: '/savesettings',
+ data: JSON.stringify({
+ username: name1,
+ api_server: api_server,
+ api_server_textgenerationwebui: api_server_textgenerationwebui,
+ preset_settings: preset_settings,
+ preset_settings_novel: preset_settings_novel,
+ user_avatar: user_avatar,
+ temp: temp,
+ amount_gen: amount_gen,
+ max_context: max_context,
+ anchor_order: anchor_order,
+ style_anchor: style_anchor,
+ character_anchor: character_anchor,
+ auto_connect: auto_connect,
+ auto_load_chat: auto_load_chat,
+ main_api: main_api,
+ api_key_novel: api_key_novel,
+ rep_pen: rep_pen,
+ rep_pen_size: rep_pen_size,
+ model_novel: model_novel,
+ temp_novel: temp_novel,
+ rep_pen_novel: rep_pen_novel,
+ rep_pen_size_novel: rep_pen_size_novel,
+ world_info: world_info,
+ world_info_depth: world_info_depth,
+ world_info_budget: world_info_budget,
+ active_character: active_character,
+ textgenerationwebui_settings: textgenerationwebui_settings,
+ }),
+ beforeSend: function () {
+ //console.log('saveSettings() -- active_character -- '+active_character);
+ if (type == 'change_name') {
+ name1 = $('#your_name').val()
+ // console.log('beforeSend name1 = '+name1);
+ }
+ },
+ cache: false,
+ dataType: "json",
+ contentType: "application/json",
+ //processData: false,
+ success: function (data) {
+ //online_status = data.result;
+ if (type == 'change_name') {
+ //console.log('got name change');
+ //console.log('success: reading from settings = ' + settings.username);
+ //name1 = settings.username;
+
+ clearChat();
+ printMessages();
+
+
+ }
+
+ },
+ error: function (jqXHR, exception) {
+ console.log(exception);
+ console.log(jqXHR);
+
+ }
+ });
+
+ localStorage.setItem(storage_keys.collapse_newlines, collapse_newlines);
+ }
+ function isInt(value) {
+ return !isNaN(value) &&
+ parseInt(Number(value)) == value &&
+ !isNaN(parseInt(value, 10));
+ }
+ function messageEditDone(div) {
+
+ var text = div.parent().parent().children('.mes_text').children('.edit_textarea').val();
+ //var text = chat[this_edit_mes_id];
+ text = text.trim();
+ const bias = extractMessageBias(text);
+ chat[this_edit_mes_id]['mes'] = text;
+
+ // editing old messages
+ if (!chat[this_edit_mes_id]['extra']) {
+ chat[this_edit_mes_id]['extra'] = {};
+ }
+
+ chat[this_edit_mes_id]['extra']['bias'] = bias ?? null;
+
+ div.parent().parent().children('.mes_text').empty();
+ div.css('display', 'none');
+ div.parent().children('.mes_edit_cancel').css('display', 'none');
+ div.parent().children('.mes_edit').css('display', 'inline-block');
+ div.parent().parent().children('.mes_text').append(messageFormating(text, this_edit_mes_chname));
+ div.parent().parent().children('.mes_bias').empty();
+ div.parent().parent().children('.mes_bias').append(messageFormating(bias));
+ appendImageToMessage(chat[this_edit_mes_id], div.closest('.mes'));
+ this_edit_mes_id = undefined;
+ if (selected_group) {
+ saveGroupChat(selected_group);
+ }
+ else {
+ saveChat();
+ }
+ }
+ async function getAllCharaChats() {
+ //console.log('getAllCharaChats() pinging server for character chat history.');
+ $('#select_chat_div').html('');
+ //console.log(characters[this_chid].chat);
+ jQuery.ajax({
+ type: 'POST',
+ url: '/getallchatsofcharacter',
+ data: JSON.stringify({ avatar_url: characters[this_chid].avatar }),
+ beforeSend: function () {
+ //$('#create_button').attr('value','Creating...');
+ },
+ cache: false,
+ dataType: "json",
+ contentType: "application/json",
+ success: function (data) {
+ $('#load_select_chat_div').css('display', 'none');
+ let dataArr = Object.values(data);
+ data = dataArr.sort((a, b) => a['file_name'].localeCompare(b['file_name']));
+ data = data.reverse();
+
+ for (const key in data) {
+ let strlen = 300;
+ let mes = data[key]['mes'];
+ if (mes !== undefined) {
+ if (mes.length > strlen) {
+ mes = '...' + mes.substring(mes.length - strlen);
+ }
+ $('#select_chat_div').append('
' + data[key]['file_name'] + '
' + mes + '
');
+ if (characters[this_chid]['chat'] == data[key]['file_name'].replace('.jsonl', '')) {
+ //children().last()
+ $('#select_chat_div').children(':nth-last-child(1)').attr('highlight', true);
+ }
+ }
+ }
+ //
+
+ //
+ //console.log(data);
+ //chat.length = 0;
+
+ //chat = data;
+ //getChatResult();
+ //saveChat();
+ //console.log('getAllCharaChats() -- Finished successfully');
+ },
+ error: function (jqXHR, exception) {
+ //getChatResult();
+ //console.log('getAllCharaChats() -- Failed');
+ console.log(exception);
+ console.log(jqXHR);
+
+ }
+ });
+ }
+ //************************************************************
+ //************************Novel.AI****************************
+ //************************************************************
+ async function getStatusNovel() {
+ if (is_get_status_novel) {
+
+ var data = { key: api_key_novel };
+
+
+ jQuery.ajax({
+ type: 'POST', //
+ url: '/getstatus_novelai', //
+ data: JSON.stringify(data),
+ beforeSend: function () {
+ //$('#create_button').attr('value','Creating...');
+ },
+ cache: false,
+ dataType: "json",
+ contentType: "application/json",
+ success: function (data) {
+
+
+ if (data.error != true) {
+ //var settings2 = JSON.parse(data);
+ //const getData = await response.json();
+ novel_tier = data.tier;
+ if (novel_tier == undefined) {
+ online_status = 'no_connection';
+ }
+ if (novel_tier === 0) {
+ online_status = "Paper";
+ }
+ if (novel_tier === 1) {
+ online_status = "Tablet";
+ }
+ if (novel_tier === 2) {
+ online_status = "Scroll";
+ }
+ if (novel_tier === 3) {
+ online_status = "Opus";
+ }
+ }
+ resultCheckStatusNovel();
+ },
+ error: function (jqXHR, exception) {
+ online_status = 'no_connection';
+ console.log(exception);
+ console.log(jqXHR);
+ resultCheckStatusNovel();
+ }
+ });
+ } else {
+ if (is_get_status != true) {
+ online_status = 'no_connection';
+ }
+ }
+ }
+ function compareVersions(v1, v2) {
+ const v1parts = v1.split('.');
+ const v2parts = v2.split('.');
+
+ for (let i = 0; i < v1parts.length; ++i) {
+ if (v2parts.length === i) {
+ return 1;
+ }
+
+ if (v1parts[i] === v2parts[i]) {
+ continue;
+ }
+ if (v1parts[i] > v2parts[i]) {
+ return 1;
+ }
+ else {
+ return -1;
+ }
+ }
+
+ if (v1parts.length != v2parts.length) {
+ return -1;
+ }
+
+ return 0;
+ }
+ function select_rm_info(text, charId = null) {
+ $("#rm_characters_block").css("display", "none");
+ $("#rm_api_block").css("display", "none");
+ $("#rm_ch_create_block").css("display", "none");
+ $("#rm_group_chats_block").css("display", "none");
+ $("#rm_info_block").css("display", "flex");
+
+ $("#rm_info_text").html('
' + text + ' ');
+
+ $("#rm_button_characters").css("class", "deselected-right-tab");
+ $("#rm_button_settings").css("class", "deselected-right-tab");
+ $("#rm_button_selected_ch").css("class", "deselected-right-tab");
+
+ prev_selected_char = charId;
+ }
+ function select_selected_character(chid) { //character select
+ //console.log('select_selected_character() -- starting with input of -- '+chid+' (name:'+characters[chid].name+')');
+ select_rm_create();
+ menu_type = 'character_edit';
+ $("#delete_button").css("display", "block");
+ $("#export_button").css("display", "block");
+ $("#rm_button_selected_ch").css("class", "selected-right-tab");
+ var display_name = characters[chid].name;
+
+
+ $("#rm_button_selected_ch").children("h2").text(display_name);
+
+ //create text poles
+ $("#rm_button_back").css("display", "none");
+ //$("#character_import_button").css("display", "none");
+ $("#create_button").attr("value", "Save");
+ $("#create_button").css("display", "none");
+ var i = 0;
+ while ($("#rm_button_selected_ch").width() > 170 && i < 100) {
+ display_name = display_name.slice(0, display_name.length - 2);
+ //console.log(display_name);
+ $("#rm_button_selected_ch").children("h2").text($.trim(display_name) + '...');
+ i++;
+ }
+ $("#add_avatar_button").val('');
+
+ $('#character_popup_text_h3').text(characters[chid].name);
+ $("#character_name_pole").val(characters[chid].name);
+ $("#description_textarea").val(characters[chid].description);
+ $("#personality_textarea").val(characters[chid].personality);
+ $("#firstmessage_textarea").val(characters[chid].first_mes);
+ $("#scenario_pole").val(characters[chid].scenario);
+ $("#talkativeness_slider").val(characters[chid].talkativeness ?? talkativeness_default);
+ $("#mes_example_textarea").val(characters[chid].mes_example);
+ $("#selected_chat_pole").val(characters[chid].chat);
+ $("#create_date_pole").val(characters[chid].create_date);
+ $("#avatar_url_pole").val(characters[chid].avatar);
+ $("#chat_import_avatar_url").val(characters[chid].avatar);
+ $("#chat_import_character_name").val(characters[chid].name);
+ //$("#avatar_div").css("display", "none");
+ var this_avatar = default_avatar;
+ if (characters[chid].avatar != 'none') {
+ this_avatar = "characters/" + characters[chid].avatar;
+ }
+ $("#avatar_load_preview").attr('src', this_avatar + "?" + Date.now());
+ $("#name_div").css("display", "none");
+
+ $("#form_create").attr("actiontype", "editcharacter");
+ active_character = chid;
+ //console.log('select_selected_character() -- active_character -- '+chid+'(ChID of '+display_name+')');
+ saveSettings();
+ //console.log('select_selected_character() -- called saveSettings() to save -- active_character -- '+active_character+'(ChID of '+display_name+')');
+
+ }
+ function select_rm_create() {
+ menu_type = 'create';
+
+ //console.log('select_rm_Create() -- selected button: '+selected_button);
+ if (selected_button == 'create') {
+ if (create_save_avatar != '') {
+ $("#add_avatar_button").get(0).files = create_save_avatar;
+ read_avatar_load($("#add_avatar_button").get(0));
+ }
+ }
+
+ $("#rm_characters_block").css("display", "none");
+ $("#rm_api_block").css("display", "none");
+ $("#rm_ch_create_block").css("display", "block");
+ $("#rm_group_chats_block").css("display", "none");
+
+ $('#rm_ch_create_block').css('opacity', 0.0);
+ $('#rm_ch_create_block').transition({
+ opacity: 1.0,
+ duration: animation_rm_duration,
+ easing: animation_rm_easing,
+ complete: function () { }
+ });
+ $("#rm_info_block").css("display", "none");
+
+ $("#delete_button_div").css("display", "none");
+ $("#delete_button").css("display", "none");
+ $("#export_button").css("display", "none");
+ $("#create_button").css("display", "block");
+ $("#create_button").attr("value", "Create");
+ //RossAscends: commented this out as part of the auto-loading token counter
+ //$('#result_info').html(' ');
+ $("#rm_button_characters").css("class", "deselected-right-tab");
+ $("#rm_button_settings").css("class", "deselected-right-tab");
+ $("#rm_button_selected_ch").css("class", "deselected-right-tab");
+
+ //create text poles
+ $("#rm_button_back").css("display", "inline-block");
+ $("#character_import_button").css("display", "inline-block");
+ $("#character_popup_text_h3").text('Create character');
+ $("#character_name_pole").val(create_save_name);
+ $("#description_textarea").val(create_save_description);
+ $("#personality_textarea").val(create_save_personality);
+ $("#firstmessage_textarea").val(create_save_first_message);
+ $("#talkativeness_slider").val(create_save_talkativeness);
+ $("#scenario_pole").val(create_save_scenario);
+ if ($.trim(create_save_mes_example).length == 0) {
+ $("#mes_example_textarea").val('
');
+ } else {
+ $("#mes_example_textarea").val(create_save_mes_example);
+ }
+ $("#avatar_div").css("display", "grid");
+ $("#avatar_load_preview").attr('src', default_avatar);
+ $("#name_div").css("display", "block");
+
+ $("#form_create").attr("actiontype", "createcharacter");
+ }
+ function select_rm_characters() {
+ /* QuickRefresh(true); */
+
+ if (prev_selected_char) {
+ let newChId = characters.findIndex(x => x.name == prev_selected_char);
+ $(`.character_select[chid="${newChId}"]`).trigger('click');
+ prev_selected_char = null;
+ }
+
+ menu_type = 'characters';
+ $("#rm_characters_block").css("display", "block");
+ $('#rm_characters_block').css('opacity', 0.0);
+ $('#rm_characters_block').transition({
+ opacity: 1.0,
+ duration: animation_rm_duration,
+ easing: animation_rm_easing,
+ complete: function () { }
+ });
+
+ $("#rm_api_block").css("display", "none");
+ $("#rm_ch_create_block").css("display", "none");
+ $("#rm_info_block").css("display", "none");
+ $("#rm_group_chats_block").css("display", "none");
+
+ $("#rm_button_characters").css("class", "selected-right-tab");
+ $("#rm_button_settings").css("class", "deselected-right-tab");
+ $("#rm_button_selected_ch").css("class", "deselected-right-tab");
+ }
+
+
+import { encode, decode } from "../scripts/gpt-2-3-tokenizer/mod.js";
+$(document).ready(function () {
+
+
+
+
+/* //RossAscends: a smaller load-up function to be used instead of refreshing the page in cases like deleting a character and changing username
function QuickRefresh() {
flushSettings();
clearChat();
@@ -287,7 +2894,7 @@ $(document).ready(function () {
if (NavToggle.checked === false) {
document.getElementById('nav-toggle').click();
};
- }
+ } */
$('#character_search_bar').on('input', function () {
const searchValue = $(this).val().trim().toLowerCase();
@@ -304,7 +2911,7 @@ $(document).ready(function () {
});
- //RossAscends: a utility function for counting characters, even works for unsaved characters.
+/* //RossAscends: a utility function for counting characters, even works for unsaved characters.
function CountCharTokens() {
$('#result_info').html('');
if (selected_button == 'create') {
@@ -320,721 +2927,11 @@ $(document).ready(function () {
} else {
$('#result_info').html("" + count_tokens + " Tokens(TOO MANY TOKENS) ");
}
- }
+ } */
$('#characloud_url').click(function () {
window.open('https://boosty.to/tavernai', '_blank');
});
- function checkOnlineStatus() {
- //console.log(online_status);
- if (online_status == 'no_connection') {
- $("#send_textarea").attr('placeholder', "Not connected to API!"); //Input bar placeholder tells users they are not connected
- $("#send_form").css("background-color", "rgba(100,0,0,0.7)"); //entire input form area is red when not connected
- $("#send_but").css("display", "none"); //send button is hidden when not connected
-
- $("#online_status_indicator2").css("background-color", "red");
- $("#online_status_text2").html("No connection...");
- $("#online_status_indicator3").css("background-color", "red");
- $("#online_status_text3").html("No connection...");
- is_get_status = false;
- is_get_status_novel = false;
- } else {
- $("#send_textarea").attr('placeholder', 'Type a message...'); //on connect, placeholder tells user to type message
- $("#send_form").css("background-color", "rgba(0,0,0,0.7)"); //on connect, form BG changes to transprent black
- $("#send_but").css("display", "inline"); //on connect, send button shows up
-
- $("#online_status_indicator2").css("background-color", "green");
- $("#online_status_text2").html(online_status);
- $("#online_status_indicator3").css("background-color", "green");
- $("#online_status_text3").html(online_status);
- $("#online_status_indicator4").css("background-color", "green");
- $("#online_status_text4").html(online_status);
- }
- }
- async function getLastVersion() {
-
- jQuery.ajax({
- type: 'POST', //
- url: '/getlastversion', //
- data: JSON.stringify({
- '': ''
- }),
- beforeSend: function () {
-
-
- },
- cache: false,
- dataType: "json",
- contentType: "application/json",
- //processData: false,
- success: function (data) {
- var getVersion = data.version;
- if (getVersion !== 'error' && getVersion != undefined) {
- if (compareVersions(getVersion, VERSION) === 1) {
- $('#verson').append(' (v.' + getVersion + ') ');
- }
- }
-
- },
- error: function (jqXHR, exception) {
- console.log(exception);
- console.log(jqXHR);
-
- }
- });
-
- }
- async function getStatus() {
- if (is_get_status) {
- jQuery.ajax({
- type: 'POST', //
- url: '/getstatus', //
- data: JSON.stringify({
- api_server: (main_api == "kobold" ? api_server : api_server_textgenerationwebui),
- main_api: main_api,
- }),
- beforeSend: function () {
- if (is_api_button_press) {
- //$("#api_loading").css("display", 'inline-block');
- //$("#api_button").css("display", 'none');
- }
- //$('#create_button').attr('value','Creating...'); //
-
- },
- cache: false,
- dataType: "json",
- crossDomain: true,
- contentType: "application/json",
- //processData: false,
- success: function (data) {
- online_status = data.result;
- if (online_status == undefined) {
- online_status = 'no_connection';
- }
- if (online_status.toLowerCase().indexOf('pygmalion') != -1) {
- is_pygmalion = true;
- online_status += " (Pyg. formatting on)";
- } else {
- is_pygmalion = false;
- }
-
- //console.log(online_status);
- resultCheckStatus();
- if (online_status !== 'no_connection') {
- var checkStatusNow = setTimeout(getStatus, 3000);//getStatus();
- }
- },
- error: function (jqXHR, exception) {
- console.log(exception);
- console.log(jqXHR);
- online_status = 'no_connection';
-
- resultCheckStatus();
- }
- });
- } else {
- if (is_get_status_novel != true) {
- online_status = 'no_connection';
- }
- }
- }
- function resultCheckStatus() {
- is_api_button_press = false;
- checkOnlineStatus();
- $("#api_loading").css("display", 'none');
- $("#api_button").css("display", 'inline-block');
- $("#api_loading_textgenerationwebui").css("display", 'none');
- $("#api_button_textgenerationwebui").css("display", 'inline-block');
- }
-
- async function getSoftPromptsList() {
- if (!api_server) {
- return;
- }
-
- const response = await fetch('/getsoftprompts', {
- method: 'POST',
- headers: {
- "Content-Type": "application/json",
- "X-CSRF-Token": token,
- },
- body: JSON.stringify({ api_server: api_server }),
- });
-
- if (response.ok) {
- const data = await response.json();
- updateSoftPromptsList(data.soft_prompts);
- }
- }
-
- function clearSoftPromptsList() {
- $('#softprompt option[value!=""]').each(function () {
- $(this).remove();
- });
- }
-
- function updateSoftPromptsList(soft_prompts) {
- // Delete SPs removed from Kobold
- $('#softprompt option').each(function () {
- const value = $(this).attr('value');
-
- if (value == '') {
- return;
- }
-
- const prompt = soft_prompts.find(x => x.name === value);
- if (!prompt) {
- $(this).remove();
- }
- });
-
- // Add SPs added to Kobold
- soft_prompts.forEach((prompt) => {
- if ($(`#softprompt option[value="${prompt.name}"]`).length === 0) {
- $('#softprompt').append(`${prompt.name} `);
-
- if (prompt.selected) {
- $('#softprompt').val(prompt.name);
- }
- }
- });
-
- // No SP selected or no SPs
- if (soft_prompts.length === 0 || !(soft_prompts.some(x => x.selected))) {
- $('#softprompt').val('');
- }
- }
-
- function printCharacters() {
- //console.log('printCharacters() entered');
-
- $("#rm_print_characters_block").empty();
- //console.log('printCharacters() -- sees '+characters.length+' characters.');
- characters.forEach(function (item, i, arr) {
-
- var this_avatar = default_avatar;
- if (item.avatar != 'none') {
- this_avatar = "characters/" + item.avatar + "?" + Date.now();
-
- } //RossAscends: changed 'prepend' to 'append' to make alphabetical sorting display correctly.
- $("#rm_print_characters_block").append('');
- //console.log('printcharacters() -- printing -- ChID '+i+' ('+item.name+')');
- });
- printGroups();
-
- }
-
- function printGroups() {
- for (let group of groups) {
- const template = $('#group_list_template .group_select').clone();
- template.data('id', group.id);
- template.find('.ch_name').html(group.name);
- $('#rm_print_characters_block').prepend(template);
- updateGroupAvatar(group);
- }
- }
-
- function updateGroupAvatar(group) {
- $('#rm_print_characters_block .group_select').each(function () {
- if ($(this).data('id') == group.id) {
- const avatar = getGroupAvatar(group);
- if (avatar) {
- $(this).find('.avatar').replaceWith(avatar);
- }
- }
- })
- }
-
- function getGroupAvatar(group) {
- const memberAvatars = [];
- if (group && Array.isArray(group.members) && group.members.length) {
- for (const member of group.members) {
- const charIndex = characters.findIndex(x => x.name === member);
- if (charIndex !== -1 && characters[charIndex].avatar !== 'none') {
- const this_avatar = `characters/${characters[charIndex].avatar}#${Date.now()}`;
- memberAvatars.push(this_avatar);
- }
- if (memberAvatars.length === 4) {
- break;
- }
- }
- }
-
- // Cohee: there's probably a smarter way to do this..
- if (memberAvatars.length === 1) {
- const groupAvatar = $('#group_avatars_template .collage_1').clone();
- groupAvatar.find('.img_1').attr('src', memberAvatars[0]);
- return groupAvatar;
- }
-
- if (memberAvatars.length === 2) {
- const groupAvatar = $('#group_avatars_template .collage_2').clone();
- groupAvatar.find('.img_1').attr('src', memberAvatars[0]);
- groupAvatar.find('.img_2').attr('src', memberAvatars[1]);
- return groupAvatar;
- }
-
- if (memberAvatars.length === 3) {
- const groupAvatar = $('#group_avatars_template .collage_3').clone();
- groupAvatar.find('.img_1').attr('src', memberAvatars[0]);
- groupAvatar.find('.img_2').attr('src', memberAvatars[1]);
- groupAvatar.find('.img_3').attr('src', memberAvatars[2]);
- return groupAvatar;
- }
-
- if (memberAvatars.length === 4) {
- const groupAvatar = $('#group_avatars_template .collage_4').clone();
- groupAvatar.find('.img_1').attr('src', memberAvatars[0]);
- groupAvatar.find('.img_2').attr('src', memberAvatars[1]);
- groupAvatar.find('.img_3').attr('src', memberAvatars[2]);
- groupAvatar.find('.img_4').attr('src', memberAvatars[3]);
- return groupAvatar;
- }
-
- // default avatar
- const groupAvatar = $('#group_avatars_template .collage_1').clone();
- groupAvatar.find('.img_1').attr('src', group.avatar_url);
- return groupAvatar;
- }
-
- async function getCharacters() {
- await getGroups();
-
- //console.log('getCharacters() -- entered');
- //console.log(characters);
- var response = await fetch("/getcharacters", { //RossAscends: changed from const
- method: "POST",
- headers: {
- "Content-Type": "application/json",
- "X-CSRF-Token": token
- },
- body: JSON.stringify({
- "": ""
- })
- });
- if (response.ok === true) {
-
- var getData = ''; //RossAscends: reset to force array to update to account for deleted character.
- var getData = await response.json(); //RossAscends: changed from const
- //console.log(getData);
-
- //var aa = JSON.parse(getData[0]);
-
- var load_ch_count = Object.getOwnPropertyNames(getData); //RossAscends: change from const to create dynamic character load amounts.
- var charCount = load_ch_count.length;
- //console.log('/getcharacters -- expecting to load '+charCount+' characters.')
- for (var i = 0; i < load_ch_count.length; i++) {
- characters[i] = [];
- characters[i] = getData[i];
- //console.log('/getcharacters -- loaded character #'+(i+1)+' ('+characters[i].name+')');
- }
- //RossAscends: updated character sorting to be alphabetical
- characters.sort(function (a, b) {
- //console.log('sorting characters: '+a.name+' vs '+b.name);
- if (a.name < b.name) {
- return -1
- }
- if (a.name > b.name) {
- return 1;
- }
- return 0;
-
- });
- //console.log(characters);
-
- //characters.reverse();
- //console.log('/getcharacters -- this_chid -- '+this_chid);
- if (this_chid != undefined && this_chid != 'invalid-safety-id') {
- $("#avatar_url_pole").val(characters[this_chid].avatar);
- }
-
-
- //console.log('/getcharacters -- sending '+i+' characters to /printcharacters');
- printCharacters();
- //console.log(propOwn.length);
- //return JSON.parse(getData[0]);
- //const getData = await response.json();
- //var getMessage = getData.results[0].text;
- }
- }
- async function getBackgrounds() {
-
- const response = await fetch("/getbackgrounds", {
- method: "POST",
- headers: {
- "Content-Type": "application/json",
- "X-CSRF-Token": token
- },
- body: JSON.stringify({
- "": ""
- })
-
- });
- if (response.ok === true) {
- const getData = await response.json();
- //background = getData;
- //console.log(getData.length);
- for (var i = 0; i < getData.length; i++) {
- //console.log(1);
- $("#bg_menu_content").append("");
- }
- //var aa = JSON.parse(getData[0]);
- //const load_ch_coint = Object.getOwnPropertyNames(getData);
-
-
- }
- }
- async function isColab() {
- is_checked_colab = true;
- const response = await fetch("/iscolab", {
- method: "POST",
- headers: {
- "Content-Type": "application/json",
- "X-CSRF-Token": token
- },
- body: JSON.stringify({
- "": ""
- })
-
- });
- if (response.ok === true) {
- const getData = await response.json();
- if (getData.colaburl != false) {
- $('#colab_shadow_popup').css('display', 'none');
- is_colab = true;
- let url = String(getData.colaburl).split("flare.com")[0] + "flare.com";
- url = String(url).split("loca.lt")[0] + "loca.lt";
- $('#api_url_text').val(url);
- setTimeout(function () {
- $('#api_button').click();
- }, 2000);
- }
-
-
- }
- }
- async function setBackground(bg) {
- /*
- const response = await fetch("/setbackground", {
- method: "POST",
- headers: { "Content-Type": "application/json" },
- body: JSON.stringify({
- "bg": bg
- })
-
- });
- if (response.ok === true) {
- //const getData = await response.json();
- //background = getData;
-
- //var aa = JSON.parse(getData[0]);
- //const load_ch_coint = Object.getOwnPropertyNames(getData);
- }*/
- //console.log(bg);
- jQuery.ajax({
- type: 'POST', //
- url: '/setbackground', //
- data: JSON.stringify({
- bg: bg
- }),
- beforeSend: function () {
- //$('#create_button').attr('value','Creating...'); //
- },
- cache: false,
- dataType: "json",
- contentType: "application/json",
- //processData: false,
- success: function (html) {
- //setBackground(html);
- //$('body').css('background-image', 'linear-gradient(rgba(19,21,44,0.75), rgba(19,21,44,0.75)), url('+e.target.result+')');
- //$("#form_bg_download").after("");
- },
- error: function (jqXHR, exception) {
- console.log(exception);
- console.log(jqXHR);
- }
- });
- }
- async function delBackground(bg) {
- const response = await fetch("/delbackground", {
- method: "POST",
- headers: {
- "Content-Type": "application/json",
- "X-CSRF-Token": token
- },
- body: JSON.stringify({
- "bg": bg
- })
-
- });
- if (response.ok === true) {
- //const getData = await response.json();
- //background = getData;
-
- //var aa = JSON.parse(getData[0]);
- //const load_ch_coint = Object.getOwnPropertyNames(getData);
-
-
- }
- }
- function printMessages() {
- //console.log(chat);
- //console.log('printMessages() -- printing messages for -- '+this_chid+' '+active_character+' '+characters[this_chid]);
- chat.forEach(function (item, i, arr) {
- addOneMessage(item);
- });
- }
- function clearChat() {
- count_view_mes = 0;
- extension_prompts = {};
- $('#chat').html('');
- }
- function messageFormating(mes, ch_name, isSystem, forceAvatar) {
- if (this_chid != undefined && !isSystem) mes = mes.replaceAll("<", "<").replaceAll(">", ">");//for Chloe
- if (this_chid === undefined) {
- mes = mes.replace(/\*\*(.+?)\*\*/g, '$1 ').replace(/\*(.+?)\*/g, '$1 ').replace(/\n/g, ' ');
-
- } else if (!isSystem) {
- mes = converter.makeHtml(mes);
- mes = mes.replace(/{([^}]+)}/g, '');
- mes = mes.replace(/\n/g, ' ');
- mes = mes.trim();
- }
-
- if (forceAvatar) {
- mes = mes.replaceAll(ch_name + ":", "");
- }
-
- if (ch_name !== name1) {
- mes = mes.replaceAll(name2 + ":", "");
- }
- return mes;
- }
- function appendImageToMessage(mes, messageElement) {
- if (mes.extra?.image) {
- const image = document.createElement('img');
- image.src = mes.extra?.image;
- image.classList.add('img_extra');
- messageElement.find('.mes_text').prepend(image);
- }
- }
- function addOneMessage(mes) {
- //var message = mes['mes'];
- //message = mes['mes'].replace(/^\s+/g, '');
- //console.log(message.indexOf(name1+":"));
- var messageText = mes['mes'];
- var characterName = name1;
- var avatarImg = "User Avatars/" + user_avatar;
- const isSystem = mes.is_system;
- generatedPromtCache = '';
- //thisText = thisText.split("\n").join(" ");
- var avatarImg = "User Avatars/" + user_avatar;
- if (!mes['is_user']) {
- if (mes.force_avatar) {
- avatarImg = mes.force_avatar;
- }
- else if (this_chid == undefined || this_chid == "invalid-safety-id") {
- avatarImg = "img/chloe.png";
- }
- else {
- if (characters[this_chid].avatar != 'none') {
- avatarImg = "characters/" + characters[this_chid].avatar;
- if (is_mes_reload_avatar !== false) {
- avatarImg += "?" + is_mes_reload_avatar;
- //console.log(avatarImg);
- }
- } else {
- avatarImg = "img/fluffy.png";
- }
- }
-
- characterName = mes.is_system || mes.force_avatar ? mes.name : name2;
- }
-
- //Formating
- //messageText = messageText.replace(/\*\*(.+?)\*\*/g, '$1 ').replace(/\*(.+?)\*/g, '$1 ').replace(/\n/g, ' ');
- //if(characterName != name1){
- //messageText = messageText.replaceAll(name2+":", "");
- //}
- //console.log(messageText);
- if (count_view_mes == 0) {
- messageText = messageText.replace(/{{user}}/gi, name1);
- messageText = messageText.replace(/{{char}}/gi, name2);
- messageText = messageText.replace(//gi, name1);
- messageText = messageText.replace(//gi, name2);
- }
- messageText = messageFormating(messageText, characterName, isSystem, mes.force_avatar);
- const bias = messageFormating(mes.extra?.bias ?? '');
-
- $("#chat").append("`);
-
- const newMessage = $(`#chat [mesid="${count_view_mes}"]`);
- newMessage.data('isSystem', isSystem);
-
- appendImageToMessage(mes, newMessage);
-
- if (isSystem) {
- newMessage.find('.mes_edit').hide();
- }
-
- if (!if_typing_text) {
- //console.log(messageText);
- $("#chat").children().filter('[mesid="' + count_view_mes + '"]').children('.mes_block').children('.mes_text').append(messageText);
- } else {
- typeWriter($("#chat").children().filter('[mesid="' + count_view_mes + '"]').children('.mes_block').children('.mes_text'), messageText, 50, 0);
- }
- count_view_mes++;
- if (!add_mes_without_animation) {
- $('#chat').children().last().css("opacity", 1.0);
- $('#chat').children().last().transition({
- opacity: 1.0,
- duration: 700,
- easing: "",
- complete: function () { }
- });
- } else {
- add_mes_without_animation = false;
- }
- var $textchat = $('#chat');
- $textchat.scrollTop($textchat[0].scrollHeight);
- }
- function typeWriter(target, text, speed, i) {
- if (i < text.length) {
- //target.append(text.charAt(i));
- target.html(target.html() + text.charAt(i));
- i++;
- setTimeout(() => typeWriter(target, text, speed, i), speed);
- }
- }
- function newMesPattern(name) { //Patern which denotes a new message
- name = name + ':';
- return name;
- }
-
- function substituteParams(content) {
- content = content.replace(/{{user}}/gi, name1);
- content = content.replace(/{{char}}/gi, name2);
- content = content.replace(//gi, name1);
- content = content.replace(//gi, name2);
- return content;
- }
-
- function checkWorldInfo(chat) {
- if (world_info_data.entries.length == 0) {
- return '';
- }
-
- const messagesToLookBack = world_info_depth * 2;
- let textToScan = chat.slice(0, messagesToLookBack).join('').toLowerCase();
- let worldInfoBefore = '';
- let worldInfoAfter = '';
- let needsToScan = true;
- let allActivatedEntries = new Set();
-
- const sortedEntries = Object.keys(world_info_data.entries).map(x => world_info_data.entries[x]).sort((a, b) => b.order - a.order);
- while (needsToScan) {
- let activatedNow = new Set();
-
- for (let entry of sortedEntries) {
- if (allActivatedEntries.has(entry.uid)) {
- continue;
- }
-
- if (entry.constant) {
- activatedNow.add(entry.uid);
- }
-
- if (Array.isArray(entry.key) && entry.key.length) {
- primary: for (let key of entry.key) {
- if (key && textToScan.includes(key.trim().toLowerCase())) {
- if (entry.selective && Array.isArray(entry.keysecondary) && entry.keysecondary.length) {
- secondary: for (let keysecondary of entry.keysecondary) {
- if (keysecondary && textToScan.includes(keysecondary.trim().toLowerCase())) {
- activatedNow.add(entry.uid);
- break secondary;
- }
- }
- } else {
- activatedNow.add(entry.uid);
- break primary;
- }
- }
- }
- }
- }
-
- needsToScan = activatedNow.size > 0;
- const newEntries = [...activatedNow]
- .map(x => world_info_data.entries[x])
- .sort((a, b) => sortedEntries.indexOf(a) - sortedEntries.indexOf(b));
-
- for (const entry of newEntries) {
- if (entry.position === world_info_position.after) {
- worldInfoAfter = `${substituteParams(entry.content)}\n${worldInfoAfter}`;
- }
- else {
- worldInfoBefore = `${substituteParams(entry.content)}\n${worldInfoBefore}`;
- }
-
- if (encode(worldInfoBefore + worldInfoAfter).length >= world_info_budget) {
- needsToScan = false;
- break;
- }
- }
-
- if (needsToScan) {
- textToScan = newEntries.map(x => x.content).join('\n').toLowerCase() + textToScan;
- }
-
- allActivatedEntries = new Set([...allActivatedEntries, ...activatedNow]);
- }
-
- return { worldInfoBefore, worldInfoAfter };
- }
-
- function isHelpRequest(message) {
- const helpTokens = ['/?', '/help'];
- return helpTokens.includes(message.trim().toLowerCase());
- }
-
- function sendSystemMessage(type, text) {
- const systemMessage = system_messages[type];
-
- if (!systemMessage) {
- return;
- }
-
- const newMessage = { ...systemMessage, 'send_date': humanizedISO8601DateTime() };
-
- if (text) {
- newMessage.mes = text;
- }
-
- chat.push(newMessage);
- addOneMessage(newMessage);
- is_send_press = false;
- }
-
- function extractMessageBias(message) {
- if (!message) {
- return null;
- }
-
- const found = [];
- const rxp = /{([^}]+)}/g;
- let curMatch;
-
- while (curMatch = rxp.exec(message)) {
- found.push(curMatch[1].trim());
- }
-
- if (!found.length) {
- return '';
- }
-
- return ` ${found.join(' ')} `;
- }
-
$("#send_but").click(function () {
//$( "#send_but" ).css({"background": "url('img/load.gif')","background-size": "100%, 100%", "background-position": "center center"});
if (is_send_press == false) {
@@ -1043,774 +2940,6 @@ $(document).ready(function () {
Generate();
}
});
- async function Generate(type, automatic_trigger) {//encode("dsfs").length
- tokens_already_generated = 0;
- message_already_generated = name2 + ': ';
-
- if (isHelpRequest($("#send_textarea").val())) {
- sendSystemMessage(system_message_types.HELP);
- $("#send_textarea").val('').trigger('input');
- return;
- }
-
- if (selected_group && !is_group_generating) {
- generateGroupWrapper(false);
- return;
- }
-
- if (online_status != 'no_connection' && this_chid != undefined && this_chid !== 'invalid-safety-id') {
- if (type !== 'regenerate') {
- var textareaText = $("#send_textarea").val();
- //console.log('Not a Regenerate call, so posting normall with input of: ' +textareaText);
- $("#send_textarea").val('').trigger('input');
-
- } else {
- //console.log('Regenerate call detected')
- var textareaText = "";
- if (chat[chat.length - 1]['is_user']) {//If last message from You
-
- } else {
- //console.log('about to remove last msg')
- chat.length = chat.length - 1;
- count_view_mes -= 1;
- //console.log('removing last msg')
- $('#chat').children().last().remove();
- }
- }
-
- $("#send_but").css("display", "none");
- $("#loading_mes").css("display", "inline-block");
-
- let promptBias = null;
- let messageBias = extractMessageBias(textareaText);
-
- // gets bias of the latest message where it was applied
- for (let mes of chat) {
- if (mes && mes.is_user && mes.extra && mes.extra.bias) {
- promptBias = mes.extra.bias;
- }
- }
-
- // bias from the latest message is top priority
- promptBias = messageBias ?? promptBias ?? '';
-
- var storyString = "";
- var userSendString = "";
- var finalPromt = "";
-
- var postAnchorChar = "talks a lot with descriptions";//'Talk a lot with description what is going on around';// in asterisks
- var postAnchorStyle = "Writing style: very long messages";//"[Genre: roleplay chat][Tone: very long messages with descriptions]";
-
-
- var anchorTop = '';
- var anchorBottom = '';
- var topAnchorDepth = 8;
-
- if (character_anchor && !is_pygmalion) {
- if (anchor_order === 0) {
- anchorTop = name2 + " " + postAnchorChar;
- } else {
- anchorBottom = "[" + name2 + " " + postAnchorChar + "]";
- }
- }
- if (style_anchor && !is_pygmalion) {
- if (anchor_order === 1) {
- anchorTop = postAnchorStyle;
- } else {
- anchorBottom = "[" + postAnchorStyle + "]";
- }
- }
-
- //*********************************
- //PRE FORMATING STRING
- //*********************************
- if (textareaText != "" && !automatic_trigger) {
- chat[chat.length] = {};
- chat[chat.length - 1]['name'] = name1;
- chat[chat.length - 1]['is_user'] = true;
- chat[chat.length - 1]['is_name'] = true;
- chat[chat.length - 1]['send_date'] = humanizedISO8601DateTime();
- chat[chat.length - 1]['mes'] = textareaText;
- chat[chat.length - 1]['extra'] = {};
-
- if (messageBias) {
- chat[chat.length - 1]['extra']['bias'] = messageBias;
- }
-
- addOneMessage(chat[chat.length - 1]);
- }
- var chatString = '';
- var arrMes = [];
- var mesSend = [];
- var charDescription = $.trim(characters[this_chid].description);
- var charPersonality = $.trim(characters[this_chid].personality);
- var Scenario = $.trim(characters[this_chid].scenario);
- var mesExamples = $.trim(characters[this_chid].mes_example);
- var checkMesExample = $.trim(mesExamples.replace(//gi, ''));//for check length without tag
- if (checkMesExample.length == 0) mesExamples = '';
- var mesExamplesArray = [];
- //***Base replace***
- if (mesExamples !== undefined) {
- if (mesExamples.length > 0) {
- if (is_pygmalion) {
- mesExamples = mesExamples.replace(/{{user}}:/gi, 'You:');
- mesExamples = mesExamples.replace(/:/gi, 'You:');
- }
- mesExamples = mesExamples.replace(/{{user}}/gi, name1);
- mesExamples = mesExamples.replace(/{{char}}/gi, name2);
- mesExamples = mesExamples.replace(//gi, name1);
- mesExamples = mesExamples.replace(//gi, name2);
- //mesExamples = mesExamples.replaceAll('', '[An example of how '+name2+' responds]');
- let blocks = mesExamples.split(//gi);
- mesExamplesArray = blocks.slice(1).map(block => `\n${block.trim()}\n`);
- }
- }
- if (charDescription !== undefined) {
- if (charDescription.length > 0) {
- charDescription = charDescription.replace(/{{user}}/gi, name1);
- charDescription = charDescription.replace(/{{char}}/gi, name2);
- charDescription = charDescription.replace(//gi, name1);
- charDescription = charDescription.replace(//gi, name2);
- }
- }
- if (charPersonality !== undefined) {
- if (charPersonality.length > 0) {
- charPersonality = charPersonality.replace(/{{user}}/gi, name1);
- charPersonality = charPersonality.replace(/{{char}}/gi, name2);
- charPersonality = charPersonality.replace(//gi, name1);
- charPersonality = charPersonality.replace(//gi, name2);
- }
- }
- if (Scenario !== undefined) {
- if (Scenario.length > 0) {
- Scenario = Scenario.replace(/{{user}}/gi, name1);
- Scenario = Scenario.replace(/{{char}}/gi, name2);
- Scenario = Scenario.replace(//gi, name1);
- Scenario = Scenario.replace(//gi, name2);
- }
- }
-
-
- if (is_pygmalion) {
- if (charDescription.length > 0) {
- storyString = name2 + "'s Persona: " + charDescription + "\n";
- }
- if (charPersonality.length > 0) {
- storyString += 'Personality: ' + charPersonality + '\n';
- }
- if (Scenario.length > 0) {
- storyString += 'Scenario: ' + Scenario + '\n';
- }
- } else {
- if (charDescription !== undefined) {
- if (charPersonality.length > 0) {
- charPersonality = name2 + "'s personality: " + charPersonality;//"["+name2+"'s personality: "+charPersonality+"]";
- }
- }
- if (charDescription !== undefined) {
- if ($.trim(charDescription).length > 0) {
- if (charDescription.slice(-1) !== ']' || charDescription.substr(0, 1) !== '[') {
- //charDescription = '['+charDescription+']';
- }
- storyString += charDescription + '\n';
- }
- }
-
- if (count_view_mes < topAnchorDepth) {
- storyString += charPersonality + '\n';
- }
-
-
- }
-
- var count_exm_add = 0;
- var chat2 = [];
- var j = 0;
- for (var i = chat.length - 1; i >= 0; i--) {
- if (j == 0) {
- chat[j]['mes'] = chat[j]['mes'].replace(/{{user}}/gi, name1);
- chat[j]['mes'] = chat[j]['mes'].replace(/{{char}}/gi, name2);
- chat[j]['mes'] = chat[j]['mes'].replace(//gi, name1);
- chat[j]['mes'] = chat[j]['mes'].replace(//gi, name2);
- }
- let this_mes_ch_name = '';
- if (chat[j]['is_user']) {
- this_mes_ch_name = name1;
- } else {
- this_mes_ch_name = name2;
- }
- if (chat[j]['is_name']) {
- chat2[i] = this_mes_ch_name + ': ' + chat[j]['mes'] + '\n';
- } else {
- chat2[i] = chat[j]['mes'] + '\n';
- }
- // system messages produce no text
- if (chat[j]['is_system']) {
- chat2[i] = '';
- }
- // replace bias markup
- chat2[i] = (chat2[i] ?? '').replace(/{([^}]+)}/g, '');
- j++;
- }
- //chat2 = chat2.reverse();
- var this_max_context = 1487;
- if (main_api == 'kobold') this_max_context = max_context;
- if (main_api == 'novel') {
- if (novel_tier === 1) {
- this_max_context = 1024;
- } else {
- this_max_context = 2048 - 60;//fix for fat tokens
- if (model_novel == 'krake-v2') {
- this_max_context -= 160;
- }
- }
- }
-
- let worldInfoString = '', worldInfoBefore = '', worldInfoAfter = '';
-
- if (world_info && world_info_data) {
- const activatedWorldInfo = checkWorldInfo(chat2);
- worldInfoBefore = activatedWorldInfo.worldInfoBefore;
- worldInfoAfter = activatedWorldInfo.worldInfoAfter;
- worldInfoString = worldInfoBefore + worldInfoAfter;
- }
-
- let extension_prompt = Object.keys(extension_prompts).sort().map(x => extension_prompts[x]).filter(x => x).join('\n');
- if (extension_prompt.length && !extension_prompt.endsWith('\n')) {
- extension_prompt += '\n';
- }
-
- var i = 0;
-
- for (var item of chat2) {//console.log(encode("dsfs").length);
- chatString = item + chatString;
- if (encode(JSON.stringify(worldInfoString + storyString + chatString + anchorTop + anchorBottom + charPersonality + promptBias + extension_prompt)).length + 120 < this_max_context) { //(The number of tokens in the entire promt) need fix, it must count correctly (added +120, so that the description of the character does not hide)
-
-
- //if (is_pygmalion && i == chat2.length-1) item='\n'+item;
- arrMes[arrMes.length] = item;
- } else {
- i = chat.length - 1;
- }
- await delay(1); //For disable slow down (encode gpt-2 need fix)
- //console.log(i+' '+chat.length);
- count_exm_add = 0;
- if (i == chat.length - 1) {
- //arrMes[arrMes.length-1] = '\n'+arrMes[arrMes.length-1];
- let mesExmString = '';
- for (let iii = 0; iii < mesExamplesArray.length; iii++) {//mesExamplesArray It need to make from end to start
- mesExmString = mesExmString + mesExamplesArray[iii];
- if (encode(JSON.stringify(worldInfoString + storyString + mesExmString + chatString + anchorTop + anchorBottom + charPersonality + promptBias + extension_prompt)).length + 120 < this_max_context) { //example of dialogs
- if (!is_pygmalion) {
- mesExamplesArray[iii] = mesExamplesArray[iii].replace(//i, 'This is how ' + name2 + ' should talk');//An example of how '+name2+' responds
- }
- count_exm_add++;
- await delay(1);
-
- //arrMes[arrMes.length] = item;
- } else {
-
- iii = mesExamplesArray.length;
- }
-
- }
-
- if (!is_pygmalion) {
- if (Scenario !== undefined) {
- if (Scenario.length > 0) {
- storyString += 'Circumstances and context of the dialogue: ' + Scenario + '\n';
- }
- }
- //storyString+='\nThen the roleplay chat between '+name1+' and '+name2+' begins.\n';
- }
- runGenerate();
- return;
- }
- i++;
-
-
- }
-
- function runGenerate(cycleGenerationPromt = '') {
-
-
- generatedPromtCache += cycleGenerationPromt;
- if (generatedPromtCache.length == 0) {
- chatString = "";
- arrMes = arrMes.reverse();
- var is_add_personality = false;
- arrMes.forEach(function (item, i, arr) {//For added anchors and others
-
- if (i >= arrMes.length - 1 && $.trim(item).substr(0, (name1 + ":").length) != name1 + ":") {
- if (textareaText == "") {
- item = item.substr(0, item.length - 1);
- }
- }
- if (i === arrMes.length - topAnchorDepth && count_view_mes >= topAnchorDepth && !is_add_personality) {
-
- is_add_personality = true;
- //chatString = chatString.substr(0,chatString.length-1);
- //anchorAndPersonality = "[Genre: roleplay chat][Tone: very long messages with descriptions]";
- if ((anchorTop != "" || charPersonality != "") && !is_pygmalion) {
- if (anchorTop != "") charPersonality += ' ';
- item += "[" + charPersonality + anchorTop + ']\n';
- }
- }
- if (i >= arrMes.length - 1 && count_view_mes > 8 && $.trim(item).substr(0, (name1 + ":").length) == name1 + ":" && !is_pygmalion) {//For add anchor in end
- item = item.substr(0, item.length - 1);
- //chatString+=postAnchor+"\n";//"[Writing style: very long messages]\n";
- item = item + anchorBottom + "\n";
- }
- if (is_pygmalion) {
- if (i >= arrMes.length - 1 && $.trim(item).substr(0, (name1 + ":").length) == name1 + ":") {//for add name2 when user sent
- item = item + name2 + ":";
- }
- if (i >= arrMes.length - 1 && $.trim(item).substr(0, (name1 + ":").length) != name1 + ":") {//for add name2 when continue
- if (textareaText == "") {
- item = item + '\n' + name2 + ":";
- }
- }
- if ($.trim(item).indexOf(name1) === 0) {
- item = item.replace(name1 + ':', 'You:');
- }
- }
- mesSend[mesSend.length] = item;
- //chatString = chatString+item;
- });
- }
- //finalPromt +=chatString;
- //console.log(storyString);
-
- //console.log(encode(characters[this_chid].description+chatString).length);
- //console.log(encode(JSON.stringify(characters[this_chid].description+chatString)).length);
- if (type == 'force_name2') {
- finalPromt += name2 + ':';
- }
- //console.log(JSON.stringify(storyString));
- //Send story string
- var mesSendString = '';
- var mesExmString = '';
-
- function setPromtString() {
- mesSendString = '';
- mesExmString = '';
- for (let j = 0; j < count_exm_add; j++) {
- mesExmString += mesExamplesArray[j];
- }
- for (let j = 0; j < mesSend.length; j++) {
- mesSendString += mesSend[j];
- }
- }
-
- function checkPromtSize() {
- setPromtString();
- let thisPromtContextSize = encode(JSON.stringify(worldInfoString + storyString + mesExmString + mesSendString + anchorTop + anchorBottom + charPersonality + generatedPromtCache + promptBias + extension_prompt)).length + 120;
-
- if (thisPromtContextSize > this_max_context) { //if the prepared prompt is larger than the max context size...
-
- if (count_exm_add > 0) { // ..and we have example mesages..
- //console.log('Context size: '+thisPromtContextSize+' -- too big, removing example message');
- //mesExamplesArray.length = mesExamplesArray.length-1;
- count_exm_add--; // remove the example messages...
- checkPromtSize(); // and try agin...
- } else if (mesSend.length > 0) { // if the chat history is longer than 0
- //console.log('Context size: '+thisPromtContextSize+' -- too big, removing oldest chat message');
- mesSend.shift(); // remove the first (oldest) chat entry..
- checkPromtSize(); // and check size again..
- } else {
- //end
- }
- }
- }
-
-
-
- if (generatedPromtCache.length > 0) {
- //console.log('Generated Prompt Cache length: '+generatedPromtCache.length);
- checkPromtSize();
- } else {
- setPromtString();
- }
-
- if (!is_pygmalion) {
- mesSendString = '\nThen the roleplay chat between ' + name1 + ' and ' + name2 + ' begins.\n' + mesSendString;
- } else {
- mesSendString = '\n' + mesSendString;
- //mesSendString = mesSendString; //This edit simply removes the first "" that is prepended to all context prompts
- }
- finalPromt = worldInfoBefore + storyString + worldInfoAfter + extension_prompt + mesExmString + mesSendString + generatedPromtCache + promptBias;
- finalPromt = finalPromt.replace(/\r/gm, '');
-
- //if we aren't using the kobold GUI settings...
- if (main_api == 'textgenerationwebui' || main_api == 'kobold' && preset_settings != 'gui') {
- var this_settings = koboldai_settings[koboldai_setting_names[preset_settings]];
-
- var this_amount_gen = parseInt(amount_gen); // how many tokens the AI will be requested to generate
- if (is_pygmalion) { // if we are using a pygmalion model...
- if (tokens_already_generated === 0) { // if nothing has been generated yet..
- if (parseInt(amount_gen) >= 50) { // if the max gen setting is > 50...(
- this_amount_gen = 50; // then only try to make 50 this cycle..
- }
- else {
- this_amount_gen = parseInt(amount_gen); // otherwise, make as much as the max amount request.
- }
- }
- else { // if we already recieved some generated text...
- if (parseInt(amount_gen) - tokens_already_generated < tokens_cycle_count) { // if the remaining tokens to be made is less than next potential cycle count
- this_amount_gen = parseInt(amount_gen) - tokens_already_generated; // subtract already generated amount from the desired max gen amount
- }
- else {
- this_amount_gen = tokens_cycle_count; // otherwise make the standard cycle amont (frist 50, and 30 after that)
- }
- }
- }
- }
-
- var generate_data;
- if (main_api == 'kobold') {
- var generate_data = { prompt: finalPromt, gui_settings: true, max_length: amount_gen, temperature: temp, max_context_length: max_context };
- if (preset_settings != 'gui') {
-
- generate_data = {
- prompt: finalPromt,
- gui_settings: false,
- sampler_order: this_settings.sampler_order,
- max_context_length: parseInt(max_context),//this_settings.max_length,
- max_length: this_amount_gen,//parseInt(amount_gen),
- rep_pen: parseFloat(rep_pen),
- rep_pen_range: parseInt(rep_pen_size),
- rep_pen_slope: this_settings.rep_pen_slope,
- temperature: parseFloat(temp),
- tfs: this_settings.tfs,
- top_a: this_settings.top_a,
- top_k: this_settings.top_k,
- top_p: this_settings.top_p,
- typical: this_settings.typical,
- s1: this_settings.sampler_order[0],
- s2: this_settings.sampler_order[1],
- s3: this_settings.sampler_order[2],
- s4: this_settings.sampler_order[3],
- s5: this_settings.sampler_order[4],
- s6: this_settings.sampler_order[5],
- s7: this_settings.sampler_order[6],
- use_world_info: false,
- };
- }
- }
-
- if (main_api == 'textgenerationwebui') {
- const doSample = textgenerationwebui_settings.penalty_alpha == 0;
- var generate_data = {
- data: [
- finalPromt,
- this_amount_gen, // min_length
- doSample, // do_sample
- textgenerationwebui_settings.temp, // temperature
- textgenerationwebui_settings.top_p, // top_p
- textgenerationwebui_settings.typical_p, // typical_p
- textgenerationwebui_settings.rep_pen, // repetition_penalty
- textgenerationwebui_settings.top_k, // top_k
- 0, // min_length
- textgenerationwebui_settings.rep_pen_size, // no_repeat_ngram_size
- 1, // num_beams
- textgenerationwebui_settings.penalty_alpha, // penalty_alpha
- 1, // length_penalty
- false, // early_stopping
- name1, // name1
- name2, // name2
- "", // Context
- true, // stop at newline
- max_context, // Maximum prompt size in tokens
- 1, // num attempts
- ]
- };
- }
-
- if (main_api == 'novel') {
- var this_settings = novelai_settings[novelai_setting_names[preset_settings_novel]];
- generate_data = {
- "input": finalPromt,
- "model": model_novel,
- "use_string": true,
- "temperature": parseFloat(temp_novel),
- "max_length": this_settings.max_length,
- "min_length": this_settings.min_length,
- "tail_free_sampling": this_settings.tail_free_sampling,
- "repetition_penalty": parseFloat(rep_pen_novel),
- "repetition_penalty_range": parseInt(rep_pen_size_novel),
- "repetition_penalty_frequency": this_settings.repetition_penalty_frequency,
- "repetition_penalty_presence": this_settings.repetition_penalty_presence,
- //"stop_sequences": {{187}},
- //bad_words_ids = {{50256}, {0}, {1}};
- //generate_until_sentence = true;
- "use_cache": false,
- //use_string = true;
- "return_full_text": false,
- "prefix": "vanilla",
- "order": this_settings.order
- };
- }
- var generate_url = '';
- if (main_api == 'kobold') {
- generate_url = '/generate';
- } else if (main_api == 'textgenerationwebui') {
- generate_url = '/generate_textgenerationwebui';
- } else if (main_api == 'novel') {
- generate_url = '/generate_novelai';
- }
- jQuery.ajax({
- type: 'POST', //
- url: generate_url, //
- data: JSON.stringify(generate_data),
- beforeSend: function () {
- //$('#create_button').attr('value','Creating...');
- },
- cache: false,
- dataType: "json",
- contentType: "application/json",
- success: function (data) {
- tokens_already_generated += this_amount_gen; // add new gen amt to any prev gen counter..
-
-
- //console.log('Tokens requested in total: '+tokens_already_generated);
- //$("#send_textarea").focus();
- //$("#send_textarea").removeAttr('disabled');
- is_send_press = false;
- if (!data.error) {
- //const getData = await response.json();
- var getMessage = "";
- if (main_api == 'kobold') {
- getMessage = data.results[0].text;
- } else if (main_api == 'textgenerationwebui') {
- getMessage = data.data[0];
- if (getMessage == null || data.error) {
- popup_type = 'default';
- callPopup('Got empty response from Text generation web UI. Try restarting the API with recommended options. ');
- return;
- }
- getMessage = getMessage.substring(finalPromt.length);
- } else if (main_api == 'novel') {
- getMessage = data.output;
- }
-
- if (collapse_newlines) {
- getMessage = getMessage.replaceAll(/\n+/g, "\n");
- }
-
- //Pygmalion run again // to make it continue generating so long as it's under max_amount and hasn't signaled
- // an end to the character's response via typing "You:" or adding ""
- if (is_pygmalion) {
- if_typing_text = false;
- message_already_generated += getMessage;
- promptBias = '';
- //console.log('AI Response so far: '+message_already_generated);
- if (message_already_generated.indexOf('You:') === -1 && //if there is no 'You:' in the response msg
- message_already_generated.indexOf('<|endoftext|>') === -1 && //if there is no stamp in the response msg
- tokens_already_generated < parseInt(amount_gen) && //if the gen'd msg is less than the max response length..
- getMessage.length > 0) { //if we actually have gen'd text at all...
- runGenerate(getMessage); //generate again with the 'GetMessage' argument..
- return;
- }
-
- getMessage = message_already_generated;
-
- }
- //Formating
- getMessage = $.trim(getMessage);
- if (is_pygmalion) {
- getMessage = getMessage.replace(new RegExp('', "g"), name1);
- getMessage = getMessage.replace(new RegExp('', "g"), name2);
- getMessage = getMessage.replace(new RegExp('You:', "g"), name1 + ':');
- }
- if (getMessage.indexOf(name1 + ":") != -1) {
- getMessage = getMessage.substr(0, getMessage.indexOf(name1 + ":"));
-
- }
- if (getMessage.indexOf('<|endoftext|>') != -1) {
- getMessage = getMessage.substr(0, getMessage.indexOf('<|endoftext|>'));
-
- }
- // clean-up group message from excessive generations
- if (type == 'group_chat' && selected_group) {
- const group = groups.find(x => x.id == selected_group);
-
- if (group && Array.isArray(group.members) && group.members) {
- for (let member of group.members) {
- // Skip current speaker.
- if (member === name2) {
- continue;
- }
-
- const indexOfMember = getMessage.indexOf(member + ":");
- if (indexOfMember != -1) {
- getMessage = getMessage.substr(0, indexOfMember);
- }
- }
- }
- }
- let this_mes_is_name = true;
- if (getMessage.indexOf(name2 + ":") === 0) {
- getMessage = getMessage.replace(name2 + ':', '');
- getMessage = getMessage.trimStart();
- } else {
- this_mes_is_name = false;
- }
- if (type === 'force_name2') this_mes_is_name = true;
- //getMessage = getMessage.replace(/^\s+/g, '');
- if (getMessage.length > 0) {
- chat[chat.length] = {};
- chat[chat.length - 1]['name'] = name2;
- chat[chat.length - 1]['is_user'] = false;
- chat[chat.length - 1]['is_name'] = this_mes_is_name;
- chat[chat.length - 1]['send_date'] = humanizedISO8601DateTime();
- getMessage = $.trim(getMessage);
- chat[chat.length - 1]['mes'] = getMessage;
-
- if (type === 'group_chat') {
- let avatarImg = 'img/fluffy.png';
- if (characters[this_chid].avatar != 'none') {
- avatarImg = `characters/${characters[this_chid].avatar}?${Date.now()}`;
- }
- chat[chat.length - 1]['is_name'] = true;
- chat[chat.length - 1]['force_avatar'] = avatarImg;
- }
-
- addOneMessage(chat[chat.length - 1]);
- $("#send_but").css("display", "inline");
- $("#loading_mes").css("display", "none");
-
- if (type == 'group_chat' && selected_group) {
- saveGroupChat(selected_group);
- } else {
- saveChat();
- }
- //console.log('/savechat called by /Generate');
- //let final_message_length = encode(JSON.stringify(getMessage)).length;
- //console.log('AI Response: +'+getMessage+ '('+final_message_length+' tokens)');
- } else {
- Generate('force_name2');
- }
- } else {
- $("#send_but").css("display", "inline");
- $("#loading_mes").css("display", "none");
- }
- },
- error: function (jqXHR, exception) {
-
- $("#send_textarea").removeAttr('disabled');
- is_send_press = false;
- $("#send_but").css("display", "inline");
- $("#loading_mes").css("display", "none");
- console.log(exception);
- console.log(jqXHR);
- }
- });
- }
- } else {
- if (this_chid == undefined || this_chid == 'invalid-safety-id') {
- //send ch sel
- popup_type = 'char_not_selected';
- callPopup('Сharacter is not selected ');
- }
- is_send_press = false;
- }
- }
- async function saveChat() {
- chat.forEach(function (item, i) {
- if (item['is_user']) {
- var str = item['mes'].replace(name1 + ':', default_user_name + ':');
- chat[i]['mes'] = str;
- chat[i]['name'] = default_user_name;
- }
- });
- var save_chat = [{ user_name: default_user_name, character_name: name2, create_date: chat_create_date }, ...chat];
- jQuery.ajax({
- type: 'POST',
- url: '/savechat',
- data: JSON.stringify({ ch_name: characters[this_chid].name, file_name: characters[this_chid].chat, chat: save_chat, avatar_url: characters[this_chid].avatar }),
- beforeSend: function () {
- //$('#create_button').attr('value','Creating...');
- },
- cache: false,
- dataType: "json",
- contentType: "application/json",
- success: function (data) {
-
- },
- error: function (jqXHR, exception) {
-
- console.log(exception);
- console.log(jqXHR);
- }
- });
- }
- async function getChat() {
- console.log('/getchat -- entered for -- ' + characters[this_chid].name);
- jQuery.ajax({
- type: 'POST',
- url: '/getchat',
- data: JSON.stringify({ ch_name: characters[this_chid].name, file_name: characters[this_chid].chat, avatar_url: characters[this_chid].avatar }),
- beforeSend: function () {
- //$('#create_button').attr('value','Creating...');
- },
- cache: false,
- dataType: "json",
- contentType: "application/json",
- success: function (data) {
- //console.log(data);
- //chat.length = 0;
- if (data[0] !== undefined) {
- for (let key in data) {
- chat.push(data[key]);
- }
- //chat = data;
- chat_create_date = chat[0]['create_date'];
- //console.log('/getchat saw chat_create_date: '+chat_create_date);
- chat.shift();
-
- } else {
- chat_create_date = humanizedISO8601DateTime();
- }
- //console.log(chat);
- getChatResult();
- saveChat();
- },
- error: function (jqXHR, exception) {
- getChatResult();
- console.log(exception);
- console.log(jqXHR);
- }
- });
- }
- function getChatResult() {
- name2 = characters[this_chid].name;
- if (chat.length > 1) {
-
- chat.forEach(function (item, i) {
- if (item['is_user']) {
- var str = item['mes'].replace(default_user_name + ':', name1 + ':');
- chat[i]['mes'] = str;
- chat[i]['name'] = name1;
- }
- });
-
-
- } else {
- //console.log(characters[this_chid].first_mes);
- chat[0] = {};
- chat[0]['name'] = name2;
- chat[0]['is_user'] = false;
- chat[0]['is_name'] = true;
- chat[0]['send_date'] = humanizedISO8601DateTime();
- if (characters[this_chid].first_mes != "") {
- chat[0]['mes'] = characters[this_chid].first_mes;
- } else {
- chat[0]['mes'] = default_ch_mes;
- }
- }
- printMessages();
- select_selected_character(this_chid);
- }
//hotkey to send input with enter (shift+enter generates a new line in the chat input box)
//this is not ideal for touch device users with virtual keyboards.
@@ -1827,7 +2956,7 @@ $(document).ready(function () {
}
});
- //RossAscends: Additional hotkeys
+/* //RossAscends: Additional hotkeys
document.addEventListener('keydown', (event) => {
if (event.ctrlKey && event.key == "Enter") { // Ctrl+Enter for Regeneration Last Response
@@ -1841,7 +2970,7 @@ $(document).ready(function () {
document.getElementById('api_button').click();
}
- });
+ }); */
//menu buttons setup
var selected_button_style = {};
@@ -1958,548 +3087,13 @@ $(document).ready(function () {
$('#rm_info_block').transition({ opacity: 1.0, duration: 2000 });
}
});
- async function generateGroupWrapper(by_auto_mode) {
- if (online_status === 'no_connection') {
- is_group_generating = false;
- is_send_press = false;
- return;
- }
- const group = groups.find(x => x.id === selected_group);
-
- if (!group || !Array.isArray(group.members) || !group.members.length) {
- sendSystemMessage(system_message_types.EMPTY);
- return;
- }
-
- try {
- is_group_generating = true;
- this_chid = undefined;
- name2 = '';
- const userInput = $("#send_textarea").val();
-
- let typingIndicator = $('#chat .typing_indicator');
-
- if (typingIndicator.length === 0) {
- typingIndicator = $('#typing_indicator_template .typing_indicator').clone();
- typingIndicator.hide();
- $('#chat').append(typingIndicator);
- }
-
- let messagesBefore = chat.length;
- let activationText = '';
- if (userInput && userInput.length && !by_auto_mode) {
- activationText = userInput;
- messagesBefore++;
- } else {
- const lastMessage = chat[chat.length - 1];
- if (lastMessage && !lastMessage.is_system) {
- activationText = lastMessage.mes;
- }
- }
-
- const activatedMembers = activateMembers(group.members, activationText);
- // now the real generation begins: cycle through every character
- for (const chId of activatedMembers) {
- this_chid = chId;
- name2 = characters[chId].name;
-
- await Generate('group_chat', by_auto_mode);
-
- // update indicator and scroll down
- typingIndicator.find('.typing_indicator_name').text(characters[chId].name);
- $('#chat').append(typingIndicator);
- typingIndicator.show(250, function () {
- typingIndicator.get(0).scrollIntoView({ behavior: 'smooth' });
- });
-
- while (true) {
- // check if message generated already
- if (chat.length == messagesBefore) {
- await delay(10);
- } else {
- messagesBefore++;
- break;
- }
- }
-
- // hide and reapply the indicator to the bottom of the list
- typingIndicator.hide(250);
- $('#chat').append(typingIndicator);
- }
-
- } finally {
- is_group_generating = false;
- is_send_press = false;
- this_chid = undefined;
- }
- }
- function activateMembers(members, input) {
- let activatedNames = [];
-
- // find mentions
- if (input && input.length) {
- for (let inputWord of extractAllWords(input)) {
- for (let member of members) {
- if (extractAllWords(member).includes(inputWord)) {
- activatedNames.push(member);
- break;
- }
- }
- }
- }
-
- // activation by talkativeness (in shuffled order)
- const shuffledMembers = shuffle([...members]);
- for (let member of shuffledMembers) {
- const character = characters.find(x => x.name === member);
-
- if (!character) {
- continue;
- }
-
- const rollValue = Math.random();
- let talkativeness = Number(character.talkativeness);
- talkativeness = Number.isNaN(talkativeness) ? talkativeness_default : talkativeness;
- if (talkativeness >= rollValue) {
- activatedNames.push(member);
- }
- }
-
- // pick 1 at random if no one was activated
- if (activatedNames.length === 0) {
- const randomIndex = Math.floor(Math.random() * members.length);
- activatedNames.push(members[randomIndex]);
- }
-
- // de-duplicate array of names
- activatedNames = activatedNames.filter(onlyUnique);
-
- // map to character ids
- const memberIds = activatedNames.map(x => characters.findIndex(y => y.name === x)).filter(x => x !== -1);
- return memberIds;
- }
- function extractAllWords(value) {
- const words = [];
-
- if (!value) {
- return words;
- }
-
- const matches = value.matchAll(/\b\w+\b/gmi);
- for (let match of matches) {
- words.push(match[0].toLowerCase());
- }
- return words;
- }
- async function getGroupChat(id) {
- const response = await fetch('/getgroupchat', {
- method: 'POST',
- headers: {
- "Content-Type": "application/json",
- "X-CSRF-Token": token,
- },
- body: JSON.stringify({ id: id }),
- });
-
- if (response.ok) {
- const data = await response.json();
- if (Array.isArray(data) && data.length) {
- for (let key of data) {
- chat.push(key);
- }
- printMessages();
- }
- else {
- sendSystemMessage(system_message_types.GROUP);
- const group = groups.find(x => x.id === id);
- if (group && Array.isArray(group.members)) {
- for (let name of group.members) {
- const character = characters.find(x => x.name === name);
-
- if (!character) {
- continue;
- }
-
- const mes = {};
- mes['is_user'] = false;
- mes['is_system'] = false;
- mes['name'] = character.name;
- mes['is_name'] = true;
- mes['send_date'] = humanizedISO8601DateTime();
- mes['mes'] = character.first_mes ? substituteParams(character.first_mes.trim()) : mes['mes'] = default_ch_mes;
- mes['force_avatar'] = character.avatar != 'none' ? `characters/${character.avatar}?${Date.now()}` : 'img/fluffy.png';
- chat.push(mes);
- addOneMessage(mes);
- }
- }
- }
-
- await saveGroupChat(id);
- }
- }
- async function saveGroupChat(id) {
- const response = await fetch('/savegroupchat', {
- method: 'POST',
- headers: {
- "Content-Type": "application/json",
- "X-CSRF-Token": token,
- },
- body: JSON.stringify({ id: id, chat: [...chat] })
- });
- }
- async function getGroups() {
- const response = await fetch('/getgroups', {
- method: 'POST',
- headers: {
- "Content-Type": "application/json",
- "X-CSRF-Token": token,
- },
- });
-
- if (response.ok) {
- const data = await response.json();
- groups = data.sort((a, b) => a.id - b.id);
- }
- }
- async function deleteGroup(id) {
- const response = await fetch('/deletegroup', {
- method: 'POST',
- headers: {
- "Content-Type": "application/json",
- "X-CSRF-Token": token,
- },
- body: JSON.stringify({ id: id }),
- });
-
- if (response.ok) {
- active_character = 'invalid-safety-id'; //unsets the chid in settings (this prevents AutoLoadChat from trying to load the wrong ChID
- this_chid = 'invalid-safety-id'; //unsets expected chid before reloading (related to getCharacters/printCharacters from using old arrays)
- selected_group = null;
- characters.length = 0; // resets the characters array, forcing getcharacters to reset
- name2 = "Chloe"; // replaces deleted charcter name with Chloe, since she wil be displayed next.
- chat = [...safetychat]; // sets up chloe to tell user about having deleted a character
-
- QuickRefresh();
- $('#rm_info_avatar').html('');
- $('#rm_info_block').transition({ opacity: 0, duration: 0 });
- select_rm_info("Group deleted!");
- $('#rm_info_block').transition({ opacity: 1.0, duration: 2000 });
- }
-
- }
- async function editGroup(id, immediately) {
- const group = groups.find(x => x.id == id);
-
- if (!group) {
- return;
- }
-
- async function _save() {
- const response = await fetch('/editgroup', {
- method: 'POST',
- headers: {
- "Content-Type": "application/json",
- "X-CSRF-Token": token,
- },
- body: JSON.stringify(group),
- });
- }
-
- if (immediately) {
- return await _save();
- }
-
- clearTimeout(timerGroupSave);
- timerGroupSave = setTimeout(async () => await _save(), durationSaveEdit);
- }
- async function groupChatAutoModeWorker() {
- if (!is_group_automode_enabled || online_status === 'no_connection') {
- return;
- }
-
- if (!selected_group || is_send_press || is_group_generating) {
- return;
- }
-
- const group = groups.find(x => x.id === selected_group);
-
- if (!group || !Array.isArray(group.members) || !group.members.length) {
- return;
- }
-
- await generateGroupWrapper(true);
- }
-
- function select_group_chats(chat_id) {
- menu_type = 'group_chats';
- const group = chat_id && groups.find(x => x.id == chat_id);
- const groupName = group?.name ?? '';
-
- $('#rm_group_chat_name').val(groupName);
- $('#rm_group_chat_name').off();
- $('#rm_group_chat_name').on('input', async function () {
- if (chat_id) {
- group.name = $(this).val();
- await editGroup(chat_id);
- }
- });
- $('#rm_group_filter').val('').trigger('input');
- $("#rm_group_chats_block").css("display", "flex");
- $('#rm_group_chats_block').css('opacity', 0.0);
- $('#rm_group_chats_block').transition({
- opacity: 1.0,
- duration: animation_rm_duration,
- easing: animation_rm_easing,
- complete: function () { }
- });
-
- $("#rm_ch_create_block").css("display", "none");
- $("#rm_characters_block").css("display", "none");
-
- async function memberClickHandler(event) {
- event.stopPropagation();
- const id = $(this).data('id');
- const isDelete = !!($(this).closest('#rm_group_members').length);
- const template = $(this).clone();
- template.data('id', id);
- template.click(memberClickHandler);
-
- if (isDelete) {
- template.find('.plus').show();
- template.find('.minus').hide();
- $('#rm_group_add_members').prepend(template);
- } else {
- template.find('.plus').hide();
- template.find('.minus').show();
- $('#rm_group_members').prepend(template);
- }
-
- if (group) {
- if (isDelete) {
- const index = group.members.findIndex(x => x === id);
- if (index !== -1) {
- group.members.splice(index, 1);
- }
- } else {
- group.members.push(id);
- }
- await editGroup(chat_id);
- updateGroupAvatar(group);
- }
-
- $(this).remove();
- const groupHasMembers = !!$('#rm_group_members').children().length;
- $("#rm_group_submit").prop('disabled', !groupHasMembers);
- }
-
- // render characters list
- $('#rm_group_add_members').empty();
- $('#rm_group_members').empty();
- for (let character of characters) {
- const avatar = character.avatar != 'none' ? `characters/${character.avatar}#${Date.now()}` : default_avatar;
- const template = $('#group_member_template .group_member').clone();
- template.data('id', character.name);
- template.find('.avatar img').attr('src', avatar);
- template.find('.ch_name').html(character.name);
- template.click(memberClickHandler);
-
- if (group && Array.isArray(group.members) && group.members.includes(character.name)) {
- template.find('.plus').hide();
- template.find('.minus').show();
- $('#rm_group_members').append(template);
- } else {
- template.find('.plus').show();
- template.find('.minus').hide();
- $('#rm_group_add_members').append(template);
- }
- }
-
- const groupHasMembers = !!$('#rm_group_members').children().length;
- $("#rm_group_submit").prop('disabled', !groupHasMembers);
-
- // bottom buttons
- if (chat_id) {
- $('#rm_group_submit').hide();
- $('#rm_group_delete').show();
- } else {
- $('#rm_group_submit').show();
- $('#rm_group_delete').hide();
- }
-
- $('#rm_group_delete').off();
- $('#rm_group_delete').on('click', function () {
- popup_type = 'del_group';
- $('#dialogue_popup').data('group_id', chat_id);
- callPopup('Delete the group? ');
- });
-
- // top bar
- if (group) {
- var display_name = groupName;
- $("#rm_button_selected_ch").children("h2").css(deselected_button_style);
- $("#rm_button_selected_ch").children("h2").text('');
- }
- }
$('#rm_group_automode').on('input', function () {
const value = $(this).prop('checked');
is_group_automode_enabled = value;
});
- function select_rm_create() {
- menu_type = 'create';
-
- //console.log('select_rm_Create() -- selected button: '+selected_button);
- if (selected_button == 'create') {
- if (create_save_avatar != '') {
- $("#add_avatar_button").get(0).files = create_save_avatar;
- read_avatar_load($("#add_avatar_button").get(0));
- }
- }
-
- $("#rm_characters_block").css("display", "none");
- $("#rm_api_block").css("display", "none");
- $("#rm_ch_create_block").css("display", "block");
- $("#rm_group_chats_block").css("display", "none");
-
- $('#rm_ch_create_block').css('opacity', 0.0);
- $('#rm_ch_create_block').transition({
- opacity: 1.0,
- duration: animation_rm_duration,
- easing: animation_rm_easing,
- complete: function () { }
- });
- $("#rm_info_block").css("display", "none");
-
- $("#delete_button_div").css("display", "none");
- $("#delete_button").css("display", "none");
- $("#export_button").css("display", "none");
- $("#create_button").css("display", "block");
- $("#create_button").attr("value", "Create");
- //RossAscends: commented this out as part of the auto-loading token counter
- //$('#result_info').html(' ');
- $("#rm_button_characters").css("class", "deselected-right-tab");
- $("#rm_button_settings").css("class", "deselected-right-tab");
- $("#rm_button_selected_ch").css("class", "deselected-right-tab");
-
- //create text poles
- $("#rm_button_back").css("display", "inline-block");
- $("#character_import_button").css("display", "inline-block");
- $("#character_popup_text_h3").text('Create character');
- $("#character_name_pole").val(create_save_name);
- $("#description_textarea").val(create_save_description);
- $("#personality_textarea").val(create_save_personality);
- $("#firstmessage_textarea").val(create_save_first_message);
- $("#talkativeness_slider").val(create_save_talkativeness);
- $("#scenario_pole").val(create_save_scenario);
- if ($.trim(create_save_mes_example).length == 0) {
- $("#mes_example_textarea").val('');
- } else {
- $("#mes_example_textarea").val(create_save_mes_example);
- }
- $("#avatar_div").css("display", "grid");
- $("#avatar_load_preview").attr('src', default_avatar);
- $("#name_div").css("display", "block");
-
- $("#form_create").attr("actiontype", "createcharacter");
- CountCharTokens();
- }
- function select_rm_characters() {
- QuickRefresh(true);
-
- if (prev_selected_char) {
- let newChId = characters.findIndex(x => x.name == prev_selected_char);
- $(`.character_select[chid="${newChId}"]`).trigger('click');
- prev_selected_char = null;
- }
-
- menu_type = 'characters';
- $("#rm_characters_block").css("display", "block");
- $('#rm_characters_block').css('opacity', 0.0);
- $('#rm_characters_block').transition({
- opacity: 1.0,
- duration: animation_rm_duration,
- easing: animation_rm_easing,
- complete: function () { }
- });
-
- $("#rm_api_block").css("display", "none");
- $("#rm_ch_create_block").css("display", "none");
- $("#rm_info_block").css("display", "none");
- $("#rm_group_chats_block").css("display", "none");
-
- $("#rm_button_characters").css("class", "selected-right-tab");
- $("#rm_button_settings").css("class", "deselected-right-tab");
- $("#rm_button_selected_ch").css("class", "deselected-right-tab");
- }
- function select_rm_info(text, charId = null) {
- $("#rm_characters_block").css("display", "none");
- $("#rm_api_block").css("display", "none");
- $("#rm_ch_create_block").css("display", "none");
- $("#rm_group_chats_block").css("display", "none");
- $("#rm_info_block").css("display", "flex");
-
- $("#rm_info_text").html('' + text + ' ');
-
- $("#rm_button_characters").css("class", "deselected-right-tab");
- $("#rm_button_settings").css("class", "deselected-right-tab");
- $("#rm_button_selected_ch").css("class", "deselected-right-tab");
-
- prev_selected_char = charId;
- }
- function select_selected_character(chid) { //character select
- //console.log('select_selected_character() -- starting with input of -- '+chid+' (name:'+characters[chid].name+')');
- select_rm_create();
- menu_type = 'character_edit';
- $("#delete_button").css("display", "block");
- $("#export_button").css("display", "block");
- $("#rm_button_selected_ch").css("class", "selected-right-tab");
- var display_name = characters[chid].name;
- $("#rm_button_selected_ch").children("h2").text(display_name);
-
- //create text poles
- $("#rm_button_back").css("display", "none");
- //$("#character_import_button").css("display", "none");
- $("#create_button").attr("value", "Save");
- $("#create_button").css("display", "none");
- var i = 0;
- while ($("#rm_button_selected_ch").width() > 170 && i < 100) {
- display_name = display_name.slice(0, display_name.length - 2);
- //console.log(display_name);
- $("#rm_button_selected_ch").children("h2").text($.trim(display_name) + '...');
- i++;
- }
- $("#add_avatar_button").val('');
-
- $('#character_popup_text_h3').text(characters[chid].name);
- $("#character_name_pole").val(characters[chid].name);
- $("#description_textarea").val(characters[chid].description);
- $("#personality_textarea").val(characters[chid].personality);
- $("#firstmessage_textarea").val(characters[chid].first_mes);
- $("#scenario_pole").val(characters[chid].scenario);
- $("#talkativeness_slider").val(characters[chid].talkativeness ?? talkativeness_default);
- $("#mes_example_textarea").val(characters[chid].mes_example);
- $("#selected_chat_pole").val(characters[chid].chat);
- $("#create_date_pole").val(characters[chid].create_date);
- $("#avatar_url_pole").val(characters[chid].avatar);
- $("#chat_import_avatar_url").val(characters[chid].avatar);
- $("#chat_import_character_name").val(characters[chid].name);
- //$("#avatar_div").css("display", "none");
- var this_avatar = default_avatar;
- if (characters[chid].avatar != 'none') {
- this_avatar = "characters/" + characters[chid].avatar;
- }
- $("#avatar_load_preview").attr('src', this_avatar + "?" + Date.now());
- $("#name_div").css("display", "none");
-
- $("#form_create").attr("actiontype", "editcharacter");
- active_character = chid;
- //console.log('select_selected_character() -- active_character -- '+chid+'(ChID of '+display_name+')');
- saveSettings();
- //console.log('select_selected_character() -- called saveSettings() to save -- active_character -- '+active_character+'(ChID of '+display_name+')');
-
- }
$(document).on('click', '.character_select', function () {
if (this_chid !== $(this).attr("chid")) { //if clicked on a different character from what was currently selected
if (!is_send_press) {
@@ -2684,18 +3278,24 @@ $(document).ready(function () {
},
data: msg,
cache: false,
- success: function (html) {
- //RossAscends: setting active character to null in order to avoid array errors.
+ success: function (html){
+ //RossAscends: New handling of character deletion that avoids page refreshes and should have fixed char corruption due to cache problems.
+ //due to how it is handled with 'popup_type', i couldn't find a way to make my method completely modular, so keeping it in TAI-main.js as a new default.
//this allows for dynamic refresh of character list after deleting a character.
- $('#character_cross').click();
- active_character = 'invalid-safety-id'; //unsets the chid in settings (this prevents AutoLoadChat from trying to load the wrong ChID
- this_chid = 'invalid-safety-id'; //unsets expected chid before reloading (related to getCharacters/printCharacters from using old arrays)
- characters.length = 0; // resets the characters array, forcing getcharacters to reset
- name2 = "Chloe"; // replaces deleted charcter name with Chloe, since she wil be displayed next.
- chat = [...safetychat]; // sets up chloe to tell user about having deleted a character
- saveSettings(); // saving settings to keep changes to variables
- QuickRefresh(); // call quick refresh of Char list, clears chat, and loads Chloe 'post-char-delete' message.
- //location.reload(); // this is Humi's original code
+ $("#character_cross").click(); // closes advanced editing popup
+ this_chid = "invalid-safety-id"; // unsets expected chid before reloading (related to getCharacters/printCharacters from using old arrays)
+ //avatar = "..img/Chloe.jpg";
+ characters.length = 0; // resets the characters array, forcing getcharacters to reset
+ name2 = "Chloe"; // replaces deleted charcter name with Chloe, since she will be displayed next.
+ chat = [...safetychat]; // sets up chloe to tell user about having deleted a character
+ $(document.getElementById("rm_button_selected_ch")).css("class","deselected-right-tab"); // 'deselects' character's tab panel
+ $(document.getElementById("rm_button_selected_ch")).children("h2").text(""); // removes character name from nav tabs
+ clearChat(); // removes deleted char's chat
+ this_chid = undefined; // prevents getCharacters from trying to load an invalid char.
+ getCharacters(); // gets the new list of characters (that doesn't include the deleted one)
+ printMessages(); // prints out Chloe's 'deleted character' message
+ //console.log("#dialogue_popup_ok(del-char) >>>> saving");
+ saveSettings(); // saving settings to keep changes to variables
//getCharacters();
//$('#create_button_div').html(html);
}
@@ -2723,7 +3323,7 @@ $(document).ready(function () {
if (popup_type == 'new_chat' && this_chid != undefined && menu_type != "create") {//Fix it; New chat doesn't create while open create character menu
clearChat();
chat.length = 0;
- characters[this_chid].chat = (name2 + ' - ' + humanizedISO8601DateTime()); //RossAscends: added character name to new chat filenames and replaced Date.now() with humanizedISO8601DateTime;
+ characters[this_chid].chat = (name2 + ' - ' + humanizedDateTime()); //RossAscends: added character name to new chat filenames and replaced Date.now() with humanizedDateTime;
$("#selected_chat_pole").val(characters[this_chid].chat);
timerSaveEdit = setTimeout(() => { $("#create_button").click(); }, durationSaveEdit);
getChat();
@@ -2966,9 +3566,9 @@ $(document).ready(function () {
$("#add_avatar_button").replaceWith($("#add_avatar_button").val('').clone(true));
$('#create_button').attr('value', 'Save');
//console.log('/editcharacters -- this_chid -- '+this_chid);
- if (this_chid != undefined && this_chid != 'invalid-safety-id') { //added check to avoid trying to load tokens in case of character deletion
+/* if (this_chid != undefined && this_chid != 'invalid-safety-id') { //added check to avoid trying to load tokens in case of character deletion
CountCharTokens();
- }
+ } */
},
error: function (jqXHR, exception) {
$('#create_button').removeAttr("disabled");
@@ -3072,7 +3672,6 @@ $(document).ready(function () {
}
});
-
$("#api_button_textgenerationwebui").click(function () {
if ($('#textgenerationwebui_api_url_text').val() != '') {
$("#api_loading_textgenerationwebui").css("display", 'inline-block');
@@ -3091,7 +3690,6 @@ $(document).ready(function () {
}
});
-
$("body").click(function () {
if ($("#options").css('opacity') == 1.0) {
$('#options').transition({
@@ -3106,7 +3704,7 @@ $(document).ready(function () {
}
});
- // RossAscends: Added functionality that will close the RightNav panel click outside of it or related panels (adv editing popup, or dialog popups)
+/* // RossAscends: Added functionality that will close the RightNav panel click outside of it or related panels (adv editing popup, or dialog popups)
var NavToggle = document.getElementById("nav-toggle");
var PanelPin = document.getElementById("rm_button_panel_pin");
@@ -3124,7 +3722,7 @@ $(document).ready(function () {
}
};
});
- });
+ }); */
$("#options_button").click(function () { // this is the options button click function, shows the options menu if closed
if ($("#options").css('display') === 'none' && $("#options").css('opacity') == 0.0) {
@@ -3139,11 +3737,7 @@ $(document).ready(function () {
});
}
});
- function openNavToggle() {
- if (!$('#nav-toggle').prop('checked')) {
- $('#nav-toggle').trigger('click');
- }
- }
+
$("#option_select_chat").click(function () {
if (selected_group) {
// will open a chat selection screen
@@ -3339,78 +3933,7 @@ $(document).ready(function () {
console.error("Couldn't change soft prompt");
}
});
- function changeMainAPI() {
- if ($('#main_api').find(":selected").val() == 'kobold') {
- $('#kobold_api').css("display", "block");
- $('#novel_api').css("display", "none");
- $('#textgenerationwebui_api').css("display", "none");
- main_api = 'kobold';
- $('#max_context_block').css('display', 'block');
- $('#amount_gen_block').css('display', 'block');
- $('#softprompt_block').css('display', 'block');
- $('#settings_perset').trigger('change');
- }
- if ($('#main_api').find(":selected").val() == 'textgenerationwebui') {
- $('#kobold_api').css("display", "none");
- $('#novel_api').css("display", "none");
- $('#textgenerationwebui_api').css("display", "block");
- main_api = 'textgenerationwebui';
- $('#max_context_block').css('display', 'block');
- $('#amount_gen_block').css('display', 'block');
- $('#softprompt_block').css('display', 'block');
- $("#amount_gen_block").children().prop("disabled", false);
- $("#amount_gen_block").css('opacity', 1.0);
- }
- if ($('#main_api').find(":selected").val() == 'novel') {
- $('#kobold_api').css("display", "none");
- $('#novel_api').css("display", "block");
- $('#textgenerationwebui_api').css("display", "none");
- main_api = 'novel';
- $('#max_context_block').css('display', 'none');
- $('#amount_gen_block').css('display', 'none');
- $('#softprompt_block').css('display', 'none');
- }
- }
- async function getUserAvatars() {
- $("#user_avatar_block").html(""); //RossAscends: necessary to avoid doubling avatars each QuickRefresh.
- $('#user_avatar_block').append('+
');
- const response = await fetch("/getuseravatars", {
- method: "POST",
- headers: {
- "Content-Type": "application/json",
- "X-CSRF-Token": token
- },
- body: JSON.stringify({
- "": ""
- })
-
- });
- if (response.ok === true) {
- const getData = await response.json();
- //background = getData;
- //console.log(getData.length);
-
- for (var i = 0; i < getData.length; i++) {
- //console.log(1);
- appendUserAvatar(getData[i]);
- }
- //var aa = JSON.parse(getData[0]);
- //const load_ch_coint = Object.getOwnPropertyNames(getData);
-
-
- }
- }
-
- function highlightSelectedAvatar() {
- $("#user_avatar_block").find('.avatar').removeClass('selected');
- $("#user_avatar_block").find(`.avatar[imgfile='${user_avatar}']`).addClass('selected');
- }
-
- function appendUserAvatar(name) {
- const block = $("#user_avatar_block").append('');
- highlightSelectedAvatar();
- }
for (var i of ["temp", "rep_pen", "rep_pen_size", "top_k", "top_p", "typical_p", "penalty_alpha"]) {
$('#' + i + '_textgenerationwebui').attr('x-setting-id', i);
@@ -3515,313 +4038,7 @@ $(document).ready(function () {
$('#rep_pen_size_counter_novel').html($(this).val() + " Tokens");
var repPenSizeTimer_novel = setTimeout(saveSettings, 500);
});
- //***************SETTINGS****************//
- ///////////////////////////////////////////
- async function getSettings(type) {//timer
- //console.log('getSettings() pinging server for settings request');
- jQuery.ajax({
- type: 'POST',
- url: '/getsettings',
- data: JSON.stringify({}),
- beforeSend: function () {
-
-
- },
- cache: false,
- dataType: "json",
- contentType: "application/json",
- //processData: false,
- success: function (data) {
- if (data.result != 'file not find' && data.settings) {
- settings = JSON.parse(data.settings);
- if (settings.username !== undefined) {
- if (settings.username !== '') {
- name1 = settings.username;
- $('#your_name').val(name1);
- }
- }
-
- //Load which API we are using
- if (settings.main_api != undefined) {
- main_api = settings.main_api;
- $("#main_api option[value=" + main_api + "]").attr('selected', 'true');
- changeMainAPI();
- }
- //load Novel API KEY is exists
- if (settings.api_key_novel != undefined) {
- api_key_novel = settings.api_key_novel;
- $("#api_key_novel").val(api_key_novel);
- }
- //load the rest of the Novel settings without any checks
- model_novel = settings.model_novel;
- $("#model_novel_select option[value=" + model_novel + "]").attr('selected', 'true');
-
- novelai_setting_names = data.novelai_setting_names;
- novelai_settings = data.novelai_settings;
- novelai_settings.forEach(function (item, i, arr) {
- novelai_settings[i] = JSON.parse(item);
- });
- var arr_holder = {};
-
- $("#settings_perset_novel").empty();
-
- novelai_setting_names.forEach(function (item, i, arr) {
- arr_holder[item] = i;
- $('#settings_perset_novel').append('
' + item + ' ');
-
- });
- novelai_setting_names = {};
- novelai_setting_names = arr_holder;
-
- preset_settings_novel = settings.preset_settings_novel;
- $("#settings_perset_novel option[value=" + novelai_setting_names[preset_settings_novel] + "]").attr('selected', 'true');
-
- //Load KoboldAI settings
- koboldai_setting_names = data.koboldai_setting_names;
- koboldai_settings = data.koboldai_settings;
- koboldai_settings.forEach(function (item, i, arr) {
- koboldai_settings[i] = JSON.parse(item);
- });
- var arr_holder = {};
-
- $("#settings_perset").empty(); //RossAscends: uncommented this to prevent settings selector from doubling preset list on QuickRefresh
- $("#settings_perset").append('
GUI KoboldAI Settings '); //adding in the GUI settings, since it is not loaded dynamically
-
- koboldai_setting_names.forEach(function (item, i, arr) {
- arr_holder[item] = i;
- $('#settings_perset').append('
' + item + ' ');
- //console.log('loading preset #'+i+' -- '+item);
-
- });
- koboldai_setting_names = {};
- koboldai_setting_names = arr_holder;
- preset_settings = settings.preset_settings;
-
- //Load AI model config settings (temp, context length, anchors, and anchor order)
-
- textgenerationwebui_settings = settings.textgenerationwebui_settings || textgenerationwebui_settings;
-
- temp = settings.temp;
- amount_gen = settings.amount_gen;
- if (settings.max_context !== undefined) max_context = parseInt(settings.max_context);
- if (settings.anchor_order !== undefined) anchor_order = parseInt(settings.anchor_order);
- if (settings.style_anchor !== undefined) style_anchor = !!settings.style_anchor;
- if (settings.character_anchor !== undefined) character_anchor = !!settings.character_anchor;
- if (settings.world_info_depth !== undefined) world_info_depth = Number(settings.world_info_depth);
- if (settings.world_info_budget !== undefined) world_info_budget = Number(settings.world_info_budget);
-
- //load poweruser options
- if (settings.auto_connect !== undefined) auto_connect = !!settings.auto_connect;
- if (settings.auto_load_chat !== undefined) auto_load_chat = !!settings.auto_load_chat;
-
- rep_pen = settings.rep_pen;
- rep_pen_size = settings.rep_pen_size;
-
- var addZeros = "";
- if (isInt(temp)) addZeros = ".00";
- $('#temp').val(temp);
- $('#temp_counter').html(temp + addZeros);
-
- $('#style_anchor').prop('checked', style_anchor);
- $('#character_anchor').prop('checked', character_anchor);
- $("#anchor_order option[value=" + anchor_order + "]").attr('selected', 'true');
-
- $('#auto-connect-checkbox').prop('checked', auto_connect);
- $('#auto-load-chat-checkbox').prop('checked', auto_load_chat);
-
- $('#max_context').val(max_context);
- $('#max_context_counter').html(max_context + ' Tokens');
-
- $('#amount_gen').val(amount_gen);
- $('#amount_gen_counter').html(amount_gen + ' Tokens');
-
- $('#world_info_depth_counter').html(`${world_info_depth} Messages`);
- $('#world_info_depth').val(world_info_depth);
-
- $('#world_info_budget_counter').html(`${world_info_budget} Tokens`);
- $('#world_info_budget').val(world_info_budget);
-
- addZeros = "";
- if (isInt(rep_pen)) addZeros = ".00";
- $('#rep_pen').val(rep_pen);
- $('#rep_pen_counter').html(rep_pen + addZeros);
-
- $('#rep_pen_size').val(rep_pen_size);
- $('#rep_pen_size_counter').html(rep_pen_size + " Tokens");
-
- //Novel
- temp_novel = settings.temp_novel;
- rep_pen_novel = settings.rep_pen_novel;
- rep_pen_size_novel = settings.rep_pen_size_novel;
-
- addZeros = "";
- if (isInt(temp_novel)) addZeros = ".00";
- $('#temp_novel').val(temp_novel);
- $('#temp_counter_novel').html(temp_novel + addZeros);
-
- addZeros = "";
- if (isInt(rep_pen_novel)) addZeros = ".00";
- $('#rep_pen_novel').val(rep_pen_novel);
- $('#rep_pen_counter_novel').html(rep_pen_novel + addZeros);
-
- $('#rep_pen_size_novel').val(rep_pen_size_novel);
- $('#rep_pen_size_counter_novel').html(rep_pen_size_novel + " Tokens");
-
- //Enable GUI deference settings if GUI is selected for Kobold
- if (preset_settings == 'gui') {
- $("#settings_perset option[value=gui]").attr('selected', 'true').trigger('change');
- $("#range_block").children().prop("disabled", true);
- $("#range_block").css('opacity', 0.5);
-
- $("#amount_gen_block").children().prop("disabled", true);
- $("#amount_gen_block").css('opacity', 0.45);
- } else {
- if (typeof koboldai_setting_names[preset_settings] !== 'undefined') {
-
- $("#settings_perset option[value=" + koboldai_setting_names[preset_settings] + "]").attr('selected', 'true').trigger('change');
- } else {
- $("#range_block").children().prop("disabled", true);
- $("#range_block").css('opacity', 0.5);
- $("#amount_gen_block").children().prop("disabled", true);
- $("#amount_gen_block").css('opacity', 0.45);
-
- preset_settings = 'gui';
- $("#settings_perset option[value=gui]").attr('selected', 'true').trigger('change');
- }
- }
-
- //Load User's Name and Avatar
-
- user_avatar = settings.user_avatar;
- $('.mes').each(function () {
- if ($(this).attr('ch_name') == name1) {
- $(this).children('.avatar').children('img').attr('src', 'User Avatars/' + user_avatar);
- }
- });
-
- //Load the API server URL from settings
- api_server = settings.api_server;
- $('#api_url_text').val(api_server);
-
- // world info settings
- world_names = data.world_names?.length ? data.world_names : [];
-
- if (settings.world_info != undefined) {
- if (world_names.includes(settings.world_info)) {
- world_info = settings.world_info;
- }
- }
-
- world_names.forEach((item, i) => {
- $('#world_info').append(`
${item} `);
- // preselect world if saved
- if (item == world_info) {
- $('#world_info').val(i).change();
- }
- });
- // end world info settings
-
- if (data.enable_extensions) {
- const src = 'scripts/extensions.js';
- if ($(`script[src="${src}"]`).length === 0) {
- const script = document.createElement('script');
- script.type = 'text/javascript';
- script.src = src;
- $('body').append(script);
- }
- }
-
- //get the character to auto-load
- if (settings.active_character !== undefined) {
- if (settings.active_character !== '') {
- active_character = settings.active_character;
- }
- }
-
- api_server_textgenerationwebui = settings.api_server_textgenerationwebui;
- $("#textgenerationwebui_api_url_text").val(api_server_textgenerationwebui);
-
-
- for (var i of ["temp", "rep_pen", "rep_pen_size", "top_k", "top_p", "typical_p", "penalty_alpha"]) {
- $("#" + i + "_textgenerationwebui")
- .val(textgenerationwebui_settings[i]);
- $("#" + i + "_counter_textgenerationwebui")
- .html(textgenerationwebui_settings[i]);
- }
- }
- if (!is_checked_colab) isColab();
- },
- error: function (jqXHR, exception) {
- console.log(exception);
- console.log(jqXHR);
-
- }
- });
-
- collapse_newlines = localStorage.getItem(storage_keys.collapse_newlines) == 'true';
- $('#collapse-newlines-checkbox').prop('checked', collapse_newlines);
- }
-
- async function saveSettings(type) {
- //console.log('saveSettings() -- pinging server to save settings.');
- jQuery.ajax({
- type: 'POST',
- url: '/savesettings',
- data: JSON.stringify({
- username: name1,
- api_server: api_server,
- api_server_textgenerationwebui: api_server_textgenerationwebui,
- preset_settings: preset_settings,
- preset_settings_novel: preset_settings_novel,
- user_avatar: user_avatar,
- temp: temp,
- amount_gen: amount_gen,
- max_context: max_context,
- anchor_order: anchor_order,
- style_anchor: style_anchor,
- character_anchor: character_anchor,
- auto_connect: auto_connect,
- auto_load_chat: auto_load_chat,
- main_api: main_api,
- api_key_novel: api_key_novel,
- rep_pen: rep_pen,
- rep_pen_size: rep_pen_size,
- model_novel: model_novel,
- temp_novel: temp_novel,
- rep_pen_novel: rep_pen_novel,
- rep_pen_size_novel: rep_pen_size_novel,
- world_info: world_info,
- world_info_depth: world_info_depth,
- world_info_budget: world_info_budget,
- active_character: active_character,
- textgenerationwebui_settings: textgenerationwebui_settings,
- }),
- beforeSend: function () {
- //console.log('saveSettings() -- active_character -- '+active_character);
-
- },
- cache: false,
- dataType: "json",
- contentType: "application/json",
- //processData: false,
- success: function (data) {
- //online_status = data.result;
- if (type === 'change_name') {
- QuickRefresh(); //RossAscends: No more page reload on username change
- //location.reload();
- }
-
- },
- error: function (jqXHR, exception) {
- console.log(exception);
- console.log(jqXHR);
-
- }
- });
-
- localStorage.setItem(storage_keys.collapse_newlines, collapse_newlines);
- }
$('#donation').click(function () {
$('#shadow_tips_popup').css('display', 'block');
$('#shadow_tips_popup').transition({
@@ -3850,11 +4067,7 @@ $(document).ready(function () {
$('#shadow_select_chat_popup').css('display', 'none');
$('#load_select_chat_div').css('display', 'block');
});
- function isInt(value) {
- return !isNaN(value) &&
- parseInt(Number(value)) == value &&
- !isNaN(parseInt(value, 10));
- }
+
//********************
//***Message Editor***
$(document).on('click', '.mes_edit', function () {
@@ -3935,158 +4148,18 @@ $(document).ready(function () {
$(document).on('click', '.mes_edit_done', function () {
messageEditDone($(this));
});
- function messageEditDone(div) {
- var text = div.parent().parent().children('.mes_text').children('.edit_textarea').val();
- //var text = chat[this_edit_mes_id];
- text = text.trim();
- const bias = extractMessageBias(text);
- chat[this_edit_mes_id]['mes'] = text;
-
- // editing old messages
- if (!chat[this_edit_mes_id]['extra']) {
- chat[this_edit_mes_id]['extra'] = {};
- }
-
- chat[this_edit_mes_id]['extra']['bias'] = bias ?? null;
-
- div.parent().parent().children('.mes_text').empty();
- div.css('display', 'none');
- div.parent().children('.mes_edit_cancel').css('display', 'none');
- div.parent().children('.mes_edit').css('display', 'inline-block');
- div.parent().parent().children('.mes_text').append(messageFormating(text, this_edit_mes_chname));
- div.parent().parent().children('.mes_bias').empty();
- div.parent().parent().children('.mes_bias').append(messageFormating(bias));
- appendImageToMessage(chat[this_edit_mes_id], div.closest('.mes'));
- this_edit_mes_id = undefined;
- if (selected_group) {
- saveGroupChat(selected_group);
- }
- else {
- saveChat();
- }
- }
$("#your_name_button").click(function () {
if (!is_send_press) {
name1 = $("#your_name").val();
if (name1 === undefined || name1 == '') name1 = default_user_name;
- //console.log(name1);
+ console.log(name1);
saveSettings('change_name');
}
});
//Select chat
- async function getAllCharaChats() {
- //console.log('getAllCharaChats() pinging server for character chat history.');
- $('#select_chat_div').html('');
- //console.log(characters[this_chid].chat);
- jQuery.ajax({
- type: 'POST',
- url: '/getallchatsofcharacter',
- data: JSON.stringify({ avatar_url: characters[this_chid].avatar }),
- beforeSend: function () {
- //$('#create_button').attr('value','Creating...');
- },
- cache: false,
- dataType: "json",
- contentType: "application/json",
- success: function (data) {
- $('#load_select_chat_div').css('display', 'none');
- let dataArr = Object.values(data);
- data = dataArr.sort((a, b) => a['file_name'].localeCompare(b['file_name']));
- data = data.reverse();
- for (const key in data) {
- let strlen = 300;
- let mes = data[key]['mes'];
- if (mes !== undefined) {
- if (mes.length > strlen) {
- mes = '...' + mes.substring(mes.length - strlen);
- }
- $('#select_chat_div').append('
' + data[key]['file_name'] + '
' + mes + '
');
- if (characters[this_chid]['chat'] == data[key]['file_name'].replace('.jsonl', '')) {
- //children().last()
- $('#select_chat_div').children(':nth-last-child(1)').attr('highlight', true);
- }
- }
- }
- //
-
- //
- //console.log(data);
- //chat.length = 0;
-
- //chat = data;
- //getChatResult();
- //saveChat();
- //console.log('getAllCharaChats() -- Finished successfully');
- },
- error: function (jqXHR, exception) {
- //getChatResult();
- //console.log('getAllCharaChats() -- Failed');
- console.log(exception);
- console.log(jqXHR);
-
- }
- });
- }
- //************************************************************
- //************************Novel.AI****************************
- //************************************************************
- async function getStatusNovel() {
- if (is_get_status_novel) {
-
- var data = { key: api_key_novel };
-
-
- jQuery.ajax({
- type: 'POST', //
- url: '/getstatus_novelai', //
- data: JSON.stringify(data),
- beforeSend: function () {
- //$('#create_button').attr('value','Creating...');
- },
- cache: false,
- dataType: "json",
- contentType: "application/json",
- success: function (data) {
-
-
- if (data.error != true) {
- //var settings2 = JSON.parse(data);
- //const getData = await response.json();
- novel_tier = data.tier;
- if (novel_tier == undefined) {
- online_status = 'no_connection';
- }
- if (novel_tier === 0) {
- online_status = "Paper";
- }
- if (novel_tier === 1) {
- online_status = "Tablet";
- }
- if (novel_tier === 2) {
- online_status = "Scroll";
- }
- if (novel_tier === 3) {
- online_status = "Opus";
- }
- }
- resultCheckStatusNovel();
- },
- error: function (jqXHR, exception) {
- online_status = 'no_connection';
- console.log(exception);
- console.log(jqXHR);
- resultCheckStatusNovel();
- }
- });
- } else {
- if (is_get_status != true) {
- online_status = 'no_connection';
- }
- }
- }
$("#api_button_novel").click(function () {
if ($('#api_key_novel').val() != '') {
$("#api_loading_novel").css("display", 'inline-block');
@@ -4113,32 +4186,7 @@ $(document).ready(function () {
anchor_order = parseInt($('#anchor_order').find(":selected").val());
saveSettings();
});
- function compareVersions(v1, v2) {
- const v1parts = v1.split('.');
- const v2parts = v2.split('.');
- for (let i = 0; i < v1parts.length; ++i) {
- if (v2parts.length === i) {
- return 1;
- }
-
- if (v1parts[i] === v2parts[i]) {
- continue;
- }
- if (v1parts[i] > v2parts[i]) {
- return 1;
- }
- else {
- return -1;
- }
- }
-
- if (v1parts.length != v2parts.length) {
- return -1;
- }
-
- return 0;
- }
//**************************CHARACTER IMPORT EXPORT*************************//
$("#character_import_button").click(function () {
$("#character_import_file").click();
@@ -4758,7 +4806,7 @@ $(document).ready(function () {
};
};
- //RossAscends: auto-load last character function (fires when active_character is defined and auto_load_chat is true)
+/* //RossAscends: auto-load last character function (fires when active_character is defined and auto_load_chat is true)
function autoloadchat() {
console.log('starting autoloadchat routine');
jQuery.ajax({
@@ -4792,10 +4840,10 @@ $(document).ready(function () {
console.log(jqXHR);
}
- });
+ });
- }
- //RossAscends: auto-connect to last API function (fires when API URL exists in settings and auto_connect is true)
+ }*/
+ /* //RossAscends: auto-connect to last API function (fires when API URL exists in settings and auto_connect is true)
function autoconnect() {
console.log('starting autoconnect routine');
jQuery.ajax({
@@ -4845,5 +4893,5 @@ $(document).ready(function () {
}
});
- }
+ } */
});
diff --git a/public/scripts/RossAscends-mods.js b/public/scripts/RossAscends-mods.js
new file mode 100644
index 000000000..9d64ae7a9
--- /dev/null
+++ b/public/scripts/RossAscends-mods.js
@@ -0,0 +1,369 @@
+import { encode } from "../scripts/gpt-2-3-tokenizer/mod.js";
+
+import {
+ Generate,
+ getSettings,
+ saveSettings,
+ printMessages,
+ clearChat,
+ getChat,
+ this_chid,
+ settings,
+ characters,
+ online_status,
+ main_api,
+ api_server,
+ api_key_novel,
+ getCharacters,
+ is_send_press
+} from "../script.js";
+
+var NavToggle = document.getElementById("nav-toggle");
+var PanelPin = document.getElementById("rm_button_panel_pin");
+var SelectedCharacterTab = document.getElementById("rm_button_selected_ch");
+var RightNavPanel = document.getElementById("right-nav-panel");
+var AdvancedCharDefsPopup = document.getElementById("character_popup");
+var ConfirmationPopup = document.getElementById("dialogue_popup");
+var AutoConnectCheckbox = document.getElementById("auto-connect-checkbox");
+var AutoLoadChatCheckbox = document.getElementById("auto-load-chat-checkbox");
+var SelectedNavTab = ("#"+LoadLocal('SelectedNavTab'));
+
+var create_save_name;
+var create_save_description;
+var create_save_personality;
+var create_save_first_message;
+var create_save_scenario;
+var create_save_mes_example;
+var count_tokens;
+var perm_tokens;
+var ALC_Done;
+
+////////////////// LOCAL STORAGE HANDLING /////////////////////
+
+function SaveLocal(target, val) {
+ localStorage.setItem(target, val);
+ console.log('SaveLocal -- '+target+' : '+val);
+ }
+ function LoadLocal(target) {
+ return localStorage.getItem(target);
+ }
+ function LoadLocalBool(target){
+ let result = localStorage.getItem(target) === 'true';
+ return result;
+ }
+ function CheckLocal() {
+ console.log("----------local storage---------");
+ var i;
+ for (i = 0; i < localStorage.length; i++) {
+ console.log(localStorage.key(i) +" : " +localStorage.getItem(localStorage.key(i)));
+ }
+ console.log("------------------------------");
+ }
+ function ClearLocal() {localStorage.clear();console.log('Removed All Local Storage');}
+
+/////////////////////////////////////////////////////////////////////////
+//RossAscends: Added function to format dates used in files and chat timestamps to a humanized format.
+//Mostly I wanted this to be for file names, but couldn't figure out exactly where the filename save code was as everything seemed to be connected.
+//Does not break old characters/chats, as the code just uses whatever timestamp exists in the chat.
+//New chats made with characters will use this new formatting.
+//Useable variable is (( HumanizedDateTime ))
+export function humanizedDateTime() {
+ let baseDate = new Date(Date.now());
+ let humanYear = baseDate.getFullYear();
+ let humanMonth = baseDate.getMonth() + 1;
+ let humanDate = baseDate.getDate();
+ let humanHour = (baseDate.getHours() < 10 ? "0" : "") + baseDate.getHours();
+ let humanMinute =
+ (baseDate.getMinutes() < 10 ? "0" : "") + baseDate.getMinutes();
+ let humanSecond =
+ (baseDate.getSeconds() < 10 ? "0" : "") + baseDate.getSeconds();
+ let humanMillisecond =
+ (baseDate.getMilliseconds() < 10 ? "0" : "") + baseDate.getMilliseconds();
+ let HumanizedDateTime =
+ humanYear +"-" +humanMonth +"-" +humanDate +" @" +humanHour +"h " +humanMinute +"m " +humanSecond +"s " +humanMillisecond +"ms";
+ return HumanizedDateTime;
+}
+
+//RA_CountCharTokens -- faster counting characters. Works for unsaved characters, and counts permanent and ephemeral tokens separately.
+
+// triggers:
+$("#rm_button_create").on("click", function () { //when "+New Character" is clicked
+ $(SelectedCharacterTab).children("h2").html(''); // empty nav's 3rd panel tab
+
+ //empty temp vars to store new char data for counting
+ create_save_name="";
+ create_save_description="";
+ create_save_personality="";
+ create_save_first_message="";
+ create_save_scenario="";
+ create_save_mes_example="";
+ $("#result_info").html('Type to start counting tokens!');
+});
+$(SelectedCharacterTab).children("h2").on("DOMSubtreeModified", function () { // when the nav's 3rd panel tab header changes (when a char is selected from the char list)
+ //console.log('3rd tab name changed - counting tokens');
+ //SaveLocal('ActiveChar',active_character);
+ setTimeout(RA_CountCharTokens,200); //delay to allow textareas to fill out, so we don't show a previous char's count
+});
+
+$("#rm_ch_create_block").on("input", function () {RA_CountCharTokens();}); //when any input is made to the create/edit character form textareas
+$("#character_popup").on("input", function () {RA_CountCharTokens();}); //when any input is made to the advanced editing popup textareas
+
+//function:
+function RA_CountCharTokens() {
+ $("#result_info").html("");
+ console.log('RA_TC -- starting with this_chid = '+this_chid);
+ if (document.getElementById('name_div').style.display == "block"){ //if new char
+
+ $("#form_create").on("input", function () { //fill temp vars with form_create values
+ create_save_name = $("#character_name_pole").val();
+ create_save_description = $("#description_textarea").val();
+ create_save_first_message = $("#firstmessage_textarea").val();
+ });
+ $("#character_popup").on("input", function () { //fill temp vars with advanced popup values
+ create_save_personality = $("#personality_textarea").val();
+ create_save_scenario = $("#scenario_pole").val();
+ create_save_mes_example = $("#mes_example_textarea").val();
+
+ });
+
+ //count total tokens, including those that will be removed from context once chat history is long
+ count_tokens = encode(JSON.stringify(
+ create_save_name +
+ create_save_description +
+ create_save_personality +
+ create_save_scenario +
+ create_save_first_message +
+ create_save_mes_example
+ )).length;
+
+ //count permanent tokens that will never get flushed out of context
+ perm_tokens = encode(JSON.stringify(
+ create_save_name +
+ create_save_description +
+ create_save_personality +
+ create_save_scenario
+ )).length;
+
+ } else {if (this_chid !== undefined && this_chid !== "invalid-safety-id") { // if we are counting a valid pre-saved char
+
+ //same as above, all tokens including temporary ones
+ count_tokens = encode(
+ JSON.stringify(
+ characters[this_chid].description +
+ characters[this_chid].personality +
+ characters[this_chid].scenario +
+ characters[this_chid].first_mes +
+ characters[this_chid].mes_example
+ )).length;
+
+ //permanent tokens count
+ perm_tokens = encode(
+ JSON.stringify(
+ characters[this_chid].name +
+ characters[this_chid].description +
+ characters[this_chid].personality +
+ characters[this_chid].scenario
+ )).length;
+ } else {console.log("RA_TC -- no valid char found, closing.");} // if neither, probably safety char or some error in loading
+ }
+ // display the counted tokens
+ if (count_tokens < 1024 && perm_tokens < 1024) {
+ $("#result_info").html(count_tokens + " Tokens (" + perm_tokens + " Permanent Tokens)"); //display normal if both counts are under 1024
+ } else {$("#result_info").html("" +count_tokens +" Tokens (" +perm_tokens +" Permanent Tokens)(TOO MANY) ");} //warn if either are over 1024
+}
+
+
+
+//Auto Load Last Charcter -- (fires when active_character is defined and auto_load_chat is true)
+async function RA_autoloadchat() {
+ if (document.getElementById('CharID0') !== null){
+ console.log('char list loaded! clicking activeChar')
+ var CharToAutoLoad = document.getElementById('CharID'+LoadLocal('ActiveChar'));
+ if (CharToAutoLoad !=null){
+ CharToAutoLoad.click();
+ }else{
+ console.log(CharToAutoLoad + ' ActiveChar local var - not found: '+LoadLocal('ActiveChar'));
+ }
+ RestoreNavTab();
+ }else{
+ console.log('no char list yet..')
+ setTimeout(RA_autoloadchat,100) // if the charcter list hadn't been loaded yet, try again.
+ }
+}
+
+//only triggers when AutoLoadChat is enabled, consider adding this as an independent feature later.
+function RestoreNavTab(){
+ if($(rm_button_selected_ch).children("h2").text()!==''){ //check for a change in the character edit tab name
+ console.log('detected ALC char finished loaded, proceeding to restore tab.');
+ $(SelectedNavTab).click() //click to restore saved tab when name has changed (signalling char load is done)
+ }else{
+ setTimeout(RestoreNavTab,100) //if not changed yet, check again after 100ms
+ }
+}
+
+//changes input bar and send button display depending on connection status
+$("#online_status_text2").on("DOMSubtreeModified", function () {RA_checkOnlineStatus();});
+function RA_checkOnlineStatus() {
+ if (online_status == "no_connection") {
+ $("#send_textarea").attr("placeholder", "Not connected to API!"); //Input bar placeholder tells users they are not connected
+ $("#send_form").css("background-color", "rgba(100,0,0,0.7)"); //entire input form area is red when not connected
+ $("#send_but").css("display", "none"); //send button is hidden when not connected;
+ } else {
+ if (online_status !== undefined && online_status !== "no_connection") {
+ $("#send_textarea").attr("placeholder", "Type a message..."); //on connect, placeholder tells user to type message
+ $("#send_form").css("background-color", "rgba(0,0,0,0.7)"); //on connect, form BG changes to transprent black
+ $("#send_but").css("display", "inline"); //on connect, send button shows
+ }
+ }
+}
+
+//Auto-connect to API (when set to kobold, API URL exists, and auto_connect is true)
+function RA_autoconnect() {
+ //console.log('RA_AC -- starting..')
+ if(online_status !== undefined && api_server !== ''){
+ if (online_status == "no_connection") {
+ if (LoadLocalBool('AutoConnectEnabled') === true) {
+ if (main_api === "kobold") {
+ if (api_server !== "") {
+ $("#api_url_text").val(api_server);
+ console.log('clicking API-button');
+ $("#api_button").click();
+ //console.log("clicked KAI connect for you");
+ } else {
+ console.log(main_api+' '+api_server);
+ console.log("RA_AC - KAI API not specificed");
+ }
+ } else {
+ //console.log("RA_AC - not kobold. skipping to novel.");
+ }
+
+ if (main_api === "novel") {
+ if (api_key_novel !== "") {
+ $("#api_key_novel").val(api_key_novel);
+ console.log('clicking novel API-button');
+ $("#api_button").click();
+ // console.log("clicked NAI connect for you");
+ } else {
+ console.log("RA_AC - no novel API key");
+ }
+ }
+ } else {
+ console.log("RA_AC - is disabled. stopping.");
+ }
+ } else {
+ console.log("RA_AC -- Already online, nothing to do.");
+ }
+ }else{
+ console.log('RA_AC -- settings not loaded yet...trying again..');
+ setTimeout(RA_autoconnect,100);
+ } // if onlinbe_staus hadn't been declared yet, try again..
+}
+
+
+$("document").ready(function () {
+
+ // read the state of Nav Lock and whether the nav was open or not before page load.
+ $(PanelPin).prop('checked', LoadLocalBool("NavLockOn"));
+ if (LoadLocalBool("NavLockOn") == true){
+ $(NavToggle).prop("checked", LoadLocalBool("NavOpened"));
+ }
+ // read the state of AutoConnect and AutoLoadChat.
+ $(AutoConnectCheckbox).prop("checked",LoadLocalBool("AutoConnectEnabled"));
+ $(AutoLoadChatCheckbox).prop("checked",LoadLocalBool("AutoLoadChatEnabled"));
+
+
+
+ //AutoLoadChat and AutoConnect must be loaded on a small delay after page load to allow getSettings to fill out what they need
+ if (LoadLocalBool('AutoLoadChatEnabled') == true) {
+ console.log('calling RA_ALC');
+ RA_autoloadchat();
+ }
+
+ if (LoadLocalBool("AutoConnectEnabled") == true) {RA_autoconnect()}
+
+ $("#main_api").change(function () {RA_autoconnect();});
+
+ $("#api_button").click(function () {setTimeout(RA_checkOnlineStatus, 100);});
+
+ //close the RightNav panel when user clicks outside of it or related panels (adv editing popup, or dialog popups)
+ $("html").click(function (e) {
+ //console.log('clicking'+$(this));
+ if ($(NavToggle).prop("checked") === true && $(PanelPin).prop("checked") === false) {
+ if ($(e.target).attr("id") !== "nav-toggle") {
+ if (RightNavPanel.contains(e.target) === false) {
+ if (AdvancedCharDefsPopup.contains(e.target) === false) {
+ if (ConfirmationPopup.contains(e.target) === false) {
+ NavToggle.click();
+ }
+ }
+ }
+ }
+ }
+ });
+
+ //save NavLock prefs and record state of the Nav being open or closed
+ $(NavToggle).on("change", function () {
+ SaveLocal("NavOpened", $(NavToggle).prop("checked"));
+ });
+ $(PanelPin).on("change",function () {
+ SaveLocal("NavLockOn", $(PanelPin).prop("checked"));
+ });
+
+ //save AutoConnect and AutoLoadChat prefs
+ $(AutoConnectCheckbox).on("change",function () {
+ SaveLocal("AutoConnectEnabled", $(AutoConnectCheckbox).prop("checked"));
+ });
+ $(AutoLoadChatCheckbox).on("change",function () {
+ SaveLocal("AutoLoadChatEnabled", $(AutoLoadChatCheckbox).prop("checked"));
+ });
+
+ //save the clicked Nav Tab as the tab to auto-open on page reload
+ $("#rm_button_settings").click( function (){
+ SaveLocal('SelectedNavTab','rm_button_settings');
+ });
+ $(SelectedCharacterTab).click(function () {
+ console.log('3rd tab clicked - saving selnavtab');
+ //SaveLocal('ActiveChar',this_chid);
+ SaveLocal('SelectedNavTab','rm_button_selected_ch');
+ });
+ $("#rm_button_characters").click( function () { //if char list is clicked, in addition to saving it...
+ SaveLocal('SelectedNavTab','rm_button_characters');
+ characters.sort(Intl.Collator().compare); // we sort the list
+ });
+ // when a char is selected from the list, save them as the auto-load character for next page load
+ $(document).on("click", ".character_select",function () {
+ console.log('char clicked in charlist - saving local activechar');
+ SaveLocal('ActiveChar',$(this).attr('chid'));
+ });
+
+ //this makes the chat input text area resize vertically to match the text size (limited by CSS at 50% window height)
+ $('#send_textarea').on('input', function () {
+ this.style.height = '40px';
+ this.style.height =
+ (this.scrollHeight) + 'px';
+ });
+
+ //Additional hotkeys CTRL+ENTER and CTRL+UPARROW
+ document.addEventListener("keydown", (event) => {
+ if (event.ctrlKey && event.key == "Enter") {
+ // Ctrl+Enter for Regeneration Last Response
+ if (is_send_press == false) {
+
+ Generate("regenerate");
+ }
+ }
+ if (event.ctrlKey && event.key == "ArrowUp") {
+ //Ctrl+UpArrow for Connect to last server
+ if (online_status === "no_connection") {
+ document.getElementById("api_button").click();
+ }
+ }
+ if (event.ctrlKey && event.key == "ArrowLeft") { //for debug, show all local stored vars
+ CheckLocal();
+ }
+ if (event.ctrlKey && event.key == "ArrowRight") { //for debug, empty local storage state
+ ClearLocal();
+ }
+ });
+
+})
diff --git a/public/style.css b/public/style.css
index 4b3616839..0e9387666 100644
--- a/public/style.css
+++ b/public/style.css
@@ -103,6 +103,7 @@ body {
.mes_text i,
.mes_text em {
color: var(--grey70);
+ font-weight: 500;
}
.mes_text strong,
@@ -185,11 +186,11 @@ code {
border-bottom: 1px solid var(--black30a);
border-left: 1px solid var(--black30a);
border-right: 1px solid var(--black30a);
- backdrop-filter: blur(10px);
+ backdrop-filter: blur(20px);
background-color: var(--black70a);
- -webkit-backdrop-filter: blur(10px);
- /*border-radius: 0 0 40px 40px;*/
+ -webkit-backdrop-filter: blur(20px);
text-shadow: #000 0 0 3px;
+ scrollbar-width: thin;
}
@@ -209,6 +210,7 @@ code {
border-radius: 0 0 20px 20px;
background-color: var(--crimson70a);
+ backdrop-filter: blur(20px);
}
#send_but_sheld {
@@ -293,13 +295,13 @@ code {
overflow: hidden;
display: block;
position: absolute;
- backdrop-filter: blur(10px);
- background-color: var(--black70a);
- -webkit-backdrop-filter: blur(10px);
+/* backdrop-filter: blur(10px); */ /* removed because we can't have both this and the input bar blurring*/
+ background-color: var(--black100);
+ /* -webkit-backdrop-filter: blur(10px); */ /* removed because we can't have both this and the input bar blurring*/
border: 1px solid #666;
border-radius: 15px;
- box-shadow: 00 5px #000;
- text-shadow: #000 0 0 3px;
+ box-shadow: 0 0 5px black;
+ text-shadow: 0 0 3px black;
min-width: 200px;
z-index: 2000;
}
@@ -427,8 +429,10 @@ textarea {
font-size: 15px;
font-family: "Noto Sans", "Noto Color Emoji", sans-serif;
padding: 5px 10px;
+ scrollbar-width: thin;
}
+
#send_textarea {
font-size: 1rem;
line-height: 1.5rem;
@@ -1146,7 +1150,7 @@ input[type=search]:focus::-webkit-search-cancel-button {
z-index: -100;
background-color: red;
}
-
+/* ------ online status indicators and texts. 2 = kobold AI, 3 = Novel AI ----------*/
#online_status2,
#online_status4 {
opacity: 0.5;
@@ -2421,6 +2425,7 @@ a {
z-index: 2050;
white-space: nowrap;
border-left: 1px solid var(--black30a);
+ scrollbar-width: thin;
}
@media screen and (max-width: 450px) {