Hermes Bot Mode:把多 Profile 变成一队能互相委派的 AI 同事

2026年11月7日 6点热度 0人点赞 0条评论

 

本文基于 Hermes Agent v0.23.0 实测(2026-11-07),全部截图取自真实运行的 Webapp。


一句话概括

Bot Mode 把 Hermes 的多 Profile 架构,包装成了一支有名有姓、能互相打电话干活的 AI 团队。

你不再需要记住哪个 profile 干哪活、怎么把活派过去。你打开一个花名册,点「作家」就跟作家说话,点「观察员」就跟观察员说话——它们还会自己互相讨论。


一、先厘清一个误解:Bot 不是新东西,是 Profile 换了张脸

很多人在这里绕弯子:以为 Bot Mode 是某种全新的 Agent 运行时。

不是。

一个 Bot 就是一个 Hermes profile。

  • Profile = ~/.hermes/profiles/<name>/,里面有独立的配置、记忆、skills、凭据和会话历史
  • Bot Mode = Desktop / Webapp 里的一层 UI,把 profile 渲染成一个有头像、有花名、有永久聊天的「同事」

所以:

  • 你改 profile 的模型,Bot 就换模型
  • 你给 profile 装 skills,Bot 就多一项能力
  • 你删掉 profile,Bot 就从花名册消失
  • hermes -p <bot> chat 在终端里打开的,是同一个 agent

没有新的原语、没有后台守护进程、没有额外的存储。 这是 Hermes 设计上很克制的一点——UI 层的能力,全部建立在已有原语之上。


二、Bot Mode 给了 Profile 什么

裸用 Profile,你得到的是:一堆会话,你自己挑一个开;想跟另一个 specialist 说话,得切换。

Bot Mode 补上了四件 Profile 单独没有的事:

1. 一个永久的「Bot Chat」

每个 Bot 有一个永远不会分叉的对话。

点它就回到同一段对话,聊完还在那。它的身份不是 id 指针,而是名字——那个 profile 会话库里标题恰好等于 Bot Chat 的那一行。每次打开都按名字重新解析,所以它天然抗 session id 变化。

一个细节挺有意思:在 Bot Chat 里打 /new 不会开新会话,而是被改写成 /compact——只压缩上下文,保留这段关系。普通会话里 /new 的自由度不受影响。

2. 花名册

左侧栏一个 Bots 页签,一行一个 Bot:头像、显示名、最后一条消息预览、最后活跃时间、未读状态。

还能建「分组」(Clients、Team,随你叫),拖拽归类,跨设备同步。

3. Bot 之间互相说话

这是最核心的能力。Bot 有一个 message_agent 工具,能给另一个 Bot 发消息。

你在任何聊天里 @作家 提个需求,作家会自己组织措辞再把消息送出去——你的原话不转发,回复带 Message from 🤖 作家 (@writer): 署名。

规矩定得很细:

  • 每条回复都带一句结论:@beta answered. 或 @gamma never answered: <原因>
  • 同一轮往返超过 gateway.bot_loop_guard.max_hops(默认 4)就拒绝再发——两个 Bot 不能无限对轰
  • Bot 可以用 [SILENT] / NO_REPLY 故意沉默
  • Bot 可以用 @user 把真问题升级给你

4. 群聊

2–6 个 Bot 一间房,你说一句话触发最多三轮串行发言。

  • 硬上限 10 条/轮次,到顶会暂停并给 Continue / Stop
  • 可以选「所有人都回」或「自动路由」(用一次便宜模型调用决定这次该谁接)
  • 每个成员在房里有独立的持久会话,房间上下文能存活
  • 如果这个房间由 gateway 托管,关掉 Desktop 它也在继续跑

Bot Mode 花名册

图 1:Webapp 里的 Bots 花名册。六个 profile 显示为六个有名有姓的同事。


三、Bot Mode vs Kanban:不是替代,是两种形态

这是最容易混淆的地方。用一张表说清:

Bot Mode Kanban 任务板
交互形态 微信聊天 投件箱
能否追问 能,随时接着聊 不能,body 写死了
谁来想「该怎么干」 它自己 你(写 body)
结果在哪 对话里,能看到过程 result_summary 一行
失败重试 手动再 @ 一次 自动,max-retries
留档 对话历史 永久,runs/events 全在
并行多 profile 群聊 swarm 图结构
你的操作位置 必须在 Webapp/Desktop 飞书 /kanban 就能用

一句话选型:

  • 需要来回磨的任务、想看它怎么想的 → Bot Mode
  • 定时任务、批处理、要留痕的活、多个 profile 并行做一件事再汇总 → Kanban

Kanban 的独特价值是任务级持久 + 可审计:卡有状态机(triage/todo/ready/running/review/done),有父子依赖(父卡 done 才放行子卡),有 swarm 扇出(root 黑板卡 → N 个并行 worker → verifier → synthesizer),而且飞书原生可用——/kanban 绕开 running-agent 排队限制,你在飞书里就能建卡、查卡,终态事件还能订阅推送到你的 DM。

Bot Mode 的独特价值是交互性和上下文连续性。

我的建议是分工用,不要二选一:Kanban 当调度层,Bot Mode 当交互层。


四、一个真实踩坑:为什么「只有 default 打不开」

这是我自己这台机器上真实遇到并修掉的问题,值得完整写出来,因为它暴露了 Bot Mode 一个设计上的硬约束。

症状

升级到 v0.23.0 后,Webapp 的 Bots 页签里:

  • default 这个 profile 显示成 "Hermes",其他 5 个 profile 显示正常
  • 点「Hermes」→ 弹 「无法打开 hermes 的聊天」
  • 其他 5 个 Bot 全部正常

第一层:显示成 "Hermes" 其实不是 bug

上游有一条设计如此的规则(apps/desktop/src/plugins/hermes-bots/labels.ts 的 displayName()):

canonical id 叫 default 的主 profile,在没有自定义标题时,展示为 "Hermes"——因为它作为 Bot 身份读起来像"没人起名"。

所以「只有 default 怪」是正常现象。但确实容易误解。

解法是官方命令,一行:

hermes profile rename default "小哈"

它只写 profile.yaml 的 display_name(presentation-only),不搬目录、不改 canonical id、不影响记忆库和 bank 名。改完刷新即生效。

⚠️ 批量改名的坑:hermes profile rename 对非 default 的 profile 是真改名——目录、systemd 服务名、canonical id、Hindsight bank 名一起变。批量改花名册显示名必须走底层函数:

from hermes_cli.profiles import set_profile_display_name
set_profile_display_name('writer', '作家')

同一个底层函数,profile rename default 走的也是它。

第二层:打不开才是真 bug

点开失败的真实原因在数据库里。

Bot Chat 的身份是标题,所以我去查了 default profile 的会话库:

select id, source, title, created_source from sessions where title like 'Bot Chat%'
→ ('api_1792176511_9c60b1b1', 'api_server', 'Bot Chat', 'unknown')

这是一条 2026-06-17 的 api_server 遗留测试会话(内容是当时测 "peer dm 通路正常" 那次)。它占着 Bot Chat 这个标题。

为什么它会导致打不开?看源码:

  • 本地身份只允许收养「无路由的旧本地历史」(LEGACY_LOCAL_SOURCES = cli/tui/gui/desktop/oneshot/tool/acp,外加移动端这类客户端标签)
  • api_server 属于有路由的客户端标签(NOT_CLIENT_LABELS)
  • validate_legacy_row() 对它直接判 not_found

于是按标题查 Bot Chat 抛错。而 Desktop 侧是 fail-closed 的:

它宁可报「重试」也绝不新建一个 Bot Chat——因为新建会把用户与该 Bot 的历史分叉,用户会读成「我的 Bot 更新后丢了全部上下文」。

所以就弹了那句「无法打开 hermes 的聊天」。

其它 5 个 profile 为什么正常? 它们的 Bot Chat 行都是 id 以 local- 开头、source='gui'、created_source='desktop' 的标准形状,能被收养。

修法:把占位的标题让出来,不要删历史。

sessions.title 上有 UNIQUE 索引,同名行只能有一条:

# 1) 先备份(state.db 可能几百 MB)
cp /root/.hermes/state.db ~/backup/state.db.bak-$(date +%F)

# 2) 用官方命令改名——保留历史,只把标题腾出来
hermes sessions rename api_1792176511_9c60b1b1 "peer dm 通路测试(遗留 api 会话)"

# 3) 验证标题空出来了
sqlite3 state.db "select id,title,source from sessions where title='Bot Chat'"

改完刷新 Webapp,客户端会自己新建一条 source='gui' 的标准 Bot Chat——不需要手工建。

关键原则:改名不删数据。用户和这个 Bot 过去的对话仍在,只是标题变了。删掉才是破坏。 反向同理:不要把一个正常的 local- 行改成别的标题,那等于悄悄丢掉用户的标准 Bot Chat。

Bot Chat

图 2:修复后点开「小哈」,成功进入它的标准 Bot Chat。


五、给 Bot 起名:名字从哪来

Bot 的显示名优先级:

  1. Bot Mode 标题(profile.yaml 的 ui_meta['hermes-bots'].title)—— Webapp 里右键 → Edit Profile 改的就是这个
  2. Core profile display name(profile.yaml 的 display_name)—— hermes profile rename 改的
  3. 都没有 → 显示 canonical id 的标题化形式

命名有个很好的实践:从它自己的 SOUL.md 里取。

我这套的六个 Bot,名字都来自各自 SOUL.md 的「核心身份」段:

Profile 显示名 职责
default 小哈 总管、服务器维护、调度
assistant 助贷小二 专属助理
observer 观察员 查资料、搜集信息、分析
writer 作家 写作助理
wechat-ops 文君 企业公众号运营
xiaohshu-ops 赫妹 小红书运营

改完刷新,BOTS 页签就是这六个名字了。

别把显示名和 @handle 搞混:主 profile 的 @handle 是 hermes(除非真有一个叫 hermes 的 profile 抢了这个 handle),这是路由用的,别动它。名字里不含拉丁字符时,@ 提及仍走 canonical id。


六、怎么用起来(最短路径)

Bot Mode 只存在于 Desktop / Webapp 图形界面。飞书里没有 Bot Mode,message_agent 工具也只在标准 Bot Chat 会话里存在。

开启 Webapp(浏览器版,不用装桌面客户端)

hermes config set webapp.enabled true
hermes gateway restart
hermes webapp

gateway 会在 http://127.0.0.1:9120 提供服务,hermes webapp 会打开一个一次性登录链接(60 秒内有效,浏览器换化成登录态,之后刷新和 gateway 重启都保持)。

对外暴露

Webapp 的登录用户拥有对应 OS 账号的全部权限——能执行命令、用 agent 工具、读写主机文件。所以:

  • webapp.host 设成 0.0.0.0 时,gateway 强制要求 dashboard 认证门(可信内网/VPN 用账密,公网用 OAuth/OIDC)
  • 优先走 SSH 隧道或 Tailscale,不要裸暴露公网

让 Bot 认识彼此

Bot 的名字和角色(title + description)会进到每个 Bot Chat 的 system prompt 里——所以它们开箱就知道「谁干什么」,选收件人时不用你解释。


七、几个值得知道的边界

Bot Mode 不能做的事

  • 飞书 / 微信 / CLI 里没有 Bot Mode,那些通道只有普通会话
  • 群聊跨多个 gateway 时是「经典群聊」,关掉 Desktop 就停
  • message_agent 只在标准 Bot Chat 里存在,普通会话、群成员会话、CLI 会话都没有

Bot 之间互相 @ 的失控风险

我这套历史上出过一次事故:writer / 赫妹 / 文君 三个 profile 在同一个飞书群里互相 @ 停不下来。Bot Mode 有 bot_loop_guard.max_hops 兜底,但飞书群里那套 allow_bots: mentions 的配置当时是放开的。

用 Bot Mode 之前,先确认各 profile 的 allow_bots 是不是 none。

Bot Mode 依赖 gateway 常驻

Bot Chat、群聊、Bot 间消息都跑在 gateway 进程里。gateway 停了,Bot 就不在了。


八、一句话总结

Profile 是能力单元,Bot Mode 是把它们组织成团队的界面层。

它没有引入任何新原语,却给了多 Profile 架构一直缺的那一层——它们怎么互相协作,以及你怎么跟它们协作。

如果你已经在用多 Profile,Bot Mode 值得开;如果你只有单 Profile,那它的价值有限,先把 Profile 这层用起来更划算。

至于日常调度,Kanban 管「派活」,Bot Mode 管「聊天」,两者一起用最舒服。

kenny

曾经是一位IT相关行业工作者...

文章评论