fix(swads): make daily report generation resilient

This commit is contained in:
Jeffrey Wu
2026-09-09 17:59:05 +08:00
parent f4e3f41c2c
commit 8361b10c66
13 changed files with 278 additions and 38 deletions
+2 -2
View File
@@ -60,6 +60,6 @@ Run timeout 和用户 cancel 使用不同 reasonApproval wait 监听同一 Ab
Pi tools 增加 `swads_cli``render_swads_daily_report`,原有工具和审批不变。`SwadsGateway` 在服务启动时读取并校验环境配置,每个命令创建独立 MCP client/transport,初始化后使用短时能力缓存(60 秒,capabilities 强制刷新),调用结束关闭连接。命令 enum 映射固定远端名,参数先经过本地 strict schema/64 KiB/深度 10 检查,再经远端 inputSchema 验证;需要显式 readOnlyHint,拒绝 destructiveHint。单次调用 30 秒默认超时,响应 2 MiB 上限,AbortSignal 来自当前 Run。Gateway 工具不会注册到 Agent。
每个 Session 的 `SwadsReportTools` 记录当前 Run 的 whoami/catalog/query 成功证据,缺失或必需查询失败禁止 render。Skill 根据返回 columns 名称归一化真实指标,日期、账户、归因和样本限制写入 strict `ReportData`。ReportStore 拥有 accountKey/hash、reportId/UUID 和输出路径,临时目录完整写入后 rename。Chrome 从环境或固定系统路径发现,通过 execFile 启动,5200/9000/24000 三档画布,检查底边与结尾标记后裁切;不完整则降级。
每个 Session 的 `SwadsReportTools` 记录当前 Run 的 whoami/catalog/query 成功证据,缺失或必需查询失败禁止 render。Facade 在数据进入模型上下文前按命令投影并限制为 50 KiB;无实体的 breakdown 可为空,但账户汇总/趋势必须有观测行。Skill 根据返回 columns 名称归一化真实指标,日期、账户、归因和样本限制写入 strict `ReportData`。ReportStore 拥有 accountKey/hash、reportId/UUID 和输出路径,临时目录完整写入后 rename。Chrome 从环境或固定系统路径发现,通过 execFile 启动,5200/9000/24000 三档画布,检查底边与结尾标记后裁切;不完整则降级。
render tool completion 由 Pi adapter 映射到 `report.generated { assistantMessageId, artifact }`。事件只含相对 URL/安全标识/warning,既没有文件正文也没有绝对路径。Web reducer 合并同 Run 的临时 assistant ID,从同源接口获取 PNG 并创建 blob URL,再追加到指定消息(兼容本地 HTTP 部署下 assistant-ui 的图片 URL 校验);Markdown、图片 Dialog 与下载 Tool UI 分工呈现。生成图片是展示产物,不进入模型输入,不受 vision capability 限制。报告 Store 位于 Session Store 之外,重置和删除会话不会删除报告。
Harness completion guard 在模型取得四类指标后却空响应或漏调 render 时,不再依赖兼容模型重试,而是从本 Run 已收集的只读查询证据构造 strict `ReportData` 并由服务器直接渲染;必需查询不完整或失败仍以 `SWADS_REPORT_INCOMPLETE` 结束,不能误报 `run.completed`。普通模型路径未输出可见最终 Markdown 时阻止 render。成功的 render result 使用 `terminate` 结束工具循环,并携带由 strict ReportData 生成的安全 Markdown fallback。Pi adapter 将其映射到 `report.generated { assistantMessageId, artifact, markdown }`。事件只含相对 URL/安全标识/warning,既没有文件正文也没有绝对路径。Web reducer 合并同 Run 的临时 assistant ID,从同源接口获取 PNG 并创建 blob URL,再追加到指定消息(兼容本地 HTTP 部署下 assistant-ui 的图片 URL 校验);Markdown、图片 Dialog 与下载 Tool UI 分工呈现。生成图片是展示产物,不进入模型输入,不受 vision capability 限制。报告 Store 位于 Session Store 之外,重置和删除会话不会删除报告。