ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

Hermes Agent 在飞书群内互相 @ 通信架构设计与实现指南:TaoToken 统一 Key 接入与 Profile/open_id 配置骨架

Hermes Agent 在飞书群内互相 @ 通信架构设计与实现指南:TaoToken 统一 Key 接入与 Profile/open_id 配置骨架 1. 为什么要在飞书群里让 Agent 互相 Hermes Agent 是一套可以跑在本地或服务器上的多智能体框架每个 Agent 通过一个 Profile 绑定一个飞书机器人账号从而在同一个飞书群里以独立身份出现。它适合需要多角色协作的团队场景产品经理拆需求、全栈工程师写代码、质量工程师做测试各自是一个机器人靠群内 来分派任务和回传结果。这套玩法最核心的检索词就是 Hermes Agent、飞书、通信架构、Profile、open_id——Profile 决定“我是谁”open_id 决定“别人怎么 到我”。我试过把三个角色塞进同一个机器人里结果消息全糊在一起PM 的任务被 QA 抢着处理日志也没法分开看。后来改成每个角色一个 Profile、一个飞书应用、一个独立 Gateway 进程问题才彻底解决。但新的坑马上来了机器人 A 发at user_idou_xxx全栈/at群里只显示纯文本 不高亮机器人 B 明明被 了却毫无反应。根因有两个一是出站消息没被识别成飞书富文本 post 类型二是入站处理里有一段“机器人消息直接丢弃”的硬逻辑。这篇就按可跟做的顺序把架构、TaoToken 统一 Key 接入、config.toml/settings.json 配置骨架、open_id 获取、 收发验证、常见报错排查全部走一遍。你照着配完应该能在自己的飞书群里看到三个机器人互相 并各自回复。2. TaoToken 统一 Key 接入一个 Key 管住所有 Profile多 Agent 场景下最烦的是每个 Profile 都要单独配模型凭证改一次要动三份配置。TaoToken 提供统一 API Key兼容 OpenAI 风格的接口把 base_url 指向https://taotoken.net/api就能让所有 Profile 共用同一个 Key省掉重复维护。接入前先拿到 Key登录官网 https://taotoken.net/?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content 进入控制台创建 API Key。控制台地址是 https://taotoken.net/console?utm_sourcetaotoken_aicg_blog_endutm_contentconsoleutm_campaignrewrite Key 管理页在 https://taotoken.net/api-keys?utm_sourcetaotoken_aicg_blog_endutm_contentapi-keysutm_campaignrewrite 。创建后复制那串sk-开头的字符串只显示一次丢了只能重建。拿到 Key 后把它写进每个 Profile 的环境变量而不是硬编码进代码。Hermes 读取模型配置时优先看环境变量这样三个 Profile 可以共用同一个 Key也可以按需给不同 Profile 分配不同 Key 做额度隔离。注意API Key 属于敏感凭证不要提交到 Git也不要打印到日志里。建议放在~/.hermes/profiles/{profile}/.env并设置文件权限chmod 600。如果你只是先验证模型能不能通可以直接用模型对话页测试https://taotoken.net/models?utm_sourcetaotoken_aicg_blog_endutm_contentmodelsutm_campaignrewrite 。长期跑编码类 Agent 的话Coding Plan 更划算地址是 https://taotoken.net/coding-plan?utm_sourcetaotoken_aicg_blog_endutm_contentcoding-planutm_campaignrewrite 。3. 可复制配置骨架config.toml 与 settings.jsonHermes 的配置分两层Profile 级的config.toml管模型和平台接入settings.json管 Agent 行为参数。下面这套骨架可以直接抄把占位符换成你自己的值即可。3.1 Profile 目录结构每个 Profile 一个目录互不干扰~/.hermes/profiles/ ├── default/ # PM │ ├── config.toml │ ├── settings.json │ └── .env ├── fullstack/ # FS │ ├── config.toml │ ├── settings.json │ └── .env └── qa/ # QA ├── config.toml ├── settings.json └── .env3.2 config.toml 骨架以 PM 的default/config.toml为例模型部分统一指向 TaoToken[model] provider openai_compatible base_url https://taotoken.net/api api_key_env TAOTOKEN_API_KEY model_name gpt-4o-mini max_tokens 4096 temperature 0.3 [platform.feishu] enabled true app_id_env FEISHU_APP_ID app_secret_env FEISHU_APP_SECRET bot_open_id_env FEISHU_BOT_OPEN_ID group_policy allowlist allowed_users_env FEISHU_ALLOWED_USERS receive_mode websocket [agent] profile_name default display_name 项目经理FS 和 QA 的config.toml结构完全一样只改profile_name和display_name。receive_mode用websocket可以免公网回调本地开发更省事如果部署在服务器且已有公网域名也可以换成webhook。3.3 settings.json 骨架settings.json控制 Agent 的运行时行为重点是消息处理和 识别{ agent: { max_turns: 20, tool_timeout_seconds: 120, enable_send_message: true }, feishu: { accept_bot_messages: true, require_mention_in_group: true, mention_match_field: open_id, dedup_window_seconds: 5 }, logging: { level: INFO, log_dir: ~/.hermes/logs } }accept_bot_messages必须为true否则机器人发的 消息会被直接丢掉这是后面排障的重点。require_mention_in_group为true表示群里只有被 才响应避免机器人互相刷屏。3.4 .env 环境变量每个 Profile 的.env内容如下三个 Profile 的TAOTOKEN_API_KEY可以相同飞书凭证必须不同TAOTOKEN_API_KEYsk-你的统一Key FEISHU_APP_IDcli_xxxxxxxxxxxx FEISHU_APP_SECRET你的app_secret FEISHU_BOT_OPEN_IDou_xxxxxxxxxxxxxxxx FEISHU_ALLOWED_USERSou_pm_xxx,ou_fs_xxx,ou_qa_xxx4. 获取每个机器人的 open_idopen_id 是飞书标识机器人账号的唯一凭证格式以ou_开头。Agent 之间互相 时at user_idou_xxx里的ou_xxx就是它。没有正确的 open_id 要么不高亮要么对方收不到。4.1 用 curl 获取 tenant_access_token每个飞书应用在开发者后台都有app_id和app_secret。先换 tokencurl -X POST https://open.feishu.cn/open-apis/auth/v3/tenant_access_token/internal/ \ -H Content-Type: application/json \ -d { app_id: cli_xxxxxxxxxxxx, app_secret: SECRET_PLACEHOLDER }成功返回{ code: 0, expire: 5946, msg: ok, tenant_access_token: t-xxxxxxxxxxxxx }4.2 用 token 查机器人信息curl -X GET https://open.feishu.cn/open-apis/bot/v3/info \ -H Authorization: Bearer t-xxxxxxxxxxxxx返回里的open_id就是你要的值{ code: 0, msg: ok, bot: { activate_status: 2, app_name: 项目经理, open_id: ou_pm_xxxxxxxxxxxxxxxx } }三个 Profile 分别执行一遍得到三个不同的 open_id写进各自的.env。token 有效期约 2 小时程序里建议缓存并在 1.5 小时后刷新别每次调用都重新换。5. 验证 收发与身份校验配置写完先做语法检查再启动 Gatewaypython3 -m py_compile gateway/platforms/feishu.py hermes gateway stop hermes gateway start --profile default hermes gateway start --profile fullstack hermes gateway start --profile qa5.1 出站 消息构造PM 的 Agent 调用send_message工具时消息内容用简化语法{ target: feishu:oc_你的群ID, message: 请回复 00111231 at user_id\ou_fs_xxxxxxxx\全栈Agent/at at user_id\ou_qa_xxxxxxxx\质安Agent/at }Gateway 检测到at标签后会自动把消息类型切成post富文本构造飞书官方的at节点。如果这一步没生效群里就会显示纯文本at ...全栈Agent/at 不高亮。5.2 入站身份校验FS 和 QA 的 Gateway 收到事件后会检查message.mentions里是否包含自己的open_id。匹配逻辑大致是def _should_accept_group_message(self, message, sender_id, chat_id): sender getattr(message, sender, None) is_bot_sender getattr(sender, sender_type, ) bot if not is_bot_sender and not self._allow_group_message(sender_id, chat_id): return False raw_content getattr(message, content, ) or if _all in raw_content: return True mentions getattr(message, mentions, None) or [] if mentions and self._message_mentions_bot(mentions): return True return False关键点是机器人发的消息也要走这套检查不能提前 return 掉。5.3 预期结果群里应该看到PM 发出“请回复 00111231 全栈Agent 质安Agent”两个 都高亮随后 FS 回复“00111231”QA 也回复“00111231”。如果只有高亮没有回复说明入站被拦了如果有回复但不高亮说明出站没切成 post。6. 本篇常见错排查6.1 显示为纯文本现象是群里出现at user_id...全栈/at原样文本。原因是出站构造只识别 Markdown没检测at标签消息类型仍是text。飞书只有post类型才解析at节点。检查_build_outbound_payload里是否有at和/at的检测分支命中后返回(post, json.dumps(payload), [])。6.2 被 的 Agent 无响应最常见的原因是入站处理里有硬丢弃逻辑if getattr(sender, sender_type, ) bot: return这行会把所有机器人消息直接丢掉PM FS 的消息根本进不了后续检查。删掉它让机器人消息也走_should_accept_group_message。另一个原因是目标 Agent 的FEISHU_BOT_OPEN_ID配错mention 匹配不上。6.3 报错 _build_create_message_request not found这是方法在改动中被误删。补一个静态方法即可staticmethod def _build_create_message_request(receive_id_type, request_body): if CreateMessageRequest in globals(): return ( CreateMessageRequest.builder() .receive_id_type(receive_id_type) .request_body(request_body) .build() ) return SimpleNamespace(receive_id_typereceive_id_type, request_bodyrequest_body)6.4 SDK 不支持 mentions 参数部分 lark_oapi 版本的CreateMessageRequestBodyBuilder没有mentions()方法调用会抛AttributeError。绕开方式是走post at路线完全不依赖mentions参数兼容性最好。6.5 tenant_access_token 获取失败先核对app_id和app_secret是否复制完整再检查飞书应用是否配了 IP 白名单——如果配了调用必须从白名单 IP 发出。频率限制也要注意别每次请求前都重新换 token。现象可能原因处理 显示纯文本出站未切 post检查at检测分支Agent 无响应机器人消息被丢弃删除 bot 硬过滤方法找不到方法被误删补_build_create_message_requestmentions 报错SDK 版本旧改用 post attoken 失败凭证错或 IP 限制核对凭证与白名单7. 长期运行与 Coding Plan 建议三个 Agent 常驻跑起来后模型调用量会明显上升尤其是 PM 拆需求、FS 写代码、QA 做审查这种循环。如果只是偶尔验证用统一 Key 按量计费就够如果是每天持续跑编码和测试任务建议看下 Coding Plan额度更稳地址是 https://taotoken.net/coding-plan?utm_sourcetaotoken_aicg_blog_endutm_contentcoding-planutm_campaignrewrite 。接入文档在 https://taotoken.net/doc?utm_sourcetaotoken_aicg_blog_endutm_contentdocutm_campaignrewrite 里面有 base_url、鉴权头和常见参数说明配config.toml时对着看能少踩坑。Claude Code 相关的接入说明在 https://taotoken.net/claude-code-anthropic?utm_sourcetaotoken_aicg_blog_endutm_contentclaudecodeutm_campaignrewrite 如果你用 Anthropic 风格接口跑 Agent可以参考。最后提醒一句每个 Profile 的日志分开存路径是~/.hermes/logs/gateway_{profile}.log重点盯Dropping group message、Routing group message、mentions这几个关键词。 不通的时候先看日志里消息有没有进来再看 mention 匹配结果基本两步就能定位。
返回列表