Hermes 的遥测到底记了什么:默认两个开关都是关的,收集和发送分开授权

你在装完 Hermes、第一次打开它的时候被问了一句“要不要开启本地共享指标”。大多数人会条件反射地选“不”,然后这件事就被丢到脑后了。等到某天你想搞清楚“它到底往上传了什么”,翻文档又只看到一堆指标名和一堆授权窗口的描述,于是继续搁置。
这篇把这件事一次说清楚。结论先放这里:默认全部关闭;收集和发送是两个独立的开关;记录的是有界计数器,永远不含提示词、文件内容、路径、设置值和错误原文。10 月 6 日合并的 PR #133809 还给它加了新的“失败原因”分类,让这些数字第一次变得对用户也有用。
两个开关,不是一组复选框
配置在 config.yaml 的 telemetry.shared_metrics 下面:
telemetry:
shared_metrics:
enabled: false # 本地收集,默认关
send: false # 传输给 Nous,默认关
endpoint: "https://telemetry.nousresearch.com/v1/telemetry"
三个关键点:
enabled管收集,send管传输,这是两个独立授权。只开enabled的话数据只落在你本机,永远不出网。send依赖enabled,但不会反过来打开它。如果写send: true而enabled: false,Hermes 会直接报错而不是替你把收集打开——一个“上传”开关不应该偷偷开启采集。- 只有整段时期都落在已记录的授权窗口内的包裹才会被发送。也就是说,你今天才授权,Hermes 不会把授权之前的任何数据回填上去。
endpoint 是刻意设计成不能被环境变量覆盖的,而且非 HTTPS 的地址会被拒绝(localhost 除外)。
到底记录了哪些东西
官方文档给出的清单很长,但都收敛在“有界计数器”这个原则上。举几个能说明问题的例子:
| 指标 | 记录的内容 |
|---|---|
hermes.process.exit |
CLI / TUI / gateway / cron 进程是怎么结束的:正常、崩溃(只带异常大类)、被杀、看门狗 |
hermes.tool_overhead.count |
一次会话里启用工具的个数分桶、工具定义额外占用的 token 分桶 |
hermes.tool_enabled_unused.count |
哪些默认工具集被打开了却从没用过 |
hermes.feature_disabled.count |
用户关掉了哪些工具集 / 技能 / 插件 / 设置项 |
hermes.provider_setup.count |
配置 provider 的流程走到哪一步失败,失败大类是什么 |
hermes.desktop.onboarding |
首次运行的引导卡在哪一步 |
名字只有在是官方自带的时候才会原样出现;自定义的工具集、技能、插件一律记成 custom。设置项只记键路径,绝不记值。文档里那句总结很到位:永远不含提示词、文件、路径、设置值和错误原文。
这次新增的:失败原因有了分类
在 PR #133809 之前,遥测知道“一次运行失败了、死在哪一阶段”,但不知道为什么。三个数字暴露了这个盲区:CLI 更新里有 22% 到 27% 的安装当天遇到过一次更新失败,桌面端是 14% 到 18%;技能安装大约 35% 的事件是失败的,插件安装约 33%;更麻烦的是 12% 的失败更新只留下一个 failed_stage=other——每个阶段的标记都走过了,运行却仍然是失败的。
新的 failure_class 是一组封闭取值,在每个抛出点或从异常类型推导出来,从不去读错误消息文本。几个例子:
- 技能:
ambiguous、auth_rejected、fetch_failed、invalid_bundle、not_found、rate_limited、scan_blocked、stale_index; - 插件:
clone_failed、deps_declined、git_missing、incompatible、manifest_invalid、removed_from_catalog; - MCP:
auth_required、config_invalid、connect_failed、missing_credentials、server_start_failed; - 所有类型共用:
none、exception、filesystem_error、network、other、permission。
同时修掉了那个 other 的误标:一次“部分成功”的更新(重启后验证发现 gateway 或桌面后端没回到新代码,但没有停止原因)现在会写成 failed_stage=verify,并带上具体原因。技能和插件安装还会附带 registry,用来区分“官方源挂了”和“你自己填的 URL 挂了”——这两件事以前长得一模一样。
新装收据:为什么要放 7 天
install.sh / install.ps1 的全新安装以前什么都不上报,因为授权询问发生在安装之后。现在安装脚本会在结束时(或失败的阶段)在 $HERMES_HOME/telemetry/shared_metrics/pending_installs/ 下留一个很小的本地文件,只包含固定取值的标记和起止时间。
它的生命周期值得单独说,因为它同时回答了两个疑问:
- 安装脚本本身从不发送任何东西。 它只是留个本地便条。真正上报发生在之后某次 Hermes 启动时,而且必须那一刻收集是开着的。
- 便条最多留 7 天。 7 天内没有被任何一次启动计入的收据会被删除且不上报,所以一次老安装不会被算到后来的 Hermes 版本头上。任何“不”的回答都会立刻删掉未上报的收据。
- 单次
--stage调用不会写收据;被 Ctrl-C / SIGTERM 打断的安装记为interrupted。
换句话说,你如果在安装时选了“不开启”,这个便条会被直接删掉;如果你装完就再没启动过 Hermes,它也会自己过期。
怎么开、怎么关
- 交互式向导:
hermes setup telemetry,会分别问“是否开启本地共享指标”和“是否发送给 Nous”; - 随时重来:
hermes tools,或桌面端 Settings 里的对应开关; - 手动改:直接编辑上面那段
config.yaml。
关掉收集会同时撤回发送授权(发送不能比收集活得久)。官方文档也明确写了:关闭共享指标会停止新的收集,但不会静默删除已经收集到的本地数据——想清理就自己删对应目录。
这对你意味着什么
如果你把它当成“又一个隐私开关”,那这篇的重点是:默认关闭、两级授权、记录内容被限制在封闭取值集合里,连失败原因都只记录固定分类而不是错误原文。如果你关心的是“这个东西对我有什么用”,那么新的 failure_class 就是答案——你遇到的安装失败、插件失败,第一次能被归到一个明确的桶里,官方看板上“某个源在批量 404”和“你手抖写错 URL”不再混在一起。
小结
一句话版本:默认全关,收集与发送分开,记的是分类和计数,不是你的内容。想帮忙就把 send 打开,那时它才会把有界计数器打包发给 Nous;不想参与就什么都不用做,安装脚本留下的那张便条会在 7 天内自己消失。
想先看清 Hermes 在本地怎么处理你的数据,可以接着看密钥加密与 Keychain 存储;装机的第一步见安装指南。