You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用Adaptive Card的Action.Submit模拟用户输入适配Core Bot

问题解决方案

一、将Action.Submit的inputValue作为初始用户输入并处理

  1. 模拟用户输入,对接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);
  // 后续意图/实体处理逻辑...
}
  1. 是否需要绕过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的自定义中间件实现该需求:

  1. 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'));
  1. 逻辑说明
  • 通过onExecute覆盖原生Submit按钮的默认行为,实现输入框填充;
  • 若不需要自动提交,仅保留填充输入框的逻辑即可,用户手动按下回车后,机器人会按照普通用户输入流程处理该文本。

内容的提问来源于stack exchange,提问作者shawn_WWW

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.24 23:33:11