Files
zyt/artifacts/desktop-ai-stream-validation.md
T
2026-10-17 16:08:24 +08:00

4.0 KiB
Raw Blame History

桌面 AI 对话即时反馈与秒数验证

日期:2026-10-17

行为

  • 提交问题即显示“已等待 0 秒”,资料准备与模型等待期间每秒更新。
  • 第一段有效文本到达时立即替换等待占位;后续文本按 40 ms 合并刷新,保留顺序。
  • 生成期间显示“生成中 · 已用时 N 秒”;完成后显示模型、首字耗时、总耗时和时间。
  • 完成、错误、超时、静默断连、切换患者、关闭窗口均停止秒数计时;新问题重新计时。迟到事件不会覆盖已结束的结果。
  • 富文本解析和格式调整完成后统一测量高度,减少一次更新内的重复布局。
  • 服务端修复 CRLF 分帧错误,详见 后端审查。

验证

在 app/ 下执行:

.venv/Scripts/python.exe -m pytest -o addopts= tests/test_ai_consult_ui.py tests/test_ai_consult_workspace_ui.py tests/test_api_client.py tests/test_repository_parity.py
.venv/Scripts/python.exe -m ruff check src/doctor_workstation/ui/dialogs/ai_consult.py tests/test_ai_consult_ui.py

结果:156 passed in 4.75s;Ruff 通过。

新增端到端回归使用真实 httpx 解析器、仓库、线程池 worker 和 Qt 事件交付,暂停上游结束事件,确认首段中文文本已出现在界面;覆盖跨网络块的 UTF-8 字符、后续文本顺序、结束状态以及回调运行在 UI 主线程。未调用生产模型。

服务端 10 项相关契约/行为测试与 3 项 PHP 语法检查通过,命令及结果见后端审查。

1308 × 806 离屏检查三个状态,完成状态元信息没有截断:

本地一次富文本更新对比:同一离屏控件连续 20 次更新,原逻辑 157.9 ms,新逻辑 129.6 ms。该数值仅为本机布局检查,不代表生产模型首字时延。

扩展检查边界

额外运行 test_dialog_detail_layout.py、test_list_detail_geometry.py、test_diagnosis_detail_contract.py、test_ui_detail_refinements.py:34 通过,3 失败,分别为挂号列表横向溢出、患者状态按钮宽度、问诊筛选控件高度。这些模块未在本次任务中修改。将 AI 模块恢复为 Git HEAD 源码后再次运行同一组,仍是同样的 3 项失败(34 passed in 12.22s),确认不是本次修改引入。

AI 用例与其他布局用例连跑时,在后者 fixture 的 apply_theme() / app.setStyle("Fusion") 处停滞;独立运行布局组能完成。将 AI 模块恢复为 Git HEAD 源码后,该组合也会停滞,已停止诊断进程;没有修改全局主题或相应布局。

生效范围

已修改仓库源码,未生成安装包或部署生产服务。源码运行的桌面端重启后加载;已安装的打包版本需重新构建发布。服务端 CRLF 修复需部署。病例聚合及模型首字前的真实耗时仍然存在,当前以实时秒数明确展示。

追加:快捷工具后续点击无反应

同日修复后续反馈:完成/报错到达后立即解除忙碌状态,不依赖后台线程退出;worker 收到 done 后不再拉取下一个事件。生成中切换其他快捷工具、快捷指令或对话建议会停止当前请求,保留已有文本和耗时并明确标注停止;重复点击相同的进行中工具只提示,不重复提交。新请求自动展示问诊对话并恢复全部对话筛选,避免结果被其他资料页或筛选隐藏。

统一窗口结束清理,覆盖返回、侧栏 ×、Escape、accept/reject 和原生关闭;旧请求的 delta/error/finished 回调无法影响新请求。审查依据见 快捷工具生命周期审查。

新增 4 项核心回归在修复前均实际失败,修复后通过;另覆盖 4 个快捷入口和 6 种窗口退出方式。相同桌面端测试命令最终结果为 170 passed in 5.84s,Ruff 与 git diff --check 通过。未修改服务端、打包或重启正在使用的桌面端进程。