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(''); + $('#world_info').append(''); + } + 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(``); + + 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('
' + item.name + '
'); + //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("
" + characterName + "
" + `
${bias}
`); + + 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(''); + + }); + 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(''); //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(''); + //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(``); + // 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(''); - $('#world_info').append(''); + 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(``); - - 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('
' + item.name + '
'); - //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("
" + characterName + "
" + `
${bias}
`); - - 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(''); - - }); - 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(''); //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(''); - //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(``); - // 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) {