AI Agent接入飞书钉钉:群机器人双向通信与自动化实战指南

发布时间:2026/9/28 15:05:36
AI Agent接入飞书钉钉:群机器人双向通信与自动化实战指南 1. 从AI对话框到群聊机器人为什么我坚持把Agent接进飞书和钉钉先说我自己的真实感受。过去一年多我玩过不少AI工具从对话框问答到本地知识库再到Agent编排功能是越来越强但有一个问题一直很别扭AI始终活在我单独打开的网页或客户端里而我真正的工作是活在飞书和钉钉的群聊、文档、表格里的。你回想一下自己的工作流客户在群里问数据你切到AI工具去问一遍再把回答复制回群里同事在群里艾特你问排期你翻完文档又跑回来贴一段。这个复制粘贴的过程每来一个问题就重复一次。麻烦也就算了关键是AI看不到群里上下文问两次同样的背景它又是一副我不记得了的样子。所以我一直在找一种方案能把AI直接变成群里的一个成员让它能看消息、能回复、能查数据、能发文件。后来我把WorkBuddy开放平台接进了飞书和钉钉整个体验彻底不一样了AI不是在你手机里一个孤零零的聊天页而是活在你的工作群、业务流和协作场景里。这篇文章我想把我跑通这条链路的过程完整记录下来包括架构思路、飞书接入、钉钉接入、让Agent真正干活的编排技巧以及上线之后踩过的一堆坑。适合谁看打算把AI接进企业内部IM、做成群机器人或自动化助手的朋友无论是研发还是懂一点配置的运营都可以照着思路走一遍。2. WorkBuddy到底做了什么动手之前先弄懂架构逻辑很多人一上来就急着配置结果越配越乱。我建议你先花十分钟搞清楚WorkBuddy在这套体系里扮演什么角色后面调试会顺畅很多。到底怎么在生产环境接入IM我发现关键的坑绝大多数人不知道配置跑通后系统有一条用户发消息 - IM平台回调 - WorkBuddy路由 - 大脑模型处理 - IM回复的完整链路。IM平台推送消息给WorkBuddy这是一条上行通道WorkBuddy通过IM平台接口把回复发回群聊这是下行通道。这条链路构成了AI与用户在群里的完整闭环。2.1 两层结构通道层和大脑层WorkBuddy架构上分得很清楚上一层是通道层负责跟飞书、钉钉这些IM平台打交道下一层是大脑层负责调度大模型和各类工具。这个分层不是一个概念摆设它带来的实际好处是你换一个IM平台或者换一个大模型不需要重构另一套。我打个比方。通道层像是你请了一个翻译兼前台它知道飞书的消息长什么样知道钉钉的回调怎么签也懂得把一张多维表格变成飞书消息卡片。你不需要关心这些平台差异只管给前台说帮我把这句话发给群里那个人前台负责搞定。有没有看到上层通道层变化后底层大脑层无须改动就是说你从飞书换到钉钉对话逻辑、工具调用逻辑完全可以复用。实际配置时WorkBuddy会要求你分别填两个层面的东西通道层面要填IM平台的App ID、App Secret、Webhook地址这些凭证大脑层面要填大模型的接口地址、模型名称、温度参数以及你定义的工具清单。两套东西分开管理排查问题时也容易定位——消息进不来大概率是通道问题回复不聪明那才是大脑问题。2.2 消息模型别以为IM里只传文字飞书和钉钉的消息体系远比想象中复杂。文本只是最基础的一种还有Markdown卡片、交互按钮、文件消息、富文本、表格附件等类型。WorkBuddy在中间做了一层消息抽象把IM各种消息格式转成内部统一结构agent拿到的是一个干净的用户意图而不是一堆不同平台的JSON壳子。这一段是我觉得WorkBuddy设计得最聪明的地方。因为你在处理让AI查了数据库之后把结果发给群这个需求时如果每次都去写飞书专用消息格式、再写钉钉专用格式代码会变成一座屎山。抽象层帮你把查了数据库和构造消息分开agent只需要说我要发一个文件、内容和文件名分别是什么通道层自动适配成飞书的上传文件消息或钉钉的文件机器人消息。2.3 双向通道才是关键能力很多人刚开始以为接钉钉就是配置一个Webhook地址往群里扔消息接飞书就是创建一个机器人转发消息。这都是单向的。但要让AI成为群里真正的协作者必须满足用户能发消息给机器人机器人能收到并回复的双向能力。这里最重要的点是在接群机器人时你要选择正确的事件订阅方式否则你只能发出一条消息却收不见对方发过什么。验证双向通道的方法很简单在群里艾特机器人发一句你好如果机器人秒回说明上行和下行都通。如果只能收到消息但回复不回来大概率是下行权限或者凭证配置有问题。如果消息根本没进到你的服务那就去排查事件订阅和回调地址。3. 飞书接入实录创建自建应用加长连接三十分钟打通第一轮对话我以飞书为例把整个接入过程拆成步骤每个步骤里我会标注哪些地方最容易出错。这套流程我自己走了不止一次照着做基本可以一次跑通。3.1 飞书开放平台后台的配置要点第一步去飞书开放平台创建一个企业自建应用。创建完之后你要在权限管理这个页面加权限。很多人第一个坑就在这里不加权限机器人就像一个被堵住嘴的人什么消息都发不出去。我建议你直接开通这几项im:message和im:message.group_at_msg接收群中 机器人的消息并回复im:resource上传图片、文件im:message.p2p_msg打通单聊场景drive:drive如果是读取多维表格的数据需要文档权限权限加好了还要做两件看起来不起眼但很关键的事。第一在事件与回调页面订阅im.message.receive_v1事件这是消息进来时的触发开关。第二在应用能力里启用机器人能力。好多人权限加了、事件也订阅了就是忘了把机器人的开关打开结果群里艾特毫无反应。3.2 长连接模式为什么比公网回调更省心飞书支持两种消息接收方式一种是Webhook公网回调一种是长连接模式。如果你公司有公网服务器Webhook也行但我要特别推荐长连接模式。飞书的长连接模式本质是客户端主动建立一条长连接与服务器通信不需要公网入口不需要配置回调地址也不需要处理内网穿透。这对本地开发、内网环境极其友好。我在云服务器上也没有配公网回调而是直接用长连接方式。好处是显而易见的不用在网关层做回调地址的白名单不用处理HTTPS证书更不用担心消息回调超时的问题。长连接模式的逻辑就是你的服务一直维持与飞书服务器的长连接一旦有人艾特机器人消息直接从这条连接推过来。3.3 WorkBuddy侧的连接配置在WorkBuddy里配置飞书是这个流程里最直观的一步。你需要把飞书后台拿到的三样东西填进去# WorkBuddy连接器配置示例飞书 workbuddy connector add feishu \ --app-id cli_xxxx \ --app-secret 你的App Secret \ --event im.message.receive_v1 \ --mode long-connection配置完成后启动WorkBuddy的飞书连接器日志里会出现类似长连接已建立等待消息的输出这就说明通道已经通了。到这里你只需要在群里艾特机器人发一句你好它就会收到消息并回复。这个过程我测过很多次从创建应用算起慢的话三十分钟、快的话十五分钟就够了。飞书和钉钉我都接完了如果说哪个体验更好飞书在开放平台的权限模型、事件订阅和长连接支持这些方面对开发者确实更友好接入文档的完整度也更高。4. 钉钉接入实录Webhook、Stream模式与消息卡片的实战取舍钉钉的接入逻辑和飞书差别很大尤其是机器人类型和消息回传方式。我先说一个判断标准再讲具体操作。4.1 纯通知场景自定义机器人Webhook最省事如果你的场景只是往群里推消息比如定时推送日报、告警通知那钉钉的自定义机器人Webhook是最简单的方案。在群设置里添加一个自定义机器人生成一个Webhook URL再配一个加签密钥用Python就能把消息往群里推。# 钉钉自定义机器人推送示例 import time import hmac import hashlib import base64 import urllib.parse import requests secret SEC你的加签密钥 timestamp str(round(time.time() * 1000)) string_to_sign f{timestamp}\n{secret} hmac_code hmac.new( secret.encode(utf-8), string_to_sign.encode(utf-8), digestmodhashlib.sha256 ).digest() sign urllib.parse.quote_plus(base64.b64encode(hmac_code)) url fhttps://oapi.dingtalk.com/robot/send?access_token你的TOKENtimestamp{timestamp}sign{sign} requests.post(url, json{ msgtype: text, text: {content: 这是一条测试消息} })但你需要明白它的局限性自定义机器人Webhook是单向通道只能往外发消息收不到群里成员对机器人的回复。如果要做双向对话比如员工在群里问AI问题然后等AI回答或者点击卡片按钮跟机器人交互这种方式就无能为力了。4.2 双向对话场景Stream模式比公网回调更稳钉钉要接收消息传统方案是自建应用加公网回调需要在公网服务器配置接口还要在开发者后台把回调地址填上去。但钉钉现在也提供了Stream模式也就是长连接方式。我强烈建议你优先使用Stream模式理由和飞书那边是一样的不需要公网、不需要回调地址、符合我们接入范围对网络环境的要求。具体做法是去钉钉开发者后台创建一个企业应用开通机器人能力然后在事件订阅里选择Stream模式。订阅事件里至少要勾上机器人消息事件这样才能收到群里艾特机器人的消息。WorkBuddy钉钉连接器会负责维持这条长连接收到的消息交由大脑层处理再通过同一个连接回传结果。4.3 钉钉消息格式的差异化处理钉钉消息格式和飞书最不一样的地方在于钉钉的消息卡片是用actionCard或markdown消息类型实现的而且markdown的语法支持范围比飞书窄。我在最初接入时发现同一段markdown在飞书能渲染得很好在钉钉里却出现乱码或样式丢失。原因是钉钉对markdown的支持只覆盖部分语法比如表格、复杂嵌套列表根本不支持。解决办法是在WorkBuddy的通道层对钉钉消息做降级处理如果回复内容复杂就把中括号改成文本格式或直接转成纯文本文件。比如AI查完数据库返回一个表格飞书那边可以发一张多维表格卡片钉钉这边我就让它输出一个CSV或Excel文件发送到群里这在钉钉里其实是更实用的呈现方式。我发现接入钉钉需要用文件优先、卡片辅助的思路而不是硬套飞书那套UI方案。5. 让Agent真正干活工具调用、多维表格与文件推送的组合拳通道打通以后很多人会止步于此机器人会聊天了然后呢如果只是会聊天那还不如让同事直接在AI网页里问。让用户觉得这东西有用的关键是让AI能调动业务工具去解决问题。这里我分享几套我自己用得最顺的编排方案。5.1 把查数据和发文件拆成两个独立工具AEA的一个常见误区是把所有事情堆在提示词里让AI临场发挥。比如你想让它查数据库就在提示词里写当用户让你查数据时执行以下SQL...结果模型每次生成的SQL都不一样SQL写得还有一点差别就会查错。正确的做法是把它变成工作流的工具先在WorkBuddy里定义好一个工具比如MysqlQuery输入是SQL语句或查询条件输出是结构化结果再定义另一个工具SendFileToGroup输入是文件名和文件内容输出是发送结果。大模型不再直接编写完整SQL而是负责任务路由判断用户的意图该走哪个工具由工具去执行确定性的逻辑。我发现这样设计比纯提示词驱动稳定很多。实际场景群友问把昨天的销售数据汇总发一下模型把这条消息转成两个工具调用先调MysqlQuery拿到销售明细再调SendFileToGroup把明细生成Excel发到群里整个过程是确定的。5.2 用多维表格当Agent的数据后端飞书多维表格是一个特别适合当Agent数据后端的场景。你可以让AI直接读写多维表格业务人员完全不需要碰数据库。我试过一行Python脚本都没有把飞书多维表格当作一个可视化数据库让WorkBuddy在上面执行增删改查。在WorkBuddy里我需要接入多维表格的相关API配置表格的App Token和表ID环境变量。配置好之后群里艾特AI说这条记录的第3列数据不对改成100AI可以定位到具体记录、调用文档API去修改、然后把修改结果用卡片反馈给群。这种组合对运营团队非常实用因为它把AI对话变成了操作入口替代了那些需要按按钮、填表单的重复操作。5.3 主动推送定时任务让Agent自己开口Agent不是只能被动回复还可以主动开口说话。我做的第一个实战项目是一个每日数据播报的agent每天上午九点它自动从业务库拉取昨天的经营数据汇总后推送到管理群里。这个用WorkBuddy的定时触发功能就能实现不必专门写定时器进程。定时任务的逻辑是触发 - 调工具取数据 - 生成摘要文本 - 推送到目标群。这个链路和对话链路是共享大脑层的区别只在于入口不同。对话入口是IM消息定时入口是cron表达式触发。这种扩展方式等于把一个对话机器人升级成了公司内部的工作流bot。对钉钉侧主动推送场景用自定义机器人Webhook就够了不必启动Stream模式。比如日报推送我用Webhook员工在群里询问问题时我再走Stream两套模式各司其职。6. 上了线才是麻烦的开始限流、超时、并发与排障实战接入跑通只是开始真正折磨人的是上线后的稳定性问题。我在飞书和钉钉两条链路都遇到过不同形态的故障下面把我处理过的最典型的几个问题整理出来你可以把这些当成checklist来参照。6.1 消息发出去了但AI没回的排查路径出现这个现象我的排查顺序是固定的先看WorkBuddy日志里有没有收到上行消息。如果没收到说明是事件订阅或长连接的问题去IM后台看事件订阅类型是否选对、机器人是否真的被艾特。如果收到了、但没回复那就是下行阶段出了问题优先检查凭证权限是否包含发消息的权限。有个容易被忽视的点是飞书要求机器人在群聊里必须有发送消息权限之外还要求应用对目标群有可见性。如果是新建的群有时候机器人不在群成员列表里需要重新添加。钉钉也有类似的情况自建应用创建后需要先在后台把群添加到机器人的可用范围内否则你在群里艾特时钉钉后台连事件都不会推送过来。我先排查这部分能省很多时间但也容易被忽略。6.2 限流和并发把同步调用改成异步任务IM平台都会对API的调用频率做限制。飞书的频率限制是按应用维度计算的如果你又发消息又上传文件又回调很容易撞到限制。钉钉自定义机器人Webhook的限制更严格单个Webhook每分钟只能发送20条消息超了就报触发限流。线上真实流量起来之后群多、消息多同步调用必炸。我的方案是把所有发送操作丢进一个异步队列用Worker线程逐个发送并配合退避重试。尤其要小心的是需要先上传文件再发送的场景文件上传和发送之间必须串行执行否则前端会拿到一个未就绪的文件Key消息推出去消费者点开是损坏的。异步方案不复杂核心是为了削峰让IM接口始终在限制以内工作。WorkBuddy本身也支持配置消息队列如果你在群里接了一句问大模型的长任务可以先把正在处理的提示发给用户再异步执行工具、最后把结果回传。这种交互方式对用户体验友好很多直观感受是机器人不会一直转圈。6.3 三个有代表性的线上事故复盘第一个是长连接掉线。飞书和钉钉的长连接模式虽然不必处理公网回调但长连接本身会偶尔断线。掉线之后如果没有实现自动重连AI会变成假死状态看起来还在实际消息一个都收不到。我的经验是必须在连接器层实现心跳检测和无限重连机制而且重连成功后要主动拉取离线期间的消息不然在掉线窗口内用户发的消息就直接丢了。第二个是内存占用持续增长这是个细分但会引发故障的问题。我遇到的是长连接进程在日志生产和对话上下文缓存上的问题随着对话轮数变多WorkBuddy的内存占用一直往上走。做排查后确认是全局上下文对象在长时间运行中没有释放解决方案是给每个会话设置一个上下文轮数阈值超过阈值的旧对话自动归档同时定期清理日志缓冲。特别是如果你在Windows环境上跑这些服务内存占用会看着特别吓人别等到系统把进程杀了再处理要提前制定内存阈值告警。第三个是表格文件发不出来。钉钉Webhook发送文件有大小限制超过20MB的文件直接失败而飞书相对宽松。我最初把好几万行数据一次性塞进Excel再发群结果钉钉那边就报错。后来改成先做数据压缩、按维度拆分文件再发送或者用表格摘要加文件附件的组合问题就解决了。设计要通信消息发文件功能时我建议先看清楚目标平台的文件大小上限再决定输出内容的体量。7. 最后一段实操心得整个流程走下来我的最大体会是接入IM这个环节其实是最没有技术含量的一部分只要按照平台文档一步步配置大多数人都能跑通。真正的分水岭在于你会不会设计Agent的工具和场景。会聊天、会查数、会发文件听起来功能差不多但用起来是天壤之别。如果你今天想开始我建议按这个路径推进先只接一个平台把消息双向链路调通然后加一个最常用的工具调用比如查数据库或读多维表格让它能真实解决一个问题等移动端验证没问题了再扩展第二个平台。这句话我反复说了好多遍跑通一条可靠路径远比铺开多个半残的接入更有价值。我碰到过有些朋友在把AI接入IM这件事上过于理想化一开始就想做一个全知全能的部门助理结果用户问一个问题它就答不上来反而让同事觉得这AI也没什么用。先把一件小事做到好用比如每天早上自动把一个群需要的报表生成并推送这个体验一旦建立起来后面再叠加别的能力大家接受度会高得多。还有一个小技巧想分享给正在调试的人在IM群里通过AI私聊机器人来测试那种情况下上下文是干净的不掺群聊的干扰适合验证链路和工具逻辑。群聊环境复杂很多人为了调试方便把群里的所有消息都喂给AI这会造成上下文污染也会消耗大量token。建议只让AI处理带艾特的消息或者通过命令字触发这样才能保持群聊对话的干净和稳定。最后如果你也遇到了WorkBuddy连接器配置和IM平台权限上有关联的问题欢迎多试试长连接模式配合日志去判断到底是上行还是下行的问题。这条路我走通了你们照着走只会比我更顺。