mirror of
https://github.com/linyqh/NarratoAI.git
synced 2026-07-29 17:35:53 +00:00
refactor: 优化脚本设置与配置更新逻辑
重构 script_settings.py 中的脚本模式状态处理逻辑,完善会话状态 fallback 与默认值处理,新增 required 参数修复空选择问题。新增 update_app_config_if_changed 工具函数,仅在配置值实际变更时更新配置,替换基础设置中多处直接修改配置的代码,统一逻辑并减少不必要的状态更新。
This commit is contained in:
parent
283617deb0
commit
a1b434fbda
@ -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)
|
||||
|
||||
|
||||
@ -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
|
||||
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user