如何在运行于MS Teams的Rasa机器人中正确实现Adaptive Card task/fetch按钮
问题根因
Rasa 官方默认的 BotFramework 通道仅支持处理普通message类型的活动请求,而 Teams 的 task module 触发的task/fetch属于invoke类型的活动,默认通道无法识别该类请求,因此会输出Not received message type日志,且不会返回 Teams 要求的响应结构,最终导致 Teams 端报错。
排查与解决步骤
1. 修正自适应卡片JSON格式
你当前提交的Action.Submit配置存在尾随逗号的语法问题,Teams 对自适应卡片的JSON校验非常严格,语法错误会直接导致按钮解析失败,修正后的配置如下:
{ "type": "Action.Submit", "title": "Submit button", "data": { "msteams": { "type": "task/fetch" }, "task": { "type": "message", "value": "Message text" } } }
2. 自定义通道支持invoke类型请求
需要重写 Rasa 的 BotFramework 通道逻辑,新增对invoke类型活动的处理能力,无需修改 Rasa 源码,通过自定义通道即可实现:
- 继承
rasa.core.channels.botframework.BotFramework类,重写post方法 - 新增判断逻辑:当收到的活动
type为invoke且活动name为task/fetch时,直接返回符合 Teams 要求的 task module 响应,示例逻辑如下:
from rasa.core.channels.botframework import BotFramework from sanic import response class CustomBotFramework(BotFramework): async def post(self, request): if request.json.get("type") == "invoke" and request.json.get("name") == "task/fetch": # 构造task module响应 task_resp = { "task": { "type": "continue", "value": { "title": "任务模块标题", "height": 500, "width": 400, "url": "你的任务模块页面地址" } } } return response.json(task_resp, status=200) # 其余逻辑走默认通道处理 return await super().post(request)
- 将 Rasa 配置文件中的通道替换为你自定义的
CustomBotFramework通道
3. 校验Teams应用配置
确认以下配置符合要求:
- 任务模块用到的页面域名已经添加到 Teams 应用清单的
validDomains列表中 - 机器人的权限配置已经开启
task module相关权限
4. 调试验证
开启 Rasa debug 模式,按下按钮后查看收到的完整请求体,确认请求类型和参数符合预期,也可以通过模拟工具发送task/fetch请求到自定义通道,验证返回结构是否符合要求。
内容的提问来源于stack exchange,提问作者Markos di Mitsas
相关产品推荐
相关产品推荐

