Merge branch 'SL-TAI-RA-Mods' into dev

This commit is contained in:
SillyLossy
2023-03-15 21:36:20 +02:00
38 changed files with 344 additions and 81 deletions

Binary file not shown.

After

Width:  |  Height:  |  Size: 19 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 17 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 20 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 20 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 19 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 18 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 18 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 17 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 22 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 18 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 21 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 18 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 18 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 17 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 20 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 19 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 18 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 17 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 17 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 16 KiB

View File

@ -22,6 +22,7 @@
<script src="scripts/showdown.min.js"></script> <script src="scripts/showdown.min.js"></script>
<script src="scripts/popper.js"></script> <script src="scripts/popper.js"></script>
<script type="module" src="scripts/RossAscends-mods.js"></script> <script type="module" src="scripts/RossAscends-mods.js"></script>
<script type="module" src="scripts/swiped-events.js"></script>
<link rel="stylesheet" type="text/css" href="style.css"> <link rel="stylesheet" type="text/css" href="style.css">
<link rel="stylesheet" href="css/bg_load.css"> <link rel="stylesheet" href="css/bg_load.css">
<link rel="icon" type="image/x-icon" href="favicon.ico"> <link rel="icon" type="image/x-icon" href="favicon.ico">
@ -106,7 +107,7 @@
<div id="talkativeness_div"> <div id="talkativeness_div">
<h4>Talkativeness</h4> <h4>Talkativeness</h4>
<h5>How often does the character speak randomly.&nbsp;<span class="warning">Affects group chats only!</span> <h5>How often the chracter speaks in &nbsp;<span class="warning">group chats!</span>
</h5> </h5>
<input id="talkativeness_slider" name="talkativeness" type="range" min="0" max="1" step="0.05" value="0.5" <input id="talkativeness_slider" name="talkativeness" type="range" min="0" max="1" step="0.05" value="0.5"
form="form_create"> form="form_create">

View File

@ -64,7 +64,7 @@ export {
default_avatar, default_avatar,
system_message_types, system_message_types,
talkativeness_default, talkativeness_default,
}; }
// API OBJECT FOR EXTERNAL WIRING // API OBJECT FOR EXTERNAL WIRING
window["TavernAI"] = {}; window["TavernAI"] = {};
@ -817,22 +817,22 @@ function addOneMessage(mes) {
); );
} }
count_view_mes++; count_view_mes++;
//console.log('add mes without animation = '+add_mes_without_animation);
//console.log(!add_mes_without_animation);
if (!add_mes_without_animation) { if (!add_mes_without_animation) {
$("#chat").children().last().css("opacity", 1.0); console.log('adding mes with animation')
$("#chat") //$('#chat').children().last().css('transition','all 2s ease-in-out');
.children() $('#chat').children().last().css("opacity", "1");
.last() //$('#chat').children().last().css('transition','all 2s ease-in-out');
.transition({
opacity: 1.0,
duration: 700, }else {
easing: "", console.log('add mes with animation was false, and is set to false again')
complete: function () { },
});
} else {
add_mes_without_animation = false; add_mes_without_animation = false;
} }
var $textchat = $("#chat"); var $textchat = $("#chat");
$textchat.scrollTop($textchat[0].scrollHeight); //$('#chat').children().last().css("opacity", "1");
$textchat.scrollTop(($textchat[0].scrollHeight));
} }
function typeWriter(target, text, speed, i) { function typeWriter(target, text, speed, i) {
@ -936,8 +936,12 @@ async function Generate(type, automatic_trigger) {
//console.log('about to remove last msg') //console.log('about to remove last msg')
chat.length = chat.length - 1; chat.length = chat.length - 1;
count_view_mes -= 1; count_view_mes -= 1;
//console.log('removing last msg') //$('#chat').children().last().css({'transition':'all 0.5s ease-in-out'});
$("#chat").children().last().remove(); //$('#chat').children().last().css({'transform':'translateX(100vh) scale(0.1,0.1)'});
//$('#chat').children().last().css({'opacity':'0'});
setTimeout(function(){
$('#chat').children().last().remove();
},1000);
} }
} }

View File

@ -2,22 +2,25 @@ import { encode } from "../scripts/gpt-2-3-tokenizer/mod.js";
import { import {
Generate, Generate,
getSettings, /* getSettings,
saveSettings, saveSettings,
printMessages, printMessages,
clearChat, clearChat,
getChat, getChat,
chat
settings, */
this_chid, this_chid,
settings,
characters, characters,
online_status, online_status,
main_api, main_api,
api_server, api_server,
api_key_novel, api_key_novel,
getCharacters, is_send_press,
is_send_press
} from "../script.js"; } from "../script.js";
import { LoadLocal, SaveLocal, ClearLocal, CheckLocal, LoadLocalBool } from "./f-localStorage.js";
var NavToggle = document.getElementById("nav-toggle"); var NavToggle = document.getElementById("nav-toggle");
var PanelPin = document.getElementById("rm_button_panel_pin"); var PanelPin = document.getElementById("rm_button_panel_pin");
var SelectedCharacterTab = document.getElementById("rm_button_selected_ch"); var SelectedCharacterTab = document.getElementById("rm_button_selected_ch");
@ -38,30 +41,6 @@ var count_tokens;
var perm_tokens; var perm_tokens;
var ALC_Done; 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. //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. //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. //Does not break old characters/chats, as the code just uses whatever timestamp exists in the chat.
@ -272,17 +251,13 @@ $("document").ready(function () {
$(AutoLoadChatCheckbox).prop("checked",LoadLocalBool("AutoLoadChatEnabled")); $(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) { if (LoadLocalBool('AutoLoadChatEnabled') == true) {
console.log('calling RA_ALC'); console.log('calling RA_ALC');
RA_autoloadchat(); RA_autoloadchat();
} }
//Autoconnect on page load if enabled, or when api type is changed
if (LoadLocalBool("AutoConnectEnabled") == true) {RA_autoconnect()} if (LoadLocalBool("AutoConnectEnabled") == true) {RA_autoconnect()}
$("#main_api").change(function () {RA_autoconnect();}); $("#main_api").change(function () {RA_autoconnect();});
$("#api_button").click(function () {setTimeout(RA_checkOnlineStatus, 100);}); $("#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) //close the RightNav panel when user clicks outside of it or related panels (adv editing popup, or dialog popups)
@ -343,6 +318,37 @@ $("document").ready(function () {
(this.scrollHeight) + 'px'; (this.scrollHeight) + 'px';
}); });
//Regenerate if user swipes on the last mesage in chat
//TODO:
//1. Make it detect if the last message is from user, and ignore swipes then...
//2. find a way to make the chat slide down smoothly when the last mes div gets .remove()-d
document.addEventListener('swiped-left', function(e) {
var SwipeTargetMesClassParent = e.target.closest('.mes');
if (is_send_press == false){
if (SwipeTargetMesClassParent !== null && SwipeTargetMesClassParent.nextSibling == null ){
$('#chat').children().last().css({'transition':'all 0.5s ease-in-out'});
$('#chat').children().last().css({'transform':'translateX(-100vw) scale(0,0)','overflow':'hidden'});
$('#chat').children().last().css({'opacity':'0'});
Generate('regenerate');
}
}
});
document.addEventListener('swiped-right', function(e) {
var SwipeTargetMesClassParent = e.target.closest('.mes');
console.log(is_send_press);
if (is_send_press === false){
if (SwipeTargetMesClassParent !== null && SwipeTargetMesClassParent.nextSibling == null){
$('#chat').children().last().css({'transition':'all 0.5s ease-in-out'});
$('#chat').children().last().css({'transform':'translateX(100vh) scale(0,0)','overflow':'hidden'});
$('#chat').children().last().css({'opacity':'0'});
Generate('regenerate');
console.log(is_send_press);
}
}
});
//Additional hotkeys CTRL+ENTER and CTRL+UPARROW //Additional hotkeys CTRL+ENTER and CTRL+UPARROW
document.addEventListener("keydown", (event) => { document.addEventListener("keydown", (event) => {
if (event.ctrlKey && event.key == "Enter") { if (event.ctrlKey && event.key == "Enter") {

View File

@ -0,0 +1,25 @@
////////////////// LOCAL STORAGE HANDLING /////////////////////
export function SaveLocal(target, val) {
localStorage.setItem(target, val);
console.log('SaveLocal -- '+target+' : '+val);
}
export function LoadLocal(target) {
return localStorage.getItem(target);
}
export function LoadLocalBool(target){
let result = localStorage.getItem(target) === 'true';
return result;
}
export 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("------------------------------");
}
export function ClearLocal() {localStorage.clear();console.log('Removed All Local Storage');}
/////////////////////////////////////////////////////////////////////////

View File

@ -0,0 +1,165 @@
/*!
* swiped-events.js - v@version@
* Pure JavaScript swipe events
* https://github.com/john-doherty/swiped-events
* @inspiration https://stackoverflow.com/questions/16348031/disable-scrolling-when-touch-moving-certain-element
* @author John Doherty <www.johndoherty.info>
* @license MIT
*/
(function (window, document) {
'use strict';
// patch CustomEvent to allow constructor creation (IE/Chrome)
if (typeof window.CustomEvent !== 'function') {
window.CustomEvent = function (event, params) {
params = params || { bubbles: false, cancelable: false, detail: undefined };
var evt = document.createEvent('CustomEvent');
evt.initCustomEvent(event, params.bubbles, params.cancelable, params.detail);
return evt;
};
window.CustomEvent.prototype = window.Event.prototype;
}
document.addEventListener('touchstart', handleTouchStart, false);
document.addEventListener('touchmove', handleTouchMove, false);
document.addEventListener('touchend', handleTouchEnd, false);
var xDown = null;
var yDown = null;
var xDiff = null;
var yDiff = null;
var timeDown = null;
var startEl = null;
/**
* Fires swiped event if swipe detected on touchend
* @param {object} e - browser event object
* @returns {void}
*/
function handleTouchEnd(e) {
// if the user released on a different target, cancel!
if (startEl !== e.target) return;
var swipeThreshold = parseInt(getNearestAttribute(startEl, 'data-swipe-threshold', '20'), 10); // default 20 units
var swipeUnit = getNearestAttribute(startEl, 'data-swipe-unit', 'px'); // default px
var swipeTimeout = parseInt(getNearestAttribute(startEl, 'data-swipe-timeout', '500'), 10); // default 500ms
var timeDiff = Date.now() - timeDown;
var eventType = '';
var changedTouches = e.changedTouches || e.touches || [];
if (swipeUnit === 'vh') {
swipeThreshold = Math.round((swipeThreshold / 100) * document.documentElement.clientHeight); // get percentage of viewport height in pixels
}
if (swipeUnit === 'vw') {
swipeThreshold = Math.round((swipeThreshold / 100) * document.documentElement.clientWidth); // get percentage of viewport height in pixels
}
if (Math.abs(xDiff) > Math.abs(yDiff)) { // most significant
if (Math.abs(xDiff) > swipeThreshold && timeDiff < swipeTimeout) {
if (xDiff > 0) {
eventType = 'swiped-left';
}
else {
eventType = 'swiped-right';
}
}
}
else if (Math.abs(yDiff) > swipeThreshold && timeDiff < swipeTimeout) {
if (yDiff > 0) {
eventType = 'swiped-up';
}
else {
eventType = 'swiped-down';
}
}
if (eventType !== '') {
var eventData = {
dir: eventType.replace(/swiped-/, ''),
touchType: (changedTouches[0] || {}).touchType || 'direct',
xStart: parseInt(xDown, 10),
xEnd: parseInt((changedTouches[0] || {}).clientX || -1, 10),
yStart: parseInt(yDown, 10),
yEnd: parseInt((changedTouches[0] || {}).clientY || -1, 10)
};
// fire `swiped` event event on the element that started the swipe
startEl.dispatchEvent(new CustomEvent('swiped', { bubbles: true, cancelable: true, detail: eventData }));
// fire `swiped-dir` event on the element that started the swipe
startEl.dispatchEvent(new CustomEvent(eventType, { bubbles: true, cancelable: true, detail: eventData }));
}
// reset values
xDown = null;
yDown = null;
timeDown = null;
}
/**
* Records current location on touchstart event
* @param {object} e - browser event object
* @returns {void}
*/
function handleTouchStart(e) {
// if the element has data-swipe-ignore="true" we stop listening for swipe events
if (e.target.getAttribute('data-swipe-ignore') === 'true') return;
startEl = e.target;
timeDown = Date.now();
xDown = e.touches[0].clientX;
yDown = e.touches[0].clientY;
xDiff = 0;
yDiff = 0;
}
/**
* Records location diff in px on touchmove event
* @param {object} e - browser event object
* @returns {void}
*/
function handleTouchMove(e) {
if (!xDown || !yDown) return;
var xUp = e.touches[0].clientX;
var yUp = e.touches[0].clientY;
xDiff = xDown - xUp;
yDiff = yDown - yUp;
}
/**
* Gets attribute off HTML element or nearest parent
* @param {object} el - HTML element to retrieve attribute from
* @param {string} attributeName - name of the attribute
* @param {any} defaultValue - default value to return if no match found
* @returns {any} attribute value or defaultValue
*/
function getNearestAttribute(el, attributeName, defaultValue) {
// walk up the dom tree looking for attributeName
while (el && el !== document.documentElement) {
var attributeValue = el.getAttribute(attributeName);
if (attributeValue) {
return attributeValue;
}
el = el.parentNode;
}
return defaultValue;
}
}(window, document));

View File

@ -1 +1 @@
{"username":"You","api_server":"","api_server_textgenerationwebui":"","preset_settings":"gui","preset_settings_novel":"Classic-Euterpe","user_avatar":"you.png","temp":0.43,"amount_gen":90,"max_context":2048,"anchor_order":0,"style_anchor":false,"character_anchor":true,"auto_connect":true,"auto_load_chat":true,"main_api":"kobold","api_key_novel":"","rep_pen":1.17,"rep_pen_size":1024,"model_novel":"euterpe-v2","temp_novel":1.11,"rep_pen_novel":1.11,"rep_pen_size_novel":320,"world_info":null,"world_info_depth":2,"world_info_budget":200,"textgenerationwebui_settings":{"temp":0.5,"top_p":0.9,"top_k":0,"typical_p":1,"rep_pen":1.1,"rep_pen_size":0,"penalty_alpha":0}} {"username":"You","api_server":"http://localhost:5000/api","api_server_textgenerationwebui":"","preset_settings":"gui","preset_settings_novel":"Classic-Euterpe","user_avatar":"legat.png","temp":0.43,"amount_gen":180,"max_context":2048,"anchor_order":0,"style_anchor":false,"character_anchor":false,"auto_connect":true,"auto_load_chat":true,"main_api":"kobold","api_key_novel":"","rep_pen":1.17,"rep_pen_size":1024,"model_novel":"euterpe-v2","temp_novel":1.11,"rep_pen_novel":1.11,"rep_pen_size_novel":320,"world_info":null,"world_info_depth":2,"world_info_budget":200,"active_character":"0","textgenerationwebui_settings":{"temp":0.5,"top_p":0.9,"top_k":0,"typical_p":1,"rep_pen":1.1,"rep_pen_size":0,"penalty_alpha":0}}

View File

@ -32,8 +32,11 @@
-webkit-font-smoothing: antialiased; -webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale; -moz-osx-font-smoothing: grayscale;
-moz-appearance: initial; -moz-appearance: initial;
scrolling-behaviour: smooth;
} }
html { scroll-behaviour: smooth;}
body { body {
margin: 0; margin: 0;
padding: 0; padding: 0;
@ -45,18 +48,11 @@ body {
background-size: cover; background-size: cover;
font-family: "Noto Sans", "Noto Color Emoji", sans-serif; font-family: "Noto Sans", "Noto Color Emoji", sans-serif;
font-size: 15px; font-size: 15px;
/*1rem*/
color: var(--ivory); color: var(--ivory);
} }
@media screen and (max-width: 450px) {
body {
margin-left: auto;
margin-right: auto;
overflow-x: hidden;
}
}
::-webkit-scrollbar { ::-webkit-scrollbar {
width: 0.6em; width: 0.6em;
@ -191,6 +187,7 @@ code {
-webkit-backdrop-filter: blur(20px); -webkit-backdrop-filter: blur(20px);
text-shadow: #000 0 0 3px; text-shadow: #000 0 0 3px;
scrollbar-width: thin; scrollbar-width: thin;
transition: all 1s ease-in-out;
} }
@ -811,7 +808,7 @@ input[type=search]:focus::-webkit-search-cancel-button {
margin-top: 0; margin-top: 0;
margin-left: 2px; margin-left: 2px;
cursor: pointer; cursor: pointer;
position: absolute; position: fixed;
z-index: 2050; z-index: 2050;
-webkit-user-select: none; -webkit-user-select: none;
-webkit-touch-callout: none; -webkit-touch-callout: none;
@ -1055,7 +1052,7 @@ input[type=search]:focus::-webkit-search-cancel-button {
margin-top: 36vh; margin-top: 36vh;
box-shadow: 0 0 5px 5px var(--fullred); box-shadow: 0 0 5px 5px var(--fullred);
padding: 4px; padding: 4px;
background-color: var(--black30a); background-color: var(--black70a);
border-radius: 10px; border-radius: 10px;
} }
@ -1788,6 +1785,7 @@ input[type="range"] {
#character_popup { #character_popup {
display: none; display: none;
position:fixed;
background-color: var(--black30a); background-color: var(--black30a);
backdrop-filter: blur(50px); backdrop-filter: blur(50px);
-webkit-backdrop-filter: blur(30px); -webkit-backdrop-filter: blur(30px);
@ -1796,7 +1794,7 @@ input[type="range"] {
max-width: 800px; max-width: 800px;
height: calc(100vh - 50px); height: calc(100vh - 50px);
position: absolute; position: absolute;
z-index: 2065; z-index: 3002;
margin-left: auto; margin-left: auto;
margin-right: auto; margin-right: auto;
left: 0; left: 0;
@ -2429,14 +2427,11 @@ a {
} }
@media screen and (max-width: 450px) { @media screen and (max-width: 450px) {
#right-nav-panel {
width: 100%;
box-shadow: none;
}
} }
#nav-toggle { #nav-toggle {
position: absolute; position: fixed;
right: 13px; right: 13px;
top: 12px; top: 12px;
padding: 0; padding: 0;
@ -2497,8 +2492,70 @@ a {
display: none; display: none;
} }
@media screen and (max-width: 450px) { /*styles for mobile phones (tested on iPhone 13 Pro)*/
body {
font-size: 18px;
}
#bg1, #bg2 {position:fixed;}
#sheld { /*margin around the sides, and a larger one on bottom to avoid iOS Home bar*/
height: calc(100svh - 15px);
margin-left: 5px;
margin-right: 5px;
position: fixed;
}
#send_textarea { /*larger input bar for mobile screens, easier to tap*/
font-size: 1.25rem;
line-height: 1.5rem;
min-height: calc(2rem + 0.75rem + 2px);
max-height: 35vh;
word-wrap: break-word;
height: 40px;
resize: vertical;
display: block;
background-color: rgba(255, 0, 0, 0);
border: 0;
box-shadow: none;
padding: 6px 0 6px 0;
font-family: "Noto Sans", "Noto Color Emoji", sans-serif;
margin: 0;
text-shadow: #000 0 0 3px;
}
#rm_ch_create_block textarea { /*without this the text areas display far too large*/
max-height: 300px;
}
#right-nav-panel, #character_popup { /* character_popup display needs work, "width:100%" items push outside the box */
width: 100%;
box-shadow: none;
}
#character_popup {
margin-top:0;
height:100dvh;
padding-left:15px;
padding-right: 15px;
width: 100vw;
position: fixed;
}
#talkativeness_hint span {
min-width: 33%;
}
/*for debug purposes*/
/** {border: 1px solid purple;}*/
}
@media (max-width: 768px) { @media (max-width: 768px) {
.mes img.img_extra { .mes img.img_extra {
max-width: 100%; max-width: 100%;
} }
} }
@media all and (display-mode: browser) { /*Even in iOS WebApp mode the window detects as this; unhelpful.*/
* {
}
}

View File

@ -1,16 +1,19 @@
## RossAscends 1.2.8 mods ported into Silly TavernAI 1.2.8 ## RossAscends mods ported into SillyLossy's TavernAI 1.2.8
<img width="400" alt="image" src="https://user-images.githubusercontent.com/18619528/224549531-ab30db22-fe33-49c5-81a8-945c543a1e05.png"> <img width="400" alt="image" src="https://user-images.githubusercontent.com/18619528/224549531-ab30db22-fe33-49c5-81a8-945c543a1e05.png">
## This branch includes: ## This branch includes:
* Base TavernAI 1.2.8 * Base TavernAI 1.2.8
* SillyLossy's extensive 1.2.8 modifications and functions ( * SillyLossy's extensive 1.2.8 modifications and functions
* World Info * World Info
* OobaBooga's TextGen WebUI API connection * OobaBooga's TextGen WebUI API connection
* Soft prompts * Soft prompts
* Character emotional expressions * installing [SillyLossy's TAI-extras](https://github.com/SillyLossy/TavernAI-extras) will give support for
* Auto-Summary of the chat history * Character emotional expressions
* Auto-Summary of the chat history
* sending images to chat, and the AI interpreting the content.
...and... ...and...
@ -21,12 +24,11 @@
* Mobile-friendly page design * Mobile-friendly page design
* HotKeys * HotKeys
* Ctrl+Up = Connect to API * Ctrl+Up = Connect to API
* Ctrl+Left = view localled stored variables (in the browser console window) * Ctrl+Left = view locally stored variables (in the browser console window)
* Ctrl+Right = clear locally stored variables. * Ctrl+Right = clear locally stored variables.
* Ctrl+enter = Regenerate last AI response. * Ctrl+enter = Regenerate last AI response.
* No more page refresh on character deletion * User Name Changes and Character Deletion no longer force the page to refresh.
* No more page refresh on user name change
* Toggle option to automatically connect to API on page load (currently only for Kobold) * Toggle option to automatically connect to API on page load (currently only for Kobold)
* Toggle option to automatically load the most recently viewed character on page load * Toggle option to automatically load the most recently viewed character on page load
@ -40,14 +42,16 @@
* Clicking the Lock on the nav panel will hold the panel open, and this setting be remembered across sessions. * Clicking the Lock on the nav panel will hold the panel open, and this setting be remembered across sessions.
* Nav panel status of open or closed will also be saved across sessions. * Nav panel status of open or closed will also be saved across sessions.
* Supports saving a shortcut to iOS homescreens and opening in fullscreen mode from that bookmark.
## Installation ## Installation
*NOTE: This branch is intended for local install purposes, and has not been tested on a colab or other cloud notebook service.* *NOTE: This branch is intended for local install purposes, and has not been tested on a colab or other cloud notebook service.*
1. install [NodeJS](nodejs.org) 1. install [NodeJS](nodejs.org)
2. download the zip from this github 2. download the zip from this github repo
3. unzip it into a folder of your choice 3. unzip it into a folder of your choice
4. run start.bat with aby double clicking or in a command line. 4. run start.bat via double clicking or in a command line.
5. Once the server has prepared everything for you, it will open a tab in your browser. 5. Once the server has prepared everything for you, it will open a tab in your browser.
## Remote connections ## Remote connections
@ -56,21 +60,22 @@ Most often this is for people who want use TAI on their mobile phones while at h
If you want to enable other devices to connect to your TAI server, open 'config.conf' in a text editor, and change: If you want to enable other devices to connect to your TAI server, open 'config.conf' in a text editor, and change:
``` ```
const whitelistMode = false; const whitelistMode = true;
``` ```
to to
``` ```
const whitelistMode = true; const whitelistMode = false;
``` ```
Save the file. Save the file.
Close, then restart your TAI server. Restart your TAI server.
You will now be able to connect from other devices. You will now be able to connect from other devices.
***Disclaimer: Anyone else who knows your IP address and TAI port number will be able to as well*** ***Disclaimer: Anyone else who knows your IP address and TAI port number will be able to as well***
To connect over wifi you'll need your PC's local wifi IP address To connect over wifi you'll need your PC's local wifi IP address
- (For Windows: windows button > type 'cmd.exe' in the search bar> type 'ipconfig' in the consol, hit Enter > "IPv4" listing) - (For Windows: windows button > type 'cmd.exe' in the search bar> type 'ipconfig' in the console, hit Enter > "IPv4" listing)
if you want other people around the internet to connect, check [here](https://whatismyipaddress.com/) for 'IPv4' if you want other people on the internet to connect, and check [here](https://whatismyipaddress.com/) for 'IPv4'
## Questions or suggestions? ## Questions or suggestions?
Contact me on Discord: RossAscends#1779 Contact me on Discord: RossAscends#1779