这是最容易被做错、代价也最大的一处。
null 与 0 必须分开
缓存命中率这种指标,有两种「零」:
- 没有数据:窗口内没有任何可测量的调用。
- 真 0%:测到了,分母大于零,但一次都没命中。
把前者显示成 0%,你会去排查一个根本不存在的缓存故障。把后者显示成「无数据」,你会以为功能没上线,而实际上是你的提示词前缀每次都在变、缓存确实一次都没命中。两种误报的代价都是让你做出错误决定。
所以接口把两者严格分开:hit_rate 为 null 表示无数据,为 0 表示真的一次没命中。
判别只能用判等,不能用真值
!0 === true。用真值判断会把「缓存完全失效」这个最需要被看见的状态,静默地吞成「无数据」。所以只能用 === null 判断。
没测到的调用要单独显示
供应商没返回用量的调用,会从分母里排除,同时单独显示条数。否则 400/1000 = 40% 会被稀释成 400/3000 = 13.33%,看起来比实际差得多。
不可用的工具不出现在注册表
可选工具(浏览器、文档生成、LSP)依赖缺失时,它不是「出现了但一调用就报错」,而是根本不在工具清单里,并如实标注不可用。
- 不启动假浏览器。
- 未配置搜索提供方、或缺少凭据时,状态记为不可用、结果为空数组——不返回编造的搜索结果。
- 沙箱后端不可用时拒绝执行,绝不回退到宿主进程跑命令。
产物要过真实格式校验
文档生成的产物先落暂存区,校验文件头与结构:PDF 必须有 %%EOF,OOXML 必须同时有 ZIP 结束记录与 [Content_Types].xml。
「把 HTML 改名成 .pdf」和截断、伪造的容器都过不去,校验失败即删除。生成脚本超时或取消时,结束整棵进程树,不留孤儿进程。
已知边界写在文档里
浏览器自动化通过我们的裁决之后,Chromium 会独立再解析一次 DNS。所以请求级复核只能收窄、不能消除这个时间窗口。
我们不声称已彻底防止 DNS 重绑定——需要硬保证时,应运行在受控代理或固定解析之下。同理,插件不是沙箱这件事也写在文档里,而不是藏在脚注。
凭据:失败不回退明文
Windows 上保存的模型密钥、配置里识别到的 token/password/secret、MCP 环境变量与请求头,使用 DPAPI 当前用户级加密。原有明文配置在读取时迁移,失败时拒绝明文回退。
需要同时说清楚:同一 Windows 账户下的恶意程序仍然可能访问这些凭据,这个机制不是进程沙箱。
一个不敢承认边界的工具,不值得把工作交给它。