我正在开发一个使用QnA Maker服务的机器人,该服务使用了框架的Node.js版本。
我想通过包含动态内容来增强机器人提供的答案。我希望能够将[shortcode-thing]
替换为动态生成的内容。我有适当的代码可以识别和替换短代码。我迷路的地方是将其添加到对话流程中。
我使用QnAMakerDialog
类作为机器人与QnA Maker服务之间交互的核心。这样我就可以提供多轮回合的体验。
使用中间件有可能吗?如果是这样,我如何识别答案并更新答案的内容,以便将更新后的答案发送给用户?
或者,有没有办法扩展QnAMakerDialog
来拦截发送答案的动作?
答案 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 Logger和Spell Check Middleware之类的示例的。以及Middleware interface和SendActivitiesHandler文档。
正如其他人在评论中所提到的,我可以在QnAMakerDialog
中实现它。我遵循的是QnA Maker Sample,我认为它使我与潜在的QnA Maker交互有点抽象。尤其是我想利用SDK类喜欢的所有酷功能来提供多回合的体验。