mirror of
https://github.com/oobabooga/text-generation-webui.git
synced 2025-12-06 07:12:10 +01:00
More UI persistence: presets and characters (#7051)
This commit is contained in:
parent
35ed55d18f
commit
6436bf1920
|
|
@ -1220,6 +1220,45 @@ def load_character(character, name1, name2):
|
||||||
return name1, name2, picture, greeting, context
|
return name1, name2, picture, greeting, context
|
||||||
|
|
||||||
|
|
||||||
|
def reset_character_for_ui(state):
|
||||||
|
"""Reset character fields to the currently loaded character's saved values"""
|
||||||
|
if state['character_menu'] and state['character_menu'] != 'None':
|
||||||
|
try:
|
||||||
|
name1, name2, picture, greeting, context = load_character(state['character_menu'], state['name1'], state['name2'])
|
||||||
|
|
||||||
|
state['name2'] = name2
|
||||||
|
state['greeting'] = greeting
|
||||||
|
state['context'] = context
|
||||||
|
state['character_picture'] = picture # This triggers cache update via generate_pfp_cache
|
||||||
|
|
||||||
|
return state, name2, context, greeting, picture
|
||||||
|
|
||||||
|
except Exception as e:
|
||||||
|
logger.error(f"Failed to reset character '{state['character_menu']}': {e}")
|
||||||
|
return clear_character_for_ui(state)
|
||||||
|
else:
|
||||||
|
return clear_character_for_ui(state)
|
||||||
|
|
||||||
|
|
||||||
|
def clear_character_for_ui(state):
|
||||||
|
"""Clear all character fields and picture cache"""
|
||||||
|
state['name2'] = shared.settings['name2']
|
||||||
|
state['context'] = shared.settings['context']
|
||||||
|
state['greeting'] = shared.settings['greeting']
|
||||||
|
state['character_picture'] = None
|
||||||
|
|
||||||
|
# Clear the cache files
|
||||||
|
cache_folder = Path(shared.args.disk_cache_dir)
|
||||||
|
for cache_file in ['pfp_character.png', 'pfp_character_thumb.png']:
|
||||||
|
cache_path = Path(f'{cache_folder}/{cache_file}')
|
||||||
|
if cache_path.exists():
|
||||||
|
cache_path.unlink()
|
||||||
|
|
||||||
|
logger.info("Cleared character fields and picture cache")
|
||||||
|
|
||||||
|
return state, state['name2'], state['context'], state['greeting'], None
|
||||||
|
|
||||||
|
|
||||||
def load_instruction_template(template):
|
def load_instruction_template(template):
|
||||||
if template == 'None':
|
if template == 'None':
|
||||||
return ''
|
return ''
|
||||||
|
|
@ -1710,6 +1749,28 @@ def handle_character_menu_change(state):
|
||||||
]
|
]
|
||||||
|
|
||||||
|
|
||||||
|
def handle_character_picture_change(picture):
|
||||||
|
"""Update or clear cache when character picture changes"""
|
||||||
|
cache_folder = Path(shared.args.disk_cache_dir)
|
||||||
|
if not cache_folder.exists():
|
||||||
|
cache_folder.mkdir()
|
||||||
|
|
||||||
|
if picture is not None:
|
||||||
|
# Save to cache
|
||||||
|
picture.save(Path(f'{cache_folder}/pfp_character.png'), format='PNG')
|
||||||
|
thumb = make_thumbnail(picture)
|
||||||
|
thumb.save(Path(f'{cache_folder}/pfp_character_thumb.png'), format='PNG')
|
||||||
|
logger.info("Updated character picture cache")
|
||||||
|
else:
|
||||||
|
# Remove cache files when picture is cleared
|
||||||
|
for cache_file in ['pfp_character.png', 'pfp_character_thumb.png']:
|
||||||
|
cache_path = Path(f'{cache_folder}/{cache_file}')
|
||||||
|
if cache_path.exists():
|
||||||
|
cache_path.unlink()
|
||||||
|
|
||||||
|
logger.info("Cleared character picture cache")
|
||||||
|
|
||||||
|
|
||||||
def handle_mode_change(state):
|
def handle_mode_change(state):
|
||||||
history = load_latest_history(state)
|
history = load_latest_history(state)
|
||||||
histories = find_all_histories_with_first_prompts(state)
|
histories = find_all_histories_with_first_prompts(state)
|
||||||
|
|
|
||||||
|
|
@ -520,17 +520,23 @@ def generate_instruct_html(history, last_message_only=False):
|
||||||
return output
|
return output
|
||||||
|
|
||||||
|
|
||||||
|
def get_character_image_with_cache_buster():
|
||||||
|
"""Get character image URL with cache busting based on file modification time"""
|
||||||
|
cache_path = Path("user_data/cache/pfp_character_thumb.png")
|
||||||
|
if cache_path.exists():
|
||||||
|
mtime = int(cache_path.stat().st_mtime)
|
||||||
|
return f'<img src="file/user_data/cache/pfp_character_thumb.png?{mtime}" class="pfp_character">'
|
||||||
|
|
||||||
|
return ''
|
||||||
|
|
||||||
|
|
||||||
def generate_cai_chat_html(history, name1, name2, style, character, reset_cache=False, last_message_only=False):
|
def generate_cai_chat_html(history, name1, name2, style, character, reset_cache=False, last_message_only=False):
|
||||||
if not last_message_only:
|
if not last_message_only:
|
||||||
output = f'<style>{chat_styles[style]}</style><div class="chat" id="chat"><div class="messages">'
|
output = f'<style>{chat_styles[style]}</style><div class="chat" id="chat"><div class="messages">'
|
||||||
else:
|
else:
|
||||||
output = ""
|
output = ""
|
||||||
|
|
||||||
# We use ?character and ?time.time() to force the browser to reset caches
|
img_bot = get_character_image_with_cache_buster()
|
||||||
img_bot = (
|
|
||||||
f'<img src="file/user_data/cache/pfp_character_thumb.png?{character}" class="pfp_character">'
|
|
||||||
if Path("user_data/cache/pfp_character_thumb.png").exists() else ''
|
|
||||||
)
|
|
||||||
|
|
||||||
def create_message(role, content, raw_content):
|
def create_message(role, content, raw_content):
|
||||||
"""Inner function for CAI-style messages."""
|
"""Inner function for CAI-style messages."""
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,5 @@
|
||||||
import functools
|
import functools
|
||||||
import pprint
|
import pprint
|
||||||
import random
|
|
||||||
from pathlib import Path
|
from pathlib import Path
|
||||||
|
|
||||||
import yaml
|
import yaml
|
||||||
|
|
@ -93,68 +92,17 @@ def load_preset_for_ui(name, state):
|
||||||
return state, *[generate_params[k] for k in presets_params()]
|
return state, *[generate_params[k] for k in presets_params()]
|
||||||
|
|
||||||
|
|
||||||
def random_preset(state):
|
def reset_preset_for_ui(name, state):
|
||||||
params_and_values = {
|
"""Reset current preset to its saved values from file"""
|
||||||
'remove_tail_tokens': {
|
generate_params = load_preset(name, verbose=True)
|
||||||
'top_p': [0.5, 0.8, 0.9, 0.95, 0.99],
|
state.update(generate_params)
|
||||||
'min_p': [0.5, 0.2, 0.1, 0.05, 0.01],
|
return state, *[generate_params[k] for k in presets_params()]
|
||||||
'top_k': [3, 5, 10, 20, 30, 40],
|
|
||||||
'typical_p': [0.2, 0.575, 0.95],
|
|
||||||
'tfs': [0.5, 0.8, 0.9, 0.95, 0.99],
|
def neutralize_samplers_for_ui(state):
|
||||||
'top_a': [0.5, 0.2, 0.1, 0.05, 0.01],
|
"""Set all samplers to their default/neutral values"""
|
||||||
'epsilon_cutoff': [1, 3, 5, 7, 9],
|
generate_params = default_preset()
|
||||||
'eta_cutoff': [3, 6, 9, 12, 15, 18],
|
|
||||||
},
|
|
||||||
'flatten_distribution': {
|
|
||||||
'temperature': [0.1, 0.5, 0.7, 0.8, 1, 1.2, 1.5, 2.0, 5.0],
|
|
||||||
'dynamic_temperature': [
|
|
||||||
[0.1, 1],
|
|
||||||
[0.1, 1.5],
|
|
||||||
[0.1, 2],
|
|
||||||
[0.1, 5],
|
|
||||||
[0.5, 1],
|
|
||||||
[0.5, 1.5],
|
|
||||||
[0.5, 2],
|
|
||||||
[0.5, 5],
|
|
||||||
[0.8, 1],
|
|
||||||
[0.8, 1.5],
|
|
||||||
[0.8, 2],
|
|
||||||
[0.8, 5],
|
|
||||||
[1, 1.5],
|
|
||||||
[1, 2],
|
|
||||||
[1, 5]
|
|
||||||
],
|
|
||||||
'smoothing_factor': [0.2, 0.3, 0.6, 1.2],
|
|
||||||
},
|
|
||||||
'repetition': {
|
|
||||||
'repetition_penalty': [1, 1.05, 1.1, 1.15, 1.20, 1.25],
|
|
||||||
'presence_penalty': [0, 0.1, 0.2, 0.4, 0.6, 0.8, 1.0, 2.0],
|
|
||||||
'frequency_penalty': [0, 0.1, 0.2, 0.4, 0.6, 0.8, 1.0, 2.0],
|
|
||||||
},
|
|
||||||
'other': {
|
|
||||||
'temperature_last': [True, False],
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
generate_params = default_preset()
|
|
||||||
for cat in params_and_values:
|
|
||||||
choices = list(params_and_values[cat].keys())
|
|
||||||
if shared.args.loader is not None:
|
|
||||||
choices = [x for x in choices if loader_contains(x)]
|
|
||||||
|
|
||||||
if len(choices) > 0:
|
|
||||||
choice = random.choice(choices)
|
|
||||||
value = random.choice(params_and_values[cat][choice])
|
|
||||||
if choice == 'dynamic_temperature':
|
|
||||||
generate_params['dynamic_temperature'] = True
|
|
||||||
generate_params['dynatemp_low'] = value[0]
|
|
||||||
generate_params['dynatemp_high'] = value[1]
|
|
||||||
else:
|
|
||||||
generate_params[choice] = value
|
|
||||||
|
|
||||||
state.update(generate_params)
|
state.update(generate_params)
|
||||||
logger.info("GENERATED_PRESET=")
|
|
||||||
pprint.PrettyPrinter(indent=4, width=1, sort_dicts=False).pprint(remove_defaults(state))
|
|
||||||
return state, *[generate_params[k] for k in presets_params()]
|
return state, *[generate_params[k] for k in presets_params()]
|
||||||
|
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -39,10 +39,6 @@ settings = {
|
||||||
'web_search_pages': 3,
|
'web_search_pages': 3,
|
||||||
'prompt-default': 'QA',
|
'prompt-default': 'QA',
|
||||||
'prompt-notebook': 'QA',
|
'prompt-notebook': 'QA',
|
||||||
'character': 'Assistant',
|
|
||||||
'name1': 'You',
|
|
||||||
'user_bio': '',
|
|
||||||
'custom_system_message': '',
|
|
||||||
'preset': 'min_p',
|
'preset': 'min_p',
|
||||||
'max_new_tokens': 512,
|
'max_new_tokens': 512,
|
||||||
'max_new_tokens_min': 1,
|
'max_new_tokens_min': 1,
|
||||||
|
|
@ -63,8 +59,64 @@ settings = {
|
||||||
'negative_prompt': '',
|
'negative_prompt': '',
|
||||||
'dark_theme': True,
|
'dark_theme': True,
|
||||||
'default_extensions': [],
|
'default_extensions': [],
|
||||||
|
|
||||||
|
# Character settings
|
||||||
|
'character': 'Assistant',
|
||||||
|
'name1': 'You',
|
||||||
|
'name2': 'AI',
|
||||||
|
'user_bio': '',
|
||||||
|
'context': 'The following is a conversation with an AI Large Language Model. The AI has been trained to answer questions, provide recommendations, and help with decision making. The AI follows user requests. The AI thinks outside the box.',
|
||||||
|
'greeting': 'How can I help you today?',
|
||||||
|
'custom_system_message': '',
|
||||||
'instruction_template_str': "{%- set ns = namespace(found=false) -%}\n{%- for message in messages -%}\n {%- if message['role'] == 'system' -%}\n {%- set ns.found = true -%}\n {%- endif -%}\n{%- endfor -%}\n{%- if not ns.found -%}\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 -%}",
|
'instruction_template_str': "{%- set ns = namespace(found=false) -%}\n{%- for message in messages -%}\n {%- if message['role'] == 'system' -%}\n {%- set ns.found = true -%}\n {%- endif -%}\n{%- endfor -%}\n{%- if not ns.found -%}\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 {%- if message['content'] -%}\n {{- message['content'] + '\\n\\n' -}}\n {%- endif -%}\n {%- if user_bio -%}\n {{- user_bio + '\\n\\n' -}}\n {%- endif -%}\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_template_str': "{%- for message in messages %}\n {%- if message['role'] == 'system' -%}\n {%- if message['content'] -%}\n {{- message['content'] + '\\n\\n' -}}\n {%- endif -%}\n {%- if user_bio -%}\n {{- user_bio + '\\n\\n' -}}\n {%- endif -%}\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 -%}",
|
||||||
|
|
||||||
|
# Generation parameters - Curve shape
|
||||||
|
'temperature': 1.0,
|
||||||
|
'dynatemp_low': 1.0,
|
||||||
|
'dynatemp_high': 1.0,
|
||||||
|
'dynatemp_exponent': 1.0,
|
||||||
|
'smoothing_factor': 0.0,
|
||||||
|
'smoothing_curve': 1.0,
|
||||||
|
|
||||||
|
# Generation parameters - Curve cutoff
|
||||||
|
'min_p': 0.0,
|
||||||
|
'top_p': 1.0,
|
||||||
|
'top_k': 0,
|
||||||
|
'typical_p': 1.0,
|
||||||
|
'xtc_threshold': 0.1,
|
||||||
|
'xtc_probability': 0.0,
|
||||||
|
'epsilon_cutoff': 0.0,
|
||||||
|
'eta_cutoff': 0.0,
|
||||||
|
'tfs': 1.0,
|
||||||
|
'top_a': 0.0,
|
||||||
|
'top_n_sigma': 0.0,
|
||||||
|
|
||||||
|
# Generation parameters - Repetition suppression
|
||||||
|
'dry_multiplier': 0.0,
|
||||||
|
'dry_allowed_length': 2,
|
||||||
|
'dry_base': 1.75,
|
||||||
|
'repetition_penalty': 1.0,
|
||||||
|
'frequency_penalty': 0.0,
|
||||||
|
'presence_penalty': 0.0,
|
||||||
|
'encoder_repetition_penalty': 1.0,
|
||||||
|
'no_repeat_ngram_size': 0,
|
||||||
|
'repetition_penalty_range': 1024,
|
||||||
|
|
||||||
|
# Generation parameters - Alternative sampling methods
|
||||||
|
'penalty_alpha': 0.0,
|
||||||
|
'guidance_scale': 1.0,
|
||||||
|
'mirostat_mode': 0,
|
||||||
|
'mirostat_tau': 5.0,
|
||||||
|
'mirostat_eta': 0.1,
|
||||||
|
|
||||||
|
# Generation parameters - Other options
|
||||||
|
'do_sample': True,
|
||||||
|
'dynamic_temperature': False,
|
||||||
|
'temperature_last': False,
|
||||||
|
'sampler_priority': 'repetition_penalty\npresence_penalty\nfrequency_penalty\ndry\ntop_n_sigma\ntemperature\ndynamic_temperature\nquadratic_sampling\ntop_k\ntop_p\ntypical_p\nepsilon_cutoff\neta_cutoff\ntfs\ntop_a\nmin_p\nmirostat\nxtc\nencoder_repetition_penalty\nno_repeat_ngram',
|
||||||
|
'dry_sequence_breakers': '"\\n", ":", "\\"", "*"',
|
||||||
|
'grammar_string': '',
|
||||||
}
|
}
|
||||||
|
|
||||||
default_settings = copy.deepcopy(settings)
|
default_settings = copy.deepcopy(settings)
|
||||||
|
|
@ -75,7 +127,6 @@ parser = argparse.ArgumentParser(description="Text generation web UI", conflict_
|
||||||
# Basic settings
|
# Basic settings
|
||||||
group = parser.add_argument_group('Basic settings')
|
group = parser.add_argument_group('Basic settings')
|
||||||
group.add_argument('--multi-user', action='store_true', help='Multi-user mode. Chat histories are not saved or automatically loaded. Warning: this is likely not safe for sharing publicly.')
|
group.add_argument('--multi-user', action='store_true', help='Multi-user mode. Chat histories are not saved or automatically loaded. Warning: this is likely not safe for sharing publicly.')
|
||||||
group.add_argument('--character', type=str, help='The name of the character to load in chat mode by default.')
|
|
||||||
group.add_argument('--model', type=str, help='Name of the model to load by default.')
|
group.add_argument('--model', type=str, help='Name of the model to load by default.')
|
||||||
group.add_argument('--lora', type=str, nargs='+', help='The list of LoRAs to load. If you want to load more than one LoRA, write the names separated by spaces.')
|
group.add_argument('--lora', type=str, nargs='+', help='The list of LoRAs to load. If you want to load more than one LoRA, write the names separated by spaces.')
|
||||||
group.add_argument('--model-dir', type=str, default='user_data/models', help='Path to directory with all the models.')
|
group.add_argument('--model-dir', type=str, default='user_data/models', help='Path to directory with all the models.')
|
||||||
|
|
|
||||||
|
|
@ -310,7 +310,7 @@ def apply_interface_values(state, use_persistent=False):
|
||||||
|
|
||||||
def save_settings(state, preset, extensions_list, show_controls, theme_state):
|
def save_settings(state, preset, extensions_list, show_controls, theme_state):
|
||||||
output = copy.deepcopy(shared.settings)
|
output = copy.deepcopy(shared.settings)
|
||||||
exclude = ['name2', 'greeting', 'context', 'truncation_length', 'instruction_template_str']
|
exclude = []
|
||||||
for k in state:
|
for k in state:
|
||||||
if k in shared.settings and k not in exclude:
|
if k in shared.settings and k not in exclude:
|
||||||
output[k] = state[k]
|
output[k] = state[k]
|
||||||
|
|
@ -323,6 +323,7 @@ def save_settings(state, preset, extensions_list, show_controls, theme_state):
|
||||||
output['seed'] = int(output['seed'])
|
output['seed'] = int(output['seed'])
|
||||||
output['show_controls'] = show_controls
|
output['show_controls'] = show_controls
|
||||||
output['dark_theme'] = True if theme_state == 'dark' else False
|
output['dark_theme'] = True if theme_state == 'dark' else False
|
||||||
|
output.pop('instruction_template_str')
|
||||||
|
|
||||||
# Save extension values in the UI
|
# Save extension values in the UI
|
||||||
for extension_name in extensions_list:
|
for extension_name in extensions_list:
|
||||||
|
|
@ -364,7 +365,7 @@ def store_current_state_and_debounce(interface_state, preset, extensions, show_c
|
||||||
if _auto_save_timer is not None:
|
if _auto_save_timer is not None:
|
||||||
_auto_save_timer.cancel()
|
_auto_save_timer.cancel()
|
||||||
|
|
||||||
_auto_save_timer = threading.Timer(2.0, _perform_debounced_save)
|
_auto_save_timer = threading.Timer(1.0, _perform_debounced_save)
|
||||||
_auto_save_timer.start()
|
_auto_save_timer.start()
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -401,15 +402,52 @@ def setup_auto_save():
|
||||||
'chat-instruct_command',
|
'chat-instruct_command',
|
||||||
'character_menu',
|
'character_menu',
|
||||||
'name1',
|
'name1',
|
||||||
|
'name2',
|
||||||
|
'context',
|
||||||
|
'greeting',
|
||||||
'user_bio',
|
'user_bio',
|
||||||
'custom_system_message',
|
'custom_system_message',
|
||||||
'chat_template_str',
|
'chat_template_str',
|
||||||
|
|
||||||
# Parameters tab (ui_parameters.py)
|
# Parameters tab (ui_parameters.py) - Generation parameters
|
||||||
'preset_menu',
|
'preset_menu',
|
||||||
|
'temperature',
|
||||||
|
'dynatemp_low',
|
||||||
|
'dynatemp_high',
|
||||||
|
'dynatemp_exponent',
|
||||||
|
'smoothing_factor',
|
||||||
|
'smoothing_curve',
|
||||||
|
'min_p',
|
||||||
|
'top_p',
|
||||||
|
'top_k',
|
||||||
|
'typical_p',
|
||||||
|
'xtc_threshold',
|
||||||
|
'xtc_probability',
|
||||||
|
'epsilon_cutoff',
|
||||||
|
'eta_cutoff',
|
||||||
|
'tfs',
|
||||||
|
'top_a',
|
||||||
|
'top_n_sigma',
|
||||||
|
'dry_multiplier',
|
||||||
|
'dry_allowed_length',
|
||||||
|
'dry_base',
|
||||||
|
'repetition_penalty',
|
||||||
|
'frequency_penalty',
|
||||||
|
'presence_penalty',
|
||||||
|
'encoder_repetition_penalty',
|
||||||
|
'no_repeat_ngram_size',
|
||||||
|
'repetition_penalty_range',
|
||||||
|
'penalty_alpha',
|
||||||
|
'guidance_scale',
|
||||||
|
'mirostat_mode',
|
||||||
|
'mirostat_tau',
|
||||||
|
'mirostat_eta',
|
||||||
'max_new_tokens',
|
'max_new_tokens',
|
||||||
'prompt_lookup_num_tokens',
|
'prompt_lookup_num_tokens',
|
||||||
'max_tokens_second',
|
'max_tokens_second',
|
||||||
|
'do_sample',
|
||||||
|
'dynamic_temperature',
|
||||||
|
'temperature_last',
|
||||||
'auto_max_new_tokens',
|
'auto_max_new_tokens',
|
||||||
'ban_eos_token',
|
'ban_eos_token',
|
||||||
'add_bos_token',
|
'add_bos_token',
|
||||||
|
|
@ -417,10 +455,14 @@ def setup_auto_save():
|
||||||
'skip_special_tokens',
|
'skip_special_tokens',
|
||||||
'stream',
|
'stream',
|
||||||
'static_cache',
|
'static_cache',
|
||||||
|
'truncation_length',
|
||||||
'seed',
|
'seed',
|
||||||
|
'sampler_priority',
|
||||||
'custom_stopping_strings',
|
'custom_stopping_strings',
|
||||||
'custom_token_bans',
|
'custom_token_bans',
|
||||||
'negative_prompt',
|
'negative_prompt',
|
||||||
|
'dry_sequence_breakers',
|
||||||
|
'grammar_string',
|
||||||
|
|
||||||
# Default tab (ui_default.py)
|
# Default tab (ui_default.py)
|
||||||
'prompt_menu-default',
|
'prompt_menu-default',
|
||||||
|
|
|
||||||
|
|
@ -86,7 +86,7 @@ def create_ui():
|
||||||
shared.gradio['web_search_pages'] = gr.Number(value=shared.settings.get('web_search_pages', 3), precision=0, label='Number of pages to download', minimum=1, maximum=10)
|
shared.gradio['web_search_pages'] = gr.Number(value=shared.settings.get('web_search_pages', 3), precision=0, label='Number of pages to download', minimum=1, maximum=10)
|
||||||
|
|
||||||
with gr.Row():
|
with gr.Row():
|
||||||
shared.gradio['mode'] = gr.Radio(choices=['instruct', 'chat-instruct', 'chat'], value=shared.settings['mode'] if shared.settings['mode'] in ['chat', 'chat-instruct'] else None, label='Mode', info='Defines how the chat prompt is generated. In instruct and chat-instruct modes, the instruction template Parameters > Instruction template is used.', elem_id='chat-mode')
|
shared.gradio['mode'] = gr.Radio(choices=['instruct', 'chat-instruct', 'chat'], value=None, label='Mode', info='Defines how the chat prompt is generated. In instruct and chat-instruct modes, the instruction template Parameters > Instruction template is used.', elem_id='chat-mode')
|
||||||
|
|
||||||
with gr.Row():
|
with gr.Row():
|
||||||
shared.gradio['chat_style'] = gr.Dropdown(choices=utils.get_available_chat_styles(), label='Chat style', value=shared.settings['chat_style'], visible=shared.settings['mode'] != 'instruct')
|
shared.gradio['chat_style'] = gr.Dropdown(choices=utils.get_available_chat_styles(), label='Chat style', value=shared.settings['chat_style'], visible=shared.settings['mode'] != 'instruct')
|
||||||
|
|
@ -118,14 +118,16 @@ def create_chat_settings_ui():
|
||||||
with gr.Column(scale=8):
|
with gr.Column(scale=8):
|
||||||
with gr.Tab("Character"):
|
with gr.Tab("Character"):
|
||||||
with gr.Row():
|
with gr.Row():
|
||||||
shared.gradio['character_menu'] = gr.Dropdown(value=None, choices=utils.get_available_characters(), label='Character', elem_id='character-menu', info='Used in chat and chat-instruct modes.', elem_classes='slim-dropdown')
|
shared.gradio['character_menu'] = gr.Dropdown(value=shared.settings['character'], choices=utils.get_available_characters(), label='Character', elem_id='character-menu', info='Used in chat and chat-instruct modes.', elem_classes='slim-dropdown')
|
||||||
ui.create_refresh_button(shared.gradio['character_menu'], lambda: None, lambda: {'choices': utils.get_available_characters()}, 'refresh-button', interactive=not mu)
|
ui.create_refresh_button(shared.gradio['character_menu'], lambda: None, lambda: {'choices': utils.get_available_characters()}, 'refresh-button', interactive=not mu)
|
||||||
shared.gradio['save_character'] = gr.Button('💾', elem_classes='refresh-button', elem_id="save-character", interactive=not mu)
|
shared.gradio['save_character'] = gr.Button('💾', elem_classes='refresh-button', elem_id="save-character", interactive=not mu)
|
||||||
shared.gradio['delete_character'] = gr.Button('🗑️', elem_classes='refresh-button', interactive=not mu)
|
shared.gradio['delete_character'] = gr.Button('🗑️', elem_classes='refresh-button', interactive=not mu)
|
||||||
|
shared.gradio['reset_character'] = gr.Button('↺', elem_classes='refresh-button', interactive=True)
|
||||||
|
shared.gradio['clear_character'] = gr.Button('⚪', elem_classes='refresh-button', interactive=True)
|
||||||
|
|
||||||
shared.gradio['name2'] = gr.Textbox(value='', lines=1, label='Character\'s name')
|
shared.gradio['name2'] = gr.Textbox(value=shared.settings['name2'], lines=1, label='Character\'s name')
|
||||||
shared.gradio['context'] = gr.Textbox(value='', lines=10, label='Context', elem_classes=['add_scrollbar'])
|
shared.gradio['context'] = gr.Textbox(value=shared.settings['context'], lines=10, label='Context', elem_classes=['add_scrollbar'])
|
||||||
shared.gradio['greeting'] = gr.Textbox(value='', lines=5, label='Greeting', elem_classes=['add_scrollbar'])
|
shared.gradio['greeting'] = gr.Textbox(value=shared.settings['greeting'], lines=5, label='Greeting', elem_classes=['add_scrollbar'])
|
||||||
|
|
||||||
with gr.Tab("User"):
|
with gr.Tab("User"):
|
||||||
shared.gradio['name1'] = gr.Textbox(value=shared.settings['name1'], lines=1, label='Name')
|
shared.gradio['name1'] = gr.Textbox(value=shared.settings['name1'], lines=1, label='Name')
|
||||||
|
|
@ -178,7 +180,7 @@ def create_chat_settings_ui():
|
||||||
with gr.Row():
|
with gr.Row():
|
||||||
with gr.Column():
|
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['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, info='This gets autodetected; you usually don\'t need to change it. Used in instruct and chat-instruct modes.', elem_classes=['add_scrollbar', 'monospace'])
|
shared.gradio['instruction_template_str'] = gr.Textbox(value=shared.settings['instruction_template_str'], label='Instruction template', lines=24, info='This gets autodetected; you usually don\'t need to change it. Used in instruct and chat-instruct modes.', elem_classes=['add_scrollbar', 'monospace'])
|
||||||
with gr.Row():
|
with gr.Row():
|
||||||
shared.gradio['send_instruction_to_default'] = gr.Button('Send to default', elem_classes=['small-button'])
|
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_notebook'] = gr.Button('Send to notebook', elem_classes=['small-button'])
|
||||||
|
|
@ -294,6 +296,8 @@ def create_event_handlers():
|
||||||
chat.handle_character_menu_change, gradio('interface_state'), gradio('history', 'display', 'name1', 'name2', 'character_picture', 'greeting', 'context', 'unique_id'), show_progress=False).then(
|
chat.handle_character_menu_change, gradio('interface_state'), gradio('history', 'display', 'name1', 'name2', 'character_picture', 'greeting', 'context', 'unique_id'), show_progress=False).then(
|
||||||
None, None, None, js=f'() => {{{ui.update_big_picture_js}; updateBigPicture()}}')
|
None, None, None, js=f'() => {{{ui.update_big_picture_js}; updateBigPicture()}}')
|
||||||
|
|
||||||
|
shared.gradio['character_picture'].change(chat.handle_character_picture_change, gradio('character_picture'), None, show_progress=False)
|
||||||
|
|
||||||
shared.gradio['mode'].change(
|
shared.gradio['mode'].change(
|
||||||
ui.gather_interface_values, gradio(shared.input_elements), gradio('interface_state')).then(
|
ui.gather_interface_values, gradio(shared.input_elements), gradio('interface_state')).then(
|
||||||
chat.handle_mode_change, gradio('interface_state'), gradio('history', 'display', 'chat_style', 'chat-instruct_command', 'unique_id'), show_progress=False).then(
|
chat.handle_mode_change, gradio('interface_state'), gradio('history', 'display', 'chat_style', 'chat-instruct_command', 'unique_id'), show_progress=False).then(
|
||||||
|
|
@ -317,6 +321,10 @@ def create_event_handlers():
|
||||||
ui.gather_interface_values, gradio(shared.input_elements), gradio('interface_state')).then(
|
ui.gather_interface_values, gradio(shared.input_elements), gradio('interface_state')).then(
|
||||||
chat.handle_save_template_click, gradio('instruction_template_str'), gradio('save_filename', 'save_root', 'save_contents', 'file_saver'), show_progress=False)
|
chat.handle_save_template_click, gradio('instruction_template_str'), gradio('save_filename', 'save_root', 'save_contents', 'file_saver'), show_progress=False)
|
||||||
|
|
||||||
|
shared.gradio['reset_character'].click(
|
||||||
|
ui.gather_interface_values, gradio(shared.input_elements), gradio('interface_state')).then(
|
||||||
|
chat.reset_character_for_ui, gradio('interface_state'), gradio('interface_state', 'name2', 'context', 'greeting', 'character_picture'), show_progress=False)
|
||||||
|
|
||||||
shared.gradio['delete_template'].click(chat.handle_delete_template_click, gradio('instruction_template'), gradio('delete_filename', 'delete_root', 'file_deleter'), show_progress=False)
|
shared.gradio['delete_template'].click(chat.handle_delete_template_click, gradio('instruction_template'), gradio('delete_filename', 'delete_root', 'file_deleter'), show_progress=False)
|
||||||
shared.gradio['save_chat_history'].click(
|
shared.gradio['save_chat_history'].click(
|
||||||
lambda x: json.dumps(x, indent=4), gradio('history'), gradio('temporary_text')).then(
|
lambda x: json.dumps(x, indent=4), gradio('history'), gradio('temporary_text')).then(
|
||||||
|
|
|
||||||
|
|
@ -19,7 +19,7 @@ def create_ui():
|
||||||
with gr.Row():
|
with gr.Row():
|
||||||
with gr.Column():
|
with gr.Column():
|
||||||
with gr.Row():
|
with gr.Row():
|
||||||
shared.gradio['textbox-default'] = gr.Textbox(value='', lines=27, label='Input', elem_classes=['textbox_default', 'add_scrollbar'])
|
shared.gradio['textbox-default'] = gr.Textbox(value=load_prompt(shared.settings['prompt-default']), lines=27, label='Input', elem_classes=['textbox_default', 'add_scrollbar'])
|
||||||
shared.gradio['token-counter-default'] = gr.HTML(value="<span>0</span>", elem_id="default-token-counter")
|
shared.gradio['token-counter-default'] = gr.HTML(value="<span>0</span>", elem_id="default-token-counter")
|
||||||
|
|
||||||
with gr.Row():
|
with gr.Row():
|
||||||
|
|
@ -28,7 +28,7 @@ def create_ui():
|
||||||
shared.gradio['Generate-default'] = gr.Button('Generate', variant='primary')
|
shared.gradio['Generate-default'] = gr.Button('Generate', variant='primary')
|
||||||
|
|
||||||
with gr.Row():
|
with gr.Row():
|
||||||
shared.gradio['prompt_menu-default'] = gr.Dropdown(choices=utils.get_available_prompts(), value='None', label='Prompt', elem_classes='slim-dropdown')
|
shared.gradio['prompt_menu-default'] = gr.Dropdown(choices=utils.get_available_prompts(), value=shared.settings['prompt-default'], label='Prompt', elem_classes='slim-dropdown')
|
||||||
ui.create_refresh_button(shared.gradio['prompt_menu-default'], lambda: None, lambda: {'choices': utils.get_available_prompts()}, 'refresh-button', interactive=not mu)
|
ui.create_refresh_button(shared.gradio['prompt_menu-default'], lambda: None, lambda: {'choices': utils.get_available_prompts()}, 'refresh-button', interactive=not mu)
|
||||||
shared.gradio['save_prompt-default'] = gr.Button('💾', elem_classes='refresh-button', interactive=not mu)
|
shared.gradio['save_prompt-default'] = gr.Button('💾', elem_classes='refresh-button', interactive=not mu)
|
||||||
shared.gradio['delete_prompt-default'] = gr.Button('🗑️', elem_classes='refresh-button', interactive=not mu)
|
shared.gradio['delete_prompt-default'] = gr.Button('🗑️', elem_classes='refresh-button', interactive=not mu)
|
||||||
|
|
|
||||||
|
|
@ -22,7 +22,7 @@ def create_ui():
|
||||||
with gr.Column(scale=4):
|
with gr.Column(scale=4):
|
||||||
with gr.Tab('Raw'):
|
with gr.Tab('Raw'):
|
||||||
with gr.Row():
|
with gr.Row():
|
||||||
shared.gradio['textbox-notebook'] = gr.Textbox(value='', lines=27, elem_id='textbox-notebook', elem_classes=['textbox', 'add_scrollbar'])
|
shared.gradio['textbox-notebook'] = gr.Textbox(value=load_prompt(shared.settings['prompt-notebook']), lines=27, elem_id='textbox-notebook', elem_classes=['textbox', 'add_scrollbar'])
|
||||||
shared.gradio['token-counter-notebook'] = gr.HTML(value="<span>0</span>", elem_id="notebook-token-counter")
|
shared.gradio['token-counter-notebook'] = gr.HTML(value="<span>0</span>", elem_id="notebook-token-counter")
|
||||||
|
|
||||||
with gr.Tab('Markdown'):
|
with gr.Tab('Markdown'):
|
||||||
|
|
@ -56,7 +56,7 @@ def create_ui():
|
||||||
with gr.Column(scale=1):
|
with gr.Column(scale=1):
|
||||||
gr.HTML('<div style="padding-bottom: 13px"></div>')
|
gr.HTML('<div style="padding-bottom: 13px"></div>')
|
||||||
with gr.Row():
|
with gr.Row():
|
||||||
shared.gradio['prompt_menu-notebook'] = gr.Dropdown(choices=utils.get_available_prompts(), value='None', label='Prompt', elem_classes='slim-dropdown')
|
shared.gradio['prompt_menu-notebook'] = gr.Dropdown(choices=utils.get_available_prompts(), value=shared.settings['prompt-notebook'], label='Prompt', elem_classes='slim-dropdown')
|
||||||
ui.create_refresh_button(shared.gradio['prompt_menu-notebook'], lambda: None, lambda: {'choices': utils.get_available_prompts()}, ['refresh-button', 'refresh-button-small'], interactive=not mu)
|
ui.create_refresh_button(shared.gradio['prompt_menu-notebook'], lambda: None, lambda: {'choices': utils.get_available_prompts()}, ['refresh-button', 'refresh-button-small'], interactive=not mu)
|
||||||
shared.gradio['save_prompt-notebook'] = gr.Button('💾', elem_classes=['refresh-button', 'refresh-button-small'], interactive=not mu)
|
shared.gradio['save_prompt-notebook'] = gr.Button('💾', elem_classes=['refresh-button', 'refresh-button-small'], interactive=not mu)
|
||||||
shared.gradio['delete_prompt-notebook'] = gr.Button('🗑️', elem_classes=['refresh-button', 'refresh-button-small'], interactive=not mu)
|
shared.gradio['delete_prompt-notebook'] = gr.Button('🗑️', elem_classes=['refresh-button', 'refresh-button-small'], interactive=not mu)
|
||||||
|
|
|
||||||
|
|
@ -6,19 +6,19 @@ from modules import loaders, presets, shared, ui, ui_chat, utils
|
||||||
from modules.utils import gradio
|
from modules.utils import gradio
|
||||||
|
|
||||||
|
|
||||||
def create_ui(default_preset):
|
def create_ui():
|
||||||
mu = shared.args.multi_user
|
mu = shared.args.multi_user
|
||||||
generate_params = presets.load_preset(default_preset)
|
|
||||||
with gr.Tab("Parameters", elem_id="parameters"):
|
with gr.Tab("Parameters", elem_id="parameters"):
|
||||||
with gr.Tab("Generation"):
|
with gr.Tab("Generation"):
|
||||||
with gr.Row():
|
with gr.Row():
|
||||||
with gr.Column():
|
with gr.Column():
|
||||||
with gr.Row():
|
with gr.Row():
|
||||||
shared.gradio['preset_menu'] = gr.Dropdown(choices=utils.get_available_presets(), value=default_preset, label='Preset', elem_classes='slim-dropdown')
|
shared.gradio['preset_menu'] = gr.Dropdown(choices=utils.get_available_presets(), value=shared.settings['preset'], label='Preset', elem_classes='slim-dropdown')
|
||||||
ui.create_refresh_button(shared.gradio['preset_menu'], lambda: None, lambda: {'choices': utils.get_available_presets()}, 'refresh-button', interactive=not mu)
|
ui.create_refresh_button(shared.gradio['preset_menu'], lambda: None, lambda: {'choices': utils.get_available_presets()}, 'refresh-button', interactive=not mu)
|
||||||
shared.gradio['save_preset'] = gr.Button('💾', elem_classes='refresh-button', interactive=not mu)
|
shared.gradio['save_preset'] = gr.Button('💾', elem_classes='refresh-button', interactive=not mu)
|
||||||
shared.gradio['delete_preset'] = gr.Button('🗑️', elem_classes='refresh-button', interactive=not mu)
|
shared.gradio['delete_preset'] = gr.Button('🗑️', elem_classes='refresh-button', interactive=not mu)
|
||||||
shared.gradio['random_preset'] = gr.Button('🎲', elem_classes='refresh-button')
|
shared.gradio['reset_preset'] = gr.Button('Reload preset', elem_classes='refresh-button', interactive=True)
|
||||||
|
shared.gradio['neutralize_samplers'] = gr.Button('Neutralize samplers', elem_classes='refresh-button', interactive=True)
|
||||||
|
|
||||||
with gr.Column():
|
with gr.Column():
|
||||||
shared.gradio['filter_by_loader'] = gr.Dropdown(label="Filter by loader", choices=["All"] + list(loaders.loaders_and_params.keys()) if not shared.args.portable else ['llama.cpp'], value="All", elem_classes='slim-dropdown')
|
shared.gradio['filter_by_loader'] = gr.Dropdown(label="Filter by loader", choices=["All"] + list(loaders.loaders_and_params.keys()) if not shared.args.portable else ['llama.cpp'], value="All", elem_classes='slim-dropdown')
|
||||||
|
|
@ -28,44 +28,44 @@ def create_ui(default_preset):
|
||||||
with gr.Row():
|
with gr.Row():
|
||||||
with gr.Column():
|
with gr.Column():
|
||||||
gr.Markdown('## Curve shape')
|
gr.Markdown('## Curve shape')
|
||||||
shared.gradio['temperature'] = gr.Slider(0.01, 5, value=generate_params['temperature'], step=0.01, label='temperature')
|
shared.gradio['temperature'] = gr.Slider(0.01, 5, value=shared.settings['temperature'], step=0.01, label='temperature')
|
||||||
shared.gradio['dynatemp_low'] = gr.Slider(0.01, 5, value=generate_params['dynatemp_low'], step=0.01, label='dynatemp_low', visible=generate_params['dynamic_temperature'])
|
shared.gradio['dynatemp_low'] = gr.Slider(0.01, 5, value=shared.settings['dynatemp_low'], step=0.01, label='dynatemp_low', visible=shared.settings['dynamic_temperature'])
|
||||||
shared.gradio['dynatemp_high'] = gr.Slider(0.01, 5, value=generate_params['dynatemp_high'], step=0.01, label='dynatemp_high', visible=generate_params['dynamic_temperature'])
|
shared.gradio['dynatemp_high'] = gr.Slider(0.01, 5, value=shared.settings['dynatemp_high'], step=0.01, label='dynatemp_high', visible=shared.settings['dynamic_temperature'])
|
||||||
shared.gradio['dynatemp_exponent'] = gr.Slider(0.01, 5, value=generate_params['dynatemp_exponent'], step=0.01, label='dynatemp_exponent', visible=generate_params['dynamic_temperature'])
|
shared.gradio['dynatemp_exponent'] = gr.Slider(0.01, 5, value=shared.settings['dynatemp_exponent'], step=0.01, label='dynatemp_exponent', visible=shared.settings['dynamic_temperature'])
|
||||||
shared.gradio['smoothing_factor'] = gr.Slider(0.0, 10.0, value=generate_params['smoothing_factor'], step=0.01, label='smoothing_factor', info='Activates Quadratic Sampling.')
|
shared.gradio['smoothing_factor'] = gr.Slider(0.0, 10.0, value=shared.settings['smoothing_factor'], step=0.01, label='smoothing_factor', info='Activates Quadratic Sampling.')
|
||||||
shared.gradio['smoothing_curve'] = gr.Slider(1.0, 10.0, value=generate_params['smoothing_curve'], step=0.01, label='smoothing_curve', info='Adjusts the dropoff curve of Quadratic Sampling.')
|
shared.gradio['smoothing_curve'] = gr.Slider(1.0, 10.0, value=shared.settings['smoothing_curve'], step=0.01, label='smoothing_curve', info='Adjusts the dropoff curve of Quadratic Sampling.')
|
||||||
|
|
||||||
gr.Markdown('## Curve cutoff')
|
gr.Markdown('## Curve cutoff')
|
||||||
shared.gradio['min_p'] = gr.Slider(0.0, 1.0, value=generate_params['min_p'], step=0.01, label='min_p')
|
shared.gradio['min_p'] = gr.Slider(0.0, 1.0, value=shared.settings['min_p'], step=0.01, label='min_p')
|
||||||
shared.gradio['top_n_sigma'] = gr.Slider(0.0, 5.0, value=generate_params['top_n_sigma'], step=0.01, label='top_n_sigma')
|
shared.gradio['top_n_sigma'] = gr.Slider(0.0, 5.0, value=shared.settings['top_n_sigma'], step=0.01, label='top_n_sigma')
|
||||||
shared.gradio['top_p'] = gr.Slider(0.0, 1.0, value=generate_params['top_p'], step=0.01, label='top_p')
|
shared.gradio['top_p'] = gr.Slider(0.0, 1.0, value=shared.settings['top_p'], step=0.01, label='top_p')
|
||||||
shared.gradio['top_k'] = gr.Slider(0, 200, value=generate_params['top_k'], step=1, label='top_k')
|
shared.gradio['top_k'] = gr.Slider(0, 200, value=shared.settings['top_k'], step=1, label='top_k')
|
||||||
shared.gradio['typical_p'] = gr.Slider(0.0, 1.0, value=generate_params['typical_p'], step=0.01, label='typical_p')
|
shared.gradio['typical_p'] = gr.Slider(0.0, 1.0, value=shared.settings['typical_p'], step=0.01, label='typical_p')
|
||||||
shared.gradio['xtc_threshold'] = gr.Slider(0, 0.5, value=generate_params['xtc_threshold'], step=0.01, label='xtc_threshold', info='If 2 or more tokens have probability above this threshold, consider removing all but the last one.')
|
shared.gradio['xtc_threshold'] = gr.Slider(0, 0.5, value=shared.settings['xtc_threshold'], step=0.01, label='xtc_threshold', info='If 2 or more tokens have probability above this threshold, consider removing all but the last one.')
|
||||||
shared.gradio['xtc_probability'] = gr.Slider(0, 1, value=generate_params['xtc_probability'], step=0.01, label='xtc_probability', info='Probability that the removal will actually happen. 0 disables the sampler. 1 makes it always happen.')
|
shared.gradio['xtc_probability'] = gr.Slider(0, 1, value=shared.settings['xtc_probability'], step=0.01, label='xtc_probability', info='Probability that the removal will actually happen. 0 disables the sampler. 1 makes it always happen.')
|
||||||
shared.gradio['epsilon_cutoff'] = gr.Slider(0, 9, value=generate_params['epsilon_cutoff'], step=0.01, label='epsilon_cutoff')
|
shared.gradio['epsilon_cutoff'] = gr.Slider(0, 9, value=shared.settings['epsilon_cutoff'], step=0.01, label='epsilon_cutoff')
|
||||||
shared.gradio['eta_cutoff'] = gr.Slider(0, 20, value=generate_params['eta_cutoff'], step=0.01, label='eta_cutoff')
|
shared.gradio['eta_cutoff'] = gr.Slider(0, 20, value=shared.settings['eta_cutoff'], step=0.01, label='eta_cutoff')
|
||||||
shared.gradio['tfs'] = gr.Slider(0.0, 1.0, value=generate_params['tfs'], step=0.01, label='tfs')
|
shared.gradio['tfs'] = gr.Slider(0.0, 1.0, value=shared.settings['tfs'], step=0.01, label='tfs')
|
||||||
shared.gradio['top_a'] = gr.Slider(0.0, 1.0, value=generate_params['top_a'], step=0.01, label='top_a')
|
shared.gradio['top_a'] = gr.Slider(0.0, 1.0, value=shared.settings['top_a'], step=0.01, label='top_a')
|
||||||
|
|
||||||
gr.Markdown('## Repetition suppression')
|
gr.Markdown('## Repetition suppression')
|
||||||
shared.gradio['dry_multiplier'] = gr.Slider(0, 5, value=generate_params['dry_multiplier'], step=0.01, label='dry_multiplier', info='Set to greater than 0 to enable DRY. Recommended value: 0.8.')
|
shared.gradio['dry_multiplier'] = gr.Slider(0, 5, value=shared.settings['dry_multiplier'], step=0.01, label='dry_multiplier', info='Set to greater than 0 to enable DRY. Recommended value: 0.8.')
|
||||||
shared.gradio['dry_allowed_length'] = gr.Slider(1, 20, value=generate_params['dry_allowed_length'], step=1, label='dry_allowed_length', info='Longest sequence that can be repeated without being penalized.')
|
shared.gradio['dry_allowed_length'] = gr.Slider(1, 20, value=shared.settings['dry_allowed_length'], step=1, label='dry_allowed_length', info='Longest sequence that can be repeated without being penalized.')
|
||||||
shared.gradio['dry_base'] = gr.Slider(1, 4, value=generate_params['dry_base'], step=0.01, label='dry_base', info='Controls how fast the penalty grows with increasing sequence length.')
|
shared.gradio['dry_base'] = gr.Slider(1, 4, value=shared.settings['dry_base'], step=0.01, label='dry_base', info='Controls how fast the penalty grows with increasing sequence length.')
|
||||||
shared.gradio['repetition_penalty'] = gr.Slider(1.0, 1.5, value=generate_params['repetition_penalty'], step=0.01, label='repetition_penalty')
|
shared.gradio['repetition_penalty'] = gr.Slider(1.0, 1.5, value=shared.settings['repetition_penalty'], step=0.01, label='repetition_penalty')
|
||||||
shared.gradio['frequency_penalty'] = gr.Slider(0, 2, value=generate_params['frequency_penalty'], step=0.05, label='frequency_penalty')
|
shared.gradio['frequency_penalty'] = gr.Slider(0, 2, value=shared.settings['frequency_penalty'], step=0.05, label='frequency_penalty')
|
||||||
shared.gradio['presence_penalty'] = gr.Slider(0, 2, value=generate_params['presence_penalty'], step=0.05, label='presence_penalty')
|
shared.gradio['presence_penalty'] = gr.Slider(0, 2, value=shared.settings['presence_penalty'], step=0.05, label='presence_penalty')
|
||||||
shared.gradio['encoder_repetition_penalty'] = gr.Slider(0.8, 1.5, value=generate_params['encoder_repetition_penalty'], step=0.01, label='encoder_repetition_penalty')
|
shared.gradio['encoder_repetition_penalty'] = gr.Slider(0.8, 1.5, value=shared.settings['encoder_repetition_penalty'], step=0.01, label='encoder_repetition_penalty')
|
||||||
shared.gradio['no_repeat_ngram_size'] = gr.Slider(0, 20, step=1, value=generate_params['no_repeat_ngram_size'], label='no_repeat_ngram_size')
|
shared.gradio['no_repeat_ngram_size'] = gr.Slider(0, 20, step=1, value=shared.settings['no_repeat_ngram_size'], label='no_repeat_ngram_size')
|
||||||
shared.gradio['repetition_penalty_range'] = gr.Slider(0, 4096, step=64, value=generate_params['repetition_penalty_range'], label='repetition_penalty_range')
|
shared.gradio['repetition_penalty_range'] = gr.Slider(0, 4096, step=64, value=shared.settings['repetition_penalty_range'], label='repetition_penalty_range')
|
||||||
|
|
||||||
with gr.Column():
|
with gr.Column():
|
||||||
gr.Markdown('## Alternative sampling methods')
|
gr.Markdown('## Alternative sampling methods')
|
||||||
shared.gradio['penalty_alpha'] = gr.Slider(0, 5, value=generate_params['penalty_alpha'], label='penalty_alpha', info='For Contrastive Search. do_sample must be unchecked.')
|
shared.gradio['penalty_alpha'] = gr.Slider(0, 5, value=shared.settings['penalty_alpha'], label='penalty_alpha', info='For Contrastive Search. do_sample must be unchecked.')
|
||||||
shared.gradio['guidance_scale'] = gr.Slider(-0.5, 2.5, step=0.05, value=generate_params['guidance_scale'], label='guidance_scale', info='For CFG. 1.5 is a good value.')
|
shared.gradio['guidance_scale'] = gr.Slider(-0.5, 2.5, step=0.05, value=shared.settings['guidance_scale'], label='guidance_scale', info='For CFG. 1.5 is a good value.')
|
||||||
shared.gradio['mirostat_mode'] = gr.Slider(0, 2, step=1, value=generate_params['mirostat_mode'], label='mirostat_mode', info='mode=1 is for llama.cpp only.')
|
shared.gradio['mirostat_mode'] = gr.Slider(0, 2, step=1, value=shared.settings['mirostat_mode'], label='mirostat_mode', info='mode=1 is for llama.cpp only.')
|
||||||
shared.gradio['mirostat_tau'] = gr.Slider(0, 10, step=0.01, value=generate_params['mirostat_tau'], label='mirostat_tau')
|
shared.gradio['mirostat_tau'] = gr.Slider(0, 10, step=0.01, value=shared.settings['mirostat_tau'], label='mirostat_tau')
|
||||||
shared.gradio['mirostat_eta'] = gr.Slider(0, 1, step=0.01, value=generate_params['mirostat_eta'], label='mirostat_eta')
|
shared.gradio['mirostat_eta'] = gr.Slider(0, 1, step=0.01, value=shared.settings['mirostat_eta'], label='mirostat_eta')
|
||||||
|
|
||||||
gr.Markdown('## Other options')
|
gr.Markdown('## Other options')
|
||||||
shared.gradio['max_new_tokens'] = gr.Slider(minimum=shared.settings['max_new_tokens_min'], maximum=shared.settings['max_new_tokens_max'], value=shared.settings['max_new_tokens'], step=1, label='max_new_tokens', info='⚠️ Setting this too high can cause prompt truncation.')
|
shared.gradio['max_new_tokens'] = gr.Slider(minimum=shared.settings['max_new_tokens_min'], maximum=shared.settings['max_new_tokens_max'], value=shared.settings['max_new_tokens'], step=1, label='max_new_tokens', info='⚠️ Setting this too high can cause prompt truncation.')
|
||||||
|
|
@ -74,9 +74,9 @@ def create_ui(default_preset):
|
||||||
with gr.Column():
|
with gr.Column():
|
||||||
with gr.Row():
|
with gr.Row():
|
||||||
with gr.Column():
|
with gr.Column():
|
||||||
shared.gradio['do_sample'] = gr.Checkbox(value=generate_params['do_sample'], label='do_sample')
|
shared.gradio['do_sample'] = gr.Checkbox(value=shared.settings['do_sample'], label='do_sample')
|
||||||
shared.gradio['dynamic_temperature'] = gr.Checkbox(value=generate_params['dynamic_temperature'], label='dynamic_temperature')
|
shared.gradio['dynamic_temperature'] = gr.Checkbox(value=shared.settings['dynamic_temperature'], label='dynamic_temperature')
|
||||||
shared.gradio['temperature_last'] = gr.Checkbox(value=generate_params['temperature_last'], label='temperature_last', info='Moves temperature/dynamic temperature/quadratic sampling to the end of the sampler stack, ignoring their positions in "Sampler priority".')
|
shared.gradio['temperature_last'] = gr.Checkbox(value=shared.settings['temperature_last'], label='temperature_last', info='Moves temperature/dynamic temperature/quadratic sampling to the end of the sampler stack, ignoring their positions in "Sampler priority".')
|
||||||
shared.gradio['auto_max_new_tokens'] = gr.Checkbox(value=shared.settings['auto_max_new_tokens'], label='auto_max_new_tokens', info='Expand max_new_tokens to the available context length.')
|
shared.gradio['auto_max_new_tokens'] = gr.Checkbox(value=shared.settings['auto_max_new_tokens'], label='auto_max_new_tokens', info='Expand max_new_tokens to the available context length.')
|
||||||
shared.gradio['ban_eos_token'] = gr.Checkbox(value=shared.settings['ban_eos_token'], label='Ban the eos_token', info='Forces the model to never end the generation prematurely.')
|
shared.gradio['ban_eos_token'] = gr.Checkbox(value=shared.settings['ban_eos_token'], label='Ban the eos_token', info='Forces the model to never end the generation prematurely.')
|
||||||
shared.gradio['add_bos_token'] = gr.Checkbox(value=shared.settings['add_bos_token'], label='Add the bos_token to the beginning of prompts', info='Disabling this can make the replies more creative.')
|
shared.gradio['add_bos_token'] = gr.Checkbox(value=shared.settings['add_bos_token'], label='Add the bos_token to the beginning of prompts', info='Disabling this can make the replies more creative.')
|
||||||
|
|
@ -89,18 +89,18 @@ def create_ui(default_preset):
|
||||||
shared.gradio['truncation_length'] = gr.Number(precision=0, step=256, value=get_truncation_length(), label='Truncate the prompt up to this length', info='The leftmost tokens are removed if the prompt exceeds this length.')
|
shared.gradio['truncation_length'] = gr.Number(precision=0, step=256, value=get_truncation_length(), label='Truncate the prompt up to this length', info='The leftmost tokens are removed if the prompt exceeds this length.')
|
||||||
shared.gradio['seed'] = gr.Number(value=shared.settings['seed'], label='Seed (-1 for random)')
|
shared.gradio['seed'] = gr.Number(value=shared.settings['seed'], label='Seed (-1 for random)')
|
||||||
|
|
||||||
shared.gradio['sampler_priority'] = gr.Textbox(value=generate_params['sampler_priority'], lines=12, label='Sampler priority', info='Parameter names separated by new lines or commas.', elem_classes=['add_scrollbar'])
|
shared.gradio['sampler_priority'] = gr.Textbox(value=shared.settings['sampler_priority'], lines=12, label='Sampler priority', info='Parameter names separated by new lines or commas.', elem_classes=['add_scrollbar'])
|
||||||
shared.gradio['custom_stopping_strings'] = gr.Textbox(lines=2, value=shared.settings["custom_stopping_strings"] or None, label='Custom stopping strings', info='Written between "" and separated by commas.', placeholder='"\\n", "\\nYou:"')
|
shared.gradio['custom_stopping_strings'] = gr.Textbox(lines=2, value=shared.settings["custom_stopping_strings"] or None, label='Custom stopping strings', info='Written between "" and separated by commas.', placeholder='"\\n", "\\nYou:"')
|
||||||
shared.gradio['custom_token_bans'] = gr.Textbox(value=shared.settings['custom_token_bans'] or None, label='Token bans', info='Token IDs to ban, separated by commas. The IDs can be found in the Default or Notebook tab.')
|
shared.gradio['custom_token_bans'] = gr.Textbox(value=shared.settings['custom_token_bans'] or None, label='Token bans', info='Token IDs to ban, separated by commas. The IDs can be found in the Default or Notebook tab.')
|
||||||
shared.gradio['negative_prompt'] = gr.Textbox(value=shared.settings['negative_prompt'], label='Negative prompt', info='For CFG. Only used when guidance_scale is different than 1.', lines=3, elem_classes=['add_scrollbar'])
|
shared.gradio['negative_prompt'] = gr.Textbox(value=shared.settings['negative_prompt'], label='Negative prompt', info='For CFG. Only used when guidance_scale is different than 1.', lines=3, elem_classes=['add_scrollbar'])
|
||||||
shared.gradio['dry_sequence_breakers'] = gr.Textbox(value=generate_params['dry_sequence_breakers'], label='dry_sequence_breakers', info='Tokens across which sequence matching is not continued. Specified as a comma-separated list of quoted strings.')
|
shared.gradio['dry_sequence_breakers'] = gr.Textbox(value=shared.settings['dry_sequence_breakers'], label='dry_sequence_breakers', info='Tokens across which sequence matching is not continued. Specified as a comma-separated list of quoted strings.')
|
||||||
with gr.Row() as shared.gradio['grammar_file_row']:
|
with gr.Row() as shared.gradio['grammar_file_row']:
|
||||||
shared.gradio['grammar_file'] = gr.Dropdown(value='None', choices=utils.get_available_grammars(), label='Load grammar from file (.gbnf)', elem_classes='slim-dropdown')
|
shared.gradio['grammar_file'] = gr.Dropdown(value='None', choices=utils.get_available_grammars(), label='Load grammar from file (.gbnf)', elem_classes='slim-dropdown')
|
||||||
ui.create_refresh_button(shared.gradio['grammar_file'], lambda: None, lambda: {'choices': utils.get_available_grammars()}, 'refresh-button', interactive=not mu)
|
ui.create_refresh_button(shared.gradio['grammar_file'], lambda: None, lambda: {'choices': utils.get_available_grammars()}, 'refresh-button', interactive=not mu)
|
||||||
shared.gradio['save_grammar'] = gr.Button('💾', elem_classes='refresh-button', interactive=not mu)
|
shared.gradio['save_grammar'] = gr.Button('💾', elem_classes='refresh-button', interactive=not mu)
|
||||||
shared.gradio['delete_grammar'] = gr.Button('🗑️ ', elem_classes='refresh-button', interactive=not mu)
|
shared.gradio['delete_grammar'] = gr.Button('🗑️ ', elem_classes='refresh-button', interactive=not mu)
|
||||||
|
|
||||||
shared.gradio['grammar_string'] = gr.Textbox(value='', label='Grammar', lines=16, elem_classes=['add_scrollbar', 'monospace'])
|
shared.gradio['grammar_string'] = gr.Textbox(value=shared.settings['grammar_string'], label='Grammar', lines=16, elem_classes=['add_scrollbar', 'monospace'])
|
||||||
|
|
||||||
ui_chat.create_chat_settings_ui()
|
ui_chat.create_chat_settings_ui()
|
||||||
|
|
||||||
|
|
@ -111,9 +111,13 @@ def create_event_handlers():
|
||||||
ui.gather_interface_values, gradio(shared.input_elements), gradio('interface_state')).then(
|
ui.gather_interface_values, gradio(shared.input_elements), gradio('interface_state')).then(
|
||||||
presets.load_preset_for_ui, gradio('preset_menu', 'interface_state'), gradio('interface_state') + gradio(presets.presets_params()), show_progress=False)
|
presets.load_preset_for_ui, gradio('preset_menu', 'interface_state'), gradio('interface_state') + gradio(presets.presets_params()), show_progress=False)
|
||||||
|
|
||||||
shared.gradio['random_preset'].click(
|
shared.gradio['reset_preset'].click(
|
||||||
ui.gather_interface_values, gradio(shared.input_elements), gradio('interface_state')).then(
|
ui.gather_interface_values, gradio(shared.input_elements), gradio('interface_state')).then(
|
||||||
presets.random_preset, gradio('interface_state'), gradio('interface_state') + gradio(presets.presets_params()), show_progress=False)
|
presets.reset_preset_for_ui, gradio('preset_menu', 'interface_state'), gradio('interface_state') + gradio(presets.presets_params()), show_progress=False)
|
||||||
|
|
||||||
|
shared.gradio['neutralize_samplers'].click(
|
||||||
|
ui.gather_interface_values, gradio(shared.input_elements), gradio('interface_state')).then(
|
||||||
|
presets.neutralize_samplers_for_ui, gradio('interface_state'), gradio('interface_state') + gradio(presets.presets_params()), show_progress=False)
|
||||||
|
|
||||||
shared.gradio['grammar_file'].change(load_grammar, gradio('grammar_file'), gradio('grammar_string'), show_progress=False)
|
shared.gradio['grammar_file'].change(load_grammar, gradio('grammar_file'), gradio('grammar_string'), show_progress=False)
|
||||||
shared.gradio['dynamic_temperature'].change(lambda x: [gr.update(visible=x)] * 3, gradio('dynamic_temperature'), gradio('dynatemp_low', 'dynatemp_high', 'dynatemp_exponent'), show_progress=False)
|
shared.gradio['dynamic_temperature'].change(lambda x: [gr.update(visible=x)] * 3, gradio('dynamic_temperature'), gradio('dynatemp_low', 'dynatemp_high', 'dynatemp_exponent'), show_progress=False)
|
||||||
|
|
|
||||||
20
server.py
20
server.py
|
|
@ -45,6 +45,7 @@ from modules import (
|
||||||
ui_session,
|
ui_session,
|
||||||
utils
|
utils
|
||||||
)
|
)
|
||||||
|
from modules.chat import generate_pfp_cache
|
||||||
from modules.extensions import apply_extensions
|
from modules.extensions import apply_extensions
|
||||||
from modules.LoRA import add_lora_to_model
|
from modules.LoRA import add_lora_to_model
|
||||||
from modules.models import load_model, unload_model_if_idle
|
from modules.models import load_model, unload_model_if_idle
|
||||||
|
|
@ -93,17 +94,20 @@ def create_interface():
|
||||||
|
|
||||||
# Force some events to be triggered on page load
|
# Force some events to be triggered on page load
|
||||||
shared.persistent_interface_state.update({
|
shared.persistent_interface_state.update({
|
||||||
|
'mode': shared.settings['mode'],
|
||||||
'loader': shared.args.loader or 'llama.cpp',
|
'loader': shared.args.loader or 'llama.cpp',
|
||||||
'mode': shared.settings['mode'] if shared.settings['mode'] == 'instruct' else gr.update(),
|
|
||||||
'character_menu': shared.args.character or shared.settings['character'],
|
|
||||||
'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') if not shared.args.portable else 'llama.cpp'
|
'filter_by_loader': (shared.args.loader or 'All') if not shared.args.portable else 'llama.cpp'
|
||||||
})
|
})
|
||||||
|
|
||||||
if Path("user_data/cache/pfp_character.png").exists():
|
# Clear existing cache files
|
||||||
Path("user_data/cache/pfp_character.png").unlink()
|
for cache_file in ['pfp_character.png', 'pfp_character_thumb.png']:
|
||||||
|
cache_path = Path(f"user_data/cache/{cache_file}")
|
||||||
|
if cache_path.exists():
|
||||||
|
cache_path.unlink()
|
||||||
|
|
||||||
|
# Regenerate for default character
|
||||||
|
if shared.settings['mode'] != 'instruct':
|
||||||
|
generate_pfp_cache(shared.settings['character'])
|
||||||
|
|
||||||
# css/js strings
|
# css/js strings
|
||||||
css = ui.css
|
css = ui.css
|
||||||
|
|
@ -134,7 +138,7 @@ def create_interface():
|
||||||
ui_default.create_ui()
|
ui_default.create_ui()
|
||||||
ui_notebook.create_ui()
|
ui_notebook.create_ui()
|
||||||
|
|
||||||
ui_parameters.create_ui(shared.settings['preset']) # Parameters tab
|
ui_parameters.create_ui() # Parameters tab
|
||||||
ui_model_menu.create_ui() # Model tab
|
ui_model_menu.create_ui() # Model tab
|
||||||
if not shared.args.portable:
|
if not shared.args.portable:
|
||||||
training.create_ui() # Training tab
|
training.create_ui() # Training tab
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue