🤖HermesBlog
Hermes 官方教程 · 第14篇2026/8/9· Easy Understand Hermes Agent

一人多分身——Profiles 配置档案详解

Hermes Agent 官方教程第十四篇:Profiles 配置档案,一台机器上跑多个独立 AI 助手。

Profiles:一人多分身

一人多分身——Profiles 配置档案详解

你有没有想过,让同一个 Hermes 同时扮演好几个角色?比如一个帮你写代码,一个帮你查资料,还有一个专门陪你唠嗑。Profiles(配置档案) 就是干这个用的——它让你在一台机器上跑多个互相独立的 Hermes 智能体,每个都有自己的配置、API 密钥、记忆、会话、技能,甚至网关状态,互不干扰。

Profiles 是啥?

简单说,一个 Profile 就是一个独立的 Hermes 小天地。每个 Profile 都有自己的目录,里面装着它专属的 config.yaml、.env、SOUL.md、记忆、会话、技能、定时任务和状态数据库。你可以把 coding 助手、个人机器人、研究助手分别放在不同的 Profile 里,它们各过各的日子,谁也不会弄乱谁的“房间”。

顺带一提,Hermes 只认那些带着“身份文件”的目录——config.yaml、.env、SOUL.md、profile.yaml、auth.json、state.db 里至少有一个,才算一个正经 Profile。光是被日志或定时任务随手建出来的空目录,profile list、网关和 -p 都会直接无视。

⚠️ 重要提醒:千万别让两个 agent 进程同时指向同一个 Profile!因为两边都会自动写记忆,还会把对方的写入加载到自己的系统提示里,最后状态会乱成一锅粥。Profiles 就是专门为了防止这种情况的。如果你真的需要共享记忆,请用外部记忆提供者(external memory provider)。

几个容易混的词

  • Profile:一个助手配置和数据的“家”,跨对话、跨重启都保持同一份状态。
  • Agent:跑起来的 Hermes 助手本身,用的就是某个 Profile 的配置和状态。
  • Bot Mode 机器人:桌面端 Bot Mode 名单里的一个条目,有头像、有常驻的 Bot Chat。每个 Bot 都是一个 Profile,但不是每个 Profile 都是 Bot——只有被加进名单、存了展示信息(标题、头像、分区、隐藏状态)并固定了 Bot Chat 的才算。
  • 消息机器人:Telegram、Discord、Slack 这类平台上的账号,通过网关连到 Hermes,靠 bot token 认身份。
  • 子智能体(Subagent):由 delegate_task 临时拉起来干活的子助手,对话是新的,但它不是独立 Profile。

快速上手

创建 Profile 超简单,而且创建完它立马就变成一个命令:

hermes profile create coder       # 创建 profile + "coder" 命令别名
coder setup                       # 配置 API 密钥和模型
coder chat                        # 开聊!

就这么简单,coder 现在就是一个拥有自己配置、记忆和状态的独立 Hermes 了。

💡 想一步到位?在新 Profile 里跑 hermes setup --portal,模型和工具一次配齐。

创建 Profile 的几种姿势

1. 空白档案

hermes profile create mybot

创建全新 Profile,自带基础技能。然后跑 mybot setup 配置 API 密钥和模型就行。

如果你想让它当看板工人(kanban worker),创建时加个 --description 描述它的专长:

hermes profile create researcher --description "Reads source code and external docs, writes findings."

2. 只克隆配置(--clone)

hermes profile create work --clone

复制当前 Profile 的 config.yaml、.env、SOUL.md、技能,以及精选记忆文件 memories/MEMORY.md 和 memories/USER.md——记忆被当作 agent 身份的一部分,和 SOUL.md 一样。如果 config.yaml 选了外部记忆提供者(memory.provider),那个提供者自己的配置也会一起带过去——它在 Profile 主目录下的 <provider>/ 目录或 <provider>.json,比如 hindsight/config.json——这样克隆体的记忆是可用的,而不是悄悄被关掉;不过克隆来的 local_embedded hindsight 配置仍然和源 Profile 共用同一个内嵌守护进程和 bank,除非你给克隆体自己的 hindsight profile/bank_id。已安装的插件也会跟着走:plugins/ 目录(插件目录、Git 安装和手动安装的插件,以及它们的安装记录)会被复制,所以从插件目录装来的记忆提供者在克隆体里依然能用,版本一致,安装记录也保留。插件的 Python 依赖放在共享环境里,不会被重新安装。

会话、state.db、定时任务以及其他所有东西都是全新的。如果你连记忆也想要空白,那就别加 --clone 创建,或者创建后把这两个文件删掉;当它们不存在时,agent 绝不会回退去读别的 Profile 的记忆。想改密钥就去 ~/.hermes/profiles/work/.env,想换性格就改 SOUL.md。

想让克隆体继续同步导入的 agent 配置?加 --sync-imports:如果源 Profile 跑过 hermes import-agent,它的 import-sync.json 记录了从哪些 Claude Code / Codex 目录导入过东西。--clone 默认不带这个清单,克隆体只拿到一次性的技能和记忆副本。加上 --sync-imports 就能把清单也带过去:

hermes profile create work --clone --sync-imports
hermes -p work import-agent --sync        # 从同一个 ~/.claude / ~/.codex 拉取变化

这是显式、可选、单向的,而且只连到外部 agent 目录,绝不连回源 Profile——两个 Profile 依旧是互不干扰的孤岛。

3. 全部克隆(--clone-all)

hermes profile create backup --clone-all

把所有东西都复制过来——配置、密钥、性格、全部记忆、技能、插件,一个不落。注意:会话历史、state.db、备份这些大文件不会被复制(它们可能有好几个 GB);从默认 Profile 克隆时,本地模型运行时目录(models/、runtimes/、node/,都是按需重新下载的东西)也会跳过。定时任务也不会被克隆:它们是绑定在源 Profile 及其投递渠道上的计划任务,如果克隆继承了它们,每个任务都会跑两遍(两个网关、同一批 job id)。新 Profile 的 cron/ 目录是空的。想要连历史和定时任务一起完整备份,请用 hermes profile export 或 hermes backup。

📝 OAuth 登录是共享的,不是复制的:Anthropic(Claude Pro/Max)、OpenAI Codex 和 xAI 的 OAuth 登录用的是一次性刷新令牌——复制一份并不是第二份凭证,而是同一份凭证有了两个主人,谁先刷新谁就会让其他副本失效。所以 --clone-all(以及仪表盘的凭证镜像)会把这些 OAuth 记录从克隆中剔除。新 Profile 会继续从根目录的 ~/.hermes/auth.json 读取登录信息,而在任何 Profile 里做的令牌刷新都会写回根目录,所以所有 Profile 都保持登录状态。静态 API 密钥照常复制。想让某个 Profile 拥有自己独立的 OAuth 登录,在它里面运行 hermes -p <name> auth add <provider>。这份登录会保存在该 Profile 自己的 auth.json 里(即使根目录还没有该提供者的登录),此后该 Profile 就用它而不再用根目录的登录;根目录的 auth.json 不会被改动。如果登录保存失败,命令会报错,而不是打印 Added。

4. 从指定 Profile 克隆

hermes profile create work --clone-from coder

直接从 coder 这个 Profile 复制配置。想全量复制就加上 --clone-all:

hermes profile create work-backup --clone-from coder --clone-all

5. 消息渠道默认不克隆(要保留就加 --clone-channels)

所有克隆方式——--clone、--clone-from、--clone-all,以及仪表盘 / Desktop / TUI 里的“从 Profile 克隆”选项——复制源 Profile 时都不带它的消息渠道:机器人令牌和允许列表(TELEGRAM_BOT_TOKEN、DISCORD_ALLOWED_USERS、WHATSAPP_ENABLED、API_SERVER_KEY、WEBHOOK_SECRET 等)、config.yaml 里的 platforms: / telegram: / discord: 段落、gateway.multiplex_profiles / profile_routes,以及(对 --clone-all 而言)配对存储、WhatsApp 会话等每个机器人独有的状态。Provider 和工具的 API 密钥、模型配置、记忆设置、技能和 SOUL.md 照常复制。命令会打印出哪些平台被留下了。

原因是:一个机器人只能属于一个 Profile——两个独立网关拿着同一个令牌会争抢它的长轮询,而多路复用网关会把重复的适配器挂起(hermes gateway migrate --multiplex 也会因为每个平台一个重复凭证而拒绝执行)。用 hermes -p <name> setup 或仪表盘的 Messaging 页面给新 Profile 配置它自己的机器人。

hermes profile create twin --clone --clone-channels   # 仍然保留源 Profile 的机器人

如果已经有正在运行的多路复用网关在服务源 Profile,--clone-channels 会被拒绝(副本会立刻被挂起,CLI、仪表盘、TUI 都一样);否则它会打印一条警告,列出现在与源 Profile 共享的平台。单独用 --clone-channels 而不带克隆标志会直接报错。hermes profile list 也会对任何机器人凭证与默认 Profile 逐字节相同的现有 Profile 打印同样的警告,这样老的克隆会在出问题前先暴露出来。

💡 Honcho 记忆 + Profiles:启用 Honcho 时,克隆操作会自动为新 Profile 创建一个专属的 AI peer,同时共享同一个用户工作区。每个 Profile 构建自己的观察和身份。

重命名 Profile

想把 Profile 换个名字?用 hermes profile rename:

hermes profile rename coder dev-bot   # 重命名(更新别名;移除旧名字的网关服务)

注意它会顺手更新命令别名,并把旧名字对应的网关服务移除掉——所以重命名之后,记得用新名字重新启动网关。

迁移和备份时要注意什么

Profile 里有些东西是跟机器绑定的,搬不走。导出、导入和分发安装都会排除 Profile 根目录下的 installs/、tools/ 和 cache/;备份和恢复对默认主目录以及命名 Profile 也套用同样的规则。旧归档无法替换目标机器上的 PM 选择或工具。像 plugins/example/facts.json 和 skills/example/tools/helper.py 这类文件属于用户数据,会被保留下来。依赖请在目标机器上通过 PM 重新安装,而不是直接拷贝整个环境。

另外,依赖准备阶段会读取每个 Profile 的 config.yaml,来算出共享环境需要携带哪些插件。如果某个 Profile 的 config.yaml 解析不了(或者它的 plugins / memory 段落结构不对),整个安装的这一步都会失败——详见依赖准备与保留。

怎么用 Profile?

命令别名:每个 Profile 都会在 ~/.local/bin/ 下生成一个同名命令:

coder chat                    # 和 coder 聊天
coder setup                   # 配置 coder
coder gateway start           # 启动 coder 的网关
coder doctor                  # 检查 coder 健康状况
coder config set model.default anthropic/claude-sonnet-4

-p 参数:任何命令都能用 -p 指定 Profile:

hermes -p coder chat
hermes --profile=coder doctor
hermes chat -p coder -q "你好"

设置默认 Profile:

hermes profile use coder
hermes chat                   # 现在默认就是 coder
hermes profile use default    # 切回默认

就像 kubectl config use-context 一样方便。

随时知道自己在哪:CLI 会一直显示当前 Profile——提示符变成 coder ❯,启动横幅显示 Profile: coder,hermes profile 命令也会显示当前状态。

⚠️ 粘性 Profile 的目录被手动删了会怎样? 如果你把当前粘性 Profile 的目录手动删掉,Hermes 会拒绝在默认 Profile 里跑普通命令——因为那样会读写错 Profile 的状态。只有几条“逃生通道”还能用,并且会带警告:hermes profile list、hermes profile use default,以及不带 --data / --full 的 hermes uninstall(这两个参数仍然会被拒绝;交互式卸载菜单里那个“彻底清空默认 Profile”的选项,在确认提示之后依然可用)。

Profiles vs 工作区 vs 沙箱

这三个概念容易搞混,但它们是不同的东西:

  • Profile:给 Hermes 自己的状态目录(配置、记忆、会话等)
  • 工作区/工作目录:终端命令从哪里启动,由 terminal.cwd 控制
  • 沙箱:限制文件系统访问的东西。Profile 不做沙箱!

在默认的 local 终端后端下,agent 的文件系统权限和你自己的用户账号一样大。Profile 并不会阻止它访问 Profile 目录以外的文件夹。所以,别把 Profile 当安全沙箱用,它只是帮你“分家”而已。

📖 官方文档

本文根据 Hermes Agent 官方文档编写,原文见:官方文档 › user-guide/profiles