从 profile 到 kanban:Hermes 多 Agent 协作解析及示例

引言

当AI智能体不止一个的时候,如何让它们像人类团队一样协作?在终端里开三个窗口让三个Agent各干各的,听起来很美,但实际上面临着状态丢失、依赖混乱、无法恢复、缺乏人工干预入口等一系列问题。

Hermes Agent给出的答案是:Profile + Kanban。Profile为每个Agent提供独立的身份与配置,Kanban为所有Agent提供持久化的协作看板。两者结合,构成了Hermes多Agent协作的完整基础设施。

本文将从Profile的概念出发,逐步深入到Kanban的使用与多Agent协作实践,并通过一个完整的示例串联全文。

一、Profile:Agent的独立身份

1.1 什么是Profile

Profile是Hermes中一个独立的Agent主目录。每个Profile拥有自己的目录,包含各自的config.yaml.envSOUL.md、记忆、会话、技能、cron任务和状态数据库。

可以这样理解:Profile就是一个“独立的Hermes分身”。每个Profile让你可以为不同用途运行独立的Agent——编程助手、个人机器人、研究Agent——而不会混淆Hermes状态。

从技术实现上看,Hermes v0.6.0版本正式引入了多实例Profile机制,每个Profile拥有独立的config、memory、sessions、skills和gateway服务。完全的token锁隔离防止两个Profile使用同一个机器人凭证。

1.2 Profile的核心价值

Profile的设计解决了几个关键问题:

隔离性。 绝不要让两个Agent进程指向同一个Profile(同一个Hermes主目录)。两个进程都会自动写入记忆,每个进程在会话启动时都会将对方的写入加载到系统提示中——两个写入者共用一个主目录会相互污染状态,直到它不再是你配置的任何东西。Profile的存在正是为了防止这种混乱。

独立命令别名。 创建名为coder的Profile后,你会立即拥有coder chatcoder setupcoder gateway start等独立命令。每个Profile在~/.local/bin/<name>自动获得一个命令别名。

可移植性。 Profile支持导出和导入,便于在不同环境间共享。

1.3 Profile的创建与配置

创建Profile的基本命令:

hermes profile create coder

这创建了一个空白的Profile。运行coder setup配置API密钥、模型和gateway tokens。

如果计划将此Profile用作Kanban工作节点(或希望Kanban编排器将任务路由到它),应在创建时传入--description,让编排器了解其能力:

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

--description会被Kanban编排器用于基于角色而非仅基于Profile名称来路由任务。

克隆配置也是常见需求:

# 仅克隆配置(config.yaml、.env、SOUL.md、skills)
hermes profile create work --clone

# 克隆全部(包括记忆、cron任务、插件)
hermes profile create backup --clone-all

# 从指定Profile克隆
hermes profile create work --clone-from coder

克隆时,API密钥、模型和能力相同,但会话和记忆是全新的。--clone-all会复制所有内容,但会排除每个Profile自己的历史数据(会话历史、state.db等),这些数据属于源Profile且可能达到数十GB。

删除Profile同样简单:

hermes profile delete coder --yes

该操作会永久删除整个Profile目录,包括所有配置、记忆、会话和技能。

1.4 Profile的使用方式

使用Profile有两种方式:

命令别名方式:

coder chat          # 与coder agent对话
coder setup         # 配置coder的设置
coder gateway start # 启动coder的gateway
coder skills list   # 列出coder的技能

-p标志方式:

hermes -p coder chat
hermes --profile=coder doctor

两种方式底层都是hermes -p <name>

1.5 SOUL.md:Agent的人格定义

每个Profile目录下的SOUL.md文件定义了Agent的人格设定和规则。这相当于给Agent一个“角色说明书”:

echo "你是一个专业的全栈Web开发者,擅长HTML/CSS/JavaScript。
你编写的代码风格清晰、注释完整。
你注重用户体验和界面设计的美感。" > ~/.hermes/profiles/coder/SOUL.md

SOUL.md在多Agent协作中尤其重要——不同的Profile拥有不同的人格,自然适合承担不同的角色。

二、多Agent创建与飞书集成

2.1 创建多Profile构建多Agent团队

多Agent协作的第一步是创建多个Profile,每个Profile承担一个角色。以典型的“开发+审查”团队为例:

# 创建开发Agent
hermes profile create coder --description "全栈Web开发者,擅长HTML/CSS/JavaScript"

# 设置coder的人格
echo "你是一个专业的全栈Web开发者...
你注重用户体验和界面设计的美感。" > ~/.hermes/profiles/coder/SOUL.md

# 创建审查Agent
hermes profile create reviewer --description "代码审查专家,关注代码质量、安全性、性能"

# 设置reviewer的人格
echo "你是一个严格的代码审查专家。
你关注:代码质量、安全性、性能、可维护性。
你会指出代码中的问题并提出改进建议。" > ~/.hermes/profiles/reviewer/SOUL.md

每个Profile都需要单独配置API密钥和模型:

coder setup   # 配置coder的API密钥和模型
reviewer setup # 配置reviewer的API密钥和模型

创建完成后,可以通过hermes profile list验证所有Profile。

2.2 多Profile独立连接飞书并拉群

每个Profile都需要独立完成飞书/Lark的连接配置,使每个Agent都能作为一个独立的飞书机器人接入群聊。

第一步:为每个Profile配置飞书应用

对于每个Profile(如coderreviewer),分别运行配置命令:

coder gateway setup        # 为coder Profile配置飞书连接
reviewer gateway setup     # 为reviewer Profile配置飞书连接

执行后,选择“飞书/Lark”,使用飞书或Lark手机端扫描二维码。Hermes将为该Profile自动创建具有正确权限的机器人应用并保存凭据至对应Profile的.env文件中。

如果希望复用同一个飞书应用,也可手动填写App ID和App Secret,但需要注意多个Profile若使用相同凭证可能产生WebSocket连接冲突,通常建议每个Profile使用独立的飞书应用以获得隔离性。

第二步:启动各Profile的Gateway

coder gateway start        # 启动coder的网关服务
reviewer gateway start     # 启动reviewer的网关服务

每个Profile的Gateway会分别维护与飞书的长连接,各自响应@提及。

第三步:在飞书中创建群聊并添加所有机器人

  1. 在飞书客户端创建一个新群聊或使用现有群组。
  2. 点击群设置→“群机器人”→“添加机器人”。
  3. 依次搜索并添加coderreviewer对应的机器人名称(通常与Profile名称一致,或在配置时指定的机器人名称)。
  4. 添加完成后,该群中即存在两个Agent机器人。

群聊中,人类可以分别@不同的Agent来分配任务或请求协作。例如,@coder要求开发功能,@reviewer请求审查代码,从而实现一个群内的多Agent协作。

三、Kanban:多Agent协作的持久化看板

3.1 Kanban是什么

Hermes Kanban是一个持久化任务看板,在所有Hermes Profile之间共享,允许多个具名Agent协作完成工作,而无需脆弱的进程内子Agent集群。

它的核心是一个SQLite数据库~/.hermes/kanban.db),所有的任务、状态、注释、依赖关系都写在这一份数据里。

Kanban与delegate_task(RPC调用,父Agent阻塞等待子Agent返回)有本质区别:

维度 delegate_task Kanban
形态 RPC调用(fork → join) 持久化消息队列 + 状态机
父Agent 阻塞直到子级返回 create后即发即忘
子Agent身份 匿名子Agent 具有持久记忆的具名Profile
可恢复性 失败即失败 阻塞→解除阻塞→重新运行
人工介入 不支持 随时可评论/解除阻塞
审计追踪 上下文压缩后丢失 SQLite永久存储

一句话总结:delegate_task是函数调用,Kanban是工作队列

3.2 三个操作界面

Kanban有三个操作界面,共享同一个SQLite数据库:

  1. Dashboard(Web界面) :最直观的观察和操作方式。启动命令:
    hermes dashboard
    

    在浏览器中打开http://127.0.0.1:9119,点击左侧导航栏中的Kanban。

  2. CLI命令:面向脚本和自动化场景:

    hermes kanban list
    hermes kanban create "任务标题" --assignee coder
    
  3. Worker工具:Agent通过专用kanban_*工具集驱动看板——kanban_showkanban_listkanban_completekanban_blockkanban_heartbeatkanban_commentkanban_createkanban_linkkanban_unblock。调度器在schema中已内置这些工具来启动每个worker。

三个界面都通过同一个kanban_db层路由,因此读取视图一致,写入不会产生偏差。

3.3 看板的六列状态

看板从左到右共六列:

  • Triage(分类) :原始想法。Dispatcher默认会对此处的任务自动运行分解器,读取Profile名册和描述,生成子任务图并路由给最合适的专家。
  • Todo(待办) :已创建但等待依赖项,或尚未分配。
  • Ready(就绪) :已分配,等待Dispatcher认领。
  • In progress(进行中) :Worker正在主动执行任务。开启“Lanes by profile”时,此列按负责人分组。
  • Blocked(阻塞) :Worker请求人工输入,或熔断器触发。
  • Done(完成) :已完成。

3.4 任务创建与父子依赖

创建任务:

hermes kanban create "任务标题" \
  --assignee coder \
  --workspace dir:/path/to/project \
  --body "任务的详细描述" \
  --priority 1

关键参数:
--assignee:指派给哪个Profile
--workspace:指定工作区,dir:表示持久化目录,scratch:表示临时目录(任务完成后自动清理)
--body:任务的详细描述
--priority:优先级(数字越小越高)
--parent:设置父任务,建立依赖关系
--skill:为任务指定需要的技能

建立父子依赖:

# 创建父任务
PARENT=$(hermes kanban create "设计系统架构" --assignee architect)

# 创建子任务,依赖父任务
hermes kanban create "实现API模块" \
  --assignee coder \
  --parent $PARENT

当一个Todo任务的所有父依赖都变成Done时,Dispatcher会自动把它提升为Ready。子任务继承根任务的工作区。

事后添加依赖:

hermes kanban link <parent_id> <child_id>

3.5 任务生命周期管理

查看任务:

hermes kanban list                    # 列出所有任务
hermes kanban list --mine             # 只显示指派给自己的任务
hermes kanban show <task_id>          # 查看特定任务详情
hermes kanban watch                   # 实时查看全局事件流
hermes kanban tail <task_id>          # 实时跟踪特定任务

修改任务:

hermes kanban edit <task_id> --assignee reviewer
hermes kanban edit <task_id> --title "新标题"
hermes kanban edit <task_id> --body "新描述"

完成任务:

hermes kanban complete <task_id> --result "任务完成摘要"

阻塞与解除阻塞:

# Worker在任务中调用kanban_block
# (这是工具调用,不是CLI命令)
kanban_block(reason="review-required: 代码已提交,请审查")

# 人类解除阻塞
hermes kanban unblock <task_id>

手动触发调度:

hermes kanban dispatch

3.6 Dispatcher自动调度

Dispatcher是Kanban的调度引擎。当config.yaml中配置了dispatch_in_gateway: true时,Gateway进程会定时扫描看板,自动启动状态为Ready的任务。

kanban:
  dispatch_in_gateway: true
  review_dispatch: true
  auto_decompose: true

Dashboard顶部的“Orchestration: Auto/Manual”切换按钮控制自动分解模式。在Manual模式下,可以点击卡片上的“⚗ Decompose”手动触发任务分解。

Dispatcher生成的Agent Worker不会看到Dashboard或CLI——它们通过专用的kanban_*工具集来操作看板。

四、完整示例:创建小王子小说阅读Web页面

以下通过一个完整的项目,从Profile创建到Kanban使用,串联全部流程。

4.1 项目需求

创建一个“可以动态翻页的小王子小说阅读Web页面”:

  1. 页面干净整洁,符合小王子的氛围(暖色调、星空或童话感)
  2. 支持键盘方向键的左右翻页(←上一页,→下一页)
  3. 使用单个HTML文件(内联CSS和JavaScript)
  4. 响应式设计

4.2 第一步:创建Profile

# 创建coder Profile
hermes profile create coder --description "全栈Web开发者,擅长HTML/CSS/JavaScript"

echo "你是一个专业的全栈Web开发者,擅长HTML/CSS/JavaScript。
你编写的代码风格清晰、注释完整。
你注重用户体验和界面设计的美感。" > ~/.hermes/profiles/coder/SOUL.md

# 配置coder的API密钥和模型
coder setup

# 创建reviewer Profile
hermes profile create reviewer --description "代码审查专家,关注代码质量、安全性、性能"

echo "你是一个严格的代码审查专家。
你关注:代码质量、安全性、性能、可维护性。
你会指出代码中的问题并提出改进建议。" > ~/.hermes/profiles/reviewer/SOUL.md

reviewer setup

# 验证
hermes profile list

4.3 第二步:准备项目目录

mkdir -p ~/projects/little-prince-reader
cd ~/projects/little-prince-reader

4.4 第三步:创建Kanban任务

创建开发任务(给coder):

TASK_DEV=$(hermes kanban create "开发小王子小说阅读Web页面" \
  --assignee coder \
  --workspace dir:$HOME/projects/little-prince-reader \
  --body "
【功能要求】
1. 页面干净整洁,符合小王子的氛围(暖色调、星空或童话感)
2. 支持键盘方向键的左右翻页(← 上一页,→ 下一页)
3. 显示当前页码/总页数
4. 页面内容在固定区域内显示,无滚动条
5. 响应式设计,在手机和电脑上都能良好显示

【技术实现】
1. 使用单个HTML文件(内联CSS和JavaScript)
2. 将《小王子》全文按段落分页,每页约100-150字
3. 翻页时添加平滑的淡入淡出动画
4. 如果无法获取完整《小王子》文本,请准备前10个章节作为演示

【交付物】
一个完整的 index.html 文件,放在工作目录中。

【完成标准】
- 用浏览器打开 index.html 能看到阅读界面
- 键盘左右键能正常翻页
- 界面美观,符合小王子氛围
" \
  --priority 1)

echo "开发任务 ID: $TASK_DEV"

创建审查任务(给reviewer,依赖开发任务):

TASK_REVIEW=$(hermes kanban create "审查小王子阅读器代码" \
  --assignee reviewer \
  --workspace dir:$HOME/projects/little-prince-reader \
  --parent $TASK_DEV \
  --body "
请审查 coder 完成的小王子阅读器代码。

【审查内容】
1. HTML结构是否语义化、规范
2. CSS样式是否美观、是否有冗余
3. JavaScript逻辑是否正确、有无bug
4. 键盘事件处理是否完善
5. 代码注释是否清晰
6. 是否符合任务要求(氛围、翻页、响应式)

【审查输出】
- 如果发现问题:列出具体问题和改进建议
- 如果审查通过:明确说'审查通过'
" \
  --priority 2)

echo "审查任务 ID: $TASK_REVIEW"

4.5 第四步:查看任务状态

hermes kanban list

此时:
– 开发任务:状态Todo,指派人coder
– 审查任务:状态Blocked(因为父任务未完成),指派人reviewer

4.6 第五步:启动Dashboard监控

hermes dashboard

在浏览器中打开http://127.0.0.1:9119,点击左侧导航栏中的Kanban。Dashboard是观察系统最便捷的地方。

4.7 第六步:触发调度

确保config.yaml中已配置:

kanban:
  dispatch_in_gateway: true

然后手动触发一次调度:

hermes kanban dispatch

Dispatcher会扫描看板,发现Ready状态的任务并启动对应的Profile执行。

4.8 第七步:监控任务执行

实时查看事件流:

hermes kanban watch

查看特定任务详情:

hermes kanban show $TASK_DEV

查看任务运行历史:

hermes kanban runs $TASK_DEV

如果任务被阻塞:

# 查看阻塞原因
hermes kanban show $TASK_DEV

# 解除阻塞
hermes kanban unblock $TASK_DEV

4.9 第八步:任务自动流转

任务依赖链如下:

开发任务(coder)→ 审查任务(reviewer)

流程自动执行:
1. Dispatcher将开发任务置为Ready并调度coder
2. coder完成开发,调用kanban_complete
3. 审查任务的父依赖完成,自动从Blocked变为Ready
4. Dispatcher调度reviewer执行审查
5. reviewer完成审查,调用kanban_complete

整个过程无需人工干预,但人类可以随时通过Dashboard或CLI介入——查看进度、添加评论、解除阻塞。

4.10 第九步:验证成果

所有任务完成后,在~/projects/little-prince-reader/下应有index.html文件:

ls -la ~/projects/little-prince-reader/
# 应看到 index.html

# 用浏览器打开测试
open ~/projects/little-prince-reader/index.html  # macOS
# 或
xdg-open ~/projects/little-prince-reader/index.html  # Linux

五、总结

Hermes的多Agent协作体系建立在两个核心原语之上:

Profile为每个Agent提供独立的身份——独立的配置、API密钥、记忆、会话和人格定义。Profile让多个Agent可以在同一台机器上并行运行而不会相互干扰。

Kanban为所有Agent提供持久化的协作看板——一个SQLite数据库支撑的任务队列,支持状态流转、父子依赖、阻塞恢复和完整审计追踪。

两者结合,构成了从“单Agent对话”到“多Agent团队协作”的完整路径。Profile定义了“谁来做”,Kanban定义了“做什么、什么时候做、做完交给谁”。这种设计让AI Agent团队能够像人类团队一样——有明确的分工、持久的工作队列、可恢复的执行过程和随时可介入的人工节点。

正如Kanban官方文档所说:delegate_task是函数调用,Kanban是工作队列,每次交接都是任意Profile(或人类)可见和编辑的一行记录