跳转至

OH 学校模型请求修复

历史记录 / Historical record:本文保留当时的计划、研究或验收证据,不代表 0.11 当前能力全集。现行说明见 文档入口;英文入口见 English overview。

用户已授权按 DSH 的请求方式立即修复。依据 2026-10-20 诊断:当前流式请求每 3 秒派生一次未取消的 POST,一次操作最多产生 4 个在飞请求;本机延迟响应、并发上限 3 的接口已复现 429。

实现范围

  1. 移除请求竞速;单次 HTTP 请求及流读取均可取消。暂时失败仅在未输出内容时有限串行退避,遵守 Retry-After;不重放已输出的文本或工具调用。
  2. 桌面与移动宿主使用同一运行门禁,每轮独立取消标志。忙时拒绝新请求,等待旧任务真实退出再释放;移除按运行时长接管和共享标志重置。
  3. 认证校验区分有效、明确失效及暂时网络错误;网络异常和限流不触发强制续签。路由及 Cookie 独立刷新。
  4. 界面不把静默视为完成;取消涵盖发送前预检和已发送请求。429 保留真实错误,提供消息重试,续签只用于登录凭证。
  5. 更新桌面 bundled sidecar 和当前 dev 安装产物,核对版本与散列。

验收

  • 慢响应超过 3 秒仍只发一次请求。
  • 429 重试之间无重叠,服务端等待时间得到遵守。
  • 等待响应头、读取流、退避期间均可取消;服务端观察到连接关闭。
  • 已输出后失败不重放。
  • 忙时重复提交、运行超过 15 秒、取消后新请求及前端预检取消均验证。
  • Rust 核心/sidecar 测试、TypeScript 检查和相关 UI 守卫通过。
  • 学校真实服务不用于压力测试;本地接口覆盖错误路径。

完成记录(2026-10-20)

  • 推理传输改为同线程驱动的异步 HTTP;取消直接丢弃在途请求/流,没有遗留请求线程。等待响应头 60 秒、流空闲 120 秒;最多共 3 次串行尝试,遵守 Retry-After。已产生文本、思考或工具增量后不自动重放;截断的工具参数不能当成功响应执行。
  • sidecar 与内嵌宿主共用每轮门禁。取消按 runId 指定目标;忙时提交和新建、切换、删除、导入、恢复会话均被拒绝,不夺取旧任务。进度事件带 runId,避免 IM 结果混入本地预检中的对话。
  • token 校验区分明确失效与暂时失败,预检/路由/签发各自合并并发调用。失败退避不覆盖最后一次成功验证;等待过程中已过期的 token 不放行。路由响应迟到时不能覆盖网络切换后的新结果。
  • 前端取消覆盖预检和运行两个阶段;等待后端真实结束才结束运行状态。限流卡保留服务响应并可重试消息。事件缓冲使用递增序号,超过 300 条后仍能继续显示长回复。

验证与复现入口

  • pnpm test:oh:31 个认证/路由场景、27 个取消/事件断言及手机 OH 静态守卫。
  • Harness 目录运行 cargo test --offline --workspace:51 项 Rust 测试通过,其中包含真实本地 TCP 服务验证单请求、串行重试、响应头/流/JSON/退避取消和截断响应。
  • Harness 目录运行 node test/chat_lifecycle.mjs <sidecar绝对路径>:29 项实际子进程验收,包括持续 15.5 秒仍不被接管、定向取消、连接关闭、忙时会话存档不变和两轮事件归属。
  • 桌面 TypeScript 检查、Tauri cargo check --offline / cargo build --offline、release sidecar 构建、UI 文案与 OneGUI 守卫通过。

dev 交付

内嵌及插件清单版本统一为 0.1.5。已重建 release sidecar 与桌面 debug App,并正常退出、重新启动 /Users/st/Library/Caches/onethu/OneTHU.app。bundled 与实际安装 sidecar 的 SHA256 均为 6ea1423ed080c56505a42c9a742124352833d2ebf8a0a6d859f9d9a04c553c18。本机构建使用 APFS /Volumes/OneTHUBuild 的 target 目录。

本轮未向学校模型发起真实对话。测试证明已消除客户端可自行放大并发的缺陷,不代表学校服务永远不会限流。原生截图工具仍报 ScreenCaptureKit -3811,未将本地接口测试称作原生 UI 点击验收。