refactor: 优化脚本设置与配置更新逻辑

重构 script_settings.py 中的脚本模式状态处理逻辑,完善会话状态 fallback 与默认值处理,新增 required 参数修复空选择问题。新增 update_app_config_if_changed 工具函数,仅在配置值实际变更时更新配置,替换基础设置中多处直接修改配置的代码,统一逻辑并减少不必要的状态更新。
This commit is contained in:
viccy 2026-06-05 15:29:15 +08:00
parent 283617deb0
commit a1b434fbda
2 changed files with 48 additions and 20 deletions

View File

@ -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)

View File

@ -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