У нас есть простой бот, который использует диалоги, он работает нормально, но я недавно изменил его, чтобы использовать CosmosDB для хранения состояний, и теперь мы заметили, что dialogStack пуст.
Большая часть кода длябот был взят из примера BotFramework, найденного в репозитории samples .
Состояние пользователя точно обновляется для каждого сообщения, код инициализации выглядит следующим образом:
this.dialogState = conversationState.createProperty(DIALOG_STATE_PROPERTY);
this.dialogAccessor = userState.createProperty(DIALOG_PROPERTY);
this.dialogs = new DialogSet(this.dialogState);
this.dialogs.add(new GreetingDialog(GREETING_DIALOG, this.dialogAccessor));
this.dialogs.add(new PharmacyOrderDialog(PHARMACY_DIALOG, this.dialogAccessor));
this.conversationState = conversationState;
this.userState = userState;
Мы вызываем функцию saveChanges в конце onTurn:
await this.conversationState.saveChanges(context);
Я не могу найти никакой информации о том, что должно быть даже в объекте dialogStack, не говоря уже о решении того, что я считаю ошибкойв нашем коде.
Спасибо за любую помощь.
Редактируйте, добавляя функцию onTurn для большей ясности:
public onTurn = async (context: TurnContext) => {
if (context.activity.type === ActivityTypes.Message) {
if (context.activity.value) {
let useridFromCard = context.activity.value.useridList;
if (context.activity.value.useridList) {
useridFromCard = context.activity.value.useridList;
}
await this.dialogAccessor.set(context, new DialogDetails(useridFromCard));
}
let dialogResult: DialogTurnResult;
const dc = await this.dialogs.createContext(context);
const results = await this.luisRecognizer.recognize(context);
const topIntent = LuisRecognizer.topIntent(results);
const dialogDetails: DialogDetails = await this.dialogAccessor.get(context);
if (!dialogDetails) {
await this.dialogAccessor.set(context, new DialogDetails(ENVIRONMENT.USERID, results));
} else {
dialogDetails.luisResults = results;
await this.dialogAccessor.set(context, dialogDetails);
}
const interrupted = await this.isTurnInterrupted(dc, results);
if (interrupted) {
if (dc.activeDialog !== undefined) {
await dc.repromptDialog();
}
} else {
dialogResult = await dc.continueDialog();
}
if (!dc.context.responded) {
switch (dialogResult.status) {
case DialogTurnStatus.empty:
switch (topIntent) {
case GREETING_INTENT:
await dc.beginDialog(GREETING_DIALOG);
break;
case PHARMACY_INTENT:
await dc.beginDialog(PHARMACY_DIALOG);
break;
case NONE_INTENT:
await context.sendActivities(ResponseRandomizer.getRandomResponse(RANDOM_PHRASE_PATH, POST_GREETING_MESSAGE_PHRASE_KEY));
break;
default:
await dc.context.sendActivity("I didn't understand what you just said to me.");
break;
}
break;
case DialogTurnStatus.waiting:
// The active dialog is waiting for a response from the user, so do nothing.
break;
case DialogTurnStatus.complete:
// All child dialogs have ended. so do nothing.
break;
default:
// Unrecognized status from child dialog. Cancel all dialogs.
await dc.cancelAllDialogs();
break;
}
}
} else if (context.activity.type === ActivityTypes.ConversationUpdate) {
if (context.activity.membersAdded.length !== 0) {
for (const idx in context.activity.membersAdded) {
if (context.activity.membersAdded[idx].id !== context.activity.recipient.id) {
const welcomeCard = CardFactory.adaptiveCard(WelcomeCard);
await context.sendActivity({ attachments: [welcomeCard] });
await context.sendActivities(ResponseRandomizer.getRandomResponse
(RANDOM_PHRASE_PATH, WELCOME_MESSAGE_PHRASE_KEY));
const useridCard = CardFactory.adaptiveCard(USERIDCard);
await context.sendActivity({ attachments: [useridCard] });
}
}
}
}
await this.conversationState.saveChanges(context);
await this.userState.saveChanges(context);
}
Цените помощь всем.Может случиться так, что там никогда не должно быть ничего, что хранит информацию о том, как настроен наш бот, но я просто хочу убедиться, что это не ошибка с нашей стороны.