From a1b434fbdae5813eef855638cb5412924f42c655 Mon Sep 17 00:00:00 2001 From: viccy Date: Fri, 5 Jun 2026 15:29:15 +0800 Subject: [PATCH] =?UTF-8?q?refactor:=20=E4=BC=98=E5=8C=96=E8=84=9A?= =?UTF-8?q?=E6=9C=AC=E8=AE=BE=E7=BD=AE=E4=B8=8E=E9=85=8D=E7=BD=AE=E6=9B=B4?= =?UTF-8?q?=E6=96=B0=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 重构 script_settings.py 中的脚本模式状态处理逻辑,完善会话状态 fallback 与默认值处理,新增 required 参数修复空选择问题。新增 update_app_config_if_changed 工具函数,仅在配置值实际变更时更新配置,替换基础设置中多处直接修改配置的代码,统一逻辑并减少不必要的状态更新。 --- webui/components/basic_settings.py | 45 +++++++++++++++++++++-------- webui/components/script_settings.py | 23 ++++++++++----- 2 files changed, 48 insertions(+), 20 deletions(-) diff --git a/webui/components/basic_settings.py b/webui/components/basic_settings.py index f219a33..95db275 100644 --- a/webui/components/basic_settings.py +++ b/webui/components/basic_settings.py @@ -140,6 +140,15 @@ def show_config_validation_errors(errors: list): st.error(error) +def update_app_config_if_changed(key: str, value) -> bool: + """Update app config only when the value really changed.""" + if config.app.get(key) == value: + return False + + config.app[key] = value + return True + + def render_basic_settings(tr): """渲染基础设置面板""" with st.expander(tr("Basic Settings"), expanded=False): @@ -546,9 +555,11 @@ def render_vision_llm_settings(tr): # 这里的验证逻辑可能需要微调,因为我们现在是自动组合的 is_valid, error_msg = validate_openai_compatible_model_name(st_vision_model_name, "视频分析") if is_valid: - config.app["vision_openai_model_name"] = st_vision_model_name + config_changed |= update_app_config_if_changed( + "vision_openai_model_name", + st_vision_model_name + ) st.session_state["vision_openai_model_name"] = st_vision_model_name - config_changed = True else: validation_errors.append(error_msg) @@ -556,9 +567,11 @@ def render_vision_llm_settings(tr): if st_vision_api_key: is_valid, error_msg = validate_api_key(st_vision_api_key, "视频分析") if is_valid: - config.app["vision_openai_api_key"] = st_vision_api_key + config_changed |= update_app_config_if_changed( + "vision_openai_api_key", + st_vision_api_key + ) st.session_state["vision_openai_api_key"] = st_vision_api_key - config_changed = True else: validation_errors.append(error_msg) @@ -566,9 +579,11 @@ def render_vision_llm_settings(tr): if st_vision_base_url: is_valid, error_msg = validate_base_url(st_vision_base_url, "视频分析") if is_valid: - config.app["vision_openai_base_url"] = st_vision_base_url + config_changed |= update_app_config_if_changed( + "vision_openai_base_url", + st_vision_base_url + ) st.session_state["vision_openai_base_url"] = st_vision_base_url - config_changed = True else: validation_errors.append(error_msg) @@ -804,9 +819,11 @@ def render_text_llm_settings(tr): if st_text_model_name: is_valid, error_msg = validate_openai_compatible_model_name(st_text_model_name, "文案生成") if is_valid: - config.app["text_openai_model_name"] = st_text_model_name + text_config_changed |= update_app_config_if_changed( + "text_openai_model_name", + st_text_model_name + ) st.session_state["text_openai_model_name"] = st_text_model_name - text_config_changed = True else: text_validation_errors.append(error_msg) @@ -814,9 +831,11 @@ def render_text_llm_settings(tr): if st_text_api_key: is_valid, error_msg = validate_api_key(st_text_api_key, "文案生成") if is_valid: - config.app["text_openai_api_key"] = st_text_api_key + text_config_changed |= update_app_config_if_changed( + "text_openai_api_key", + st_text_api_key + ) st.session_state["text_openai_api_key"] = st_text_api_key - text_config_changed = True else: text_validation_errors.append(error_msg) @@ -824,9 +843,11 @@ def render_text_llm_settings(tr): if st_text_base_url: is_valid, error_msg = validate_base_url(st_text_base_url, "文案生成") if is_valid: - config.app["text_openai_base_url"] = st_text_base_url + text_config_changed |= update_app_config_if_changed( + "text_openai_base_url", + st_text_base_url + ) st.session_state["text_openai_base_url"] = st_text_base_url - text_config_changed = True else: text_validation_errors.append(error_msg) diff --git a/webui/components/script_settings.py b/webui/components/script_settings.py index 7c7a3f2..4ac6f2b 100644 --- a/webui/components/script_settings.py +++ b/webui/components/script_settings.py @@ -56,11 +56,6 @@ def render_script_file(tr, params): MODE_SHORT = "short" MODE_SUMMARY = "summary" - # 处理保存脚本后的模式切换(必须在 widget 实例化之前) - if st.session_state.get('_switch_to_file_mode'): - st.session_state['script_mode_selection'] = tr("Select/Upload Script") - del st.session_state['_switch_to_file_mode'] - # 模式选项映射 mode_options = { tr("Select/Upload Script"): MODE_FILE, @@ -88,6 +83,18 @@ def render_script_file(tr, params): # 1. 渲染功能选择下拉框 # 使用 segmented_control 替代 selectbox,提供更好的视觉体验 default_mode_label = mode_keys[default_index] + default_mode = mode_options[default_mode_label] + + if st.session_state.get('_switch_to_file_mode'): + st.session_state['script_mode_selection'] = tr("Select/Upload Script") + del st.session_state['_switch_to_file_mode'] + elif ( + 'script_mode_selection' not in st.session_state + or st.session_state['script_mode_selection'] not in mode_options + ): + st.session_state['script_mode_selection'] = default_mode_label + elif mode_options[st.session_state['script_mode_selection']] != default_mode: + st.session_state['script_mode_selection'] = default_mode_label # 定义回调函数来处理状态更新 def update_script_mode(): @@ -107,12 +114,12 @@ def render_script_file(tr, params): selected_mode_label = st.segmented_control( tr("Video Type"), options=mode_keys, - default=default_mode_label, key="script_mode_selection", - on_change=update_script_mode + on_change=update_script_mode, + required=True ) - # 处理未选择的情况(虽然有default,但在某些交互下可能为空) + # 处理旧状态为空的兜底情况 if not selected_mode_label: selected_mode_label = default_mode_label