Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/security/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Botframework 如何在调度机器人和技能机器人之间保持状态?_Botframework - Fatal编程技术网

Botframework 如何在调度机器人和技能机器人之间保持状态?

Botframework 如何在调度机器人和技能机器人之间保持状态?,botframework,Botframework,我正在使用通过Microsoft的botframework解决方案Github存储库提供的虚拟助手模板,我很难在我们的主要入口点(一个开发的机器人,它实现了分派模型,以确定发送用户话语以供进一步处理的技能)和个人技能处理用户输入之间保持活动对话 我让我们的调度模型机器人通过main dialog.ts中的route方法来监听发送到localhost:3979/api/messages的帖子,以确定将用户的话语传递给,它接受用户的话语,并确定技能中应该使用哪个对话框来处理用户的话语。当我们开始一个

我正在使用通过Microsoft的
botframework解决方案
Github存储库提供的虚拟助手模板,我很难在我们的主要入口点(一个开发的机器人,它实现了分派模型,以确定发送用户话语以供进一步处理的技能)和个人技能处理用户输入之间保持活动对话

我让我们的调度模型机器人通过
main dialog.ts
中的
route
方法来监听发送到
localhost:3979/api/messages
的帖子,以确定将用户的话语传递给,它接受用户的话语,并确定技能中应该使用哪个对话框来处理用户的话语。当我们开始一个实现多步骤瀑布式对话框的对话框时,调度模型机器人没有跟踪技能机器人中活动的对话框,因此技能机器人不知道如何将用户的话语路由到已经活动的对话框。当我们直接发布到skill bot和dispatch model bot时,skill bot能够跟踪活动对话框,这使我相信我们没有正确管理dispatch bot和skill bot之间的状态

我注意到,我们正在使用的来自
botframework solutions
模板的虚拟助手和技能模板在其
defaultAdapter.ts
中实例化了
autosavestatembiddleware
的新实例,因此,会话和用户状态的读写似乎已经被自动管理了

分派机器人程序中的mainDialog.ts,将话语路由到适当的技能

受保护的异步路由(dc:DialogContext):承诺{
//获取区域设置的认知模型
const locale:string=i18next.language.substring(0,2);
const cognitiveModels:ICognitiveModelSet | undefined=this.services.cognitiveModelSets.get(locale);
if(认知模型===未定义){
抛出新错误(“认知模型中没有值”);
}
//检查调度结果
const dispatchResult:RecognizerResult=等待认知模型.dispatchService.recognize(dc.context);
const intent:string=LuisRecognizer.topIntent(dispatchResult);
if(this.settings.skills===未定义){
抛出新错误(“设置值中没有技能”);
}
//确定分派意图是否与技能中的任何动作匹配如果匹配,我们将转到相应的SkillDialog进行移交
const identifiedSkill:ISkillManifest | undefined=SkillRouter.isSkill(this.settings.skills,intent);
if(identifiedSkill!==未定义){
//我们已经确定了一个技能,因此初始化与目标技能的技能连接
等待dc.beginDialog(identifiedSkill.id);
//通过我们的活动
const result:DialogTurnResult=wait dc.continueDialog();
if(result.status==DialogTurnStatus.complete){
等待这个。完成(dc);
}
}否则如果(意图=='l_NOVA_general'){
//如果调度结果是通用luis模型
const luisService:luisrecognitertelemetryclient | undefined=认知模型.luisServices.get(this.luisServiceGeneral);
if(luisService==未定义){
抛出新错误('在Bot服务配置中找不到指定的LUIS模型');
}否则{
const result:RecognizerResult=await luisService.recognize(dc.context);
如果(结果!==未定义){
const generalitent:string=LuisRecognizer.topIntent(结果);
//打开总的意图
交换机(总机){
“升级”案例:{
//启动升级对话框
等待dc.beginDialog(升级对话框名称);
打破
}
案例“无”:
默认值:{
//未确定意图,请发送混淆的消息
等待这个.responder.replyWith(dc.context,MainResponses.responseIds.middle);
}
}
}
}
}否则{
//如果调度意图未映射到配置的模型,则发送“混乱”响应。
等待这个.responder.replyWith(dc.context,MainResponses.responseIds.middle);
}
}
以下代码来自技能机器人的
对话框bot.ts
,它将侦听所有
回合
事件

publicsynchturn(turnContext:turnContext,next:()=>Promise):Promise{
//通知此bot的客户端需要很长时间才能响应(超时)
if(turnContext.activity.code==EndOfConversationCodes.BotTimedOut){
此文件为.telemetryClient.trackTrace({
消息:`在${turnContext.activity.channelId}通道中超时:Bot花了太长时间来响应`,
严重级别:严重性。信息
});
返回;
}
const dc:DialogContext=wait this.dialogs.createContext(turnContext);
if(dc.activeDialog!==未定义){
const result:DialogTurnResult=wait dc.continueDialog();
}否则{
等待dc.beginDialog(this.rootDialogId);
}
等待下一个();
}
技能机器人中的
mainDialog.ts
,该机器人将路由到
索赔状态
瀑布式对话框

受保护的异步路由(dc:DialogContext):承诺{
//获取当前活动区域设置
const locale:string=i18next.language.substring(0,2);
const localeConfig:Partial | undefin