un2266 Claude Opus 5 commited on
Commit
676c5bb
·
1 Parent(s): 6366111

運算中途按「回首頁」:中止還在跑的分析,並把結果導覽閘門關回去

Browse files

業主回報:分析運算跑到一半按「回首頁」再重新進來,畫面又冒出上一輪的
分析運算面板,步驟列停在舊狀態、對話也還是舊訊息。

查證分兩段:分析**跑完後**再重置是乾淨的(實測面板/對話/下載捷徑全清),
**跑到一半**重置才會重現。所以問題不是重置漏清,而是重置沒有中止那條還在
跑的 generator——_run_computation 每個子階段都會 yield 一次畫面,重置把畫面
清乾淨之後,它後續的 yield 又一格一格把舊內容畫回去,看起來就像重置沒生效。

修法用 Gradio 原生 cancels:按「確定回首頁」時直接中止「確認並開始分析」與
「略過」那兩條事件鏈(兩者都會進同一支 _run_computation),generator 停在
原地,不再有遲到的 yield。為了拿得到那兩個事件物件,reset_confirm_btn 的
接線從原位置搬到 create_app 結尾(Gradio 接線順序不影響行為,只有 cancels
需要引用先前建立的事件)。

順帶修掉查證時發現的另一個殘留:結果導覽的 A2 閘門(語言指標分析/統計四項/
LLM輔助分析)在 _populate_tabs 產出結果時被打開,但重置從來沒關回去——重置
後回到全新首頁,那些項目仍可點,點進去是空白結果頁。已在
on_reset_clear_workspace 一併設回 interactive=False。

驗證(本機 .venv + Playwright):
- 中途重置:運算啟動 3.5 秒後按回首頁→確定,再等 12 秒讓遲到的 yield 有機會
出現——首頁正確顯示、工作區隱藏、無分析面板、對話 0 則、步驟列清空;
重新進入工作區後:研究選擇卡片正常、無面板殘留、步驟列回到未完成狀態、
對話只有歡迎詞、下載捷徑不在、語言指標分析與敘述統計皆不可點、
技術執行紀錄只剩「已重新開始分析」。
- 正常流程不受影響:重跑一次完整分析,指標計算/統計分析完成、導覽閘門
正確開啟、下載捷徑出現、步驟列正確(報告階段因本機 429 額度用盡標紅,
屬既有的誠實失敗行為)。
- console 僅 3 筆既有外部資源錯誤。

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01MQuAXWC1hCsiT48TXftPc7

Files changed (1) hide show
  1. app_agent.py +43 -20
app_agent.py CHANGED
@@ -3918,6 +3918,11 @@ def create_app():
3918
  gr.update(value=""), # meta_version
3919
  gr.update(value="二群"), # meta_ngroups(元件宣告時的預設值)
3920
  gr.update(value="群組間比較"), # meta_method(元件宣告時的預設值)
 
 
 
 
 
3921
  )
3922
 
3923
  def on_reset_confirm():
@@ -3943,24 +3948,10 @@ def create_app():
3943
 
3944
  reset_btn.click(fn=lambda: gr.update(visible=True), outputs=[reset_confirm_row])
3945
  reset_cancel_btn.click(fn=lambda: gr.update(visible=False), outputs=[reset_confirm_row])
3946
- reset_confirm_btn.click(
3947
- fn=on_reset_clear_workspace,
3948
- outputs=[metadata_row, file_input, canvas_idx_col, canvas_stat_col,
3949
- canvas_report_col, canvas_exec_col, computing_html, result_nav_col,
3950
- upload_progress_html,
3951
- meta_title, meta_author, meta_lang, meta_pubyear, meta_version,
3952
- meta_ngroups, meta_method],
3953
- ).then(
3954
- fn=on_reset_confirm,
3955
- # 2026-07-30(2-C 第 5 項):chat_upload 這輪常駐隱藏、不再接任何
3956
- # wiring(見 chat_upload_col 定義處註解),這裡把它從 outputs 移除。
3957
- # E3(2026-08-05):scenario_btn_col 空 Column 已整段拿掉,一併從
3958
- # outputs 移除。回傳 tuple 的元素個數/順序已同步調整為 8 個,
3959
- # 跟這份 outputs 清單一一對應。
3960
- outputs=[chatbot, exec_log, session_state, app_header_html,
3961
- upload_row,
3962
- reset_confirm_row, homepage_col, workspace_row],
3963
- )
3964
 
3965
  # ── 檔案上傳確認(streaming generator)──────────────────────────────
3966
  def on_upload_confirm(files, chat_history, log_history, state):
@@ -4272,7 +4263,7 @@ def create_app():
4272
  def _unlock_meta():
4273
  return gr.update(interactive=True), gr.update(interactive=True)
4274
 
4275
- meta_confirm_btn.click(
4276
  fn=_lock_meta, inputs=None, outputs=[meta_confirm_btn, meta_cancel_btn],
4277
  ).then(
4278
  fn=on_metadata_confirm,
@@ -4306,7 +4297,7 @@ def create_app():
4306
  chat_history, log_history, state = ch, lh, st
4307
  yield (chat_history, log_history, state, gr.update(visible=False), todo, acc, comp, *tabs)
4308
 
4309
- meta_cancel_btn.click(
4310
  fn=_lock_meta, inputs=None, outputs=[meta_confirm_btn, meta_cancel_btn],
4311
  ).then(
4312
  fn=on_metadata_skip,
@@ -4317,6 +4308,38 @@ def create_app():
4317
  fn=_unlock_meta, inputs=None, outputs=[meta_confirm_btn, meta_cancel_btn],
4318
  ).then(fn=_populate_tabs, inputs=[session_state], outputs=_TAB_OUTPUTS)
4319
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
4320
  return demo
4321
 
4322
 
 
3918
  gr.update(value=""), # meta_version
3919
  gr.update(value="二群"), # meta_ngroups(元件宣告時的預設值)
3920
  gr.update(value="群組間比較"), # meta_method(元件宣告時的預設值)
3921
+ # 2026-08-12:結果導覽的 A2 閘門要一起關回去。這幾顆在
3922
+ # _populate_tabs 產出結果時被打開(interactive=True),但重置
3923
+ # 從來沒有關回來——實測重置後回到全新首頁,「語言指標分析」等
3924
+ # 項目仍是可點狀態,點下去是一片空白的結果頁。
3925
+ *([gr.update(interactive=False)] * len(_TAB_NAV_GATES)),
3926
  )
3927
 
3928
  def on_reset_confirm():
 
3948
 
3949
  reset_btn.click(fn=lambda: gr.update(visible=True), outputs=[reset_confirm_row])
3950
  reset_cancel_btn.click(fn=lambda: gr.update(visible=False), outputs=[reset_confirm_row])
3951
+ # 2026-08-12:reset_confirm_btn 的接線搬到檔案最後(見 create_app 結尾
3952
+ # 「重置接線」那段)。原因:它需要 cancels=[分析運算那兩條事件鏈],而
3953
+ # 那兩條要等 meta_confirm_btn/meta_cancel_btn 接完才存在。Gradio 的
3954
+ # 接線順序不影響行為,只有 cancels 需要拿到事件物件,所以往後搬。
 
 
 
 
 
 
 
 
 
 
 
 
 
 
3955
 
3956
  # ── 檔案上傳確認(streaming generator)──────────────────────────────
3957
  def on_upload_confirm(files, chat_history, log_history, state):
 
4263
  def _unlock_meta():
4264
  return gr.update(interactive=True), gr.update(interactive=True)
4265
 
4266
+ confirm_run_evt = meta_confirm_btn.click(
4267
  fn=_lock_meta, inputs=None, outputs=[meta_confirm_btn, meta_cancel_btn],
4268
  ).then(
4269
  fn=on_metadata_confirm,
 
4297
  chat_history, log_history, state = ch, lh, st
4298
  yield (chat_history, log_history, state, gr.update(visible=False), todo, acc, comp, *tabs)
4299
 
4300
+ skip_run_evt = meta_cancel_btn.click(
4301
  fn=_lock_meta, inputs=None, outputs=[meta_confirm_btn, meta_cancel_btn],
4302
  ).then(
4303
  fn=on_metadata_skip,
 
4308
  fn=_unlock_meta, inputs=None, outputs=[meta_confirm_btn, meta_cancel_btn],
4309
  ).then(fn=_populate_tabs, inputs=[session_state], outputs=_TAB_OUTPUTS)
4310
 
4311
+ # ── 重置接線(2026-08-12 從上面搬下來)──────────────────────────
4312
+ # 業主回報:分析運算跑到一半按「回首頁」再重新進來,畫面又冒出上一輪
4313
+ # 的分析運算面板、步驟列停在舊狀態、對話還是舊訊息。
4314
+ # 真因不是重置漏清(分析跑完後再重置是乾淨的,已實測),而是**重置沒有
4315
+ # 中止還在跑的運算**:那條 generator 每個子階段都會 yield 一次畫面,
4316
+ # 重置把畫面清乾淨之後,它後續的 yield 又把舊內容一格一格畫回去,
4317
+ # 最後看起來就像「重置沒生效」。
4318
+ # 修法用 Gradio 原生的 cancels:按下「確定回首頁」時直接中止那兩條
4319
+ # 事件鏈(確認送出/略過 都會進同一支 _run_computation),generator
4320
+ # 停在原地就不會再有遲到的 yield。這也是這段接線必須放在
4321
+ # meta_confirm_btn/meta_cancel_btn 之後的唯一理由——cancels 需要拿到
4322
+ # 它們的事件物件。
4323
+ reset_confirm_btn.click(
4324
+ fn=on_reset_clear_workspace,
4325
+ outputs=[metadata_row, file_input, canvas_idx_col, canvas_stat_col,
4326
+ canvas_report_col, canvas_exec_col, computing_html, result_nav_col,
4327
+ upload_progress_html,
4328
+ meta_title, meta_author, meta_lang, meta_pubyear, meta_version,
4329
+ meta_ngroups, meta_method, *_TAB_NAV_GATES],
4330
+ cancels=[confirm_run_evt, skip_run_evt],
4331
+ ).then(
4332
+ fn=on_reset_confirm,
4333
+ # 2026-07-30(2-C 第 5 項):chat_upload 這輪常駐隱藏、不再接任何
4334
+ # wiring(見 chat_upload_col 定義處註解),這裡把它從 outputs 移除。
4335
+ # E3(2026-08-05):scenario_btn_col 空 Column 已整段拿掉,一併從
4336
+ # outputs 移除。回傳 tuple 的元素個數/順序已同步調整為 8 個,
4337
+ # 跟這份 outputs 清單一一對應。
4338
+ outputs=[chatbot, exec_log, session_state, app_header_html,
4339
+ upload_row,
4340
+ reset_confirm_row, homepage_col, workspace_row],
4341
+ )
4342
+
4343
  return demo
4344
 
4345