本文基于 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 它也在继续跑

图 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。

图 2:修复后点开「小哈」,成功进入它的标准 Bot Chat。
五、给 Bot 起名:名字从哪来
Bot 的显示名优先级:
- Bot Mode 标题(
profile.yaml的ui_meta['hermes-bots'].title)—— Webapp 里右键 → Edit Profile 改的就是这个 - Core profile display name(
profile.yaml的display_name)——hermes profile rename改的 - 都没有 → 显示 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 管「聊天」,两者一起用最舒服。
文章评论