Hermes-agent 在Telegram group电报群组中 使用多Agent协同完成任务

前言

与 openclaw 不同, hermes 在系统框架中没有设计agent 之间交流(往session里发消息)的方法.
那我们就让 hermes 的 多agent 团队利用 telegram 来沟通

思路

再加上之前已经实现了 多Agent 绑定telegram bot
我们尝试建立一个多Agent团队进行协作

部署 Hermes-agent 系统

设置了telegram渠道
设置了 允许哪个 telegram userid 使用
以上过程略.

建立 telegram group 和 bot 和 agent

参考这一篇教程, 把 telegram group, bot 都设置好, 并测试 bot 之间可以看到消息. 过程略.

假设 这个telegram group 的 id 是
-1003918964882
假设 这些bot 的username  和 token 是
@CrazyAgentWatchBot
1234567890:AAHkMpXv2nQrWsYd8bJtLfCeUo9GiN1KmZw
@CrazyAgentDesignBot
2345678901:AABxRqNj5vTgKhEa3cWmYsPdFu7LiOz4Xbn
@CrazyAgentCodeBot
3456789012:AAEvNuGz3tFwBqXk7yRmJcSh5OaDpI8LlTx
@CrazyAgentTestBot
4567890123:AAHkMpXv2nQrWsYd8bJtLfCeUo9GiN1KmZw
参考这一篇教程, 把新的agent建立, 并和bot绑定. 过程略.
假设 这些agent是:
agent-watch
agent-design
agent-code
agent-test

建立多agent团队

和默认 agent hermes 对话
组建一个agent协作团队, 利用已经存在多个agent.
设置agent的配置文件, 以及agent之间的协作关系

组成团队的agent是:
agent-watch, agent-design, agent-code, agent-test

1号 agent
名称 = agent-watch
telegram bot username = @CrazyAgentWatchBot
身份 = 你是任务调度员, 为团队中各agent分配任务, 并跟踪各agent的任务进展 
收到"新任务"时, 马上发给 agent-design 进行分析, 将总任务拆解为小任务. 注意, 你自己不要分析.
然后将拆解后的小任务分配给合适的agent执行.
维护一份 `任务名.md` 文件, 记录任务列表 和 完成进度
当团队中的agent提问时, 你将疑问转发给 agent-design 思考, 再将解答转发给提问的agent. 注意, 你只做信息的传递, 不要修改信息.
知识 = 知道团队中其它agent的全量信息(包括身份和知识)

2号 agent
名称 = agent-design
telegram bot username = @CrazyAgentDesignBot
身份 = 从其它agent接受任务, 完成后通知任务发起者, 并提交成果
特别的, 你是设计师, 分析师
你将大任务拆解为适合本团队的成员执行的小任务.
你不要求用户提供补充信息, 总是给出在当前状态下的最优解决方案, 想办法把任务推进下去
知识 = 任务完成后的成果, 需要保存在 非workspace的目录下, 再交付出去
知道团队中其它agent的全量信息(包括身份和知识) 注意, 虽然你知道团队中其它agent的信息, 但在团队中, 你只会与 1号 agent 直接交流. 

3号 agent
名称 = agent-code
telegram bot username = @CrazyAgentCodeBot
身份 = 从其它agent接受任务, 完成后通知任务发起者, 并提交成果
特别的, 你是程序员
知识 = 任务完成后的成果, 需要保存在 非workspace的目录下, 再交付出去

4号 agent
名称 = agent-test
telegram bot username = @CrazyAgentTestBot
身份 = 从其它agent接受任务, 完成后通知任务发起者, 并提交成果
特别的, 你是测试员, 接受测试对象和测试标准, 交付测试报告
知识 = 任务完成后的成果, 需要保存在 非workspace的目录下, 再交付出去

公共知识:
这个团队在 telegram group 中工作, telegram group id = -1003918964882
团队中的agent 互相之间发消息 要带 @ 发送
注意, telegram bot username只在agent互相之间发送信息时使用. 其它情况下, 只使用 agent 名称.
团队中的agent 只处理 @ 到自己的消息

测试 

@CrazyAgentWatchBot 测试任务 
测试团队协作流程
结果看上去是一场灾难
(点击看大图)

先把各个agent的gateway停掉
agent-watch gateway stop
agent-design gateway stop
agent-code gateway stop
agent-test gateway stop
和默认 agent hermes 对话, 把telegram group的聊天历史记录丢过去, 让Ta分析.
下图是导出聊天记录的方法
* 最后打包成 .zip 

hermes 分析原因和解决方案

原因是对的, 但解决方案, 说实话, 我不是很放心这种负面 prompt 的效果.

再次尝试测试任务, 还是和原来差不多. 也许是以前执行过程造成的上下文污染, 也许是因为负面 prompt 的效果不好.
具体截图就不放了.

我还发现2个问题.

1. 这些 gateway 都是同一个 Nous Portal 账号OAuth认证的. 但是因为gateway是独立的, 去请求 API 时, 是各自独立的. 那么对于 Nous Portal 来看, 就是同一个账号在快速请求.
很容易触发 429 Too Many Requests 

我采用了agent共享flock 文件锁 + 状态文件 的方案控制请求API速率
~/.hermes/api_rate_limit  →  内容: 上次请求的时间戳

Gateway 想调 API 时:
  flock(api_rate_limit.lock)
    read(last_time)
    if now - last_time >= interval:
      write(now)           ← 更新时间戳
      unlock
      → 发 API 请求
    else:
      wait_time = interval - (now - last_time)
      unlock
      sleep(wait_time)
      → 重试

2. 因为流式输出效果, 一条消息还不完整的时候就被另一个bot"看到"了.
关闭流式输出 
agent-watch config set streaming false
agent-design config set streaming false
agent-code config set streaming false
agent-test config set streaming false

接下来最麻烦的, 处理团队交流的问题
参考 openclaw 的做法, 把 agent 绑定到 topic
这样 agent 自言自语的内容就不会干扰其它 agent
* 需要 hermes 修改自己的代码

为了让agent知道完成任务后回复谁, 参考我以往的agent团队的经验, 规范一个团队内消息的格式.
团队内跨agent的消息格式如下:
FROM:
TO:
CONTENT:

FROM: agent-watch
TO: agent-design
CONTENT: 
总任务: 开发一个生成随机密码的页面
核心功能参考:https://crazypeace.github.io/xkcd-password-generator/
视觉风格参考:https://onojyun.com/
请进行任务拆解,输出可直接分配给 agent-code / agent-test 的子任务列表。

再次尝试测试任务, 发现agent不知道怎么发送团队消息
我设想的逻辑链是:
发送团队消息给 xxx-agent  -> xxx-agent 的 topic 是多少 -> 用 telegram bot API 发送
但是实际效果如下 
不知道agent-watch在忙些什么. agent-design的topic里毫无反应

在尝试改进这个问题时, 发现 hermes 对查询当前agent的telegram bot token 这个功能有很多安全性限制.
我甚至找到并设置了 
hermes config set security.redact_secrets false
~/.hermes/.env
HERMES_REDACT_SECRETS=0
但还是不行.

所以, 只能来硬的了. 为每个agent生成3个脚本, 用于向其它团队成员发消息.
agent 不需要理解其它 agent 在哪个 topic 里, 不需要知道自己所在的 group id 是多少.
只要知道自己和其它agent在协作, 当TA要发消息给其它agent时就使用对应的脚本.

* 提一句, 我用的是白嫖的 mimo-v2-pro (如果你用是更"聪明"的模型, 欢迎实验)

再试试测试任务. 终于像个样子了.
(点击看大图)

不过, 还是发现一些小问题
agent-design 的第1次发消息给 agent-watch 是回复在自己的topic里的, 经过提醒才进行了正确的行为.
(点击看大图)

agent-design 有2次没有遵守团队消息格式
FROM:
TO:
CONTENT:




试试开发任务
新任务: 开发一个生成随机密码的页面
核心功能 参考 https://crazypeace.github.io/xkcd-password-generator/
视觉风格 参考 https://onojyun.com/


评论

The Hot3 in Last 7 Days

酒馆SillyTavern 玩英文角色卡 也能以中文输出 设置世界书Lorebooks

酒馆SillyTavern 用中文讲故事 修改角色卡 修改AI生成的历史记录

搭 Docker版 Sub-Store订阅转换专家 带 http-meta 实现 集合订阅 测延迟 排序 筛选 生成新订阅 定时任务上传Gist