mirror of
https://github.com/oobabooga/text-generation-webui.git
synced 2025-12-06 07:12:10 +01:00
Better autosave behavior for notebook tab when there are 2 columns
This commit is contained in:
parent
197b327374
commit
6cc7bbf009
|
|
@ -1,4 +1,3 @@
|
||||||
import time
|
|
||||||
from pathlib import Path
|
from pathlib import Path
|
||||||
|
|
||||||
import gradio as gr
|
import gradio as gr
|
||||||
|
|
@ -10,6 +9,7 @@ from modules.text_generation import (
|
||||||
get_token_ids,
|
get_token_ids,
|
||||||
stop_everything_event
|
stop_everything_event
|
||||||
)
|
)
|
||||||
|
from modules.ui_notebook import store_notebook_state_and_debounce
|
||||||
from modules.utils import gradio
|
from modules.utils import gradio
|
||||||
|
|
||||||
inputs = ('textbox-default', 'interface_state')
|
inputs = ('textbox-default', 'interface_state')
|
||||||
|
|
@ -78,7 +78,7 @@ def create_event_handlers():
|
||||||
shared.gradio['Generate-default'].click(
|
shared.gradio['Generate-default'].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(
|
||||||
lambda: [gr.update(visible=True), gr.update(visible=False)], None, gradio('Stop-default', 'Generate-default')).then(
|
lambda: [gr.update(visible=True), gr.update(visible=False)], None, gradio('Stop-default', 'Generate-default')).then(
|
||||||
generate_and_save_wrapper, gradio('textbox-default', 'interface_state', 'prompt_menu-default'), gradio(outputs), show_progress=False).then(
|
generate_reply_wrapper, gradio('textbox-default', 'interface_state'), gradio(outputs), show_progress=False).then(
|
||||||
lambda state, left, right: state.update({'textbox-default': left, 'output_textbox': right}), gradio('interface_state', 'textbox-default', 'output_textbox'), None).then(
|
lambda state, left, right: state.update({'textbox-default': left, 'output_textbox': right}), gradio('interface_state', 'textbox-default', 'output_textbox'), None).then(
|
||||||
lambda: [gr.update(visible=False), gr.update(visible=True)], None, gradio('Stop-default', 'Generate-default')).then(
|
lambda: [gr.update(visible=False), gr.update(visible=True)], None, gradio('Stop-default', 'Generate-default')).then(
|
||||||
None, None, None, js=f'() => {{{ui.audio_notification_js}}}')
|
None, None, None, js=f'() => {{{ui.audio_notification_js}}}')
|
||||||
|
|
@ -86,7 +86,7 @@ def create_event_handlers():
|
||||||
shared.gradio['textbox-default'].submit(
|
shared.gradio['textbox-default'].submit(
|
||||||
ui.gather_interface_values, gradio(shared.input_elements), gradio('interface_state')).then(
|
ui.gather_interface_values, gradio(shared.input_elements), gradio('interface_state')).then(
|
||||||
lambda: [gr.update(visible=True), gr.update(visible=False)], None, gradio('Stop-default', 'Generate-default')).then(
|
lambda: [gr.update(visible=True), gr.update(visible=False)], None, gradio('Stop-default', 'Generate-default')).then(
|
||||||
generate_and_save_wrapper, gradio('textbox-default', 'interface_state', 'prompt_menu-default'), gradio(outputs), show_progress=False).then(
|
generate_reply_wrapper, gradio('textbox-default', 'interface_state'), gradio(outputs), show_progress=False).then(
|
||||||
lambda state, left, right: state.update({'textbox-default': left, 'output_textbox': right}), gradio('interface_state', 'textbox-default', 'output_textbox'), None).then(
|
lambda state, left, right: state.update({'textbox-default': left, 'output_textbox': right}), gradio('interface_state', 'textbox-default', 'output_textbox'), None).then(
|
||||||
lambda: [gr.update(visible=False), gr.update(visible=True)], None, gradio('Stop-default', 'Generate-default')).then(
|
lambda: [gr.update(visible=False), gr.update(visible=True)], None, gradio('Stop-default', 'Generate-default')).then(
|
||||||
None, None, None, js=f'() => {{{ui.audio_notification_js}}}')
|
None, None, None, js=f'() => {{{ui.audio_notification_js}}}')
|
||||||
|
|
@ -94,7 +94,7 @@ def create_event_handlers():
|
||||||
shared.gradio['Continue-default'].click(
|
shared.gradio['Continue-default'].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(
|
||||||
lambda: [gr.update(visible=True), gr.update(visible=False)], None, gradio('Stop-default', 'Generate-default')).then(
|
lambda: [gr.update(visible=True), gr.update(visible=False)], None, gradio('Stop-default', 'Generate-default')).then(
|
||||||
continue_and_save_wrapper, gradio('output_textbox', 'textbox-default', 'interface_state', 'prompt_menu-default'), gradio(outputs), show_progress=False).then(
|
generate_reply_wrapper, gradio('output_textbox', 'interface_state'), gradio(outputs), show_progress=False).then(
|
||||||
lambda state, left, right: state.update({'textbox-default': left, 'output_textbox': right}), gradio('interface_state', 'textbox-default', 'output_textbox'), None).then(
|
lambda state, left, right: state.update({'textbox-default': left, 'output_textbox': right}), gradio('interface_state', 'textbox-default', 'output_textbox'), None).then(
|
||||||
lambda: [gr.update(visible=False), gr.update(visible=True)], None, gradio('Stop-default', 'Generate-default')).then(
|
lambda: [gr.update(visible=False), gr.update(visible=True)], None, gradio('Stop-default', 'Generate-default')).then(
|
||||||
None, None, None, js=f'() => {{{ui.audio_notification_js}}}')
|
None, None, None, js=f'() => {{{ui.audio_notification_js}}}')
|
||||||
|
|
@ -104,6 +104,14 @@ def create_event_handlers():
|
||||||
shared.gradio['prompt_menu-default'].change(lambda x : (load_prompt(x), ""), gradio('prompt_menu-default'), gradio('textbox-default', 'output_textbox'), show_progress=False)
|
shared.gradio['prompt_menu-default'].change(lambda x : (load_prompt(x), ""), gradio('prompt_menu-default'), gradio('textbox-default', 'output_textbox'), show_progress=False)
|
||||||
shared.gradio['new_prompt-default'].click(handle_new_prompt, None, gradio('prompt_menu-default'), show_progress=False)
|
shared.gradio['new_prompt-default'].click(handle_new_prompt, None, gradio('prompt_menu-default'), show_progress=False)
|
||||||
|
|
||||||
|
# Input change handler to save input (reusing notebook's debounced saving)
|
||||||
|
shared.gradio['textbox-default'].change(
|
||||||
|
store_notebook_state_and_debounce,
|
||||||
|
gradio('textbox-default', 'prompt_menu-default'),
|
||||||
|
None,
|
||||||
|
show_progress=False
|
||||||
|
)
|
||||||
|
|
||||||
shared.gradio['delete_prompt-default'].click(
|
shared.gradio['delete_prompt-default'].click(
|
||||||
lambda: [gr.update(visible=False), gr.update(visible=True), gr.update(visible=True)],
|
lambda: [gr.update(visible=False), gr.update(visible=True), gr.update(visible=True)],
|
||||||
None,
|
None,
|
||||||
|
|
@ -148,58 +156,6 @@ def create_event_handlers():
|
||||||
shared.gradio['get_tokens-default'].click(get_token_ids, gradio('textbox-default'), gradio('tokens-default'), show_progress=False)
|
shared.gradio['get_tokens-default'].click(get_token_ids, gradio('textbox-default'), gradio('tokens-default'), show_progress=False)
|
||||||
|
|
||||||
|
|
||||||
def autosave_prompt(text, prompt_name):
|
|
||||||
"""Automatically save the text to the selected prompt file"""
|
|
||||||
if prompt_name and text.strip():
|
|
||||||
prompt_path = Path("user_data/logs/notebook") / f"{prompt_name}.txt"
|
|
||||||
prompt_path.parent.mkdir(parents=True, exist_ok=True)
|
|
||||||
prompt_path.write_text(text, encoding='utf-8')
|
|
||||||
|
|
||||||
|
|
||||||
def generate_and_save_wrapper(textbox_content, interface_state, prompt_name):
|
|
||||||
"""Generate reply and automatically save the result with periodic saves"""
|
|
||||||
last_save_time = time.monotonic()
|
|
||||||
save_interval = 8
|
|
||||||
output = textbox_content
|
|
||||||
|
|
||||||
# Initial autosave
|
|
||||||
autosave_prompt(output, prompt_name)
|
|
||||||
|
|
||||||
for i, (output, html_output) in enumerate(generate_reply_wrapper(textbox_content, interface_state)):
|
|
||||||
yield output, html_output
|
|
||||||
|
|
||||||
current_time = time.monotonic()
|
|
||||||
# Save on first iteration or if save_interval seconds have passed
|
|
||||||
if i == 0 or (current_time - last_save_time) >= save_interval:
|
|
||||||
autosave_prompt(output, prompt_name)
|
|
||||||
last_save_time = current_time
|
|
||||||
|
|
||||||
# Final autosave
|
|
||||||
autosave_prompt(output, prompt_name)
|
|
||||||
|
|
||||||
|
|
||||||
def continue_and_save_wrapper(output_textbox, textbox_content, interface_state, prompt_name):
|
|
||||||
"""Continue generation and automatically save the result with periodic saves"""
|
|
||||||
last_save_time = time.monotonic()
|
|
||||||
save_interval = 8
|
|
||||||
output = output_textbox
|
|
||||||
|
|
||||||
# Initial autosave
|
|
||||||
autosave_prompt(output, prompt_name)
|
|
||||||
|
|
||||||
for i, (output, html_output) in enumerate(generate_reply_wrapper(output_textbox, interface_state)):
|
|
||||||
yield output, html_output
|
|
||||||
|
|
||||||
current_time = time.monotonic()
|
|
||||||
# Save on first iteration or if save_interval seconds have passed
|
|
||||||
if i == 0 or (current_time - last_save_time) >= save_interval:
|
|
||||||
autosave_prompt(output, prompt_name)
|
|
||||||
last_save_time = current_time
|
|
||||||
|
|
||||||
# Final autosave
|
|
||||||
autosave_prompt(output, prompt_name)
|
|
||||||
|
|
||||||
|
|
||||||
def handle_new_prompt():
|
def handle_new_prompt():
|
||||||
new_name = utils.current_time()
|
new_name = utils.current_time()
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -11,7 +11,6 @@ from modules.text_generation import (
|
||||||
get_token_ids,
|
get_token_ids,
|
||||||
stop_everything_event
|
stop_everything_event
|
||||||
)
|
)
|
||||||
from modules.ui_default import autosave_prompt
|
|
||||||
from modules.utils import gradio
|
from modules.utils import gradio
|
||||||
|
|
||||||
_notebook_file_lock = threading.Lock()
|
_notebook_file_lock = threading.Lock()
|
||||||
|
|
@ -249,6 +248,14 @@ def handle_rename_prompt_confirm_notebook(new_name, current_name):
|
||||||
]
|
]
|
||||||
|
|
||||||
|
|
||||||
|
def autosave_prompt(text, prompt_name):
|
||||||
|
"""Automatically save the text to the selected prompt file"""
|
||||||
|
if prompt_name and text.strip():
|
||||||
|
prompt_path = Path("user_data/logs/notebook") / f"{prompt_name}.txt"
|
||||||
|
prompt_path.parent.mkdir(parents=True, exist_ok=True)
|
||||||
|
prompt_path.write_text(text, encoding='utf-8')
|
||||||
|
|
||||||
|
|
||||||
def safe_autosave_prompt(content, prompt_name):
|
def safe_autosave_prompt(content, prompt_name):
|
||||||
"""Thread-safe wrapper for autosave_prompt to prevent file corruption"""
|
"""Thread-safe wrapper for autosave_prompt to prevent file corruption"""
|
||||||
with _notebook_file_lock:
|
with _notebook_file_lock:
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue