Skip to content

feat(web): 持久化 LLM 模型配置 / Persist LLM config across browser sessions - #96

Open
WenhuaXia wants to merge 1 commit into
simonlin1212:mainfrom
WenhuaXia:fix/persist-llm-config
Open

feat(web): 持久化 LLM 模型配置 / Persist LLM config across browser sessions#96
WenhuaXia wants to merge 1 commit into
simonlin1212:mainfrom
WenhuaXia:fix/persist-llm-config

Conversation

@WenhuaXia

Copy link
Copy Markdown

问题 / Problem

Web UI 使用 st.session_state 存储模型配置(provider、quick/deep 模型、base URL),但 session state 在浏览器标签页关闭后丢失。每次重新打开页面,配置都回到默认的 MiniMax。

The Web UI stores model config (provider, quick/deep models, base URL) in st.session_state, which is lost when the browser tab is closed. Every revisit resets to the default MiniMax provider.

修复 / Fix

  • 在点击"开始分析"前自动将配置写入项目目录下的 .llm_config.json

  • 页面加载时从该文件恢复上次的选择(setdefault 保证不覆盖用户当次修改)

  • 持久化字段:provider、quick_model_idx、deep_model_idx、llm_base_url、subscription_scope、agent_sdk_model、custom 模型输入

  • Auto-save config to .llm_config.json before analysis starts

  • Restore saved selection on page load via setdefault (user can still change in-session)

  • Persisted fields: provider, quick/deep model indices, base URL, subscription scope, agent_sdk_model, custom model inputs

改动 / Changes

web/components/sidebar.py — 新增 _load_saved_llm_config() + _save_llm_config(),分别在 render_sidebar() 和"开始分析"按钮触发时调用。

No new dependencies. Pure stdlib (json + pathlib).

skipped: 独立的保存按钮,自动保存更可靠且不需要额外 UI。

@simonlin1212

Copy link
Copy Markdown
Owner

配置持久化这个痛点是真的 —— 每次重开标签页都回到默认 MiniMax,确实烦。.llm_config.json + setdefault 恢复(不覆盖用户当次修改)的做法也对。

但这个 PR 里有一部分改动不在标题和描述里,我不能直接合。

描述外的改动

diff 里除了配置持久化,还改了三处 UI 行为:

-        "开始分析" if not is_busy else "停止中..." if is_stopping else "分析进行中...",
+        "分析中..." if is_busy else ("重新生成" if _already_done else "生成复盘"),
  1. 主按钮文案全换开始分析生成复盘 / 重新生成停止中.../分析进行中...分析中...
  2. 新增 _already_done 判断(引入 _completed_keys),按钮文案随之变化
  3. 点历史记录的行为变了:现在会回填 sidebar 的股票/日期并 st.rerun()

这些都是产品交互决策,跟"持久化模型配置"是两件事。合进来的话,用户会发现按钮突然改名了,而 changelog 里只写了配置持久化 —— 这种"顺手改掉"的东西最难排查。

顺带两个小点:

  • _LL_CONFIG_PATH 疑似笔误(_LLM_ 少了个 M)
  • write_text() 没有异常保护,配置目录只读或磁盘满时会直接把「开始分析」打断 —— 持久化失败不该影响主流程,建议 try/except 后仅记 warning

建议

把这个 PR 收敛回只做配置持久化(就是你描述里写的那些),我这边验完就合。UI 文案和历史点击行为如果你觉得确实该改,另开一个 PR,我们单独讨论 —— 「生成复盘」这个叫法其实我不反对,只是它得自己走一遍讨论。

另外提醒一下:#99 也实现了 Web 配置持久化(那个 PR 是火山方舟 + 配置持久化 + 锁超时三合一,目前处于 CONFLICTING)。你这个更专注,收敛后我优先合你的,到时候会请 #99 那边 rebase 掉重复部分。

Web UI 的 st.session_state 在标签页关闭后丢失,每次打开都回到默认 MiniMax。
本次修改在开始分析前自动保存 provider + quick/deep 模型选择到 .llm_config.json,
下次打开时恢复。

Persist LLM model selection (provider, quick/deep models, base URL) to a JSON file
so it survives browser tab close/reopen. Previously st.session_state was lost,
always resetting to the default MiniMax provider.
@WenhuaXia
WenhuaXia force-pushed the fix/persist-llm-config branch from a1d1ad7 to 4e5b95a Compare August 21, 2026 10:09
@WenhuaXia

Copy link
Copy Markdown
Author

已按意见修改并 rebase 到最新 main(v0.5.15),现在 PR 只有 1 个 commit:

1. 收敛范围 — 删掉了「按钮文案动态切换 + 历史记录一键重新生成」那个 commit(按钮改名 / _already_done / 历史点击回填 rerun 全部不在本 PR)。UI 交互改动同意另开 PR 单独讨论,「生成复盘」叫法我会单独提。

2. _LL_CONFIG_PATH_LLM_CONFIG_PATH — 笔误已改,全文件无残留。

3. write_text 异常保护 — 持久化失败(目录只读 / 磁盘满)现在 try/except OSError 后仅 logger.warning,不会打断「开始分析」主流程。

验证:pytest tests/ 370 passed / 14 skipped / 0 failed(干净环境);另做了保存→清 session_state→恢复的冒烟测试,setdefault 不覆盖当次修改、写失败不抛异常均确认。

麻烦再看一下,谢谢!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants