如何用Adaptive Card的Action.Submit模拟用户输入适配Core Bot
问题解决方案
一、将Action.Submit的inputValue作为初始用户输入并处理
- 模拟用户输入,对接CLU解析逻辑
当用户点击自适应卡片的Action.Submit按钮时,机器人收到的messageActivity中,value字段会包含你设置的inputValue。在onMessage处理器或对话前置逻辑里,把context.activity.text替换为这个inputValue,后续CLU解析逻辑就能直接读取该值,和处理用户手动输入的文本完全一致:
// 示例:在onMessage中处理Submit动作 async onMessage(context) { // 判定是否为自适应卡片的Submit触发事件 if (context.activity.value && context.activity.value.inputValue) { // 将inputValue赋值给activity.text,模拟用户主动输入 context.activity.text = context.activity.value.inputValue; } // 原CLU解析逻辑直接复用,读取context.activity.text即可 const cluResult = await this.cluRecognizer.recognize(context); // 后续意图/实体处理逻辑... }
- 是否需要绕过introStep
如果希望点击按钮后直接进入意图解析,跳过introStep的引导流程,可通过以下两种方式实现:
- Waterfall对话跳转:在对话的
onContinueDialog中判断是否存在inputValue,若存在则直接跳转到处理用户输入的目标步骤,比如mainStep:async onContinueDialog(innerDc) { const activity = innerDc.context.activity; if (activity.value && activity.value.inputValue) { // 替换当前对话,直接进入主处理步骤 return await innerDc.replaceDialog(this.mainDialogId, { input: activity.value.inputValue }); } return await super.onContinueDialog(innerDc); } - introStep内逻辑判断:在
introStep开头先检查inputValue,若存在则跳过引导直接进入后续处理:async introStep(stepContext) { const inputValue = stepContext.context.activity.value?.inputValue; if (inputValue) { // 将inputValue传入下一步,直接执行解析逻辑 return await stepContext.next(inputValue); } // 原introStep引导逻辑... }
二、自适应卡片填充用户输入框并由用户回车提交(Web Chat频道实现)
原生自适应卡片的Action.Submit不支持直接填充输入框,但可通过Web Chat的自定义中间件实现该需求:
- Web Chat客户端添加自定义中间件
通过Web Chat的store和middleware监听卡片事件,覆盖原生Submit按钮的默认行为,实现填充输入框的逻辑:
// Web Chat客户端代码示例 const store = window.WebChat.createStore({}, ({ dispatch }) => next => action => { if (action.type === 'DIRECT_LINE/INCOMING_ACTIVITY') { const activity = action.payload.activity; // 筛选包含自适应卡片的欢迎消息 if (activity.attachments && activity.attachments[0].contentType === 'application/vnd.microsoft.card.adaptive') { const adaptiveCard = activity.attachments[0].content; // 遍历卡片内的Action.Submit按钮,添加自定义点击逻辑 adaptiveCard.actions.forEach(action => { if (action.type === 'Action.Submit' && action.data.inputValue) { action.onExecute = (card, event) => { // 阻止默认的Submit提交行为 event.preventDefault(); // 定位Web Chat的输入框元素 const inputElement = document.querySelector('.webchat__send-box__input'); if (inputElement) { // 将inputValue填充到输入框 inputElement.value = action.data.inputValue; // 可选:自动触发回车提交(不需要则删除此行) inputElement.dispatchEvent(new KeyboardEvent('keydown', { key: 'Enter', bubbles: true })); } }; } }); } } return next(action); }); // 渲染Web Chat时传入自定义store window.WebChat.renderWebChat({ directLine: window.WebChat.createDirectLine({ token: 'YOUR_DIRECT_LINE_TOKEN' }), store: store }, document.getElementById('webchat'));
- 逻辑说明
- 通过
onExecute覆盖原生Submit按钮的默认行为,实现输入框填充; - 若不需要自动提交,仅保留填充输入框的逻辑即可,用户手动按下回车后,机器人会按照普通用户输入流程处理该文本。
内容的提问来源于stack exchange,提问作者shawn_WWW
相关产品推荐
相关产品推荐

