桌面端联调验收报告

TODO #12(联调与验收)+ #1C(macOS 注入与浮层)· 2026-07-10

macOS 实测 gummy 真实 provider 无头网关压测

一、结论速览

验收项结果说明
12A mac 全链路(快捷键→采集→流式→浮层→注入)通过真实 App + 模拟快捷键,mock 文本成功注入 TextEdit,计费准确
12A Windows 全链路未执行Windows 机(ssh windows)缺 Rust/Node 工具链,需先装环境
12B release_to_commit < 300ms部分达标P50 261ms ✅ / P95 918ms ❌(受两轮 provider 异常拖累)
12B first_partial P95 < 500ms未达标P50 845ms / P95 3870ms——gummy partial 下发节奏本身 ~750-850ms,目标需重新校准
12C 断连重建通过服务端重启后桌面端数秒内自动重连(18E 生效)
12C SESSION_LIMIT(3 分钟截断)通过198s 推流在 180s 准时截断:先定稿下发全部 final,再发 SESSION_LIMIT
12C RATE_LIMITED(30 次/30 分钟)通过第 31 个会话被精确拒绝,前 30 个正常
12C QUOTA_EXCEEDED(试用/余额用尽)通过扣穿当句不掐断、final 不丢;再次 start 预检拒绝(帧序备注见 §五)
1C 浮层不抢焦点 + 注入TextEdit 通过会话期间焦点保持在目标 App,注入成功;微信/浏览器/IDE 三目标待人工点验
商业链路(登录/购买/入账)通过mock 扫码登录、下单、回调入账、回调重放幂等、订单状态全部正确
联调中发现并已修复:overlay/tray 为 transparent: true 窗口,但未启用 macOSPrivateApi——macOS 上 WKWebView 透明必须开启该项,否则浮层带不透明底色。 本次已在 tauri.conf.json"macOSPrivateApi": trueCargo.tomlmacos-private-api feature(cargo check 通过), 视觉效果需真机目测确认

二、测试环境与方法

服务端本机 go run ./cmd/server(:8080)+ docker compose pg/redis;先 mock 后切 gummy 真实 provider(key 经 rbw 管道注入环境,未落盘)
桌面端npm run tauri dev 调试构建,settings.json 预置 mock 登录 token 指向 localhost
快捷键模拟osascript System Events 按住/松开 Cmd+Shift+Space(3s)
延迟/异常压测自制无头 WS 客户端 wslat(Go + gorilla),按协议 100ms/3200B 实时推流真实中文语音(macOS say 合成 8.6s / 1s / 198s 三种)走 /v1/asr/stream 真实网关路径
测试账号mock 微信登录建两个 trial 用户;用户一经 mock 支付购入 pack_100(6000s 余额)

延迟指标口径

三、12A 全链路(mac)

  1. mock 扫码登录:POST /v1/auth/qr → 手动打回调(模拟扫码)→ 轮询 confirmed 拿 JWT ✅
  2. App 启动即与服务端建立 WS 预连接 + REST 轮询(lsof 确认 4 条连接)✅
  3. TextEdit 聚焦 → 模拟按住快捷键 3s → 松开 → mock provider 脚本文本「帮我把这份周报整理一下,重点突出本周的进展。」完整注入 TextEdit ✅
  4. 会话期间前台应用保持为目标 App(浮层 focusable:false 生效,即 1C 验证点)✅
  5. 计费:3s 会话后 /v1/me 的 trial_used_today 精确 +3 ✅
Windows 侧同方法可复用:装好 rustup + Node + VS Build Tools 后 clone 仓库 npm i && npm run tauri dev,注入走 SendInput(10F)。

四、12B 延迟基线(gummy 真实 provider,10 轮 × 8.6s)

指标P50P95目标判定
first_partial845ms3870msP95 < 500ms未达标
release_to_commit261ms918ms< 300msP50 达标 / P95 超

超短句补充数据(RATE 测试顺带产出,1s 语音 × 30 轮)

建议(已入 backlog)

五、12C 异常路径

场景做法观察判定
断连重建 App 保持连接时重启服务端进程 桌面端数秒内自动重连(lsof 确认新连接),无需用户操作 通过
SESSION_LIMIT
3 分钟截断
余额账号推 198s 长音频 180s 准时截断:219 个 partial、全部 final 先定稿下发,随后 SESSION_LIMIT:单次最长 3 分钟,松开后可继续,会话关闭 通过
RATE_LIMITED
30 次/30 分钟
同设备连发 31 个 1s 短会话 第 1-30 个会话全部正常识别并计费;第 31 个 start 被拒:RATE_LIMITED:操作过于频繁,稍后再试——滑动窗口精确在第 31 次生效 通过
QUOTA_EXCEEDED
试用+余额用尽
Redis 置试用已用 177/180s 后推 8.6s 音频;再次 start 剩 3s 时 start 预检放行 → 推流中扣穿 → 下发 QUOTA_EXCEEDED:今日试用已用完,去购买时长随后仍 flush 当句 final(已识别内容不丢,实测收到截至扣穿点的定稿文本);再次 start 在预检被直接拒绝 通过
以上为协议/服务端行为验证;桌面端 overlay 对各错误码的文案呈现(19C 实现)需人工目测一遍。

QUOTA 帧序备注(跨端确认项)

六、商业链路(登录 → 购买 → 入账)

  1. GET /v1/packs:三档时长包(100/500/2000 分钟)正常返回 ✅
  2. POST /v1/orders:下单返回 native code_url
  3. POST /v1/pay/notify(mock 明文回调):SUCCESS,余额 +6000s,订单转 paid,账号 trial→ok ✅
  4. 回调重放幂等:同 transaction_id 二次回调返回 SUCCESS 但余额不重复入账 ✅
再次强调(17I 已标注):MockPay 不验签,/v1/pay/notify 现等于公开充值接口,上线前必须换 wechatpay-go 真实验签

七、遗留项(需人工 / 后续)

负责说明
真人麦克风实说验证人工 · 2 分钟App 正在运行且已登录:任意输入框按住 Cmd+Shift+Space 说话即可(服务端 gummy)
1C 三目标注入点验人工 · 3 分钟微信 / 浏览器 / IDE 各注入一次;同时目测浮层深色玻璃是否透明(本次修复效果)
辅助功能/麦克风权限引导人工正式打包后首启流程(11F)在无权限干净环境走一遍
Windows 全链路装环境后复测ssh windows 可达但缺 rustup/Node/VS Build Tools
overlay 错误态文案目测人工断网/超限场景下浮层文案(19C)
first_partial 目标重校准 + provider 观测日志开发见 §四建议,建议并入 #22 backlog