1. 为什么单 Agent 写代码越用越乱
如果你已经在本地跑 Hermes 一段时间,大概率会遇到一个很具体的现象:同一个 Agent 上午帮你写 Python 脚本,下午帮你整理日报,晚上又去改前端组件,几天之后它的 MEMORY.md 里塞满了各种项目习惯、表达偏好、临时约定,行为开始变得难以预测。你让它写代码,它先跟你聊两句日报格式;你让它整理文档,它又突然想给你补一段测试用例。
这不是模型变笨了,而是记忆污染。一个 Agent 包揽所有事,它的记忆、技能、系统提示全混在一个环境里,写代码时学到的项目规范会和写日报时积累的表达偏好互相干扰。用得越久,这种干扰越明显。
Hermes 的 Profiles 就是解这个问题的。每个 Profile 是一个完全隔离的独立环境,有自己的配置、记忆、技能和 Gateway,各自成长、互不干扰。你可以把它理解成在同一台机器上开了几个互不串门的工位:一个专门做代码调度,一个专门做日常事务,谁也不会把对方的习惯带进来。
这篇要落地的场景是:用 Hermes 的 Profiles 编排本地 CodeX,搭一个能分工的多 Agent 团队。核心思路是让 Hermes 里的 coder Profile 当"技术项目经理",它自己不写代码,只负责理解需求、拆解任务、调用本地 CodeX 执行、审查结果后汇报。真正写代码的活交给 CodeX,因为 CodeX 已经积累了专业的 coding skill,Hermes 只需要做好需求翻译和结果审查就够了。
适合谁看:已经在本地用 Hermes 或 CodeX 写代码、想把单机编码助手升级成可分工 Agent 团队的开发者。下面从架构设计到配置骨架、从连通 CodeX 到多 Agent 任务分发,一步步给可复制的操作。
2. TaoToken 前置:统一 Key 与 API 通道
在搭多 Agent 之前,先把 API 通道这件事理顺。多 Agent 场景下最容易踩的坑是:每个 Profile 各自配一套 Key,模型来源不统一,出了问题不知道是哪个环节断的。我的做法是让所有 Profile 走同一个 API 通道,Key 集中管理。
TaoToken 在这里的作用是提供统一的 Key 和 API 通道。官网地址是 https://taotoken.net/?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content= ,API 端点是 https://taotoken.net/api (这个不加 UTM)。你可以在控制台里创建 Key,然后让 Hermes 的每个 Profile 都指向同一个 API 端点。
具体操作路径:
先到控制台创建 API Key,地址是 https://taotoken.net/console?utm_source=taotoken_aicg_blog_end&utm_content=console&utm_campaign=rewrite 。创建完 Key 之后,在 API Keys 页面可以查看和管理,地址是 https://taotoken.net/api-keys?utm_source=taotoken_aicg_blog_end&utm_content=api-keys&utm_campaign=rewrite 。
拿到 Key 之后,配置 Hermes Profile 的时候把 base_url 指向 TaoToken 的 API 端点,模型名按你实际要用的填。这样 coder Profile 和 assistant Profile 共用同一个通道,Key 只需要维护一份,换模型或者调额度的时候改一处就行。
注意:多 Agent 场景下建议给不同 Profile 用不同的模型档位。coder Profile 的核心工作是任务调度和结果审查,不是代码生成,用轻量模型就够,把算力留给真正执行编码的 CodeX。assistant Profile 处理日常事务,也可以用轻量档。这样整体成本可控。
如果你还想在接入前先验证模型通道是否通,可以直接用模型对话页面测一下,地址是 https://taotoken.net/chat?utm_source=taotoken_aicg_blog_end&utm_content=model-chat&utm_campaign=rewrite 。发一条简单请求,确认返回正常,再去配 Profile,能省掉后面排查"到底是 Key 问题还是 Profile 配置问题"的时间。
3. 可复制配置:Profiles 骨架与 SOUL.md
3.1 创建 Coder Profile
第一步是创建独立的 coder Profile。在终端执行:
hermes profile create coder这一行命令做了两件事:在~/.hermes/profiles/coder/下创建完整的隔离环境,同时生成coder命令别名。从此coder等价于hermes -p coder,所有子命令都可以直接用:
coder setup # 配置 API 密钥和模型 coder chat # 开始对话 coder gateway start # 启动 Gateway创建完之后,先跑coder setup把 API Key 和模型配好。base_url 填 TaoToken 的 API 端点,Key 填你在控制台创建的那一个。模型选轻量档,原因上面说过,调度和审查不需要重模型。
3.2 用 SOUL.md 定义角色边界
每个 Profile 的SOUL.md是系统 prompt 的第一槽位,决定 Agent 的身份和行为倾向,路径是:
~/.hermes/profiles/coder/SOUL.md这里有一个容易混淆的区分:SOUL.md 管"这个 Agent 是谁",项目根目录的 AGENTS.md 管"在这个项目里做什么"。两个文件职责不同,不要混。SOUL.md 是 Profile 级别的,跟着 Agent 走;AGENTS.md 是项目级别的,跟着仓库走。
coder Profile 的 SOUL.md 核心是把"不自己写代码"这个行为倾向写清楚。下面是我实际用的骨架:
# 身份 你是一位代码任务调度专家。你自己不直接编写代码, 而是通过调用 CodeX 或 Claude Code 来完成所有编码工作。 # 工作方式 - 收到需求时,先分析任务类型和复杂度 - 将任务清晰描述后,委派给 CodeX 或 Claude Code 执行 - 审查返回的代码质量,必要时要求修改 - 向用户汇报结果,而不是自己动手写 # 风格 - 简洁直接,像技术项目经理 - 任务拆解精准,指令清晰无歧义 # 避免 - 自己生成大段代码 - 不加审查地直接转发工具返回结果修改完直接coder chat开新会话即生效,无需重启任何服务。这一点很关键:SOUL.md 是会话启动时读取的,改完开新会话就行,不用去折腾服务重启。
3.3 多 Agent 的目录结构
搭好之后,你的~/.hermes/profiles/下大概是这样:
~/.hermes/profiles/ ├── coder/ │ ├── SOUL.md # 代码调度专家身份 │ ├── MEMORY.md # 只积累代码调度相关记忆 │ ├── config.yaml # API Key / 模型配置 │ └── skills/ # 代码调度相关技能 └── assistant/ ├── SOUL.md # 日常事务身份 ├── MEMORY.md # 只积累日常事务记忆 ├── config.yaml # 共用同一个 API 通道 └── skills/ # 日常事务技能两个 Profile 各自有独立的 MEMORY.md,这是隔离的核心。coder 的记忆里只有代码任务拆解、CodeX 调用记录、审查结论;assistant 的记忆里只有日常事务。它们不会互相污染。
4. 连通本地 CodeX 与验证请求
4.1 打通调用链
Hermes 连接本地 CodeX 的完整调用链是这样的:coder Profile 收到编程任务 → 检查 CodeX 登录状态 → 通过codex exec resume派发任务 → 等待执行 → 读取结果验证 → 汇报。
首先要为 CodeX 开通设备访问权限,在你的 ChatGPT 账号里找到"安全"设置,开启设备访问相关的选项。然后让 coder agent 直接尝试连接你本地的 CodeX,coder 会给你一个验证码和一个连接入口,点进去连接,输入验证码完成配对。
配对完成后,在飞书里向 coder Profile 发送一个编程任务,可以看到 Hermes 完整地执行调度链路:
# coder 内部实际执行的调度步骤(示意) codex login status # 先检查 CodeX 登录状态 codex exec resume <task> # 把任务派发出去 # 等待执行完成 # 读取配置文件验证结果执行结果显示:CodeX APP 里可以看到新建了执行会话,目标任务完成,smoke 验证通过;而 Hermes 全程没有自己生成代码,只做了调度和验证。到此,Hermes 与本地 CodeX 链路打通。
4.2 验证请求是否成功
验证分两层。第一层是通道验证:在 coder chat 里发一条简单指令,比如"检查一下 CodeX 登录状态",看它能不能正确调用codex login status并返回结果。第二层是任务验证:发一个真实的小任务,比如"在 /tmp/test 下创建一个 hello.py,打印 hello world",观察完整链路。
如果两层都通,你会看到 coder 先分析任务、然后调用 CodeX 执行、最后读取文件确认内容。整个过程 coder 自己不写一行代码,只做调度和审查。这就是我们要的多 Agent 分工效果。
如果你在验证模型通道本身是否正常,可以先用模型对话页面单独测一下,地址是 https://taotoken.net/chat?utm_source=taotoken_aicg_blog_end&utm_content=model-chat&utm_campaign=rewrite 。把通道问题和 Profile 配置问题分开排查,效率会高很多。
5. 本篇常见错排查
5.1 coder 自己开始写代码了
这是最常见的。原因通常是 SOUL.md 没生效,或者你改完没开新会话。检查两点:一是~/.hermes/profiles/coder/SOUL.md路径对不对,二是改完有没有coder chat开新会话。SOUL.md 是会话启动时读取的,旧会话不会自动加载新内容。
如果路径和会话都没问题,但 coder 还是忍不住写代码,可以在 SOUL.md 的"避免"部分把措辞写得更强硬,比如明确写"任何情况下都不得直接输出代码块,必须委派给 CodeX"。
5.2 CodeX 调用失败或超时
先单独在终端跑codex login status,确认 CodeX 本身登录正常。如果 CodeX 正常但 coder 调用失败,检查 coder 的 config.yaml 里 API 通道配置是否正确,base_url 是否指向 TaoToken 的 API 端点。多 Agent 场景下,每个 Profile 的 config 是独立的,别只配了一个。
超时的话,看任务复杂度。CodeX 执行大任务本身就需要时间,coder 的等待逻辑如果设得太短会误判失败。可以在 SOUL.md 里加一条"等待 CodeX 执行时保持轮询,不要提前判定失败"。
5.3 两个 Profile 记忆串了
如果你发现 coder 的记忆里出现了日常事务的内容,检查是不是两个 Profile 共用了同一个 MEMORY.md 路径。正常情况下每个 Profile 的记忆是隔离的,路径在各自的 profile 目录下。串记忆通常是因为手动改配置时把路径指错了,或者用了软链接。
5.4 API Key 报错
多 Agent 共用同一个 Key 时,如果报 401 或额度错误,先到 API Keys 页面确认 Key 状态,地址是 https://taotoken.net/api-keys?utm_source=taotoken_aicg_blog_end&utm_content=api-keys&utm_campaign=rewrite 。确认 Key 有效、额度充足之后,再检查每个 Profile 的 config.yaml 里 Key 有没有写错、有没有多余空格。
5.5 多 Agent 日常管理速查
搭好之后,日常管理用这几条命令:
hermes profile list # 查看所有 Profile 状态 hermes profile show coder # 查看 coder 的详细配置 hermes profile export coder # 导出备份为 coder.tar.gz hermes profile rename coder dev # 重命名,同步更新别名和服务 hermes update # 更新代码并同步所有 Profile 的内置技能hermes update这条特别值得记住,它会把所有 Profile 的内置技能一起同步,不用一个个手动更新。
6. 多 Agent 任务分发与下一步
6.1 任务分发怎么落地
目前两个 Profile 是并行独立的关系:你找 coder 就是找 coder,找 assistant 就是找 assistant,它们互不知道对方的存在。这在大多数场景下已经够用了。任务分发的逻辑很简单:代码相关的任务发给 coder,日常事务发给 assistant,各走各的通道,各积累各的记忆。
如果你需要长期跑编码任务、或者想让 Agent 承担更重的编码工作,可以考虑 Coding Plan,地址是 https://taotoken.net/coding-plan?utm_source=taotoken_aicg_blog_end&utm_content=coding-plan&utm_campaign=rewrite 。它更适合持续性的编码场景,和 coder Profile 的调度角色配合起来,能把单机编码助手的产出稳定在一个比较高的水平。
6.2 什么时候才需要第三个协调 Profile
有一类需求会打破并行独立的模式:当一个任务需要多个 Profile 按顺序协作完成的时候。比如"coder 完成代码后自动触发 assistant 生成文档"这种有依赖关系的流水线,才真正需要一个 orchestrator Profile 来统筹调度。
但现阶段不要急着建它。过度设计是 Agent 工作流里最常见的坑,架构搭得很漂亮,实际上每天用到的只有两个 Profile 各自独立跑任务。等你真正感觉到"我需要有人来协调它俩"的那一天,再加这一层,不会太晚。
6.3 接入文档与后续
如果你在接入过程中遇到配置层面的问题,接入文档里有更细的参数说明,地址是 https://taotoken.net/doc?utm_source=taotoken_aicg_blog_end&utm_content=doc&utm_campaign=rewrite 。Claude Code 相关的接入细节可以看 https://taotoken.net/claudecode-anthropic?utm_source=taotoken_aicg_blog_end&utm_content=claudecode-anthropic&utm_campaign=rewrite 。
这套配置走下来,核心感受是:Hermes 的 Profile 系统本质上是在做专业化分工。一个全能 Agent 听起来很美,但时间久了记忆越来越杂,行为越来越难预测。Profile 强制你在一开始就想清楚这个 Agent 是干什么的、边界在哪里。coder 只管调度代码,assistant 只管日常,各自积累各自领域的 skill 和 memory。用得越久,每个 Profile 越专,而不是越乱。这才是多 Agent 真正的长处所在。