rodrigomasini commited on
Commit
b402a20
1 Parent(s): 7917708

Upload 5 files

Browse files
Files changed (5) hide show
  1. app.py +4 -0
  2. convert-to-safetensors.py +38 -0
  3. requirements.txt +35 -0
  4. server.py +1182 -0
  5. settings-template.yaml +36 -0
app.py ADDED
@@ -0,0 +1,4 @@
 
 
 
 
 
1
+ import os
2
+ os.system('python download-model.py PygmalionAI/pygmalion-350m --branch main')
3
+ # os.system('python download-model.py waifu-workshop/pygmalion-6b --branch original-sharded')
4
+ os.system('python server.py --cpu --chat --model PygmalionAI_pygmalion-350m --no-stream --auto-devices')
convert-to-safetensors.py ADDED
@@ -0,0 +1,38 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ '''
2
+
3
+ Converts a transformers model to safetensors format and shards it.
4
+
5
+ This makes it faster to load (because of safetensors) and lowers its RAM usage
6
+ while loading (because of sharding).
7
+
8
+ Based on the original script by 81300:
9
+
10
+ https://gist.github.com/81300/fe5b08bff1cba45296a829b9d6b0f303
11
+
12
+ '''
13
+
14
+ import argparse
15
+ from pathlib import Path
16
+
17
+ import torch
18
+ from transformers import AutoModelForCausalLM, AutoTokenizer
19
+
20
+ parser = argparse.ArgumentParser(formatter_class=lambda prog: argparse.HelpFormatter(prog, max_help_position=54))
21
+ parser.add_argument('MODEL', type=str, default=None, nargs='?', help="Path to the input model.")
22
+ parser.add_argument('--output', type=str, default=None, help='Path to the output folder (default: models/{model_name}_safetensors).')
23
+ parser.add_argument("--max-shard-size", type=str, default="2GB", help="Maximum size of a shard in GB or MB (default: %(default)s).")
24
+ parser.add_argument('--bf16', action='store_true', help='Load the model with bfloat16 precision. Requires NVIDIA Ampere GPU.')
25
+ args = parser.parse_args()
26
+
27
+ if __name__ == '__main__':
28
+ path = Path(args.MODEL)
29
+ model_name = path.name
30
+
31
+ print(f"Loading {model_name}...")
32
+ model = AutoModelForCausalLM.from_pretrained(path, low_cpu_mem_usage=True, torch_dtype=torch.bfloat16 if args.bf16 else torch.float16)
33
+ tokenizer = AutoTokenizer.from_pretrained(path)
34
+
35
+ out_folder = args.output or Path(f"models/{model_name}_safetensors")
36
+ print(f"Saving the converted model to {out_folder} with a maximum shard size of {args.max_shard_size}...")
37
+ model.save_pretrained(out_folder, max_shard_size=args.max_shard_size, safe_serialization=True)
38
+ tokenizer.save_pretrained(out_folder)
requirements.txt ADDED
@@ -0,0 +1,35 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ accelerate==0.25.*
2
+ colorama
3
+ datasets
4
+ einops
5
+ exllamav2==0.0.12
6
+ gradio==3.47.0
7
+ hqq==0.1.2.post1
8
+ jinja2==3.1.2
9
+ lm_eval==0.3.0
10
+ markdown
11
+ numpy==1.24.*
12
+ optimum==1.16.*
13
+ pandas
14
+ peft==0.7.*
15
+ Pillow>=9.5.0
16
+ pyyaml
17
+ requests
18
+ rich
19
+ safetensors==0.4.1
20
+ scipy
21
+ sentencepiece
22
+ tensorboard
23
+ transformers==4.37.*
24
+ tqdm
25
+ wandb
26
+
27
+ # bitsandbytes
28
+ bitsandbytes==0.41.1; platform_system != "Windows"
29
+ https://github.com/jllllll/bitsandbytes-windows-webui/releases/download/wheels/bitsandbytes-0.41.1-py3-none-win_amd64.whl; platform_system == "Windows"
30
+
31
+ # llama-cpp-python (CPU only, AVX2)
32
+ https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/cpu/llama_cpp_python-0.2.36+cpuavx2-cp311-cp311-manylinux_2_31_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.11"
33
+ https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/cpu/llama_cpp_python-0.2.36+cpuavx2-cp310-cp310-manylinux_2_31_x86_64.whl; platform_system == "Linux" and platform_machine == "x86_64" and python_version == "3.10"
34
+ https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/cpu/llama_cpp_python-0.2.36+cpuavx2-cp311-cp311-win_amd64.whl; platform_system == "Windows" and python_version == "3.11"
35
+ https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/cpu/llama_cpp_python-0.2.36+cpuavx2-cp310-cp310-win_amd64.whl; platform_system == "Windows" and python_version == "3.10"
server.py ADDED
@@ -0,0 +1,1182 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import os
2
+ import warnings
3
+
4
+ from modules.logging_colors import logger
5
+ from modules.block_requests import OpenMonkeyPatch, RequestBlocker
6
+
7
+ os.environ['GRADIO_ANALYTICS_ENABLED'] = 'False'
8
+ os.environ['BITSANDBYTES_NOWELCOME'] = '1'
9
+ warnings.filterwarnings('ignore', category=UserWarning, message='TypedStorage is deprecated')
10
+
11
+ with RequestBlocker():
12
+ import gradio as gr
13
+
14
+ import matplotlib
15
+ matplotlib.use('Agg') # This fixes LaTeX rendering on some systems
16
+
17
+ import importlib
18
+ import json
19
+ import math
20
+ import os
21
+ import re
22
+ import sys
23
+ import time
24
+ import traceback
25
+ from functools import partial
26
+ from pathlib import Path
27
+ from threading import Lock
28
+
29
+ import psutil
30
+ import torch
31
+ import yaml
32
+ from PIL import Image
33
+
34
+ import modules.extensions as extensions_module
35
+ from modules import chat, loaders, presets, shared, training, ui, utils
36
+ from modules.extensions import apply_extensions
37
+ from modules.github import clone_or_pull_repository
38
+ from modules.html_generator import chat_html_wrapper
39
+ from modules.LoRA import add_lora_to_model
40
+ from modules.models import load_model, unload_model
41
+ from modules.models_settings import (
42
+ apply_model_settings_to_state,
43
+ get_model_settings_from_yamls,
44
+ save_model_settings,
45
+ update_model_parameters
46
+ )
47
+ from modules.text_generation import (
48
+ generate_reply_wrapper,
49
+ get_encoded_length,
50
+ stop_everything_event
51
+ )
52
+ from modules.utils import gradio
53
+
54
+
55
+ def load_model_wrapper(selected_model, loader, autoload=False):
56
+ if not autoload:
57
+ yield f"The settings for {selected_model} have been updated.\nClick on \"Load\" to load it."
58
+ return
59
+
60
+ if selected_model == 'None':
61
+ yield "No model selected"
62
+ else:
63
+ try:
64
+ yield f"Loading {selected_model}..."
65
+ shared.model_name = selected_model
66
+ unload_model()
67
+ if selected_model != '':
68
+ shared.model, shared.tokenizer = load_model(shared.model_name, loader)
69
+
70
+ if shared.model is not None:
71
+ yield f"Successfully loaded {selected_model}"
72
+ else:
73
+ yield f"Failed to load {selected_model}."
74
+ except:
75
+ exc = traceback.format_exc()
76
+ logger.error('Failed to load the model.')
77
+ print(exc)
78
+ yield exc
79
+
80
+
81
+ def load_lora_wrapper(selected_loras):
82
+ yield ("Applying the following LoRAs to {}:\n\n{}".format(shared.model_name, '\n'.join(selected_loras)))
83
+ add_lora_to_model(selected_loras)
84
+ yield ("Successfuly applied the LoRAs")
85
+
86
+
87
+ def load_prompt(fname):
88
+ if fname in ['None', '']:
89
+ return ''
90
+ elif fname.startswith('Instruct-'):
91
+ fname = re.sub('^Instruct-', '', fname)
92
+ file_path = Path(f'characters/instruction-following/{fname}.yaml')
93
+ if not file_path.exists():
94
+ return ''
95
+
96
+ with open(file_path, 'r', encoding='utf-8') as f:
97
+ data = yaml.safe_load(f)
98
+ output = ''
99
+ if 'context' in data:
100
+ output += data['context']
101
+
102
+ replacements = {
103
+ '<|user|>': data['user'],
104
+ '<|bot|>': data['bot'],
105
+ '<|user-message|>': 'Input',
106
+ }
107
+
108
+ output += utils.replace_all(data['turn_template'].split('<|bot-message|>')[0], replacements)
109
+ return output.rstrip(' ')
110
+ else:
111
+ file_path = Path(f'prompts/{fname}.txt')
112
+ if not file_path.exists():
113
+ return ''
114
+
115
+ with open(file_path, 'r', encoding='utf-8') as f:
116
+ text = f.read()
117
+ if text[-1] == '\n':
118
+ text = text[:-1]
119
+
120
+ return text
121
+
122
+
123
+ def count_tokens(text):
124
+ try:
125
+ tokens = get_encoded_length(text)
126
+ return f'{tokens} tokens in the input.'
127
+ except:
128
+ return 'Couldn\'t count the number of tokens. Is a tokenizer loaded?'
129
+
130
+
131
+ def download_model_wrapper(repo_id, progress=gr.Progress()):
132
+ try:
133
+ downloader_module = importlib.import_module("download-model")
134
+ downloader = downloader_module.ModelDownloader()
135
+ repo_id_parts = repo_id.split(":")
136
+ model = repo_id_parts[0] if len(repo_id_parts) > 0 else repo_id
137
+ branch = repo_id_parts[1] if len(repo_id_parts) > 1 else "main"
138
+ check = False
139
+
140
+ progress(0.0)
141
+ yield ("Cleaning up the model/branch names")
142
+ model, branch = downloader.sanitize_model_and_branch_names(model, branch)
143
+
144
+ yield ("Getting the download links from Hugging Face")
145
+ links, sha256, is_lora = downloader.get_download_links_from_huggingface(model, branch, text_only=False)
146
+
147
+ yield ("Getting the output folder")
148
+ base_folder = shared.args.lora_dir if is_lora else shared.args.model_dir
149
+ output_folder = downloader.get_output_folder(model, branch, is_lora, base_folder=base_folder)
150
+
151
+ if check:
152
+ progress(0.5)
153
+ yield ("Checking previously downloaded files")
154
+ downloader.check_model_files(model, branch, links, sha256, output_folder)
155
+ progress(1.0)
156
+ else:
157
+ yield (f"Downloading files to {output_folder}")
158
+ downloader.download_model_files(model, branch, links, sha256, output_folder, progress_bar=progress, threads=1)
159
+ yield ("Done!")
160
+ except:
161
+ progress(1.0)
162
+ yield traceback.format_exc()
163
+
164
+
165
+ def create_model_menus():
166
+ # Finding the default values for the GPU and CPU memories
167
+ total_mem = []
168
+ for i in range(torch.cuda.device_count()):
169
+ total_mem.append(math.floor(torch.cuda.get_device_properties(i).total_memory / (1024 * 1024)))
170
+
171
+ default_gpu_mem = []
172
+ if shared.args.gpu_memory is not None and len(shared.args.gpu_memory) > 0:
173
+ for i in shared.args.gpu_memory:
174
+ if 'mib' in i.lower():
175
+ default_gpu_mem.append(int(re.sub('[a-zA-Z ]', '', i)))
176
+ else:
177
+ default_gpu_mem.append(int(re.sub('[a-zA-Z ]', '', i)) * 1000)
178
+ while len(default_gpu_mem) < len(total_mem):
179
+ default_gpu_mem.append(0)
180
+
181
+ total_cpu_mem = math.floor(psutil.virtual_memory().total / (1024 * 1024))
182
+ if shared.args.cpu_memory is not None:
183
+ default_cpu_mem = re.sub('[a-zA-Z ]', '', shared.args.cpu_memory)
184
+ else:
185
+ default_cpu_mem = 0
186
+
187
+ with gr.Row():
188
+ with gr.Column():
189
+ with gr.Row():
190
+ with gr.Column():
191
+ with gr.Row():
192
+ shared.gradio['model_menu'] = gr.Dropdown(choices=utils.get_available_models(), value=shared.model_name, label='Model', elem_classes='slim-dropdown')
193
+ ui.create_refresh_button(shared.gradio['model_menu'], lambda: None, lambda: {'choices': utils.get_available_models()}, 'refresh-button')
194
+ load = gr.Button("Load", visible=not shared.settings['autoload_model'], elem_classes='refresh-button')
195
+ unload = gr.Button("Unload", elem_classes='refresh-button')
196
+ reload = gr.Button("Reload", elem_classes='refresh-button')
197
+ save_settings = gr.Button("Save settings", elem_classes='refresh-button')
198
+
199
+ with gr.Column():
200
+ with gr.Row():
201
+ shared.gradio['lora_menu'] = gr.Dropdown(multiselect=True, choices=utils.get_available_loras(), value=shared.lora_names, label='LoRA(s)', elem_classes='slim-dropdown')
202
+ ui.create_refresh_button(shared.gradio['lora_menu'], lambda: None, lambda: {'choices': utils.get_available_loras(), 'value': shared.lora_names}, 'refresh-button')
203
+ shared.gradio['lora_menu_apply'] = gr.Button(value='Apply LoRAs', elem_classes='refresh-button')
204
+
205
+ with gr.Row():
206
+ with gr.Column():
207
+ shared.gradio['loader'] = gr.Dropdown(label="Model loader", choices=["Transformers", "ExLlama_HF", "ExLlama", "AutoGPTQ", "GPTQ-for-LLaMa", "llama.cpp", "llamacpp_HF"], value=None)
208
+ with gr.Box():
209
+ with gr.Row():
210
+ with gr.Column():
211
+ for i in range(len(total_mem)):
212
+ shared.gradio[f'gpu_memory_{i}'] = gr.Slider(label=f"gpu-memory in MiB for device :{i}", maximum=total_mem[i], value=default_gpu_mem[i])
213
+
214
+ shared.gradio['cpu_memory'] = gr.Slider(label="cpu-memory in MiB", maximum=total_cpu_mem, value=default_cpu_mem)
215
+ shared.gradio['transformers_info'] = gr.Markdown('load-in-4bit params:')
216
+ shared.gradio['compute_dtype'] = gr.Dropdown(label="compute_dtype", choices=["bfloat16", "float16", "float32"], value=shared.args.compute_dtype)
217
+ shared.gradio['quant_type'] = gr.Dropdown(label="quant_type", choices=["nf4", "fp4"], value=shared.args.quant_type)
218
+
219
+ shared.gradio['n_gpu_layers'] = gr.Slider(label="n-gpu-layers", minimum=0, maximum=128, value=shared.args.n_gpu_layers)
220
+ shared.gradio['n_ctx'] = gr.Slider(minimum=0, maximum=16384, step=256, label="n_ctx", value=shared.args.n_ctx)
221
+ shared.gradio['threads'] = gr.Slider(label="threads", minimum=0, step=1, maximum=32, value=shared.args.threads)
222
+ shared.gradio['n_batch'] = gr.Slider(label="n_batch", minimum=1, maximum=2048, value=shared.args.n_batch)
223
+ shared.gradio['n_gqa'] = gr.Slider(minimum=0, maximum=16, step=1, label="n_gqa", value=shared.args.n_gqa, info='grouped-query attention. Must be 8 for llama-2 70b.')
224
+ shared.gradio['rms_norm_eps'] = gr.Slider(minimum=0, maximum=1e-5, step=1e-6, label="rms_norm_eps", value=shared.args.n_gqa, info='5e-6 is a good value for llama-2 models.')
225
+
226
+ shared.gradio['wbits'] = gr.Dropdown(label="wbits", choices=["None", 1, 2, 3, 4, 8], value=str(shared.args.wbits) if shared.args.wbits > 0 else "None")
227
+ shared.gradio['groupsize'] = gr.Dropdown(label="groupsize", choices=["None", 32, 64, 128, 1024], value=str(shared.args.groupsize) if shared.args.groupsize > 0 else "None")
228
+ shared.gradio['model_type'] = gr.Dropdown(label="model_type", choices=["None", "llama", "opt", "gptj"], value=shared.args.model_type or "None")
229
+ shared.gradio['pre_layer'] = gr.Slider(label="pre_layer", minimum=0, maximum=100, value=shared.args.pre_layer[0] if shared.args.pre_layer is not None else 0)
230
+ shared.gradio['autogptq_info'] = gr.Markdown('* ExLlama_HF is recommended over AutoGPTQ for models derived from LLaMA.')
231
+ shared.gradio['gpu_split'] = gr.Textbox(label='gpu-split', info='Comma-separated list of VRAM (in GB) to use per GPU. Example: 20,7,7')
232
+ shared.gradio['max_seq_len'] = gr.Slider(label='max_seq_len', minimum=2048, maximum=16384, step=256, info='Maximum sequence length.', value=shared.args.max_seq_len)
233
+ shared.gradio['compress_pos_emb'] = gr.Slider(label='compress_pos_emb', minimum=1, maximum=8, step=1, info='Positional embeddings compression factor. Should typically be set to max_seq_len / 2048.', value=shared.args.compress_pos_emb)
234
+ shared.gradio['alpha_value'] = gr.Slider(label='alpha_value', minimum=1, maximum=32, step=1, info='Positional embeddings alpha factor for NTK RoPE scaling. Scaling is not identical to embedding compression. Use either this or compress_pos_emb, not both.', value=shared.args.alpha_value)
235
+
236
+ with gr.Column():
237
+ shared.gradio['triton'] = gr.Checkbox(label="triton", value=shared.args.triton)
238
+ shared.gradio['no_inject_fused_attention'] = gr.Checkbox(label="no_inject_fused_attention", value=shared.args.no_inject_fused_attention, info='Disable fused attention. Fused attention improves inference performance but uses more VRAM. Disable if running low on VRAM.')
239
+ shared.gradio['no_inject_fused_mlp'] = gr.Checkbox(label="no_inject_fused_mlp", value=shared.args.no_inject_fused_mlp, info='Affects Triton only. Disable fused MLP. Fused MLP improves performance but uses more VRAM. Disable if running low on VRAM.')
240
+ shared.gradio['no_use_cuda_fp16'] = gr.Checkbox(label="no_use_cuda_fp16", value=shared.args.no_use_cuda_fp16, info='This can make models faster on some systems.')
241
+ shared.gradio['desc_act'] = gr.Checkbox(label="desc_act", value=shared.args.desc_act, info='\'desc_act\', \'wbits\', and \'groupsize\' are used for old models without a quantize_config.json.')
242
+ shared.gradio['cpu'] = gr.Checkbox(label="cpu", value=shared.args.cpu)
243
+ shared.gradio['load_in_8bit'] = gr.Checkbox(label="load-in-8bit", value=shared.args.load_in_8bit)
244
+ shared.gradio['bf16'] = gr.Checkbox(label="bf16", value=shared.args.bf16)
245
+ shared.gradio['auto_devices'] = gr.Checkbox(label="auto-devices", value=shared.args.auto_devices)
246
+ shared.gradio['disk'] = gr.Checkbox(label="disk", value=shared.args.disk)
247
+ shared.gradio['load_in_4bit'] = gr.Checkbox(label="load-in-4bit", value=shared.args.load_in_4bit)
248
+ shared.gradio['use_double_quant'] = gr.Checkbox(label="use_double_quant", value=shared.args.use_double_quant)
249
+ shared.gradio['no_mmap'] = gr.Checkbox(label="no-mmap", value=shared.args.no_mmap)
250
+ shared.gradio['low_vram'] = gr.Checkbox(label="low-vram", value=shared.args.low_vram)
251
+ shared.gradio['mlock'] = gr.Checkbox(label="mlock", value=shared.args.mlock)
252
+ shared.gradio['llama_cpp_seed'] = gr.Number(label='Seed (0 for random)', value=shared.args.llama_cpp_seed)
253
+ shared.gradio['trust_remote_code'] = gr.Checkbox(label="trust-remote-code", value=shared.args.trust_remote_code, info='Make sure to inspect the .py files inside the model folder before loading it with this option enabled.')
254
+ shared.gradio['gptq_for_llama_info'] = gr.Markdown('GPTQ-for-LLaMa is currently 2x faster than AutoGPTQ on some systems. It is installed by default with the one-click installers. Otherwise, it has to be installed manually following the instructions here: [instructions](https://github.com/oobabooga/text-generation-webui/blob/main/docs/GPTQ-models-(4-bit-mode).md#installation-1).')
255
+ shared.gradio['exllama_info'] = gr.Markdown('For more information, consult the [docs](https://github.com/oobabooga/text-generation-webui/blob/main/docs/ExLlama.md).')
256
+ shared.gradio['exllama_HF_info'] = gr.Markdown('ExLlama_HF is a wrapper that lets you use ExLlama like a Transformers model, which means it can use the Transformers samplers. It\'s a bit slower than the regular ExLlama.')
257
+ shared.gradio['llamacpp_HF_info'] = gr.Markdown('llamacpp_HF is a wrapper that lets you use llama.cpp like a Transformers model, which means it can use the Transformers samplers. To use it, make sure to first download oobabooga/llama-tokenizer under "Download custom model or LoRA".')
258
+
259
+ with gr.Column():
260
+ with gr.Row():
261
+ shared.gradio['autoload_model'] = gr.Checkbox(value=shared.settings['autoload_model'], label='Autoload the model', info='Whether to load the model as soon as it is selected in the Model dropdown.')
262
+
263
+ shared.gradio['custom_model_menu'] = gr.Textbox(label="Download custom model or LoRA", info="Enter the Hugging Face username/model path, for instance: facebook/galactica-125m. To specify a branch, add it at the end after a \":\" character like this: facebook/galactica-125m:main")
264
+ shared.gradio['download_model_button'] = gr.Button("Download")
265
+
266
+ with gr.Row():
267
+ shared.gradio['model_status'] = gr.Markdown('No model is loaded' if shared.model_name == 'None' else 'Ready')
268
+
269
+ shared.gradio['loader'].change(loaders.make_loader_params_visible, gradio('loader'), gradio(loaders.get_all_params()))
270
+
271
+ # In this event handler, the interface state is read and updated
272
+ # with the model defaults (if any), and then the model is loaded
273
+ # unless "autoload_model" is unchecked
274
+ shared.gradio['model_menu'].change(
275
+ ui.gather_interface_values, gradio(shared.input_elements), gradio('interface_state')).then(
276
+ apply_model_settings_to_state, gradio('model_menu', 'interface_state'), gradio('interface_state')).then(
277
+ ui.apply_interface_values, gradio('interface_state'), gradio(ui.list_interface_input_elements()), show_progress=False).then(
278
+ update_model_parameters, gradio('interface_state'), None).then(
279
+ load_model_wrapper, gradio('model_menu', 'loader', 'autoload_model'), gradio('model_status'), show_progress=False)
280
+
281
+ load.click(
282
+ ui.gather_interface_values, gradio(shared.input_elements), gradio('interface_state')).then(
283
+ update_model_parameters, gradio('interface_state'), None).then(
284
+ partial(load_model_wrapper, autoload=True), gradio('model_menu', 'loader'), gradio('model_status'), show_progress=False)
285
+
286
+ unload.click(
287
+ unload_model, None, None).then(
288
+ lambda: "Model unloaded", None, gradio('model_status'))
289
+
290
+ reload.click(
291
+ unload_model, None, None).then(
292
+ ui.gather_interface_values, gradio(shared.input_elements), gradio('interface_state')).then(
293
+ update_model_parameters, gradio('interface_state'), None).then(
294
+ partial(load_model_wrapper, autoload=True), gradio('model_menu', 'loader'), gradio('model_status'), show_progress=False)
295
+
296
+ save_settings.click(
297
+ ui.gather_interface_values, gradio(shared.input_elements), gradio('interface_state')).then(
298
+ save_model_settings, gradio('model_menu', 'interface_state'), gradio('model_status'), show_progress=False)
299
+
300
+ shared.gradio['lora_menu_apply'].click(load_lora_wrapper, gradio('lora_menu'), gradio('model_status'), show_progress=False)
301
+ shared.gradio['download_model_button'].click(download_model_wrapper, gradio('custom_model_menu'), gradio('model_status'), show_progress=True)
302
+ shared.gradio['autoload_model'].change(lambda x: gr.update(visible=not x), gradio('autoload_model'), load)
303
+
304
+
305
+ def create_chat_settings_menus():
306
+ if not shared.is_chat():
307
+ return
308
+
309
+ with gr.Box():
310
+ gr.Markdown("Chat parameters")
311
+ with gr.Row():
312
+ with gr.Column():
313
+ shared.gradio['max_new_tokens'] = gr.Slider(minimum=shared.settings['max_new_tokens_min'], maximum=shared.settings['max_new_tokens_max'], step=1, label='max_new_tokens', value=shared.settings['max_new_tokens'])
314
+ shared.gradio['chat_generation_attempts'] = gr.Slider(minimum=shared.settings['chat_generation_attempts_min'], maximum=shared.settings['chat_generation_attempts_max'], value=shared.settings['chat_generation_attempts'], step=1, label='Generation attempts (for longer replies)', info='New generations will be called until either this number is reached or no new content is generated between two iterations.')
315
+
316
+ with gr.Column():
317
+ shared.gradio['stop_at_newline'] = gr.Checkbox(value=shared.settings['stop_at_newline'], label='Stop generating at new line character')
318
+
319
+
320
+ def create_settings_menus(default_preset):
321
+ generate_params = presets.load_preset(default_preset)
322
+ with gr.Row():
323
+ with gr.Column():
324
+ with gr.Row():
325
+ shared.gradio['preset_menu'] = gr.Dropdown(choices=utils.get_available_presets(), value=default_preset, label='Generation parameters preset', elem_classes='slim-dropdown')
326
+ ui.create_refresh_button(shared.gradio['preset_menu'], lambda: None, lambda: {'choices': utils.get_available_presets()}, 'refresh-button')
327
+ shared.gradio['save_preset'] = gr.Button('💾', elem_classes='refresh-button')
328
+ shared.gradio['delete_preset'] = gr.Button('🗑️', elem_classes='refresh-button')
329
+
330
+ with gr.Column():
331
+ filter_by_loader = gr.Dropdown(label="Filter by loader", choices=["All", "Transformers", "ExLlama_HF", "ExLlama", "AutoGPTQ", "GPTQ-for-LLaMa", "llama.cpp", "llamacpp_HF"], value="All", elem_classes='slim-dropdown')
332
+
333
+ with gr.Row():
334
+ with gr.Column():
335
+ with gr.Box():
336
+ with gr.Row():
337
+ with gr.Column():
338
+ shared.gradio['temperature'] = gr.Slider(0.01, 1.99, value=generate_params['temperature'], step=0.01, label='temperature')
339
+ shared.gradio['top_p'] = gr.Slider(0.0, 1.0, value=generate_params['top_p'], step=0.01, label='top_p')
340
+ shared.gradio['top_k'] = gr.Slider(0, 200, value=generate_params['top_k'], step=1, label='top_k')
341
+ shared.gradio['typical_p'] = gr.Slider(0.0, 1.0, value=generate_params['typical_p'], step=0.01, label='typical_p')
342
+ shared.gradio['epsilon_cutoff'] = gr.Slider(0, 9, value=generate_params['epsilon_cutoff'], step=0.01, label='epsilon_cutoff')
343
+ shared.gradio['eta_cutoff'] = gr.Slider(0, 20, value=generate_params['eta_cutoff'], step=0.01, label='eta_cutoff')
344
+ shared.gradio['tfs'] = gr.Slider(0.0, 1.0, value=generate_params['tfs'], step=0.01, label='tfs')
345
+ shared.gradio['top_a'] = gr.Slider(0.0, 1.0, value=generate_params['top_a'], step=0.01, label='top_a')
346
+
347
+ with gr.Column():
348
+ shared.gradio['repetition_penalty'] = gr.Slider(1.0, 1.5, value=generate_params['repetition_penalty'], step=0.01, label='repetition_penalty')
349
+ shared.gradio['repetition_penalty_range'] = gr.Slider(0, 4096, step=64, value=generate_params['repetition_penalty_range'], label='repetition_penalty_range')
350
+ shared.gradio['encoder_repetition_penalty'] = gr.Slider(0.8, 1.5, value=generate_params['encoder_repetition_penalty'], step=0.01, label='encoder_repetition_penalty')
351
+ shared.gradio['no_repeat_ngram_size'] = gr.Slider(0, 20, step=1, value=generate_params['no_repeat_ngram_size'], label='no_repeat_ngram_size')
352
+ shared.gradio['min_length'] = gr.Slider(0, 2000, step=1, value=generate_params['min_length'], label='min_length')
353
+ shared.gradio['seed'] = gr.Number(value=shared.settings['seed'], label='Seed (-1 for random)')
354
+ shared.gradio['do_sample'] = gr.Checkbox(value=generate_params['do_sample'], label='do_sample')
355
+
356
+ with gr.Accordion("Learn more", open=False):
357
+ gr.Markdown("""
358
+
359
+ For a technical description of the parameters, the [transformers documentation](https://huggingface.co/docs/transformers/main_classes/text_generation#transformers.GenerationConfig) is a good reference.
360
+
361
+ The best presets, according to the [Preset Arena](https://github.com/oobabooga/oobabooga.github.io/blob/main/arena/results.md) experiment, are:
362
+
363
+ * Instruction following:
364
+ 1) Divine Intellect
365
+ 2) Big O
366
+ 3) simple-1
367
+ 4) Space Alien
368
+ 5) StarChat
369
+ 6) Titanic
370
+ 7) tfs-with-top-a
371
+ 8) Asterism
372
+ 9) Contrastive Search
373
+
374
+ * Chat:
375
+ 1) Midnight Enigma
376
+ 2) Yara
377
+ 3) Shortwave
378
+
379
+ ### Temperature
380
+ Primary factor to control randomness of outputs. 0 = deterministic (only the most likely token is used). Higher value = more randomness.
381
+ ### top_p
382
+ If not set to 1, select tokens with probabilities adding up to less than this number. Higher value = higher range of possible random results.
383
+ ### top_k
384
+ Similar to top_p, but select instead only the top_k most likely tokens. Higher value = higher range of possible random results.
385
+ ### typical_p
386
+ If not set to 1, select only tokens that are at least this much more likely to appear than random tokens, given the prior text.
387
+ ### epsilon_cutoff
388
+ In units of 1e-4; a reasonable value is 3. This sets a probability floor below which tokens are excluded from being sampled. Should be used with top_p, top_k, and eta_cutoff set to 0.
389
+ ### eta_cutoff
390
+ In units of 1e-4; a reasonable value is 3. Should be used with top_p, top_k, and epsilon_cutoff set to 0.
391
+ ### repetition_penalty
392
+ Exponential penalty factor for repeating prior tokens. 1 means no penalty, higher value = less repetition, lower value = more repetition.
393
+ ### repetition_penalty_range
394
+ The number of most recent tokens to consider for repetition penalty. 0 makes all tokens be used.
395
+ ### encoder_repetition_penalty
396
+ Also known as the "Hallucinations filter". Used to penalize tokens that are *not* in the prior text. Higher value = more likely to stay in context, lower value = more likely to diverge.
397
+ ### no_repeat_ngram_size
398
+ If not set to 0, specifies the length of token sets that are completely blocked from repeating at all. Higher values = blocks larger phrases, lower values = blocks words or letters from repeating. Only 0 or high values are a good idea in most cases.
399
+ ### min_length
400
+ Minimum generation length in tokens.
401
+ ### penalty_alpha
402
+ Contrastive Search is enabled by setting this to greater than zero and unchecking "do_sample". It should be used with a low value of top_k, for instance, top_k = 4.
403
+
404
+ """, elem_classes="markdown")
405
+
406
+ with gr.Column():
407
+ create_chat_settings_menus()
408
+ with gr.Box():
409
+ with gr.Row():
410
+ with gr.Column():
411
+ shared.gradio['mirostat_mode'] = gr.Slider(0, 2, step=1, value=generate_params['mirostat_mode'], label='mirostat_mode', info='mode=1 is for llama.cpp only.')
412
+ shared.gradio['mirostat_tau'] = gr.Slider(0, 10, step=0.01, value=generate_params['mirostat_tau'], label='mirostat_tau')
413
+ shared.gradio['mirostat_eta'] = gr.Slider(0, 1, step=0.01, value=generate_params['mirostat_eta'], label='mirostat_eta')
414
+
415
+ with gr.Column():
416
+ shared.gradio['penalty_alpha'] = gr.Slider(0, 5, value=generate_params['penalty_alpha'], label='penalty_alpha', info='For Contrastive Search. do_sample must be unchecked.')
417
+
418
+ shared.gradio['num_beams'] = gr.Slider(1, 20, step=1, value=generate_params['num_beams'], label='num_beams', info='For Beam Search, along with length_penalty and early_stopping.')
419
+ shared.gradio['length_penalty'] = gr.Slider(-5, 5, value=generate_params['length_penalty'], label='length_penalty')
420
+ shared.gradio['early_stopping'] = gr.Checkbox(value=generate_params['early_stopping'], label='early_stopping')
421
+
422
+ with gr.Box():
423
+ with gr.Row():
424
+ with gr.Column():
425
+ shared.gradio['truncation_length'] = gr.Slider(value=shared.settings['truncation_length'], minimum=shared.settings['truncation_length_min'], maximum=shared.settings['truncation_length_max'], step=256, label='Truncate the prompt up to this length', info='The leftmost tokens are removed if the prompt exceeds this length. Most models require this to be at most 2048.')
426
+ shared.gradio['custom_stopping_strings'] = gr.Textbox(lines=1, value=shared.settings["custom_stopping_strings"] or None, label='Custom stopping strings', info='In addition to the defaults. Written between "" and separated by commas. For instance: "\\nYour Assistant:", "\\nThe assistant:"')
427
+ with gr.Column():
428
+ shared.gradio['ban_eos_token'] = gr.Checkbox(value=shared.settings['ban_eos_token'], label='Ban the eos_token', info='Forces the model to never end the generation prematurely.')
429
+ shared.gradio['add_bos_token'] = gr.Checkbox(value=shared.settings['add_bos_token'], label='Add the bos_token to the beginning of prompts', info='Disabling this can make the replies more creative.')
430
+
431
+ shared.gradio['skip_special_tokens'] = gr.Checkbox(value=shared.settings['skip_special_tokens'], label='Skip special tokens', info='Some specific models need this unset.')
432
+ shared.gradio['stream'] = gr.Checkbox(value=not shared.args.no_stream, label='Activate text streaming')
433
+
434
+ filter_by_loader.change(loaders.blacklist_samplers, filter_by_loader, gradio(loaders.list_all_samplers()), show_progress=False)
435
+ shared.gradio['preset_menu'].change(presets.load_preset_for_ui, gradio('preset_menu', 'interface_state'), gradio('interface_state', 'do_sample', 'temperature', 'top_p', 'typical_p', 'epsilon_cutoff', 'eta_cutoff', 'repetition_penalty', 'repetition_penalty_range', 'encoder_repetition_penalty', 'top_k', 'min_length', 'no_repeat_ngram_size', 'num_beams', 'penalty_alpha', 'length_penalty', 'early_stopping', 'mirostat_mode', 'mirostat_tau', 'mirostat_eta', 'tfs', 'top_a'))
436
+
437
+
438
+ def create_file_saving_menus():
439
+
440
+ # Text file saver
441
+ with gr.Box(visible=False, elem_classes='file-saver') as shared.gradio['file_saver']:
442
+ shared.gradio['save_filename'] = gr.Textbox(lines=1, label='File name')
443
+ shared.gradio['save_root'] = gr.Textbox(lines=1, label='File folder', info='For reference. Unchangeable.', interactive=False)
444
+ shared.gradio['save_contents'] = gr.Textbox(lines=10, label='File contents')
445
+ with gr.Row():
446
+ shared.gradio['save_confirm'] = gr.Button('Save', elem_classes="small-button")
447
+ shared.gradio['save_cancel'] = gr.Button('Cancel', elem_classes="small-button")
448
+
449
+ # Text file deleter
450
+ with gr.Box(visible=False, elem_classes='file-saver') as shared.gradio['file_deleter']:
451
+ shared.gradio['delete_filename'] = gr.Textbox(lines=1, label='File name')
452
+ shared.gradio['delete_root'] = gr.Textbox(lines=1, label='File folder', info='For reference. Unchangeable.', interactive=False)
453
+ with gr.Row():
454
+ shared.gradio['delete_confirm'] = gr.Button('Delete', elem_classes="small-button", variant='stop')
455
+ shared.gradio['delete_cancel'] = gr.Button('Cancel', elem_classes="small-button")
456
+
457
+ # Character saver/deleter
458
+ if shared.is_chat():
459
+ with gr.Box(visible=False, elem_classes='file-saver') as shared.gradio['character_saver']:
460
+ shared.gradio['save_character_filename'] = gr.Textbox(lines=1, label='File name', info='The character will be saved to your characters/ folder with this base filename.')
461
+ with gr.Row():
462
+ shared.gradio['save_character_confirm'] = gr.Button('Save', elem_classes="small-button")
463
+ shared.gradio['save_character_cancel'] = gr.Button('Cancel', elem_classes="small-button")
464
+
465
+ with gr.Box(visible=False, elem_classes='file-saver') as shared.gradio['character_deleter']:
466
+ gr.Markdown('Confirm the character deletion?')
467
+ with gr.Row():
468
+ shared.gradio['delete_character_confirm'] = gr.Button('Delete', elem_classes="small-button", variant='stop')
469
+ shared.gradio['delete_character_cancel'] = gr.Button('Cancel', elem_classes="small-button")
470
+
471
+
472
+ def create_file_saving_event_handlers():
473
+ shared.gradio['save_confirm'].click(
474
+ lambda x, y, z: utils.save_file(x + y, z), gradio('save_root', 'save_filename', 'save_contents'), None).then(
475
+ lambda: gr.update(visible=False), None, gradio('file_saver'))
476
+
477
+ shared.gradio['delete_confirm'].click(
478
+ lambda x, y: utils.delete_file(x + y), gradio('delete_root', 'delete_filename'), None).then(
479
+ lambda: gr.update(visible=False), None, gradio('file_deleter'))
480
+
481
+ shared.gradio['delete_cancel'].click(lambda: gr.update(visible=False), None, gradio('file_deleter'))
482
+ shared.gradio['save_cancel'].click(lambda: gr.update(visible=False), None, gradio('file_saver'))
483
+ if shared.is_chat():
484
+ shared.gradio['save_character_confirm'].click(
485
+ chat.save_character, gradio('name2', 'greeting', 'context', 'character_picture', 'save_character_filename'), None).then(
486
+ lambda: gr.update(visible=False), None, gradio('character_saver'))
487
+
488
+ shared.gradio['delete_character_confirm'].click(
489
+ chat.delete_character, gradio('character_menu'), None).then(
490
+ lambda: gr.update(visible=False), None, gradio('character_deleter')).then(
491
+ lambda: gr.update(choices=utils.get_available_characters()), None, gradio('character_menu'))
492
+
493
+ shared.gradio['save_character_cancel'].click(lambda: gr.update(visible=False), None, gradio('character_saver'))
494
+ shared.gradio['delete_character_cancel'].click(lambda: gr.update(visible=False), None, gradio('character_deleter'))
495
+
496
+ shared.gradio['save_preset'].click(
497
+ ui.gather_interface_values, gradio(shared.input_elements), gradio('interface_state')).then(
498
+ presets.generate_preset_yaml, gradio('interface_state'), gradio('save_contents')).then(
499
+ lambda: 'presets/', None, gradio('save_root')).then(
500
+ lambda: 'My Preset.yaml', None, gradio('save_filename')).then(
501
+ lambda: gr.update(visible=True), None, gradio('file_saver'))
502
+
503
+ shared.gradio['delete_preset'].click(
504
+ lambda x: f'{x}.yaml', gradio('preset_menu'), gradio('delete_filename')).then(
505
+ lambda: 'presets/', None, gradio('delete_root')).then(
506
+ lambda: gr.update(visible=True), None, gradio('file_deleter'))
507
+
508
+ if not shared.args.multi_user:
509
+
510
+ def load_session(session, state):
511
+ with open(Path(f'logs/{session}.json'), 'r') as f:
512
+ state.update(json.loads(f.read()))
513
+
514
+ if shared.is_chat():
515
+ chat.save_persistent_history(state['history'], state['character_menu'], state['mode'])
516
+
517
+ return state
518
+
519
+ if shared.is_chat():
520
+ shared.gradio['save_session'].click(
521
+ ui.gather_interface_values, gradio(shared.input_elements), gradio('interface_state')).then(
522
+ lambda x: json.dumps(x, indent=4), gradio('interface_state'), gradio('save_contents')).then(
523
+ lambda: 'logs/', None, gradio('save_root')).then(
524
+ lambda x: f'session_{shared.get_mode()}_{x + "_" if x not in ["None", None, ""] else ""}{utils.current_time()}.json', gradio('character_menu'), gradio('save_filename')).then(
525
+ lambda: gr.update(visible=True), None, gradio('file_saver'))
526
+
527
+ shared.gradio['session_menu'].change(
528
+ load_session, gradio('session_menu', 'interface_state'), gradio('interface_state')).then(
529
+ ui.apply_interface_values, gradio('interface_state'), gradio(ui.list_interface_input_elements()), show_progress=False).then(
530
+ chat.redraw_html, shared.reload_inputs, gradio('display'))
531
+
532
+ else:
533
+ shared.gradio['save_session'].click(
534
+ ui.gather_interface_values, gradio(shared.input_elements), gradio('interface_state')).then(
535
+ lambda x: json.dumps(x, indent=4), gradio('interface_state'), gradio('save_contents')).then(
536
+ lambda: 'logs/', None, gradio('save_root')).then(
537
+ lambda: f'session_{shared.get_mode()}_{utils.current_time()}.json', None, gradio('save_filename')).then(
538
+ lambda: gr.update(visible=True), None, gradio('file_saver'))
539
+
540
+ shared.gradio['session_menu'].change(
541
+ load_session, gradio('session_menu', 'interface_state'), gradio('interface_state')).then(
542
+ ui.apply_interface_values, gradio('interface_state'), gradio(ui.list_interface_input_elements()), show_progress=False)
543
+
544
+ shared.gradio['delete_session'].click(
545
+ lambda x: f'{x}.json', gradio('session_menu'), gradio('delete_filename')).then(
546
+ lambda: 'logs/', None, gradio('delete_root')).then(
547
+ lambda: gr.update(visible=True), None, gradio('file_deleter'))
548
+
549
+
550
+ def set_interface_arguments(interface_mode, extensions, bool_active):
551
+ modes = ["default", "notebook", "chat", "cai_chat"]
552
+ cmd_list = vars(shared.args)
553
+ bool_list = [k for k in cmd_list if type(cmd_list[k]) is bool and k not in modes]
554
+
555
+ shared.args.extensions = extensions
556
+ for k in modes[1:]:
557
+ setattr(shared.args, k, False)
558
+ if interface_mode != "default":
559
+ setattr(shared.args, interface_mode, True)
560
+
561
+ for k in bool_list:
562
+ setattr(shared.args, k, False)
563
+ for k in bool_active:
564
+ setattr(shared.args, k, True)
565
+
566
+ shared.need_restart = True
567
+
568
+
569
+ def create_interface():
570
+
571
+ # Defining some variables
572
+ gen_events = []
573
+ default_preset = shared.settings['preset']
574
+ default_text = load_prompt(shared.settings['prompt'])
575
+ title = 'Text generation web UI'
576
+
577
+ # Authentication variables
578
+ auth = None
579
+ gradio_auth_creds = []
580
+ if shared.args.gradio_auth:
581
+ gradio_auth_creds += [x.strip() for x in shared.args.gradio_auth.strip('"').replace('\n', '').split(',') if x.strip()]
582
+ if shared.args.gradio_auth_path is not None:
583
+ with open(shared.args.gradio_auth_path, 'r', encoding="utf8") as file:
584
+ for line in file.readlines():
585
+ gradio_auth_creds += [x.strip() for x in line.split(',') if x.strip()]
586
+ if gradio_auth_creds:
587
+ auth = [tuple(cred.split(':')) for cred in gradio_auth_creds]
588
+
589
+ # Importing the extension files and executing their setup() functions
590
+ if shared.args.extensions is not None and len(shared.args.extensions) > 0:
591
+ extensions_module.load_extensions()
592
+
593
+ # Forcing some events to be triggered on page load
594
+ shared.persistent_interface_state.update({
595
+ 'loader': shared.args.loader or 'Transformers',
596
+ })
597
+
598
+ if shared.is_chat():
599
+ shared.persistent_interface_state.update({
600
+ 'mode': shared.settings['mode'],
601
+ 'character_menu': shared.args.character or shared.settings['character'],
602
+ 'instruction_template': shared.settings['instruction_template']
603
+ })
604
+
605
+ if Path("cache/pfp_character.png").exists():
606
+ Path("cache/pfp_character.png").unlink()
607
+
608
+ # css/js strings
609
+ css = ui.css if not shared.is_chat() else ui.css + ui.chat_css
610
+ js = ui.main_js if not shared.is_chat() else ui.main_js + ui.chat_js
611
+ css += apply_extensions('css')
612
+ js += apply_extensions('js')
613
+
614
+ with gr.Blocks(css=css, analytics_enabled=False, title=title, theme=ui.theme) as shared.gradio['interface']:
615
+ if Path("notification.mp3").exists():
616
+ shared.gradio['audio_notification'] = gr.Audio(interactive=False, value="notification.mp3", elem_id="audio_notification", visible=False)
617
+ audio_notification_js = "document.querySelector('#audio_notification audio')?.play();"
618
+ else:
619
+ audio_notification_js = ""
620
+
621
+ # Floating menus for saving/deleting files
622
+ create_file_saving_menus()
623
+
624
+ # Create chat mode interface
625
+ if shared.is_chat():
626
+ shared.input_elements = ui.list_interface_input_elements()
627
+
628
+ shared.gradio.update({
629
+ 'interface_state': gr.State({k: None for k in shared.input_elements}),
630
+ 'Chat input': gr.State(),
631
+ 'dummy': gr.State(),
632
+ 'history': gr.State({'internal': [], 'visible': []}),
633
+ })
634
+
635
+ with gr.Tab('Text generation', elem_id='main'):
636
+ shared.gradio['display'] = gr.HTML(value=chat_html_wrapper({'internal': [], 'visible': []}, shared.settings['name1'], shared.settings['name2'], 'chat', 'cai-chat'))
637
+ shared.gradio['textbox'] = gr.Textbox(label='Input')
638
+ with gr.Row():
639
+ shared.gradio['Stop'] = gr.Button('Stop', elem_id='stop')
640
+ shared.gradio['Generate'] = gr.Button('Generate', elem_id='Generate', variant='primary')
641
+ shared.gradio['Continue'] = gr.Button('Continue')
642
+
643
+ with gr.Row():
644
+ shared.gradio['Impersonate'] = gr.Button('Impersonate')
645
+ shared.gradio['Regenerate'] = gr.Button('Regenerate')
646
+ shared.gradio['Remove last'] = gr.Button('Remove last')
647
+
648
+ with gr.Row():
649
+ shared.gradio['Copy last reply'] = gr.Button('Copy last reply')
650
+ shared.gradio['Replace last reply'] = gr.Button('Replace last reply')
651
+ shared.gradio['Send dummy message'] = gr.Button('Send dummy message')
652
+ shared.gradio['Send dummy reply'] = gr.Button('Send dummy reply')
653
+
654
+ with gr.Row():
655
+ shared.gradio['Clear history'] = gr.Button('Clear history')
656
+ shared.gradio['Clear history-confirm'] = gr.Button('Confirm', variant='stop', visible=False)
657
+ shared.gradio['Clear history-cancel'] = gr.Button('Cancel', visible=False)
658
+
659
+ with gr.Row():
660
+ shared.gradio['start_with'] = gr.Textbox(label='Start reply with', placeholder='Sure thing!', value=shared.settings['start_with'])
661
+
662
+ with gr.Row():
663
+ shared.gradio['mode'] = gr.Radio(choices=['chat', 'chat-instruct', 'instruct'], value=shared.settings['mode'] if shared.settings['mode'] in ['chat', 'instruct', 'chat-instruct'] else 'chat', label='Mode', info='Defines how the chat prompt is generated. In instruct and chat-instruct modes, the instruction template selected under "Chat settings" must match the current model.')
664
+ shared.gradio['chat_style'] = gr.Dropdown(choices=utils.get_available_chat_styles(), label='Chat style', value=shared.settings['chat_style'], visible=shared.settings['mode'] != 'instruct')
665
+
666
+ with gr.Tab('Chat settings', elem_id='chat-settings'):
667
+
668
+ with gr.Tab("Character"):
669
+ with gr.Row():
670
+ with gr.Column(scale=8):
671
+ with gr.Row():
672
+ shared.gradio['character_menu'] = gr.Dropdown(value='None', choices=utils.get_available_characters(), label='Character', elem_id='character-menu', info='Used in chat and chat-instruct modes.', elem_classes='slim-dropdown')
673
+ ui.create_refresh_button(shared.gradio['character_menu'], lambda: None, lambda: {'choices': utils.get_available_characters()}, 'refresh-button')
674
+ shared.gradio['save_character'] = gr.Button('💾', elem_classes='refresh-button')
675
+ shared.gradio['delete_character'] = gr.Button('🗑️', elem_classes='refresh-button')
676
+
677
+ shared.gradio['name1'] = gr.Textbox(value=shared.settings['name1'], lines=1, label='Your name')
678
+ shared.gradio['name2'] = gr.Textbox(value=shared.settings['name2'], lines=1, label='Character\'s name')
679
+ shared.gradio['context'] = gr.Textbox(value=shared.settings['context'], lines=4, label='Context')
680
+ shared.gradio['greeting'] = gr.Textbox(value=shared.settings['greeting'], lines=4, label='Greeting')
681
+
682
+ with gr.Column(scale=1):
683
+ shared.gradio['character_picture'] = gr.Image(label='Character picture', type='pil')
684
+ shared.gradio['your_picture'] = gr.Image(label='Your picture', type='pil', value=Image.open(Path('cache/pfp_me.png')) if Path('cache/pfp_me.png').exists() else None)
685
+
686
+ with gr.Tab("Instruction template"):
687
+ with gr.Row():
688
+ with gr.Row():
689
+ shared.gradio['instruction_template'] = gr.Dropdown(choices=utils.get_available_instruction_templates(), label='Instruction template', value='None', info='Change this according to the model/LoRA that you are using. Used in instruct and chat-instruct modes.', elem_classes='slim-dropdown')
690
+ ui.create_refresh_button(shared.gradio['instruction_template'], lambda: None, lambda: {'choices': utils.get_available_instruction_templates()}, 'refresh-button')
691
+ shared.gradio['save_template'] = gr.Button('💾', elem_classes='refresh-button')
692
+ shared.gradio['delete_template'] = gr.Button('🗑️ ', elem_classes='refresh-button')
693
+
694
+ shared.gradio['name1_instruct'] = gr.Textbox(value='', lines=2, label='User string')
695
+ shared.gradio['name2_instruct'] = gr.Textbox(value='', lines=1, label='Bot string')
696
+ shared.gradio['context_instruct'] = gr.Textbox(value='', lines=4, label='Context')
697
+ shared.gradio['turn_template'] = gr.Textbox(value=shared.settings['turn_template'], lines=1, label='Turn template', info='Used to precisely define the placement of spaces and new line characters in instruction prompts.')
698
+ with gr.Row():
699
+ shared.gradio['chat-instruct_command'] = gr.Textbox(value=shared.settings['chat-instruct_command'], lines=4, label='Command for chat-instruct mode', info='<|character|> gets replaced by the bot name, and <|prompt|> gets replaced by the regular chat prompt.')
700
+
701
+ with gr.Tab('Chat history'):
702
+ with gr.Row():
703
+ with gr.Column():
704
+ shared.gradio['download'] = gr.File(label="Download")
705
+ shared.gradio['download_button'] = gr.Button(value='Refresh')
706
+
707
+ with gr.Column():
708
+ shared.gradio['upload_chat_history'] = gr.File(type='binary', file_types=['.json', '.txt'], label="Upload")
709
+
710
+ with gr.Tab('Upload character'):
711
+ with gr.Tab('YAML or JSON'):
712
+ with gr.Row():
713
+ shared.gradio['upload_json'] = gr.File(type='binary', file_types=['.json', '.yaml'], label='JSON or YAML File')
714
+ shared.gradio['upload_img_bot'] = gr.Image(type='pil', label='Profile Picture (optional)')
715
+
716
+ shared.gradio['Submit character'] = gr.Button(value='Submit', interactive=False)
717
+
718
+ with gr.Tab('TavernAI PNG'):
719
+ with gr.Row():
720
+ with gr.Column():
721
+ shared.gradio['upload_img_tavern'] = gr.Image(type='pil', label='TavernAI PNG File', elem_id="upload_img_tavern")
722
+ shared.gradio['tavern_json'] = gr.State()
723
+ with gr.Column():
724
+ shared.gradio['tavern_name'] = gr.Textbox(value='', lines=1, label='Name', interactive=False)
725
+ shared.gradio['tavern_desc'] = gr.Textbox(value='', lines=4, max_lines=4, label='Description', interactive=False)
726
+
727
+ shared.gradio['Submit tavern character'] = gr.Button(value='Submit', interactive=False)
728
+
729
+ with gr.Tab("Parameters", elem_id="parameters"):
730
+ create_settings_menus(default_preset)
731
+
732
+ # Create notebook mode interface
733
+ elif shared.args.notebook:
734
+ shared.input_elements = ui.list_interface_input_elements()
735
+ shared.gradio['interface_state'] = gr.State({k: None for k in shared.input_elements})
736
+ shared.gradio['last_input'] = gr.State('')
737
+ with gr.Tab("Text generation", elem_id="main"):
738
+ with gr.Row():
739
+ with gr.Column(scale=4):
740
+ with gr.Tab('Raw'):
741
+ shared.gradio['textbox'] = gr.Textbox(value=default_text, elem_classes="textbox", lines=27)
742
+
743
+ with gr.Tab('Markdown'):
744
+ shared.gradio['markdown_render'] = gr.Button('Render')
745
+ shared.gradio['markdown'] = gr.Markdown()
746
+
747
+ with gr.Tab('HTML'):
748
+ shared.gradio['html'] = gr.HTML()
749
+
750
+ with gr.Row():
751
+ shared.gradio['Generate'] = gr.Button('Generate', variant='primary', elem_classes="small-button")
752
+ shared.gradio['Stop'] = gr.Button('Stop', elem_classes="small-button")
753
+ shared.gradio['Undo'] = gr.Button('Undo', elem_classes="small-button")
754
+ shared.gradio['Regenerate'] = gr.Button('Regenerate', elem_classes="small-button")
755
+
756
+ with gr.Column(scale=1):
757
+ gr.HTML('<div style="padding-bottom: 13px"></div>')
758
+ shared.gradio['max_new_tokens'] = gr.Slider(minimum=shared.settings['max_new_tokens_min'], maximum=shared.settings['max_new_tokens_max'], step=1, label='max_new_tokens', value=shared.settings['max_new_tokens'])
759
+ with gr.Row():
760
+ shared.gradio['prompt_menu'] = gr.Dropdown(choices=utils.get_available_prompts(), value='None', label='Prompt', elem_classes='slim-dropdown')
761
+ ui.create_refresh_button(shared.gradio['prompt_menu'], lambda: None, lambda: {'choices': utils.get_available_prompts()}, ['refresh-button', 'refresh-button-small'])
762
+ shared.gradio['save_prompt'] = gr.Button('💾', elem_classes=['refresh-button', 'refresh-button-small'])
763
+ shared.gradio['delete_prompt'] = gr.Button('🗑️', elem_classes=['refresh-button', 'refresh-button-small'])
764
+
765
+ shared.gradio['count_tokens'] = gr.Button('Count tokens')
766
+ shared.gradio['status'] = gr.Markdown('')
767
+
768
+ with gr.Tab("Parameters", elem_id="parameters"):
769
+ create_settings_menus(default_preset)
770
+
771
+ # Create default mode interface
772
+ else:
773
+ shared.input_elements = ui.list_interface_input_elements()
774
+ shared.gradio['interface_state'] = gr.State({k: None for k in shared.input_elements})
775
+ shared.gradio['last_input'] = gr.State('')
776
+ with gr.Tab("Text generation", elem_id="main"):
777
+ with gr.Row():
778
+ with gr.Column():
779
+ shared.gradio['textbox'] = gr.Textbox(value=default_text, elem_classes="textbox_default", lines=27, label='Input')
780
+ shared.gradio['max_new_tokens'] = gr.Slider(minimum=shared.settings['max_new_tokens_min'], maximum=shared.settings['max_new_tokens_max'], step=1, label='max_new_tokens', value=shared.settings['max_new_tokens'])
781
+ with gr.Row():
782
+ shared.gradio['Generate'] = gr.Button('Generate', variant='primary')
783
+ shared.gradio['Stop'] = gr.Button('Stop')
784
+ shared.gradio['Continue'] = gr.Button('Continue')
785
+ shared.gradio['count_tokens'] = gr.Button('Count tokens')
786
+
787
+ with gr.Row():
788
+ shared.gradio['prompt_menu'] = gr.Dropdown(choices=utils.get_available_prompts(), value='None', label='Prompt', elem_classes='slim-dropdown')
789
+ ui.create_refresh_button(shared.gradio['prompt_menu'], lambda: None, lambda: {'choices': utils.get_available_prompts()}, 'refresh-button')
790
+ shared.gradio['save_prompt'] = gr.Button('💾', elem_classes='refresh-button')
791
+ shared.gradio['delete_prompt'] = gr.Button('🗑️', elem_classes='refresh-button')
792
+
793
+ shared.gradio['status'] = gr.Markdown('')
794
+
795
+ with gr.Column():
796
+ with gr.Tab('Raw'):
797
+ shared.gradio['output_textbox'] = gr.Textbox(elem_classes="textbox_default_output", lines=27, label='Output')
798
+
799
+ with gr.Tab('Markdown'):
800
+ shared.gradio['markdown_render'] = gr.Button('Render')
801
+ shared.gradio['markdown'] = gr.Markdown()
802
+
803
+ with gr.Tab('HTML'):
804
+ shared.gradio['html'] = gr.HTML()
805
+
806
+ with gr.Tab("Parameters", elem_id="parameters"):
807
+ create_settings_menus(default_preset)
808
+
809
+ # Model tab
810
+ with gr.Tab("Model", elem_id="model-tab"):
811
+ create_model_menus()
812
+
813
+ # Training tab
814
+ with gr.Tab("Training", elem_id="training-tab"):
815
+ training.create_train_interface()
816
+
817
+ # Session tab
818
+ with gr.Tab("Session", elem_id="session-tab"):
819
+ modes = ["default", "notebook", "chat"]
820
+ current_mode = "default"
821
+ for mode in modes[1:]:
822
+ if getattr(shared.args, mode):
823
+ current_mode = mode
824
+ break
825
+
826
+ cmd_list = vars(shared.args)
827
+ bool_list = sorted([k for k in cmd_list if type(cmd_list[k]) is bool and k not in modes + ui.list_model_elements()])
828
+ bool_active = [k for k in bool_list if vars(shared.args)[k]]
829
+
830
+ with gr.Row():
831
+
832
+ with gr.Column():
833
+ with gr.Row():
834
+ shared.gradio['interface_modes_menu'] = gr.Dropdown(choices=modes, value=current_mode, label="Mode", elem_classes='slim-dropdown')
835
+ shared.gradio['reset_interface'] = gr.Button("Apply and restart", elem_classes="small-button", variant="primary")
836
+ shared.gradio['toggle_dark_mode'] = gr.Button('Toggle 💡', elem_classes="small-button")
837
+
838
+ with gr.Row():
839
+ with gr.Column():
840
+ shared.gradio['extensions_menu'] = gr.CheckboxGroup(choices=utils.get_available_extensions(), value=shared.args.extensions, label="Available extensions", info='Note that some of these extensions may require manually installing Python requirements through the command: pip install -r extensions/extension_name/requirements.txt', elem_classes='checkboxgroup-table')
841
+
842
+ with gr.Column():
843
+ shared.gradio['bool_menu'] = gr.CheckboxGroup(choices=bool_list, value=bool_active, label="Boolean command-line flags", elem_classes='checkboxgroup-table')
844
+
845
+ with gr.Column():
846
+ if not shared.args.multi_user:
847
+ with gr.Row():
848
+ shared.gradio['session_menu'] = gr.Dropdown(choices=utils.get_available_sessions(), value='None', label='Session', elem_classes='slim-dropdown', info='When saving a session, make sure to keep the initial part of the filename (session_chat, session_notebook, or session_default), otherwise it will not appear on this list afterwards.')
849
+ ui.create_refresh_button(shared.gradio['session_menu'], lambda: None, lambda: {'choices': utils.get_available_sessions()}, ['refresh-button'])
850
+ shared.gradio['save_session'] = gr.Button('💾', elem_classes=['refresh-button'])
851
+ shared.gradio['delete_session'] = gr.Button('🗑️', elem_classes=['refresh-button'])
852
+
853
+ extension_name = gr.Textbox(lines=1, label='Install or update an extension', info='Enter the GitHub URL below and press Enter. For a list of extensions, see: https://github.com/oobabooga/text-generation-webui-extensions ⚠️ WARNING ⚠️ : extensions can execute arbitrary code. Make sure to inspect their source code before activating them.')
854
+ extension_status = gr.Markdown()
855
+
856
+ extension_name.submit(
857
+ clone_or_pull_repository, extension_name, extension_status, show_progress=False).then(
858
+ lambda: gr.update(choices=utils.get_available_extensions(), value=shared.args.extensions), None, gradio('extensions_menu'))
859
+
860
+ # Reset interface event
861
+ shared.gradio['reset_interface'].click(
862
+ set_interface_arguments, gradio('interface_modes_menu', 'extensions_menu', 'bool_menu'), None).then(
863
+ lambda: None, None, None, _js='() => {document.body.innerHTML=\'<h1 style="font-family:monospace;padding-top:20%;margin:0;height:100vh;color:lightgray;text-align:center;background:var(--body-background-fill)">Reloading...</h1>\'; setTimeout(function(){location.reload()},2500); return []}')
864
+
865
+ shared.gradio['toggle_dark_mode'].click(lambda: None, None, None, _js='() => {document.getElementsByTagName("body")[0].classList.toggle("dark")}')
866
+
867
+ # chat mode event handlers
868
+ if shared.is_chat():
869
+ shared.input_params = gradio('Chat input', 'start_with', 'interface_state')
870
+ clear_arr = gradio('Clear history-confirm', 'Clear history', 'Clear history-cancel')
871
+ shared.reload_inputs = gradio('history', 'name1', 'name2', 'mode', 'chat_style')
872
+
873
+ gen_events.append(shared.gradio['Generate'].click(
874
+ ui.gather_interface_values, gradio(shared.input_elements), gradio('interface_state')).then(
875
+ lambda x: (x, ''), gradio('textbox'), gradio('Chat input', 'textbox'), show_progress=False).then(
876
+ chat.generate_chat_reply_wrapper, shared.input_params, gradio('display', 'history'), show_progress=False).then(
877
+ ui.gather_interface_values, gradio(shared.input_elements), gradio('interface_state')).then(
878
+ chat.save_persistent_history, gradio('history', 'character_menu', 'mode'), None).then(
879
+ lambda: None, None, None, _js=f"() => {{{audio_notification_js}}}")
880
+ )
881
+
882
+ gen_events.append(shared.gradio['textbox'].submit(
883
+ ui.gather_interface_values, gradio(shared.input_elements), gradio('interface_state')).then(
884
+ lambda x: (x, ''), gradio('textbox'), gradio('Chat input', 'textbox'), show_progress=False).then(
885
+ chat.generate_chat_reply_wrapper, shared.input_params, gradio('display', 'history'), show_progress=False).then(
886
+ ui.gather_interface_values, gradio(shared.input_elements), gradio('interface_state')).then(
887
+ chat.save_persistent_history, gradio('history', 'character_menu', 'mode'), None).then(
888
+ lambda: None, None, None, _js=f"() => {{{audio_notification_js}}}")
889
+ )
890
+
891
+ gen_events.append(shared.gradio['Regenerate'].click(
892
+ ui.gather_interface_values, gradio(shared.input_elements), gradio('interface_state')).then(
893
+ partial(chat.generate_chat_reply_wrapper, regenerate=True), shared.input_params, gradio('display', 'history'), show_progress=False).then(
894
+ ui.gather_interface_values, gradio(shared.input_elements), gradio('interface_state')).then(
895
+ chat.save_persistent_history, gradio('history', 'character_menu', 'mode'), None).then(
896
+ lambda: None, None, None, _js=f"() => {{{audio_notification_js}}}")
897
+ )
898
+
899
+ gen_events.append(shared.gradio['Continue'].click(
900
+ ui.gather_interface_values, gradio(shared.input_elements), gradio('interface_state')).then(
901
+ partial(chat.generate_chat_reply_wrapper, _continue=True), shared.input_params, gradio('display', 'history'), show_progress=False).then(
902
+ ui.gather_interface_values, gradio(shared.input_elements), gradio('interface_state')).then(
903
+ chat.save_persistent_history, gradio('history', 'character_menu', 'mode'), None).then(
904
+ lambda: None, None, None, _js=f"() => {{{audio_notification_js}}}")
905
+ )
906
+
907
+ gen_events.append(shared.gradio['Impersonate'].click(
908
+ ui.gather_interface_values, gradio(shared.input_elements), gradio('interface_state')).then(
909
+ lambda x: x, gradio('textbox'), gradio('Chat input'), show_progress=False).then(
910
+ chat.impersonate_wrapper, shared.input_params, gradio('textbox'), show_progress=False).then(
911
+ ui.gather_interface_values, gradio(shared.input_elements), gradio('interface_state')).then(
912
+ lambda: None, None, None, _js=f"() => {{{audio_notification_js}}}")
913
+ )
914
+
915
+ shared.gradio['Replace last reply'].click(
916
+ ui.gather_interface_values, gradio(shared.input_elements), gradio('interface_state')).then(
917
+ chat.replace_last_reply, gradio('textbox', 'interface_state'), gradio('history')).then(
918
+ lambda: '', None, gradio('textbox'), show_progress=False).then(
919
+ chat.redraw_html, shared.reload_inputs, gradio('display')).then(
920
+ chat.save_persistent_history, gradio('history', 'character_menu', 'mode'), None)
921
+
922
+ shared.gradio['Send dummy message'].click(
923
+ ui.gather_interface_values, gradio(shared.input_elements), gradio('interface_state')).then(
924
+ chat.send_dummy_message, gradio('textbox', 'interface_state'), gradio('history')).then(
925
+ lambda: '', None, gradio('textbox'), show_progress=False).then(
926
+ chat.redraw_html, shared.reload_inputs, gradio('display')).then(
927
+ chat.save_persistent_history, gradio('history', 'character_menu', 'mode'), None)
928
+
929
+ shared.gradio['Send dummy reply'].click(
930
+ ui.gather_interface_values, gradio(shared.input_elements), gradio('interface_state')).then(
931
+ chat.send_dummy_reply, gradio('textbox', 'interface_state'), gradio('history')).then(
932
+ lambda: '', None, gradio('textbox'), show_progress=False).then(
933
+ chat.redraw_html, shared.reload_inputs, gradio('display')).then(
934
+ chat.save_persistent_history, gradio('history', 'character_menu', 'mode'), None)
935
+
936
+ shared.gradio['Clear history'].click(lambda: [gr.update(visible=True), gr.update(visible=False), gr.update(visible=True)], None, clear_arr)
937
+ shared.gradio['Clear history-cancel'].click(lambda: [gr.update(visible=False), gr.update(visible=True), gr.update(visible=False)], None, clear_arr)
938
+ shared.gradio['Clear history-confirm'].click(
939
+ ui.gather_interface_values, gradio(shared.input_elements), gradio('interface_state')).then(
940
+ lambda: [gr.update(visible=False), gr.update(visible=True), gr.update(visible=False)], None, clear_arr).then(
941
+ chat.clear_chat_log, gradio('interface_state'), gradio('history')).then(
942
+ chat.redraw_html, shared.reload_inputs, gradio('display')).then(
943
+ chat.save_persistent_history, gradio('history', 'character_menu', 'mode'), None)
944
+
945
+ shared.gradio['Remove last'].click(
946
+ ui.gather_interface_values, gradio(shared.input_elements), gradio('interface_state')).then(
947
+ chat.remove_last_message, gradio('history'), gradio('textbox', 'history'), show_progress=False).then(
948
+ chat.redraw_html, shared.reload_inputs, gradio('display')).then(
949
+ chat.save_persistent_history, gradio('history', 'character_menu', 'mode'), None)
950
+
951
+ shared.gradio['character_menu'].change(
952
+ partial(chat.load_character, instruct=False), gradio('character_menu', 'name1', 'name2'), gradio('name1', 'name2', 'character_picture', 'greeting', 'context', 'dummy')).then(
953
+ ui.gather_interface_values, gradio(shared.input_elements), gradio('interface_state')).then(
954
+ chat.load_persistent_history, gradio('interface_state'), gradio('history')).then(
955
+ chat.redraw_html, shared.reload_inputs, gradio('display'))
956
+
957
+ shared.gradio['Stop'].click(
958
+ stop_everything_event, None, None, queue=False, cancels=gen_events if shared.args.no_stream else None).then(
959
+ chat.redraw_html, shared.reload_inputs, gradio('display'))
960
+
961
+ shared.gradio['mode'].change(
962
+ lambda x: gr.update(visible=x != 'instruct'), gradio('mode'), gradio('chat_style'), show_progress=False).then(
963
+ chat.redraw_html, shared.reload_inputs, gradio('display'))
964
+
965
+ shared.gradio['chat_style'].change(chat.redraw_html, shared.reload_inputs, gradio('display'))
966
+ shared.gradio['instruction_template'].change(
967
+ partial(chat.load_character, instruct=True), gradio('instruction_template', 'name1_instruct', 'name2_instruct'), gradio('name1_instruct', 'name2_instruct', 'dummy', 'dummy', 'context_instruct', 'turn_template'))
968
+
969
+ shared.gradio['upload_chat_history'].upload(
970
+ chat.load_history, gradio('upload_chat_history', 'history'), gradio('history')).then(
971
+ chat.redraw_html, shared.reload_inputs, gradio('display'))
972
+
973
+ shared.gradio['Copy last reply'].click(chat.send_last_reply_to_input, gradio('history'), gradio('textbox'), show_progress=False)
974
+
975
+ # Save/delete a character
976
+ shared.gradio['save_character'].click(
977
+ lambda x: x, gradio('name2'), gradio('save_character_filename')).then(
978
+ lambda: gr.update(visible=True), None, gradio('character_saver'))
979
+
980
+ shared.gradio['delete_character'].click(lambda: gr.update(visible=True), None, gradio('character_deleter'))
981
+
982
+ shared.gradio['save_template'].click(
983
+ lambda: 'My Template.yaml', None, gradio('save_filename')).then(
984
+ lambda: 'characters/instruction-following/', None, gradio('save_root')).then(
985
+ chat.generate_instruction_template_yaml, gradio('name1_instruct', 'name2_instruct', 'context_instruct', 'turn_template'), gradio('save_contents')).then(
986
+ lambda: gr.update(visible=True), None, gradio('file_saver'))
987
+
988
+ shared.gradio['delete_template'].click(
989
+ lambda x: f'{x}.yaml', gradio('instruction_template'), gradio('delete_filename')).then(
990
+ lambda: 'characters/instruction-following/', None, gradio('delete_root')).then(
991
+ lambda: gr.update(visible=True), None, gradio('file_deleter'))
992
+
993
+ shared.gradio['download_button'].click(chat.save_history_at_user_request, gradio('history', 'character_menu', 'mode'), gradio('download'))
994
+ shared.gradio['Submit character'].click(chat.upload_character, gradio('upload_json', 'upload_img_bot'), gradio('character_menu'))
995
+ shared.gradio['upload_json'].upload(lambda: gr.update(interactive=True), None, gradio('Submit character'))
996
+ shared.gradio['upload_json'].clear(lambda: gr.update(interactive=False), None, gradio('Submit character'))
997
+
998
+ shared.gradio['Submit tavern character'].click(chat.upload_tavern_character, gradio('upload_img_tavern', 'tavern_json'), gradio('character_menu'))
999
+ shared.gradio['upload_img_tavern'].upload(chat.check_tavern_character, gradio('upload_img_tavern'), gradio('tavern_name', 'tavern_desc', 'tavern_json', 'Submit tavern character'), show_progress=False)
1000
+ shared.gradio['upload_img_tavern'].clear(lambda: (None, None, None, gr.update(interactive=False)), None, gradio('tavern_name', 'tavern_desc', 'tavern_json', 'Submit tavern character'), show_progress=False)
1001
+ shared.gradio['your_picture'].change(
1002
+ chat.upload_your_profile_picture, gradio('your_picture'), None).then(
1003
+ partial(chat.redraw_html, reset_cache=True), shared.reload_inputs, gradio('display'))
1004
+
1005
+ # notebook/default modes event handlers
1006
+ else:
1007
+ shared.input_params = gradio('textbox', 'interface_state')
1008
+ if shared.args.notebook:
1009
+ output_params = gradio('textbox', 'html')
1010
+ else:
1011
+ output_params = gradio('output_textbox', 'html')
1012
+
1013
+ gen_events.append(shared.gradio['Generate'].click(
1014
+ lambda x: x, gradio('textbox'), gradio('last_input')).then(
1015
+ ui.gather_interface_values, gradio(shared.input_elements), gradio('interface_state')).then(
1016
+ generate_reply_wrapper, shared.input_params, output_params, show_progress=False).then(
1017
+ ui.gather_interface_values, gradio(shared.input_elements), gradio('interface_state')).then(
1018
+ lambda: None, None, None, _js=f"() => {{{audio_notification_js}}}")
1019
+ # lambda: None, None, None, _js="() => {element = document.getElementsByTagName('textarea')[0]; element.scrollTop = element.scrollHeight}")
1020
+ )
1021
+
1022
+ gen_events.append(shared.gradio['textbox'].submit(
1023
+ lambda x: x, gradio('textbox'), gradio('last_input')).then(
1024
+ ui.gather_interface_values, gradio(shared.input_elements), gradio('interface_state')).then(
1025
+ generate_reply_wrapper, shared.input_params, output_params, show_progress=False).then(
1026
+ ui.gather_interface_values, gradio(shared.input_elements), gradio('interface_state')).then(
1027
+ lambda: None, None, None, _js=f"() => {{{audio_notification_js}}}")
1028
+ # lambda: None, None, None, _js="() => {element = document.getElementsByTagName('textarea')[0]; element.scrollTop = element.scrollHeight}")
1029
+ )
1030
+
1031
+ if shared.args.notebook:
1032
+ shared.gradio['Undo'].click(lambda x: x, gradio('last_input'), gradio('textbox'), show_progress=False)
1033
+ shared.gradio['markdown_render'].click(lambda x: x, gradio('textbox'), gradio('markdown'), queue=False)
1034
+ gen_events.append(shared.gradio['Regenerate'].click(
1035
+ lambda x: x, gradio('last_input'), gradio('textbox'), show_progress=False).then(
1036
+ ui.gather_interface_values, gradio(shared.input_elements), gradio('interface_state')).then(
1037
+ generate_reply_wrapper, shared.input_params, output_params, show_progress=False).then(
1038
+ ui.gather_interface_values, gradio(shared.input_elements), gradio('interface_state')).then(
1039
+ lambda: None, None, None, _js=f"() => {{{audio_notification_js}}}")
1040
+ # lambda: None, None, None, _js="() => {element = document.getElementsByTagName('textarea')[0]; element.scrollTop = element.scrollHeight}")
1041
+ )
1042
+ else:
1043
+ shared.gradio['markdown_render'].click(lambda x: x, gradio('output_textbox'), gradio('markdown'), queue=False)
1044
+ gen_events.append(shared.gradio['Continue'].click(
1045
+ ui.gather_interface_values, gradio(shared.input_elements), gradio('interface_state')).then(
1046
+ generate_reply_wrapper, [shared.gradio['output_textbox']] + shared.input_params[1:], output_params, show_progress=False).then(
1047
+ ui.gather_interface_values, gradio(shared.input_elements), gradio('interface_state')).then(
1048
+ lambda: None, None, None, _js=f"() => {{{audio_notification_js}}}")
1049
+ # lambda: None, None, None, _js="() => {element = document.getElementsByTagName('textarea')[1]; element.scrollTop = element.scrollHeight}")
1050
+ )
1051
+
1052
+ shared.gradio['Stop'].click(stop_everything_event, None, None, queue=False, cancels=gen_events if shared.args.no_stream else None)
1053
+ shared.gradio['prompt_menu'].change(load_prompt, gradio('prompt_menu'), gradio('textbox'), show_progress=False)
1054
+ shared.gradio['save_prompt'].click(
1055
+ lambda x: x, gradio('textbox'), gradio('save_contents')).then(
1056
+ lambda: 'prompts/', None, gradio('save_root')).then(
1057
+ lambda: utils.current_time() + '.txt', None, gradio('save_filename')).then(
1058
+ lambda: gr.update(visible=True), None, gradio('file_saver'))
1059
+
1060
+ shared.gradio['delete_prompt'].click(
1061
+ lambda: 'prompts/', None, gradio('delete_root')).then(
1062
+ lambda x: x + '.txt', gradio('prompt_menu'), gradio('delete_filename')).then(
1063
+ lambda: gr.update(visible=True), None, gradio('file_deleter'))
1064
+
1065
+ shared.gradio['count_tokens'].click(count_tokens, gradio('textbox'), gradio('status'), show_progress=False)
1066
+
1067
+ create_file_saving_event_handlers()
1068
+
1069
+ if shared.settings['dark_theme']:
1070
+ shared.gradio['interface'].load(lambda: None, None, None, _js="() => document.getElementsByTagName('body')[0].classList.add('dark')")
1071
+
1072
+ shared.gradio['interface'].load(lambda: None, None, None, _js=f"() => {{{js}}}")
1073
+ shared.gradio['interface'].load(partial(ui.apply_interface_values, {}, use_persistent=True), None, gradio(ui.list_interface_input_elements()), show_progress=False)
1074
+ if shared.is_chat():
1075
+ shared.gradio['interface'].load(chat.redraw_html, shared.reload_inputs, gradio('display'))
1076
+
1077
+ # Extensions tabs
1078
+ extensions_module.create_extensions_tabs()
1079
+
1080
+ # Extensions block
1081
+ extensions_module.create_extensions_block()
1082
+
1083
+ # Launch the interface
1084
+ shared.gradio['interface'].queue()
1085
+ with OpenMonkeyPatch():
1086
+ if shared.args.listen:
1087
+ shared.gradio['interface'].launch(prevent_thread_lock=True, share=shared.args.share, server_name=shared.args.listen_host or '0.0.0.0', server_port=shared.args.listen_port, inbrowser=shared.args.auto_launch, auth=auth)
1088
+ else:
1089
+ shared.gradio['interface'].launch(prevent_thread_lock=True, share=shared.args.share, server_port=shared.args.listen_port, inbrowser=shared.args.auto_launch, auth=auth)
1090
+
1091
+
1092
+ if __name__ == "__main__":
1093
+ # Loading custom settings
1094
+ settings_file = None
1095
+ if shared.args.settings is not None and Path(shared.args.settings).exists():
1096
+ settings_file = Path(shared.args.settings)
1097
+ elif Path('settings.yaml').exists():
1098
+ settings_file = Path('settings.yaml')
1099
+ elif Path('settings.json').exists():
1100
+ settings_file = Path('settings.json')
1101
+
1102
+ if settings_file is not None:
1103
+ logger.info(f"Loading settings from {settings_file}...")
1104
+ file_contents = open(settings_file, 'r', encoding='utf-8').read()
1105
+ new_settings = json.loads(file_contents) if settings_file.suffix == "json" else yaml.safe_load(file_contents)
1106
+ for item in new_settings:
1107
+ shared.settings[item] = new_settings[item]
1108
+
1109
+ # Set default model settings based on settings file
1110
+ shared.model_config['.*'] = {
1111
+ 'wbits': 'None',
1112
+ 'model_type': 'None',
1113
+ 'groupsize': 'None',
1114
+ 'pre_layer': 0,
1115
+ 'mode': shared.settings['mode'],
1116
+ 'skip_special_tokens': shared.settings['skip_special_tokens'],
1117
+ 'custom_stopping_strings': shared.settings['custom_stopping_strings'],
1118
+ 'truncation_length': shared.settings['truncation_length'],
1119
+ 'n_gqa': 0,
1120
+ 'rms_norm_eps': 0,
1121
+ }
1122
+
1123
+ shared.model_config.move_to_end('.*', last=False) # Move to the beginning
1124
+
1125
+ # Default extensions
1126
+ extensions_module.available_extensions = utils.get_available_extensions()
1127
+ if shared.is_chat():
1128
+ for extension in shared.settings['chat_default_extensions']:
1129
+ shared.args.extensions = shared.args.extensions or []
1130
+ if extension not in shared.args.extensions:
1131
+ shared.args.extensions.append(extension)
1132
+ else:
1133
+ for extension in shared.settings['default_extensions']:
1134
+ shared.args.extensions = shared.args.extensions or []
1135
+ if extension not in shared.args.extensions:
1136
+ shared.args.extensions.append(extension)
1137
+
1138
+ available_models = utils.get_available_models()
1139
+
1140
+ # Model defined through --model
1141
+ if shared.args.model is not None:
1142
+ shared.model_name = shared.args.model
1143
+
1144
+ # Select the model from a command-line menu
1145
+ elif shared.args.model_menu:
1146
+ if len(available_models) == 0:
1147
+ logger.error('No models are available! Please download at least one.')
1148
+ sys.exit(0)
1149
+ else:
1150
+ print('The following models are available:\n')
1151
+ for i, model in enumerate(available_models):
1152
+ print(f'{i+1}. {model}')
1153
+
1154
+ print(f'\nWhich one do you want to load? 1-{len(available_models)}\n')
1155
+ i = int(input()) - 1
1156
+ print()
1157
+
1158
+ shared.model_name = available_models[i]
1159
+
1160
+ # If any model has been selected, load it
1161
+ if shared.model_name != 'None':
1162
+ model_settings = get_model_settings_from_yamls(shared.model_name)
1163
+ shared.settings.update(model_settings) # hijacking the interface defaults
1164
+ update_model_parameters(model_settings, initial=True) # hijacking the command-line arguments
1165
+
1166
+ # Load the model
1167
+ shared.model, shared.tokenizer = load_model(shared.model_name)
1168
+ if shared.args.lora:
1169
+ add_lora_to_model(shared.args.lora)
1170
+
1171
+ shared.generation_lock = Lock()
1172
+
1173
+ # Launch the web UI
1174
+ create_interface()
1175
+ while True:
1176
+ time.sleep(0.5)
1177
+ if shared.need_restart:
1178
+ shared.need_restart = False
1179
+ time.sleep(0.5)
1180
+ shared.gradio['interface'].close()
1181
+ time.sleep(0.5)
1182
+ create_interface()
settings-template.yaml ADDED
@@ -0,0 +1,36 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ dark_theme: true
2
+ autoload_model: false
3
+ max_new_tokens: 200
4
+ max_new_tokens_min: 1
5
+ max_new_tokens_max: 4096
6
+ seed: -1
7
+ character: None
8
+ name1: You
9
+ name2: Assistant
10
+ context: This is a conversation with your Assistant. It is a computer program designed to help you with various tasks such as answering questions, providing recommendations, and helping with decision making. You can ask it anything you want and it will do its best to give you accurate and relevant information.
11
+ greeting: ''
12
+ turn_template: ''
13
+ custom_stopping_strings: ''
14
+ stop_at_newline: false
15
+ add_bos_token: true
16
+ ban_eos_token: false
17
+ skip_special_tokens: true
18
+ truncation_length: 2048
19
+ truncation_length_min: 0
20
+ truncation_length_max: 16384
21
+ mode: chat
22
+ start_with: ''
23
+ chat_style: TheEncrypted777
24
+ instruction_template: None
25
+ chat-instruct_command: |-
26
+ Continue the chat dialogue below. Write a single reply for the character "<|character|>".
27
+
28
+ <|prompt|>
29
+ chat_generation_attempts: 1
30
+ chat_generation_attempts_min: 1
31
+ chat_generation_attempts_max: 10
32
+ default_extensions: []
33
+ chat_default_extensions:
34
+ - gallery
35
+ preset: simple-1
36
+ prompt: QA