在机器人将答案发送给用户之前,如何更新它?

时间:2020-07-16 06:22:01

标签: botframework qnamaker

我正在开发一个使用QnA Maker服务的机器人,该服务使用了框架的Node.js版本。

我想通过包含动态内容来增强机器人提供的答案。我希望能够将[shortcode-thing]替换为动态生成的内容。我有适当的代码可以识别和替换短代码。我迷路的地方是将其添加到对话流程中。

我使用QnAMakerDialog类作为机器人与QnA Maker服务之间交互的核心。这样我就可以提供多轮回合的体验。

使用中间件有可能吗?如果是这样,我如何识别答案并更新答案的内容,以便将更新后的答案发送给用户?

或者,有没有办法扩展QnAMakerDialog来拦截发送答案的动作?

1 个答案:

答案 0 :(得分:2)

我找到了一种达到预期效果的方法。

首先,我实现了一个用作中间件的类。例如:

class filterAnswer {
    /*
     * Called each time the bot receives a new request.
     */
    async onTurn( context, next ) {
  
      /*
       * Called each time a set of activities is sent.
       */
      context.onSendActivities( async function( _context, activities, next ) {
  
        // Loop through all of the activities in the stack.
        activities.forEach( activity => {
  
          // Only examine messages, ignore other types.
          if ( activity.type === "message" ) {
  
            // Ignore a message if it doesn't have any text.
            if ( activity.text !== undefined ) {
              
              let fixedText = activity.text;  
              
              // Do stuff to the text.

              // Assigm the text back to the activity.
              activity.text = fixedText;
  
            }
          }
        } );
  
        // Continuing processing activities by other middleware.
        await next();
  
      } );
  
      // Continue processing the request.
      await next();
    }
  
  }
}

然后我可以将我的自定义中间件添加到中间件列表中,如下所示:

const adapter = new BotFrameworkAdapter( {
  // bot configuration values
} ); 

// Add custom middleware
adapter.use( new filterAnswer() );

这是基于查看诸如Transcript LoggerSpell Check Middleware之类的示例的。以及Middleware interfaceSendActivitiesHandler文档。

正如其他人在评论中所提到的,我可以在QnAMakerDialog中实现它。我遵循的是QnA Maker Sample,我认为它使我与潜在的QnA Maker交互有点抽象。尤其是我想利用SDK类喜欢的所有酷功能来提供多回合的体验。