工作和私人两个 Gmail,Hermes 终于分得清了


早上九点,你在聊天窗口里让 Hermes 看一眼“今天有没有重要邮件”。它打开的是你上周注册玩具项目时用的私人邮箱,工作邮箱里客户昨晚的回信,它一眼都没看到。于是你补一句“我是说工作那个”,它却只能含糊地回你一句“已连接 Gmail”,因为它手上就只有这一个东西可以指。

这不是模型笨。在旧版里,Hermes 对每个应用只认识一个连接,那个连接没有名字,也没有第二个。

一个应用,以前只认一个账号

Hermes 调用外部应用走的是“连接器”(connector):网关把它托管成工具,名字长这样 connectors__gmail__SEND_EMAIL,你用 tool_search 找到它、用 tool_call 调用它。在这套机制里,旧版默认一个应用只有一个账号,后果很具体:

  • 第二个 Gmail 登录没有任何名字,模型无法在两者之间做选择,只能挑“最新的那个”;
  • reconnect gmail 看的是连接器级别的“已连接”标志。一个账号健康、另一个已经过期时,它会回答已连接,然后什么都不修;
  • 一个已经打开的 Gmail 连接卡片,会被任何新的 Gmail 连接请求复用;
  • 任何一次调用的结果都不会说明它跑在哪个账号上。

在一个人用一台机器时,这只是别扭;在多人共用一个 Hermes 网关时,它就成了权限问题——社区 issue #15602 里那个把同一个网关同时接给两个人的 Gmail 的用法,撞上的就是这堵墙。

账号有了名字:alias

新版本给每个账号加了一个短名字,官方叫 alias:1 到 32 个字符,小写字母、数字或连字符,必须以字母或数字开头。没有名字的账号,就沿用应用自己给的标签(label)。

规则是这样的:只要某个应用上有两个活跃账号,网关就会在它的连接器工具 schema 里加上 connector_alias 字段,把可选的名字列出来。模型调用时带上这个名字:

tool_call  connectors__gmail__SEND_EMAIL
           {"connector_alias": "work", ...}

结果里会带回 account,界面上那条工具标签也会变成 Gmail · send email (work)。你一眼就能看出这封邮件是以哪个身份发出去的。

除了名字,还有几件事一起落地了:

  • manage_connections 的目标对象多了 alias(要操作哪个账号)和 to(改成什么名字),并新增了 rename 动作。带 alias 的调用只针对那一个目标;MCP 目标会拒绝这两个字段;
  • connect 带名字时,网关去要这个账号:没有就新建,已经有一个活跃账号叫这个名字就直接回答已连接;
  • reconnect 带名字时,读的是这个账号自己那一行,而不是连接器级别的开关,所以它只修坏掉的那一个,另一个继续健康。这一行读不到时,工具会报错,不会偷偷新建一个;
  • status 会把每个连接器的账号列出来,包含 alias、label、status、active。

命令行:hermes connectors

终端里多了一条命令,覆盖列举、连接、改名、移除:

hermes connectors list
hermes connectors accounts
hermes connectors accounts gmail --all
hermes connectors connect gmail --alias home
hermes connectors rename gmail work --to office
hermes connectors disconnect gmail --alias home --yes
子命令 干什么
list(别名 ls) 列出所有连接器以及是否已连接
accounts [app] [--all] 列出已连接的账号;默认折叠 retired(被重连替换掉的旧账号),--all 一并显示
connect <app> [--alias NAME] [--reconnect] [--force] 连接一个新账号;--reconnect 修复出问题的那一个;--force 让健康的账号也重新登录
rename <app> <名字或标签> --to <新名字> 改名
disconnect <app> [--alias NAME] [--yes] 移除账号;非交互式 stdin 必须带 --yes

几个值得记住的细节:

  • connect 会打印登录链接,然后一直等到账号连上或超时。Ctrl-C 会关掉这次连接并以 130 退出,这样同一个应用的下一次连接不会被卡住;
  • 名字格式不对、或者和同一个应用里另一个活跃账号撞名,会在发出请求之前就被拒绝;
  • 一个应用下有多个账号时,不带 --alias 的操作会直接报错,并把你可选的名字列出来给你挑。

TUI 里的 /connectors 浮层

在终端 UI 里输入 /connectors,会打开一个浮层,一行一个账号,显示「应用 · 名字 · 状态」:

  • r 就地改名,回车保存、Esc 取消;
  • a 添加账号:选应用、输名字、打开链接。浮层会一直等到账号落定、链接过期,或者网关拒绝;
  • c 重连选中的账号。它不会删任何东西,健康的账号会立刻回答已连接;未命名的行会先要求你给它起个名字;
  • x 移除选中的账号,走 TUI 通用的确认弹窗。只要有别的确认框开着,浮层就停止读键盘;
  • Tab 显示或折叠 retired 账号,折叠状态下它们不能被重连。

浮层里应用了一个保守规则:只要有一个 agent 提问或确认框开着,浮层就不响应按键,避免你在回答问题时误删账号。

桌面端

Desktop 的 Capabilities → Connectors 里,每个应用下面现在会列出它的每个账号,可以命名、改名、新增、重连、移除;移除会先走一次确认。代理自己给新账号起了名字时,聊天里会出现一句话告诉你它选了什么,例如「Hermes named this Gmail account work. Rename it anytime.」——名字由代理决定,不弹输入框问你。

注意事项

  • 需要 Nous Portal 登录:连接器是托管工具,得先 hermes login。没登录时命令会直接提示你先登录,而不是报一个看不懂的错误。
  • 改名还要等 Portal 端上线:在 Portal 提供改名路由之前,rename 会回答「This Nous Portal cannot rename connector accounts yet.」,桌面端会显示这个拒绝并恢复旧名字。其余操作不受影响。
  • 删账号仍然只由人来做:CLI 的 disconnect 要你确认,桌面端要你点确认。自动化流程不会替你删。
  • 状态:这套改动(PR #135097 / #135151 / #135173)2026-10-11 合并进 main,最新的 v0.21.6(10 月 8 日发布)里还没有,需要等下一个 release 才会进你的安装。
  • 连接器只在登录了 Nous 账号的环境里出现,hermes connectors list 说「Connectors are not available. Sign in with hermes login first.」就是这个原因。

小结

一句“用工作那个邮箱”,现在真的能被听懂了:账号有名字,模型调用时点名,结果回来说明身份,重连只碰坏掉的那一个。多做一步命名,换来的是每一次外部操作都可追溯到具体账号——在多人共用、或者工作和私人混用一台机器的场景里,这一点比省事更重要。

如果你还没建好连接器这一层,可以先看工具搜索的用法了解工具是怎么被找到和调用的,再看官方远程 MCP 目录了解托管工具的来源;还没装 Hermes 的话,从安装指南开始。