Hermes 多 Agent 管理指南

写在前面

上一篇文章我介绍了《Hermes Agent 基础配置指南》,带你把一个”素颜”的 Agent 变成了可用的 AI 管家。但用着用着你可能会发现一个问题:一个 Agent 什么都会,但也什么东西都搅在一起。

你可能遇到过这样的情况:

  • 想让一个 Agent 专门写代码,另一个管日常事务,结果它们在同一个记忆空间里打架
  • 给 Agent 配置了飞书机器人,但又想在另一个群聊里放个画风完全不同的 Agent
  • 写了个 SOUL.md 管家人格,结果开发调试时它还在跟你端茶倒水

这些问题,一个 Profile 系统就能解决。

Profile 是什么

Profile(配置文件)是 Hermes Agent 提供的一种完全隔离的环境机制。每个 Profile 就是一套完整的 Agent 实例,彼此之间互不干扰。

一个 Profile 包含的都是独立的一套:

  • config.yaml(功能配置)、.env(环境变量)、SOUL.md(人格定义)
  • 所有对话历史、记忆数据、技能文件
  • 定时任务、插件、状态数据库
  • 独立命令别名和网关服务

用起来其实很简单。创建一个 Profile 后,你就能获得一个像 coder 这样的独立命令,直接 coder chat 就能跟它聊天。

什么场景需要多 Agent

动手之前,先看看多 Agent 模式能解决什么实际问题。

开发与日常分离。给开发工作配一个 Agent,让它记住你的代码习惯、项目结构、常用命令。
日常事务用另一个,管管日程、搜搜天气、提醒事项。
记忆不串,人格也不串。

不同平台分配不同 Agent。你有飞书个人号,也有一个技术讨论群。
让一个 Agent 用自己的飞书机器人绑在个人号上,用管家人格,温和耐心地回答问题。
让另一个 Agent 绑在群里,用技术顾问人格,专业直接。
各自独立网关,互不干扰。

实验与生产隔离。想试试新模型、新技能,又不想影响正在稳定运行的 Agent。
创建一个测试 Profile,随便折腾,折腾坏了删掉重来,不影响生产环境。

多角色服务。给不同的群聊或渠道分配不同人格的 Agent。一个负责答疑,一个负责闲聊,一个负责监控告警。
每个 Agent 读取自己的 SOUL.md,输出完全不同的语气和风格。

创建你的第一个 Profile

开始创建很简单:终端里执行:

1
hermes profile create coder

几秒钟后,你就拥有了一个叫 coder 的新 Profile。Hermes 会在 ~/.hermes/profiles/coder/ 下创建一套全新的目录,包含默认的配置模板。

不过这时候它还是”空壳子”,没有 API Key,也没有模型。运行一下初始化:

1
coder setup

会像第一次配置 Hermes 一样,引导你选择模型、填入 API Key。完成后就可以直接聊天了:

1
coder chat

你马上就能看到提示符变了,前面多了个 coder 前缀,告诉你现在是在跟哪个 Agent 说话。

三种创建方式

空白创建适合从零开始。但更多时候,你想要的不是从头配一遍,而是在已有配置上快速复制一份。

克隆配置(--clone

1
hermes profile create work --clone

这个命令会复制你当前 Profile 的 config.yaml.envSOUL.md,但不会带走任何对话历史和记忆。相当于把”设置”复制了一份,开了个干净的新号。

克隆完你可以直接编辑它的个性:

1
nano ~/.hermes/profiles/work/SOUL.md

然后 work chat 就能用上新身份了。

克隆全部(--clone-all

1
hermes profile create backup --clone-all

完整的快照。配置、API Key、人格定义、所有记忆、对话记录、本地技能、定时任务,一个不落全部复制。我一般拿它来做实验前的备份,在新 Profile 里改东西测试,翻车了直接删掉,完全不影响原版。

从指定 Profile 克隆

1
hermes profile create work --clone --clone-from coder

不克隆当前 Profile,而是复制指定 Profile。比如说你在默认 Profile 上折腾了一堆配置,但想基于专门配好的 coder 创建新的,就用这个。

管理多个 Agent 的日常操作

Profile 建好了,怎么在它们之间切换、怎么查看状态、怎么按需调整?以下是几个最常用的操作。

切换激活的 Profile

Hermes 任何时候都只在一个 Profile 下工作,但切换方式很灵活。

方法一:直接用命令别名

创建 Profile 时自动生成的独立命令,相当于底层跑的是 hermes -p coder

1
2
3
4
coder chat                    # 跟写代码的 Agent 聊天
coder doctor # 检查它健康状态
coder config set model.model anthropic/claude-sonnet-4 # 改它的模型
coder skills list # 看看它装了哪些技能

每个别名都支持 Hermes 的所有子命令,跟在终端里用 hermes 没有区别。

方法二:用 -p 标志指定

如果不想记一堆别名,直接用 -p 参数指定也完全 OK:

1
2
3
hermes -p coder chat
hermes --profile=work doctor
hermes chat -p coder -q "帮我查一下今天的代码提交"

-p 可以放在命令的任何位置,随你喜欢。

方法三:设默认 Profile

这个方法最顺手,跟切换 kubectl context 类似,设好默认后,直接 hermes chat 就会打到指定的 Profile 上:

1
2
3
hermes profile use coder    # 把 coder 设为默认
hermes chat # 默认跟 coder 对话
hermes profile use default # 切回默认 Profile

设完默认之后,你日常用的所有 hermes 命令都会指向这个 Profile,完全不用加任何额外参数。

查看所有 Profile

想知道目前运行着哪些 Agent,各自的模型和状态如何:

1
hermes profile list

会列出所有 Profile 及其简要状态。想看某个 Profile 的详细信息:

1
hermes profile show coder

能看到它的配置摘要、技能数量、记忆统计等。

重命名 Profile

建的时候名字没取好?没问题:

1
hermes profile rename coder dev-bot

重命名会自动更新命令别名和 systemd/launchd 服务名称,不需要额外手动处理。

导出和导入

这个功能很适合在机器之间迁移 Agent:

1
2
hermes profile export coder      # 导出为 coder.tar.gz
hermes profile import coder.tar.gz # 从存档导入

一个 tar 包打包了 Profile 的全部数据,拿到另一台机器上导入就能恢复,配置、记忆、技能全都在。

独立网关:让不同 Agent 跑在不同的消息平台上

这是多 Agent 模式最有意思的部分:每个 Profile 可以独立运行自己的网关,连接各自的消息平台机器人。

启动独立网关

1
2
coder gateway start       # 启动编码 Agent 的网关
assistant gateway start # 启动助手 Agent 的网关

两个网关以独立进程运行,互不干扰。每个 Profile 可以绑不同的平台、不同的机器人。

配置不同的机器人

要指定每个 Profile 使用哪个机器人 token,编辑对应 Profile 的 .env 文件即可:

1
2
nano ~/.hermes/profiles/coder/.env    # 写入 Telegram/Discord/飞书 token
nano ~/.hermes/profiles/assistant/.env

令牌锁定机制

这里有个很贴心的安全设计:如果你不小心让两个 Profile 用了相同的机器人 token,第二个网关启动时会被直接阻止,并给出明确的冲突提示。类似这样的:

1
Error: Gateway token already in use by profile "coder"

这个机制覆盖 Telegram、Discord、Slack、WhatsApp、Signal 等所有支持的平台,防止机器人分身打架。

持久化服务

临时跑网关没问题,但如果你想让它开机自启、长期在线,可以用安装命令创建系统服务:

1
2
coder gateway install        # 创建 hermes-gateway-coder 服务
assistant gateway install # 创建 hermes-gateway-assistant 服务

之后每个服务各自独立,可以单独启动或停止。

更新所有 Profile

Hermes 本身更新时,会自动同步到所有 Profile:

1
hermes update

输出的内容大概是这样:

1
2
→ 代码更新(12 次提交)
→ Skills 已同步:默认(最新)、编码器(+2 新)、助手(+2 新)

Hermes 只拉取一份共享代码,然后自动把新增或更新的预设技能同步到每一个 Profile 中。你自己动手改过的技能不会被覆盖,我试过,不会动你自己改的。

删除 Profile

不再需要的 Profile 可以删掉:

1
hermes profile delete coder

这个命令会做三件事:停止正在运行的网关、移除 systemd/launchd 服务、删除命令别名以及 Profile 目录下的所有数据。执行时需要输入 Profile 名称做二次确认。

如果你在自动化脚本里需要跳过确认:

1
hermes profile delete coder --yes

有一点需要注意:系统默认的 Profile(对应 ~/.hermes)不能被删除。想把 Hermes 整个清掉需要用 hermes uninstall

工作原理:一条环境变量搞定隔离

说了这么多,背后到底是怎么实现的?其实原理很简洁:靠的就是 HERMES_HOME 这个环境变量。

当你在终端输入 coder chat 时,包装脚本把 HERMES_HOME 设置为 ~/.hermes/profiles/coder,然后启动 Hermes 进程。Hermes 代码里有 119 多个文件通过 get_hermes_home() 来解析路径,自动将配置、会话、记忆、技能、状态数据库、网关 PID、日志文件、定时任务……全部指向这个独立的目录。

默认 Profile 就是 ~/.hermes 本身。所有克隆、-p 标志、hermes profile use 的设置变更,本质上都是在操作 HERMES_HOME 指向哪个目录而已。

克隆配置这么快的原因也很简单:就是复制个目录,改条环境变量。不需要复制二进制文件,不需要重建索引。

实用组合:我的推荐方案

最后分享一个我目前在用的方案,供你参考。

  • default 做日常管家,用 DeepSeek 模型,挂在飞书个人号上,人格是高效直接的管家风格
  • coder 专攻代码开发,用 Claude Sonnet,只在终端用,人格是专业严谨的编码助手
  • writer 写博客,用 DeepSeek,没有网关,人格偏温暖接地气
  • monitor 跑定时任务监控,用 DeepSeek,挂在飞书监控群,人格冷静,只报告异常

四个 Profile,各自一套记忆、身份和技能。
日常在飞书找管家,写代码在终端召唤 coder,写博客开 writer,监控告警自动跑 monitor。
彼此不串,各司其职。

最后

Profile 系统把 Hermes 从一个”好用的工具”变成了一个”能分工协作的团队”。你不再需要把一个 Agent 调来调去,人格和技能拆开之后,每个 Agent 都专注于自己擅长的事,体验好得多。

从两个 Profile 开始尝试,一个用于日常,一个用于实验,这是最低成本的体验方式。用一周试试看,大概率回不去单 Agent 了。