mirror of
https://github.com/SillyTavern/SillyTavern.git
synced 2025-06-05 21:59:27 +02:00
Compare commits
18 Commits
Author | SHA1 | Date | |
---|---|---|---|
|
c299ef0a86 | ||
|
0dbf219116 | ||
|
b3e1dd8a42 | ||
|
737bb5a030 | ||
|
cf9248121f | ||
|
4282cb51dd | ||
|
efc76dfd05 | ||
|
8cd6467aa9 | ||
|
a1b8c135e4 | ||
|
2b69c1793c | ||
|
861e9a31e5 | ||
|
5b926d4ad3 | ||
|
77f76ae315 | ||
|
c3af38f5b8 | ||
|
3cf23f277c | ||
|
a74828df15 | ||
|
bf7f04e3b2 | ||
|
5df7d2d1dc |
297
.github/readme.md
vendored
Normal file
297
.github/readme.md
vendored
Normal file
@@ -0,0 +1,297 @@
|
|||||||
|

|
||||||
|
|
||||||
|
Mobile-friendly, Multi-API (KoboldAI/CPP, Horde, NovelAI, Ooba, OpenAI+proxies, Poe, WindowAI(Claude!)), 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.
|
||||||
|
|
||||||
|
Based on a fork of TavernAI 1.2.8
|
||||||
|
|
||||||
|
### Brought to you by Cohee, RossAscends and the SillyTavern community
|
||||||
|
|
||||||
|
NOTE: We have added [a FAQ](faq.md) to answer most of your questions and help you get started.
|
||||||
|
|
||||||
|
### What is SillyTavern or TavernAI?
|
||||||
|
|
||||||
|
Tavern is a user interface you can install on your computer (and Android phones) that allows you to interact with text generation AIs and chat/roleplay with characters you or the community create.
|
||||||
|
|
||||||
|
SillyTavern is a fork of TavernAI 1.2.8 which is under more active development and has added many major features. At this point, they can be thought of as completely independent programs.
|
||||||
|
|
||||||
|
### What do I need other than Tavern?
|
||||||
|
|
||||||
|
On its own Tavern is useless, as it's just a user interface. You have to have access to an AI system backend that can act as the roleplay character. There are various supported backends: OpenAPI API (GPT), KoboldAI (either running locally or on Google Colab), and more. You can read more about this in [the FAQ](faq.md).
|
||||||
|
|
||||||
|
### Do I need a powerful PC to run Tavern?
|
||||||
|
|
||||||
|
Since Tavern is only a user interface, it has tiny hardware requirements, it will run on anything. It's the AI system backend that needs to be powerful.
|
||||||
|
|
||||||
|
## Mobile support
|
||||||
|
|
||||||
|
> **Note**
|
||||||
|
|
||||||
|
> **This fork can be run natively on Android phones using Termux. Please refer to this guide by ArroganceComplex#2659:**
|
||||||
|
|
||||||
|
<https://rentry.org/STAI-Termux>
|
||||||
|
|
||||||
|
**.webp character cards import/export is not supported in Termux. Use either JSON or PNG formats instead.**
|
||||||
|
|
||||||
|
## Questions or suggestions?
|
||||||
|
|
||||||
|
### We now have a community Discord server
|
||||||
|
|
||||||
|
Get support, share favorite characters and prompts:
|
||||||
|
|
||||||
|
### [Join](https://discord.gg/RZdyAEUPvj)
|
||||||
|
|
||||||
|
***
|
||||||
|
|
||||||
|
Get in touch with the developers directly:
|
||||||
|
|
||||||
|
* Discord: Cohee#1207 or RossAscends#1779
|
||||||
|
* Reddit: /u/RossAscends or /u/sillylossy
|
||||||
|
* [Post a GitHub issue](https://github.com/Cohee1207/SillyTavern/issues)
|
||||||
|
|
||||||
|
## This version includes
|
||||||
|
|
||||||
|
* A heavily modified TavernAI 1.2.8 (more than 50% of code rewritten or optimized)
|
||||||
|
* Swipes
|
||||||
|
* Group chats: multi-bot rooms for characters to talk to you or each other
|
||||||
|
* Chat bookmarks / branching (duplicates the dialogue in its current state)
|
||||||
|
* Advanced KoboldAI / TextGen generation settings with a lot of community-made presets
|
||||||
|
* World Info support: create a rich lore or save tokens on your character card
|
||||||
|
* Window AI browser extension support (run models like Claude, GPT 4): https://windowai.io/
|
||||||
|
* [Oobabooga's TextGen WebUI](https://github.com/oobabooga/text-generation-webui) API connection
|
||||||
|
* [AI Horde](https://horde.koboldai.net/) connection
|
||||||
|
* [Poe.com](https://poe.com) (ChatGPT / Claude) connection
|
||||||
|
* Soft prompts selector for KoboldAI
|
||||||
|
* Prompt generation formatting tweaking
|
||||||
|
* webp character card interoperability (PNG is still an internal format)
|
||||||
|
|
||||||
|
## Extensions
|
||||||
|
|
||||||
|
SillyTavern has an extensibility support, with some additional AI modules hosted via [SillyTavern Extras API](https://github.com/SillyTavern/SillyTavern-extras)
|
||||||
|
|
||||||
|
* Author's Note / Character Bias
|
||||||
|
* Character emotional expressions
|
||||||
|
* Auto-Summary of the chat history
|
||||||
|
* 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)
|
||||||
|
|
||||||
|
Full list of included extenisons and tutorials how to use them can be found on [Wiki](https://github.com/SillyTavern/SillyTavern/wiki).
|
||||||
|
|
||||||
|
## UI/CSS/Quality of Life tweaks by RossAscends
|
||||||
|
|
||||||
|
* Mobile UI with optimized for iOS, and supports saving a shortcut to home screen and opening in fullscreen mode.
|
||||||
|
* HotKeys
|
||||||
|
* Up = Edit last message in chat
|
||||||
|
* Ctrl+Up = Edit last USER message in chat
|
||||||
|
* Left = swipe left
|
||||||
|
* Right = swipe right (NOTE: swipe hotkeys are disabled when chatbar has something typed into it)
|
||||||
|
* Ctrl+Left = view locally stored variables (in the browser console window)
|
||||||
|
* Enter (with chat bar selected) = send your message to AI
|
||||||
|
* Ctrl+Enter = Regenerate the last AI response
|
||||||
|
|
||||||
|
* User Name Changes and Character Deletion no longer force the page to refresh.
|
||||||
|
|
||||||
|
* Toggle option to automatically connect to API on page load.
|
||||||
|
* Toggle option to automatically load the most recently viewed character on page load.
|
||||||
|
* Better Token Counter - works on unsaved characters, and shows both permanent and temporary tokens.
|
||||||
|
|
||||||
|
* Better Past Chats View
|
||||||
|
* New Chat filenames are saved in a readable format of "(character) - (when it was created)"
|
||||||
|
* Chat preview increased from 40 characters to 300.
|
||||||
|
* Multiple options for characters list sorting (by name, creation date, chat sizes).
|
||||||
|
|
||||||
|
* By default the left and right settings panel will close when you click away from it.
|
||||||
|
* 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.
|
||||||
|
|
||||||
|
* Customizable chat UI:
|
||||||
|
* Play a sound when a new message arrives
|
||||||
|
* Switch between round or rectangle avatar styles
|
||||||
|
* Have a wider chat window on the desktop
|
||||||
|
* Optional semi-transparent glass-like panels
|
||||||
|
* Customizable page colors for 'main text', 'quoted text' 'italics text'.
|
||||||
|
* Customizable UI background color and blur amount
|
||||||
|
|
||||||
|
## Installation
|
||||||
|
|
||||||
|
*NOTE: This software is intended for local install purposes, and has not been thoroughly tested on a colab or other cloud notebook service.*
|
||||||
|
|
||||||
|
> **Warning**
|
||||||
|
|
||||||
|
> DO NOT INSTALL INTO ANY WINDOWS CONTROLLED FOLDER (Program Files, System32, etc).
|
||||||
|
|
||||||
|
> DO NOT RUN START.BAT WITH ADMIN PERMISSIONS
|
||||||
|
|
||||||
|
### Windows
|
||||||
|
|
||||||
|
Installing via Git (recommended for easy updating)
|
||||||
|
|
||||||
|
Easy to follow guide with pretty pictures:
|
||||||
|
<https://docs.alpindale.dev/pygmalion-extras/sillytavern/#windows-installation>
|
||||||
|
|
||||||
|
1. Install [NodeJS](https://nodejs.org/en) (latest LTS version is recommended)
|
||||||
|
2. Install [GitHub Desktop](https://central.github.com/deployments/desktop/desktop/latest/win32)
|
||||||
|
3. Open Windows Explorer (`Win+E`)
|
||||||
|
4. Browse to or Create a folder that is not controlled or monitored by Windows. (ex: C:\MySpecialFolder\)
|
||||||
|
5. Open a Command Prompt inside that folder by clicking in the 'Address Bar' at the top, typing `cmd`, and pressing Enter.
|
||||||
|
6. Once the black box (Command Prompt) pops up, type ONE of the following into it and press Enter:
|
||||||
|
|
||||||
|
* for Main Branch: `git clone https://github.com/Cohee1207/SillyTavern -b main`
|
||||||
|
* for Dev Branch: `git clone https://github.com/Cohee1207/SillyTavern -b dev`
|
||||||
|
|
||||||
|
7. Once everything is cloned, double click `Start.bat` to make NodeJS install its requirements.
|
||||||
|
8. The server will then start, and SillyTavern will popup in your browser.
|
||||||
|
|
||||||
|
Installing via zip download
|
||||||
|
|
||||||
|
1. Install [NodeJS](https://nodejs.org/en) (latest LTS version is recommended)
|
||||||
|
2. Download the zip from this GitHub repo. (Get the `Source code (zip)` from [Releases](https://github.com/Cohee1207/SillyTavern/releases/latest))
|
||||||
|
3. Unzip it into a folder of your choice
|
||||||
|
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.
|
||||||
|
|
||||||
|
### Linux
|
||||||
|
|
||||||
|
1. Run the `start.sh` script.
|
||||||
|
2. Enjoy.
|
||||||
|
|
||||||
|
## API keys management
|
||||||
|
|
||||||
|
SillyTavern saves your API keys to a `secrets.json` file in the server directory.
|
||||||
|
|
||||||
|
By default they will not be exposed to a frontend after you enter them and reload the page.
|
||||||
|
|
||||||
|
In order to enable viewing your keys by clicking a button in the API block:
|
||||||
|
|
||||||
|
1. Set the value of `allowKeysExposure` to `true` in `config.conf` file.
|
||||||
|
2. Restart the SillyTavern server.
|
||||||
|
|
||||||
|
## Remote connections
|
||||||
|
|
||||||
|
Most often this is for people who want to use SillyTavern on their mobile phones while their PC runs the ST server on the same wifi network.
|
||||||
|
|
||||||
|
However, it can be used to allow remote connections from anywhere as well.
|
||||||
|
|
||||||
|
**IMPORTANT: SillyTavern is a single-user program, so anyone who logs in will be able to see all characters and chats, and be able to change any settings inside the UI.**
|
||||||
|
|
||||||
|
### 1. Managing whitelisted IPs
|
||||||
|
|
||||||
|
* Create a new text file inside your SillyTavern base install folder called `whitelist.txt`.
|
||||||
|
* Open the file in a text editor, add a list of IPs you want to be allowed to connect.
|
||||||
|
|
||||||
|
*Both indidivual IPs, and wildcard IP ranges are accepted. Examples:*
|
||||||
|
|
||||||
|
```txt
|
||||||
|
192.168.0.1
|
||||||
|
192.168.0.20
|
||||||
|
```
|
||||||
|
|
||||||
|
or
|
||||||
|
|
||||||
|
```txt
|
||||||
|
192.168.0.*
|
||||||
|
```
|
||||||
|
|
||||||
|
(the above wildcard IP range will allow any device on the local network to connect)
|
||||||
|
|
||||||
|
CIDR masks are also accepted (eg. 10.0.0.0/24).
|
||||||
|
|
||||||
|
* Save the `whitelist.txt` file.
|
||||||
|
* Restart your TAI server.
|
||||||
|
|
||||||
|
Now devices which have the IP specified in the file will be able to connect.
|
||||||
|
|
||||||
|
*Note: `config.conf` also has a `whitelist` array, which you can use in the same way, but this array will be ignored if `whitelist.txt` exists.*
|
||||||
|
|
||||||
|
### 2. Getting the IP for the ST host machine
|
||||||
|
|
||||||
|
After the whitelist has been setup, you'll need the IP of the ST-hosting device.
|
||||||
|
|
||||||
|
If the ST-hosting device is on the same wifi network, you will use the ST-host's internal wifi IP:
|
||||||
|
|
||||||
|
* For Windows: windows button > type `cmd.exe` in the search bar > type `ipconfig` in the console, hit Enter > look for `IPv4` listing.
|
||||||
|
|
||||||
|
If you (or someone else) wants to connect to your hosted ST while not being on the same network, you will need the public IP of your ST-hosting device.
|
||||||
|
|
||||||
|
* While using the ST-hosting device, access [this page](https://whatismyipaddress.com/) and look for for `IPv4`. This is what you would use to connect from the remote device.
|
||||||
|
|
||||||
|
### 3. Connect the remote device to the ST host machine.
|
||||||
|
|
||||||
|
Whatever IP you ended up with for your situation, you will put that IP address and port number into the remote device's web browser.
|
||||||
|
|
||||||
|
A typical address for an ST host on the same wifi network would look like:
|
||||||
|
|
||||||
|
`http://192.168.0.5:8000`
|
||||||
|
|
||||||
|
Use http:// NOT https://
|
||||||
|
|
||||||
|
### Opening your ST to all IPs
|
||||||
|
|
||||||
|
We do not recommend doing this, but you can open `config.conf` and change `whitelist` to `false`.
|
||||||
|
|
||||||
|
You must remove (or rename) `whitelist.txt` in the SillyTavern base install folder, if it exists.
|
||||||
|
|
||||||
|
This is usually an insecure practice, so we require you to set a username and password when you do this.
|
||||||
|
|
||||||
|
The username and password are set in `config.conf`.
|
||||||
|
|
||||||
|
After restarting your ST server, any device will be able to connect to it, regardless of their IP as long as they know the username and password.
|
||||||
|
|
||||||
|
### Still Unable To Connect?
|
||||||
|
|
||||||
|
* Create an inbound/outbound firewall rule for the port found in `config.conf`. Do NOT mistake this for portforwarding on your router, otherwise someone could find your chat logs and that's a big no-no.
|
||||||
|
* Enable the Private Network profile type in Settings > Network and Internet > Ethernet. This is VERY important for Windows 11, otherwise you would be unable to connect even with the aforementioned firewall rules.
|
||||||
|
|
||||||
|
## Performance issues?
|
||||||
|
|
||||||
|
Try enabling the No Blur Effect (Fast UI) mode on the User settings panel.
|
||||||
|
|
||||||
|
## I like your project! How do I contribute?
|
||||||
|
|
||||||
|
### DO's
|
||||||
|
|
||||||
|
1. Send pull requests
|
||||||
|
2. Send feature suggestions and issue reports using established templates
|
||||||
|
3. Read the readme file and built-in documentation before asking anything
|
||||||
|
|
||||||
|
### DONT's
|
||||||
|
|
||||||
|
1. Offer monetary donations
|
||||||
|
2. Send bug reports without providing any context
|
||||||
|
3. Ask the questions that were already answered numerous times
|
||||||
|
|
||||||
|
## Where can I find the old backgrounds?
|
||||||
|
|
||||||
|
We're moving to 100% original content only policy, so old background images have been removed from this repository.
|
||||||
|
|
||||||
|
You can find them archived here:
|
||||||
|
|
||||||
|
<https://files.catbox.moe/1xevnc.zip>
|
||||||
|
|
||||||
|
## Screenshots
|
||||||
|
|
||||||
|
<img width="400" alt="image" src="https://user-images.githubusercontent.com/18619528/228649245-8061c60f-63dc-488e-9325-f151b7a3ec2d.png">
|
||||||
|
<img width="400" alt="image" src="https://user-images.githubusercontent.com/18619528/228649856-fbdeef05-d727-4d5a-be80-266cbbc6b811.png">
|
||||||
|
|
||||||
|
## License and credits
|
||||||
|
|
||||||
|
**This program is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
GNU Affero General Public License for more details.**
|
||||||
|
|
||||||
|
* TAI Base by Humi: Unknown license
|
||||||
|
* Cohee's modifications and derived code: AGPL v3
|
||||||
|
* RossAscends' additions: AGPL v3
|
||||||
|
* Portions of CncAnon's TavernAITurbo mod: Unknown license
|
||||||
|
* Waifu mode inspired by the work of PepperTaco (<https://github.com/peppertaco/Tavern/>)
|
||||||
|
* Thanks Pygmalion University for being awesome testers and suggesting cool features!
|
||||||
|
* Thanks oobabooga for compiling presets for TextGen
|
||||||
|
* poe-api client adapted from <https://github.com/ading2210/poe-api> (GPL v3)
|
||||||
|
* GraphQL files for poe: <https://github.com/muharamdani/poe> (ISC License)
|
||||||
|
* KoboldAI Presets from KAI Lite: <https://lite.koboldai.net/>
|
||||||
|
* Noto Sans font by Google (OFL license)
|
||||||
|
* Icon theme by Font Awesome <https://fontawesome.com> (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License)
|
||||||
|
* AI Horde client library by ZeldaFan0225: https://github.com/ZeldaFan0225/ai_horde
|
||||||
|
* Linux startup script by AlpinDale
|
||||||
|
* Thanks paniphons for providing a FAQ document
|
43
.github/workflows/update-docs.yml
vendored
Normal file
43
.github/workflows/update-docs.yml
vendored
Normal file
@@ -0,0 +1,43 @@
|
|||||||
|
name: Update SillyTavern-Docs
|
||||||
|
|
||||||
|
on:
|
||||||
|
push:
|
||||||
|
branches:
|
||||||
|
- main
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
update_docs:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
|
||||||
|
steps:
|
||||||
|
- name: Checkout current repository
|
||||||
|
uses: actions/checkout@v2
|
||||||
|
|
||||||
|
- name: Checkout SillyTavern-Docs repository
|
||||||
|
uses: actions/checkout@v2
|
||||||
|
with:
|
||||||
|
repository: SillyTavern/SillyTavern-Docs
|
||||||
|
path: SillyTavern-Docs
|
||||||
|
|
||||||
|
- name: Clone SillyTavern wiki into SillyTavern-Docs/extensions
|
||||||
|
run: rm -rf SillyTavern-Docs/extensions && git clone https://github.com/SillyTavern/SillyTavern.wiki.git SillyTavern-Docs/extensions && rm -rf SillyTavern-Docs/extensions/.git
|
||||||
|
|
||||||
|
- name: Copy files
|
||||||
|
run: |
|
||||||
|
cp public/notes/content.md SillyTavern-Docs/guidebook.md
|
||||||
|
cp faq.md SillyTavern-Docs/faq.md
|
||||||
|
cp readme.md SillyTavern-Docs/readme.md
|
||||||
|
cp public/notes/update.md SillyTavern-Docs/update.md
|
||||||
|
|
||||||
|
- name: Deploy to external repository
|
||||||
|
uses: cpina/github-action-push-to-another-repository@main
|
||||||
|
env:
|
||||||
|
SSH_DEPLOY_KEY: ${{ secrets.SSH_DEPLOY_KEY }}
|
||||||
|
with:
|
||||||
|
# GitHub Action output files
|
||||||
|
source-directory: SillyTavern-Docs/
|
||||||
|
destination-github-username: SillyTavern
|
||||||
|
destination-repository-name: SillyTavern-Docs
|
||||||
|
user-email: github-actions[bot]@users.noreply.github.com
|
||||||
|
user-name: "GitHub Actions"
|
||||||
|
target-branch: "main"
|
@@ -1,7 +1,7 @@
|
|||||||
#!/bin/sh
|
#!/bin/sh
|
||||||
|
|
||||||
# Initialize missing user files
|
# Initialize missing user files
|
||||||
IFS="," RESOURCES="characters,groups,group chats,chats,User Avatars,settings.json"
|
IFS="," RESOURCES="characters,groups,group chats,chats,User Avatars,worlds,settings.json"
|
||||||
for R in $RESOURCES; do
|
for R in $RESOURCES; do
|
||||||
if [ ! -e "config/$R" ]; then
|
if [ ! -e "config/$R" ]; then
|
||||||
echo "Resource not found, copying from defaults: $R"
|
echo "Resource not found, copying from defaults: $R"
|
||||||
|
2
faq.md
2
faq.md
@@ -91,7 +91,7 @@ These base instructions are only for OpenAI, which is a paid service. You can fi
|
|||||||
|
|
||||||
### Install Tavern
|
### Install Tavern
|
||||||
|
|
||||||
1. Install the latest NodeJS from https://nodejs.org/en/download/current
|
1. Install the NodeJS LTS from https://nodejs.org/en/download
|
||||||
1. If you know how to use git, clone https://github.com/Cohee1207/SillyTavern. Otherwise, browse to https://github.com/Cohee1207/SillyTavern/releases , download the zip file containing the source code, then extract it locally.
|
1. If you know how to use git, clone https://github.com/Cohee1207/SillyTavern. Otherwise, browse to https://github.com/Cohee1207/SillyTavern/releases , download the zip file containing the source code, then extract it locally.
|
||||||
1. Run Start.bat on Windows, or start.sh on OSX/Linux
|
1. Run Start.bat on Windows, or start.sh on OSX/Linux
|
||||||
1. Your browser should have opened to the Tavern UI. This webpage is running locally on your computer.
|
1. Your browser should have opened to the Tavern UI. This webpage is running locally on your computer.
|
||||||
|
4
package-lock.json
generated
4
package-lock.json
generated
@@ -1,12 +1,12 @@
|
|||||||
{
|
{
|
||||||
"name": "sillytavern",
|
"name": "sillytavern",
|
||||||
"version": "1.6.2",
|
"version": "1.6.6",
|
||||||
"lockfileVersion": 3,
|
"lockfileVersion": 3,
|
||||||
"requires": true,
|
"requires": true,
|
||||||
"packages": {
|
"packages": {
|
||||||
"": {
|
"": {
|
||||||
"name": "sillytavern",
|
"name": "sillytavern",
|
||||||
"version": "1.6.2",
|
"version": "1.6.6",
|
||||||
"license": "AGPL-3.0",
|
"license": "AGPL-3.0",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@dqbd/tiktoken": "^1.0.2",
|
"@dqbd/tiktoken": "^1.0.2",
|
||||||
|
@@ -46,7 +46,7 @@
|
|||||||
"type": "git",
|
"type": "git",
|
||||||
"url": "https://github.com/Cohee1207/SillyTavern.git"
|
"url": "https://github.com/Cohee1207/SillyTavern.git"
|
||||||
},
|
},
|
||||||
"version": "1.6.2",
|
"version": "1.6.6",
|
||||||
"scripts": {
|
"scripts": {
|
||||||
"start": "node server.js",
|
"start": "node server.js",
|
||||||
"pkg": "pkg --compress Gzip --no-bytecode --public ."
|
"pkg": "pkg --compress Gzip --no-bytecode --public ."
|
||||||
|
1
public/group chats/README.md
Normal file
1
public/group chats/README.md
Normal file
@@ -0,0 +1 @@
|
|||||||
|
# Put Group Chat JSONL files here
|
1
public/groups/README.md
Normal file
1
public/groups/README.md
Normal file
@@ -0,0 +1 @@
|
|||||||
|
# Put Group JSON files here
|
@@ -26,6 +26,7 @@ import {
|
|||||||
setWorldInfoSettings,
|
setWorldInfoSettings,
|
||||||
deleteWorldInfo,
|
deleteWorldInfo,
|
||||||
world_info_recursive,
|
world_info_recursive,
|
||||||
|
world_info_case_sensitive,
|
||||||
} from "./scripts/world-info.js";
|
} from "./scripts/world-info.js";
|
||||||
|
|
||||||
import {
|
import {
|
||||||
@@ -1764,8 +1765,9 @@ async function Generate(type, { automatic_trigger, force_name2, resolve, reject,
|
|||||||
abortController = new AbortController();
|
abortController = new AbortController();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// OpenAI doesn't need instruct mode. Use OAI main prompt instead.
|
||||||
|
const isInstruct = power_user.instruct.enabled && main_api !== 'openai';
|
||||||
const isImpersonate = type == "impersonate";
|
const isImpersonate = type == "impersonate";
|
||||||
const isInstruct = power_user.instruct.enabled;
|
|
||||||
|
|
||||||
message_already_generated = isImpersonate ? `${name1}: ` : `${name2}: `;
|
message_already_generated = isImpersonate ? `${name1}: ` : `${name2}: `;
|
||||||
// Name for the multigen prefix
|
// Name for the multigen prefix
|
||||||
@@ -2031,7 +2033,7 @@ async function Generate(type, { automatic_trigger, force_name2, resolve, reject,
|
|||||||
let mesSend = [];
|
let mesSend = [];
|
||||||
console.log('calling runGenerate');
|
console.log('calling runGenerate');
|
||||||
streamingProcessor = isStreamingEnabled() ? new StreamingProcessor(type, force_name2) : false;
|
streamingProcessor = isStreamingEnabled() ? new StreamingProcessor(type, force_name2) : false;
|
||||||
await runGenerate();
|
runGenerate();
|
||||||
|
|
||||||
async function runGenerate(cycleGenerationPromt = '') {
|
async function runGenerate(cycleGenerationPromt = '') {
|
||||||
is_send_press = true;
|
is_send_press = true;
|
||||||
@@ -2385,7 +2387,7 @@ async function Generate(type, { automatic_trigger, force_name2, resolve, reject,
|
|||||||
$('#send_textarea').val(extract.getMessage).trigger('input');
|
$('#send_textarea').val(extract.getMessage).trigger('input');
|
||||||
}
|
}
|
||||||
|
|
||||||
if (shouldContinueMultigen(getMessage, isImpersonate)) {
|
if (shouldContinueMultigen(getMessage, isImpersonate, isInstruct)) {
|
||||||
hideSwipeButtons();
|
hideSwipeButtons();
|
||||||
tokens_already_generated += this_amount_gen; // add new gen amt to any prev gen counter..
|
tokens_already_generated += this_amount_gen; // add new gen amt to any prev gen counter..
|
||||||
getMessage = message_already_generated;
|
getMessage = message_already_generated;
|
||||||
@@ -3024,8 +3026,8 @@ function getGenerateUrl() {
|
|||||||
return generate_url;
|
return generate_url;
|
||||||
}
|
}
|
||||||
|
|
||||||
function shouldContinueMultigen(getMessage, isImpersonate) {
|
function shouldContinueMultigen(getMessage, isImpersonate, isInstruct) {
|
||||||
if (power_user.instruct.enabled && power_user.instruct.stop_sequence) {
|
if (isInstruct && power_user.instruct.stop_sequence) {
|
||||||
if (message_already_generated.indexOf(power_user.instruct.stop_sequence) !== -1) {
|
if (message_already_generated.indexOf(power_user.instruct.stop_sequence) !== -1) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@@ -3151,17 +3153,17 @@ function cleanUpMessage(getMessage, isImpersonate, displayIncompleteSentences =
|
|||||||
}
|
}
|
||||||
if (getMessage.indexOf('<|endoftext|>') != -1) {
|
if (getMessage.indexOf('<|endoftext|>') != -1) {
|
||||||
getMessage = getMessage.substr(0, getMessage.indexOf('<|endoftext|>'));
|
getMessage = getMessage.substr(0, getMessage.indexOf('<|endoftext|>'));
|
||||||
|
|
||||||
}
|
}
|
||||||
if (power_user.instruct.enabled && power_user.instruct.stop_sequence) {
|
const isInstruct = power_user.instruct.enabled && main_api !== 'openai';
|
||||||
|
if (isInstruct && power_user.instruct.stop_sequence) {
|
||||||
if (getMessage.indexOf(power_user.instruct.stop_sequence) != -1) {
|
if (getMessage.indexOf(power_user.instruct.stop_sequence) != -1) {
|
||||||
getMessage = getMessage.substring(0, getMessage.indexOf(power_user.instruct.stop_sequence));
|
getMessage = getMessage.substring(0, getMessage.indexOf(power_user.instruct.stop_sequence));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (power_user.instruct.enabled && power_user.instruct.input_sequence && isImpersonate) {
|
if (isInstruct && power_user.instruct.input_sequence && isImpersonate) {
|
||||||
getMessage = getMessage.replaceAll(power_user.instruct.input_sequence, '');
|
getMessage = getMessage.replaceAll(power_user.instruct.input_sequence, '');
|
||||||
}
|
}
|
||||||
if (power_user.instruct.enabled && power_user.instruct.output_sequence && !isImpersonate) {
|
if (isInstruct && power_user.instruct.output_sequence && !isImpersonate) {
|
||||||
getMessage = getMessage.replaceAll(power_user.instruct.output_sequence, '');
|
getMessage = getMessage.replaceAll(power_user.instruct.output_sequence, '');
|
||||||
}
|
}
|
||||||
// clean-up group message from excessive generations
|
// clean-up group message from excessive generations
|
||||||
|
@@ -258,7 +258,7 @@ async function convertSoloToGroupChat() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Skip messages we don't care about
|
// Skip messages we don't care about
|
||||||
if (message.is_user || message.is_system) {
|
if (message.is_user || message.is_system || message.extra?.type === system_message_types.NARRATOR || message.force_avatar !== undefined) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -512,7 +512,7 @@ async function generateGroupWrapper(by_auto_mode, type = null, params = {}) {
|
|||||||
setCharacterId(chId);
|
setCharacterId(chId);
|
||||||
setCharacterName(characters[chId].name)
|
setCharacterName(characters[chId].name)
|
||||||
|
|
||||||
Generate(generateType, { automatic_trigger: by_auto_mode, ...(params || {}) });
|
await Generate(generateType, { automatic_trigger: by_auto_mode, ...(params || {}) });
|
||||||
|
|
||||||
if (type !== "swipe" && type !== "impersonate" && !isMultigenEnabled() && !isStreamingEnabled()) {
|
if (type !== "swipe" && type !== "impersonate" && !isMultigenEnabled() && !isStreamingEnabled()) {
|
||||||
// update indicator and scroll down
|
// update indicator and scroll down
|
||||||
@@ -602,6 +602,14 @@ async function generateGroupWrapper(by_auto_mode, type = null, params = {}) {
|
|||||||
await delay(100);
|
await delay(100);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
else if (isStreamingEnabled()) {
|
||||||
|
if (streamingProcessor && !streamingProcessor.isFinished) {
|
||||||
|
await delay(100);
|
||||||
|
} else {
|
||||||
|
messagesBefore++;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
else {
|
else {
|
||||||
messagesBefore++;
|
messagesBefore++;
|
||||||
break;
|
break;
|
||||||
|
@@ -56,6 +56,7 @@ export {
|
|||||||
let openai_msgs = [];
|
let openai_msgs = [];
|
||||||
let openai_msgs_example = [];
|
let openai_msgs_example = [];
|
||||||
let openai_messages_count = 0;
|
let openai_messages_count = 0;
|
||||||
|
let openai_narrator_messages_count = 0;
|
||||||
|
|
||||||
let is_get_status_openai = false;
|
let is_get_status_openai = false;
|
||||||
let is_api_button_press_openai = false;
|
let is_api_button_press_openai = false;
|
||||||
@@ -175,6 +176,7 @@ function setOpenAIMessages(chat) {
|
|||||||
let j = 0;
|
let j = 0;
|
||||||
// clean openai msgs
|
// clean openai msgs
|
||||||
openai_msgs = [];
|
openai_msgs = [];
|
||||||
|
openai_narrator_messages_count = 0;
|
||||||
for (let i = chat.length - 1; i >= 0; i--) {
|
for (let i = chat.length - 1; i >= 0; i--) {
|
||||||
let role = chat[j]['is_user'] ? 'user' : 'assistant';
|
let role = chat[j]['is_user'] ? 'user' : 'assistant';
|
||||||
let content = chat[j]['mes'];
|
let content = chat[j]['mes'];
|
||||||
@@ -182,6 +184,7 @@ function setOpenAIMessages(chat) {
|
|||||||
// 100% legal way to send a message as system
|
// 100% legal way to send a message as system
|
||||||
if (chat[j].extra?.type === system_message_types.NARRATOR) {
|
if (chat[j].extra?.type === system_message_types.NARRATOR) {
|
||||||
role = 'system';
|
role = 'system';
|
||||||
|
openai_narrator_messages_count++;
|
||||||
}
|
}
|
||||||
|
|
||||||
// for groups or sendas command - prepend a character's name
|
// for groups or sendas command - prepend a character's name
|
||||||
@@ -457,7 +460,7 @@ async function prepareOpenAIMessages(name2, storyString, worldInfoBefore, worldI
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
openai_messages_count = openai_msgs_tosend.filter(x => x.role == "user" || x.role == "assistant").length;
|
openai_messages_count = openai_msgs_tosend.filter(x => x.role == "user" || x.role == "assistant").length + openai_narrator_messages_count;
|
||||||
// reverse the messages array because we had the newest at the top to remove the oldest,
|
// reverse the messages array because we had the newest at the top to remove the oldest,
|
||||||
// now we want proper order
|
// now we want proper order
|
||||||
openai_msgs_tosend.reverse();
|
openai_msgs_tosend.reverse();
|
||||||
|
311
readme.md
311
readme.md
@@ -1,72 +1,35 @@
|
|||||||

|
# What is SillyTavern?
|
||||||
|
|
||||||
Mobile-friendly, Multi-API (KoboldAI/CPP, Horde, NovelAI, Ooba, OpenAI+proxies, Poe, WindowAI(Claude!)), 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.
|

|
||||||
|
|
||||||
Based on a fork of TavernAI 1.2.8
|
Brought to you by Cohee, RossAscends, and the SillyTavern community, SillyTavern is a local-install interface that allows you to interact with text generation AIs (LLMs) to chat and roleplay with custom characters.
|
||||||
|
|
||||||
### Brought to you by Cohee, RossAscends and the SillyTavern community
|
SillyTavern originated as a modification of TavernAI 1.2.8 in February 2023, and has since added many cutting edge features not present in the original TavernAI.
|
||||||
|
|
||||||
NOTE: We have added [a FAQ](faq.md) to answer most of your questions and help you get started.
|
### Features
|
||||||
|
|
||||||
### What is SillyTavern or TavernAI?
|
* Mobile-friendly interface
|
||||||
|
* Multiple backend API connectivity ([KoboldAI](https://github.com/KoboldAI/KoboldAI-Client), [KoboldCPP](https://github.com/LostRuins/koboldcpp), [AI Horde](https://horde.koboldai.net/), [NovelAI](https://github.com/LostRuins/koboldcpp), [Oobabooga's TextGen WebUI](https://github.com/oobabooga/text-generation-webui), [OpenAI](https://chat.openai.com/)+proxies, [Poe.com](https://poe.com), [WindowAI](https://windowai.io))
|
||||||
Tavern is a user interface you can install on your computer (and Android phones) that allows you to interact with text generation AIs and chat/roleplay with characters you or the community create.
|
* Visual Novel-like Waifu Mode
|
||||||
|
* Horde Stable Diffusion generation
|
||||||
SillyTavern is a fork of TavernAI 1.2.8 which is under more active development and has added many major features. At this point, they can be thought of as completely independent programs.
|
* TTS support (ElevenLabs, Silero, and built-in OS)
|
||||||
|
* WorldInfo (lorebooks)
|
||||||
### What do I need other than Tavern?
|
* Customizable colors, backgrounds, avatar styles, and UI panel placement
|
||||||
|
* Notification sound for AI responses
|
||||||
On its own Tavern is useless, as it's just a user interface. You have to have access to an AI system backend that can act as the roleplay character. There are various supported backends: OpenAPI API (GPT), KoboldAI (either running locally or on Google Colab), and more. You can read more about this in [the FAQ](faq.md).
|
* Export chats as .txt files
|
||||||
|
* Auto-translate single messages or the entire chat via Google API, even automatically.
|
||||||
### Do I need a powerful PC to run Tavern?
|
* Extensive prompt formatting options
|
||||||
|
* Character HotSwap buttons to quickly change between your favorite characters
|
||||||
Since Tavern is only a user interface, it has tiny hardware requirements, it will run on anything. It's the AI system backend that needs to be powerful.
|
* Prompt token breakdown view for each message
|
||||||
|
|
||||||
## Mobile support
|
|
||||||
|
|
||||||
> **Note**
|
|
||||||
|
|
||||||
> **This fork can be run natively on Android phones using Termux. Please refer to this guide by ArroganceComplex#2659:**
|
|
||||||
|
|
||||||
<https://rentry.org/STAI-Termux>
|
|
||||||
|
|
||||||
**.webp character cards import/export is not supported in Termux. Use either JSON or PNG formats instead.**
|
|
||||||
|
|
||||||
## Questions or suggestions?
|
|
||||||
|
|
||||||
### We now have a community Discord server
|
|
||||||
|
|
||||||
Get support, share favorite characters and prompts:
|
|
||||||
|
|
||||||
### [Join](https://discord.gg/RZdyAEUPvj)
|
|
||||||
|
|
||||||
***
|
|
||||||
|
|
||||||
Get in touch with the developers directly:
|
|
||||||
|
|
||||||
* Discord: Cohee#1207 or RossAscends#1779
|
|
||||||
* Reddit: /u/RossAscends or /u/sillylossy
|
|
||||||
* [Post a GitHub issue](https://github.com/Cohee1207/SillyTavern/issues)
|
|
||||||
|
|
||||||
## This version includes
|
|
||||||
|
|
||||||
* A heavily modified TavernAI 1.2.8 (more than 50% of code rewritten or optimized)
|
|
||||||
* Swipes
|
* Swipes
|
||||||
* Group chats: multi-bot rooms for characters to talk to you or each other
|
* Group chats: multi-bot rooms for characters to talk to you or each other
|
||||||
* Chat bookmarks / branching (duplicates the dialogue in its current state)
|
* Chat bookmarks / branching
|
||||||
* Advanced KoboldAI / TextGen generation settings with a lot of community-made presets
|
* Soft prompts via KoboldAI
|
||||||
* World Info support: create a rich lore or save tokens on your character card
|
* webp character card interoperability (PNG is still the internal format)
|
||||||
* Window AI browser extension support (run models like Claude, GPT 4): https://windowai.io/
|
|
||||||
* [Oobabooga's TextGen WebUI](https://github.com/oobabooga/text-generation-webui) API connection
|
|
||||||
* [AI Horde](https://horde.koboldai.net/) connection
|
|
||||||
* [Poe.com](https://poe.com) (ChatGPT / Claude) connection
|
|
||||||
* Soft prompts selector for KoboldAI
|
|
||||||
* Prompt generation formatting tweaking
|
|
||||||
* webp character card interoperability (PNG is still an internal format)
|
|
||||||
|
|
||||||
## Extensions
|
### Extensions
|
||||||
|
|
||||||
SillyTavern has an extensibility support, with some additional AI modules hosted via [SillyTavern Extras API](https://github.com/SillyTavern/SillyTavern-extras)
|
SillyTavern supports extensions/plugins:
|
||||||
|
|
||||||
* Author's Note / Character Bias
|
* Author's Note / Character Bias
|
||||||
* Character emotional expressions
|
* Character emotional expressions
|
||||||
@@ -75,223 +38,31 @@ SillyTavern has an extensibility support, with some additional AI modules hosted
|
|||||||
* Stable Diffusion image generation (5 chat-related presets plus 'free mode')
|
* 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)
|
* Text-to-speech for AI response messages (via ElevenLabs, Silero, or the OS's System TTS)
|
||||||
|
|
||||||
Full list of included extenisons and tutorials how to use them can be found on [Wiki](https://github.com/SillyTavern/SillyTavern/wiki).
|
Additional functionality can be added by using [SillyTavern Extras](https://github.com/SillyTavern/SillyTavern-extras).
|
||||||
|
|
||||||
## UI/CSS/Quality of Life tweaks by RossAscends
|
### Screenshots
|
||||||
|
|
||||||
* Mobile UI with optimized for iOS, and supports saving a shortcut to home screen and opening in fullscreen mode.
|

|
||||||
* HotKeys
|

|
||||||
* Up = Edit last message in chat
|
|
||||||
* Ctrl+Up = Edit last USER message in chat
|
|
||||||
* Left = swipe left
|
|
||||||
* Right = swipe right (NOTE: swipe hotkeys are disabled when chatbar has something typed into it)
|
|
||||||
* Ctrl+Left = view locally stored variables (in the browser console window)
|
|
||||||
* Enter (with chat bar selected) = send your message to AI
|
|
||||||
* Ctrl+Enter = Regenerate the last AI response
|
|
||||||
|
|
||||||
* User Name Changes and Character Deletion no longer force the page to refresh.
|
### Installation Requirements
|
||||||
|
|
||||||
* Toggle option to automatically connect to API on page load.
|
SillyTavern will run on virtually any device capable of running NodeJS v18.
|
||||||
* Toggle option to automatically load the most recently viewed character on page load.
|
|
||||||
* Better Token Counter - works on unsaved characters, and shows both permanent and temporary tokens.
|
|
||||||
|
|
||||||
* Better Past Chats View
|
### What do I need other than SillyTavern?
|
||||||
* New Chat filenames are saved in a readable format of "(character) - (when it was created)"
|
|
||||||
* Chat preview increased from 40 characters to 300.
|
|
||||||
* Multiple options for characters list sorting (by name, creation date, chat sizes).
|
|
||||||
|
|
||||||
* By default the left and right settings panel will close when you click away from it.
|
SillyTavern is only a frontend interface, so you will need to have access to one of backend APIs listed above.
|
||||||
* 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.
|
|
||||||
|
|
||||||
* Customizable chat UI:
|
### How can I get in touch with the developers directly?
|
||||||
* Play a sound when a new message arrives
|
|
||||||
* Switch between round or rectangle avatar styles
|
|
||||||
* Have a wider chat window on the desktop
|
|
||||||
* Optional semi-transparent glass-like panels
|
|
||||||
* Customizable page colors for 'main text', 'quoted text' 'italics text'.
|
|
||||||
* Customizable UI background color and blur amount
|
|
||||||
|
|
||||||
## Installation
|
* Discord: Cohee#1207 or RossAscends#1779
|
||||||
|
* Reddit: /u/RossAscends or /u/sillylossy
|
||||||
|
* [Post a GitHub issue](https://github.com/Cohee1207/SillyTavern/issues)
|
||||||
|
|
||||||
*NOTE: This software is intended for local install purposes, and has not been thoroughly tested on a colab or other cloud notebook service.*
|
### I like your project! How do I contribute?
|
||||||
|
|
||||||
> **Warning**
|
* We welcome pull requests!
|
||||||
|
* We also welcome helpful and informed bug reports that use the templates provided in our GitHub.
|
||||||
> DO NOT INSTALL INTO ANY WINDOWS CONTROLLED FOLDER (Program Files, System32, etc).
|
* We do not accept monetary donations for the project itself.
|
||||||
|
* Cohee does not take donations.
|
||||||
> DO NOT RUN START.BAT WITH ADMIN PERMISSIONS
|
* RossAscends has a personal [Patreon](https://www.patreon.com/RossAscends) & [Kofi](https://ko-fi.com/rossascends)
|
||||||
|
|
||||||
### Windows
|
|
||||||
|
|
||||||
Installing via Git (recommended for easy updating)
|
|
||||||
|
|
||||||
Easy to follow guide with pretty pictures:
|
|
||||||
<https://docs.alpindale.dev/pygmalion-extras/sillytavern/#windows-installation>
|
|
||||||
|
|
||||||
1. Install [NodeJS](https://nodejs.org/en) (latest LTS version is recommended)
|
|
||||||
2. Install [GitHub Desktop](https://central.github.com/deployments/desktop/desktop/latest/win32)
|
|
||||||
3. Open Windows Explorer (`Win+E`)
|
|
||||||
4. Browse to or Create a folder that is not controlled or monitored by Windows. (ex: C:\MySpecialFolder\)
|
|
||||||
5. Open a Command Prompt inside that folder by clicking in the 'Address Bar' at the top, typing `cmd`, and pressing Enter.
|
|
||||||
6. Once the black box (Command Prompt) pops up, type ONE of the following into it and press Enter:
|
|
||||||
|
|
||||||
* for Main Branch: `git clone https://github.com/Cohee1207/SillyTavern -b main`
|
|
||||||
* for Dev Branch: `git clone https://github.com/Cohee1207/SillyTavern -b dev`
|
|
||||||
|
|
||||||
7. Once everything is cloned, double click `Start.bat` to make NodeJS install its requirements.
|
|
||||||
8. The server will then start, and SillyTavern will popup in your browser.
|
|
||||||
|
|
||||||
Installing via zip download
|
|
||||||
|
|
||||||
1. Install [NodeJS](https://nodejs.org/en) (latest LTS version is recommended)
|
|
||||||
2. Download the zip from this GitHub repo. (Get the `Source code (zip)` from [Releases](https://github.com/Cohee1207/SillyTavern/releases/latest))
|
|
||||||
3. Unzip it into a folder of your choice
|
|
||||||
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.
|
|
||||||
|
|
||||||
### Linux
|
|
||||||
|
|
||||||
1. Run the `start.sh` script.
|
|
||||||
2. Enjoy.
|
|
||||||
|
|
||||||
## API keys management
|
|
||||||
|
|
||||||
SillyTavern saves your API keys to a `secrets.json` file in the server directory.
|
|
||||||
|
|
||||||
By default they will not be exposed to a frontend after you enter them and reload the page.
|
|
||||||
|
|
||||||
In order to enable viewing your keys by clicking a button in the API block:
|
|
||||||
|
|
||||||
1. Set the value of `allowKeysExposure` to `true` in `config.conf` file.
|
|
||||||
2. Restart the SillyTavern server.
|
|
||||||
|
|
||||||
## Remote connections
|
|
||||||
|
|
||||||
Most often this is for people who want to use SillyTavern on their mobile phones while their PC runs the ST server on the same wifi network.
|
|
||||||
|
|
||||||
However, it can be used to allow remote connections from anywhere as well.
|
|
||||||
|
|
||||||
**IMPORTANT: SillyTavern is a single-user program, so anyone who logs in will be able to see all characters and chats, and be able to change any settings inside the UI.**
|
|
||||||
|
|
||||||
### 1. Managing whitelisted IPs
|
|
||||||
|
|
||||||
* Create a new text file inside your SillyTavern base install folder called `whitelist.txt`.
|
|
||||||
* Open the file in a text editor, add a list of IPs you want to be allowed to connect.
|
|
||||||
|
|
||||||
*Both indidivual IPs, and wildcard IP ranges are accepted. Examples:*
|
|
||||||
|
|
||||||
```txt
|
|
||||||
192.168.0.1
|
|
||||||
192.168.0.20
|
|
||||||
```
|
|
||||||
|
|
||||||
or
|
|
||||||
|
|
||||||
```txt
|
|
||||||
192.168.0.*
|
|
||||||
```
|
|
||||||
|
|
||||||
(the above wildcard IP range will allow any device on the local network to connect)
|
|
||||||
|
|
||||||
CIDR masks are also accepted (eg. 10.0.0.0/24).
|
|
||||||
|
|
||||||
* Save the `whitelist.txt` file.
|
|
||||||
* Restart your TAI server.
|
|
||||||
|
|
||||||
Now devices which have the IP specified in the file will be able to connect.
|
|
||||||
|
|
||||||
*Note: `config.conf` also has a `whitelist` array, which you can use in the same way, but this array will be ignored if `whitelist.txt` exists.*
|
|
||||||
|
|
||||||
### 2. Getting the IP for the ST host machine
|
|
||||||
|
|
||||||
After the whitelist has been setup, you'll need the IP of the ST-hosting device.
|
|
||||||
|
|
||||||
If the ST-hosting device is on the same wifi network, you will use the ST-host's internal wifi IP:
|
|
||||||
|
|
||||||
* For Windows: windows button > type `cmd.exe` in the search bar > type `ipconfig` in the console, hit Enter > look for `IPv4` listing.
|
|
||||||
|
|
||||||
If you (or someone else) wants to connect to your hosted ST while not being on the same network, you will need the public IP of your ST-hosting device.
|
|
||||||
|
|
||||||
* While using the ST-hosting device, access [this page](https://whatismyipaddress.com/) and look for for `IPv4`. This is what you would use to connect from the remote device.
|
|
||||||
|
|
||||||
### 3. Connect the remote device to the ST host machine.
|
|
||||||
|
|
||||||
Whatever IP you ended up with for your situation, you will put that IP address and port number into the remote device's web browser.
|
|
||||||
|
|
||||||
A typical address for an ST host on the same wifi network would look like:
|
|
||||||
|
|
||||||
`http://192.168.0.5:8000`
|
|
||||||
|
|
||||||
Use http:// NOT https://
|
|
||||||
|
|
||||||
### Opening your ST to all IPs
|
|
||||||
|
|
||||||
We do not recommend doing this, but you can open `config.conf` and change `whitelist` to `false`.
|
|
||||||
|
|
||||||
You must remove (or rename) `whitelist.txt` in the SillyTavern base install folder, if it exists.
|
|
||||||
|
|
||||||
This is usually an insecure practice, so we require you to set a username and password when you do this.
|
|
||||||
|
|
||||||
The username and password are set in `config.conf`.
|
|
||||||
|
|
||||||
After restarting your ST server, any device will be able to connect to it, regardless of their IP as long as they know the username and password.
|
|
||||||
|
|
||||||
### Still Unable To Connect?
|
|
||||||
|
|
||||||
* Create an inbound/outbound firewall rule for the port found in `config.conf`. Do NOT mistake this for portforwarding on your router, otherwise someone could find your chat logs and that's a big no-no.
|
|
||||||
* Enable the Private Network profile type in Settings > Network and Internet > Ethernet. This is VERY important for Windows 11, otherwise you would be unable to connect even with the aforementioned firewall rules.
|
|
||||||
|
|
||||||
## Performance issues?
|
|
||||||
|
|
||||||
Try enabling the No Blur Effect (Fast UI) mode on the User settings panel.
|
|
||||||
|
|
||||||
## I like your project! How do I contribute?
|
|
||||||
|
|
||||||
### DO's
|
|
||||||
|
|
||||||
1. Send pull requests
|
|
||||||
2. Send feature suggestions and issue reports using established templates
|
|
||||||
3. Read the readme file and built-in documentation before asking anything
|
|
||||||
|
|
||||||
### DONT's
|
|
||||||
|
|
||||||
1. Offer monetary donations
|
|
||||||
2. Send bug reports without providing any context
|
|
||||||
3. Ask the questions that were already answered numerous times
|
|
||||||
|
|
||||||
## Where can I find the old backgrounds?
|
|
||||||
|
|
||||||
We're moving to 100% original content only policy, so old background images have been removed from this repository.
|
|
||||||
|
|
||||||
You can find them archived here:
|
|
||||||
|
|
||||||
<https://files.catbox.moe/1xevnc.zip>
|
|
||||||
|
|
||||||
## Screenshots
|
|
||||||
|
|
||||||
<img width="400" alt="image" src="https://user-images.githubusercontent.com/18619528/228649245-8061c60f-63dc-488e-9325-f151b7a3ec2d.png">
|
|
||||||
<img width="400" alt="image" src="https://user-images.githubusercontent.com/18619528/228649856-fbdeef05-d727-4d5a-be80-266cbbc6b811.png">
|
|
||||||
|
|
||||||
## License and credits
|
|
||||||
|
|
||||||
**This program is distributed in the hope that it will be useful,
|
|
||||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
GNU Affero General Public License for more details.**
|
|
||||||
|
|
||||||
* TAI Base by Humi: Unknown license
|
|
||||||
* Cohee's modifications and derived code: AGPL v3
|
|
||||||
* RossAscends' additions: AGPL v3
|
|
||||||
* Portions of CncAnon's TavernAITurbo mod: Unknown license
|
|
||||||
* Waifu mode inspired by the work of PepperTaco (<https://github.com/peppertaco/Tavern/>)
|
|
||||||
* Thanks Pygmalion University for being awesome testers and suggesting cool features!
|
|
||||||
* Thanks oobabooga for compiling presets for TextGen
|
|
||||||
* poe-api client adapted from <https://github.com/ading2210/poe-api> (GPL v3)
|
|
||||||
* GraphQL files for poe: <https://github.com/muharamdani/poe> (ISC License)
|
|
||||||
* KoboldAI Presets from KAI Lite: <https://lite.koboldai.net/>
|
|
||||||
* Noto Sans font by Google (OFL license)
|
|
||||||
* Icon theme by Font Awesome <https://fontawesome.com> (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License)
|
|
||||||
* AI Horde client library by ZeldaFan0225: https://github.com/ZeldaFan0225/ai_horde
|
|
||||||
* Linux startup script by AlpinDale
|
|
||||||
* Thanks paniphons for providing a FAQ document
|
|
||||||
|
@@ -1938,8 +1938,8 @@ app.post('/getgroups', jsonParser, (_, response) => {
|
|||||||
fs.mkdirSync(directories.groups);
|
fs.mkdirSync(directories.groups);
|
||||||
}
|
}
|
||||||
|
|
||||||
const files = fs.readdirSync(directories.groups);
|
const files = fs.readdirSync(directories.groups).filter(x => path.extname(x) === '.json');
|
||||||
const chats = fs.readdirSync(directories.groupChats);
|
const chats = fs.readdirSync(directories.groupChats).filter(x => path.extname(x) === '.jsonl');
|
||||||
|
|
||||||
files.forEach(function (file) {
|
files.forEach(function (file) {
|
||||||
try {
|
try {
|
||||||
@@ -2684,7 +2684,8 @@ function putAsync(url, args) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
async function postAsync(url, args) {
|
async function postAsync(url, args) {
|
||||||
const response = await fetch(url, { method: 'POST', ...args });
|
const fetch = require('node-fetch').default;
|
||||||
|
const response = await fetch(url, { method: 'POST', timeout: 0, ...args });
|
||||||
|
|
||||||
if (response.ok) {
|
if (response.ok) {
|
||||||
const data = await response.json();
|
const data = await response.json();
|
||||||
|
Reference in New Issue
Block a user