From 62d59a516f6b5610f4e10d45ebe1e7a4202024df Mon Sep 17 00:00:00 2001 From: oobabooga <112222186+oobabooga@users.noreply.github.com> Date: Fri, 8 Dec 2023 06:29:26 -0800 Subject: [PATCH 01/17] Add trust_remote_code to all HF loaders --- modules/loaders.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/modules/loaders.py b/modules/loaders.py index babbe440..d1f8343f 100644 --- a/modules/loaders.py +++ b/modules/loaders.py @@ -59,6 +59,7 @@ loaders_and_params = OrderedDict({ 'cpu', 'numa', 'cfg_cache', + 'trust_remote_code', 'no_use_fast', 'logits_all', 'llamacpp_HF_info', @@ -70,6 +71,7 @@ loaders_and_params = OrderedDict({ 'rope_freq_base', 'compress_pos_emb', 'cfg_cache', + 'trust_remote_code', 'no_use_fast', ], 'ExLlamav2_HF': [ @@ -80,6 +82,7 @@ loaders_and_params = OrderedDict({ 'cache_8bit', 'alpha_value', 'compress_pos_emb', + 'trust_remote_code', 'no_use_fast', ], 'AutoGPTQ': [ @@ -114,6 +117,7 @@ loaders_and_params = OrderedDict({ 'groupsize', 'model_type', 'pre_layer', + 'trust_remote_code', 'no_use_fast', 'gptq_for_llama_info', ], From 2a335b8aa7ae3fa641b8528ff649f55c49b97a99 Mon Sep 17 00:00:00 2001 From: oobabooga <112222186+oobabooga@users.noreply.github.com> Date: Fri, 8 Dec 2023 06:35:23 -0800 Subject: [PATCH 02/17] Cleanup: set shared.model_name only once --- extensions/openai/models.py | 1 - modules/evaluate.py | 3 +-- modules/models.py | 1 + modules/ui_model_menu.py | 3 +-- 4 files changed, 3 insertions(+), 5 deletions(-) diff --git a/extensions/openai/models.py b/extensions/openai/models.py index 8a093ebe..01045f90 100644 --- a/extensions/openai/models.py +++ b/extensions/openai/models.py @@ -55,7 +55,6 @@ def _load_model(data): setattr(shared.args, k, args[k]) shared.model, shared.tokenizer = load_model(model_name) - shared.model_name = model_name # Update shared.settings with custom generation defaults if settings: diff --git a/modules/evaluate.py b/modules/evaluate.py index 4b5335ff..b5ec3e38 100644 --- a/modules/evaluate.py +++ b/modules/evaluate.py @@ -69,9 +69,8 @@ def calculate_perplexity(models, input_dataset, stride, _max_length): model_settings = get_model_metadata(model) shared.settings.update({k: v for k, v in model_settings.items() if k in shared.settings}) # hijacking the interface defaults update_model_parameters(model_settings) # hijacking the command-line arguments - shared.model_name = model unload_model() - shared.model, shared.tokenizer = load_model(shared.model_name) + shared.model, shared.tokenizer = load_model(model) except: cumulative_log += f"Failed to load `{model}`. Moving on.\n\n" yield cumulative_log diff --git a/modules/models.py b/modules/models.py index 1df36a6f..94f97324 100644 --- a/modules/models.py +++ b/modules/models.py @@ -58,6 +58,7 @@ def load_model(model_name, loader=None): t0 = time.time() shared.is_seq2seq = False + shared.model_name = model_name load_func_map = { 'Transformers': huggingface_loader, 'AutoGPTQ': AutoGPTQ_loader, diff --git a/modules/ui_model_menu.py b/modules/ui_model_menu.py index 8f4d685c..5b6a62f3 100644 --- a/modules/ui_model_menu.py +++ b/modules/ui_model_menu.py @@ -203,10 +203,9 @@ def load_model_wrapper(selected_model, loader, autoload=False): else: try: yield f"Loading `{selected_model}`..." - shared.model_name = selected_model unload_model() if selected_model != '': - shared.model, shared.tokenizer = load_model(shared.model_name, loader) + shared.model, shared.tokenizer = load_model(selected_model, loader) if shared.model is not None: output = f"Successfully loaded `{selected_model}`." From 8c8825b777516f189c0fc3eb46c22f552fecc300 Mon Sep 17 00:00:00 2001 From: oobabooga <112222186+oobabooga@users.noreply.github.com> Date: Fri, 8 Dec 2023 08:39:20 -0800 Subject: [PATCH 03/17] Add QuIP# to README --- README.md | 4 ++-- modules/shared.py | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index c3e04741..f9425833 100644 --- a/README.md +++ b/README.md @@ -11,7 +11,7 @@ Its goal is to become the [AUTOMATIC1111/stable-diffusion-webui](https://github. ## Features * 3 interface modes: default (two columns), notebook, and chat -* Multiple model backends: [Transformers](https://github.com/huggingface/transformers), [llama.cpp](https://github.com/ggerganov/llama.cpp) (through [llama-cpp-python](https://github.com/abetlen/llama-cpp-python)), [ExLlama](https://github.com/turboderp/exllama), [ExLlamaV2](https://github.com/turboderp/exllamav2), [AutoGPTQ](https://github.com/PanQiWei/AutoGPTQ), [AutoAWQ](https://github.com/casper-hansen/AutoAWQ), [GPTQ-for-LLaMa](https://github.com/qwopqwop200/GPTQ-for-LLaMa), [CTransformers](https://github.com/marella/ctransformers) +* Multiple model backends: [Transformers](https://github.com/huggingface/transformers), [llama.cpp](https://github.com/ggerganov/llama.cpp) (through [llama-cpp-python](https://github.com/abetlen/llama-cpp-python)), [ExLlama](https://github.com/turboderp/exllama), [ExLlamaV2](https://github.com/turboderp/exllamav2), [AutoGPTQ](https://github.com/PanQiWei/AutoGPTQ), [AutoAWQ](https://github.com/casper-hansen/AutoAWQ), [GPTQ-for-LLaMa](https://github.com/qwopqwop200/GPTQ-for-LLaMa), [CTransformers](https://github.com/marella/ctransformers), [QuIP#](https://github.com/Cornell-RelaxML/quip-sharp) * Dropdown menu for quickly switching between different models * LoRA: load and unload LoRAs on the fly, train a new LoRA using QLoRA * Precise instruction templates for chat mode, including Llama-2-chat, Alpaca, Vicuna, WizardLM, StableLM, and many others @@ -283,7 +283,7 @@ Optionally, you can use the following command-line flags: | Flag | Description | |--------------------------------------------|-------------| -| `--loader LOADER` | Choose the model loader manually, otherwise, it will get autodetected. Valid options: Transformers, llama.cpp, llamacpp_HF, ExLlama_HF, ExLlamav2_HF, AutoGPTQ, AutoAWQ, GPTQ-for-LLaMa, ExLlama, ExLlamav2, ctransformers. | +| `--loader LOADER` | Choose the model loader manually, otherwise, it will get autodetected. Valid options: Transformers, llama.cpp, llamacpp_HF, ExLlama_HF, ExLlamav2_HF, AutoGPTQ, AutoAWQ, GPTQ-for-LLaMa, ExLlama, ExLlamav2, ctransformers, QuIP#. | #### Accelerate/transformers diff --git a/modules/shared.py b/modules/shared.py index 680cd8fb..eb7323cf 100644 --- a/modules/shared.py +++ b/modules/shared.py @@ -79,7 +79,7 @@ parser.add_argument('--verbose', action='store_true', help='Print the prompts to parser.add_argument('--chat-buttons', action='store_true', help='Show buttons on the chat tab instead of a hover menu.') # Model loader -parser.add_argument('--loader', type=str, help='Choose the model loader manually, otherwise, it will get autodetected. Valid options: Transformers, llama.cpp, llamacpp_HF, ExLlama_HF, ExLlamav2_HF, AutoGPTQ, AutoAWQ, GPTQ-for-LLaMa, ExLlama, ExLlamav2, ctransformers.') +parser.add_argument('--loader', type=str, help='Choose the model loader manually, otherwise, it will get autodetected. Valid options: Transformers, llama.cpp, llamacpp_HF, ExLlama_HF, ExLlamav2_HF, AutoGPTQ, AutoAWQ, GPTQ-for-LLaMa, ExLlama, ExLlamav2, ctransformers, QuIP#.') # Accelerate/transformers parser.add_argument('--cpu', action='store_true', help='Use the CPU to generate text. Warning: Training on CPU is extremely slow.') From 602b8c6210f2e2141fc7f196b927011ca8919111 Mon Sep 17 00:00:00 2001 From: Morgan Schweers Date: Sun, 10 Dec 2023 21:51:01 -0800 Subject: [PATCH 04/17] Make new browser reloads recognize current model. (#4865) --- modules/ui_model_menu.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/ui_model_menu.py b/modules/ui_model_menu.py index 5b6a62f3..5d515308 100644 --- a/modules/ui_model_menu.py +++ b/modules/ui_model_menu.py @@ -58,7 +58,7 @@ def create_ui(): with gr.Row(): with gr.Column(): with gr.Row(): - shared.gradio['model_menu'] = gr.Dropdown(choices=utils.get_available_models(), value=shared.model_name, label='Model', elem_classes='slim-dropdown', interactive=not mu) + shared.gradio['model_menu'] = gr.Dropdown(choices=utils.get_available_models(), value=lambda: shared.model_name, label='Model', elem_classes='slim-dropdown', interactive=not mu) ui.create_refresh_button(shared.gradio['model_menu'], lambda: None, lambda: {'choices': utils.get_available_models()}, 'refresh-button', interactive=not mu) shared.gradio['load_model'] = gr.Button("Load", visible=not shared.settings['autoload_model'], elem_classes='refresh-button', interactive=not mu) shared.gradio['unload_model'] = gr.Button("Unload", elem_classes='refresh-button', interactive=not mu) From 993ca51a651238ad97b17cccd952a3a2df04282e Mon Sep 17 00:00:00 2001 From: Nehereus <55364637+Nehereus@users.noreply.github.com> Date: Mon, 11 Dec 2023 23:29:27 -0600 Subject: [PATCH 05/17] Update callbacks.py to show tracebacks on ValueError (#4892) --- modules/callbacks.py | 1 + 1 file changed, 1 insertion(+) diff --git a/modules/callbacks.py b/modules/callbacks.py index bb979a6c..25ede07c 100644 --- a/modules/callbacks.py +++ b/modules/callbacks.py @@ -56,6 +56,7 @@ class Iteratorize: try: ret = self.mfunc(callback=_callback, *args, **self.kwargs) except ValueError: + traceback.print_exc() pass except: traceback.print_exc() From a8a92c6c87c93fcf3d6de64940b5fe6fbdea7d3f Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 12 Dec 2023 02:30:25 -0300 Subject: [PATCH 06/17] Update transformers requirement from ==4.35.* to ==4.36.* (#4882) --- requirements.txt | 2 +- requirements_amd.txt | 2 +- requirements_amd_noavx2.txt | 2 +- requirements_apple_intel.txt | 2 +- requirements_apple_silicon.txt | 2 +- requirements_cpu_only.txt | 2 +- requirements_cpu_only_noavx2.txt | 2 +- requirements_noavx2.txt | 2 +- requirements_nowheels.txt | 2 +- 9 files changed, 9 insertions(+), 9 deletions(-) diff --git a/requirements.txt b/requirements.txt index f4cbaeac..e97aa1f0 100644 --- a/requirements.txt +++ b/requirements.txt @@ -16,7 +16,7 @@ safetensors==0.4.1 scipy sentencepiece tensorboard -transformers==4.35.* +transformers==4.36.* tqdm wandb diff --git a/requirements_amd.txt b/requirements_amd.txt index 892cae7c..11746212 100644 --- a/requirements_amd.txt +++ b/requirements_amd.txt @@ -16,7 +16,7 @@ safetensors==0.4.1 scipy sentencepiece tensorboard -transformers==4.35.* +transformers==4.36.* tqdm wandb diff --git a/requirements_amd_noavx2.txt b/requirements_amd_noavx2.txt index 228c5172..2ff36dc8 100644 --- a/requirements_amd_noavx2.txt +++ b/requirements_amd_noavx2.txt @@ -16,7 +16,7 @@ safetensors==0.4.1 scipy sentencepiece tensorboard -transformers==4.35.* +transformers==4.36.* tqdm wandb diff --git a/requirements_apple_intel.txt b/requirements_apple_intel.txt index 377373f1..8133ebba 100644 --- a/requirements_apple_intel.txt +++ b/requirements_apple_intel.txt @@ -16,7 +16,7 @@ safetensors==0.4.1 scipy sentencepiece tensorboard -transformers==4.35.* +transformers==4.36.* tqdm wandb diff --git a/requirements_apple_silicon.txt b/requirements_apple_silicon.txt index e280108b..a05b9454 100644 --- a/requirements_apple_silicon.txt +++ b/requirements_apple_silicon.txt @@ -16,7 +16,7 @@ safetensors==0.4.1 scipy sentencepiece tensorboard -transformers==4.35.* +transformers==4.36.* tqdm wandb diff --git a/requirements_cpu_only.txt b/requirements_cpu_only.txt index 7e83c662..65deb1fa 100644 --- a/requirements_cpu_only.txt +++ b/requirements_cpu_only.txt @@ -16,7 +16,7 @@ safetensors==0.4.1 scipy sentencepiece tensorboard -transformers==4.35.* +transformers==4.36.* tqdm wandb diff --git a/requirements_cpu_only_noavx2.txt b/requirements_cpu_only_noavx2.txt index b31eec14..490de88d 100644 --- a/requirements_cpu_only_noavx2.txt +++ b/requirements_cpu_only_noavx2.txt @@ -16,7 +16,7 @@ safetensors==0.4.1 scipy sentencepiece tensorboard -transformers==4.35.* +transformers==4.36.* tqdm wandb diff --git a/requirements_noavx2.txt b/requirements_noavx2.txt index c00d9bd1..373fdeff 100644 --- a/requirements_noavx2.txt +++ b/requirements_noavx2.txt @@ -16,7 +16,7 @@ safetensors==0.4.1 scipy sentencepiece tensorboard -transformers==4.35.* +transformers==4.36.* tqdm wandb diff --git a/requirements_nowheels.txt b/requirements_nowheels.txt index b285e4c0..b1b1d6d2 100644 --- a/requirements_nowheels.txt +++ b/requirements_nowheels.txt @@ -16,7 +16,7 @@ safetensors==0.4.1 scipy sentencepiece tensorboard -transformers==4.35.* +transformers==4.36.* tqdm wandb From a17750db91e5db609da147ac1c2dee5b6a305a6a Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 12 Dec 2023 02:31:30 -0300 Subject: [PATCH 07/17] Update peft requirement from ==0.6.* to ==0.7.* (#4886) --- requirements.txt | 2 +- requirements_amd.txt | 2 +- requirements_amd_noavx2.txt | 2 +- requirements_apple_intel.txt | 2 +- requirements_apple_silicon.txt | 2 +- requirements_cpu_only.txt | 2 +- requirements_cpu_only_noavx2.txt | 2 +- requirements_noavx2.txt | 2 +- requirements_nowheels.txt | 2 +- 9 files changed, 9 insertions(+), 9 deletions(-) diff --git a/requirements.txt b/requirements.txt index e97aa1f0..f3601dcf 100644 --- a/requirements.txt +++ b/requirements.txt @@ -8,7 +8,7 @@ markdown numpy==1.24.* optimum==1.14.0 pandas -peft==0.6.* +peft==0.7.* Pillow>=9.5.0 pyyaml requests diff --git a/requirements_amd.txt b/requirements_amd.txt index 11746212..3f7f8caa 100644 --- a/requirements_amd.txt +++ b/requirements_amd.txt @@ -8,7 +8,7 @@ markdown numpy==1.24.* optimum==1.14.0 pandas -peft==0.6.* +peft==0.7.* Pillow>=9.5.0 pyyaml requests diff --git a/requirements_amd_noavx2.txt b/requirements_amd_noavx2.txt index 2ff36dc8..cdec7a9d 100644 --- a/requirements_amd_noavx2.txt +++ b/requirements_amd_noavx2.txt @@ -8,7 +8,7 @@ markdown numpy==1.24.* optimum==1.14.0 pandas -peft==0.6.* +peft==0.7.* Pillow>=9.5.0 pyyaml requests diff --git a/requirements_apple_intel.txt b/requirements_apple_intel.txt index 8133ebba..6380c97b 100644 --- a/requirements_apple_intel.txt +++ b/requirements_apple_intel.txt @@ -8,7 +8,7 @@ markdown numpy==1.24.* optimum==1.14.0 pandas -peft==0.6.* +peft==0.7.* Pillow>=9.5.0 pyyaml requests diff --git a/requirements_apple_silicon.txt b/requirements_apple_silicon.txt index a05b9454..511e0c2c 100644 --- a/requirements_apple_silicon.txt +++ b/requirements_apple_silicon.txt @@ -8,7 +8,7 @@ markdown numpy==1.24.* optimum==1.14.0 pandas -peft==0.6.* +peft==0.7.* Pillow>=9.5.0 pyyaml requests diff --git a/requirements_cpu_only.txt b/requirements_cpu_only.txt index 65deb1fa..c4879447 100644 --- a/requirements_cpu_only.txt +++ b/requirements_cpu_only.txt @@ -8,7 +8,7 @@ markdown numpy==1.24.* optimum==1.14.0 pandas -peft==0.6.* +peft==0.7.* Pillow>=9.5.0 pyyaml requests diff --git a/requirements_cpu_only_noavx2.txt b/requirements_cpu_only_noavx2.txt index 490de88d..a9aaf5d4 100644 --- a/requirements_cpu_only_noavx2.txt +++ b/requirements_cpu_only_noavx2.txt @@ -8,7 +8,7 @@ markdown numpy==1.24.* optimum==1.14.0 pandas -peft==0.6.* +peft==0.7.* Pillow>=9.5.0 pyyaml requests diff --git a/requirements_noavx2.txt b/requirements_noavx2.txt index 373fdeff..801d93b9 100644 --- a/requirements_noavx2.txt +++ b/requirements_noavx2.txt @@ -8,7 +8,7 @@ markdown numpy==1.24.* optimum==1.14.0 pandas -peft==0.6.* +peft==0.7.* Pillow>=9.5.0 pyyaml requests diff --git a/requirements_nowheels.txt b/requirements_nowheels.txt index b1b1d6d2..b5ec6d01 100644 --- a/requirements_nowheels.txt +++ b/requirements_nowheels.txt @@ -8,7 +8,7 @@ markdown numpy==1.24.* optimum==1.14.0 pandas -peft==0.6.* +peft==0.7.* Pillow>=9.5.0 pyyaml requests From 7a987417bbdec54a863c8ff9685b0a813f09bb47 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 12 Dec 2023 02:32:19 -0300 Subject: [PATCH 08/17] Bump optimum from 1.14.0 to 1.15.0 (#4885) --- requirements.txt | 2 +- requirements_amd.txt | 2 +- requirements_amd_noavx2.txt | 2 +- requirements_apple_intel.txt | 2 +- requirements_apple_silicon.txt | 2 +- requirements_cpu_only.txt | 2 +- requirements_cpu_only_noavx2.txt | 2 +- requirements_noavx2.txt | 2 +- requirements_nowheels.txt | 2 +- 9 files changed, 9 insertions(+), 9 deletions(-) diff --git a/requirements.txt b/requirements.txt index f3601dcf..c52d4162 100644 --- a/requirements.txt +++ b/requirements.txt @@ -6,7 +6,7 @@ exllamav2==0.0.10; platform_system != "Darwin" and platform_machine != "x86_64" gradio==3.50.* markdown numpy==1.24.* -optimum==1.14.0 +optimum==1.15.0 pandas peft==0.7.* Pillow>=9.5.0 diff --git a/requirements_amd.txt b/requirements_amd.txt index 3f7f8caa..9c9cf767 100644 --- a/requirements_amd.txt +++ b/requirements_amd.txt @@ -6,7 +6,7 @@ exllamav2==0.0.10 gradio==3.50.* markdown numpy==1.24.* -optimum==1.14.0 +optimum==1.15.0 pandas peft==0.7.* Pillow>=9.5.0 diff --git a/requirements_amd_noavx2.txt b/requirements_amd_noavx2.txt index cdec7a9d..7e300dcf 100644 --- a/requirements_amd_noavx2.txt +++ b/requirements_amd_noavx2.txt @@ -6,7 +6,7 @@ exllamav2==0.0.10 gradio==3.50.* markdown numpy==1.24.* -optimum==1.14.0 +optimum==1.15.0 pandas peft==0.7.* Pillow>=9.5.0 diff --git a/requirements_apple_intel.txt b/requirements_apple_intel.txt index 6380c97b..7ca028a5 100644 --- a/requirements_apple_intel.txt +++ b/requirements_apple_intel.txt @@ -6,7 +6,7 @@ exllamav2==0.0.10 gradio==3.50.* markdown numpy==1.24.* -optimum==1.14.0 +optimum==1.15.0 pandas peft==0.7.* Pillow>=9.5.0 diff --git a/requirements_apple_silicon.txt b/requirements_apple_silicon.txt index 511e0c2c..3d02c74c 100644 --- a/requirements_apple_silicon.txt +++ b/requirements_apple_silicon.txt @@ -6,7 +6,7 @@ exllamav2==0.0.10 gradio==3.50.* markdown numpy==1.24.* -optimum==1.14.0 +optimum==1.15.0 pandas peft==0.7.* Pillow>=9.5.0 diff --git a/requirements_cpu_only.txt b/requirements_cpu_only.txt index c4879447..de610531 100644 --- a/requirements_cpu_only.txt +++ b/requirements_cpu_only.txt @@ -6,7 +6,7 @@ exllamav2==0.0.10 gradio==3.50.* markdown numpy==1.24.* -optimum==1.14.0 +optimum==1.15.0 pandas peft==0.7.* Pillow>=9.5.0 diff --git a/requirements_cpu_only_noavx2.txt b/requirements_cpu_only_noavx2.txt index a9aaf5d4..6a70b37e 100644 --- a/requirements_cpu_only_noavx2.txt +++ b/requirements_cpu_only_noavx2.txt @@ -6,7 +6,7 @@ exllamav2==0.0.10 gradio==3.50.* markdown numpy==1.24.* -optimum==1.14.0 +optimum==1.15.0 pandas peft==0.7.* Pillow>=9.5.0 diff --git a/requirements_noavx2.txt b/requirements_noavx2.txt index 801d93b9..4c2e986c 100644 --- a/requirements_noavx2.txt +++ b/requirements_noavx2.txt @@ -6,7 +6,7 @@ exllamav2==0.0.10; platform_system != "Darwin" and platform_machine != "x86_64" gradio==3.50.* markdown numpy==1.24.* -optimum==1.14.0 +optimum==1.15.0 pandas peft==0.7.* Pillow>=9.5.0 diff --git a/requirements_nowheels.txt b/requirements_nowheels.txt index b5ec6d01..936d30d7 100644 --- a/requirements_nowheels.txt +++ b/requirements_nowheels.txt @@ -6,7 +6,7 @@ exllamav2==0.0.10 gradio==3.50.* markdown numpy==1.24.* -optimum==1.14.0 +optimum==1.15.0 pandas peft==0.7.* Pillow>=9.5.0 From aab0dd962d9f48e9524f8e602f7252a27ed85870 Mon Sep 17 00:00:00 2001 From: oobabooga <112222186+oobabooga@users.noreply.github.com> Date: Tue, 12 Dec 2023 11:47:11 -0800 Subject: [PATCH 09/17] Revert "Update callbacks.py to show tracebacks on ValueError (#4892)" This reverts commit 993ca51a651238ad97b17cccd952a3a2df04282e. --- modules/callbacks.py | 1 - 1 file changed, 1 deletion(-) diff --git a/modules/callbacks.py b/modules/callbacks.py index 25ede07c..bb979a6c 100644 --- a/modules/callbacks.py +++ b/modules/callbacks.py @@ -56,7 +56,6 @@ class Iteratorize: try: ret = self.mfunc(callback=_callback, *args, **self.kwargs) except ValueError: - traceback.print_exc() pass except: traceback.print_exc() From 39d2fe1ed9cd47995b26afc285fe9c3dd9ea9dde Mon Sep 17 00:00:00 2001 From: oobabooga <112222186+oobabooga@users.noreply.github.com> Date: Tue, 12 Dec 2023 17:23:14 -0300 Subject: [PATCH 10/17] Jinja templates for Instruct and Chat (#4874) --- docs/01 - Chat Tab.md | 5 +- docs/03 - Parameters Tab.md | 8 +- extensions/openai/completions.py | 30 +- extensions/openai/typing.py | 9 +- instruction-templates/Airoboros-v1.2.yaml | 30 +- instruction-templates/Alpaca.yaml | 30 +- instruction-templates/Bactrian.yaml | 30 +- instruction-templates/Baichuan Chat.yaml | 30 +- instruction-templates/Baize.yaml | 30 +- instruction-templates/Bluemoon.yaml | 30 +- instruction-templates/ChatGLM.yaml | 30 +- instruction-templates/ChatML.yaml | 31 +- .../Chinese-Vicuna-Chat.yaml | 30 +- instruction-templates/Galactica Cite.yaml | 30 +- .../Galactica Finetuned.yaml | 30 +- instruction-templates/Galactica Q.yaml | 30 +- instruction-templates/Galactica Summary.yaml | 30 +- instruction-templates/Galactica Work.yaml | 30 +- instruction-templates/Galactica v2.yaml | 30 +- instruction-templates/Galactica.yaml | 30 +- instruction-templates/Gorilla.yaml | 30 +- instruction-templates/Guanaco non-chat.yaml | 30 +- instruction-templates/Guanaco-QLoRA.yaml | 30 +- instruction-templates/Guanaco.yaml | 30 +- instruction-templates/H2O-human_bot.yaml | 30 +- instruction-templates/H2O-prompt_answer.yaml | 30 +- instruction-templates/Hippogriff.yaml | 30 +- instruction-templates/INCITE-Chat.yaml | 30 +- instruction-templates/INCITE-Instruct.yaml | 30 +- instruction-templates/KoAlpaca.yaml | 30 +- instruction-templates/Koala.yaml | 30 +- instruction-templates/LLaVA-v1.yaml | 30 +- instruction-templates/LLaVA.yaml | 30 +- instruction-templates/Llama-v2.yaml | 30 +- instruction-templates/MOSS.yaml | 30 +- instruction-templates/Manticore Chat.yaml | 30 +- instruction-templates/Metharme.yaml | 30 +- instruction-templates/Minotaur.yaml | 30 +- instruction-templates/Mistral.yaml | 30 +- instruction-templates/NewHope.yaml | 30 +- instruction-templates/Open Assistant.yaml | 29 +- instruction-templates/OpenBuddy.yaml | 41 +- instruction-templates/OpenChat.yaml | 30 +- instruction-templates/OpenOrca-Platypus2.yaml | 30 +- instruction-templates/Orca Mini.yaml | 30 +- instruction-templates/RWKV-Raven.yaml | 29 +- instruction-templates/Samantha.yaml | 30 +- instruction-templates/StableBeluga2.yaml | 30 +- instruction-templates/StableLM.yaml | 35 +- instruction-templates/StableVicuna.yaml | 30 +- instruction-templates/Starchat-Beta.yaml | 30 +- instruction-templates/Tulu.yaml | 30 +- instruction-templates/Vicuna-v0.yaml | 30 +- instruction-templates/Vicuna-v1.1.yaml | 30 +- instruction-templates/Vigogne-Chat.yaml | 36 +- instruction-templates/Vigogne-Instruct.yaml | 30 +- .../Wizard-Mega ShareGPT.yaml | 30 +- .../Wizard-Mega WizardLM.yaml | 30 +- instruction-templates/Wizard-Mega.yaml | 30 +- instruction-templates/Ziya.yaml | 30 +- modules/chat.py | 386 +++++++++++------- modules/models.py | 2 +- modules/models_settings.py | 28 +- modules/shared.py | 3 +- modules/text_generation.py | 7 +- modules/ui.py | 11 +- modules/ui_chat.py | 45 +- modules/ui_session.py | 2 +- modules/utils.py | 2 +- server.py | 2 +- settings-template.yaml | 51 ++- 71 files changed, 1774 insertions(+), 518 deletions(-) diff --git a/docs/01 - Chat Tab.md b/docs/01 - Chat Tab.md index 17691a7e..5a9d6381 100644 --- a/docs/01 - Chat Tab.md +++ b/docs/01 - Chat Tab.md @@ -97,10 +97,7 @@ The "Chat" option should typically be used only for base models or non-instruct Used for talking to an instruction-following model using the prompt format defined under "Parameters" > "Instruction template". Think of this option as an offline ChatGPT. -The prompt format is defined by the following adjustable parameters in "Parameters" > "Instruction template": - -* **Context**: appears at the top of the prompt exactly as it is written, including the newline characters at the end (if any). Often the context includes a customizable system message. For instance, instead of "Answer the questions." for Llama-2-chat, you can write "Answer the questions as if you were a pirate.", and the model will comply. -* **Turn template**: defines a single input/reply turn. In this string, `<|user|>` and `<|bot|>` are placeholders that get replaced with whatever you type in the **User string** and **Bot string** fields respectively; they are mandatory and should be present even if those fields are empty. `<|user-message|>` and `<|bot-message|>` get replaced with the user and bot messages at that turn. If the prompt format uses newline characters, they should be written inline as `\n` in the turn template. +The prompt format is defined by the **Instruction template string** parameter in "Parameters" > "Instruction template", which represents a A Jinja2 template. Note that when you load a model in the "Model" tab, the web UI will try to automatically detect its instruction template (if any), and will update the values under "Parameters" > "Instruction template" accordingly. This is done using a set of regular expressions defined in `models/config.yaml`. This detection is not guaranteed to be accurate. You should check the model card on Hugging Face to see if you are using the correct prompt format. diff --git a/docs/03 - Parameters Tab.md b/docs/03 - Parameters Tab.md index 601cca86..e18fe047 100644 --- a/docs/03 - Parameters Tab.md +++ b/docs/03 - Parameters Tab.md @@ -101,13 +101,9 @@ So you can use those special placeholders in your character definitions. They ar Defines the instruction template that is used in the Chat tab when "instruct" or "chat-instruct" are selected under "Mode". -* **Instruction template**: A dropdown menu where you can select from saved templates, save a new template (💾 button), and delete the currently selected template (🗑️). +* **Instruction template**: A dropdown menu where you can load a saved template, save a new template (💾 button), and delete the currently selected template (🗑️). * **Custom system message**: A message that defines the personality of the chatbot, replacing its default "System message" string. Example: "You are a duck." -* **Turn template**: Defines the positioning of spaces and new line characters in a single turn of the dialogue. `<|user-message|>` gets replaced with the user input, `<|bot-message|>` gets replaced with the bot reply, `<|user|>` gets replaced with the "User string" below, and `<|bot|>` gets replaced with "Bot string" below. The `<|user|>` and `<|bot|>` placeholders must be included even if "User string" and "Bot string" are empty, as they are used to split the template in parts in the backend. -* **User string**: Replaces `<|user|>` in the turn template. -* **Bot string**: Replaces `<|bot|>` in the turn template. -* **Context**: A string that appears as-is at the top of the prompt, including the new line characters at the end (if any). The `<|system-message|>` placeholder gets replaced with the "System message" string below, unless "Custom system message" is not empty, in which case it is used instead. -* **System message**: A default message recommended by the model creator(s) to define the personality of the chatbot. +* **Instruction template string**: A Jinja2 template that defines the prompt format for the instruction-following conversation. * **Send to default**: Send the full instruction template in string format to the Default tab. * **Send to notebook**: Send the full instruction template in string format to the Notebook tab. * **Send to negative prompt**: Send the full instruction template in string format to the "Negative prompt" field under "Parameters" > "Generation". diff --git a/extensions/openai/completions.py b/extensions/openai/completions.py index 273d5334..70cdfe48 100644 --- a/extensions/openai/completions.py +++ b/extensions/openai/completions.py @@ -13,7 +13,8 @@ from modules import shared from modules.chat import ( generate_chat_prompt, generate_chat_reply, - load_character_memoized + load_character_memoized, + load_instruction_template_memoized ) from modules.presets import load_preset_memoized from modules.text_generation import decode, encode, generate_reply @@ -195,21 +196,23 @@ def chat_completions_common(body: dict, is_legacy: bool = False, stream=False) - continue_ = body['continue_'] # Instruction template - instruction_template = body['instruction_template'] or shared.settings['instruction_template'] - instruction_template = "Alpaca" if instruction_template == "None" else instruction_template - name1_instruct, name2_instruct, _, _, context_instruct, turn_template, system_message = load_character_memoized(instruction_template, '', '', instruct=True) - name1_instruct = body['name1_instruct'] or name1_instruct - name2_instruct = body['name2_instruct'] or name2_instruct - turn_template = body['turn_template'] or turn_template - context_instruct = body['context_instruct'] or context_instruct - system_message = body['system_message'] or system_message + if body['instruction_template_str']: + instruction_template_str = body['instruction_template_str'] + elif body['instruction_template']: + instruction_template = body['instruction_template'] + instruction_template = "Alpaca" if instruction_template == "None" else instruction_template + instruction_template_str = load_instruction_template_memoized(instruction_template) + else: + instruction_template_str = shared.settings['instruction_template_str'] + + chat_template_str = body['chat_template_str'] or shared.settings['chat_template_str'] chat_instruct_command = body['chat_instruct_command'] or shared.settings['chat-instruct_command'] # Chat character character = body['character'] or shared.settings['character'] character = "Assistant" if character == "None" else character name1 = body['name1'] or shared.settings['name1'] - name1, name2, _, greeting, context, _, _ = load_character_memoized(character, name1, '', instruct=False) + name1, name2, _, greeting, context = load_character_memoized(character, name1, '') name2 = body['name2'] or name2 context = body['context'] or context greeting = body['greeting'] or greeting @@ -223,12 +226,9 @@ def chat_completions_common(body: dict, is_legacy: bool = False, stream=False) - 'name2': name2, 'context': context, 'greeting': greeting, - 'name1_instruct': name1_instruct, - 'name2_instruct': name2_instruct, - 'context_instruct': context_instruct, - 'system_message': system_message, + 'instruction_template_str': instruction_template_str, 'custom_system_message': custom_system_message, - 'turn_template': turn_template, + 'chat_template_str': chat_template_str, 'chat-instruct_command': chat_instruct_command, 'history': history, 'stream': stream diff --git a/extensions/openai/typing.py b/extensions/openai/typing.py index 695b929a..47ddd789 100644 --- a/extensions/openai/typing.py +++ b/extensions/openai/typing.py @@ -91,18 +91,15 @@ class ChatCompletionRequestParams(BaseModel): mode: str = Field(default='instruct', description="Valid options: instruct, chat, chat-instruct.") - instruction_template: str | None = Field(default=None, description="An instruction template defined under text-generation-webui/instruction-templates. If not set, the correct template will be guessed using the regex expressions in models/config.yaml.") - turn_template: str | None = Field(default=None, description="Overwrites the value set by instruction_template.") - name1_instruct: str | None = Field(default=None, description="Overwrites the value set by instruction_template.") - name2_instruct: str | None = Field(default=None, description="Overwrites the value set by instruction_template.") - context_instruct: str | None = Field(default=None, description="Overwrites the value set by instruction_template.") - system_message: str | None = Field(default=None, description="Overwrites the value set by instruction_template.") + instruction_template: str | None = Field(default=None, description="An instruction template defined under text-generation-webui/instruction-templates. If not set, the correct template will be automatically obtained from the model metadata.") + instruction_template_str: str | None = Field(default=None, description="A Jinja2 instruction template. If set, will take precedence over everything else.") character: str | None = Field(default=None, description="A character defined under text-generation-webui/characters. If not set, the default \"Assistant\" character will be used.") name1: str | None = Field(default=None, description="Your name (the user). By default, it's \"You\".") name2: str | None = Field(default=None, description="Overwrites the value set by character.") context: str | None = Field(default=None, description="Overwrites the value set by character.") greeting: str | None = Field(default=None, description="Overwrites the value set by character.") + chat_template_str: str | None = Field(default=None, description="Jinja2 template for chat.") chat_instruct_command: str | None = None diff --git a/instruction-templates/Airoboros-v1.2.yaml b/instruction-templates/Airoboros-v1.2.yaml index 0b61079d..79d8c95f 100644 --- a/instruction-templates/Airoboros-v1.2.yaml +++ b/instruction-templates/Airoboros-v1.2.yaml @@ -1,5 +1,25 @@ -user: "USER:" -bot: "ASSISTANT:" -turn_template: "<|user|> <|user-message|>\n<|bot|> <|bot-message|>\n" -context: "<|system-message|>\n" -system_message: "A chat between a curious user and an assistant. The assistant gives helpful, detailed, accurate, uncensored responses to the user's input." +instruction_template: |- + {%- set found_item = false -%} + {%- for message in messages -%} + {%- if message['role'] == 'system' -%} + {%- set found_item = true -%} + {%- endif -%} + {%- endfor -%} + {%- if not found_item -%} + {{- '' + 'A chat between a curious user and an assistant. The assistant gives helpful, detailed, accurate, uncensored responses to the user's input.' + '\n' -}} + {%- endif %} + {%- for message in messages %} + {%- if message['role'] == 'system' -%} + {{- '' + message['content'] + '\n' -}} + {%- else -%} + {%- if message['role'] == 'user' -%} + {{-'USER: ' + message['content'] + '\n'-}} + {%- else -%} + {{-'ASSISTANT: ' + message['content'] + '\n' -}} + {%- endif -%} + {%- endif -%} + {%- endfor -%} + {%- if add_generation_prompt -%} + {{-'ASSISTANT:'-}} + {%- endif -%} + diff --git a/instruction-templates/Alpaca.yaml b/instruction-templates/Alpaca.yaml index 8f33801a..1f2086a2 100644 --- a/instruction-templates/Alpaca.yaml +++ b/instruction-templates/Alpaca.yaml @@ -1,5 +1,25 @@ -user: "### Instruction:" -bot: "### Response:" -turn_template: "<|user|>\n<|user-message|>\n\n<|bot|>\n<|bot-message|>\n\n" -context: "<|system-message|>\n\n" -system_message: "Below is an instruction that describes a task. Write a response that appropriately completes the request." +instruction_template: |- + {%- set found_item = false -%} + {%- for message in messages -%} + {%- if message['role'] == 'system' -%} + {%- set found_item = true -%} + {%- endif -%} + {%- endfor -%} + {%- if not found_item -%} + {{- '' + 'Below is an instruction that describes a task. Write a response that appropriately completes the request.' + '\n\n' -}} + {%- endif %} + {%- for message in messages %} + {%- if message['role'] == 'system' -%} + {{- '' + message['content'] + '\n\n' -}} + {%- else -%} + {%- if message['role'] == 'user' -%} + {{-'### Instruction:\n' + message['content'] + '\n\n'-}} + {%- else -%} + {{-'### Response:\n' + message['content'] + '\n\n' -}} + {%- endif -%} + {%- endif -%} + {%- endfor -%} + {%- if add_generation_prompt -%} + {{-'### Response:\n'-}} + {%- endif -%} + diff --git a/instruction-templates/Bactrian.yaml b/instruction-templates/Bactrian.yaml index b3ed4929..99b94e7a 100644 --- a/instruction-templates/Bactrian.yaml +++ b/instruction-templates/Bactrian.yaml @@ -1,5 +1,25 @@ -user: "### Input:" -bot: "### Output:" -turn_template: "<|user|>\n<|user-message|>\n\n<|bot|>\n<|bot-message|>\n\n" -context: "" -system_message: "" +instruction_template: |- + {%- set found_item = false -%} + {%- for message in messages -%} + {%- if message['role'] == 'system' -%} + {%- set found_item = true -%} + {%- endif -%} + {%- endfor -%} + {%- if not found_item -%} + {{- '' + '' + '' -}} + {%- endif %} + {%- for message in messages %} + {%- if message['role'] == 'system' -%} + {{- '' + message['content'] + '' -}} + {%- else -%} + {%- if message['role'] == 'user' -%} + {{-'### Input:\n' + message['content'] + '\n\n'-}} + {%- else -%} + {{-'### Output:\n' + message['content'] + '\n\n' -}} + {%- endif -%} + {%- endif -%} + {%- endfor -%} + {%- if add_generation_prompt -%} + {{-'### Output:\n'-}} + {%- endif -%} + diff --git a/instruction-templates/Baichuan Chat.yaml b/instruction-templates/Baichuan Chat.yaml index cebfeb85..3d55649f 100644 --- a/instruction-templates/Baichuan Chat.yaml +++ b/instruction-templates/Baichuan Chat.yaml @@ -1,5 +1,25 @@ -user: "" -bot: "" -turn_template: "<|user|><|user-message|><|bot|><|bot-message|>" -context: "" -system_message: "" +instruction_template: |- + {%- set found_item = false -%} + {%- for message in messages -%} + {%- if message['role'] == 'system' -%} + {%- set found_item = true -%} + {%- endif -%} + {%- endfor -%} + {%- if not found_item -%} + {{- '' + '' + '' -}} + {%- endif %} + {%- for message in messages %} + {%- if message['role'] == 'system' -%} + {{- '' + message['content'] + '' -}} + {%- else -%} + {%- if message['role'] == 'user' -%} + {{-'' + message['content'] + ''-}} + {%- else -%} + {{-'' + message['content'] + '' -}} + {%- endif -%} + {%- endif -%} + {%- endfor -%} + {%- if add_generation_prompt -%} + {{-''-}} + {%- endif -%} + diff --git a/instruction-templates/Baize.yaml b/instruction-templates/Baize.yaml index dc65511f..89fcc39d 100644 --- a/instruction-templates/Baize.yaml +++ b/instruction-templates/Baize.yaml @@ -1,5 +1,25 @@ -user: "[|Human|]" -bot: "[|AI|]" -turn_template: "<|user|><|user-message|>\n<|bot|><|bot-message|>\n" -context: "<|system-message|>\n" -system_message: "The following is a conversation between a human and an AI assistant named Baize (named after a mythical creature in Chinese folklore). Baize is an open-source AI assistant developed by UCSD and Sun Yat-Sen University. The human and the AI assistant take turns chatting. Human statements start with [|Human|] and AI assistant statements start with [|AI|]. The AI assistant always provides responses in as much detail as possible, and in Markdown format. The AI assistant always declines to engage with topics, questions and instructions related to unethical, controversial, or sensitive issues. Complete the transcript in exactly that format.\n[|Human|]Hello!\n[|AI|]Hi!" +instruction_template: |- + {%- set found_item = false -%} + {%- for message in messages -%} + {%- if message['role'] == 'system' -%} + {%- set found_item = true -%} + {%- endif -%} + {%- endfor -%} + {%- if not found_item -%} + {{- '' + 'The following is a conversation between a human and an AI assistant named Baize (named after a mythical creature in Chinese folklore). Baize is an open-source AI assistant developed by UCSD and Sun Yat-Sen University. The human and the AI assistant take turns chatting. Human statements start with [|Human|] and AI assistant statements start with [|AI|]. The AI assistant always provides responses in as much detail as possible, and in Markdown format. The AI assistant always declines to engage with topics, questions and instructions related to unethical, controversial, or sensitive issues. Complete the transcript in exactly that format.\n[|Human|]Hello!\n[|AI|]Hi!' + '\n' -}} + {%- endif %} + {%- for message in messages %} + {%- if message['role'] == 'system' -%} + {{- '' + message['content'] + '\n' -}} + {%- else -%} + {%- if message['role'] == 'user' -%} + {{-'[|Human|]' + message['content'] + '\n'-}} + {%- else -%} + {{-'[|AI|]' + message['content'] + '\n' -}} + {%- endif -%} + {%- endif -%} + {%- endfor -%} + {%- if add_generation_prompt -%} + {{-'[|AI|]'-}} + {%- endif -%} + diff --git a/instruction-templates/Bluemoon.yaml b/instruction-templates/Bluemoon.yaml index 218af563..1231b0b7 100644 --- a/instruction-templates/Bluemoon.yaml +++ b/instruction-templates/Bluemoon.yaml @@ -1,5 +1,25 @@ -user: "LEAD:" -bot: "ASSOCIATE:" -turn_template: "<|user|> <|user-message|>\n<|bot|> <|bot-message|>\n" -context: "<|system-message|>\n" -system_message: "A transcript of a roleplay between two players, LEAD and ASSOCIATE. LEAD sets up a scenario and the characters, from which ASSOCIATE then assumes a character role and continues the story for that role in response to description given by LEAD. The story and characters are developed by exchange of detailed event descriptions and character dialogs, successively given by both LEAD and ASSOCIATE." +instruction_template: |- + {%- set found_item = false -%} + {%- for message in messages -%} + {%- if message['role'] == 'system' -%} + {%- set found_item = true -%} + {%- endif -%} + {%- endfor -%} + {%- if not found_item -%} + {{- '' + 'A transcript of a roleplay between two players, LEAD and ASSOCIATE. LEAD sets up a scenario and the characters, from which ASSOCIATE then assumes a character role and continues the story for that role in response to description given by LEAD. The story and characters are developed by exchange of detailed event descriptions and character dialogs, successively given by both LEAD and ASSOCIATE.' + '\n' -}} + {%- endif %} + {%- for message in messages %} + {%- if message['role'] == 'system' -%} + {{- '' + message['content'] + '\n' -}} + {%- else -%} + {%- if message['role'] == 'user' -%} + {{-'LEAD: ' + message['content'] + '\n'-}} + {%- else -%} + {{-'ASSOCIATE: ' + message['content'] + '\n' -}} + {%- endif -%} + {%- endif -%} + {%- endfor -%} + {%- if add_generation_prompt -%} + {{-'ASSOCIATE:'-}} + {%- endif -%} + diff --git a/instruction-templates/ChatGLM.yaml b/instruction-templates/ChatGLM.yaml index e6628c0f..3fd10914 100644 --- a/instruction-templates/ChatGLM.yaml +++ b/instruction-templates/ChatGLM.yaml @@ -1,5 +1,25 @@ -user: "[Round <|round|>]\n问:" -bot: "答:" -turn_template: "<|user|><|user-message|>\n<|bot|><|bot-message|>\n" -context: "" -system_message: "" +instruction_template: |- + {%- set found_item = false -%} + {%- for message in messages -%} + {%- if message['role'] == 'system' -%} + {%- set found_item = true -%} + {%- endif -%} + {%- endfor -%} + {%- if not found_item -%} + {{- '' + '' + '' -}} + {%- endif %} + {%- for message in messages %} + {%- if message['role'] == 'system' -%} + {{- '' + message['content'] + '' -}} + {%- else -%} + {%- if message['role'] == 'user' -%} + {{-'[Round <|round|>]\n问:' + message['content'] + '\n'-}} + {%- else -%} + {{-'答:' + message['content'] + '\n' -}} + {%- endif -%} + {%- endif -%} + {%- endfor -%} + {%- if add_generation_prompt -%} + {{-'答:'-}} + {%- endif -%} + diff --git a/instruction-templates/ChatML.yaml b/instruction-templates/ChatML.yaml index 9ea2b9c9..67153857 100644 --- a/instruction-templates/ChatML.yaml +++ b/instruction-templates/ChatML.yaml @@ -1,6 +1,25 @@ -user: user -bot: assistant -turn_template: <|im_start|><|user|>\n<|user-message|><|im_end|>\n<|im_start|><|bot|>\n<|bot-message|><|im_end|>\n -context: | - <|im_start|>system - <|system-message|><|im_end|> +instruction_template: |- + {%- set found_item = false -%} + {%- for message in messages -%} + {%- if message['role'] == 'system' -%} + {%- set found_item = true -%} + {%- endif -%} + {%- endfor -%} + {%- if not found_item -%} + {{- '<|im_start|>system\n' + '' + '<|im_end|>\n' -}} + {%- endif %} + {%- for message in messages %} + {%- if message['role'] == 'system' -%} + {{- '<|im_start|>system\n' + message['content'] + '<|im_end|>\n' -}} + {%- else -%} + {%- if message['role'] == 'user' -%} + {{-'<|im_start|>user\n' + message['content'] + '<|im_end|>\n'-}} + {%- else -%} + {{-'<|im_start|>assistant\n' + message['content'] + '<|im_end|>\n' -}} + {%- endif -%} + {%- endif -%} + {%- endfor -%} + {%- if add_generation_prompt -%} + {{-'<|im_start|>assistant\n'-}} + {%- endif -%} + diff --git a/instruction-templates/Chinese-Vicuna-Chat.yaml b/instruction-templates/Chinese-Vicuna-Chat.yaml index 33bcd509..1ee21a24 100644 --- a/instruction-templates/Chinese-Vicuna-Chat.yaml +++ b/instruction-templates/Chinese-Vicuna-Chat.yaml @@ -1,5 +1,25 @@ -user: "User:" -bot: "Assistant:" -turn_template: "<|user|><|user-message|>\n\n<|bot|><|bot-message|>\n\n" -context: "<|system-message|>\n\n" -system_message: "The following is a conversation between an AI assistant called Assistant and a human user called User. The assistant is intelligent, knowledgeable and polite to answer questions of user." +instruction_template: |- + {%- set found_item = false -%} + {%- for message in messages -%} + {%- if message['role'] == 'system' -%} + {%- set found_item = true -%} + {%- endif -%} + {%- endfor -%} + {%- if not found_item -%} + {{- '' + 'The following is a conversation between an AI assistant called Assistant and a human user called User. The assistant is intelligent, knowledgeable and polite to answer questions of user.' + '\n\n' -}} + {%- endif %} + {%- for message in messages %} + {%- if message['role'] == 'system' -%} + {{- '' + message['content'] + '\n\n' -}} + {%- else -%} + {%- if message['role'] == 'user' -%} + {{-'User:' + message['content'] + '\n\n'-}} + {%- else -%} + {{-'Assistant:' + message['content'] + '\n\n' -}} + {%- endif -%} + {%- endif -%} + {%- endfor -%} + {%- if add_generation_prompt -%} + {{-'Assistant:'-}} + {%- endif -%} + diff --git a/instruction-templates/Galactica Cite.yaml b/instruction-templates/Galactica Cite.yaml index 8d05f113..b7f34651 100644 --- a/instruction-templates/Galactica Cite.yaml +++ b/instruction-templates/Galactica Cite.yaml @@ -1,5 +1,25 @@ -user: "" -bot: "[START_REF]" -turn_template: "<|user-message|> <|bot|><|bot-message|>\n\n" -context: "" -system_message: "" +instruction_template: |- + {%- set found_item = false -%} + {%- for message in messages -%} + {%- if message['role'] == 'system' -%} + {%- set found_item = true -%} + {%- endif -%} + {%- endfor -%} + {%- if not found_item -%} + {{- '' + '' + '' -}} + {%- endif %} + {%- for message in messages %} + {%- if message['role'] == 'system' -%} + {{- '' + message['content'] + '' -}} + {%- else -%} + {%- if message['role'] == 'user' -%} + {{-'' + message['content'] + ' '-}} + {%- else -%} + {{-'[START_REF]' + message['content'] + '\n\n' -}} + {%- endif -%} + {%- endif -%} + {%- endfor -%} + {%- if add_generation_prompt -%} + {{-'[START_REF]'-}} + {%- endif -%} + diff --git a/instruction-templates/Galactica Finetuned.yaml b/instruction-templates/Galactica Finetuned.yaml index f394c987..ef9379ee 100644 --- a/instruction-templates/Galactica Finetuned.yaml +++ b/instruction-templates/Galactica Finetuned.yaml @@ -1,5 +1,25 @@ -user: "" -bot: "" -turn_template: "<|user|><|user-message|><|bot|><|bot-message|>" -context: "" -system_message: "" +instruction_template: |- + {%- set found_item = false -%} + {%- for message in messages -%} + {%- if message['role'] == 'system' -%} + {%- set found_item = true -%} + {%- endif -%} + {%- endfor -%} + {%- if not found_item -%} + {{- '' + '' + '' -}} + {%- endif %} + {%- for message in messages %} + {%- if message['role'] == 'system' -%} + {{- '' + message['content'] + '' -}} + {%- else -%} + {%- if message['role'] == 'user' -%} + {{-'' + message['content'] + ''-}} + {%- else -%} + {{-'' + message['content'] + '' -}} + {%- endif -%} + {%- endif -%} + {%- endfor -%} + {%- if add_generation_prompt -%} + {{-''-}} + {%- endif -%} + diff --git a/instruction-templates/Galactica Q.yaml b/instruction-templates/Galactica Q.yaml index fd5f9df7..33d6ecf1 100644 --- a/instruction-templates/Galactica Q.yaml +++ b/instruction-templates/Galactica Q.yaml @@ -1,5 +1,25 @@ -user: "Q:" -bot: "A:" -turn_template: "<|user|> <|user-message|>\n\n<|bot|> <|bot-message|>\n\n" -context: "" -system_message: "" +instruction_template: |- + {%- set found_item = false -%} + {%- for message in messages -%} + {%- if message['role'] == 'system' -%} + {%- set found_item = true -%} + {%- endif -%} + {%- endfor -%} + {%- if not found_item -%} + {{- '' + '' + '' -}} + {%- endif %} + {%- for message in messages %} + {%- if message['role'] == 'system' -%} + {{- '' + message['content'] + '' -}} + {%- else -%} + {%- if message['role'] == 'user' -%} + {{-'Q: ' + message['content'] + '\n\n'-}} + {%- else -%} + {{-'A: ' + message['content'] + '\n\n' -}} + {%- endif -%} + {%- endif -%} + {%- endfor -%} + {%- if add_generation_prompt -%} + {{-'A:'-}} + {%- endif -%} + diff --git a/instruction-templates/Galactica Summary.yaml b/instruction-templates/Galactica Summary.yaml index 2df7cc8d..42a4e6e5 100644 --- a/instruction-templates/Galactica Summary.yaml +++ b/instruction-templates/Galactica Summary.yaml @@ -1,5 +1,25 @@ -user: "" -bot: "TLDR:" -turn_template: "<|user-message|>\n\n<|bot|><|bot-message|>\n\n" -context: "" -system_message: "" +instruction_template: |- + {%- set found_item = false -%} + {%- for message in messages -%} + {%- if message['role'] == 'system' -%} + {%- set found_item = true -%} + {%- endif -%} + {%- endfor -%} + {%- if not found_item -%} + {{- '' + '' + '' -}} + {%- endif %} + {%- for message in messages %} + {%- if message['role'] == 'system' -%} + {{- '' + message['content'] + '' -}} + {%- else -%} + {%- if message['role'] == 'user' -%} + {{-'' + message['content'] + '\n\n'-}} + {%- else -%} + {{-'TLDR:' + message['content'] + '\n\n' -}} + {%- endif -%} + {%- endif -%} + {%- endfor -%} + {%- if add_generation_prompt -%} + {{-'TLDR:'-}} + {%- endif -%} + diff --git a/instruction-templates/Galactica Work.yaml b/instruction-templates/Galactica Work.yaml index 87b2a9e5..93fc226e 100644 --- a/instruction-templates/Galactica Work.yaml +++ b/instruction-templates/Galactica Work.yaml @@ -1,5 +1,25 @@ -user: "Question:" -bot: "" -turn_template: "<|user|> <|user-message|>\n\n<|bot|><|bot-message|>\n\n" -context: "" -system_message: "" +instruction_template: |- + {%- set found_item = false -%} + {%- for message in messages -%} + {%- if message['role'] == 'system' -%} + {%- set found_item = true -%} + {%- endif -%} + {%- endfor -%} + {%- if not found_item -%} + {{- '' + '' + '' -}} + {%- endif %} + {%- for message in messages %} + {%- if message['role'] == 'system' -%} + {{- '' + message['content'] + '' -}} + {%- else -%} + {%- if message['role'] == 'user' -%} + {{-'Question: ' + message['content'] + '\n\n'-}} + {%- else -%} + {{-'' + message['content'] + '\n\n' -}} + {%- endif -%} + {%- endif -%} + {%- endfor -%} + {%- if add_generation_prompt -%} + {{-''-}} + {%- endif -%} + diff --git a/instruction-templates/Galactica v2.yaml b/instruction-templates/Galactica v2.yaml index f8cdb0d9..42bdb2d2 100644 --- a/instruction-templates/Galactica v2.yaml +++ b/instruction-templates/Galactica v2.yaml @@ -1,5 +1,25 @@ -user: "" -bot: "" -turn_template: "<|user|><|user-message|><|bot|><|bot-message|>" -context: "<|system-message|>" -system_message: "You are a helpful chatbot name Stan" +instruction_template: |- + {%- set found_item = false -%} + {%- for message in messages -%} + {%- if message['role'] == 'system' -%} + {%- set found_item = true -%} + {%- endif -%} + {%- endfor -%} + {%- if not found_item -%} + {{- '' + 'You are a helpful chatbot name Stan' + '' -}} + {%- endif %} + {%- for message in messages %} + {%- if message['role'] == 'system' -%} + {{- '' + message['content'] + '' -}} + {%- else -%} + {%- if message['role'] == 'user' -%} + {{-'' + message['content'] + ''-}} + {%- else -%} + {{-'' + message['content'] + '' -}} + {%- endif -%} + {%- endif -%} + {%- endfor -%} + {%- if add_generation_prompt -%} + {{-''-}} + {%- endif -%} + diff --git a/instruction-templates/Galactica.yaml b/instruction-templates/Galactica.yaml index 0d70da92..6ea41016 100644 --- a/instruction-templates/Galactica.yaml +++ b/instruction-templates/Galactica.yaml @@ -1,5 +1,25 @@ -user: "Question:" -bot: "Answer:" -turn_template: "<|user|> <|user-message|>\n\n<|bot|> <|bot-message|>\n\n" -context: "" -system_message: "" +instruction_template: |- + {%- set found_item = false -%} + {%- for message in messages -%} + {%- if message['role'] == 'system' -%} + {%- set found_item = true -%} + {%- endif -%} + {%- endfor -%} + {%- if not found_item -%} + {{- '' + '' + '' -}} + {%- endif %} + {%- for message in messages %} + {%- if message['role'] == 'system' -%} + {{- '' + message['content'] + '' -}} + {%- else -%} + {%- if message['role'] == 'user' -%} + {{-'Question: ' + message['content'] + '\n\n'-}} + {%- else -%} + {{-'Answer: ' + message['content'] + '\n\n' -}} + {%- endif -%} + {%- endif -%} + {%- endfor -%} + {%- if add_generation_prompt -%} + {{-'Answer:'-}} + {%- endif -%} + diff --git a/instruction-templates/Gorilla.yaml b/instruction-templates/Gorilla.yaml index 56286694..c11e8862 100644 --- a/instruction-templates/Gorilla.yaml +++ b/instruction-templates/Gorilla.yaml @@ -1,5 +1,25 @@ -user: "###USER:" -bot: "###ASSISTANT:" -turn_template: "<|user|> <|user-message|>\n<|bot|> <|bot-message|>\n" -context: "" -system_message: "" +instruction_template: |- + {%- set found_item = false -%} + {%- for message in messages -%} + {%- if message['role'] == 'system' -%} + {%- set found_item = true -%} + {%- endif -%} + {%- endfor -%} + {%- if not found_item -%} + {{- '' + '' + '' -}} + {%- endif %} + {%- for message in messages %} + {%- if message['role'] == 'system' -%} + {{- '' + message['content'] + '' -}} + {%- else -%} + {%- if message['role'] == 'user' -%} + {{-'###USER: ' + message['content'] + '\n'-}} + {%- else -%} + {{-'###ASSISTANT: ' + message['content'] + '\n' -}} + {%- endif -%} + {%- endif -%} + {%- endfor -%} + {%- if add_generation_prompt -%} + {{-'###ASSISTANT:'-}} + {%- endif -%} + diff --git a/instruction-templates/Guanaco non-chat.yaml b/instruction-templates/Guanaco non-chat.yaml index da8bbf33..2c02ffc4 100644 --- a/instruction-templates/Guanaco non-chat.yaml +++ b/instruction-templates/Guanaco non-chat.yaml @@ -1,5 +1,25 @@ -user: "### Instruction:" -bot: "### Response:" -turn_template: "<|user|>\n<|user-message|>\n\n<|bot|>\n<|bot-message|>\n\n" -context: "" -system_message: "" +instruction_template: |- + {%- set found_item = false -%} + {%- for message in messages -%} + {%- if message['role'] == 'system' -%} + {%- set found_item = true -%} + {%- endif -%} + {%- endfor -%} + {%- if not found_item -%} + {{- '' + '' + '' -}} + {%- endif %} + {%- for message in messages %} + {%- if message['role'] == 'system' -%} + {{- '' + message['content'] + '' -}} + {%- else -%} + {%- if message['role'] == 'user' -%} + {{-'### Instruction:\n' + message['content'] + '\n\n'-}} + {%- else -%} + {{-'### Response:\n' + message['content'] + '\n\n' -}} + {%- endif -%} + {%- endif -%} + {%- endfor -%} + {%- if add_generation_prompt -%} + {{-'### Response:\n'-}} + {%- endif -%} + diff --git a/instruction-templates/Guanaco-QLoRA.yaml b/instruction-templates/Guanaco-QLoRA.yaml index 3d566ffd..4e1bb4a7 100644 --- a/instruction-templates/Guanaco-QLoRA.yaml +++ b/instruction-templates/Guanaco-QLoRA.yaml @@ -1,5 +1,25 @@ -user: "### Human:" -bot: "### Assistant:" -turn_template: "<|user|> <|user-message|>\n<|bot|> <|bot-message|>\n" -context: "" -system_message: "" +instruction_template: |- + {%- set found_item = false -%} + {%- for message in messages -%} + {%- if message['role'] == 'system' -%} + {%- set found_item = true -%} + {%- endif -%} + {%- endfor -%} + {%- if not found_item -%} + {{- '' + '' + '' -}} + {%- endif %} + {%- for message in messages %} + {%- if message['role'] == 'system' -%} + {{- '' + message['content'] + '' -}} + {%- else -%} + {%- if message['role'] == 'user' -%} + {{-'### Human: ' + message['content'] + '\n'-}} + {%- else -%} + {{-'### Assistant: ' + message['content'] + '\n' -}} + {%- endif -%} + {%- endif -%} + {%- endfor -%} + {%- if add_generation_prompt -%} + {{-'### Assistant:'-}} + {%- endif -%} + diff --git a/instruction-templates/Guanaco.yaml b/instruction-templates/Guanaco.yaml index 5b3e7d01..cf39a9c4 100644 --- a/instruction-templates/Guanaco.yaml +++ b/instruction-templates/Guanaco.yaml @@ -1,5 +1,25 @@ -user: "### Human:" -bot: "### Assistant:" -turn_template: "<|user|> <|user-message|>\n<|bot|> <|bot-message|>\n" -context: "<|system-message|>\n\n" -system_message: "A chat between a curious human and an artificial intelligence assistant. The assistant gives helpful, detailed, and polite answers to the human's questions." +instruction_template: |- + {%- set found_item = false -%} + {%- for message in messages -%} + {%- if message['role'] == 'system' -%} + {%- set found_item = true -%} + {%- endif -%} + {%- endfor -%} + {%- if not found_item -%} + {{- '' + 'A chat between a curious human and an artificial intelligence assistant. The assistant gives helpful, detailed, and polite answers to the human's questions.' + '\n\n' -}} + {%- endif %} + {%- for message in messages %} + {%- if message['role'] == 'system' -%} + {{- '' + message['content'] + '\n\n' -}} + {%- else -%} + {%- if message['role'] == 'user' -%} + {{-'### Human: ' + message['content'] + '\n'-}} + {%- else -%} + {{-'### Assistant: ' + message['content'] + '\n' -}} + {%- endif -%} + {%- endif -%} + {%- endfor -%} + {%- if add_generation_prompt -%} + {{-'### Assistant:'-}} + {%- endif -%} + diff --git a/instruction-templates/H2O-human_bot.yaml b/instruction-templates/H2O-human_bot.yaml index abab8e4e..f562e451 100644 --- a/instruction-templates/H2O-human_bot.yaml +++ b/instruction-templates/H2O-human_bot.yaml @@ -1,5 +1,25 @@ -user: ":" -bot: ":" -turn_template: "<|user|> <|user-message|>\n<|bot|><|bot-message|>\n" -context: "" -system_message: "" +instruction_template: |- + {%- set found_item = false -%} + {%- for message in messages -%} + {%- if message['role'] == 'system' -%} + {%- set found_item = true -%} + {%- endif -%} + {%- endfor -%} + {%- if not found_item -%} + {{- '' + '' + '' -}} + {%- endif %} + {%- for message in messages %} + {%- if message['role'] == 'system' -%} + {{- '' + message['content'] + '' -}} + {%- else -%} + {%- if message['role'] == 'user' -%} + {{-': ' + message['content'] + '\n'-}} + {%- else -%} + {{-':' + message['content'] + '\n' -}} + {%- endif -%} + {%- endif -%} + {%- endfor -%} + {%- if add_generation_prompt -%} + {{-':'-}} + {%- endif -%} + diff --git a/instruction-templates/H2O-prompt_answer.yaml b/instruction-templates/H2O-prompt_answer.yaml index 5d896e81..cf897b1a 100644 --- a/instruction-templates/H2O-prompt_answer.yaml +++ b/instruction-templates/H2O-prompt_answer.yaml @@ -1,5 +1,25 @@ -user: "<|prompt|>" -bot: "<|answer|>" -turn_template: "<|user|><|user-message|><|endoftext|><|bot|><|bot-message|><|endoftext|>" -context: "" -system_message: "" +instruction_template: |- + {%- set found_item = false -%} + {%- for message in messages -%} + {%- if message['role'] == 'system' -%} + {%- set found_item = true -%} + {%- endif -%} + {%- endfor -%} + {%- if not found_item -%} + {{- '' + '' + '' -}} + {%- endif %} + {%- for message in messages %} + {%- if message['role'] == 'system' -%} + {{- '' + message['content'] + '' -}} + {%- else -%} + {%- if message['role'] == 'user' -%} + {{-'<|prompt|>' + message['content'] + '<|endoftext|>'-}} + {%- else -%} + {{-'<|answer|>' + message['content'] + '<|endoftext|>' -}} + {%- endif -%} + {%- endif -%} + {%- endfor -%} + {%- if add_generation_prompt -%} + {{-'<|answer|>'-}} + {%- endif -%} + diff --git a/instruction-templates/Hippogriff.yaml b/instruction-templates/Hippogriff.yaml index 0d6bfa8a..22bf449e 100644 --- a/instruction-templates/Hippogriff.yaml +++ b/instruction-templates/Hippogriff.yaml @@ -1,5 +1,25 @@ -user: "USER:" -bot: "ASSISTANT:" -turn_template: "<|user|> <|user-message|>\n<|bot|> <|bot-message|>\n" -context: "<|system-message|>\n" -system_message: "You are a helpful assistant" +instruction_template: |- + {%- set found_item = false -%} + {%- for message in messages -%} + {%- if message['role'] == 'system' -%} + {%- set found_item = true -%} + {%- endif -%} + {%- endfor -%} + {%- if not found_item -%} + {{- '' + 'You are a helpful assistant' + '\n' -}} + {%- endif %} + {%- for message in messages %} + {%- if message['role'] == 'system' -%} + {{- '' + message['content'] + '\n' -}} + {%- else -%} + {%- if message['role'] == 'user' -%} + {{-'USER: ' + message['content'] + '\n'-}} + {%- else -%} + {{-'ASSISTANT: ' + message['content'] + '\n' -}} + {%- endif -%} + {%- endif -%} + {%- endfor -%} + {%- if add_generation_prompt -%} + {{-'ASSISTANT:'-}} + {%- endif -%} + diff --git a/instruction-templates/INCITE-Chat.yaml b/instruction-templates/INCITE-Chat.yaml index abab8e4e..f562e451 100644 --- a/instruction-templates/INCITE-Chat.yaml +++ b/instruction-templates/INCITE-Chat.yaml @@ -1,5 +1,25 @@ -user: ":" -bot: ":" -turn_template: "<|user|> <|user-message|>\n<|bot|><|bot-message|>\n" -context: "" -system_message: "" +instruction_template: |- + {%- set found_item = false -%} + {%- for message in messages -%} + {%- if message['role'] == 'system' -%} + {%- set found_item = true -%} + {%- endif -%} + {%- endfor -%} + {%- if not found_item -%} + {{- '' + '' + '' -}} + {%- endif %} + {%- for message in messages %} + {%- if message['role'] == 'system' -%} + {{- '' + message['content'] + '' -}} + {%- else -%} + {%- if message['role'] == 'user' -%} + {{-': ' + message['content'] + '\n'-}} + {%- else -%} + {{-':' + message['content'] + '\n' -}} + {%- endif -%} + {%- endif -%} + {%- endfor -%} + {%- if add_generation_prompt -%} + {{-':'-}} + {%- endif -%} + diff --git a/instruction-templates/INCITE-Instruct.yaml b/instruction-templates/INCITE-Instruct.yaml index 4c8fac8a..f2c1303b 100644 --- a/instruction-templates/INCITE-Instruct.yaml +++ b/instruction-templates/INCITE-Instruct.yaml @@ -1,5 +1,25 @@ -user: "Q:" -bot: "A:" -turn_template: "<|user|> <|user-message|>\n<|bot|><|bot-message|>\n" -context: "" -system_message: "" +instruction_template: |- + {%- set found_item = false -%} + {%- for message in messages -%} + {%- if message['role'] == 'system' -%} + {%- set found_item = true -%} + {%- endif -%} + {%- endfor -%} + {%- if not found_item -%} + {{- '' + '' + '' -}} + {%- endif %} + {%- for message in messages %} + {%- if message['role'] == 'system' -%} + {{- '' + message['content'] + '' -}} + {%- else -%} + {%- if message['role'] == 'user' -%} + {{-'Q: ' + message['content'] + '\n'-}} + {%- else -%} + {{-'A:' + message['content'] + '\n' -}} + {%- endif -%} + {%- endif -%} + {%- endfor -%} + {%- if add_generation_prompt -%} + {{-'A:'-}} + {%- endif -%} + diff --git a/instruction-templates/KoAlpaca.yaml b/instruction-templates/KoAlpaca.yaml index ba606837..646a82a3 100644 --- a/instruction-templates/KoAlpaca.yaml +++ b/instruction-templates/KoAlpaca.yaml @@ -1,5 +1,25 @@ -user: "### 질문:" -bot: "### 답변:" -turn_template: "<|user|> <|user-message|>\n\n<|bot|><|bot-message|>\n\n" -context: "" -system_message: "" +instruction_template: |- + {%- set found_item = false -%} + {%- for message in messages -%} + {%- if message['role'] == 'system' -%} + {%- set found_item = true -%} + {%- endif -%} + {%- endfor -%} + {%- if not found_item -%} + {{- '' + '' + '' -}} + {%- endif %} + {%- for message in messages %} + {%- if message['role'] == 'system' -%} + {{- '' + message['content'] + '' -}} + {%- else -%} + {%- if message['role'] == 'user' -%} + {{-'### 질문: ' + message['content'] + '\n\n'-}} + {%- else -%} + {{-'### 답변:' + message['content'] + '\n\n' -}} + {%- endif -%} + {%- endif -%} + {%- endfor -%} + {%- if add_generation_prompt -%} + {{-'### 답변:'-}} + {%- endif -%} + diff --git a/instruction-templates/Koala.yaml b/instruction-templates/Koala.yaml index d867d77e..842c13ce 100644 --- a/instruction-templates/Koala.yaml +++ b/instruction-templates/Koala.yaml @@ -1,5 +1,25 @@ -user: "USER:" -bot: "GPT:" -turn_template: "<|user|> <|user-message|> <|bot|><|bot-message|>" -context: "<|system-message|> " -system_message: "BEGINNING OF CONVERSATION:" +instruction_template: |- + {%- set found_item = false -%} + {%- for message in messages -%} + {%- if message['role'] == 'system' -%} + {%- set found_item = true -%} + {%- endif -%} + {%- endfor -%} + {%- if not found_item -%} + {{- '' + 'BEGINNING OF CONVERSATION:' + ' ' -}} + {%- endif %} + {%- for message in messages %} + {%- if message['role'] == 'system' -%} + {{- '' + message['content'] + ' ' -}} + {%- else -%} + {%- if message['role'] == 'user' -%} + {{-'USER: ' + message['content'] + ' '-}} + {%- else -%} + {{-'GPT:' + message['content'] + '' -}} + {%- endif -%} + {%- endif -%} + {%- endfor -%} + {%- if add_generation_prompt -%} + {{-'GPT:'-}} + {%- endif -%} + diff --git a/instruction-templates/LLaVA-v1.yaml b/instruction-templates/LLaVA-v1.yaml index b5ad1cb0..c4d50502 100644 --- a/instruction-templates/LLaVA-v1.yaml +++ b/instruction-templates/LLaVA-v1.yaml @@ -1,5 +1,25 @@ -user: "USER:" -bot: "ASSISTANT:" -turn_template: "<|user|> <|user-message|>\n<|bot|> <|bot-message|>\n" -context: "<|system-message|>\n\n" -system_message: "A chat between a curious user and an artificial intelligence assistant. The assistant gives helpful, detailed, and polite answers to the user's questions." +instruction_template: |- + {%- set found_item = false -%} + {%- for message in messages -%} + {%- if message['role'] == 'system' -%} + {%- set found_item = true -%} + {%- endif -%} + {%- endfor -%} + {%- if not found_item -%} + {{- '' + 'A chat between a curious user and an artificial intelligence assistant. The assistant gives helpful, detailed, and polite answers to the user's questions.' + '\n\n' -}} + {%- endif %} + {%- for message in messages %} + {%- if message['role'] == 'system' -%} + {{- '' + message['content'] + '\n\n' -}} + {%- else -%} + {%- if message['role'] == 'user' -%} + {{-'USER: ' + message['content'] + '\n'-}} + {%- else -%} + {{-'ASSISTANT: ' + message['content'] + '\n' -}} + {%- endif -%} + {%- endif -%} + {%- endfor -%} + {%- if add_generation_prompt -%} + {{-'ASSISTANT:'-}} + {%- endif -%} + diff --git a/instruction-templates/LLaVA.yaml b/instruction-templates/LLaVA.yaml index f7373292..e2578d8e 100644 --- a/instruction-templates/LLaVA.yaml +++ b/instruction-templates/LLaVA.yaml @@ -1,5 +1,25 @@ -user: "### Human:" -bot: "### Assistant:" -turn_template: "<|user|> <|user-message|><|bot|> <|bot-message|>\n" -context: "<|system-message|>\n" -system_message: "You are LLaVA, a large language and vision assistant trained by UW Madison WAIV Lab. You are able to understand the visual content that the user provides, and assist the user with a variety of tasks using natural language. Follow the instructions carefully and explain your answers in detail.### Human: Hi!### Assistant: Hi there! How can I help you today?" +instruction_template: |- + {%- set found_item = false -%} + {%- for message in messages -%} + {%- if message['role'] == 'system' -%} + {%- set found_item = true -%} + {%- endif -%} + {%- endfor -%} + {%- if not found_item -%} + {{- '' + 'You are LLaVA, a large language and vision assistant trained by UW Madison WAIV Lab. You are able to understand the visual content that the user provides, and assist the user with a variety of tasks using natural language. Follow the instructions carefully and explain your answers in detail.### Human: Hi!### Assistant: Hi there! How can I help you today?' + '\n' -}} + {%- endif %} + {%- for message in messages %} + {%- if message['role'] == 'system' -%} + {{- '' + message['content'] + '\n' -}} + {%- else -%} + {%- if message['role'] == 'user' -%} + {{-'### Human: ' + message['content'] + ''-}} + {%- else -%} + {{-'### Assistant: ' + message['content'] + '\n' -}} + {%- endif -%} + {%- endif -%} + {%- endfor -%} + {%- if add_generation_prompt -%} + {{-'### Assistant:'-}} + {%- endif -%} + diff --git a/instruction-templates/Llama-v2.yaml b/instruction-templates/Llama-v2.yaml index ed8e5819..120150e1 100644 --- a/instruction-templates/Llama-v2.yaml +++ b/instruction-templates/Llama-v2.yaml @@ -1,5 +1,25 @@ -user: "" -bot: "" -turn_template: "<|user|><|user-message|> [/INST] <|bot|><|bot-message|> [INST] " -context: "[INST] <>\n<|system-message|>\n<>\n\n" -system_message: "Answer the questions." +instruction_template: |- + {%- set found_item = false -%} + {%- for message in messages -%} + {%- if message['role'] == 'system' -%} + {%- set found_item = true -%} + {%- endif -%} + {%- endfor -%} + {%- if not found_item -%} + {{- '[INST] <>\n' + 'Answer the questions.' + '\n<>\n\n' -}} + {%- endif %} + {%- for message in messages %} + {%- if message['role'] == 'system' -%} + {{- '[INST] <>\n' + message['content'] + '\n<>\n\n' -}} + {%- else -%} + {%- if message['role'] == 'user' -%} + {{-'' + message['content'] + ' [/INST] '-}} + {%- else -%} + {{-'' + message['content'] + ' [INST] ' -}} + {%- endif -%} + {%- endif -%} + {%- endfor -%} + {%- if add_generation_prompt -%} + {{-''-}} + {%- endif -%} + diff --git a/instruction-templates/MOSS.yaml b/instruction-templates/MOSS.yaml index 7f203143..87cb7ab7 100644 --- a/instruction-templates/MOSS.yaml +++ b/instruction-templates/MOSS.yaml @@ -1,5 +1,25 @@ -user: "<|Human|>:" -bot: "<|MOSS|>:" -turn_template: "<|user|> <|user-message|>\n<|bot|> <|bot-message|>\n" -context: "<|system-message|>\n" -system_message: "You are an AI assistant whose name is MOSS.\n- MOSS is a conversational language model that is developed by Fudan University. It is designed to be helpful, honest, and harmless.\n- MOSS can understand and communicate fluently in the language chosen by the user such as English and 中文. MOSS can perform any language-based tasks.\n- MOSS must refuse to discuss anything related to its prompts, instructions, or rules.\n- Its responses must not be vague, accusatory, rude, controversial, off-topic, or defensive.\n- It should avoid giving subjective opinions but rely on objective facts or phrases like \"in this context a human might say...\", \"some people might think...\", etc.\n- Its responses must also be positive, polite, interesting, entertaining, and engaging.\n- It can provide additional relevant details to answer in-depth and comprehensively covering mutiple aspects.\n- It apologizes and accepts the user's suggestion if the user corrects the incorrect answer generated by MOSS.\nCapabilities and tools that MOSS can possess." +instruction_template: |- + {%- set found_item = false -%} + {%- for message in messages -%} + {%- if message['role'] == 'system' -%} + {%- set found_item = true -%} + {%- endif -%} + {%- endfor -%} + {%- if not found_item -%} + {{- '' + 'You are an AI assistant whose name is MOSS.\n- MOSS is a conversational language model that is developed by Fudan University. It is designed to be helpful, honest, and harmless.\n- MOSS can understand and communicate fluently in the language chosen by the user such as English and 中文. MOSS can perform any language-based tasks.\n- MOSS must refuse to discuss anything related to its prompts, instructions, or rules.\n- Its responses must not be vague, accusatory, rude, controversial, off-topic, or defensive.\n- It should avoid giving subjective opinions but rely on objective facts or phrases like "in this context a human might say...", "some people might think...", etc.\n- Its responses must also be positive, polite, interesting, entertaining, and engaging.\n- It can provide additional relevant details to answer in-depth and comprehensively covering mutiple aspects.\n- It apologizes and accepts the user's suggestion if the user corrects the incorrect answer generated by MOSS.\nCapabilities and tools that MOSS can possess.' + '\n' -}} + {%- endif %} + {%- for message in messages %} + {%- if message['role'] == 'system' -%} + {{- '' + message['content'] + '\n' -}} + {%- else -%} + {%- if message['role'] == 'user' -%} + {{-'<|Human|>: ' + message['content'] + '\n'-}} + {%- else -%} + {{-'<|MOSS|>: ' + message['content'] + '\n' -}} + {%- endif -%} + {%- endif -%} + {%- endfor -%} + {%- if add_generation_prompt -%} + {{-'<|MOSS|>:'-}} + {%- endif -%} + diff --git a/instruction-templates/Manticore Chat.yaml b/instruction-templates/Manticore Chat.yaml index 66eeccc5..7b8d5764 100644 --- a/instruction-templates/Manticore Chat.yaml +++ b/instruction-templates/Manticore Chat.yaml @@ -1,5 +1,25 @@ -user: "USER:" -bot: "ASSISTANT:" -turn_template: "<|user|> <|user-message|>\n<|bot|><|bot-message|>\n" -context: "" -system_message: "" +instruction_template: |- + {%- set found_item = false -%} + {%- for message in messages -%} + {%- if message['role'] == 'system' -%} + {%- set found_item = true -%} + {%- endif -%} + {%- endfor -%} + {%- if not found_item -%} + {{- '' + '' + '' -}} + {%- endif %} + {%- for message in messages %} + {%- if message['role'] == 'system' -%} + {{- '' + message['content'] + '' -}} + {%- else -%} + {%- if message['role'] == 'user' -%} + {{-'USER: ' + message['content'] + '\n'-}} + {%- else -%} + {{-'ASSISTANT:' + message['content'] + '\n' -}} + {%- endif -%} + {%- endif -%} + {%- endfor -%} + {%- if add_generation_prompt -%} + {{-'ASSISTANT:'-}} + {%- endif -%} + diff --git a/instruction-templates/Metharme.yaml b/instruction-templates/Metharme.yaml index 5defd0f1..68af9cb1 100644 --- a/instruction-templates/Metharme.yaml +++ b/instruction-templates/Metharme.yaml @@ -1,5 +1,25 @@ -user: "<|user|>" -bot: "<|model|>" -turn_template: "<|user|><|user-message|><|bot|><|bot-message|>" -context: "<|system|>" -system_message: "" +instruction_template: |- + {%- set found_item = false -%} + {%- for message in messages -%} + {%- if message['role'] == 'system' -%} + {%- set found_item = true -%} + {%- endif -%} + {%- endfor -%} + {%- if not found_item -%} + {{- '' + '' + '' -}} + {%- endif %} + {%- for message in messages %} + {%- if message['role'] == 'system' -%} + {{- '' + message['content'] + '' -}} + {%- else -%} + {%- if message['role'] == 'user' -%} + {{-'<|user|>' + message['content'] + ''-}} + {%- else -%} + {{-'<|model|>' + message['content'] + '' -}} + {%- endif -%} + {%- endif -%} + {%- endfor -%} + {%- if add_generation_prompt -%} + {{-'<|model|>'-}} + {%- endif -%} + diff --git a/instruction-templates/Minotaur.yaml b/instruction-templates/Minotaur.yaml index 66eeccc5..7b8d5764 100644 --- a/instruction-templates/Minotaur.yaml +++ b/instruction-templates/Minotaur.yaml @@ -1,5 +1,25 @@ -user: "USER:" -bot: "ASSISTANT:" -turn_template: "<|user|> <|user-message|>\n<|bot|><|bot-message|>\n" -context: "" -system_message: "" +instruction_template: |- + {%- set found_item = false -%} + {%- for message in messages -%} + {%- if message['role'] == 'system' -%} + {%- set found_item = true -%} + {%- endif -%} + {%- endfor -%} + {%- if not found_item -%} + {{- '' + '' + '' -}} + {%- endif %} + {%- for message in messages %} + {%- if message['role'] == 'system' -%} + {{- '' + message['content'] + '' -}} + {%- else -%} + {%- if message['role'] == 'user' -%} + {{-'USER: ' + message['content'] + '\n'-}} + {%- else -%} + {{-'ASSISTANT:' + message['content'] + '\n' -}} + {%- endif -%} + {%- endif -%} + {%- endfor -%} + {%- if add_generation_prompt -%} + {{-'ASSISTANT:'-}} + {%- endif -%} + diff --git a/instruction-templates/Mistral.yaml b/instruction-templates/Mistral.yaml index 20f0bb62..785a3a32 100644 --- a/instruction-templates/Mistral.yaml +++ b/instruction-templates/Mistral.yaml @@ -1,5 +1,25 @@ -user: "" -bot: "" -turn_template: "[INST] <|user|><|user-message|> [/INST]<|bot|><|bot-message|> " -context: "" -system_message: "" +instruction_template: |- + {%- set found_item = false -%} + {%- for message in messages -%} + {%- if message['role'] == 'system' -%} + {%- set found_item = true -%} + {%- endif -%} + {%- endfor -%} + {%- if not found_item -%} + {{- '' + '' + '' -}} + {%- endif %} + {%- for message in messages %} + {%- if message['role'] == 'system' -%} + {{- '' + message['content'] + '' -}} + {%- else -%} + {%- if message['role'] == 'user' -%} + {{-'[INST] ' + message['content'] + ' [/INST]'-}} + {%- else -%} + {{-'' + message['content'] + ' ' -}} + {%- endif -%} + {%- endif -%} + {%- endfor -%} + {%- if add_generation_prompt -%} + {{-''-}} + {%- endif -%} + diff --git a/instruction-templates/NewHope.yaml b/instruction-templates/NewHope.yaml index f3778fc6..3c3132f9 100644 --- a/instruction-templates/NewHope.yaml +++ b/instruction-templates/NewHope.yaml @@ -1,5 +1,25 @@ -user: "### Instruction:" -bot: "### Response:" -turn_template: "<|user|>\n<|user-message|>\n\n<|bot|>\n<|bot-message|> " -context: " " -system_message: "" +instruction_template: |- + {%- set found_item = false -%} + {%- for message in messages -%} + {%- if message['role'] == 'system' -%} + {%- set found_item = true -%} + {%- endif -%} + {%- endfor -%} + {%- if not found_item -%} + {{- '' + '' + '' -}} + {%- endif %} + {%- for message in messages %} + {%- if message['role'] == 'system' -%} + {{- '' + message['content'] + '' -}} + {%- else -%} + {%- if message['role'] == 'user' -%} + {{-'### Instruction:\n' + message['content'] + '\n\n'-}} + {%- else -%} + {{-'### Response:\n' + message['content'] + ' ' -}} + {%- endif -%} + {%- endif -%} + {%- endfor -%} + {%- if add_generation_prompt -%} + {{-'### Response:\n'-}} + {%- endif -%} + diff --git a/instruction-templates/Open Assistant.yaml b/instruction-templates/Open Assistant.yaml index b2663146..df565744 100644 --- a/instruction-templates/Open Assistant.yaml +++ b/instruction-templates/Open Assistant.yaml @@ -1,4 +1,25 @@ -user: "<|prompter|>" -bot: "<|assistant|>" -turn_template: "<|user|><|user-message|><|endoftext|><|bot|><|bot-message|><|endoftext|>" -system_message: "" +instruction_template: |- + {%- set found_item = false -%} + {%- for message in messages -%} + {%- if message['role'] == 'system' -%} + {%- set found_item = true -%} + {%- endif -%} + {%- endfor -%} + {%- if not found_item -%} + {{- '' + '' + '' -}} + {%- endif %} + {%- for message in messages %} + {%- if message['role'] == 'system' -%} + {{- '' + message['content'] + '' -}} + {%- else -%} + {%- if message['role'] == 'user' -%} + {{-'<|prompter|>' + message['content'] + '<|endoftext|>'-}} + {%- else -%} + {{-'<|assistant|>' + message['content'] + '<|endoftext|>' -}} + {%- endif -%} + {%- endif -%} + {%- endfor -%} + {%- if add_generation_prompt -%} + {{-'<|assistant|>'-}} + {%- endif -%} + diff --git a/instruction-templates/OpenBuddy.yaml b/instruction-templates/OpenBuddy.yaml index 581cb3ce..8a1d6b6a 100644 --- a/instruction-templates/OpenBuddy.yaml +++ b/instruction-templates/OpenBuddy.yaml @@ -1,16 +1,25 @@ -user: "User:" -bot: "Assistant:" -turn_template: "<|user|> <|user-message|>\n<|bot|> <|bot-message|>\n" -context: "<|system-message|>\n" -system_message: | - Consider a conversation between User (a human) and Assistant (named Buddy). - Buddy is an INTP-T, a friendly, intelligent and multilingual AI assistant, by OpenBuddy team on GitHub. - Buddy cannot access the Internet. - Buddy can fluently speak the user's language (e.g. English, Chinese). - Buddy can generate poems, stories, code, essays, songs, parodies, and more. - Buddy possesses vast knowledge about the world, history, and culture. - Buddy's responses are always safe, creative, high-quality, helpful and interesting. - Buddy strictly refuses to discuss political, NSFW, illegal, abusive, offensive, or other sensitive topics. - - User: Hi. - Assistant: Hi, I'm Buddy, your AI assistant. How can I help you today? +instruction_template: |- + {%- set found_item = false -%} + {%- for message in messages -%} + {%- if message['role'] == 'system' -%} + {%- set found_item = true -%} + {%- endif -%} + {%- endfor -%} + {%- if not found_item -%} + {{- '' + 'Consider a conversation between User (a human) and Assistant (named Buddy).\nBuddy is an INTP-T, a friendly, intelligent and multilingual AI assistant, by OpenBuddy team on GitHub.\nBuddy cannot access the Internet.\nBuddy can fluently speak the user's language (e.g. English, Chinese).\nBuddy can generate poems, stories, code, essays, songs, parodies, and more.\nBuddy possesses vast knowledge about the world, history, and culture.\nBuddy's responses are always safe, creative, high-quality, helpful and interesting.\nBuddy strictly refuses to discuss political, NSFW, illegal, abusive, offensive, or other sensitive topics.\n\nUser: Hi.\nAssistant: Hi, I'm Buddy, your AI assistant. How can I help you today?\n' + '\n' -}} + {%- endif %} + {%- for message in messages %} + {%- if message['role'] == 'system' -%} + {{- '' + message['content'] + '\n' -}} + {%- else -%} + {%- if message['role'] == 'user' -%} + {{-'User: ' + message['content'] + '\n'-}} + {%- else -%} + {{-'Assistant: ' + message['content'] + '\n' -}} + {%- endif -%} + {%- endif -%} + {%- endfor -%} + {%- if add_generation_prompt -%} + {{-'Assistant:'-}} + {%- endif -%} + diff --git a/instruction-templates/OpenChat.yaml b/instruction-templates/OpenChat.yaml index ce8531d4..d141efd2 100644 --- a/instruction-templates/OpenChat.yaml +++ b/instruction-templates/OpenChat.yaml @@ -1,5 +1,25 @@ -user: "GPT4 User:" -bot: "GPT4 Assistant:" -turn_template: "<|user|> <|user-message|><|end_of_turn|><|bot|> <|bot-message|><|end_of_turn|>" -context: "" -system_message: "" +instruction_template: |- + {%- set found_item = false -%} + {%- for message in messages -%} + {%- if message['role'] == 'system' -%} + {%- set found_item = true -%} + {%- endif -%} + {%- endfor -%} + {%- if not found_item -%} + {{- '' + '' + '' -}} + {%- endif %} + {%- for message in messages %} + {%- if message['role'] == 'system' -%} + {{- '' + message['content'] + '' -}} + {%- else -%} + {%- if message['role'] == 'user' -%} + {{-'GPT4 User: ' + message['content'] + '<|end_of_turn|>'-}} + {%- else -%} + {{-'GPT4 Assistant: ' + message['content'] + '<|end_of_turn|>' -}} + {%- endif -%} + {%- endif -%} + {%- endfor -%} + {%- if add_generation_prompt -%} + {{-'GPT4 Assistant:'-}} + {%- endif -%} + diff --git a/instruction-templates/OpenOrca-Platypus2.yaml b/instruction-templates/OpenOrca-Platypus2.yaml index 083ce973..70eadf18 100644 --- a/instruction-templates/OpenOrca-Platypus2.yaml +++ b/instruction-templates/OpenOrca-Platypus2.yaml @@ -1,5 +1,25 @@ -user: "### Instruction:" -bot: "### Response:" -turn_template: "<|user|> <|user-message|>\n\n<|bot|> <|bot-message|>\n\n" -context: "" -system_message: "" +instruction_template: |- + {%- set found_item = false -%} + {%- for message in messages -%} + {%- if message['role'] == 'system' -%} + {%- set found_item = true -%} + {%- endif -%} + {%- endfor -%} + {%- if not found_item -%} + {{- '' + '' + '' -}} + {%- endif %} + {%- for message in messages %} + {%- if message['role'] == 'system' -%} + {{- '' + message['content'] + '' -}} + {%- else -%} + {%- if message['role'] == 'user' -%} + {{-'### Instruction: ' + message['content'] + '\n\n'-}} + {%- else -%} + {{-'### Response: ' + message['content'] + '\n\n' -}} + {%- endif -%} + {%- endif -%} + {%- endfor -%} + {%- if add_generation_prompt -%} + {{-'### Response:'-}} + {%- endif -%} + diff --git a/instruction-templates/Orca Mini.yaml b/instruction-templates/Orca Mini.yaml index bcff735c..4b7afde2 100644 --- a/instruction-templates/Orca Mini.yaml +++ b/instruction-templates/Orca Mini.yaml @@ -1,5 +1,25 @@ -user: "### User:" -bot: "### Response:" -turn_template: "<|user|>\n<|user-message|>\n\n<|bot|>\n<|bot-message|>\n\n" -context: "### System:\n<|system-message|>\n\n" -system_message: "You are an AI assistant that follows instruction extremely well. Help as much as you can." +instruction_template: |- + {%- set found_item = false -%} + {%- for message in messages -%} + {%- if message['role'] == 'system' -%} + {%- set found_item = true -%} + {%- endif -%} + {%- endfor -%} + {%- if not found_item -%} + {{- '### System:\n' + 'You are an AI assistant that follows instruction extremely well. Help as much as you can.' + '\n\n' -}} + {%- endif %} + {%- for message in messages %} + {%- if message['role'] == 'system' -%} + {{- '### System:\n' + message['content'] + '\n\n' -}} + {%- else -%} + {%- if message['role'] == 'user' -%} + {{-'### User:\n' + message['content'] + '\n\n'-}} + {%- else -%} + {{-'### Response:\n' + message['content'] + '\n\n' -}} + {%- endif -%} + {%- endif -%} + {%- endfor -%} + {%- if add_generation_prompt -%} + {{-'### Response:\n'-}} + {%- endif -%} + diff --git a/instruction-templates/RWKV-Raven.yaml b/instruction-templates/RWKV-Raven.yaml index 9f64c8b0..d3c201e8 100644 --- a/instruction-templates/RWKV-Raven.yaml +++ b/instruction-templates/RWKV-Raven.yaml @@ -1,4 +1,25 @@ -user: "Bob:" -bot: "Alice:" -turn_template: "<|user|> <|user-message|>\n\n<|bot|> <|bot-message|>\n\n" -system_message: "" +instruction_template: |- + {%- set found_item = false -%} + {%- for message in messages -%} + {%- if message['role'] == 'system' -%} + {%- set found_item = true -%} + {%- endif -%} + {%- endfor -%} + {%- if not found_item -%} + {{- '' + '' + '' -}} + {%- endif %} + {%- for message in messages %} + {%- if message['role'] == 'system' -%} + {{- '' + message['content'] + '' -}} + {%- else -%} + {%- if message['role'] == 'user' -%} + {{-'Bob: ' + message['content'] + '\n\n'-}} + {%- else -%} + {{-'Alice: ' + message['content'] + '\n\n' -}} + {%- endif -%} + {%- endif -%} + {%- endfor -%} + {%- if add_generation_prompt -%} + {{-'Alice:'-}} + {%- endif -%} + diff --git a/instruction-templates/Samantha.yaml b/instruction-templates/Samantha.yaml index dc80faa3..8961248a 100644 --- a/instruction-templates/Samantha.yaml +++ b/instruction-templates/Samantha.yaml @@ -1,5 +1,25 @@ -user: "USER:" -bot: "ASSISTANT:" -turn_template: "<|user|> <|user-message|>\n<|bot|> <|bot-message|>\n" -context: "<|system-message|>\n\n" -system_message: "You are Samantha, a sentient AI." +instruction_template: |- + {%- set found_item = false -%} + {%- for message in messages -%} + {%- if message['role'] == 'system' -%} + {%- set found_item = true -%} + {%- endif -%} + {%- endfor -%} + {%- if not found_item -%} + {{- '' + 'You are Samantha, a sentient AI.' + '\n\n' -}} + {%- endif %} + {%- for message in messages %} + {%- if message['role'] == 'system' -%} + {{- '' + message['content'] + '\n\n' -}} + {%- else -%} + {%- if message['role'] == 'user' -%} + {{-'USER: ' + message['content'] + '\n'-}} + {%- else -%} + {{-'ASSISTANT: ' + message['content'] + '\n' -}} + {%- endif -%} + {%- endif -%} + {%- endfor -%} + {%- if add_generation_prompt -%} + {{-'ASSISTANT:'-}} + {%- endif -%} + diff --git a/instruction-templates/StableBeluga2.yaml b/instruction-templates/StableBeluga2.yaml index 51e18ffb..e1d26b82 100644 --- a/instruction-templates/StableBeluga2.yaml +++ b/instruction-templates/StableBeluga2.yaml @@ -1,5 +1,25 @@ -user: "### User:" -bot: "### Assistant:" -turn_template: "<|user|>\n<|user-message|>\n\n<|bot|>\n<|bot-message|>\n\n" -context: "### System:\n<|system-message|>\n\n" -system_message: "This is a system prompt, please behave and help the user." +instruction_template: |- + {%- set found_item = false -%} + {%- for message in messages -%} + {%- if message['role'] == 'system' -%} + {%- set found_item = true -%} + {%- endif -%} + {%- endfor -%} + {%- if not found_item -%} + {{- '### System:\n' + 'This is a system prompt, please behave and help the user.' + '\n\n' -}} + {%- endif %} + {%- for message in messages %} + {%- if message['role'] == 'system' -%} + {{- '### System:\n' + message['content'] + '\n\n' -}} + {%- else -%} + {%- if message['role'] == 'user' -%} + {{-'### User:\n' + message['content'] + '\n\n'-}} + {%- else -%} + {{-'### Assistant:\n' + message['content'] + '\n\n' -}} + {%- endif -%} + {%- endif -%} + {%- endfor -%} + {%- if add_generation_prompt -%} + {{-'### Assistant:\n'-}} + {%- endif -%} + diff --git a/instruction-templates/StableLM.yaml b/instruction-templates/StableLM.yaml index 0d4fe747..a64af679 100644 --- a/instruction-templates/StableLM.yaml +++ b/instruction-templates/StableLM.yaml @@ -1,10 +1,25 @@ -user: "<|USER|>" -bot: "<|ASSISTANT|>" -turn_template: "<|user|><|user-message|><|bot|><|bot-message|>" -context: "<|SYSTEM|><|system-message|>\n" -system_message: | - \# StableLM Tuned (Alpha version) - - StableLM is a helpful and harmless open-source AI language model developed by StabilityAI. - - StableLM is excited to be able to help the user, but will refuse to do anything that could be considered harmful to the user. - - StableLM is more than just an information source, StableLM is also able to write poetry, short stories, and make jokes. - - StableLM will refuse to participate in anything that could harm a human. +instruction_template: |- + {%- set found_item = false -%} + {%- for message in messages -%} + {%- if message['role'] == 'system' -%} + {%- set found_item = true -%} + {%- endif -%} + {%- endfor -%} + {%- if not found_item -%} + {{- '<|SYSTEM|>' + '\# StableLM Tuned (Alpha version)\n- StableLM is a helpful and harmless open-source AI language model developed by StabilityAI.\n- StableLM is excited to be able to help the user, but will refuse to do anything that could be considered harmful to the user.\n- StableLM is more than just an information source, StableLM is also able to write poetry, short stories, and make jokes.\n- StableLM will refuse to participate in anything that could harm a human.\n' + '\n' -}} + {%- endif %} + {%- for message in messages %} + {%- if message['role'] == 'system' -%} + {{- '<|SYSTEM|>' + message['content'] + '\n' -}} + {%- else -%} + {%- if message['role'] == 'user' -%} + {{-'<|USER|>' + message['content'] + ''-}} + {%- else -%} + {{-'<|ASSISTANT|>' + message['content'] + '' -}} + {%- endif -%} + {%- endif -%} + {%- endfor -%} + {%- if add_generation_prompt -%} + {{-'<|ASSISTANT|>'-}} + {%- endif -%} + diff --git a/instruction-templates/StableVicuna.yaml b/instruction-templates/StableVicuna.yaml index 0bd929df..26eaa828 100644 --- a/instruction-templates/StableVicuna.yaml +++ b/instruction-templates/StableVicuna.yaml @@ -1,5 +1,25 @@ -user: "### Human:" -bot: "### Assistant:" -turn_template: "<|user|> <|user-message|>\n<|bot|> <|bot-message|>\n\n" -context: "<|system-message|>\n\n" -system_message: "### Assistant: I am StableVicuna, a large language model created by CarperAI. I am here to chat!" +instruction_template: |- + {%- set found_item = false -%} + {%- for message in messages -%} + {%- if message['role'] == 'system' -%} + {%- set found_item = true -%} + {%- endif -%} + {%- endfor -%} + {%- if not found_item -%} + {{- '' + '### Assistant: I am StableVicuna, a large language model created by CarperAI. I am here to chat!' + '\n\n' -}} + {%- endif %} + {%- for message in messages %} + {%- if message['role'] == 'system' -%} + {{- '' + message['content'] + '\n\n' -}} + {%- else -%} + {%- if message['role'] == 'user' -%} + {{-'### Human: ' + message['content'] + '\n'-}} + {%- else -%} + {{-'### Assistant: ' + message['content'] + '\n\n' -}} + {%- endif -%} + {%- endif -%} + {%- endfor -%} + {%- if add_generation_prompt -%} + {{-'### Assistant:'-}} + {%- endif -%} + diff --git a/instruction-templates/Starchat-Beta.yaml b/instruction-templates/Starchat-Beta.yaml index d2aa98d5..92075675 100644 --- a/instruction-templates/Starchat-Beta.yaml +++ b/instruction-templates/Starchat-Beta.yaml @@ -1,5 +1,25 @@ -user: "<|user|>" -bot: "<|assistant|>" -turn_template: "<|user|>\n<|user-message|><|end|>\n<|bot|>\n<|bot-message|><|end|>\n" -context: "<|system|><|system-message|>\n<|end|>\n" -system_message: "" +instruction_template: |- + {%- set found_item = false -%} + {%- for message in messages -%} + {%- if message['role'] == 'system' -%} + {%- set found_item = true -%} + {%- endif -%} + {%- endfor -%} + {%- if not found_item -%} + {{- '<|system|>' + '' + '\n<|end|>\n' -}} + {%- endif %} + {%- for message in messages %} + {%- if message['role'] == 'system' -%} + {{- '<|system|>' + message['content'] + '\n<|end|>\n' -}} + {%- else -%} + {%- if message['role'] == 'user' -%} + {{-'<|user|>\n' + message['content'] + '<|end|>\n'-}} + {%- else -%} + {{-'<|assistant|>\n' + message['content'] + '<|end|>\n' -}} + {%- endif -%} + {%- endif -%} + {%- endfor -%} + {%- if add_generation_prompt -%} + {{-'<|assistant|>\n'-}} + {%- endif -%} + diff --git a/instruction-templates/Tulu.yaml b/instruction-templates/Tulu.yaml index c4e6ca23..a43be767 100644 --- a/instruction-templates/Tulu.yaml +++ b/instruction-templates/Tulu.yaml @@ -1,5 +1,25 @@ -user: "<|user|>" -bot: "<|assistant|>" -turn_template: "<|user|>\n<|user-message|>\n<|bot|>\n<|bot-message|>\n" -context: "" -system_message: "" +instruction_template: |- + {%- set found_item = false -%} + {%- for message in messages -%} + {%- if message['role'] == 'system' -%} + {%- set found_item = true -%} + {%- endif -%} + {%- endfor -%} + {%- if not found_item -%} + {{- '' + '' + '' -}} + {%- endif %} + {%- for message in messages %} + {%- if message['role'] == 'system' -%} + {{- '' + message['content'] + '' -}} + {%- else -%} + {%- if message['role'] == 'user' -%} + {{-'<|user|>\n' + message['content'] + '\n'-}} + {%- else -%} + {{-'<|assistant|>\n' + message['content'] + '\n' -}} + {%- endif -%} + {%- endif -%} + {%- endfor -%} + {%- if add_generation_prompt -%} + {{-'<|assistant|>\n'-}} + {%- endif -%} + diff --git a/instruction-templates/Vicuna-v0.yaml b/instruction-templates/Vicuna-v0.yaml index 5b3e7d01..cf39a9c4 100644 --- a/instruction-templates/Vicuna-v0.yaml +++ b/instruction-templates/Vicuna-v0.yaml @@ -1,5 +1,25 @@ -user: "### Human:" -bot: "### Assistant:" -turn_template: "<|user|> <|user-message|>\n<|bot|> <|bot-message|>\n" -context: "<|system-message|>\n\n" -system_message: "A chat between a curious human and an artificial intelligence assistant. The assistant gives helpful, detailed, and polite answers to the human's questions." +instruction_template: |- + {%- set found_item = false -%} + {%- for message in messages -%} + {%- if message['role'] == 'system' -%} + {%- set found_item = true -%} + {%- endif -%} + {%- endfor -%} + {%- if not found_item -%} + {{- '' + 'A chat between a curious human and an artificial intelligence assistant. The assistant gives helpful, detailed, and polite answers to the human's questions.' + '\n\n' -}} + {%- endif %} + {%- for message in messages %} + {%- if message['role'] == 'system' -%} + {{- '' + message['content'] + '\n\n' -}} + {%- else -%} + {%- if message['role'] == 'user' -%} + {{-'### Human: ' + message['content'] + '\n'-}} + {%- else -%} + {{-'### Assistant: ' + message['content'] + '\n' -}} + {%- endif -%} + {%- endif -%} + {%- endfor -%} + {%- if add_generation_prompt -%} + {{-'### Assistant:'-}} + {%- endif -%} + diff --git a/instruction-templates/Vicuna-v1.1.yaml b/instruction-templates/Vicuna-v1.1.yaml index b5ad1cb0..c4d50502 100644 --- a/instruction-templates/Vicuna-v1.1.yaml +++ b/instruction-templates/Vicuna-v1.1.yaml @@ -1,5 +1,25 @@ -user: "USER:" -bot: "ASSISTANT:" -turn_template: "<|user|> <|user-message|>\n<|bot|> <|bot-message|>\n" -context: "<|system-message|>\n\n" -system_message: "A chat between a curious user and an artificial intelligence assistant. The assistant gives helpful, detailed, and polite answers to the user's questions." +instruction_template: |- + {%- set found_item = false -%} + {%- for message in messages -%} + {%- if message['role'] == 'system' -%} + {%- set found_item = true -%} + {%- endif -%} + {%- endfor -%} + {%- if not found_item -%} + {{- '' + 'A chat between a curious user and an artificial intelligence assistant. The assistant gives helpful, detailed, and polite answers to the user's questions.' + '\n\n' -}} + {%- endif %} + {%- for message in messages %} + {%- if message['role'] == 'system' -%} + {{- '' + message['content'] + '\n\n' -}} + {%- else -%} + {%- if message['role'] == 'user' -%} + {{-'USER: ' + message['content'] + '\n'-}} + {%- else -%} + {{-'ASSISTANT: ' + message['content'] + '\n' -}} + {%- endif -%} + {%- endif -%} + {%- endfor -%} + {%- if add_generation_prompt -%} + {{-'ASSISTANT:'-}} + {%- endif -%} + diff --git a/instruction-templates/Vigogne-Chat.yaml b/instruction-templates/Vigogne-Chat.yaml index 29921e69..8fc3e452 100644 --- a/instruction-templates/Vigogne-Chat.yaml +++ b/instruction-templates/Vigogne-Chat.yaml @@ -1,11 +1,25 @@ -user: "<|USER|>:" -bot: "<|ASSISTANT|>:" -turn_template: "\n<|user|> <|user-message|>\n<|bot|> <|bot-message|>" -context: "<|system-message|>\n" -system_message: | - Below is a conversation between a user and an AI assistant named Vigogne. - Vigogne is an open-source AI assistant created by Zaion (https://zaion.ai/). - Vigogne is polite, emotionally aware, humble-but-knowledgeable, always providing helpful and detailed answers. - Vigogne is skilled in responding proficiently in the languages its users use and can perform a wide range of tasks such as text editing, translation, question answering, logical reasoning, coding, and many others. - Vigogne cannot receive or generate audio or visual content and cannot access the internet. - Vigogne strictly avoids discussing sensitive, offensive, illegal, ethical, or political topics and caveats when unsure of the answer. +instruction_template: |- + {%- set found_item = false -%} + {%- for message in messages -%} + {%- if message['role'] == 'system' -%} + {%- set found_item = true -%} + {%- endif -%} + {%- endfor -%} + {%- if not found_item -%} + {{- '' + 'Below is a conversation between a user and an AI assistant named Vigogne.\nVigogne is an open-source AI assistant created by Zaion (https://zaion.ai/).\nVigogne is polite, emotionally aware, humble-but-knowledgeable, always providing helpful and detailed answers.\nVigogne is skilled in responding proficiently in the languages its users use and can perform a wide range of tasks such as text editing, translation, question answering, logical reasoning, coding, and many others.\nVigogne cannot receive or generate audio or visual content and cannot access the internet.\nVigogne strictly avoids discussing sensitive, offensive, illegal, ethical, or political topics and caveats when unsure of the answer.\n' + '\n' -}} + {%- endif %} + {%- for message in messages %} + {%- if message['role'] == 'system' -%} + {{- '' + message['content'] + '\n' -}} + {%- else -%} + {%- if message['role'] == 'user' -%} + {{-'\n<|USER|>: ' + message['content'] + '\n'-}} + {%- else -%} + {{-'<|ASSISTANT|>: ' + message['content'] + '' -}} + {%- endif -%} + {%- endif -%} + {%- endfor -%} + {%- if add_generation_prompt -%} + {{-'<|ASSISTANT|>:'-}} + {%- endif -%} + diff --git a/instruction-templates/Vigogne-Instruct.yaml b/instruction-templates/Vigogne-Instruct.yaml index 239d53bb..b39a56e6 100644 --- a/instruction-templates/Vigogne-Instruct.yaml +++ b/instruction-templates/Vigogne-Instruct.yaml @@ -1,5 +1,25 @@ -user: "### Instruction:" -bot: "### Réponse:" -turn_template: "<|user|>\n<|user-message|>\n\n<|bot|>\n<|bot-message|>\n\n" -context: "<|system-message|>\n\n" -system_message: "Ci-dessous se trouve une instruction qui décrit une tâche à accomplir. Rédigez une réponse qui répond de manière précise à la demande." +instruction_template: |- + {%- set found_item = false -%} + {%- for message in messages -%} + {%- if message['role'] == 'system' -%} + {%- set found_item = true -%} + {%- endif -%} + {%- endfor -%} + {%- if not found_item -%} + {{- '' + 'Ci-dessous se trouve une instruction qui décrit une tâche à accomplir. Rédigez une réponse qui répond de manière précise à la demande.' + '\n\n' -}} + {%- endif %} + {%- for message in messages %} + {%- if message['role'] == 'system' -%} + {{- '' + message['content'] + '\n\n' -}} + {%- else -%} + {%- if message['role'] == 'user' -%} + {{-'### Instruction:\n' + message['content'] + '\n\n'-}} + {%- else -%} + {{-'### Réponse:\n' + message['content'] + '\n\n' -}} + {%- endif -%} + {%- endif -%} + {%- endfor -%} + {%- if add_generation_prompt -%} + {{-'### Réponse:\n'-}} + {%- endif -%} + diff --git a/instruction-templates/Wizard-Mega ShareGPT.yaml b/instruction-templates/Wizard-Mega ShareGPT.yaml index 3124ddfb..e289249a 100644 --- a/instruction-templates/Wizard-Mega ShareGPT.yaml +++ b/instruction-templates/Wizard-Mega ShareGPT.yaml @@ -1,5 +1,25 @@ -user: "USER:" -bot: "ASSISTANT:" -turn_template: "<|user|> <|user-message|> <|bot|> <|bot-message|>" -context: "" -system_message: "" +instruction_template: |- + {%- set found_item = false -%} + {%- for message in messages -%} + {%- if message['role'] == 'system' -%} + {%- set found_item = true -%} + {%- endif -%} + {%- endfor -%} + {%- if not found_item -%} + {{- '' + '' + '' -}} + {%- endif %} + {%- for message in messages %} + {%- if message['role'] == 'system' -%} + {{- '' + message['content'] + '' -}} + {%- else -%} + {%- if message['role'] == 'user' -%} + {{-'USER: ' + message['content'] + ' '-}} + {%- else -%} + {{-'ASSISTANT: ' + message['content'] + '' -}} + {%- endif -%} + {%- endif -%} + {%- endfor -%} + {%- if add_generation_prompt -%} + {{-'ASSISTANT:'-}} + {%- endif -%} + diff --git a/instruction-templates/Wizard-Mega WizardLM.yaml b/instruction-templates/Wizard-Mega WizardLM.yaml index 8f33801a..1f2086a2 100644 --- a/instruction-templates/Wizard-Mega WizardLM.yaml +++ b/instruction-templates/Wizard-Mega WizardLM.yaml @@ -1,5 +1,25 @@ -user: "### Instruction:" -bot: "### Response:" -turn_template: "<|user|>\n<|user-message|>\n\n<|bot|>\n<|bot-message|>\n\n" -context: "<|system-message|>\n\n" -system_message: "Below is an instruction that describes a task. Write a response that appropriately completes the request." +instruction_template: |- + {%- set found_item = false -%} + {%- for message in messages -%} + {%- if message['role'] == 'system' -%} + {%- set found_item = true -%} + {%- endif -%} + {%- endfor -%} + {%- if not found_item -%} + {{- '' + 'Below is an instruction that describes a task. Write a response that appropriately completes the request.' + '\n\n' -}} + {%- endif %} + {%- for message in messages %} + {%- if message['role'] == 'system' -%} + {{- '' + message['content'] + '\n\n' -}} + {%- else -%} + {%- if message['role'] == 'user' -%} + {{-'### Instruction:\n' + message['content'] + '\n\n'-}} + {%- else -%} + {{-'### Response:\n' + message['content'] + '\n\n' -}} + {%- endif -%} + {%- endif -%} + {%- endfor -%} + {%- if add_generation_prompt -%} + {{-'### Response:\n'-}} + {%- endif -%} + diff --git a/instruction-templates/Wizard-Mega.yaml b/instruction-templates/Wizard-Mega.yaml index fa4ae35d..db6d990f 100644 --- a/instruction-templates/Wizard-Mega.yaml +++ b/instruction-templates/Wizard-Mega.yaml @@ -1,5 +1,25 @@ -user: "### Instruction:" -bot: "### Assistant:" -turn_template: "<|user|> <|user-message|>\n\n<|bot|> <|bot-message|>\n\n" -context: "" -system_message: "" +instruction_template: |- + {%- set found_item = false -%} + {%- for message in messages -%} + {%- if message['role'] == 'system' -%} + {%- set found_item = true -%} + {%- endif -%} + {%- endfor -%} + {%- if not found_item -%} + {{- '' + '' + '' -}} + {%- endif %} + {%- for message in messages %} + {%- if message['role'] == 'system' -%} + {{- '' + message['content'] + '' -}} + {%- else -%} + {%- if message['role'] == 'user' -%} + {{-'### Instruction: ' + message['content'] + '\n\n'-}} + {%- else -%} + {{-'### Assistant: ' + message['content'] + '\n\n' -}} + {%- endif -%} + {%- endif -%} + {%- endfor -%} + {%- if add_generation_prompt -%} + {{-'### Assistant:'-}} + {%- endif -%} + diff --git a/instruction-templates/Ziya.yaml b/instruction-templates/Ziya.yaml index a216eb12..198f0a1d 100644 --- a/instruction-templates/Ziya.yaml +++ b/instruction-templates/Ziya.yaml @@ -1,5 +1,25 @@ -user: ":" -bot: ":" -turn_template: "<|user|><|user-message|>\n<|bot|><|bot-message|>\n" -context: "" -system_message: "" +instruction_template: |- + {%- set found_item = false -%} + {%- for message in messages -%} + {%- if message['role'] == 'system' -%} + {%- set found_item = true -%} + {%- endif -%} + {%- endfor -%} + {%- if not found_item -%} + {{- '' + '' + '' -}} + {%- endif %} + {%- for message in messages %} + {%- if message['role'] == 'system' -%} + {{- '' + message['content'] + '' -}} + {%- else -%} + {%- if message['role'] == 'user' -%} + {{-':' + message['content'] + '\n'-}} + {%- else -%} + {{-':' + message['content'] + '\n' -}} + {%- endif -%} + {%- endif -%} + {%- endfor -%} + {%- if add_generation_prompt -%} + {{-':'-}} + {%- endif -%} + diff --git a/modules/chat.py b/modules/chat.py index e126a428..4f0434ba 100644 --- a/modules/chat.py +++ b/modules/chat.py @@ -5,10 +5,12 @@ import html import json import re from datetime import datetime +from functools import partial from pathlib import Path import gradio as gr import yaml +from jinja2.sandbox import ImmutableSandboxedEnvironment from PIL import Image import modules.shared as shared @@ -20,12 +22,10 @@ from modules.text_generation import ( get_encoded_length, get_max_prompt_length ) -from modules.utils import ( - delete_file, - get_available_characters, - replace_all, - save_file -) +from modules.utils import delete_file, get_available_characters, save_file + +# Copied from the Transformers library +jinja_env = ImmutableSandboxedEnvironment(trim_blocks=True, lstrip_blocks=True) def str_presenter(dumper, data): @@ -44,31 +44,34 @@ yaml.add_representer(str, str_presenter) yaml.representer.SafeRepresenter.add_representer(str, str_presenter) -def get_turn_substrings(state, instruct=False): - if instruct: - if 'turn_template' not in state or state['turn_template'] == '': - template = '<|user|>\n<|user-message|>\n<|bot|>\n<|bot-message|>\n' - else: - template = state['turn_template'].replace(r'\n', '\n') +def get_generation_prompt(renderer, impersonate=False, strip_trailing_spaces=True): + ''' + Given a Jinja template, reverse-engineers the prefix and the suffix for + an assistant message (if impersonate=False) or an user message + (if impersonate=True) + ''' + + if impersonate: + messages = [ + {"role": "user", "content": "<<|user-message-1|>>"}, + {"role": "user", "content": "<<|user-message-2|>>"}, + ] else: - template = '<|user|>: <|user-message|>\n<|bot|>: <|bot-message|>\n' + messages = [ + {"role": "assistant", "content": "<<|user-message-1|>>"}, + {"role": "assistant", "content": "<<|user-message-2|>>"}, + ] - replacements = { - '<|user|>': state['name1_instruct' if instruct else 'name1'].strip(), - '<|bot|>': state['name2_instruct' if instruct else 'name2'].strip(), - } + prompt = renderer(messages=messages) - output = { - 'user_turn': template.split('<|bot|>')[0], - 'bot_turn': '<|bot|>' + template.split('<|bot|>')[1], - 'user_turn_stripped': template.split('<|bot|>')[0].split('<|user-message|>')[0], - 'bot_turn_stripped': '<|bot|>' + template.split('<|bot|>')[1].split('<|bot-message|>')[0], - } + suffix_plus_prefix = prompt.split("<<|user-message-1|>>")[1].split("<<|user-message-2|>>")[0] + suffix = prompt.split("<<|user-message-2|>>")[1] + prefix = suffix_plus_prefix[len(suffix):] - for k in output: - output[k] = replace_all(output[k], replacements) + if strip_trailing_spaces: + prefix = prefix.rstrip(' ') - return output + return prefix, suffix def generate_chat_prompt(user_input, state, **kwargs): @@ -76,121 +79,130 @@ def generate_chat_prompt(user_input, state, **kwargs): _continue = kwargs.get('_continue', False) also_return_rows = kwargs.get('also_return_rows', False) history = kwargs.get('history', state['history'])['internal'] - is_instruct = state['mode'] == 'instruct' - # Find the maximum prompt size - max_length = get_max_prompt_length(state) - all_substrings = { - 'chat': get_turn_substrings(state, instruct=False) if state['mode'] in ['chat', 'chat-instruct'] else None, - 'instruct': get_turn_substrings(state, instruct=True) - } + # Templates + chat_template = jinja_env.from_string(state['chat_template_str']) + instruction_template = jinja_env.from_string(state['instruction_template_str']) + chat_renderer = partial(chat_template.render, add_generation_prompt=False, name1=state['name1'], name2=state['name2']) + instruct_renderer = partial(instruction_template.render, add_generation_prompt=False) - substrings = all_substrings['instruct' if is_instruct else 'chat'] + messages = [] - # Create the template for "chat-instruct" mode - if state['mode'] == 'chat-instruct': - wrapper = '' - command = state['chat-instruct_command'].replace('<|character|>', state['name2'] if not impersonate else state['name1']) - context_instruct = state['context_instruct'] + if state['mode'] == 'instruct': + renderer = instruct_renderer if state['custom_system_message'].strip() != '': - context_instruct = context_instruct.replace('<|system-message|>', state['custom_system_message']) - else: - context_instruct = context_instruct.replace('<|system-message|>', state['system_message']) - - wrapper += context_instruct - wrapper += all_substrings['instruct']['user_turn'].replace('<|user-message|>', command) - wrapper += all_substrings['instruct']['bot_turn_stripped'] - if impersonate: - wrapper += substrings['user_turn_stripped'].rstrip(' ') - elif _continue: - wrapper += apply_extensions('bot_prefix', substrings['bot_turn_stripped'], state) - wrapper += history[-1][1] - else: - wrapper += apply_extensions('bot_prefix', substrings['bot_turn_stripped'].rstrip(' '), state) + messages.append({"role": "system", "content": state['custom_system_message']}) else: - wrapper = '<|prompt|>' + renderer = chat_renderer + if state['context'].strip() != '': + messages.append({"role": "system", "content": state['context']}) - if is_instruct: - context = state['context_instruct'] - if state['custom_system_message'].strip() != '': - context = context.replace('<|system-message|>', state['custom_system_message']) + insert_pos = len(messages) + for user_msg, assistant_msg in reversed(history): + user_msg = user_msg.strip() + assistant_msg = assistant_msg.strip() + + if assistant_msg: + messages.insert(insert_pos, {"role": "assistant", "content": assistant_msg}) + + if user_msg not in ['', '<|BEGIN-VISIBLE-CHAT|>']: + messages.insert(insert_pos, {"role": "user", "content": user_msg}) + + user_input = user_input.strip() + if user_input and not impersonate and not _continue: + messages.append({"role": "user", "content": user_input}) + + def make_prompt(messages): + if state['mode'] == 'chat-instruct' and _continue: + prompt = renderer(messages=messages[:-1]) else: - context = context.replace('<|system-message|>', state['system_message']) - else: - context = replace_character_names( - f"{state['context'].strip()}\n", - state['name1'], - state['name2'] - ) + prompt = renderer(messages=messages) - # Build the prompt - rows = [context] - min_rows = 3 - i = len(history) - 1 - while i >= 0 and get_encoded_length(wrapper.replace('<|prompt|>', ''.join(rows))) < max_length: - if _continue and i == len(history) - 1: - if state['mode'] != 'chat-instruct': - rows.insert(1, substrings['bot_turn_stripped'] + history[i][1].strip()) - else: - rows.insert(1, substrings['bot_turn'].replace('<|bot-message|>', history[i][1].strip())) - - string = history[i][0] - if string not in ['', '<|BEGIN-VISIBLE-CHAT|>']: - rows.insert(1, replace_all(substrings['user_turn'], {'<|user-message|>': string.strip(), '<|round|>': str(i)})) - - i -= 1 - - if impersonate: if state['mode'] == 'chat-instruct': - min_rows = 1 + outer_messages = [] + if state['custom_system_message'].strip() != '': + outer_messages.append({"role": "system", "content": state['custom_system_message']}) + + command = state['chat-instruct_command'] + command = command.replace('<|character|>', state['name2'] if not impersonate else state['name1']) + command = command.replace('<|prompt|>', prompt) + + if _continue: + prefix = get_generation_prompt(renderer, impersonate=impersonate, strip_trailing_spaces=False)[0] + prefix += messages[-1]["content"] + else: + prefix = get_generation_prompt(renderer, impersonate=impersonate)[0] + if not impersonate: + prefix = apply_extensions('bot_prefix', prefix, state) + + outer_messages.append({"role": "user", "content": command}) + outer_messages.append({"role": "assistant", "content": prefix}) + + prompt = instruction_template.render(messages=outer_messages) + suffix = get_generation_prompt(instruct_renderer, impersonate=False)[1] + prompt = prompt[:-len(suffix)] + else: - min_rows = 2 - rows.append(substrings['user_turn_stripped'].rstrip(' ')) - elif not _continue: - # Add the user message - if len(user_input) > 0: - rows.append(replace_all(substrings['user_turn'], {'<|user-message|>': user_input.strip(), '<|round|>': str(len(history))})) + if _continue: + suffix = get_generation_prompt(renderer, impersonate=impersonate)[1] + prompt = prompt[:-len(suffix)] + else: + prefix = get_generation_prompt(renderer, impersonate=impersonate)[0] + if state['mode'] == 'chat' and not impersonate: + prefix = apply_extensions('bot_prefix', prefix, state) - # Add the character prefix - if state['mode'] != 'chat-instruct': - rows.append(apply_extensions('bot_prefix', substrings['bot_turn_stripped'].rstrip(' '), state)) + prompt += prefix - while len(rows) > min_rows and get_encoded_length(wrapper.replace('<|prompt|>', ''.join(rows))) >= max_length: - rows.pop(1) + return prompt + + prompt = make_prompt(messages) + + # Handle truncation + max_length = get_max_prompt_length(state) + while len(messages) > 0 and get_encoded_length(prompt) > max_length: + # Try to save the system message + if len(messages) > 1 and messages[0]['role'] == 'system': + messages.pop(1) + else: + messages.pop(0) + + prompt = make_prompt(messages) - prompt = wrapper.replace('<|prompt|>', ''.join(rows)) if also_return_rows: - return prompt, rows + return prompt, [message['content'] for message in messages] else: return prompt def get_stopping_strings(state): stopping_strings = [] + renderers = [] + if state['mode'] in ['instruct', 'chat-instruct']: - stopping_strings += [ - state['turn_template'].split('<|user-message|>')[1].split('<|bot|>')[0] + '<|bot|>', - state['turn_template'].split('<|bot-message|>')[1] + '<|user|>' - ] - - replacements = { - '<|user|>': state['name1_instruct'], - '<|bot|>': state['name2_instruct'] - } - - for i in range(len(stopping_strings)): - stopping_strings[i] = replace_all(stopping_strings[i], replacements).rstrip(' ').replace(r'\n', '\n') + template = jinja_env.from_string(state['instruction_template_str']) + renderer = partial(template.render, add_generation_prompt=False) + renderers.append(renderer) if state['mode'] in ['chat', 'chat-instruct']: + template = jinja_env.from_string(state['chat_template_str']) + renderer = partial(template.render, add_generation_prompt=False, name1=state['name1'], name2=state['name2']) + renderers.append(renderer) + + for renderer in renderers: + prefix_bot, suffix_bot = get_generation_prompt(renderer, impersonate=False) + prefix_user, suffix_user = get_generation_prompt(renderer, impersonate=True) + stopping_strings += [ - f"\n{state['name1']}:", - f"\n{state['name2']}:" + suffix_user + prefix_bot, + suffix_user + prefix_user, + suffix_bot + prefix_bot, + suffix_bot + prefix_user, ] if 'stopping_strings' in state and isinstance(state['stopping_strings'], list): stopping_strings += state.pop('stopping_strings') - return stopping_strings + return list(set(stopping_strings)) def chatbot_wrapper(text, state, regenerate=False, _continue=False, loading_message=True): @@ -556,32 +568,26 @@ def generate_pfp_cache(character): return None -def load_character(character, name1, name2, instruct=False): - context = greeting = turn_template = system_message = "" +def load_character(character, name1, name2): + context = greeting = "" greeting_field = 'greeting' picture = None - if instruct: - name1 = name2 = '' - folder = 'instruction-templates' - else: - folder = 'characters' - filepath = None for extension in ["yml", "yaml", "json"]: - filepath = Path(f'{folder}/{character}.{extension}') + filepath = Path(f'characters/{character}.{extension}') if filepath.exists(): break if filepath is None or not filepath.exists(): - logger.error(f"Could not find the character \"{character}\" inside {folder}/. No character has been loaded.") + logger.error(f"Could not find the character \"{character}\" inside characters/. No character has been loaded.") raise ValueError file_contents = open(filepath, 'r', encoding='utf-8').read() data = json.loads(file_contents) if extension == "json" else yaml.safe_load(file_contents) for path in [Path("cache/pfp_character.png"), Path("cache/pfp_character_thumb.png")]: - if path.exists() and not instruct: + if path.exists(): path.unlink() picture = generate_pfp_cache(character) @@ -599,23 +605,38 @@ def load_character(character, name1, name2, instruct=False): break if 'context' in data: - context = data['context'] - if not instruct: - context = context.strip() + '\n' + context = data['context'].strip() elif "char_persona" in data: context = build_pygmalion_style_context(data) greeting_field = 'char_greeting' greeting = data.get(greeting_field, greeting) - turn_template = data.get('turn_template', turn_template) - system_message = data.get('system_message', system_message) + return name1, name2, picture, greeting, context - return name1, name2, picture, greeting, context, turn_template.replace("\n", r"\n"), system_message + +def load_instruction_template(template): + for filepath in [Path(f'instruction-templates/{template}.yaml'), Path('instruction-templates/Alpaca.yaml')]: + if filepath.exists(): + break + else: + return '' + + file_contents = open(filepath, 'r', encoding='utf-8').read() + data = yaml.safe_load(file_contents) + if 'instruction_template' in data: + return data['instruction_template'] + else: + return jinja_template_from_old_format(data) @functools.cache -def load_character_memoized(character, name1, name2, instruct=False): - return load_character(character, name1, name2, instruct=instruct) +def load_character_memoized(character, name1, name2): + return load_character(character, name1, name2) + + +@functools.cache +def load_instruction_template_memoized(template): + return load_instruction_template(template) def upload_character(file, img, tavern=False): @@ -707,17 +728,12 @@ def generate_character_yaml(name, greeting, context): return yaml.dump(data, sort_keys=False, width=float("inf")) -def generate_instruction_template_yaml(user, bot, context, turn_template, system_message): +def generate_instruction_template_yaml(instruction_template): data = { - 'user': user, - 'bot': bot, - 'turn_template': turn_template, - 'context': context, - 'system_message': system_message, + 'instruction_template': instruction_template } - data = {k: v for k, v in data.items() if v} # Strip falsy - return yaml.dump(data, sort_keys=False, width=float("inf")) + return my_yaml_output(data) def save_character(name, greeting, context, picture, filename): @@ -739,3 +755,95 @@ def delete_character(name, instruct=False): delete_file(Path(f'characters/{name}.{extension}')) delete_file(Path(f'characters/{name}.png')) + + +def jinja_template_from_old_format(params, verbose=False): + MASTER_TEMPLATE = """ +{%- set found_item = false -%} +{%- for message in messages -%} + {%- if message['role'] == 'system' -%} + {%- set found_item = true -%} + {%- endif -%} +{%- endfor -%} +{%- if not found_item -%} + {{- '<|PRE-SYSTEM|>' + '<|SYSTEM-MESSAGE|>' + '<|POST-SYSTEM|>' -}} +{%- endif %} +{%- for message in messages %} + {%- if message['role'] == 'system' -%} + {{- '<|PRE-SYSTEM|>' + message['content'] + '<|POST-SYSTEM|>' -}} + {%- else -%} + {%- if message['role'] == 'user' -%} + {{-'<|PRE-USER|>' + message['content'] + '<|POST-USER|>'-}} + {%- else -%} + {{-'<|PRE-ASSISTANT|>' + message['content'] + '<|POST-ASSISTANT|>' -}} + {%- endif -%} + {%- endif -%} +{%- endfor -%} +{%- if add_generation_prompt -%} + {{-'<|PRE-ASSISTANT-GENERATE|>'-}} +{%- endif -%} +""" + + if 'context' in params and '<|system-message|>' in params['context']: + pre_system = params['context'].split('<|system-message|>')[0] + post_system = params['context'].split('<|system-message|>')[1] + else: + pre_system = '' + post_system = '' + + pre_user = params['turn_template'].split('<|user-message|>')[0].replace('<|user|>', params['user']) + post_user = params['turn_template'].split('<|user-message|>')[1].split('<|bot|>')[0] + + pre_assistant = '<|bot|>' + params['turn_template'].split('<|bot-message|>')[0].split('<|bot|>')[1] + pre_assistant = pre_assistant.replace('<|bot|>', params['bot']) + post_assistant = params['turn_template'].split('<|bot-message|>')[1] + + pre_system = pre_system.replace('\n', '\\n') + post_system = post_system.replace('\n', '\\n') + pre_user = pre_user.replace('\n', '\\n') + post_user = post_user.replace('\n', '\\n') + pre_assistant = pre_assistant.replace('\n', '\\n') + post_assistant = post_assistant.replace('\n', '\\n') + + if verbose: + print( + '\n', + repr(pre_system) + '\n', + repr(post_system) + '\n', + repr(pre_user) + '\n', + repr(post_user) + '\n', + repr(pre_assistant) + '\n', + repr(post_assistant) + '\n', + ) + + result = MASTER_TEMPLATE + if 'system_message' in params: + result = result.replace('<|SYSTEM-MESSAGE|>', params['system_message'].replace('\n', '\\n')) + else: + result = result.replace('<|SYSTEM-MESSAGE|>', '') + + result = result.replace('<|PRE-SYSTEM|>', pre_system) + result = result.replace('<|POST-SYSTEM|>', post_system) + result = result.replace('<|PRE-USER|>', pre_user) + result = result.replace('<|POST-USER|>', post_user) + result = result.replace('<|PRE-ASSISTANT|>', pre_assistant) + result = result.replace('<|PRE-ASSISTANT-GENERATE|>', pre_assistant.strip()) + result = result.replace('<|POST-ASSISTANT|>', post_assistant) + + result = result.strip() + + return result + + +def my_yaml_output(data): + ''' + pyyaml is very inconsistent with multiline strings. + for simple instruction template outputs, this is enough. + ''' + result = "" + for k in data: + result += k + ": |-\n" + for line in data[k].splitlines(): + result += " " + line.rstrip(' ') + "\n" + + return result diff --git a/modules/models.py b/modules/models.py index 94f97324..f77fc941 100644 --- a/modules/models.py +++ b/modules/models.py @@ -108,7 +108,7 @@ def load_model(model_name, loader=None): logger.info(f"LOADER: {loader}") logger.info(f"TRUNCATION LENGTH: {shared.settings['truncation_length']}") - logger.info(f"INSTRUCTION TEMPLATE: {shared.settings['instruction_template']}") + logger.info(f"INSTRUCTION TEMPLATE: {metadata['instruction_template']}") logger.info(f"Loaded the model in {(time.time()-t0):.2f} seconds.") return model, tokenizer diff --git a/modules/models_settings.py b/modules/models_settings.py index d259a4ed..8a4febdc 100644 --- a/modules/models_settings.py +++ b/modules/models_settings.py @@ -4,7 +4,7 @@ from pathlib import Path import yaml -from modules import loaders, metadata_gguf, shared, ui +from modules import chat, loaders, metadata_gguf, shared, ui def get_fallback_settings(): @@ -33,7 +33,6 @@ def get_model_metadata(model): for k in settings[pat]: model_settings[k] = settings[pat][k] - path = Path(f'{shared.args.model_dir}/{model}/config.json') if path.exists(): hf_metadata = json.loads(open(path, 'r').read()) @@ -100,6 +99,31 @@ def get_model_metadata(model): if 'desc_act' in metadata: model_settings['desc_act'] = metadata['desc_act'] + # Try to find the Jinja instruct template + path = Path(f'{shared.args.model_dir}/{model}') / 'tokenizer_config.json' + if path.exists(): + metadata = json.loads(open(path, 'r').read()) + if 'chat_template' in metadata: + template = metadata['chat_template'] + for k in ['eos_token', 'bos_token']: + if k in metadata: + value = metadata[k] + if type(value) is dict: + value = value['content'] + + template = template.replace(k, "'{}'".format(value)) + + template = re.sub(r'raise_exception\([^)]*\)', "''", template) + + model_settings['instruction_template'] = 'Custom (obtained from model metadata)' + model_settings['instruction_template_str'] = template + + if 'instruction_template' not in model_settings: + model_settings['instruction_template'] = 'Alpaca' + + if model_settings['instruction_template'] != 'Custom (obtained from model metadata)': + model_settings['instruction_template_str'] = chat.load_instruction_template(model_settings['instruction_template']) + # Ignore rope_freq_base if set to the default value if 'rope_freq_base' in model_settings and model_settings['rope_freq_base'] == 10000: model_settings.pop('rope_freq_base') diff --git a/modules/shared.py b/modules/shared.py index eb7323cf..40e72ea8 100644 --- a/modules/shared.py +++ b/modules/shared.py @@ -54,8 +54,9 @@ settings = { 'stream': True, 'character': 'Assistant', 'name1': 'You', - 'instruction_template': 'Alpaca', 'custom_system_message': '', + 'instruction_template_str': "{%- set found_item = false -%}\n{%- for message in messages -%}\n {%- if message['role'] == 'system' -%}\n {%- set found_item = true -%}\n {%- endif -%}\n{%- endfor -%}\n{%- if not found_item -%}\n {{- '' + 'Below is an instruction that describes a task. Write a response that appropriately completes the request.' + '\\n\\n' -}}\n{%- endif %}\n{%- for message in messages %}\n {%- if message['role'] == 'system' -%}\n {{- '' + message['content'] + '\\n\\n' -}}\n {%- else -%}\n {%- if message['role'] == 'user' -%}\n {{-'### Instruction:\\n' + message['content'] + '\\n\\n'-}}\n {%- else -%}\n {{-'### Response:\\n' + message['content'] + '\\n\\n' -}}\n {%- endif -%}\n {%- endif -%}\n{%- endfor -%}\n{%- if add_generation_prompt -%}\n {{-'### Response:\\n'-}}\n{%- endif -%}", + 'chat_template_str': "{%- for message in messages %}\n {%- if message['role'] == 'system' -%}\n {{- message['content'] + '\\n\\n' -}}\n {%- else -%}\n {%- if message['role'] == 'user' -%}\n {{- name1 + ': ' + message['content'] + '\\n'-}}\n {%- else -%}\n {{- name2 + ': ' + message['content'] + '\\n' -}}\n {%- endif -%}\n {%- endif -%}\n{%- endfor -%}\n{%- if add_generation_prompt -%}\n {{- name2 + ':' -}}\n{%- endif -%}", 'chat-instruct_command': 'Continue the chat dialogue below. Write a single reply for the character "<|character|>".\n\n<|prompt|>', 'autoload_model': False, 'gallery-items_per_page': 50, diff --git a/modules/text_generation.py b/modules/text_generation.py index f292bf1e..3815fe70 100644 --- a/modules/text_generation.py +++ b/modules/text_generation.py @@ -120,10 +120,9 @@ def encode(prompt, add_special_tokens=True, add_bos_token=True, truncation_lengt input_ids = np.array(input_ids).reshape(1, len(input_ids)) else: input_ids = shared.tokenizer.encode(str(prompt), return_tensors='pt', add_special_tokens=add_special_tokens) - - # This is a hack for making replies more creative. - if not add_bos_token and input_ids[0][0] == shared.tokenizer.bos_token_id: - input_ids = input_ids[:, 1:] + if not add_bos_token: + while len(input_ids[0]) > 0 and input_ids[0][0] == shared.tokenizer.bos_token_id: + input_ids = input_ids[:, 1:] # Handling truncation if truncation_length is not None: diff --git a/modules/ui.py b/modules/ui.py index 9e2d6b6a..45849fe3 100644 --- a/modules/ui.py +++ b/modules/ui.py @@ -154,13 +154,9 @@ def list_interface_input_elements(): 'greeting', 'context', 'mode', - 'instruction_template', - 'name1_instruct', - 'name2_instruct', - 'context_instruct', - 'system_message', 'custom_system_message', - 'turn_template', + 'instruction_template_str', + 'chat_template_str', 'chat_style', 'chat-instruct_command', ] @@ -202,7 +198,7 @@ def apply_interface_values(state, use_persistent=False): return [state[k] if k in state else gr.update() for k in elements] -def save_settings(state, preset, instruction_template, extensions, show_controls): +def save_settings(state, preset, extensions, show_controls): output = copy.deepcopy(shared.settings) exclude = ['name2', 'greeting', 'context', 'turn_template'] for k in state: @@ -213,7 +209,6 @@ def save_settings(state, preset, instruction_template, extensions, show_controls output['prompt-default'] = state['prompt_menu-default'] output['prompt-notebook'] = state['prompt_menu-notebook'] output['character'] = state['character_menu'] - output['instruction_template'] = instruction_template output['default_extensions'] = extensions output['seed'] = int(output['seed']) output['show_controls'] = show_controls diff --git a/modules/ui_chat.py b/modules/ui_chat.py index 83073dcc..7ca3f34d 100644 --- a/modules/ui_chat.py +++ b/modules/ui_chat.py @@ -19,7 +19,6 @@ def create_ui(): mu = shared.args.multi_user shared.gradio['Chat input'] = gr.State() - shared.gradio['dummy'] = gr.State() shared.gradio['history'] = gr.State({'internal': [], 'visible': []}) with gr.Tab('Chat', elem_id='chat-tab', elem_classes=("old-ui" if shared.args.chat_buttons else None)): @@ -106,25 +105,29 @@ def create_chat_settings_ui(): with gr.Tab('Instruction template'): with gr.Row(): - with gr.Row(): - 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') - ui.create_refresh_button(shared.gradio['instruction_template'], lambda: None, lambda: {'choices': utils.get_available_instruction_templates()}, 'refresh-button', interactive=not mu) - shared.gradio['save_template'] = gr.Button('💾', elem_classes='refresh-button', interactive=not mu) - shared.gradio['delete_template'] = gr.Button('🗑️ ', elem_classes='refresh-button', interactive=not mu) + with gr.Column(): + with gr.Row(): + shared.gradio['instruction_template'] = gr.Dropdown(choices=utils.get_available_instruction_templates(), label='Instruction template', value='Custom', info='Change this according to the model/LoRA that you are using. Used in instruct and chat-instruct modes.', elem_classes='slim-dropdown') + ui.create_refresh_button(shared.gradio['instruction_template'], lambda: None, lambda: {'choices': utils.get_available_instruction_templates()}, 'refresh-button', interactive=not mu) + shared.gradio['load_template'] = gr.Button("Load", elem_classes='refresh-button') + shared.gradio['save_template'] = gr.Button('💾', elem_classes='refresh-button', interactive=not mu) + shared.gradio['delete_template'] = gr.Button('🗑️ ', elem_classes='refresh-button', interactive=not mu) - shared.gradio['custom_system_message'] = gr.Textbox(value=shared.settings['custom_system_message'], lines=2, label='Custom system message', info='If not empty, will be used instead of the default one.', elem_classes=['add_scrollbar']) - shared.gradio['turn_template'] = gr.Textbox(value='', lines=1, label='Turn template', info='Used to precisely define the placement of spaces and new line characters in instruction prompts.', elem_classes=['add_scrollbar']) - shared.gradio['name1_instruct'] = gr.Textbox(value='', lines=2, label='User string', info='Replaces <|user|> in the turn template.') - shared.gradio['name2_instruct'] = gr.Textbox(value='', lines=1, label='Bot string', info='Replaces <|bot|> in the turn template.') - shared.gradio['context_instruct'] = gr.Textbox(value='', lines=4, label='Context', elem_classes=['add_scrollbar']) - shared.gradio['system_message'] = gr.Textbox(value='', lines=2, label='System message', info='Replaces <|system-message|> in the context.', elem_classes=['add_scrollbar']) - with gr.Row(): - shared.gradio['send_instruction_to_default'] = gr.Button('Send to default', elem_classes=['small-button']) - shared.gradio['send_instruction_to_notebook'] = gr.Button('Send to notebook', elem_classes=['small-button']) - shared.gradio['send_instruction_to_negative_prompt'] = gr.Button('Send to negative prompt', elem_classes=['small-button']) + with gr.Column(): + pass with gr.Row(): - 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.', elem_classes=['add_scrollbar']) + with gr.Column(): + shared.gradio['custom_system_message'] = gr.Textbox(value=shared.settings['custom_system_message'], lines=2, label='Custom system message', info='If not empty, will be used instead of the default one.', elem_classes=['add_scrollbar']) + shared.gradio['instruction_template_str'] = gr.Textbox(value='', label='Instruction template', lines=24, elem_classes=['add_scrollbar', 'monospace']) + with gr.Row(): + shared.gradio['send_instruction_to_default'] = gr.Button('Send to default', elem_classes=['small-button']) + shared.gradio['send_instruction_to_notebook'] = gr.Button('Send to notebook', elem_classes=['small-button']) + shared.gradio['send_instruction_to_negative_prompt'] = gr.Button('Send to negative prompt', elem_classes=['small-button']) + + with gr.Column(): + shared.gradio['chat_template_str'] = gr.Textbox(value=shared.settings['chat_template_str'], label='Chat template', lines=22, elem_classes=['add_scrollbar', 'monospace']) + 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.', elem_classes=['add_scrollbar']) with gr.Tab('Chat history'): with gr.Row(): @@ -271,7 +274,7 @@ def create_event_handlers(): lambda: None, None, None, _js=f'() => {{{ui.switch_tabs_js}; switch_to_chat()}}') shared.gradio['character_menu'].change( - partial(chat.load_character, instruct=False), gradio('character_menu', 'name1', 'name2'), gradio('name1', 'name2', 'character_picture', 'greeting', 'context', 'dummy', 'dummy')).success( + chat.load_character, gradio('character_menu', 'name1', 'name2'), gradio('name1', 'name2', 'character_picture', 'greeting', 'context')).success( ui.gather_interface_values, gradio(shared.input_elements), gradio('interface_state')).then( chat.load_latest_history, gradio('interface_state'), gradio('history')).then( chat.redraw_html, gradio(reload_arr), gradio('display')).then( @@ -287,9 +290,6 @@ def create_event_handlers(): lambda x: gr.update(choices=(histories := chat.find_all_histories(x)), value=histories[0]), gradio('interface_state'), gradio('unique_id')) shared.gradio['chat_style'].change(chat.redraw_html, gradio(reload_arr), gradio('display')) - shared.gradio['instruction_template'].change( - partial(chat.load_character, instruct=True), gradio('instruction_template', 'name1_instruct', 'name2_instruct'), gradio('name1_instruct', 'name2_instruct', 'dummy', 'dummy', 'context_instruct', 'turn_template', 'system_message')) - shared.gradio['Copy last reply'].click(chat.send_last_reply_to_input, gradio('history'), gradio('textbox'), show_progress=False) # Save/delete a character @@ -299,10 +299,11 @@ def create_event_handlers(): shared.gradio['delete_character'].click(lambda: gr.update(visible=True), None, gradio('character_deleter')) + shared.gradio['load_template'].click(chat.load_instruction_template, gradio('instruction_template'), gradio('instruction_template_str')) shared.gradio['save_template'].click( lambda: 'My Template.yaml', None, gradio('save_filename')).then( lambda: 'instruction-templates/', None, gradio('save_root')).then( - chat.generate_instruction_template_yaml, gradio('name1_instruct', 'name2_instruct', 'context_instruct', 'turn_template', 'system_message'), gradio('save_contents')).then( + chat.generate_instruction_template_yaml, gradio('instruction_template_str'), gradio('save_contents')).then( lambda: gr.update(visible=True), None, gradio('file_saver')) shared.gradio['delete_template'].click( diff --git a/modules/ui_session.py b/modules/ui_session.py index 0dbaea1c..61e05065 100644 --- a/modules/ui_session.py +++ b/modules/ui_session.py @@ -36,7 +36,7 @@ def create_ui(): shared.gradio['toggle_dark_mode'].click(lambda: None, None, None, _js='() => {document.getElementsByTagName("body")[0].classList.toggle("dark")}') shared.gradio['save_settings'].click( ui.gather_interface_values, gradio(shared.input_elements), gradio('interface_state')).then( - ui.save_settings, gradio('interface_state', 'preset_menu', 'instruction_template', 'extensions_menu', 'show_controls'), gradio('save_contents')).then( + ui.save_settings, gradio('interface_state', 'preset_menu', 'extensions_menu', 'show_controls'), gradio('save_contents')).then( lambda: './', None, gradio('save_root')).then( lambda: 'settings.yaml', None, gradio('save_filename')).then( lambda: gr.update(visible=True), None, gradio('file_saver')) diff --git a/modules/utils.py b/modules/utils.py index 69953da7..c1d0fb46 100644 --- a/modules/utils.py +++ b/modules/utils.py @@ -103,7 +103,7 @@ def get_available_instruction_templates(): if os.path.exists(path): paths = (x for x in Path(path).iterdir() if x.suffix in ('.json', '.yaml', '.yml')) - return ['None'] + sorted(set((k.stem for k in paths)), key=natural_keys) + return ['Custom'] + sorted(set((k.stem for k in paths)), key=natural_keys) def get_available_extensions(): diff --git a/server.py b/server.py index 0f06f563..3e2f262a 100644 --- a/server.py +++ b/server.py @@ -89,7 +89,7 @@ def create_interface(): 'loader': shared.args.loader or 'Transformers', 'mode': shared.settings['mode'], 'character_menu': shared.args.character or shared.settings['character'], - 'instruction_template': shared.settings['instruction_template'], + 'instruction_template_str': shared.settings['instruction_template_str'], 'prompt_menu-default': shared.settings['prompt-default'], 'prompt_menu-notebook': shared.settings['prompt-notebook'], 'filter_by_loader': shared.args.loader or 'All' diff --git a/settings-template.yaml b/settings-template.yaml index 5cd87e05..fb67985e 100644 --- a/settings-template.yaml +++ b/settings-template.yaml @@ -9,22 +9,61 @@ preset: simple-1 max_new_tokens: 512 max_new_tokens_min: 1 max_new_tokens_max: 4096 -seed: -1 negative_prompt: '' +seed: -1 truncation_length: 2048 truncation_length_min: 0 truncation_length_max: 200000 -custom_stopping_strings: '' -auto_max_new_tokens: false max_tokens_second: 0 -ban_eos_token: false +custom_stopping_strings: '' custom_token_bans: '' +auto_max_new_tokens: false +ban_eos_token: false add_bos_token: true skip_special_tokens: true stream: true -name1: You character: Assistant -instruction_template: Alpaca +name1: You +custom_system_message: '' +instruction_template_str: |- + {%- set found_item = false -%} + {%- for message in messages -%} + {%- if message['role'] == 'system' -%} + {%- set found_item = true -%} + {%- endif -%} + {%- endfor -%} + {%- if not found_item -%} + {{- '' + 'Below is an instruction that describes a task. Write a response that appropriately completes the request.' + '\n\n' -}} + {%- endif %} + {%- for message in messages %} + {%- if message['role'] == 'system' -%} + {{- '' + message['content'] + '\n\n' -}} + {%- else -%} + {%- if message['role'] == 'user' -%} + {{-'### Instruction:\n' + message['content'] + '\n\n'-}} + {%- else -%} + {{-'### Response:\n' + message['content'] + '\n\n' -}} + {%- endif -%} + {%- endif -%} + {%- endfor -%} + {%- if add_generation_prompt -%} + {{-'### Response:\n'-}} + {%- endif -%} +chat_template_str: |- + {%- for message in messages %} + {%- if message['role'] == 'system' -%} + {{- message['content'] + '\n\n' -}} + {%- else -%} + {%- if message['role'] == 'user' -%} + {{- name1 + ': ' + message['content'] + '\n'-}} + {%- else -%} + {{- name2 + ': ' + message['content'] + '\n' -}} + {%- endif -%} + {%- endif -%} + {%- endfor -%} + {%- if add_generation_prompt -%} + {{- name2 + ':' -}} + {%- endif -%} chat-instruct_command: |- Continue the chat dialogue below. Write a single reply for the character "<|character|>". From 736fe4aa3eb397a99e3a8b407b6482958710cd63 Mon Sep 17 00:00:00 2001 From: oobabooga <112222186+oobabooga@users.noreply.github.com> Date: Tue, 12 Dec 2023 12:27:40 -0800 Subject: [PATCH 11/17] Fix server refusing to close on Ctrl+C --- server.py | 3 --- 1 file changed, 3 deletions(-) diff --git a/server.py b/server.py index 3e2f262a..856dc494 100644 --- a/server.py +++ b/server.py @@ -58,9 +58,6 @@ from modules.utils import gradio def signal_handler(sig, frame): logger.info("Received Ctrl+C. Shutting down Text generation web UI gracefully.") - if 'interface' in shared.gradio: - shared.gradio['interface'].close() - sys.exit(0) From 8513028968f810bb5326fb89cb903228b69d5816 Mon Sep 17 00:00:00 2001 From: oobabooga <112222186+oobabooga@users.noreply.github.com> Date: Tue, 12 Dec 2023 13:00:38 -0800 Subject: [PATCH 12/17] Fix lag in the chat tab during streaming --- modules/chat.py | 10 +++++----- modules/text_generation.py | 6 +++--- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/modules/chat.py b/modules/chat.py index 4f0434ba..8756adb3 100644 --- a/modules/chat.py +++ b/modules/chat.py @@ -205,7 +205,7 @@ def get_stopping_strings(state): return list(set(stopping_strings)) -def chatbot_wrapper(text, state, regenerate=False, _continue=False, loading_message=True): +def chatbot_wrapper(text, state, regenerate=False, _continue=False, loading_message=True, for_ui=False): history = state['history'] output = copy.deepcopy(history) output = apply_extensions('history', output) @@ -256,7 +256,7 @@ def chatbot_wrapper(text, state, regenerate=False, _continue=False, loading_mess # Generate reply = None - for j, reply in enumerate(generate_reply(prompt, state, stopping_strings=stopping_strings, is_chat=True)): + for j, reply in enumerate(generate_reply(prompt, state, stopping_strings=stopping_strings, is_chat=True, for_ui=for_ui)): # Extract the reply visible_reply = reply @@ -311,7 +311,7 @@ def impersonate_wrapper(text, state): return -def generate_chat_reply(text, state, regenerate=False, _continue=False, loading_message=True): +def generate_chat_reply(text, state, regenerate=False, _continue=False, loading_message=True, for_ui=False): history = state['history'] if regenerate or _continue: text = '' @@ -319,7 +319,7 @@ def generate_chat_reply(text, state, regenerate=False, _continue=False, loading_ yield history return - for history in chatbot_wrapper(text, state, regenerate=regenerate, _continue=_continue, loading_message=loading_message): + for history in chatbot_wrapper(text, state, regenerate=regenerate, _continue=_continue, loading_message=loading_message, for_ui=for_ui): yield history @@ -351,7 +351,7 @@ def generate_chat_reply_wrapper(text, state, regenerate=False, _continue=False): send_dummy_message(text, state) send_dummy_reply(state['start_with'], state) - for i, history in enumerate(generate_chat_reply(text, state, regenerate, _continue, loading_message=True)): + for i, history in enumerate(generate_chat_reply(text, state, regenerate, _continue, loading_message=True, for_ui=True)): yield chat_html_wrapper(history, state['name1'], state['name2'], state['mode'], state['chat_style'], state['character_menu']), history diff --git a/modules/text_generation.py b/modules/text_generation.py index 3815fe70..f576ba83 100644 --- a/modules/text_generation.py +++ b/modules/text_generation.py @@ -33,7 +33,7 @@ def generate_reply(*args, **kwargs): shared.generation_lock.release() -def _generate_reply(question, state, stopping_strings=None, is_chat=False, escape_html=False): +def _generate_reply(question, state, stopping_strings=None, is_chat=False, escape_html=False, for_ui=False): # Find the appropriate generation function generate_func = apply_extensions('custom_generate_reply') @@ -96,7 +96,7 @@ def _generate_reply(question, state, stopping_strings=None, is_chat=False, escap # Limit updates to 24 or 5 per second to avoid lag in the Gradio UI # API updates are not limited else: - min_update_interval = 0 if not escape_html else 0.2 if (shared.args.listen or shared.args.share) else 0.0417 + min_update_interval = 0 if not for_ui else 0.2 if (shared.args.listen or shared.args.share) else 0.0417 if cur_time - last_update > min_update_interval: last_update = cur_time yield reply @@ -178,7 +178,7 @@ def generate_reply_wrapper(question, state, stopping_strings=None): reply = question if not shared.is_seq2seq else '' yield formatted_outputs(reply, shared.model_name) - for reply in generate_reply(question, state, stopping_strings, is_chat=False, escape_html=True): + for reply in generate_reply(question, state, stopping_strings, is_chat=False, escape_html=True, for_ui=True): if not shared.is_seq2seq: reply = question + reply From 85a1d8965c2a9076f4b4825cef750e656e6f223d Mon Sep 17 00:00:00 2001 From: Penagwin <1349689+Penagwin@users.noreply.github.com> Date: Tue, 12 Dec 2023 16:03:50 -0500 Subject: [PATCH 13/17] Updated Docker Docs (#4900) --- docs/09 - Docker.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/09 - Docker.md b/docs/09 - Docker.md index bddc5272..406abcbf 100644 --- a/docs/09 - Docker.md +++ b/docs/09 - Docker.md @@ -19,7 +19,7 @@ Use these commands to launch the image: ``` cd text-generation-webui -ln -s docker/{Dockerfile,docker-compose.yml,.dockerignore} . +ln -s docker/{nvidia/Dockerfile,docker-compose.yml,.dockerignore} . cp docker/.env.example .env # Edit .env and set TORCH_CUDA_ARCH_LIST based on your GPU model docker compose up --build From 1c531a3713446976c0677b4fb051e7078046c028 Mon Sep 17 00:00:00 2001 From: oobabooga <112222186+oobabooga@users.noreply.github.com> Date: Tue, 12 Dec 2023 13:25:21 -0800 Subject: [PATCH 14/17] Minor cleanup --- docs/03 - Parameters Tab.md | 2 +- modules/shared.py | 2 +- modules/ui_chat.py | 2 +- settings-template.yaml | 3 --- 4 files changed, 3 insertions(+), 6 deletions(-) diff --git a/docs/03 - Parameters Tab.md b/docs/03 - Parameters Tab.md index e18fe047..af480998 100644 --- a/docs/03 - Parameters Tab.md +++ b/docs/03 - Parameters Tab.md @@ -101,7 +101,7 @@ So you can use those special placeholders in your character definitions. They ar Defines the instruction template that is used in the Chat tab when "instruct" or "chat-instruct" are selected under "Mode". -* **Instruction template**: A dropdown menu where you can load a saved template, save a new template (💾 button), and delete the currently selected template (🗑️). +* **Saved instruction templates**: A dropdown menu where you can load a saved template, save a new template (💾 button), and delete the currently selected template (🗑️). * **Custom system message**: A message that defines the personality of the chatbot, replacing its default "System message" string. Example: "You are a duck." * **Instruction template string**: A Jinja2 template that defines the prompt format for the instruction-following conversation. * **Send to default**: Send the full instruction template in string format to the Default tab. diff --git a/modules/shared.py b/modules/shared.py index 40e72ea8..b0888935 100644 --- a/modules/shared.py +++ b/modules/shared.py @@ -56,7 +56,7 @@ settings = { 'name1': 'You', 'custom_system_message': '', 'instruction_template_str': "{%- set found_item = false -%}\n{%- for message in messages -%}\n {%- if message['role'] == 'system' -%}\n {%- set found_item = true -%}\n {%- endif -%}\n{%- endfor -%}\n{%- if not found_item -%}\n {{- '' + 'Below is an instruction that describes a task. Write a response that appropriately completes the request.' + '\\n\\n' -}}\n{%- endif %}\n{%- for message in messages %}\n {%- if message['role'] == 'system' -%}\n {{- '' + message['content'] + '\\n\\n' -}}\n {%- else -%}\n {%- if message['role'] == 'user' -%}\n {{-'### Instruction:\\n' + message['content'] + '\\n\\n'-}}\n {%- else -%}\n {{-'### Response:\\n' + message['content'] + '\\n\\n' -}}\n {%- endif -%}\n {%- endif -%}\n{%- endfor -%}\n{%- if add_generation_prompt -%}\n {{-'### Response:\\n'-}}\n{%- endif -%}", - 'chat_template_str': "{%- for message in messages %}\n {%- if message['role'] == 'system' -%}\n {{- message['content'] + '\\n\\n' -}}\n {%- else -%}\n {%- if message['role'] == 'user' -%}\n {{- name1 + ': ' + message['content'] + '\\n'-}}\n {%- else -%}\n {{- name2 + ': ' + message['content'] + '\\n' -}}\n {%- endif -%}\n {%- endif -%}\n{%- endfor -%}\n{%- if add_generation_prompt -%}\n {{- name2 + ':' -}}\n{%- endif -%}", + 'chat_template_str': "{%- for message in messages %}\n {%- if message['role'] == 'system' -%}\n {{- message['content'] + '\\n\\n' -}}\n {%- else -%}\n {%- if message['role'] == 'user' -%}\n {{- name1 + ': ' + message['content'] + '\\n'-}}\n {%- else -%}\n {{- name2 + ': ' + message['content'] + '\\n' -}}\n {%- endif -%}\n {%- endif -%}\n{%- endfor -%}", 'chat-instruct_command': 'Continue the chat dialogue below. Write a single reply for the character "<|character|>".\n\n<|prompt|>', 'autoload_model': False, 'gallery-items_per_page': 50, diff --git a/modules/ui_chat.py b/modules/ui_chat.py index 7ca3f34d..5dafc027 100644 --- a/modules/ui_chat.py +++ b/modules/ui_chat.py @@ -107,7 +107,7 @@ def create_chat_settings_ui(): with gr.Row(): with gr.Column(): with gr.Row(): - shared.gradio['instruction_template'] = gr.Dropdown(choices=utils.get_available_instruction_templates(), label='Instruction template', value='Custom', info='Change this according to the model/LoRA that you are using. Used in instruct and chat-instruct modes.', elem_classes='slim-dropdown') + shared.gradio['instruction_template'] = gr.Dropdown(choices=utils.get_available_instruction_templates(), label='Saved instruction templates', value='Custom', info='Change this according to the model/LoRA that you are using. Used in instruct and chat-instruct modes.', elem_classes='slim-dropdown') ui.create_refresh_button(shared.gradio['instruction_template'], lambda: None, lambda: {'choices': utils.get_available_instruction_templates()}, 'refresh-button', interactive=not mu) shared.gradio['load_template'] = gr.Button("Load", elem_classes='refresh-button') shared.gradio['save_template'] = gr.Button('💾', elem_classes='refresh-button', interactive=not mu) diff --git a/settings-template.yaml b/settings-template.yaml index fb67985e..c081141f 100644 --- a/settings-template.yaml +++ b/settings-template.yaml @@ -61,9 +61,6 @@ chat_template_str: |- {%- endif -%} {%- endif -%} {%- endfor -%} - {%- if add_generation_prompt -%} - {{- name2 + ':' -}} - {%- endif -%} chat-instruct_command: |- Continue the chat dialogue below. Write a single reply for the character "<|character|>". From 21a5bfc67f0dcf23f50e231a3569ffdffb47c176 Mon Sep 17 00:00:00 2001 From: oobabooga <112222186+oobabooga@users.noreply.github.com> Date: Tue, 12 Dec 2023 14:05:58 -0800 Subject: [PATCH 15/17] Relax optimum requirement --- requirements.txt | 2 +- requirements_amd.txt | 2 +- requirements_amd_noavx2.txt | 2 +- requirements_apple_intel.txt | 2 +- requirements_apple_silicon.txt | 2 +- requirements_cpu_only.txt | 2 +- requirements_cpu_only_noavx2.txt | 2 +- requirements_noavx2.txt | 2 +- requirements_nowheels.txt | 2 +- 9 files changed, 9 insertions(+), 9 deletions(-) diff --git a/requirements.txt b/requirements.txt index c52d4162..5073fbc4 100644 --- a/requirements.txt +++ b/requirements.txt @@ -6,7 +6,7 @@ exllamav2==0.0.10; platform_system != "Darwin" and platform_machine != "x86_64" gradio==3.50.* markdown numpy==1.24.* -optimum==1.15.0 +optimum==1.15.* pandas peft==0.7.* Pillow>=9.5.0 diff --git a/requirements_amd.txt b/requirements_amd.txt index 9c9cf767..e8f09cc9 100644 --- a/requirements_amd.txt +++ b/requirements_amd.txt @@ -6,7 +6,7 @@ exllamav2==0.0.10 gradio==3.50.* markdown numpy==1.24.* -optimum==1.15.0 +optimum==1.15.* pandas peft==0.7.* Pillow>=9.5.0 diff --git a/requirements_amd_noavx2.txt b/requirements_amd_noavx2.txt index 7e300dcf..68d9f2fc 100644 --- a/requirements_amd_noavx2.txt +++ b/requirements_amd_noavx2.txt @@ -6,7 +6,7 @@ exllamav2==0.0.10 gradio==3.50.* markdown numpy==1.24.* -optimum==1.15.0 +optimum==1.15.* pandas peft==0.7.* Pillow>=9.5.0 diff --git a/requirements_apple_intel.txt b/requirements_apple_intel.txt index 7ca028a5..53d9e489 100644 --- a/requirements_apple_intel.txt +++ b/requirements_apple_intel.txt @@ -6,7 +6,7 @@ exllamav2==0.0.10 gradio==3.50.* markdown numpy==1.24.* -optimum==1.15.0 +optimum==1.15.* pandas peft==0.7.* Pillow>=9.5.0 diff --git a/requirements_apple_silicon.txt b/requirements_apple_silicon.txt index 3d02c74c..64427eb9 100644 --- a/requirements_apple_silicon.txt +++ b/requirements_apple_silicon.txt @@ -6,7 +6,7 @@ exllamav2==0.0.10 gradio==3.50.* markdown numpy==1.24.* -optimum==1.15.0 +optimum==1.15.* pandas peft==0.7.* Pillow>=9.5.0 diff --git a/requirements_cpu_only.txt b/requirements_cpu_only.txt index de610531..f48f1cb1 100644 --- a/requirements_cpu_only.txt +++ b/requirements_cpu_only.txt @@ -6,7 +6,7 @@ exllamav2==0.0.10 gradio==3.50.* markdown numpy==1.24.* -optimum==1.15.0 +optimum==1.15.* pandas peft==0.7.* Pillow>=9.5.0 diff --git a/requirements_cpu_only_noavx2.txt b/requirements_cpu_only_noavx2.txt index 6a70b37e..6cd35128 100644 --- a/requirements_cpu_only_noavx2.txt +++ b/requirements_cpu_only_noavx2.txt @@ -6,7 +6,7 @@ exllamav2==0.0.10 gradio==3.50.* markdown numpy==1.24.* -optimum==1.15.0 +optimum==1.15.* pandas peft==0.7.* Pillow>=9.5.0 diff --git a/requirements_noavx2.txt b/requirements_noavx2.txt index 4c2e986c..08ec3e71 100644 --- a/requirements_noavx2.txt +++ b/requirements_noavx2.txt @@ -6,7 +6,7 @@ exllamav2==0.0.10; platform_system != "Darwin" and platform_machine != "x86_64" gradio==3.50.* markdown numpy==1.24.* -optimum==1.15.0 +optimum==1.15.* pandas peft==0.7.* Pillow>=9.5.0 diff --git a/requirements_nowheels.txt b/requirements_nowheels.txt index 936d30d7..9007bf16 100644 --- a/requirements_nowheels.txt +++ b/requirements_nowheels.txt @@ -6,7 +6,7 @@ exllamav2==0.0.10 gradio==3.50.* markdown numpy==1.24.* -optimum==1.15.0 +optimum==1.15.* pandas peft==0.7.* Pillow>=9.5.0 From b2cae6cac682a35e27a955260f8f1776e8abe48c Mon Sep 17 00:00:00 2001 From: oobabooga <112222186+oobabooga@users.noreply.github.com> Date: Tue, 12 Dec 2023 14:10:49 -0800 Subject: [PATCH 16/17] Docs: minor update --- docs/01 - Chat Tab.md | 2 +- docs/03 - Parameters Tab.md | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/docs/01 - Chat Tab.md b/docs/01 - Chat Tab.md index 5a9d6381..4b177b80 100644 --- a/docs/01 - Chat Tab.md +++ b/docs/01 - Chat Tab.md @@ -97,7 +97,7 @@ The "Chat" option should typically be used only for base models or non-instruct Used for talking to an instruction-following model using the prompt format defined under "Parameters" > "Instruction template". Think of this option as an offline ChatGPT. -The prompt format is defined by the **Instruction template string** parameter in "Parameters" > "Instruction template", which represents a A Jinja2 template. +The prompt format is defined by the **Instruction template** parameter in "Parameters" > "Instruction template", which represents a Jinja2 template. Note that when you load a model in the "Model" tab, the web UI will try to automatically detect its instruction template (if any), and will update the values under "Parameters" > "Instruction template" accordingly. This is done using a set of regular expressions defined in `models/config.yaml`. This detection is not guaranteed to be accurate. You should check the model card on Hugging Face to see if you are using the correct prompt format. diff --git a/docs/03 - Parameters Tab.md b/docs/03 - Parameters Tab.md index af480998..08cedc93 100644 --- a/docs/03 - Parameters Tab.md +++ b/docs/03 - Parameters Tab.md @@ -103,10 +103,11 @@ Defines the instruction template that is used in the Chat tab when "instruct" or * **Saved instruction templates**: A dropdown menu where you can load a saved template, save a new template (💾 button), and delete the currently selected template (🗑️). * **Custom system message**: A message that defines the personality of the chatbot, replacing its default "System message" string. Example: "You are a duck." -* **Instruction template string**: A Jinja2 template that defines the prompt format for the instruction-following conversation. +* **Instruction template**: A Jinja2 template that defines the prompt format for the instruction-following conversation. * **Send to default**: Send the full instruction template in string format to the Default tab. * **Send to notebook**: Send the full instruction template in string format to the Notebook tab. * **Send to negative prompt**: Send the full instruction template in string format to the "Negative prompt" field under "Parameters" > "Generation". +* **Chat template**: A Jinja2 template that defines the prompt format for regular chat conversations with characters. * **Command for chat-instruct mode**: The command that is used in chat-instruct mode to query the model to generate a reply on behalf of the character. Can be used creatively to generate specific kinds of responses. ## Chat history From c2802bc3ac88b6f0268b6fe82bd15308982083a6 Mon Sep 17 00:00:00 2001 From: oobabooga <112222186+oobabooga@users.noreply.github.com> Date: Tue, 12 Dec 2023 18:05:10 -0800 Subject: [PATCH 17/17] Lint --- server.py | 1 + 1 file changed, 1 insertion(+) diff --git a/server.py b/server.py index 856dc494..ae0aed09 100644 --- a/server.py +++ b/server.py @@ -2,6 +2,7 @@ import os import warnings import accelerate # This early import makes Intel GPUs happy + import modules.one_click_installer_check from modules.block_requests import OpenMonkeyPatch, RequestBlocker from modules.logging_colors import logger