From e9abee0e70a48674c6e39b30b1374b311245ada3 Mon Sep 17 00:00:00 2001 From: Taksh Date: Wed, 24 Jun 2026 20:59:48 +0530 Subject: [PATCH] fix(webui): confirm before clearing chat history Add a browser confirmation dialog to Clear history buttons in the main chat and arena UIs to prevent accidental history loss. Fixes #3881 Co-authored-by: Cursor --- fastchat/serve/gradio_block_arena_named.py | 8 +++++++- fastchat/serve/gradio_block_arena_vision.py | 2 ++ fastchat/serve/gradio_block_arena_vision_named.py | 2 ++ fastchat/serve/gradio_web_server.py | 15 ++++++++++++++- 4 files changed, 25 insertions(+), 2 deletions(-) diff --git a/fastchat/serve/gradio_block_arena_named.py b/fastchat/serve/gradio_block_arena_named.py index 2f7b39adb..a6a87a5de 100644 --- a/fastchat/serve/gradio_block_arena_named.py +++ b/fastchat/serve/gradio_block_arena_named.py @@ -28,6 +28,7 @@ acknowledgment_md, get_ip, get_model_description_md, + CLEAR_HISTORY_CONFIRM_JS, ) from fastchat.serve.remote_logger import get_remote_logger from fastchat.utils import ( @@ -457,7 +458,12 @@ def build_side_by_side_ui_named(models): ).then( flash_buttons, [], btn_list ) - clear_btn.click(clear_history, None, states + chatbots + [textbox] + btn_list) + clear_btn.click( + clear_history, + None, + states + chatbots + [textbox] + btn_list, + js=CLEAR_HISTORY_CONFIRM_JS, + ) share_js = """ function (a, b, c, d) { diff --git a/fastchat/serve/gradio_block_arena_vision.py b/fastchat/serve/gradio_block_arena_vision.py index b3d812220..9f550bbbe 100644 --- a/fastchat/serve/gradio_block_arena_vision.py +++ b/fastchat/serve/gradio_block_arena_vision.py @@ -38,6 +38,7 @@ State, get_conv_log_filename, get_remote_logger, + CLEAR_HISTORY_CONFIRM_JS, ) from fastchat.serve.vision.image import ImageFormat, Image from fastchat.utils import ( @@ -451,6 +452,7 @@ def build_single_vision_language_model_ui( clear_history, None, [state, chatbot, multimodal_textbox, textbox, send_btn] + btn_list, + js=CLEAR_HISTORY_CONFIRM_JS, ) model_selector.change( diff --git a/fastchat/serve/gradio_block_arena_vision_named.py b/fastchat/serve/gradio_block_arena_vision_named.py index 7c653acf3..b0e0f1f2b 100644 --- a/fastchat/serve/gradio_block_arena_vision_named.py +++ b/fastchat/serve/gradio_block_arena_vision_named.py @@ -54,6 +54,7 @@ get_ip, get_model_description_md, enable_text, + CLEAR_HISTORY_CONFIRM_JS, ) from fastchat.serve.remote_logger import get_remote_logger from fastchat.utils import ( @@ -492,6 +493,7 @@ def build_side_by_side_vision_ui_named(context: Context, random_questions=None): clear_history, None, states + chatbots + [multimodal_textbox, textbox, send_btn] + btn_list, + js=CLEAR_HISTORY_CONFIRM_JS, ) share_js = """ diff --git a/fastchat/serve/gradio_web_server.py b/fastchat/serve/gradio_web_server.py index 8941c6ecb..ac97dd460 100644 --- a/fastchat/serve/gradio_web_server.py +++ b/fastchat/serve/gradio_web_server.py @@ -47,6 +47,14 @@ logger = build_logger("gradio_web_server", "gradio_web_server.log") +CLEAR_HISTORY_CONFIRM_JS = """ +() => { + if (!confirm("Are you sure you want to clear your chat history?")) { + throw new Error("Clear history cancelled"); + } +} +""" + headers = {"User-Agent": "FastChat Client"} no_change_btn = gr.Button() @@ -1000,7 +1008,12 @@ def build_single_model_ui(models, add_promotion_links=False): [state, temperature, top_p, max_output_tokens], [state, chatbot] + btn_list, ) - clear_btn.click(clear_history, None, [state, chatbot, textbox] + btn_list) + clear_btn.click( + clear_history, + None, + [state, chatbot, textbox] + btn_list, + js=CLEAR_HISTORY_CONFIRM_JS, + ) model_selector.change(clear_history, None, [state, chatbot, textbox] + btn_list)