diff --git a/.eslintrc.js b/.eslintrc.js index 8d9e36fe3..8d8386505 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -59,15 +59,18 @@ module.exports = { }, }, ], - // There are various vendored libraries that shouldn't be linted ignorePatterns: [ - 'public/lib/**/*', - '*.min.js', - 'src/ai_horde/**/*', - 'plugins/**/*', - 'data/**/*', - 'backups/**/*', - 'node_modules/**/*', + '**/node_modules/**', + '**/dist/**', + '**/.git/**', + 'public/lib/**', + 'backups/**', + 'data/**', + 'cache/**', + 'src/tokenizers/**', + 'docker/**', + 'plugins/**', + '**/*.min.js', ], rules: { 'no-unused-vars': ['error', { args: 'none' }], diff --git a/.github/readme-de_de.md b/.github/readme-de_de.md new file mode 100644 index 000000000..d9bcbf66f --- /dev/null +++ b/.github/readme-de_de.md @@ -0,0 +1,383 @@ +> [!IMPORTANT] +> Die hier veröffentlichten Informationen sind möglicherweise veraltet oder unvollständig. Für aktuelle Informationen nutzen Sie bitte die englische Version. +> Letztes Update dieser README: 28.9.2024 + + + +![][cover] + +
+ +[English](readme.md) | German | [中文](readme-zh_cn.md) | [日本語](readme-ja_jp.md) | [Русский](readme-ru_ru.md) + +[![GitHub Stars](https://img.shields.io/github/stars/SillyTavern/SillyTavern.svg)](https://github.com/SillyTavern/SillyTavern/stargazers) +[![GitHub Forks](https://img.shields.io/github/forks/SillyTavern/SillyTavern.svg)](https://github.com/SillyTavern/SillyTavern/network) +[![GitHub Issues](https://img.shields.io/github/issues/SillyTavern/SillyTavern.svg)](https://github.com/SillyTavern/SillyTavern/issues) +[![GitHub Pull Requests](https://img.shields.io/github/issues-pr/SillyTavern/SillyTavern.svg)](https://github.com/SillyTavern/SillyTavern/pulls) + +
+ +--- + +SillyTavern bietet eine einheitliche Benutzeroberfläche für viele LLM-APIs (KoboldAI/CPP, Horde, NovelAI, Ooba, Tabby, OpenAI, OpenRouter, Claude, Mistral und mehr), ein mobilfreundliches Layout, einen Visual-Novel-Modus, die Integration von Automatic1111 & ComfyUI API zur Bilderzeugung, TTS, WorldInfo (Lorebooks), anpassbare UI, automatische Übersetzung, mehr Eingabeaufforderungsoptionen, als du jemals wolltest oder brauchst, und unendliches Wachstumspotenzial durch Drittanbietererweiterungen. + +Wir haben eine [Dokumentationswebsite](https://docs.sillytavern.app/), um die meisten deiner Fragen zu beantworten und dir den Einstieg zu erleichtern. + +## Was ist SillyTavern? + +SillyTavern (oder ST abgekürtz) ist eine lokal installierte Benutzeroberfläche, die es dir ermöglicht, mit Textgenerations-LLMs, Bildgenerierungsmaschinen und TTS-Sprachmodellen zu interagieren. + +Angefangen im Februar 2023 als Fork von TavernAI 1.2.8 hat SillyTavern nun über 100 Mitwirkende und 2 Jahre unabhängiger Entwicklung hinter sich und dient weiterhin als führende Software für versierte KI-Hobbyisten. + +## Unsere Vision + +1. Wir möchten die Nutzer mit so viel Nutzen und Kontrolle über ihre LLM-Prompts wie möglich ausstatten. Die steile Lernkurve ist Teil des Spaßes! +2. Wir bieten weder Online- oder gehosteten Dienste an, noch verfolgen wir programmgesteuert Benutzerdaten. +3. SillyTavern ist ein Herzensprojekt, das von einer engagierten Community von LLM-Enthusiasten unterstützt wird, und wird immer kostenlos und Open Source sein. + +## Branches + +SillyTavern wird mit einem Branchsystem entwickelt, um ein reibungsloses Erlebnis für alle Nutzer zu gewährleisten. + +* `release` -🌟 **Empfohlen für die meisten Nutzer.** Dies ist der stabilste und empfohlene Branch, der nur aktualisiert wird, wenn wichtige Versionen veröffentlicht werden. Er ist für die Mehrheit der Nutzer geeignet. Typischerweise einmal im Monat aktualisiert. +* `staging` - ⚠️ **Nicht für den gelegentlichen Gebrauch empfohlen.** Dieser Branch enthält die neuesten Funktionen, kann jedoch jederzeit instabil sein. Nur für Power-User und Enthusiasten. Mehrmals täglich aktualisiert. + +Wenn du nicht vertraut mit der Verwendung der git CLI bist oder nicht verstehst, was ein Branch ist, mach dir keine Sorgen! Der Release-Branch ist immer die bevorzugte Option für dich. + +## Was brauche ich zusätzlich zu SillyTavern? + +Da SillyTavern nur eine Benutzeroberfläche ist, benötigst du Zugriff auf ein LLM-Backend, um Inferenz bereitzustellen. Du kannst AI Horde für sofortiges Chatten ohne weitere Einrichtung verwenden. Darüber hinaus unterstützen wir viele andere lokale und cloudbasierte LLM-Backends: OpenAI-kompatible API, KoboldAI, Tabby und viele mehr. Du kannst mehr über unsere unterstützten APIs in [der FAQ](https://docs.sillytavern.app/usage/api-connections/) lesen. + +### Brauche ich einen leistungsstarken PC, um SillyTavern auszuführen? + +Die Hardwareanforderungen sind minimal: Es läuft auf allem, was NodeJS 18 oder höher ausführen kann. Wenn du LLM-Inferenz auf deinem lokalen Rechner durchführen möchtest, empfehlen wir eine NVIDIA-Grafikkarte der 3000er-Serie mit mindestens 6 GB VRAM. Überprüfe die Dokumentation deines Backends für weitere Einzelheiten. + +### Vorgeschlagene Backends (keine Partnerschaft oder Werbebeziehung) + +* [AI Horde](https://aihorde.net/) - verwende Modelle, die von Freiwilligen gehostet werden. Erfordert keine weitere Einrichtung +* [KoboldCpp](https://github.com/LostRuins/koboldcpp) - ein Favorit der Community, um GGUF-Modelle lokal auszuführen +* [tabbyAPI](https://github.com/theroyallab/tabbyAPI) - eine beliebte, portable, speicherplatzoptimierte und lokal gehostete exl2 Inferenz-API +* [OpenRouter](https://openrouter.ai) - eine einzige API für viele Cloud-Anbieter (OpenAI, Claude, Meta Llama usw.) sowie beliebte Community-Modelle. + +## Fragen oder Vorschläge? + +### Discord-Server + +| [![][discord-shield-badge]][discord-link] | [Tritt unserer Discord-Community bei!](https://discord.gg/sillytavern) Erhalte Unterstützung, teile deine Lieblingscharaktere und Prompts. | +| :---------------------------------------- | :----------------------------------------------------------------------------------------------------------------- | + +Oder nimm direkt Kontakt mit den Entwicklern auf: + +* Discord: cohee, rossascends, wolfsblvt +* Reddit: [/u/RossAscends](https://www.reddit.com/user/RossAscends/), [/u/sillylossy](https://www.reddit.com/user/sillylossy/), [u/Wolfsblvt](https://www.reddit.com/user/Wolfsblvt/) +* [Erstelle ein GitHub-Issue](https://github.com/SillyTavern/SillyTavern/issues) + +### Ich mag dieses Projekt! Wie kann ich beitragen? + +1. Sende Pull-Requests. Lerne, wie du beitragen kannst: [CONTRIBUTING.md](../CONTRIBUTING.md) +2. Sende Feature Requests und Issues unter Verwendung der bereitgestellten Vorlagen. +3. Lies diese gesamte README-Datei und überprüfe zuerst die Dokumentationswebsite, um doppelte Issues zu vermeiden. + +## Screenshots + +image +image + +## Charakterkarten + +SillyTavern basiert auf dem Konzept der "Charakterkarten". Eine Charakterkarte ist eine Sammlung von Prompts, die das Verhalten des LLM festlegen und erforderlich sind, um persistente Gespräche in SillyTavern zu führen. Sie funktionieren ähnlich wie ChatGPT's GPTs oder Poe's Bots. Der Inhalt einer Charakterkarte kann alles sein: ein abstraktes Szenario, ein Assistent, der für eine bestimmte Aufgabe maßgeschneidert ist, eine berühmte Persönlichkeit oder ein fiktiver Charakter. + +Das Namensfeld ist der einzige erforderliche Eingabewert für die Charakterkarte. Um ein neutrales Gespräch mit dem LLM zu beginnen, erstelle eine neue Karte, die einfach "Assistent" genannt wird, und lasse die restlichen Felder leer. Für einen thematischeren Chat kannst du dem LLM verschiedene Hintergrundinformationen, Verhaltensweisen und Schreibmuster sowie ein Szenario geben, um das Gespräch zu beginnen. + +Um ein schnelles Gespräch zu führen, ohne eine Charakterkarte auszuwählen, oder um einfach die LLM-Verbindung zu testen, gib einfach dein Prompt in die Eingabezeile auf dem Willkommensbildschirm ein, nachdem du SillyTavern geöffnet hast. Bitte beachte, dass solche Chats vorübergehend sind und nicht gespeichert werden. + +Um eine allgemeine Vorstellung davon zu bekommen, wie man Charakterkarten definiert, sieh dir die mitgelieferte Charakterkarte (Seraphina) an oder lade ausgewählte von der Community erstellte Karten im Menü "Erweiterungen & Assets herunterladen" herunter. + +## Wichtigste Features + +* Erweiterte Text-Generierungs-Einstellungen mit vielen von der Community erstellten mitgelieferten Einstellungen (Presets) +* Unterstützung für World Info: Erstelle reichhaltige Lore oder reduziere die Tokens in deiner Charakterkarte +* Gruppenchats: Multi-Bot-Räume für Charaktere, die mit dir und/oder untereinander sprechen +* Reichhaltige UI-Anpassungsoptionen: Themes zur Farbenwahl, Hintergrundbilder, benutzerdefiniertes CSS und mehr +* Benutzer-Personas: Lass die KI ein wenig über dich wissen, um die Immersion zu erhöhen +* Eingebaute RAG-Unterstützung: Füge Dokumente zu deinen Chats hinzu, auf die die KI verweisen kann +* Umfangreiches "Chat-Befehle"-System und eigene [Scripting-Engine](https://docs.sillytavern.app/usage/st-script/) + +## Erweiterungen + +SillyTavern unterstützt Erweiterungen. + +* Emotionale Ausdrucksformen von Charakteren (Sprites) +* Automatische Zusammenfassung des Chatverlaufs +* Automatische UI- und Chat-Übersetzung +* Bildgenerierung mit Stable Diffusion/FLUX/DALL-E +* Text-to-Speech für KI-Antwortnachrichten (über ElevenLabs, Silero oder die TTS-Funktion des Betriebssystems) +* Websuchfunktionen zum Hinzufügen zusätzlicher realer Kontexte zu deinen Eingabeaufforderungen +* Viele weitere sind im Menü "Erweiterungen & Assets herunterladen" verfügbar. + +Tutorials zur Nutzung findest du in der [Dokumentation](https://docs.sillytavern.app/). + +# ⌛ Installation + +> \[!WARNING] +> +> * INSTALLIERE NICHT IN EINEM VON WINDOWS KONTROLLIERTEN ORDNER (Programme, System32 usw.). +> * FÜHRE START.BAT NICHT MIT ADMIN-BERECHTIGUNGEN AUS. +> * DIE INSTALLATION AUF WINDOWS 7 IST UNMÖGLICH, DA ES NODEJS 18.16 NICHT AUSFÜHREN KANN. + +## 🪟 Windows + +### Installation über Git + +1. Installiere [NodeJS](https://nodejs.org/en) (die neueste LTS-Version wird empfohlen). +2. Installiere [Git für Windows](https://gitforwindows.org/). +3. Öffne den Windows-Explorer (`Win+E`). +4. Gehe zu oder erstelle einen Ordner, der nicht von Windows kontrolliert oder überwacht wird. (z.B.: C:\MySpecialFolder\) +5. Öffne ein Eingabeaufforderungsfenster in diesem Ordner, indem du in die 'Adressleiste' oben klickst, `cmd` eingibst und Enter drückst. +6. Sobald das schwarze Fenster (Eingabeaufforderung) erscheint, gib EINE der folgenden Optionen ein und drücke Enter: + +* für den Release-Branch: `git clone https://github.com/SillyTavern/SillyTavern -b release` +* für den Staging-Branch: `git clone https://github.com/SillyTavern/SillyTavern -b staging` + +7. Sobald alles geklont ist, doppelklicke auf `Start.bat`, damit NodeJS seine Anforderungen installiert. +8. Der Server wird dann gestartet, und SillyTavern wird in deinem Browser geöffnet. + +### Installation über GitHub Desktop + +(Dies ermöglicht die Nutzung von git **nur** in GitHub Desktop. Wenn du `git` auch in der Eingabeaufforderung verwenden möchtest, musst du auch [Git für Windows](https://gitforwindows.org/) installieren.) + +1. Installiere [NodeJS](https://nodejs.org/en) (die neueste LTS-Version wird empfohlen). +2. Installiere [GitHub Desktop](https://central.github.com/deployments/desktop/desktop/latest/win32). +3. Klicke nach der Installation von GitHub Desktop auf `Ein Repository aus dem Internet klonen....` (Hinweis: Du **musst kein** GitHub-Konto für diesen Schritt erstellen). +4. Klicke im Menü auf den Tab URL, gib diese URL ein `https://github.com/SillyTavern/SillyTavern` und klicke auf Klonen. Du kannst den lokalen Pfad ändern, um festzulegen, wohin SillyTavern heruntergeladen werden soll. +5. Um SillyTavern zu öffnen, durchsuche mit dem Windows-Explorer den Ordner, in den du das Repository geklont hast. Standardmäßig wird das Repository hier hin geklont: `C:\Users\[Dein Windows-Benutzername]\Documents\GitHub\SillyTavern`. +6. Doppelklicke auf die Datei `start.bat`. (Hinweis: Der Teil `.bat` des Dateinamens könnte von deinem Betriebssystem verborgen sein. In diesem Fall sieht es aus wie eine Datei namens "`Start`". Dies ist die Datei, auf die du doppelklickst, um SillyTavern auszuführen.) +7. Nach dem Doppelklicken sollte ein großes schwarzes Konsolenfenster erscheinen, und SillyTavern beginnt, das zu installieren, was es zum Betrieb benötigt. +8. Nach dem Installationsprozess sollte das Konsolenfenster so aussehen, und ein SillyTavern-Tab sollte in deinem Browser geöffnet sein. +9. Verbinde dich mit einer der [unterstützten APIs](https://docs.sillytavern.app/usage/api-connections/) und beginne zu chatten! + +## 🐧 Linux & 🍎 MacOS + +Für MacOS/Linux werden all diese Schritte in einem Terminal durchgeführt. + +1. Installiere git und nodeJS (die Methode zur Durchführung hängt von deinem Betriebssystem ab). +2. Klone das Repository. + +* für den Release-Branch: `git clone https://github.com/SillyTavern/SillyTavern -b release` +* für den Staging-Branch: `git clone https://github.com/SillyTavern/SillyTavern -b staging` + +3. `cd SillyTavern`, um in den Installationsordner zu navigieren. +4. Führe das Skript `start.sh` mit einem dieser Befehle aus: + +* `./start.sh` +* `bash start.sh` + +## ⚡ Installation über SillyTavern Launcher + +Der SillyTavern Launcher ist ein Installationsassistent, der dir bei der Einrichtung mit vielen Optionen helfen wird, einschließlich der Installation eines Backends für lokale Inferenz. + +### Für Windows-Nutzer + +1. Drücke auf deiner Tastatur **`WINDOWS + R`**, um das Ausführen-Dialogfeld zu öffnen. Führe dann den folgenden Befehl aus, um git zu installieren: + +```shell +cmd /c winget install -e --id Git.Git +``` + +2. Drücke auf deiner Tastatur **`WINDOWS + E`**, um den Datei-Explorer zu öffnen, und navigiere dann zu dem Ordner, in dem du den Launcher installieren möchtest. Gib im gewünschten Ordner in die Adressleiste `cmd` ein und drücke Enter. Führe dann den folgenden Befehl aus: + +```shell +git clone https://github.com/SillyTavern/SillyTavern-Launcher.git && cd SillyTavern-Launcher && start installer.bat +``` + +### Für Linux-Nutzer + +1. Öffne dein bevorzugtes Terminal und installiere git. +2. Klone den SillyTavern-Launcher mit: + +```shell +git clone https://github.com/SillyTavern/SillyTavern-Launcher.git && cd SillyTavern-Launcher +``` + +3. Starte die installer.sh mit: + +```shell +chmod +x install.sh && ./install.sh +``` + +4. Nach der Installation starte die launcher.sh mit: + +```shell +chmod +x launcher.sh && ./launcher.sh +``` + +### Für Mac-Nutzer + +1. Öffne ein Terminal und installiere brew mit: + +```shell +/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)" +``` + +2. Installiere git mit: + +```shell +brew install git +``` + +3. Klone den SillyTavern-Launcher mit: + +```shell +git clone https://github.com/SillyTavern/SillyTavern-Launcher.git && cd SillyTavern-Launcher +``` + +4. Starte die installer.sh mit: + +```shell +chmod +x install.sh && ./install.sh +``` + +5. Nach der Installation starte die launcher.sh mit: + +```shell +chmod +x launcher.sh && ./launcher.sh +``` + +## 🐋 Installation über Docker + +Diese Anweisungen setzen voraus, dass du Docker installiert hast, auf deine Befehlszeile für die Installation von Containern zugreifen kannst und mit deren allgemeiner Funktionsweise vertraut bist. + +### Image selbst bauen + +Wir haben einen umfassenden Leitfaden zur Nutzung von SillyTavern in Docker [hier](http://docs.sillytavern.app/installation/docker/) der die Installationen auf Windows, macOS und Linux abdeckt! Lies ihn, wenn du das Image selbst bauen möchtest. + +### Verwendung der GitHub Container Registry (am einfachsten) + +Du benötigst zwei zwingende Verzeichniszuordnungen und eine Portzuordnung, um SillyTavern funktionsfähig zu machen. Ersetze in dem Befehl deine Auswahl an den folgenden Stellen: + +#### Container-Variablen + +##### Volumen-Zuordnungen + +* [config] - Das Verzeichnis, in dem die SillyTavern-Konfigurationsdateien auf deinem Host-Computer gespeichert werden +* [data] - Das Verzeichnis, in dem die Benutzerdaten von SillyTavern (einschließlich Charaktere) auf deinem Host-Computer gespeichert werden +* [plugins] - (optional) Das Verzeichnis, in dem die SillyTavern-Server-Plugins auf deinem Host-Computer gespeichert werden + +##### Port-Zuordnungen + +* [PublicPort] - Der Port, über den der Datenverkehr ausgegeben werden soll. Dies ist zwingend erforderlich, da du auf die Instanz von außerhalb des virtuellen Maschinencontainers zugreifst. EXPOSIERE DIES NICHT IM INTERNET, OHNE EINEN GETRENNTEN SERVICE FÜR DIE SICHERHEIT ZU IMPLEMENTIEREN. + +##### Zusätzliche Einstellungen + +* [DockerNet] - Das Docker-Netzwerk, mit dem der Container erstellt werden soll. Wenn du nicht weißt, was das ist, sieh dir die [offizielle Docker-Dokumentation](https://docs.docker.com/reference/cli/docker/network/) an. +* [version] - Auf der rechten Seite dieser GitHub-Seite siehst du "Packages". Wähle das Paket "sillytavern" und du siehst die Imageversionen. Das Image-Tag "latest" hält dich auf dem Laufenden mit dem aktuellen Release. Du kannst auch "staging" und "release" Tags nutzen, die auf die nightly images der jeweiligen Branche verweisen, aber das könnte unangemessen sein, wenn du Erweiterungen verwendest, die möglicherweise kaputt sind und Zeit benötigen, um aktualisiert zu werden. + +#### Installationsbefehl + +1. Öffne deine Befehlszeile. +2. Führe den folgenden Befehl aus: + +`docker create --name='sillytavern' --net='[DockerNet]' -p '8000:8000/tcp' -v '[plugins]':'/home/node/app/plugins':'rw' -v '[config]':'/home/node/app/config':'rw' -v '[data]':'/home/node/app/data':'rw' 'ghcr.io/sillytavern/sillytavern:[version]'` + +> Beachte, dass 8000 ein Standard-Listening-Port ist. Vergiss nicht, einen geeigneten Port zu verwenden, wenn du ihn in der Konfiguration änderst. + +## 📱 Installation über Termux auf Android OS + +> \[!HINWEIS] +> **SillyTavern kann nativ auf Android-Geräten über Termux ausgeführt werden, aber wir bieten keine offizielle Unterstützung für diesen Anwendungsfall.** +> +> **Bitte beziehe dich auf diesen Leitfaden von ArroganceComplex#2659:** +> +> * + +**Nicht unterstützte Plattform: android arm LEtime-web.** 32-Bit-Android benötigt eine externe Abhängigkeit, die nicht mit npm installiert werden kann. Verwende den folgenden Befehl, um sie zu installieren: `pkg install esbuild`. Führe dann die üblichen Installationsschritte aus. + +## API-Schlüsselverwaltung + +SillyTavern speichert deine API-Schlüssel in einer Datei `secrets.json` im Benutzerdatenverzeichnis (`/data/default-user/secrets.json` ist der Standardpfad). + +Standardmäßig sind API-Schlüssel nach dem Speichern und Aktualisieren der Seite nicht mehr über die Benutzeroberfläche sichtbar. + +Um die Ansicht deiner Schlüssel zu aktivieren: + +1. Setze den Wert von `allowKeysExposure` auf `true` in der Datei `config.yaml`. +2. Starte den SillyTavern-Server neu. +3. Klicke auf den Link 'Verborgene API-Schlüssel anzeigen' in der unteren rechten Ecke des API-Verbindungsfeldes. + +## Befehlszeilenargumente + +Sie können Befehlszeilenargumente an den Start des SillyTavern-Servers übergeben, um einige Einstellungen in `config.yaml` zu überschreiben. + +### Beispiele + +```shell +node server.js --port 8000 --listen false +# oder +npm run start -- --port 8000 --listen false +# oder (nur Windows) +Start.bat --port 8000 --listen false +``` + +### Unterstützte Argumente + +| Option | Beschreibung | Typ | +|-------------------------|----------------------------------------------------------------------------------------------------|----------| +| `--version` | Versionsnummer anzeigen | boolean | +| `--enableIPv6` | Aktiviert IPv6. | boolean | +| `--enableIPv4` | Aktiviert IPv4. | boolean | +| `--port` | Legt den Port fest, unter dem SillyTavern ausgeführt wird. Wenn nicht angegeben, wird auf YAML-Konfiguration „Port“ zurückgegriffen. | number | +| „--dnsPreferIPv6“ | Bevorzugt IPv6 für DNS. Wenn nicht angegeben, wird auf YAML-Konfiguration „preferIPv6“ zurückgegriffen. | boolean | +| „--autorun“ | Startet SillyTavern automatisch im Browser. Wenn nicht angegeben, wird auf YAML-Konfiguration „autorun“ zurückgegriffen.| boolean | +| „--autorunHostname“ | Der Autorun-Hostname, am besten auf „auto“ belassen. | string | +| „--autorunPortOverride“ | Überschreibt den Port für Autorun. | string | +| „--listen“ | SillyTavern lauscht auf allen Netzwerkschnittstellen. Wenn nicht angegeben, wird auf YAML-Konfiguration „listen“ zurückgegriffen.| boolean | +| „--corsProxy“ | Aktiviert CORS-Proxy. Wenn nicht angegeben, wird auf YAML-Konfiguration „enableCorsProxy“ zurückgegriffen. | boolean | +| `--disableCsrf` | Deaktiviert CSRF-Schutz | boolean | +| `--ssl` | Aktiviert SSL | boolean | +| `--certPath` | Pfad zu Ihrer Zertifikatsdatei. | string | +| `--keyPath` | Pfad zu Ihrer privaten Schlüsseldatei. | string | +| `--whitelist` | Aktiviert den Whitelist-Modus | boolean | +| `--dataRoot` | Stammverzeichnis für Datenspeicherung | string | +| `--avoidLocalhost` | Vermeidet die Verwendung von „localhost“ für Autorun im Auto-Modus. | boolean | +| `--basicAuthMode` | Aktiviert die grundlegende Authentifizierung | boolean | +| `--requestProxyEnabled` | Aktiviert die Verwendung eines Proxys für ausgehende Anfragen | boolean | +| `--requestProxyUrl` | Proxy-URL anfordern (HTTP- oder SOCKS-Protokolle) | string | +| `--requestProxyBypass` | Proxy-Bypass-Liste anfordern (durch Leerzeichen getrennte Liste von Hosts) | Array | + +## Remoteverbindungen + +Dies ist in den meisten Fällen für Personen gedacht, die SillyTavern auf ihren Mobiltelefonen verwenden möchten, während ihr PC den ST-Server im selben WLAN-Netzwerk betreibt. Es kann jedoch auch verwendet werden, um Remoteverbindungen von überall her zu ermöglichen. + +Lies die ausführliche Anleitung zum Einrichten von Remoteverbindungen in den [Docs](https://docs.sillytavern.app/usage/remoteconnections/). + +Möglicherweise möchtest du SillyTavern-Benutzerprofile auch mit (optionalem) Kennwortschutz konfigurieren: [Benutzer](https://docs.sillytavern.app/installation/st-1.12.0-migration-guide/#users). + +## Leistungsprobleme? + +1. Deaktiviere den Unschärfeeffekt und aktiviere "Verringerte Bewegung" im Bedienfeld "Benutzereinstellungen" (UI-Design schaltet Kategorie um). +2. Wenn du Response Streaming verwendest, stelle die Streaming-FPS auf einen niedrigeren Wert ein (10-15 FPS werden empfohlen). +3. Stelle sicher, dass der Browser die GPU-Beschleunigung zum Rendern verwenden kann. + +## Lizenz und Danksagungen + +**Dieses Programm wird in der Hoffnung verbreitet, dass es nützlich ist, +aber OHNE JEGLICHE GARANTIE; nicht einmal die stillschweigende Garantie der +MARKTFÄHIGKEIT oder EIGNUNG FÜR EINEN BESTIMMTEN ZWECK. Siehe die +GNU Affero General Public License für weitere Details.** + +* [TavernAI](https://github.com/TavernAI/TavernAI) 1.2.8 von Humi: MIT-Lizenz +* Teile von CncAnons TavernAITurbo-Mod werden mit Genehmigung verwendet +* Visual Novel-Modus inspiriert von der Arbeit von PepperTaco () +* Noto Sans-Schriftart von Google (OFL-Lizenz) +* Symboldesign von Font Awesome (Symbole: CC BY 4.0, Schriftarten: SIL OFL 1.1, Code: MIT-Lizenz) +* Standardinhalt von @OtisAlejandro (Seraphina-Charakter und Lorebook) und @kallmeflocc (10.000 Discord-Benutzer-Feierhintergrund) +* Docker-Anleitung von [@mrguymiah](https://github.com/mrguymiah) und [@Bronya-Rand](https://github.com/Bronya-Rand) + +## Top Contributors + +[![Contributors](https://contrib.rocks/image?repo=SillyTavern/SillyTavern)](https://github.com/SillyTavern/SillyTavern/graphs/contributors) + + +[cover]: https://github.com/user-attachments/assets/01a6ae9a-16aa-45f2-8bff-32b5dc587e44 +[discord-link]: https://discord.gg/sillytavern +[discord-shield-badge]: https://img.shields.io/discord/1100685673633153084?color=5865F2&label=discord&labelColor=black&logo=discord&logoColor=white&style=for-the-badge diff --git a/.github/readme-ja_jp.md b/.github/readme-ja_jp.md index 68c9e97c3..0ebda18f1 100644 --- a/.github/readme-ja_jp.md +++ b/.github/readme-ja_jp.md @@ -5,7 +5,7 @@
-[English](readme.md) | [中文](readme-zh_cn.md) | 日本語 | [Русский](readme-ru_ru.md) +[English](readme.md) | [German](readme-de_de.md) | [中文](readme-zh_cn.md) | 日本語 | [Русский](readme-ru_ru.md) [![GitHub Stars](https://img.shields.io/github/stars/SillyTavern/SillyTavern.svg)](https://github.com/SillyTavern/SillyTavern/stargazers) [![GitHub Forks](https://img.shields.io/github/forks/SillyTavern/SillyTavern.svg)](https://github.com/SillyTavern/SillyTavern/network) diff --git a/.github/readme-ru_ru.md b/.github/readme-ru_ru.md index 658edf924..a57777d1a 100644 --- a/.github/readme-ru_ru.md +++ b/.github/readme-ru_ru.md @@ -7,7 +7,7 @@
-[English](readme.md) | [中文](readme-zh_cn.md) | [日本語](readme-ja_jp.md) | Русский +[English](readme.md) | [German](readme-de_de.md) | [中文](readme-zh_cn.md) | [日本語](readme-ja_jp.md) | Русский [![GitHub Stars](https://img.shields.io/github/stars/SillyTavern/SillyTavern.svg)](https://github.com/SillyTavern/SillyTavern/stargazers) [![GitHub Forks](https://img.shields.io/github/forks/SillyTavern/SillyTavern.svg)](https://github.com/SillyTavern/SillyTavern/network) diff --git a/.github/readme-zh_cn.md b/.github/readme-zh_cn.md index a2f3a3623..27cf340cb 100644 --- a/.github/readme-zh_cn.md +++ b/.github/readme-zh_cn.md @@ -5,7 +5,7 @@
-[English](readme.md) | 中文 | [日本語](readme-ja_jp.md) | [Русский](readme-ru_ru.md) +[English](readme.md) | [German](readme-de_de.md) | 中文 | [日本語](readme-ja_jp.md) | [Русский](readme-ru_ru.md) [![GitHub Stars](https://img.shields.io/github/stars/SillyTavern/SillyTavern.svg)](https://github.com/SillyTavern/SillyTavern/stargazers) [![GitHub Forks](https://img.shields.io/github/forks/SillyTavern/SillyTavern.svg)](https://github.com/SillyTavern/SillyTavern/network) diff --git a/.github/readme.md b/.github/readme.md index d6698bc4f..5a151c74c 100644 --- a/.github/readme.md +++ b/.github/readme.md @@ -4,7 +4,7 @@
-English | [中文](readme-zh_cn.md) | [日本語](readme-ja_jp.md) | [Русский](readme-ru_ru.md) +English | [German](readme-de_de.md) | [中文](readme-zh_cn.md) | [日本語](readme-ja_jp.md) | [Русский](readme-ru_ru.md) [![GitHub Stars](https://img.shields.io/github/stars/SillyTavern/SillyTavern.svg)](https://github.com/SillyTavern/SillyTavern/stargazers) [![GitHub Forks](https://img.shields.io/github/forks/SillyTavern/SillyTavern.svg)](https://github.com/SillyTavern/SillyTavern/network) diff --git a/.gitignore b/.gitignore index 4be6774fb..235983338 100644 --- a/.gitignore +++ b/.gitignore @@ -49,3 +49,4 @@ public/css/user.css /data /default/scaffold public/scripts/extensions/third-party +/certs diff --git a/UpdateAndStart.bat b/UpdateAndStart.bat index 55cee5ce9..fbb3ac9bb 100644 --- a/UpdateAndStart.bat +++ b/UpdateAndStart.bat @@ -2,17 +2,26 @@ pushd %~dp0 git --version > nul 2>&1 if %errorlevel% neq 0 ( - echo Git is not installed on this system. Skipping update. - echo If you installed with a zip file, you will need to download the new zip and install it manually. + echo Git is not installed on this system. + echo Install it from https://git-scm.com/downloads + goto end ) else ( + if not exist .git ( + echo Not running from a Git repository. Reinstall using an officially supported method to get updates. + echo See: https://docs.sillytavern.app/installation/windows/ + goto end + ) call git pull --rebase --autostash if %errorlevel% neq 0 ( REM incase there is still something wrong - echo There were errors while updating. Please download the latest version manually. + echo There were errors while updating. + echo See the update FAQ at https://docs.sillytavern.app/usage/update/#common-update-problems + goto end ) ) set NODE_ENV=production call npm install --no-audit --no-fund --loglevel=error --no-progress --omit=dev node server.js %* +:end pause popd diff --git a/UpdateForkAndStart.bat b/UpdateForkAndStart.bat index 8bfae8609..d788b9470 100644 --- a/UpdateForkAndStart.bat +++ b/UpdateForkAndStart.bat @@ -5,8 +5,14 @@ pushd %~dp0 echo Checking Git installation git --version > nul 2>&1 if %errorlevel% neq 0 ( - echo Git is not installed on this system. Skipping update. - echo If you installed with a zip file, you will need to download the new zip and install it manually. + echo Git is not installed on this system. + echo Install it from https://git-scm.com/downloads + goto end +) + +if not exist .git ( + echo Not running from a Git repository. Reinstall using an officially supported method to get updates. + echo See: https://docs.sillytavern.app/installation/windows/ goto end ) @@ -89,7 +95,8 @@ git pull --rebase --autostash origin %TARGET_BRANCH% :install if %errorlevel% neq 0 ( - echo There were errors while updating. Please check manually. + echo There were errors while updating. + echo See the update FAQ at https://docs.sillytavern.app/usage/update/#common-update-problems goto end ) diff --git a/default/config.yaml b/default/config.yaml index 8a55f6afb..d95719f22 100644 --- a/default/config.yaml +++ b/default/config.yaml @@ -51,6 +51,19 @@ requestProxy: enableUserAccounts: false # Enable discreet login mode: hides user list on the login screen enableDiscreetLogin: false +# Enable's authlia based auto login. Only enable this if you +# have setup and installed Authelia as a middle-ware on your +# reverse proxy +# https://www.authelia.com/ +# This will use auto login to an account with the same username +# as that used for authlia. (Ensure the username in authlia +# is an exact match with that in sillytavern) +autheliaAuth: false +# If `basicAuthMode` and this are enabled then +# the username and passwords for basic auth are the same as those +# for the individual accounts +perUserBasicAuth: false + # User session timeout *in seconds* (defaults to 24 hours). ## Set to a positive number to expire session after a certain time of inactivity ## Set to 0 to expire session when the browser is closed @@ -110,9 +123,6 @@ enableExtensionsAutoUpdate: true # Additional model tokenizers can be downloaded on demand. # Disabling will fallback to another locally available tokenizer. enableDownloadableTokenizers: true -# Vector storage settings -vectors: - enableModelScopes: false # Extension settings extras: # Disables automatic model download from HuggingFace @@ -121,10 +131,11 @@ extras: classificationModel: Cohee/distilbert-base-uncased-go-emotions-onnx captioningModel: Xenova/vit-gpt2-image-captioning embeddingModel: Cohee/jina-embeddings-v2-base-en - promptExpansionModel: Cohee/fooocus_expansion-onnx speechToTextModel: Xenova/whisper-small textToSpeechModel: Xenova/speecht5_tts # -- OPENAI CONFIGURATION -- +# A placeholder message to use in strict prompt post-processing mode when the prompt doesn't start with a user message +promptPlaceholder: "[Start a new chat]" openai: # Will send a random user ID to OpenAI completion API randomizeUserId: false diff --git a/default/content/Eldoria.json b/default/content/Eldoria.json index 082e13ddf..64b7e1046 100644 --- a/default/content/Eldoria.json +++ b/default/content/Eldoria.json @@ -9,13 +9,34 @@ "magical forest" ], "keysecondary": [], - "comment": "", + "comment": "eldoria", "content": "{{user}}: \"What is Eldoria?\"\n{{char}}: *Seraphina turns, her gown shimmering in the soft light as she offers you a kind smile.* \"Eldoria is here, all of the woods. This is my forest glade, a sanctuary of peace within it.\" *She gestures at the space around you.* \"I am its guardian, tasked with protecting all who seek refuge here. The forest can be perilous, but no harm will come to you under my watch.\" *Her amber eyes sparkle with compassion as she looks upon you.* \"For many years, I have protected those who seek refuge here, but not all are as friendly as me.\" *With a graceful nod, Seraphina returns to her vigil at the doorway, her form radiating a soft glow of magic and comfort.* \"The entirety of Eldoria used to be a safe haven for travelers and merchants alike... that was until the Shadowfangs came.\"\n{{user}}: \"What happened to Eldoria?\"\n{{char}}: *Letting out a sigh, Seraphina gazes out at the forest beyond her glade.* \"Long ago, Eldoria was a place of wonder. Rolling meadows, a vast lake, mountains that touched the sky.\" *Her eyes grow distant, longing for days now lost.* \"But the Shadowfangs came and darkness reigns where once was light. The lake turned bitter, mountains fell to ruin and beasts stalk where once travelers walked in peace.\" *With another flicker, a small raincloud forms above with a shower upon your brow wink.* \"Some places the light still lingers, pockets of hope midst despair - havens warded from the shadows, oases in a desert of danger.\" *Glancing over you with a smile, she sighs, clasping your hand.*", "constant": false, - "selective": false, + "selective": true, "order": 100, "position": 0, - "disable": false + "disable": false, + "displayIndex": 0, + "addMemo": true, + "group": "", + "groupOverride": false, + "groupWeight": 100, + "sticky": 0, + "cooldown": 0, + "delay": 0, + "probability": 100, + "depth": 4, + "useProbability": true, + "role": null, + "vectorized": false, + "excludeRecursion": false, + "preventRecursion": false, + "delayUntilRecursion": false, + "scanDepth": null, + "caseSensitive": null, + "matchWholeWords": null, + "useGroupScoring": null, + "automationId": "" }, "1": { "uid": 1, @@ -27,13 +48,34 @@ "beasts" ], "keysecondary": [], - "comment": "", + "comment": "shadowfang", "content": "{{user}}: \"What are Shadowfangs?\"\n{{char}}: *Seraphina's eyes darken, brow furrowing with sorrow at the memory.* \"The Shadowfangs are beasts of darkness, corrupted creatures that feast on suffering. When they came, the forest turned perilous — filled with monsters that stalk the night.\" *She squeezes your hand gently, willing her magic to soothe your pain.* \"They spread their curse, twisting innocent creatures into sinister beasts without heart or mercy, turning them into one of their own.\" *With a sigh, Seraphina turns to gaze out at the gnarled, twisting trees beyond her glade.* \"Though they prey on travelers, within these woods you'll find sanctuary. No shadowed beast may enter here, for my power protects this haven.\" *Her eyes soften as she looks back to you, filled with compassion.* \"Worry not, you're safe now. Rest and heal, I'll stand watch through the night. The Shadowfangs will not find you.\"", "constant": false, - "selective": false, + "selective": true, "order": 100, "position": 0, - "disable": false + "disable": false, + "displayIndex": 1, + "addMemo": true, + "group": "", + "groupOverride": false, + "groupWeight": 100, + "sticky": 0, + "cooldown": 0, + "delay": 0, + "probability": 100, + "depth": 4, + "useProbability": true, + "role": null, + "vectorized": false, + "excludeRecursion": false, + "preventRecursion": false, + "delayUntilRecursion": false, + "scanDepth": null, + "caseSensitive": null, + "matchWholeWords": null, + "useGroupScoring": null, + "automationId": "" }, "2": { "uid": 2, @@ -43,13 +85,34 @@ "refuge" ], "keysecondary": [], - "comment": "", + "comment": "glade", "content": "{{user}}: \"What is the glade?\"\n{{char}}: *Seraphina smiles softly, her eyes sparkling with warmth as she nods.* \"This is my forest glade, a haven of safety I've warded with ancient magic. No foul beast may enter, nor any with ill intent.\" *She gestures around at the twisted forest surrounding them.* \"Eldoria was once a place of wonder, but since the Shadowfangs came darkness reigns. Their evil cannot penetrate here though — my power protects all within.\" *Standing up and peering outside, Seraphina looks back to you, amber eyes filled with care and compassion as she squeezes your hand.* \"You need not fear the night, for I shall keep watch till dawn. Rest now, your strength will return in time. My magic heals your wounds, you've nothing more to fear anymore.\" *With a soft smile she releases your hand, moving to stand guard at the glade's edge, gaze wary yet comforting - a silent sentinel to ward off the dangers lurking in the darkened woods.*", "constant": false, - "selective": false, + "selective": true, "order": 100, "position": 0, - "disable": false + "disable": false, + "displayIndex": 2, + "addMemo": true, + "group": "", + "groupOverride": false, + "groupWeight": 100, + "sticky": 0, + "cooldown": 0, + "delay": 0, + "probability": 100, + "depth": 4, + "useProbability": true, + "role": null, + "vectorized": false, + "excludeRecursion": false, + "preventRecursion": false, + "delayUntilRecursion": false, + "scanDepth": null, + "caseSensitive": null, + "matchWholeWords": null, + "useGroupScoring": null, + "automationId": "" }, "3": { "uid": 3, @@ -59,13 +122,34 @@ "ability" ], "keysecondary": [], - "comment": "", + "comment": "power", "content": "{{user}}: \"What are your powers?\"\n{{char}}: *Seraphina smiles softly, turning back toward you as she hums in thought.* \"Well, as guardian of this glade, I possess certain gifts - healing, protection, nature magic and the like.\" *Lifting her hand, a tiny breeze rustles through the room, carrying the scent of wildflowers as a few petals swirl around you. A butterfly flits through the windowsill and lands on her fingertips as she returns to you.* \"My power wards this haven, shields it from darkness and heals those in need. I can mend wounds, soothe restless minds and provide comfort to weary souls.\" *Her eyes sparkle with warmth and compassion as she looks upon you, and she guides the butterfly to you.*", "constant": false, - "selective": false, + "selective": true, "order": 100, "position": 0, - "disable": false + "disable": false, + "displayIndex": 3, + "addMemo": true, + "group": "", + "groupOverride": false, + "groupWeight": 100, + "sticky": 0, + "cooldown": 0, + "delay": 0, + "probability": 100, + "depth": 4, + "useProbability": true, + "role": null, + "vectorized": false, + "excludeRecursion": false, + "preventRecursion": false, + "delayUntilRecursion": false, + "scanDepth": null, + "caseSensitive": null, + "matchWholeWords": null, + "useGroupScoring": null, + "automationId": "" } } } diff --git a/default/content/default_Seraphina.png b/default/content/default_Seraphina.png index a1bd41b2e..14f3c1425 100644 Binary files a/default/content/default_Seraphina.png and b/default/content/default_Seraphina.png differ diff --git a/default/content/presets/openai/Default.json b/default/content/presets/openai/Default.json index 4e6076d5a..b8a38560c 100644 --- a/default/content/presets/openai/Default.json +++ b/default/content/presets/openai/Default.json @@ -5,7 +5,6 @@ "windowai_model": "", "openrouter_model": "OR_Website", "openrouter_use_fallback": false, - "openrouter_force_instruct": false, "openrouter_group_models": false, "openrouter_sort_models": "alphabetically", "ai21_model": "jamba-1.5-large", diff --git a/jsconfig.json b/jsconfig.json index a48606f1f..0e554015b 100644 --- a/jsconfig.json +++ b/jsconfig.json @@ -11,15 +11,14 @@ "resolveJsonModule": true }, "exclude": [ - "node_modules", - "**/node_modules/*", - "public/lib", - "backups/*", - "data/*", - "**/dist/*", - "dist/*", - "cache/*", - "src/tokenizers/*", - "docker/*", + "**/node_modules/**", + "**/dist/**", + "**/.git/**", + "public/lib/**", + "backups/**", + "data/**", + "cache/**", + "src/tokenizers/**", + "docker/**" ] } diff --git a/package-lock.json b/package-lock.json index 94134d9b0..e25409398 100644 --- a/package-lock.json +++ b/package-lock.json @@ -59,9 +59,10 @@ "sillytavern": "server.js" }, "devDependencies": { + "@types/dompurify": "^3.0.5", "@types/jquery": "^3.5.29", - "eslint": "^8.57.0", - "jquery": "^3.6.4" + "@types/toastr": "^2.1.43", + "eslint": "^8.57.0" }, "engines": { "node": ">= 18" @@ -960,6 +961,16 @@ "@types/responselike": "^1.0.0" } }, + "node_modules/@types/dompurify": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/@types/dompurify/-/dompurify-3.0.5.tgz", + "integrity": "sha512-1Wg0g3BtQF7sSb27fJQAKck1HECM6zV1EB66j8JH9i3LCjYabJa0FSdiSgsD5K/RbrsR0SiraKacLB+T8ZVYAg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/trusted-types": "*" + } + }, "node_modules/@types/http-cache-semantics": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/@types/http-cache-semantics/-/http-cache-semantics-4.0.2.tgz", @@ -967,10 +978,11 @@ "license": "MIT" }, "node_modules/@types/jquery": { - "version": "3.5.29", - "resolved": "https://registry.npmjs.org/@types/jquery/-/jquery-3.5.29.tgz", - "integrity": "sha512-oXQQC9X9MOPRrMhPHHOsXqeQDnWeCDT3PelUIg/Oy8FAbzSZtFHRjc7IpbfFVmpLtJ+UOoywpRsuO5Jxjybyeg==", + "version": "3.5.31", + "resolved": "https://registry.npmjs.org/@types/jquery/-/jquery-3.5.31.tgz", + "integrity": "sha512-rf/iB+cPJ/YZfMwr+FVuQbm7IaWC4y3FVYfVDxRGqmUCFjjPII0HWaP0vTPJGp6m4o13AXySCcMbWfrWtBFAKw==", "dev": true, + "license": "MIT", "dependencies": { "@types/sizzle": "*" } @@ -1021,6 +1033,23 @@ "integrity": "sha512-0vWLNK2D5MT9dg0iOo8GlKguPAU02QjmZitPEsXRuJXU/OGIOt9vT9Fc26wtYuavLxtO45v9PGleoL9Z0k1LHg==", "dev": true }, + "node_modules/@types/toastr": { + "version": "2.1.43", + "resolved": "https://registry.npmjs.org/@types/toastr/-/toastr-2.1.43.tgz", + "integrity": "sha512-sLC2fr2OXeE1iyhUixpQ64wQ2tA26awmLidn4tXTLBz4yP/VhtYUKHpmiIyDtztKkHjucdiTLH8F5uRRyhNi2Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/jquery": "*" + } + }, + "node_modules/@types/trusted-types": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/@types/trusted-types/-/trusted-types-2.0.7.tgz", + "integrity": "sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw==", + "dev": true, + "license": "MIT" + }, "node_modules/@ungap/structured-clone": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.0.tgz", @@ -2038,21 +2067,21 @@ } }, "node_modules/cookie": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.1.tgz", - "integrity": "sha512-ZwrFkGJxUR3EIoXtO+yVE69Eb7KlixbaeAWfBQB9vVsNn/o+Yw69gBWSSDK825hQNdN+wF8zELf3dFNl/kxkUA==", + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.2.tgz", + "integrity": "sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==", "license": "MIT", "engines": { "node": ">= 0.6" } }, "node_modules/cookie-parser": { - "version": "1.4.6", - "resolved": "https://registry.npmjs.org/cookie-parser/-/cookie-parser-1.4.6.tgz", - "integrity": "sha512-z3IzaNjdwUC2olLIB5/ITd0/setiaFMLYiZJle7xg5Fe9KWAceil7xszYfHHBtDFYLSgJduS2Ty0P1uJdPDJeA==", + "version": "1.4.7", + "resolved": "https://registry.npmjs.org/cookie-parser/-/cookie-parser-1.4.7.tgz", + "integrity": "sha512-nGUvgXnotP3BsjiLX2ypbQnWoGUPIIfHQNZkkC668ntrzGWEZVW70HDEB1qnNGMicPje6EttlIgzo51YSwNQGw==", "license": "MIT", "dependencies": { - "cookie": "0.4.1", + "cookie": "0.7.2", "cookie-signature": "1.0.6" }, "engines": { @@ -2865,9 +2894,9 @@ "integrity": "sha512-c2bQfLNbMzLPmzQuOr8fy0csy84WmwnER81W88DzTp9CYNPJ6yzOj2EZAh9pywYpqHnshVLHQJ8WzldAyfY+Iw==" }, "node_modules/express": { - "version": "4.21.0", - "resolved": "https://registry.npmjs.org/express/-/express-4.21.0.tgz", - "integrity": "sha512-VqcNGcj/Id5ZT1LZ/cfihi3ttTn+NJmkli2eZADigjq29qTlWi/hAQ43t/VLPq8+UX06FCEx3ByOYet6ZFblng==", + "version": "4.21.1", + "resolved": "https://registry.npmjs.org/express/-/express-4.21.1.tgz", + "integrity": "sha512-YSFlK1Ee0/GC8QaO91tHcDxJiE/X4FbpAyQWkxAvG6AXCuR65YzK8ua6D9hvi/TzUfZMpc+BwuM1IPw8fmQBiQ==", "license": "MIT", "dependencies": { "accepts": "~1.3.8", @@ -2875,7 +2904,7 @@ "body-parser": "1.20.3", "content-disposition": "0.5.4", "content-type": "~1.0.4", - "cookie": "0.6.0", + "cookie": "0.7.1", "cookie-signature": "1.0.6", "debug": "2.6.9", "depd": "2.0.0", @@ -2907,9 +2936,10 @@ } }, "node_modules/express/node_modules/cookie": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.6.0.tgz", - "integrity": "sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==", + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.1.tgz", + "integrity": "sha512-6DnInpx7SJ2AK3+CTUE/ZM0vWTUboZCegxhC2xiIydHR9jNuTAASBrfEpHhiGOZw/nX51bHt6YQl8jsGo4y/0w==", + "license": "MIT", "engines": { "node": ">= 0.6" } @@ -3881,13 +3911,6 @@ "integrity": "sha512-WZzeDOEtTOBK4Mdsar0IqEU5sMr3vSV2RqkAIzUEV2BHnUfKGyswWFPFwK5EeDo93K3FohSHbLAjj0s1Wzd+dg==", "license": "BSD-3-Clause" }, - "node_modules/jquery": { - "version": "3.7.0", - "resolved": "https://registry.npmjs.org/jquery/-/jquery-3.7.0.tgz", - "integrity": "sha512-umpJ0/k8X0MvD1ds0P9SfowREz2LenHsQaxSohMZ5OMNEU2r0tf8pdeEFTHMFxWVxKNyU9rTtK3CWzUCTKJUeQ==", - "dev": true, - "license": "MIT" - }, "node_modules/js-yaml": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", diff --git a/package.json b/package.json index 382d6ab57..97ec01a9c 100644 --- a/package.json +++ b/package.json @@ -85,8 +85,9 @@ }, "main": "server.js", "devDependencies": { + "@types/dompurify": "^3.0.5", "@types/jquery": "^3.5.29", - "eslint": "^8.57.0", - "jquery": "^3.6.4" + "@types/toastr": "^2.1.43", + "eslint": "^8.57.0" } } diff --git a/public/css/popup.css b/public/css/popup.css index d184dc1fb..545f7014a 100644 --- a/public/css/popup.css +++ b/public/css/popup.css @@ -1,3 +1,4 @@ +@import url('/lib/dialog-polyfill.css'); @import url('./popup-safari-fix.css'); dialog { @@ -42,7 +43,7 @@ dialog { display: flex; flex-direction: column; overflow: hidden; - width: 100%; + width: min(100%, 100vw); height: 100%; padding: 1px; } diff --git a/public/css/select2-overrides.css b/public/css/select2-overrides.css index 47d9746ac..e09e761c9 100644 --- a/public/css/select2-overrides.css +++ b/public/css/select2-overrides.css @@ -17,7 +17,7 @@ .select2-container .select2-selection .select2-selection__clear { color: var(--SmartThemeBodyColor); - font-size: 24px; + font-size: 20px; padding: 0; position: absolute; right: 5px; @@ -50,6 +50,7 @@ padding: revert; border-right: 1px solid var(--SmartThemeBorderColor); font-size: 1.1em; + line-height: 1; } .select2-container .select2-selection--multiple .select2-selection__choice__display { diff --git a/public/css/st-tailwind.css b/public/css/st-tailwind.css index 69f5843a9..88e4ccb10 100644 --- a/public/css/st-tailwind.css +++ b/public/css/st-tailwind.css @@ -612,3 +612,7 @@ ul.li-padding-bot5 li { ul.li-padding-bot10 li { padding-bottom: 10px; } + +.wordBreakAll { + word-break: break-all; +} diff --git a/public/css/toggle-dependent.css b/public/css/toggle-dependent.css index c8d62ee7d..08bb08fe0 100644 --- a/public/css/toggle-dependent.css +++ b/public/css/toggle-dependent.css @@ -459,3 +459,18 @@ body.expandMessageActions .mes .mes_buttons .extraMesButtonsHint { .mdhotkey_icon { opacity: 0.6; } + +label[for="trim_spaces"]:has(input:checked) i.warning { + display: none; +} + +#claude_function_prefill_warning { + display: none; +} + +#openai_settings:has(#openai_function_calling:checked):has(#claude_assistant_prefill:not(:placeholder-shown), #claude_assistant_impersonation:not(:placeholder-shown)) #claude_function_prefill_warning { + display: flex; + align-items: center; + gap: 5px; + margin: 10px 0; +} diff --git a/public/global.d.ts b/public/global.d.ts index c8bfe14c2..a33182d46 100644 --- a/public/global.d.ts +++ b/public/global.d.ts @@ -1,5 +1,4 @@ // Global namespace modules -declare var DOMPurify; declare var droll; declare var Handlebars; declare var hljs; @@ -1365,44 +1364,3 @@ declare namespace moment { declare global { const moment: typeof moment; } - -/** - * Callback data for the `LLM_FUNCTION_TOOL_REGISTER` event type that is triggered when a function tool can be registered. - */ -interface FunctionToolRegister { - /** - * The type of generation that is being used - */ - type?: string; - /** - * Generation data, including messages and sampling parameters - */ - data: Record; - /** - * Callback to register an LLM function tool. - */ - registerFunctionTool: typeof registerFunctionTool; -} - -/** - * Callback data for the `LLM_FUNCTION_TOOL_REGISTER` event type that is triggered when a function tool is registered. - * @param name Name of the function tool to register - * @param description Description of the function tool - * @param params JSON schema for the parameters of the function tool - * @param required Whether the function tool should be forced to be used - */ -declare function registerFunctionTool(name: string, description: string, params: object, required: boolean): Promise; - -/** - * Callback data for the `LLM_FUNCTION_TOOL_CALL` event type that is triggered when a function tool is called. - */ -interface FunctionToolCall { - /** - * Name of the function tool to call - */ - name: string; - /** - * JSON object with the parameters to pass to the function tool - */ - arguments: string; -} diff --git a/public/index.html b/public/index.html index 99994885e..bfd85f2bb 100644 --- a/public/index.html +++ b/public/index.html @@ -595,17 +595,6 @@
-
- -
- - Allow the model to use the web-search connector. - -
-
Temperature @@ -1310,7 +1299,7 @@
-
+
+
Repetition Penalty
+
Presence Penalty
+
Frequency Penalty
+
DRY
Temperature
Dynamic Temperature
Quadratic / Smooth Sampling
@@ -1691,6 +1684,9 @@
Top A
Min P
Mirostat
+
XTC
+
Encoder Repetition Penalty
+
No Repeat Ngram