首页 > 解决方案 > Botframework v4 在部署后保留 dialogSet

问题描述

我正在使用 Microsoft bot 框架 v4。它的 DialogSet 始终保存在内存中,并且在代码重建(即部署)后会消失,因此恰好在重建之前的对话框中的现有对话,在部署完成后会出错(找不到所需的对话框)。

export class DialogBot extends ActivityHandler {


  private readonly conversationState: BotState;
  private readonly userState: BotState;
  private readonly dialogState: StatePropertyAccessor<DialogState>;
  private readonly nlpProcessor: NlpProcessor;
  private readonly dialogSet: DialogSet;
  private readonly cacheService: CacheService;
  private readonly mainProcessor: MainProcessors;

  constructor(conversationState: BotState, userState: BotState) {
    super();
    this.conversationState = conversationState;
    this.userState = userState;
    this.dialogState = this.conversationState.createProperty<DialogState>(
      'DialogState'
    );
    this.dialogSet = new DialogSet(this.dialogState);

您可以看到 dialogSet 在部署后总是启动新的

this.dialogSet = new DialogSet(this.dialogState);

虽然 dialogStack 被持久化到 dialogState 中,但它的 dialogs 数组不是

export class DialogSet {
    private readonly dialogs: { [id: string]: Dialog } = {};
    private readonly dialogState: StatePropertyAccessor<DialogState>;
    private _telemetryClient: BotTelemetryClient;
    private _version: string;

dialogs 数组只存在于内存中,其中包含堆栈引用的各个 Dialog 对象。一旦你重建代码,它就消失了。

我尝试扩展 DialogSet 类,并将其 dialogs 属性保存到 Blob 存储,但是,Blob 仅记录 json,并且没有正确重建 dialogs 数组(其中包含所有 Dialog 对象)。

任何人都有通过部署保留 DialogSet 状态的解决方案?提前谢谢了。

标签: node.jstypescriptchatbotbotframework

解决方案


对话集是静态的,与状态无关。对话集表示您的机器人可能开始的一组对话,而不是您的机器人在特定对话中实际开始的对话。每次您的机器人运行时,对话框集都应该相同,并且不应更改。以对话状态存储的对话堆栈是根据特定对话而变化的东西。

您应该始终在启动时将所有可能的对话添加到对话集中。这就是所有 Bot Framework 对话框的工作方式,任何不这样做的机器人都会被破坏。您可以在每个官方示例中看到这种模式(注意内部ComponentDialog.addDialog调用DialogSet.add)。没有在构建时未添加的对话框被调用。这可确保您的机器人在重新启动后工作。


推荐阅读