用botmux打通飞书与AI Agent,实现移动端授权审批 botmux 最直接的场景就是解决 Agent 跑到一半需要人点头这件事。做 AI Agent 的人应该都经历过任务启动后工具调用到某个步骤系统突然弹出一条待授权消息可能是读取某个目录、发送一条消息、写入一个文件或者执行一次外部接口调用。如果你不在电脑前整条任务就卡死在那里等你远程连回去再点一下。跑多任务、跑长流程的时候这种打断特别烦躁。把飞书和 Agent 通过 botmux 打通之后授权消息会直接变成飞书卡片手机上就能点同意还是拒绝几秒完成不用再回电脑前。这篇文章主要写给两类人一是自己写 Agent 工作流的开发者二是小团队里搭自动化服务、又不想把权限完全放开的运维或技术负责人。下面会给你一条可以照着复现的最小链路也会讲清楚批量任务、多人审批、超时兜底和报错排查时最该看哪里。1. 先搞清楚 botmux 打通的是哪条链路1.1 典型场景Agent 跑到一半需要人工点头很多人一开始把 Agent 想得太激进以为全自动才是目标。真正落地之后你会发现大部分工具型 Agent 都会在关键动作前加一道人工确认尤其是调用外部 API涉及发送、下单、通知或写库。执行本地命令或脚本改动系统文件。批量处理数据删除、覆盖、移动文件。访问生产环境的账号、密钥或配置。这些场景如果不加授权风险很高但如果每步都要回电脑操作又会让任务变成“半自动”。更麻烦的是当 Agent 部署在服务器上你在外面用手机连不上内网工具时任务就只能停在那。botmux 就是用在这里的它把 Agent 侧发起的授权请求转成飞书里的审批卡片你在飞书里点“同意”或“拒绝”结果再传回 Agent让任务继续往下走。1.2 botmux 在链路里扮演的角色从整体架构看botmux 不是替代 Agent也不是替代飞书而是中间桥接层。一条授权消息的完整路径是这样的Agent 执行到需要授权的步骤准备一个待确认任务。botmux 接收这个任务把必要信息整理成飞书卡片消息。飞书作为消息入口把卡片推送给指定的接收人或者群。你在飞书里点击按钮。飞书把点击事件回传给 botmux。botmux 把结果返回给 AgentAgent 继续执行后面的逻辑。理解了这条路径你就知道为什么“打通飞书与 Agent”这句话值得单独拿出来说。飞书本身是一个成熟的 IM 平台Agent 则是执行框架两者之间缺一个能双向传递状态、处理回调、维护超时和重试的中间层。botmux 解决的就是这个衔接问题。2. 环境准备和前置条件先理清组件再动手2.1 需要准备的组件搭建之前先把组件列清楚不要急着下载工具跑命令。一套最小链路通常包含四块组件作用说明飞书自定义应用提供机器人消息能力和事件回调能力需要在飞书开放平台创建拿到 App ID 和 App Secretbotmux 桥接服务连接飞书和 Agent维护授权状态可以跑在你自己的服务器、容器或同一台测试机上Agent 运行环境真正执行任务并发出授权请求可以是本地脚本、Agent 框架也可以是自建服务Agent 侧回调接口接收 botmux 返回的授权结果需要 Agent 代码或配置支持至少要能给 botmux 暴露一个入口如果你的 Agent 已经能跑通工具调用那它大概率具备“等待外部状态”的能力。最省事的做法是在 Agent 侧预留一个等待授权结果的接口botmux 在这个接口上回调。2.2 资源要求和网络要求botmux 本身不是一个重服务。按我测试过的经验单独跑桥接层2 核 4G 的小服务器完全够用内存占用也不会很高。真正的资源大户是 Agent 背后的模型推理服务。如果你本地还有一个大模型在跑那就把 botmux 和模型服务分开部署或者至少先观察内存和 CPU 再决定是否合机。网络上有两个点需要提前确认飞书开放平台的事件订阅通常需要对一个公网可访问的回调地址发请求。如果你的服务器不方便暴露回调地址优先查一下飞书开放平台是否提供长连接模式也就是由你的服务主动连接飞书而不是等飞书回调过来。长连接模式对个人开发者很友好因为不需要单独准备公网入口。具体支持与否以飞书开放平台当前接入方式为准。我第一次搭的时候忽略了这个结果一直在纠结回调地址不通后来换成长连接才把链路跑通。3. 从一条授权消息开始最小可跑通链路3.1 创建飞书自定义应用并配置机器人在飞书开放平台创建一个自定义应用主要做两件事添加机器人能力让应用可以发消息。配置事件订阅尤其是按钮回传相关的事件。创建之后拿到 App ID 和 App Secret这两个值后面要填到 botmux 配置里。应用权限不要一上来全开先开最小范围发消息、接收事件、读取用户或群信息。权限开太多审核和使用时都会不舒服。3.2 配置 botmux 两侧的连接botmux 配置里一般会包含三段飞书连接信息、Agent 连接信息、授权策略。下面是一个示例结构实际字段以你自己使用的版本为准feishu: app_id: cli_xxxxxxxx app_secret: xxxxxxxx event_type: long_connection # 或 callback callback_path: /feishu/callback agent: base_url: http://127.0.0.1:8000 api_key: sk-test-xxxx callback_path: /agent/approval/result approval: timeout_seconds: 300 auto_deny_on_timeout: false allow_tools: - send_message - write_file这段配置表达的意思是飞书事件通过长连接接收agent 服务在本机 8000 端口授权结果会发回到 agent 的/agent/approval/result接口授权超时设为 300 秒超时后不自动拒绝。我一般建议先不开启auto_deny_on_timeout等手工确认整套链路稳定了再根据业务需要决定超时策略。3.3 用一条授权消息验证全链路配置完成后不要直接压测先跑一条最简单的授权任务。具体步骤启动 Agent 服务确认它监听在配置的地址上。启动 botmux看日志里是否成功连接飞书和 Agent。在 Agent 里触发一个会申请授权的工具调用。打开飞书看是否出现审批卡片。点击“同意”回到 botmux 日志确认回调是否发送到了 Agent。回到 Agent 侧确认任务是否继续执行。判断成功的标准很简单飞书出现卡片、点按钮后任务继续、日志里没有超时报错。如果飞书上没收到卡片先看 botmux 日志里飞书连接是否正常如果点了按钮没反应再看事件回传配置。4. 授权策略和关键参数别把自动化权限当成摆设4.1 核心参数参考打通链路不难难的是把授权策略设计得不难受也不危险。下面这些参数是我觉得最值得关注的参数含义建议授权超时时间等待人工确认的最长时长首次测试设 300 秒足够超时策略超时后自动同意、自动拒绝还是保持等待生产环境建议自动拒绝或保持等待可审批人列表谁有权限点同意别设成全员按用户 ID 或部门限制工具白名单哪些工具调用需要授权先白名单后黑名单门禁式更稳任务去重防止飞书重复回调导致重复审批必须开用任务 ID 做幂等日志级别审计和排错用的日志详细程度开发环境 debug生产环境 info 或 warn很多桥接实现里飞书事件会重试。如果 botmux 没做去重一个点击事件可能会被处理两次Agent 就会收到两个结果任务状态就可能错乱。这个不是少数情况而是事件型接口的常见坑。4.2 为什么不能把授权直接全部自动放行有些同学搭完之后嫌点按钮麻烦想把所有工具都改成直接执行。我建议至少保留一层门槛。原因有两方面第一Agent 的自主性有限。它在复杂输入下可能误判尤其是文件删除、数据覆盖、对外发送消息这类操作一旦执行错了回收成本很高。第二授权本身也是一条审计记录。出了问题时你可以知道谁在什么时间批准了什么操作。没有授权记录排查事故会非常被动。比较合理的方式是分级处理风险低的工具直接执行风险中等的工具弹出审批卡片风险高的工具必须二次确认。botmux 里通常可以按工具名或任务类型来配置先用最低风险的单条任务跑通再逐步放开。5. 批量任务和多人协作时最容易被忽略的几个点5.1 任务标识和幂等处理批量任务和单条任务最大的区别在于“结果对不上号”。如果同时跑 20 个任务飞书里出现 20 张卡片你点击其中一张botmux 要能准确分辨这是哪个任务的授权。这里必须要有一个稳定的任务 ID从 Agent 创建授权请求时就带上贯穿整个链路。在卡片内容里最好也显示任务摘要比如“任务 #1023 申请调用 send_message参数通知线上值班群”。不然你对着二十张卡片根本分不清谁是谁。点击按钮后botmux 回传结果时也要带上同一个任务 IDAgent 侧以这个 ID 为准更新状态。如果飞书事件重试导致同一个任务被重复处理需要依赖任务 ID 做去重。方法也很简单在处理回调前先查一下这个任务是否已经有结果有就不重复处理。5.2 多人、多任务并发时的处理顺序小团队多人协作时常出现一个现象任务卡片发到了群里两个人同时点了同一个按钮。看起来没什么问题其实隐藏着状态竞争。建议从两个角度限制审批人维度配置“哪个用户点过之后其他用户不能再点”或明确记录第一个点击者。状态维度卡片按钮在点击后立即更新成“已处理”避免二次点击。并发任务多的时候botmux 侧的队列也很重要。每个授权请求进入队列一个一个回传而不是随意并发。不要让 Agent 同时收到十几个回调结果那会让任务状态更难排查。5.3 超时与兜底策略批量任务里最难受的场景是你在开会没看到审批卡片任务等了几十分钟。这时候超时策略就特别重要。如果是可等待任务建议超时时间设长一点配合飞书提醒通知。如果是不能等待的任务超时后直接自动拒绝并让 Agent 进入失败分支。如果你希望“超时未审就按通过处理”要谨慎。这个策略只适合低风险动作比如临时写缓存、发一个无副作用通知。有一个兜底建议在 Agent 侧设置一个最大等待时间超过时间就不等授权结果直接走失败流程。这样即使 botmux 出问题Agent 也不会永久卡住。6. 怎么判断链路是否稳定以及报错排查顺序6.1 稳定性判断标准链路稳定不是说“点一次能通”而是要连续跑很多次都不出错。我建议关注这几个指标消息送达率每次授权请求都能变成飞书卡片。回调成功率点击按钮后Agent 总能收到结果。重复率同一任务是否被处理了两次以上。超时率有多少任务因为超时没收到结果。日志一致性飞书侧、botmux 侧、Agent 侧能否通过任务 ID 串起来。我一般会连续测试 20 到 50 条授权任务如果中途出现重复处理或回调丢失先别急着改代码把日志拉出来看任务 ID 在哪一层断开。6.2 常见问题排查顺序很多人一遇到问题就怀疑是 botmux 不行实际上大部分问题出在配置、权限和输入格式上。按这个顺序查效率最高现象优先排查次要排查飞书收不到卡片botmux 是否成功连接飞书App ID/Secret、事件订阅配置卡片出现但点击没反应botmux 回调地址或事件回传配置按钮回调是否带上了任务 ID点击后 Agent 没继续botmux 是否把结果发给了 AgentAgent 回调接口路径和鉴权是否匹配同一任务处理两次任务去重是否开启飞书事件重试、botmux 是否重复 ack任务超时但卡片还在botmux 的超时策略是否生效审批人是否已收到提醒排查时要学会看日志。先看 botmux 日志因为它处于中间层能同时看到飞书事件和 Agent 回调再看 Agent 日志确认最后一步到底有没有收到结果最后才去查代码或参数。多数情况下问题都出在事件回传没有正确确认或者 Agent 回调接口收到了结果但没有按任务 ID 更新状态。还有一点要提醒不要在低配置机器上同时跑 Agent、模型服务和 botmux。如果内存已经吃满任何服务都可能表现异常但看起来就像“卡片发不出去”。先看资源占用再判断功能问题。7. 上线节奏和实际建议7.1 推荐上线节奏打通飞书与 Agent 这件事最忌讳一步到位。我建议按下面四步走单条任务验证用最简单的工具调用测试卡片收发和点击回传。单角色完整流程模拟一个包含多个连续授权步骤的 Agent 任务验证任务 ID 能贯穿全流程。小批量测试同时跑 5 到 10 个任务观察队列、去重、超时和日志。生产环境收敛限制审批人列表、开启审计日志、把高风险工具单独分类。每一步都要有明确的通过标准。第 1 步通过标准是“点一下能继续”第 3 步通过标准是“20 条任务无重复、无丢失、无超时错乱”。没有达到标准之前不要急着扩大范围。7.2 最后几点实用建议我用这类方案搭过几次之后最大的感受是真正花时间的不是配置飞书也不是写 botmux 的调用逻辑而是把 Agent 侧的“等待授权”状态机设计清楚。Agent 必须知道自己在等什么、等多久、收到结果后怎么处理、超时后怎么回退。这四件事清楚了桥接层写起来会非常快。如果你只是学习测试用一条最简单消息把链路跑通就够了不需要一上来就接生产环境。如果你是要落地到团队使用我建议提前把审批人列表、工具分类、超时策略和日志保留时间都定好。这些看似是运营细节实际上是整个授权体系能不能稳定运行的关键。最后留一个排查建议当链路出问题先看 botmux 日志里的任务 ID 流转再决定动哪一侧。别一上来就重启服务也别急着改参数。大部分问题在日志里都能找到答案只是有时候日志级别太粗看不到足够信息。把日志级别调低复现一次问题你会比盲猜快很多。