一个 Telegram 群,三条事件路由:欢迎、群规问答与群管理各归一个 Agent

场景

一个 Telegram 交流群,群务分三件:新人进群要发欢迎语并顺手说清群规;有人问「怎么配」「这个报错怎么办」要有人答;刷广告、拉群的要当场处理。这三件事现在挤在同一个机器人身上------一条流水线、一套提示词。

麻烦在于触发时机不同。欢迎语只在「有人加入」那一瞬间有意义;群规问答面对每一条普通消息;移人、封禁这类动作本不该长在问答助手身上。合成一段提示词之后,模型每次都得先猜「现在是哪一种情况」,猜错一次就是一次误伤。

4.11 里怎么做

处理器这一层多了 Agent 这个选项。 4.10 里机器人只能挂一条流水线,想在入群时说话就得在流水线内部判断事件。4.11 改成事件路由:机器人身上存一张「事件模式 → 处理器」的表,处理器可以是流水线,也可以是一个 Agent;Agent 自带运行器(Runner,由插件提供,本例用官方插件 langbot-team/LocalAgent)与系统提示词。适配器各自声明自己支持哪些事件,具体支持取决于适配器/平台,请先核对支持矩阵。

同一条事件只命中一条路由。 逐行按顺序判定:是否启用 → 事件模式是否匹配 → 过滤条件 → 目标处理器是否声明支持该事件;第一个全部通过的行被选中,其余记为跳过(官方文档 docs/event-based-agents/04-event-routing.md §3)。本次实测(2026-10-16)的「检查路由」输出:

复制代码
目标处理器 | Agent · tg-welcome-agent | 命中规则 | 第 2 条路由 | 诊断步骤 | 第 1 条路由已跳过。事件与此路由不匹配。已选择第 2 条路由。第 3 条路由已跳过。事件与此路由不匹配。

事件范围决定三件事。 Agent 的「事件范围」是一组事件模式,本例三个 Agent 各自只声明一个。它决定该 Agent 收到哪些事件、调试下拉里能选什么、新建路由时处理器下拉里能不能选到它。本次实测(2026-10-16)建 group.member_joined 路由时,处理器下拉只列出 tg-welcome-agent 与 dify-wecomcs-agent,tg-rules-agent、tg-moderation-agent 不出现。

适配器声明什么,菜单就是什么。 本例的 Telegram 适配器 telegram-omni 声明 11 类事件,与源码 LangBot/src/langbot/pkg/platform/adapters/telegram/adapter.py:168-180 一致:message.received、message.edited、message.reaction、group.member_joined、group.member_left、group.member_banned、bot.invited_to_group、bot.removed_from_group、bot.muted、bot.unmuted、platform.specific。机器人详情页的「添加行为」菜单据此渲染:Telegram 上只有四个常用场景(「回复收到的消息」「欢迎新成员」「处理成员离群」「处理群管理事件」)加「配置其他事件」;预设表第五项「审核好友请求」(friend.request_received)不出现,因为这个适配器声明的事件里没有它(源码 LangBot/web/src/app/home/bots/components/bot-form/EventBindingsEditor.tsx:1554-1559、:194-230)。结论到此为止:菜单取决于适配器声明的事件,不是我们对某个平台能力的判断。

动手:步骤

先起一个本地演示实例:

bash 复制代码
docker network create a4
docker run -d --name a4-core --network a4 --restart on-failure -e TZ=Asia/Shanghai \
  -e BOX__ENABLED=false -e SPACE__DISABLE_TELEMETRY=true -p 15800:5300 \
  -v "$PWD/deploy/a4/data:/app/data" rockchin/langbot:v4.11.0
docker run -d --name a4-runtime --network a4 --network-alias langbot_plugin_runtime --restart on-failure \
  -e TZ=Asia/Shanghai -e SPACE__DISABLE_TELEMETRY=true -v "$PWD/deploy/a4/data/plugins:/app/data/plugins" \
  rockchin/langbot:v4.11.0 uv run --no-sync -m langbot_plugin.cli.__init__ rt

管理员 demo@langbot.local / LangBot411!demo(本地演示值,请自行替换)。

  1. 建 Telegram 机器人 :机器人 → 新建 → 消息平台选 Telegram,填 BotFather 给出的令牌。本示例填占位令牌(本地演示值,请自行替换 ),Telegram 侧不会真的连上------本文验证的是事件被送到谁那里。详情页用查询参数 /home/bots?id=<uuid>(源码 LangBot/web/src/app/home/bots/page.tsx:7-8)。
  1. 认清适配器声明了哪些事件:详情页的事件面板显示「共 11 类」,这 11 个名字就是后面所有菜单的边界。
  1. 建三个 Agent,各只认一种事件 :运行器选本地 Agent(plugin:langbot-team/LocalAgent/default),主模型 deepseek-chat,「事件范围」分别只勾一个事件:tg-welcome-agent → group.member_joined、tg-rules-agent → message.received、tg-moderation-agent → group.member_banned。范围越窄,能被叫醒的事件越少,下拉里的候选也越少。
  1. 给欢迎 Agent 写提示词、开工具 :欢迎语控制在 60 字以内并点名两条群规,允许调用「回复当前会话」(event_reply)。
  1. 先在调试页跑一次 :打开 tg-welcome-agent 的调试页(事件下拉只有它声明的那一个),给 group.member_joined 填载荷 {"member_name": "小林", "member_id": "10086", "group_id": "-1001234567890"} 并运行。本次实测(2026-10-16)记录到「已记录 1 次工具调用」,工具为「回复当前会话 event_reply」,输出逐字为:
markdown 复制代码
欢迎语已通过「发送消息」工具发出(模拟投递,未真实调用平台 API):

> 欢迎小林加入 LangBot 交流群!🎉 提问请带上 LangBot 版本号,禁止发广告。配置说明可在 GitHub 仓库 docs 目录查看。

(53 字,符合 60 字以内要求:包含欢迎、两条群规与 docs 目录提示。)
  1. 群管理 Agent 只开必须的工具 :它的「事件与工具」页显示「已添加事件 共 1 项」(成员被封禁 group.member_banned)、「已启用 4 个工具」;14 项平台工具里只勾了「移出群成员」。该工具在源码里是 event_kick_member → kick_member,风险等级 dangerous(源码 LangBot/src/langbot/pkg/agent/runner/platform_tools.py:99-203),界面标为「敏感」(read=只读、write=操作、dangerous=敏感,源码 LangBot/web/src/i18n/locales/zh-Hans.ts:1368-1370)。
  1. 建三条路由 :机器人详情页 →「事件路由」→ 逐行添加 message.received → tg-rules-agent、group.member_joined → tg-welcome-agent、group.member_banned → tg-moderation-agent。

验证

其一,路由落库。 保存后从 bots.event_bindings 读回三行(updated_at 2026-10-16 17:23:44,原始 JSON 见 series/langbot-4.11-release/evidence/demo-test-records.md §8.3):

顺序 事件模式 处理器 priority enabled
第 1 条 message.received Agent · tg-rules-agent 0 true
第 2 条 group.member_joined Agent · tg-welcome-agent 0 true
第 3 条 group.member_banned Agent · tg-moderation-agent 0 true

其二,试算一个事件。 「检查路由」里选「成员加入群组 group.member_joined」,本次实测(2026-10-16)的输出是 目标处理器 | Agent · tg-welcome-agent、命中规则 | 第 2 条路由,诊断步骤为「第 1 条路由已跳过。事件与此路由不匹配。已选择第 2 条路由。第 3 条路由已跳过。事件与此路由不匹配。」------三条路由各认自己的事件,互不遮蔽。

边界与注意

  • 本文没有真实 Telegram 收发。 机器人填的是本地演示令牌(本地演示值,请自行替换),验证到的是「配置生效 + 事件被路由到正确的 Agent 并跑完一次模型调用」,不是群里的实际投递。
  • 调试页的平台工具走 Mock。 原文:「平台工具使用 Mock:Agent 真实调用工具,回复、发送等平台动作模拟执行,不发送真实消息。其他工具仍按实际配置执行。」同一页也写着「未记录到工具调用;生成文本不代表消息已发送。」那段欢迎语是模拟投递的结果。
  • 敏感工具要单独收敛。 event_kick_member 一类风险等级是 dangerous,只开给群管理 Agent;真实平台上移人、封禁立即生效,开之前想清楚给谁开。
  • 处理器选型受事件限制。 流水线目标只能绑 message.received(官方文档 docs/event-based-agents/04-event-routing.md §3),入群、封禁这类事件要用 Agent 或插件处理器。具体支持取决于适配器/平台,请先核对支持矩阵。
  • 待确认 :只在调试页观察了单次往返,没有在群内连续观测多轮对话;tg-rules-agent 的问答质量属于模型与提示词的表现,本次未做评测。
  • 推断 「同一事件可由两条路由分别投递」不在实测范围内------实测确认的是仲裁只选一条(第 2 条命中,第 1、3 条跳过)。若确需同一事件触发多个目标,应走「插件处理器」这条独立路径。

小结与下一步

拆成三个 Agent,靠的不是更长的提示词,而是「事件模式 → 处理器」的路由行:group.member_joined 叫醒欢迎 Agent,message.received 叫醒群规问答 Agent,group.member_banned 叫醒群管理 Agent。每个 Agent 的事件范围收成一条,别的事件喊不动它,危险工具也只落在需要它的那一个身上。

从 4.10 升上来,先看迁移配置对照文档 docs/pipeline-migration-config-map.zh-CN.md;v4.11.0 release 页是版本入口,运行器插件源码在 langbot-plugins 仓库。不想自己维护实例时,托管服务 space.langbot.app 是另一个可选方向,是否合适取决于你的部署约束。

相关推荐
果霸大叔1 小时前
从根上吃透AI Agent:Agent拆解系列之DeerFlow2.0深度拆解
人工智能
2025的限定小孙1 小时前
AI自己写的SQL自己跑?把执行权从模型手里拿走的三层闸
人工智能
用户427019230121 小时前
排障实录 :OpenClaw 升级失败三次,我是怎么把系统救回来的
人工智能
不加辣椒1 小时前
第 14 章 控制项选型:成本模型与决策框架
人工智能
fanjianzhihui1 小时前
对话录音质检系统的工程实践:从语音识别到LLM判定的误差控制
人工智能·语音识别
程序员如山石1 小时前
AI主流开发环境搭建过程
人工智能·程序员
snakeshe10101 小时前
Linux 下 Ollama 完整实操指南:安装、部署大模型与开启远程访问
人工智能
FlowerJan101 小时前
ArcFace 相似度阈值别再抄 0.8 了
人工智能
阿里云大数据AI技术1 小时前
StarRocks 与 Fluss 用一条 SQL 查实时与历史
人工智能·sql