private async Task <DialogTurnResult> CallGenerateAnswerAsync(WaterfallStepContext stepContext, CancellationToken cancellationToken) { var qnaMakerOptions = new QnAMakerOptions { ScoreThreshold = DefaultThreshold, Top = DefaultTopN, Context = new QnARequestContext(), QnAId = 0 }; var dialogOptions = GetDialogOptionsValue(stepContext); // Getting options if (dialogOptions.ContainsKey(QnAOptions)) { qnaMakerOptions = dialogOptions[QnAOptions] as QnAMakerOptions; qnaMakerOptions.ScoreThreshold = qnaMakerOptions?.ScoreThreshold ?? DefaultThreshold; qnaMakerOptions.Top = DefaultTopN; } // Storing the context info stepContext.Values[CurrentQuery] = stepContext.Context.Activity.Text; // -Check if previous context is present, if yes then put it with the query // -Check for id if query is present in reverse index. if (!dialogOptions.ContainsKey(QnAContextData)) { dialogOptions[QnAContextData] = new Dictionary <string, int>(); } else { var previousContextData = dialogOptions[QnAContextData] as Dictionary <string, int>; if (dialogOptions[PreviousQnAId] != null) { var previousQnAId = Convert.ToInt32(dialogOptions[PreviousQnAId]); if (previousQnAId > 0) { qnaMakerOptions.Context = new QnARequestContext { PreviousQnAId = previousQnAId }; qnaMakerOptions.QnAId = 0; if (previousContextData.TryGetValue(stepContext.Context.Activity.Text.ToLower(), out var currentQnAId)) { qnaMakerOptions.QnAId = currentQnAId; } } } } // Calling QnAMaker to get response. var response = await _qnaService.GetAnswersRawAsync(stepContext.Context, qnaMakerOptions).ConfigureAwait(false); // Resetting previous query. dialogOptions[PreviousQnAId] = -1; stepContext.ActiveDialog.State["options"] = dialogOptions; stepContext.Values[QnAData] = new List <QueryResult>(response.Answers); var result = new List <QueryResult>(); if (response.Answers.Any()) { result.Add(response.Answers.First()); } stepContext.Values[QnAData] = result; // If card is not shown, move to next step with top qna response. return(await stepContext.NextAsync(result, cancellationToken).ConfigureAwait(false)); }