Merge branch 'SillyTavern:staging' into staging

This commit is contained in:
Tony Ribeiro 2023-10-14 04:35:42 +02:00 committed by GitHub
commit 29f045636a
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
12 changed files with 98 additions and 102 deletions

View File

@ -2,7 +2,7 @@
![image](https://github.com/SillyTavern/SillyTavern/assets/18619528/8c41a061-7f72-4d2b-9d54-e6d058209e7b)
移动设备界面友好多种人工智能服务或模型支持KoboldAI/CPP, Horde, NovelAI, Ooba, OpenAI, OpenRouter, Claude, Scale类似 Galgame 的 老 婆 模 式Horde SD文本系统语音生成世界信息Lorebooks可定制的界面自动翻译和比你所需要的更多的 Prompt。附带扩展服务支持文本绘画生成与语音生成和基于向量数据库 ChromaDB 的聊天信息总结。
移动设备界面友好多种人工智能服务或模型支持KoboldAI/CPP, Horde, NovelAI, Ooba, OpenAI, OpenRouter, Claude, Scale类似 Galgame 的 老 婆 模 式Horde SD文本系统语音生成世界信息Lorebooks可定制的界面自动翻译和比你所需要的更多的 Prompt。附带扩展服务支持文本绘画生成与语音生成和基于向量数据库 的聊天信息总结。
基于 TavernAI 1.2.8 的分叉版本
@ -81,7 +81,6 @@ SillyTavern 支持扩展服务,一些额外的人工智能模块可通过 [Sil
* 在聊天窗口发送图片,并由人工智能解释图片内容
* 文本图像生成5 预设,以及 "自由模式"
* 聊天信息的文字转语音(通过 ElevenLabs、Silero 或操作系统的语音生成)
* ChromaDB 向量数据库,用于更智能的聊天 Prompt
扩展服务的完整功能介绍和使用教程,请参阅 [Docs](https://docs.sillytavern.app/extras/extensions/)。

3
.github/readme.md vendored
View File

@ -2,7 +2,7 @@ English | [中文](readme-zh_cn.md)
![image](https://github.com/SillyTavern/SillyTavern/assets/18619528/8c41a061-7f72-4d2b-9d54-e6d058209e7b)
Mobile-friendly, Multi-API (KoboldAI/CPP, Horde, NovelAI, Ooba, OpenAI, OpenRouter, Claude, Scale), VN-like Waifu Mode, Horde SD, System TTS, WorldInfo (lorebooks), customizable UI, auto-translate, and more prompt options than you'd ever want or need. Optional Extras server for more SD/TTS options + ChromaDB/Summarize.
Mobile-friendly layout, Multi-API (KoboldAI/CPP, Horde, NovelAI, Ooba, OpenAI, OpenRouter, Claude, Scale), VN-like Waifu Mode, Stable Diffusion, TTS, WorldInfo (lorebooks), customizable UI, auto-translate, and more prompt options than you'd ever want or need + ability to install third-party extensions.
Based on a fork of TavernAI 1.2.8
@ -80,7 +80,6 @@ SillyTavern has extensibility support, with some additional AI modules hosted vi
* Sending images to chat, and the AI interpreting the content
* Stable Diffusion image generation (5 chat-related presets plus 'free mode')
* Text-to-speech for AI response messages (via ElevenLabs, Silero, or the OS's System TTS)
* ChromaDB vector storage for smarter chat prompt formatting
A full list of included extensions and tutorials on how to use them can be found in the [Docs](https://docs.sillytavern.app/extras/extensions/).

View File

@ -70,7 +70,7 @@
"#@markdown * ckpt/sd15 - base SD 1.5\n",
"#@markdown * stabilityai/stable-diffusion-2-1-base - base SD 2.1\n",
"extras_enable_chromadb = True #@param {type:\"boolean\"}\n",
"#@markdown Enables ChromaDB for Infinity Context plugin\n",
"#@markdown Enables ChromaDB module\n",
"\n",
"import subprocess\n",
"import secrets\n",

View File

@ -328,9 +328,7 @@ body.movingUI .drawer-content,
body.movingUI #expression-holder,
body.movingUI .zoomed_avatar,
body.movingUI .draggable,
body.movingUI #floatingPrompt,
body.movingUI #groupMemberListPopout,
body.movingUI #summaryExtensionPopout {
body.movingUI #floatingPrompt {
resize: both;
}

View File

@ -122,11 +122,11 @@
<div class="flex-container" id="ai_response_configuration">
<div id="respective-presets-block" class="width100p">
<div id="kobold_api-presets">
<h3><span data-i18n="kobldpresets">Kobold Presets</span>
<h4 class="margin0"><span data-i18n="kobldpresets">Kobold Presets</span>
<a href="https://docs.sillytavern.app/usage/api-connections/koboldai/" class="notes-link" target="_blank">
<span class="note-link-span">?</span>
</a>
</h3>
</h4>
<div class="preset_buttons">
<select id="settings_perset" data-preset-manager-for="kobold">
<option value="gui" data-i18n="guikoboldaisettings">GUI KoboldAI Settings</option>
@ -140,12 +140,12 @@
</div>
</div>
<div id="novel_api-presets">
<h3>
<h4 class="margin0">
<span data-i18n="novelaipreserts">NovelAI Presets</span>
<a href="https://docs.sillytavern.app/usage/api-connections/novelai/" class="notes-link" target="_blank">
<span class="note-link-span">?</span>
</a>
</h3>
</h4>
<div class="preset_buttons">
<select id="settings_perset_novel" data-preset-manager-for="novel">
<option value="gui" data-i18n="default">Default</option>
@ -160,7 +160,7 @@
</div>
<div id="openai_api-presets">
<div>
<h4><span data-i18n="openaipresets">Chat Completion Presets</span></h4>
<h4 class="margin0"><span data-i18n="openaipresets">Chat Completion Presets</span></h4>
<div class="openai_preset_buttons">
<select id="settings_perset_openai">
<option value="gui" data-i18n="default">Default</option>
@ -175,8 +175,7 @@
</div>
</div>
<div id="textgenerationwebui_api-presets">
<h3><span data-i18n="Text Gen WebUI (ooba/Mancer) presets">Text Gen WebUI (ooba/Mancer) presets</span>
</h3>
<h4 class="margin0"><span data-i18n="Text Gen WebUI (ooba/Mancer) presets">Text Gen WebUI (ooba/Mancer) presets</span></h4>
<div class="preset_buttons">
<select id="settings_preset_textgenerationwebui" data-preset-manager-for="textgenerationwebui">
</select>
@ -1755,7 +1754,7 @@
<div id="API-status-top" class="drawer-icon fa-solid fa-plug-circle-exclamation closedIcon" title="API Connections" data-i18n="[title]API Connections"></div>
</div>
<div id="rm_api_block" class="drawer-content closedDrawer">
<h3 id="title_api">API</h3>
<h3 class="margin0" id="title_api">API</h3>
<div class="flex-container flexFlowColumn">
<div id="main-API-selector-block">
<select id="main_api">
@ -1967,9 +1966,9 @@
</div>
</div>
<div id="openai_api" style="display: none;position: relative;">
<h3 data-i18n="Chat Completion Source">
<h4 class="margin0" data-i18n="Chat Completion Source">
Chat Completion Source
</h3>
</h4>
<select id="chat_completion_source">
<option value="openai">OpenAI</option>
<option value="windowai">Window AI</option>
@ -2237,7 +2236,7 @@
<div class="drawer-icon fa-solid fa-font closedIcon" title="AI Response Formatting" data-i18n="[title]AI Response Formatting"></div>
</div>
<div class="drawer-content">
<h3 data-i18n="Advanced Formatting">Advanced Formatting
<h3 class="margin0" data-i18n="Advanced Formatting">Advanced Formatting
<a href="https://docs.sillytavern.app/usage/core-concepts/advancedformatting/" class="notes-link" target="_blank">
<span class="note-link-span">?</span>
</a>
@ -2620,7 +2619,7 @@
<div class="unchecked fa-solid fa-unlock "></div>
<div class="checked fa-solid fa-lock "></div>
</label>
<h3>
<h3 class="margin0">
<span data-i18n="Worlds/Lorebooks">Worlds/Lorebooks</span>
<a href="https://docs.sillytavern.app/usage/core-concepts/worldinfo/" class="notes-link" target="_blank">
<span class="note-link-span">?</span>
@ -2797,7 +2796,7 @@
<div name="userSettingsRowOne" class="flex-container flexFlowRow alignitemscenter spaceBetween">
<div class="flex-container">
<div class="flex-container flexnowrap alignitemscenter">
<h3><span data-i18n="User Settings">User Settings</span></h3>
<h3 class="margin0"><span data-i18n="User Settings">User Settings</span></h3>
<select id="ui_mode_select" class="margin0 widthNatural">
<option value="0" data-i18n="Simple">Simple</option>
<option value="1" data-i18n="Advanced">Advanced</option>
@ -3273,7 +3272,7 @@
</div>
<div class="drawer-content closedDrawer">
<div class="flex-container wide100p alignitemscenter spaceBetween">
<h3><span data-i18n="Persona Management">Persona Management</span></h3>
<h3 class="margin0"><span data-i18n="Persona Management">Persona Management</span></h3>
<a href="https://docs.sillytavern.app/usage/core-concepts/personas/" target="_blank" data-i18n="How do I use this?">How do I use this?</a>
<div id="persona-management-block" class="flex-container wide100p">
<div class="flex1">
@ -3674,7 +3673,7 @@
<div id="dialogue_popup">
<div id="dialogue_popup_holder">
<div id="dialogue_popup_text">
<h3>text</h3>
<h3 class="margin0">text</h3>
</div>
<textarea id="dialogue_popup_input" class="text_pole" rows="1"></textarea>
<div id="dialogue_popup_controls">
@ -3687,7 +3686,7 @@
<div id="character_popup" class="flex-container flexFlowColumn flexNoGap">
<div id="character_popup_text">
<h3 id="character_popup_text_h3"></h3> <span data-i18n="Advanced Defininitions">- Advanced
<h3 id="character_popup_text_h3" class="margin0"></h3> <span data-i18n="Advanced Defininitions">- Advanced
Definitions</span>
</div>
<hr class="margin-bot-10px">
@ -3868,7 +3867,7 @@
<div id="scenario_override_template" class="template_element">
<div class="scenario_override range-block flexFlowColumn flex-container">
<div class="range-block-title title_restorable">
<h3><span data-i18n="Chat Scenario Override">Chat Scenario Override</span></h3>
<h3><span data-i18n="Chat Scenario Override" class="margin0">Chat Scenario Override</span></h3>
<div title="Remove" data-i18n="[title]Remove" class="menu_button fa-solid fa-trash-can remove_scenario_override"></div>
</div>
<div class="range-block-counter justifyLeft flex-container flexFlowColumn">
@ -4781,6 +4780,7 @@
<template id="generic_draggable_template">
<div class="draggable">
<div class="dragTitle"></div>
<div class="panelControlBar flex-container">
<div class="fa-solid fa-grip drag-grabber"></div>
<div class="fa-solid fa-circle-xmark dragClose"></div>
@ -4838,4 +4838,4 @@
</script>
</body>
</html>
</html>

View File

@ -123,8 +123,7 @@ function downloadAssetsList(url) {
$(`<i></i>`)
.append(element)
.append(`<span>${displayName}</span>`)
.append(`<span>${description}</span>`)
.append(`<div class="flex-container flexFlowColumn"><span>${displayName}</span><span>${description}</span></div>`)
.appendTo(assetTypeMenu);
}
assetTypeMenu.appendTo("#assets_menu");

View File

@ -5,7 +5,7 @@ import {
getRequestHeaders,
} from "../../../script.js";
import { selected_group } from "../../group-chats.js";
import { loadFileToDocument } from "../../utils.js";
import { loadFileToDocument, delay } from "../../utils.js";
import { loadMovingUIState } from '../../power-user.js';
import { dragElement } from '../../RossAscends-mods.js';
import { registerSlashCommand } from "../../slash-commands.js";
@ -109,6 +109,13 @@ async function initGallery(items, url) {
let file = e.originalEvent.dataTransfer.files[0];
uploadFile(file, url); // Added url parameter to know where to upload
});
//let images populate first
await delay(100)
//unset the height (which must be getting set by the gallery library at some point)
$("#dragGallery").css('height', 'unset');
//force a resize to make images display correctly
jQuery("#dragGallery").nanogallery2('resize');
}
/**
@ -247,14 +254,16 @@ $(document).ready(function () {
* The cloned element has its attributes set, a new child div appended, and is made visible on the body.
* Additionally, it sets up the element to prevent dragging on its images.
*/
function makeMovable(id="gallery"){
function makeMovable(id = "gallery") {
console.debug('making new container from template')
const template = $('#generic_draggable_template').html();
const newElement = $(template);
newElement.css('background-color', 'var(--SmartThemeBlurTintColor)');
newElement.attr('forChar', id);
newElement.attr('id', `${id}`);
newElement.find('.drag-grabber').attr('id', `${id}header`);
newElement.find('.dragTitle').text('Image Gallery')
//add a div for the gallery
newElement.append(`<div id="dragGallery"></div>`);
// add no-scrollbar class to this element
@ -326,6 +335,8 @@ function makeDragImg(id, url) {
// Ensure that the newly added element is displayed as block
draggableElem.style.display = 'block';
//and has no padding unlike other non-zoomed-avatar draggables
draggableElem.style.padding = '0';
// Add an id to the close button
// If the close button exists, set related-id
@ -375,11 +386,11 @@ function makeDragImg(id, url) {
* @param {string} id - The ID to be sanitized.
* @returns {string} - The sanitized ID.
*/
function sanitizeHTMLId(id){
function sanitizeHTMLId(id) {
// Replace spaces and non-word characters
id = id.replace(/\s+/g, '-')
.replace(/[^\x00-\x7F]/g, '-')
.replace(/\W/g, '');
.replace(/[^\x00-\x7F]/g, '-')
.replace(/\W/g, '');
return id;
}

View File

@ -571,12 +571,13 @@ function doPopout(e) {
const template = $('#zoomed_avatar_template').html();
const controlBarHtml = `<div class="panelControlBar flex-container">
<div id="summaryExtensionPopoutheader" class="fa-solid fa-grip drag-grabber hoverglow"></div>
<div id="summaryExtensionPopoutClose" class="fa-solid fa-circle-xmark hoverglow"></div>
<div id="summaryExtensionPopoutClose" class="fa-solid fa-circle-xmark hoverglow dragClose"></div>
</div>`
const newElement = $(template);
newElement.attr('id', 'summaryExtensionPopout');
newElement.removeClass('zoomed_avatar')
newElement.empty()
newElement.attr('id', 'summaryExtensionPopout')
.removeClass('zoomed_avatar')
.addClass('draggable')
.empty()
const prevSummaryBoxContents = $('#memory_contents').val(); //copy summary box before emptying
originalElement.empty();
originalElement.html(`<div class="flex-container alignitemscenter justifyCenter wide100p"><small>Currently popped out</small></div>`)

View File

@ -1555,11 +1555,14 @@ function doCurMemberListPopout() {
<div id="groupMemberListPopoutClose" class="fa-solid fa-circle-xmark hoverglow"></div>
</div>`
const newElement = $(template);
newElement.attr('id', 'groupMemberListPopout');
newElement.removeClass('zoomed_avatar')
newElement.empty()
newElement.append(controlBarHtml).append(memberListClone)
newElement.attr('id', 'groupMemberListPopout')
.removeClass('zoomed_avatar')
.addClass('draggable')
.empty()
.append(controlBarHtml)
.append(memberListClone)
$('body').append(newElement);
loadMovingUIState();
$("#groupMemberListPopout").fadeIn(250)

View File

@ -1413,12 +1413,14 @@ async function resetMovablePanels(type) {
'floatingPrompt',
'expression-holder',
'groupMemberListPopout',
'summaryExtensionPopout'
'summaryExtensionPopout',
'gallery'
];
const panelStyles = ['top', 'left', 'right', 'bottom', 'height', 'width', 'margin',];
panelIds.forEach((id) => {
console.log(id)
const panel = document.getElementById(id);
if (panel) {

View File

@ -351,6 +351,7 @@ hr {
height: 1px;
min-height: 1px;
border: 0;
opacity: 0.2;
}
#bg1,
@ -389,7 +390,7 @@ hr {
display: inline-block;
height: var(--bottomFormBlockSize);
position: absolute;
border-bottom: 1px solid var(--SmartThemeBorderColor);
/* border-bottom: 1px solid var(--SmartThemeBorderColor); */
box-shadow: 0 2px 20px 0 var(--black70a);
backdrop-filter: blur(var(--SmartThemeBlurStrength));
background-color: var(--SmartThemeBlurTintColor);
@ -421,23 +422,25 @@ hr {
.drag-grabber {
position: absolute;
width: 20px !important;
height: 20px !important;
/* width: 20px !important;
height: 20px !important; */
margin: 0px 5px;
color: var(--SmartThemeBodyColor);
z-index: 2000;
text-align: center;
border-radius: 5px;
/* border-radius: 5px; */
vertical-align: middle;
right: 0px;
top: 0px;
opacity: 0.5;
cursor: grab;
border: 1px solid var(--SmartThemeBorderColor);
/* border: 1px solid var(--SmartThemeBorderColor); */
cursor: -moz-grab;
cursor: -webkit-grab;
display: none;
filter: drop-shadow(0px 0px 0px black);
transition: all 250ms;
font-size: calc(var(--mainFontSize)*1.3);
}
.drag-grabber:hover {
@ -480,9 +483,9 @@ hr {
overflow-y: scroll;
display: flex;
bottom: 10px;
border-bottom: 1px solid var(--SmartThemeBorderColor);
/* border-bottom: 1px solid var(--SmartThemeBorderColor);
border-left: 1px solid var(--SmartThemeBorderColor);
border-right: 1px solid var(--SmartThemeBorderColor);
border-right: 1px solid var(--SmartThemeBorderColor); */
backdrop-filter: blur(var(--SmartThemeBlurStrength));
background-color: var(--SmartThemeChatTintColor);
-webkit-backdrop-filter: blur(var(--SmartThemeBlurStrength));
@ -959,10 +962,10 @@ select {
#character_cross,
#select_chat_cross {
position: absolute;
right: 15px;
top: 15px;
width: 20px;
height: 20px;
right: 5px;
top: 5px;
/* width: 20px;
height: 20px; */
cursor: pointer;
opacity: 0.6;
font-size: 24px;
@ -1251,9 +1254,11 @@ input[type="file"] {
.dragClose {
height: 15px;
aspect-ratio: 1 / 1;
font-size: 20px;
font-size: calc(var(--mainFontSize)*1.3);
opacity: 0.5;
transition: all 250ms;
filter: drop-shadow(0px 0px 2px black);
text-shadow: none;
}
.dragClose:hover {
@ -1604,11 +1609,6 @@ input[type=search]:focus::-webkit-search-cancel-button {
align-items: center;
}
#user-settings-block h4,
#user-settings-block h3 {
margin: 5px 0;
}
#avatar-and-name-block {
justify-content: space-between;
display: flex;
@ -3409,51 +3409,38 @@ a {
color: var(--SmartThemeBodyColor);
}
.zoomed_avatar,
#groupMemberListPopout,
#summaryExtensionPopout {
min-width: 100px;
min-height: 100px;
max-height: 90vh;
max-width: 90vh;
width: clamp(100px, 400px, calc((100vw - var(--sheldWidth)) /2));
/* width: calc((100vw - var(--sheldWidth)) /2); */
position: absolute;
padding: 0;
/* filter: drop-shadow(2px 2px 2px var(--grey7070a)); */
box-shadow: 1px 2px 2px var(--black30a);
z-index: 29;
overflow: hidden;
display: none;
bottom: 0;
border-radius: 10px;
}
.zoomed_avatar {
aspect-ratio: 2 / 3;
}
#groupMemberListPopout,
#summaryExtensionPopout {
border: 1px solid var(--SmartThemeBorderColor);
padding: 5px;
}
.draggable {
min-width: 100px;
min-height: 100px;
max-height: 90vh;
max-width: 90vh;
width: clamp(100px, 400px, calc((100vw - var(--sheldWidth)) /2));
max-width: 90vw;
width: calc((100vw - var(--sheldWidth)) /2);
position: absolute;
padding: 0;
filter: drop-shadow(2px 2px 2px var(--grey7070a));
filter: drop-shadow(1px 1px 2px var(--black50a));
z-index: 29;
overflow: hidden;
display: none;
bottom: 0;
aspect-ratio: 2 / 3;
border-radius: 10px;
border: 1px solid var(--SmartThemeBorderColor);
aspect-ratio: unset;
backdrop-filter: blur(var(--SmartThemeBlurStrength));
background-color: var(--SmartThemeBlurTintColor);
padding: 5px;
}
.zoomed_avatar {
aspect-ratio: 2 / 3;
padding: 0;
border: 0;
}
.zoomed_avatar img {
height: 100%;
width: 100%;
vertical-align: bottom;
object-fit: cover;
}
/* Hide scrollbar for Chrome, Safari and Opera */
@ -3477,13 +3464,13 @@ a {
transition: all 250ms;
}
#groupMemberListPopout,
/* #groupMemberListPopout,
#summaryExtensionPopout {
aspect-ratio: unset;
backdrop-filter: blur(var(--SmartThemeBlurStrength));
background-color: var(--SmartThemeBlurTintColor);
overflow: auto;
}
} */
#groupMemberListPopout {
padding: 0;
@ -3497,13 +3484,7 @@ a {
}
.zoomed_avatar img {
border-radius: 20px;
height: 100%;
width: 100%;
vertical-align: bottom;
object-fit: cover;
}
.timestamp {
font-size: calc(var(--mainFontSize) * 0.7);

View File

@ -627,6 +627,9 @@ app.post("/generate_textgenerationwebui", jsonParser, async function (request, r
yield message.text;
break;
case 'stream_end':
if (message.error) {
yield `\n[API Error] ${message.error}\n`
}
websocket.close();
return;
}