Dialogflow机器人如何通过Webhook实现类似session.sendTyping()的输入提示?
实现Dialogflow机器人在Teams/Skype中显示“正在输入...”提示
当然可以通过Webhook实现这个功能!因为你的机器人集成的Teams和Skype都是基于Microsoft Bot Framework的,而Dialogflow允许通过Webhook返回适配Bot Framework的特定payload来触发Typing指示器。下面是具体的实现步骤和代码示例:
核心原理
Dialogflow的Webhook响应支持自定义payload字段,针对Microsoft系渠道(Teams/Skype),我们可以在这个payload中嵌入Bot Framework标准的Typing活动,渠道收到后就会自动显示“正在输入...”的提示。
实现步骤
1. 构造Typing提示的Webhook响应结构
在你的Firebase Cloud Function中,需要返回包含Typing payload的Dialogflow响应。典型的JSON结构如下:
{ "fulfillmentMessages": [ { "payload": { "microsoft": { "type": "typing" } } }, { "text": { "text": ["这是机器人的实际回复内容"] } } ] }
这里第一个消息是触发Typing的payload,第二个是实际的文本回复——渠道会先显示“正在输入”,然后自动切换到文本内容。
2. Firebase Cloud Functions代码示例(Node.js)
如果你需要模拟耗时操作(比如调用外部API),可以先返回Typing提示,延迟后再发送实际回复:
const functions = require("firebase-functions"); const { WebhookClient } = require("dialogflow-fulfillment"); exports.dialogflowFirebaseFulfillment = functions.https.onRequest((req, res) => { const agent = new WebhookClient({ request: req, response: res }); function handleIntent(agent) { // 先发送Typing提示 agent.add({ payload: { microsoft: { type: "typing" } } }); // 模拟2秒的耗时处理(比如调用数据库/外部API) return new Promise((resolve) => { setTimeout(() => { // 发送实际回复 agent.add("处理完成啦!这是我的回复内容~"); resolve(); }, 2000); }); } // 绑定你的意图处理函数 let intentMap = new Map(); intentMap.set("你的意图名称", handleIntent); agent.handleRequest(intentMap); });
注意事项
- 这个方案仅对支持Bot Framework Typing活动的渠道有效,你的Teams和Skype完全符合要求。
- Typing提示的显示时长由渠道自动控制,通常会持续到下一条消息发送,或者几秒后自动消失。
- 确保Firebase函数的超时时间足够覆盖你的耗时操作(默认是60秒,可在Firebase控制台调整)。
内容的提问来源于stack exchange,提问作者sanjeev Kamal
相关产品推荐
相关产品推荐

