2023-08-06 21:49:27 -03:00
import gradio as gr
from modules import shared , ui , utils
from modules . utils import gradio
def create_ui ( ) :
2023-09-26 05:44:04 -07:00
mu = shared . args . multi_user
2023-08-06 21:49:27 -03:00
with gr . Tab ( " Session " , elem_id = " session-tab " ) :
with gr . Row ( ) :
with gr . Column ( ) :
2025-06-08 09:20:21 -07:00
gr . Markdown ( " ## Settings " )
shared . gradio [ ' save_settings ' ] = gr . Button ( ' Save settings to user_data/settings.yaml ' , elem_classes = ' refresh-button ' , interactive = not mu )
shared . gradio [ ' toggle_dark_mode ' ] = gr . Button ( ' Toggle light/dark theme 💡 ' , elem_classes = ' refresh-button ' )
2025-06-08 09:31:38 -07:00
shared . gradio [ ' paste_to_attachment ' ] = gr . Checkbox ( label = ' Turn long pasted text into attachments in the Chat tab ' , value = shared . settings [ ' paste_to_attachment ' ] , elem_id = ' paste_to_attachment ' )
2023-08-06 21:49:27 -03:00
2025-06-08 09:20:21 -07:00
with gr . Column ( ) :
gr . Markdown ( " ## Extensions & flags " )
2025-06-07 22:46:52 -03:00
shared . gradio [ ' reset_interface ' ] = gr . Button ( " Apply flags/extensions and restart " , interactive = not mu )
2023-08-06 21:49:27 -03:00
with gr . Row ( ) :
with gr . Column ( ) :
shared . gradio [ ' extensions_menu ' ] = gr . CheckboxGroup ( choices = utils . get_available_extensions ( ) , value = shared . args . extensions , label = " Available extensions " , info = ' Note that some of these extensions may require manually installing Python requirements through the command: pip install -r extensions/extension_name/requirements.txt ' , elem_classes = ' checkboxgroup-table ' )
with gr . Column ( ) :
2023-08-13 01:12:15 -03:00
shared . gradio [ ' bool_menu ' ] = gr . CheckboxGroup ( choices = get_boolean_arguments ( ) , value = get_boolean_arguments ( active = True ) , label = " Boolean command-line flags " , elem_classes = ' checkboxgroup-table ' )
2023-08-06 21:49:27 -03:00
2024-01-09 04:20:10 -08:00
shared . gradio [ ' theme_state ' ] = gr . Textbox ( visible = False , value = ' dark ' if shared . settings [ ' dark_theme ' ] else ' light ' )
2025-06-08 09:09:36 -07:00
shared . gradio [ ' save_settings ' ] . click (
ui . gather_interface_values , gradio ( shared . input_elements ) , gradio ( ' interface_state ' ) ) . then (
handle_save_settings , gradio ( ' interface_state ' , ' preset_menu ' , ' extensions_menu ' , ' show_controls ' , ' theme_state ' ) , gradio ( ' save_contents ' , ' save_filename ' , ' save_root ' , ' file_saver ' ) , show_progress = False )
shared . gradio [ ' toggle_dark_mode ' ] . click (
lambda x : ' dark ' if x == ' light ' else ' light ' , gradio ( ' theme_state ' ) , gradio ( ' theme_state ' ) ) . then (
2025-06-08 15:04:05 -07:00
None , None , None , js = f ' () => {{ { ui . dark_theme_js } ; toggleDarkMode(); localStorage.setItem( " theme " , document.body.classList.contains( " dark " ) ? " dark " : " light " ) }} ' )
2025-06-08 09:09:36 -07:00
2023-08-06 21:49:27 -03:00
# Reset interface event
shared . gradio [ ' reset_interface ' ] . click (
2023-08-13 01:12:15 -03:00
set_interface_arguments , gradio ( ' extensions_menu ' , ' bool_menu ' ) , None ) . then (
2024-06-12 20:52:42 -07:00
None , None , None , js = ' () => { document.body.innerHTML= \' <h1 style= " font-family:monospace;padding-top:20 % ;margin:0;height:100vh;color:lightgray;text-align:center;background:var(--body-background-fill) " >Reloading...</h1> \' ; setTimeout(function() { location.reload()},2500); return []} ' )
2023-08-06 21:49:27 -03:00
2025-06-08 09:09:36 -07:00
def handle_save_settings ( state , preset , extensions , show_controls , theme ) :
contents = ui . save_settings ( state , preset , extensions , show_controls , theme )
return [
contents ,
" settings.yaml " ,
" user_data/ " ,
gr . update ( visible = True )
]
2024-01-09 04:20:10 -08:00
2023-08-06 21:49:27 -03:00
2023-08-13 01:12:15 -03:00
def set_interface_arguments ( extensions , bool_active ) :
2023-08-06 21:49:27 -03:00
shared . args . extensions = extensions
2023-08-13 01:12:15 -03:00
bool_list = get_boolean_arguments ( )
2023-08-06 21:49:27 -03:00
for k in bool_list :
setattr ( shared . args , k , False )
for k in bool_active :
setattr ( shared . args , k , True )
2023-11-15 16:35:47 -08:00
if k == ' api ' :
shared . add_extension ( ' openai ' , last = True )
2023-08-06 21:49:27 -03:00
shared . need_restart = True
2023-08-13 01:12:15 -03:00
def get_boolean_arguments ( active = False ) :
cmd_list = vars ( shared . args )
2025-04-18 06:51:28 -07:00
bool_list = sorted ( [ k for k in cmd_list if type ( cmd_list [ k ] ) is bool and k not in ui . list_model_elements ( ) ] )
2023-08-13 01:12:15 -03:00
bool_active = [ k for k in bool_list if vars ( shared . args ) [ k ] ]
if active :
return bool_active
else :
return bool_list