diff --git a/colab/GPU.ipynb b/colab/GPU.ipynb
index c1474e479..331cd77a3 100644
--- a/colab/GPU.ipynb
+++ b/colab/GPU.ipynb
@@ -1,195 +1,11 @@
{
- "cells": [
- {
- "cell_type": "markdown",
- "metadata": {
- "id": "d-Yihz3hAb2E"
- },
- "source": [
- "https://colab.research.google.com/github/TavernAI/TavernAI/blob/main/colab/GPU.ipynb \n",
- "\n",
- "Works with: \n",
- "KoboldAI https://github.com/KoboldAI/KoboldAI-Client \n",
- "Pygmalion https://huggingface.co/PygmalionAI/ \n",
- " \n",
- "**Links** \n",
- "TavernAI Github https://github.com/TavernAI/TavernAI \n",
- "TavernAI Discord https://discord.gg/zmK2gmr45t \n",
- "TavernAI Boosty https://boosty.to/tavernai\n",
- "
\n",
- " Tavern.AI/ \\ / ^ ^ ^ ^ ~~~~ ^ \\ / ^ ^ ^ ^/ ^ ^ \\/^ ^ \\\n",
- " /^ ^\\ ^ ^ ^ ^ ^ ~~ ^ \\ / ^ ^ ^ / ^ ^ ^/ ^ ^ \\\n",
- " /^ ^ ^\\^ ^ ^ ^ _||____ ^ \\ / ^ ^ ^ / / ^ ^ ^ \\\n",
- " /\\ /\\ /\\ ^ \\ /\\ /\\ /\\\\\\\\\\\\\\\\ ^ \\ ^ /\\ /\\ /\\ /\\ /\\ /\\ ^ ^ ^/\\\n",
- "//\\\\/\\\\/\\\\ ^ \\//\\\\/\\\\ /__\\\\\\\\\\\\\\\\ _, \\ //\\\\/\\\\/\\\\ //\\\\/\\\\/\\\\ ^ ^ //\\\\\n",
- "//\\\\/\\\\/\\\\ //\\\\/\\\\ |__|_|_|__| \\__, //\\\\/\\\\/\\\\ //\\\\/\\\\/\\\\ ///\\\\\\\n",
- " || || (@^◡^)(≖ ‸ ≖*) ( ←_← )\\| /| /\\ \\ヽ(°ㅂ°╬) |( Ψ▼ー▼)∈ (O_O; ) |||\n",
- "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~ ~~~~~ ~~~~~ ~~~~~ ~~~~~ ~~ \n",
- " \n",
- "**Launch Instructions** \n",
- "1. Click the launch button.\n",
- "2. Wait for the environment and model to load\n",
- "3. After initialization, a TavernAI link will appear\n",
- "\n",
- "**Faq** \n",
- "* Q: I do not get a TavernAI link\n",
- "* A: It seems the localtunnel service is currently down, so the TavernAI link is unavailable. Need to wait for it to start working again."
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {
- "id": "hCpoIHxYcDGs"
- },
- "outputs": [],
- "source": [
- "#@title <-- Tap this if you play on Mobile { display-mode: \"form\" }\n",
- "#Taken from KoboldAI colab\n",
- "%%html\n",
- "Press play on the music player to keep the tab alive, then start TavernAI below (Uses only 13MB of data) \n",
- ""
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {
- "id": "hps3qtPLFNBb",
- "cellView": "form"
- },
- "outputs": [],
- "source": [
- "#@title TavernAI \n",
- "#@markdown <- Click For Start (≖ ‸ ≖ ✿)\n",
- "\n",
- "Model = \"Pygmalion 6B\" #@param [ \"Pygmalion 6B\", \"Pygmalion 6B Dev\"] {allow-input: true}\n",
- "Version = \"Official\" \n",
- "KoboldAI_Provider = \"Localtunnel\" #@param [\"Localtunnel\", \"Cloudflare\"]\n",
- "use_google_drive = True #@param {type:\"boolean\"}\n",
- "Provider = KoboldAI_Provider\n",
- "!nvidia-smi\n",
- "import subprocess\n",
- "import time\n",
- "import sys\n",
- "import os\n",
- "import threading\n",
- "import shutil\n",
- "from google.colab import drive\n",
- "\n",
- " \n",
- "if use_google_drive:\n",
- " drive.mount('/content/drive/')\n",
- " if not os.path.exists(\"/content/drive/MyDrive/TavernAI/\"):\n",
- " os.mkdir(\"/content/drive/MyDrive/TavernAI/\")\n",
- " if not os.path.exists(\"/content/drive/MyDrive/TavernAI/characters/\"):\n",
- " os.mkdir(\"/content/drive/MyDrive/TavernAI/characters/\")\n",
- " if not os.path.exists(\"/content/drive/MyDrive/TavernAI/chats/\"):\n",
- " os.mkdir(\"/content/drive/MyDrive/TavernAI/chats/\")\n",
- "else:\n",
- " if not os.path.exists(\"/content/drive\"):\n",
- " os.mkdir(\"/content/drive\")\n",
- " if not os.path.exists(\"/content/drive/MyDrive/\"):\n",
- " os.mkdir(\"/content/drive/MyDrive/\")\n",
- "\n",
- "def copy_characters(use_google_drive=False):\n",
- " if not use_google_drive:\n",
- " return\n",
- " \n",
- " src_folder = \"/TavernAIColab/public/characters\"\n",
- " dst_folder = \"/content/drive/MyDrive/TavernAI/characters\"\n",
- "\n",
- " for filename in os.listdir(src_folder):\n",
- " src_file = os.path.join(src_folder, filename)\n",
- " dst_file = os.path.join(dst_folder, filename)\n",
- "\n",
- " if os.path.exists(dst_file):\n",
- " print(f\"{dst_file} already exists. Skipping...\")\n",
- " continue\n",
- "\n",
- " shutil.copy(src_file, dst_folder)\n",
- " print(f\"{src_file} copied to {dst_folder}\")\n",
- "Revision = \"\"\n",
- "\n",
- "if Model == \"Pygmalion 6B\":\n",
- " Model = \"PygmalionAI/pygmalion-6b\"\n",
- " path = \"\"\n",
- " download = \"\"\n",
- " Version = \"United\"\n",
- "elif Model == \"Pygmalion 6B Dev\":\n",
- " Model = \"PygmalionAI/pygmalion-6b\"\n",
- " Revision = \"--revision dev\"\n",
- " path = \"\"\n",
- " Version = \"United\"\n",
- " download = \"\"\n",
- "\n",
- "if Provider == \"Localtunnel\":\n",
- " tunnel = \"--localtunnel yes\"\n",
- "else:\n",
- " tunnel = \"\"\n",
- "\n",
- "\n",
- "\n",
- "#Henk's KoboldAI script\n",
- "!wget https://koboldai.org/ckds && chmod +x ckds\n",
- "!./ckds --init only\n",
- "if Provider == \"Localtunnel\":\n",
- " p = subprocess.Popen(['/content/ckds', '--model', Model, '--localtunnel', 'yes'], stdout=subprocess.PIPE, stderr=subprocess.PIPE)\n",
- "else:\n",
- " p = subprocess.Popen(['/content/ckds', '--model', Model], stdout=subprocess.PIPE, stderr=subprocess.PIPE)\n",
- "\n",
- "\n",
- "#Do not repeat! Tricks performed by a professional!\n",
- "url = ''\n",
- "while True:\n",
- " line = p.stdout.readline().decode().strip()\n",
- " if \"KoboldAI has finished loading and is available at the following link: \" in line:\n",
- " print(line)\n",
- " url = line.split(\"KoboldAI has finished loading and is available at the following link: \")[1]\n",
- " print(url)\n",
- " break\n",
- " if \"KoboldAI has finished loading and is available at the following link for UI 1: \" in line:\n",
- " print(line)\n",
- " url = line.split(\"KoboldAI has finished loading and is available at the following link for UI 1: \")[1]\n",
- " print(url)\n",
- " break\n",
- " if not line:\n",
- " break\n",
- " print(line)\n",
- " if \"INIT\" in line and \"Transformers\" in line:\n",
- " print(\"Model loading... (It will take 2 - 5 minutes)\")\n",
- "\n",
- "\n",
- "#TavernAI\n",
- "%cd /\n",
- "!curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.37.2/install.sh | bash\n",
- "!nvm install 19.1.0\n",
- "!nvm use 19.1.0\n",
- "!node -v\n",
- "!git clone https://github.com/TavernAI/TavernAIColab\n",
- "copy_characters(use_google_drive)\n",
- "%cd TavernAIColab\n",
- "!npm install\n",
- "time.sleep(1)\n",
- "%env colab=2\n",
- "%env colaburl=$url\n",
- "if use_google_drive:\n",
- " %env googledrive=2\n",
- "!nohup node server.js &\n",
- "time.sleep(3)\n",
- "print('KoboldAI LINK:')\n",
- "print(url)\n",
- "print('')\n",
- "print('###TavernAI LINK###')\n",
- "!lt --port 8000\n"
- ]
- }
- ],
+ "nbformat": 4,
+ "nbformat_minor": 0,
"metadata": {
"colab": {
+ "private_outputs": true,
"provenance": []
},
- "gpuClass": "standard",
"kernelspec": {
"display_name": "Python 3",
"name": "python3"
@@ -197,8 +13,306 @@
"language_info": {
"name": "python"
},
- "accelerator": "GPU"
+ "accelerator": "GPU",
+ "gpuClass": "standard"
},
- "nbformat": 4,
- "nbformat_minor": 0
+ "cells": [
+ {
+ "cell_type": "code",
+ "source": [
+ "#@title <-- Convert TavernAI characters to SillyTavern format \n",
+ "\n",
+ "!mkdir /convert\n",
+ "%cd /convert\n",
+ "\n",
+ "import os\n",
+ "from google.colab import drive\n",
+ "\n",
+ "drive.mount(\"/convert/drive\")\n",
+ "\n",
+ "!git clone -b tools https://github.com/EnergoStalin/SillyTavern.git\n",
+ "%cd SillyTavern\n",
+ "\n",
+ "!curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.37.2/install.sh | bash\n",
+ "!nvm install 19.1.0\n",
+ "!nvm use 19.1.0\n",
+ "\n",
+ "%cd tools/charaverter\n",
+ "\n",
+ "!npm i\n",
+ "\n",
+ "path = \"/convert/drive/MyDrive/TavernAI/characters\"\n",
+ "output = \"/convert/drive/MyDrive/SillyTavern/characters\"\n",
+ "if not os.path.exists(path):\n",
+ " path = output\n",
+ "\n",
+ "!mkdir -p $output\n",
+ "!node main.mjs $path $output\n",
+ "\n",
+ "drive.flush_and_unmount()\n",
+ "\n",
+ "%cd /\n",
+ "!rm -rf /convert"
+ ],
+ "metadata": {
+ "cellView": "form",
+ "id": "_1gpebrnlp5-"
+ },
+ "execution_count": null,
+ "outputs": []
+ },
+ {
+ "cell_type": "code",
+ "metadata": {
+ "id": "ewkXkyiFP2Hq"
+ },
+ "source": [
+ "#@title <-- Tap this if you play on Mobile { display-mode: \"form\" }\n",
+ "%%html\n",
+ "Press play on the music player to keep the tab alive, then start KoboldAI below (Uses only 13MB of data) \n",
+ ""
+ ],
+ "execution_count": null,
+ "outputs": []
+ },
+ {
+ "cell_type": "code",
+ "metadata": {
+ "id": "lVftocpwCoYw",
+ "cellView": "form"
+ },
+ "source": [
+ "#@title <-- Select your model below and then click this to start KoboldAI \n",
+ "\n",
+ "Model = \"Pygmalion 6B\" #@param [\"Nerys V2 6B\", \"Erebus 6B\", \"Skein 6B\", \"Janeway 6B\", \"Adventure 6B\", \"Pygmalion 6B\", \"Pygmalion 6B Dev\", \"Lit V2 6B\", \"Lit 6B\", \"Shinen 6B\", \"Nerys 2.7B\", \"AID 2.7B\", \"Erebus 2.7B\", \"Janeway 2.7B\", \"Picard 2.7B\", \"Horni LN 2.7B\", \"Horni 2.7B\", \"Shinen 2.7B\", \"OPT 2.7B\", \"Fairseq Dense 2.7B\", \"Neo 2.7B\", \"Pygway 6B\", \"Nerybus 6.7B\", \"Pygway v8p4\", \"PPO-Janeway 6B\", \"PPO Shygmalion 6B\", \"LLaMA 7B\", \"Janin-GPTJ\", \"Javelin-GPTJ\", \"Javelin-R\", \"Janin-R\", \"Javalion-R\", \"Javalion-GPTJ\", \"Javelion-6B\", \"GPT-J-Pyg-PPO-6B\", \"ppo_hh_pythia-6B\", \"ppo_hh_gpt-j\", \"GPT-J-Pyg_PPO-6B\", \"GPT-J-Pyg_PPO-6B-Dev-V8p4\", \"Dolly_GPT-J-6b\", \"Dolly_Pyg-6B\"] {allow-input: true}\n",
+ "Version = \"Official\" #@param [\"Official\", \"United\"] {allow-input: true}\n",
+ "Provider = \"Localtunnel\" #@param [\"Localtunnel\"]\n",
+ "ForceInitSteps = [] #@param {allow-input: true}\n",
+ "UseGoogleDrive = True #@param {type:\"boolean\"}\n",
+ "StartKoboldAI = True #@param {type:\"boolean\"}\n",
+ "ModelsFromDrive = False #@param {type:\"boolean\"}\n",
+ "\n",
+ "%cd /content\n",
+ "\n",
+ "!cat .ii\n",
+ "!nvidia-smi\n",
+ "\n",
+ "import os, subprocess, time, pathlib, json, base64\n",
+ "\n",
+ "class ModelData:\n",
+ " def __init__(self, name, version = Version, revision = \"\", path = \"\", download = \"\"):\n",
+ " try:\n",
+ " self.name = base64.b64decode(name.encode(\"ascii\")).decode(\"ascii\")\n",
+ " except:\n",
+ " self.name = name\n",
+ " self.version = version \n",
+ " self.revision = revision\n",
+ " self.path = path\n",
+ " self.download = download\n",
+ " def args(self):\n",
+ " args = [\"-m\", self.name, \"-g\", self.version]\n",
+ " if(self.revision):\n",
+ " args += [\"-r\", self.revision]\n",
+ " return args\n",
+ "\n",
+ "class IncrementialInstall:\n",
+ " def __init__(self, tasks = [], force = []):\n",
+ " self.tasks = tasks\n",
+ " self.completed = list(filter(lambda x: not x in force, self.__completed()))\n",
+ "\n",
+ " def __completed(self):\n",
+ " try:\n",
+ " with open(\".ii\") as f:\n",
+ " return json.load(f)\n",
+ " except:\n",
+ " return []\n",
+ "\n",
+ " def addTask(self, name, func):\n",
+ " self.tasks.append({\"name\": name, \"func\": func})\n",
+ "\n",
+ " def run(self):\n",
+ " todo = list(filter(lambda x: not x[\"name\"] in self.completed, self.tasks))\n",
+ " try:\n",
+ " for task in todo:\n",
+ " task[\"func\"]()\n",
+ " self.completed.append(task[\"name\"])\n",
+ " finally:\n",
+ " with open(\".ii\", \"w\") as f:\n",
+ " json.dump(self.completed, f)\n",
+ "\n",
+ "ii = IncrementialInstall(force=ForceInitSteps)\n",
+ "\n",
+ "def create_paths(paths):\n",
+ " for directory in paths:\n",
+ " if not os.path.exists(directory):\n",
+ " os.makedirs(directory)\n",
+ "\n",
+ "# link source to dest copying dest to source if not present first\n",
+ "def link(srcDir, destDir, files):\n",
+ " for file in files:\n",
+ " source = os.path.join(srcDir, file)\n",
+ " dest = os.path.join(destDir, file)\n",
+ " if not os.path.exists(source):\n",
+ " !cp -r \"$dest\" \"$source\"\n",
+ " !rm -rf \"$dest\"\n",
+ " !ln -fs \"$source\" \"$dest\"\n",
+ "\n",
+ "from google.colab import drive\n",
+ "if UseGoogleDrive:\n",
+ " drive.mount(\"/content/drive/\")\n",
+ "else:\n",
+ " create_paths([\n",
+ " \"/content/drive/MyDrive\"\n",
+ " ])\n",
+ "\n",
+ "model = {\n",
+ " \"Nerys V2 6B\": ModelData(\"KoboldAI/OPT-6B-nerys-v2\"),\n",
+ " \"Erebus 6B\": ModelData(\"KoboldAI/OPT-6.7B-Erebus\"),\n",
+ " \"Skein 6B\": ModelData(\"KoboldAI/GPT-J-6B-Skein\"),\n",
+ " \"Janeway 6B\": ModelData(\"KoboldAI/GPT-J-6B-Janeway\"),\n",
+ " \"Adventure 6B\": ModelData(\"KoboldAI/GPT-J-6B-Adventure\"),\n",
+ " \"UHlnbWFsaW9uIDZC\": ModelData(\"UHlnbWFsaW9uQUkvcHlnbWFsaW9uLTZi\"),\n",
+ " \"UHlnbWFsaW9uIDZCIERldg==\": ModelData(\"UHlnbWFsaW9uQUkvcHlnbWFsaW9uLTZi\", revision = \"dev\"),\n",
+ " \"Lit V2 6B\": ModelData(\"hakurei/litv2-6B-rev3\"),\n",
+ " \"Lit 6B\": ModelData(\"hakurei/lit-6B\"),\n",
+ " \"Shinen 6B\": ModelData(\"KoboldAI/GPT-J-6B-Shinen\"),\n",
+ " \"Nerys 2.7B\": ModelData(\"KoboldAI/fairseq-dense-2.7B-Nerys\"),\n",
+ " \"Erebus 2.7B\": ModelData(\"KoboldAI/OPT-2.7B-Erebus\"),\n",
+ " \"Janeway 2.7B\": ModelData(\"KoboldAI/GPT-Neo-2.7B-Janeway\"),\n",
+ " \"Picard 2.7B\": ModelData(\"KoboldAI/GPT-Neo-2.7B-Picard\"),\n",
+ " \"AID 2.7B\": ModelData(\"KoboldAI/GPT-Neo-2.7B-AID\"),\n",
+ " \"Horni LN 2.7B\": ModelData(\"KoboldAI/GPT-Neo-2.7B-Horni-LN\"),\n",
+ " \"Horni 2.7B\": ModelData(\"KoboldAI/GPT-Neo-2.7B-Horni\"),\n",
+ " \"Shinen 2.7B\": ModelData(\"KoboldAI/GPT-Neo-2.7B-Shinen\"),\n",
+ " \"Fairseq Dense 2.7B\": ModelData(\"KoboldAI/fairseq-dense-2.7B\"),\n",
+ " \"OPT 2.7B\": ModelData(\"facebook/opt-2.7b\"),\n",
+ " \"Neo 2.7B\": ModelData(\"EleutherAI/gpt-neo-2.7B\"),\n",
+ " \"Pygway 6B\": ModelData(\"TehVenom/PPO_Pygway-6b\"),\n",
+ " \"Nerybus 6.7B\": ModelData(\"KoboldAI/OPT-6.7B-Nerybus-Mix\"),\n",
+ " \"Pygway v8p4\": ModelData(\"TehVenom/PPO_Pygway-V8p4_Dev-6b\"),\n",
+ " \"PPO-Janeway 6B\": ModelData(\"TehVenom/PPO_Janeway-6b\"),\n",
+ " \"PPO Shygmalion 6B\": ModelData(\"TehVenom/PPO_Shygmalion-6b\"),\n",
+ " \"LLaMA 7B\": ModelData(\"decapoda-research/llama-7b-hf\"),\n",
+ " \"Janin-GPTJ\": ModelData(\"digitous/Janin-GPTJ\"),\n",
+ " \"Javelin-GPTJ\": ModelData(\"digitous/Javelin-GPTJ\"),\n",
+ " \"Javelin-R\": ModelData(\"digitous/Javelin-R\"),\n",
+ " \"Janin-R\": ModelData(\"digitous/Janin-R\"),\n",
+ " \"Javalion-R\": ModelData(\"digitous/Javalion-R\"),\n",
+ " \"Javalion-GPTJ\": ModelData(\"digitous/Javalion-GPTJ\"),\n",
+ " \"Javelion-6B\": ModelData(\"Cohee/Javelion-6b\"),\n",
+ " \"GPT-J-Pyg-PPO-6B\": ModelData(\"TehVenom/GPT-J-Pyg_PPO-6B\"),\n",
+ " \"ppo_hh_pythia-6B\": ModelData(\"reciprocate/ppo_hh_pythia-6B\"),\n",
+ " \"ppo_hh_gpt-j\": ModelData(\"reciprocate/ppo_hh_gpt-j\"),\n",
+ " \"Alpaca-7B\": ModelData(\"chainyo/alpaca-lora-7b\"),\n",
+ " \"LLaMA 4-bit\": ModelData(\"decapoda-research/llama-13b-hf-int4\"),\n",
+ " \"GPT-J-Pyg_PPO-6B\": ModelData(\"TehVenom/GPT-J-Pyg_PPO-6B\"),\n",
+ " \"GPT-J-Pyg_PPO-6B-Dev-V8p4\": ModelData(\"TehVenom/GPT-J-Pyg_PPO-6B-Dev-V8p4\"),\n",
+ " \"Dolly_GPT-J-6b\": ModelData(\"TehVenom/Dolly_GPT-J-6b\"),\n",
+ " \"Dolly_Pyg-6B\": ModelData(\"TehVenom/AvgMerge_Dolly-Pygmalion-6b\")\n",
+ "}\n",
+ "model = model.get(Model, model)\n",
+ "model = model.get(base64.b64encode(Model.encode(\"ascii\")).decode(\"ascii\"), ModelData(Model, Version))\n",
+ "\n",
+ "if StartKoboldAI:\n",
+ " def downloadKobold():\n",
+ " !wget https://koboldai.org/ckds && chmod +x ckds\n",
+ " def initKobold():\n",
+ " !./ckds --init only\n",
+ "\n",
+ " ii.addTask(\"Download KoboldAI\", downloadKobold)\n",
+ " ii.addTask(\"Init KoboldAI\", initKobold)\n",
+ " \n",
+ " ii.run()\n",
+ "\n",
+ "kargs = [\"/content/ckds\"]\n",
+ "if not ModelsFromDrive:\n",
+ " kargs += [\"-x\", \"colab\", \"-l\", \"colab\"]\n",
+ "if Provider == \"Localtunnel\":\n",
+ " kargs += [\"--localtunnel\", \"yes\"]\n",
+ "\n",
+ "kargs += model.args()\n",
+ "\n",
+ "url = \"\"\n",
+ "print(kargs)\n",
+ "\n",
+ "if StartKoboldAI:\n",
+ " p = subprocess.Popen(kargs, stdout=subprocess.PIPE, stderr=subprocess.PIPE)\n",
+ "\n",
+ " prefix = \"KoboldAI has finished loading and is available at the following link\"\n",
+ " urlprefix = f\"{prefix}: \"\n",
+ " ui1prefix = f\"{prefix} for UI 1: \"\n",
+ " while True:\n",
+ " line = p.stdout.readline().decode().strip()\n",
+ " if urlprefix in line:\n",
+ " url = line.split(urlprefix)[1]\n",
+ " break\n",
+ " elif ui1prefix in line:\n",
+ " url = line.split(ui1prefix)[1]\n",
+ " break\n",
+ " elif not line:\n",
+ " break\n",
+ " print(line)\n",
+ " if \"INIT\" in line and \"Transformers\" in line:\n",
+ " print(\"Model loading... (It will take 2 - 5 minutes)\")\n",
+ "\n",
+ "print(url)\n",
+ "\n",
+ "# #TavernAI\n",
+ "%cd /\n",
+ "def setupNVM():\n",
+ " !curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.37.2/install.sh | bash\n",
+ "ii.addTask(\"Setup NVM\", setupNVM)\n",
+ "\n",
+ "def installNode():\n",
+ " !nvm install 19.1.0\n",
+ " !nvm use 19.1.0\n",
+ "ii.addTask(\"Install node\", installNode)\n",
+ "\n",
+ "def cloneTavern():\n",
+ " !git clone https://github.com/EnergoStalin/SillyTavern\n",
+ "ii.addTask(\"Clone SillyTavern\", cloneTavern)\n",
+ "\n",
+ "ii.run()\n",
+ "%cd /SillyTavern\n",
+ "\n",
+ "if UseGoogleDrive:\n",
+ " %env googledrive=2\n",
+ "\n",
+ " def setupTavernPaths():\n",
+ " tdrive = \"/content/drive/MyDrive/SillyTavern\"\n",
+ " create_paths([\n",
+ " tdrive,\n",
+ " os.path.join(\"public\", \"groups\"),\n",
+ " os.path.join(\"public\", \"group chats\")\n",
+ " ])\n",
+ " link(tdrive, \"public\", [\n",
+ " \"settings.json\",\n",
+ " \"backgrounds\",\n",
+ " \"characters\",\n",
+ " \"chats\",\n",
+ " \"User Avatars\",\n",
+ " \"css\",\n",
+ " \"worlds\",\n",
+ " \"group chats\",\n",
+ " \"groups\",\n",
+ " ])\n",
+ " ii.addTask(\"Setup Tavern Paths\", setupTavernPaths)\n",
+ "\n",
+ "def installTavernDependencies():\n",
+ " !npm install\n",
+ " !npm install -g localtunnel\n",
+ "ii.addTask(\"Install Tavern Dependencies\", installTavernDependencies)\n",
+ "ii.run()\n",
+ "\n",
+ "%env colaburl=$url\n",
+ "%env SILLY_TAVERN_PORT=5001\n",
+ "print(\"KoboldAI LINK:\", url, \"###SillyTavern LINK###\", sep=\"\\n\")\n",
+ "p = subprocess.Popen([\"lt\", \"--port\", \"5001\"], stdout=subprocess.PIPE, stderr=subprocess.PIPE)\n",
+ "print(p.stdout.readline().decode().strip())\n",
+ "!node server.js"
+ ],
+ "execution_count": null,
+ "outputs": []
+ }
+ ]
}
\ No newline at end of file