From 50e1d57ed5683bb755d4b0b1da54edc6dd77e10c Mon Sep 17 00:00:00 2001 From: caoqianming Date: Tue, 7 Jul 2026 09:16:00 +0800 Subject: [PATCH] =?UTF-8?q?fix(web):=20=E8=B7=B3=E7=A7=92=E6=8C=87?= =?UTF-8?q?=E7=A4=BA=E8=A6=86=E7=9B=96=E5=88=B7=E6=96=B0=E9=87=8D=E8=BF=9E?= =?UTF-8?q?=20+=20=E5=8F=91=E9=80=81=E5=90=8E=E7=A9=BA=E7=AA=97(bump=200.4?= =?UTF-8?q?3.1)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 刷新/重连接管:phaseSince 随页面内存丢失,原先要等下一个 llm_start/ tool_call 才恢复跳秒——恰是用户因疑似卡死而刷新的场景;重建直播卡时 立即按"思考中"起跳,后续阶段事件校正(秒数从重连时刻起,非真实累计) - 发消息 POST 返回即起跳:覆盖 build_agent + 首轮 TTFT,原先等 llm_start 才开始计时 Co-Authored-By: Claude Fable 5 --- PROGRESS.md | 3 ++- core/__init__.py | 2 +- web/static/js/chat.js | 5 +++++ 3 files changed, 8 insertions(+), 2 deletions(-) diff --git a/PROGRESS.md b/PROGRESS.md index 024c47d..6f856a4 100644 --- a/PROGRESS.md +++ b/PROGRESS.md @@ -2,7 +2,7 @@ > 配合 `DESIGN.md`。本文件只记 phase 状态、决策偏差、文件量、下一步。每条 1-2 句:做了啥 + 关键判断;细节查 `git log` / `git diff` / `DESIGN §7.9`。 -最后更新:2026-07-07(run 长耗时可视化:reasoning 事件流 + 阶段跳秒指示,bump 0.43.0) +最后更新:2026-07-07(跳秒指示覆盖刷新重连 + 发送后空窗,bump 0.43.1) --- @@ -23,6 +23,7 @@ ### 2026-07 +- **07-07 / 0.43.1**:跳秒指示补两处空窗——① 刷新/重连接管后 phaseSince 随页面内存丢失,退回静态"思考中"不跳秒(恰是用户因疑似卡死而刷新的场景),重建直播卡时立即按"思考中"起跳,下一个阶段事件校正;② 发消息 POST 返回即起跳,覆盖 build_agent + 首轮 TTFT(原先要等 llm_start 才开始计时)。重连后秒数从重连时刻起算(非真实累计),可接受。 - **07-07 / 0.43.0**:run 长耗时可视化——修"前端一直静止显示思考中被当成卡死":① 新增 SSE `reasoning{delta}` 事件(loop 提取 `delta.reasoning_content`,thinking 模型分钟级推理原先整段丢弃、前端零反馈),前端渲染灰色折叠"思考过程"卡,历史消息里持久化的 reasoning_content 同款渲染;② 前端活跃状态指示:TTFT/推理期占位段每秒跳"思考中/深度思考中 · Ns"(CSS attr(data-status)),工具卡运行中加 spinner + 跳秒、结果到达定格为执行耗时;每轮 llm_start 重建占位段,工具轮之后不再空窗。 - **07-06 / 0.42.5**:497 跳转示例 301→308——平台走 http 入口 POST login 被客户端按 301 语义降级成 GET 报 405;308 保留方法/body。治本仍是调用方直配 https(明文首跳暴露 platform_key)。 - **07-06 / 0.42.4**:497 跳转目标示例改写死域名(http://IP 进来被带回域名无证书警告;https://IP 直连警告 nginx 层无解,入口统一域名),进故障兜底。 diff --git a/core/__init__.py b/core/__init__.py index 01ce4d7..33476b9 100644 --- a/core/__init__.py +++ b/core/__init__.py @@ -1,3 +1,3 @@ # zcbot 版本号单一事实源:web/app.py 的 FastAPI version、/healthz 返回、前端展示都引这里。 # 改版本只动这一行。 -__version__ = "0.43.0" +__version__ = "0.43.1" diff --git a/web/static/js/chat.js b/web/static/js/chat.js index 2277376..055b612 100644 --- a/web/static/js/chat.js +++ b/web/static/js/chat.js @@ -943,6 +943,10 @@ function createLiveAssistantCard(run) { } else { ensureTextSeg(run); // 空占位段:首字到达前显示「思考中」 } + // 刷新/重连接管:phaseSince 随页面内存丢了,阶段未知先按"思考中"起跳 + // (计时从重连时刻起,非真实累计);下一个 llm_start/tool_call 事件会校正。 + // 不跳秒的静态"思考中"恰是用户刷新的诱因,重连后必须立刻恢复活跃信号。 + if (!run.phaseSince) setRunPhase(run, run.phase || "llm"); return card; } @@ -1540,6 +1544,7 @@ async function sendMessage(overrideText) { }; // 预建的空占位 .body 即首个文字段(首字到达前显示「思考中」) run.curSeg = { el: asstCard.querySelector(".body"), acc: "", pending: false }; + setRunPhase(run, "llm"); // POST 返回即起跳:覆盖 build_agent + 首轮 TTFT 的空窗 state.liveRuns.set(taskId, run); state.streaming = true; syncTaskRowRunIndicator(taskId);