Example #1
0
        /// <summary>
        /// Posts a question request to the QnA maker endpoint
        /// </summary>
        /// <param name="questionRequest">request payload to be sent to QnAService endpoint</param>
        /// <returns></returns>
        public async Task <AskQuestionResponse> GenerateAnswer(
            AskQuestionRequest questionRequest,
            QnaServiceDetails serviceDetails)
        {
            var requestUri = new Uri(
                serviceDetails.BaseEndpoint,
                $"knowledgebases/{serviceDetails.KnowledgeBaseId}/generateAnswer");

            using (var client = new HttpClient())
            {
                client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue(
                    "EndpointKey",
                    serviceDetails.EndpointKey);

                using (var response = await client.PostAsync(
                           requestUri,
                           new StringContent(
                               JsonConvert.SerializeObject(questionRequest),
                               Encoding.UTF8,
                               "application/json")))
                {
                    var responseContent = await response.Content.ReadAsStringAsync();

                    return(JsonConvert.DeserializeObject <AskQuestionResponse>(responseContent));
                };
            };
        }
Example #2
0
    public System.Nullable <int> AskQuestion(string @string)
    {
        AskQuestionRequest inValue = new AskQuestionRequest();

        inValue.@string = @string;
        AskQuestionResponse retVal = ((ISecuredService)(this)).AskQuestion(inValue);

        return(retVal.@int);
    }
Example #3
0
        private static async Task <string> ProcessQueryIntent(IDialogContext context, Activity activity, BotTask task, string query, string[] topics)
        {
            // Prepare the request to invoke a bot task within the bot brain
            AskQuestionRequest request = new AskQuestionRequest()
            {
                ConversationId                   = activity.Conversation.Id,
                Question                         = query,
                SessionId                        = DefaultSessionId,
                Topics                           = topics != null?topics.ToArray() : new string[0],
                                          UserId = string.IsNullOrEmpty(activity.From.Name) == false ? activity.From.Name : activity.From.Id
            };

            // Invoke the bot task to process the request
            AskQuestionResponse askQuestionResponse =
                await HttpClientUtility.PostAsJsonAsync <AskQuestionResponse>(new Uri(BotBrainUrl + task.ToString()), RequestHeaders, request);

            // Handle the response returned from the bot task to be shown as cards depending on channel
            if (askQuestionResponse.Results?.Count() > 0 == true)
            {
                IMessageActivity foundMsg = context.MakeMessage();

                AskQuestionResult result = askQuestionResponse.Results[0];

                if (string.IsNullOrEmpty(result.Source) == false)
                {
                    foundMsg.Text = string.Format("Got it. Meanwhile, from {0}:", result.Source);
                }
                else
                {
                    foundMsg.Text = "Got it. Meanwhile, here's what I found:";
                }

                await context.PostAsync(foundMsg);

                IMessageActivity cardMessage;

                string channelId = GetChannelId(activity);

                if (channelId == "directline" || channelId == "emulator")
                {
                    cardMessage = GetAdaptiveCardMessage(context, request, result);
                }
                else
                {
                    cardMessage = GetHeroCardMessage(context, request, result);
                }

                await context.PostAsync(cardMessage);
            }
            else
            {
                await PostAsync(context, activity, DoNotUnderstandPreMsg + " " + DoNotUnderstandMsg);
            }

            return("success");
        }
Example #4
0
        public static async Task <AskQuestionResponse> AnswerQuestion(AskQuestionRequest request, ICollector <SessionTableEntity> sessionTable)
        {
            // Get unique identifier
            string   id           = Guid.NewGuid().ToString();
            DateTime timestampUtc = DateTime.UtcNow;

            // Run keyphrases extraction
            request.Topics = await ServicesUtility.GetTopics(request.Question, request.Topics);

            // Run search services
            string queryWithTopics = request.Topics?.Count() > 0 ? string.Join(" ", request.Topics).Trim() : request.Question;

            // Process results
            AskQuestionResponse response = new AskQuestionResponse()
            {
                Id      = id,
                Results = new AskQuestionResult[0]
            };

            double confidenceScoreThreshold = 20;

            // Get results from QnA maker
            QnAMakerSearchResult qnaResult =
                await ServicesUtility.QnAMaker.GenerateAnswerAsync(queryWithTopics, SettingsUtility.QnAMakerWhoTaskKnowledgebaseId);

            if (qnaResult.Answers?.Where(a => a.Score >= confidenceScoreThreshold).Count() > 0)
            {
                response.Results = ServicesUtility.GetAskQuestionResults(qnaResult, confidenceScoreThreshold, true);
            }
            else
            {
                // Create Bing Search tasks
                BingWebSearchResult bingWebSearchResult =
                    await ServicesUtility.BingSearch.SearchWebAsync(query : request.Question, count : SettingsUtility.MaxResultsCount);

                // Process Bing search results
                if (bingWebSearchResult.WebPagesResult?.Values?.Count() > 0)
                {
                    response.Results = ServicesUtility.GetAskQuestionResults(bingWebSearchResult);
                }
            }

            // Write to session table
            sessionTable.Add(new SessionTableEntity(id, timestampUtc, "Who", request, response));

            // Return response
            return(response);
        }
            public static async Task <AskQuestionResponse> AnswerQuestion(AskQuestionRequest request, ICollector <SessionTableEntity> sessionTable)
            {
                // Get unique identifier
                string   id           = Guid.NewGuid().ToString();
                DateTime timestampUtc = DateTime.UtcNow;

                // Get key phrases extraction
                request.Topics = await ServicesUtility.GetTopics(request.Question, request.Topics);

                string queryWithTopics = request.Topics?.Count() > 0 ? string.Join(" ", request.Topics).Trim() : request.Question;

                // Create video indexer task
                VideoIndexerSearchResult videoIndexerResult = await ServicesUtility.VideoIndexer.SearchAsync(query : queryWithTopics);


                // Process results
                AskQuestionResponse response = new AskQuestionResponse()
                {
                    Id      = id,
                    Results = new AskQuestionResult[0]
                };

                if (videoIndexerResult.Results?.Count() > 0)
                {
                    response.Results = ServicesUtility.GetAskQuestionResults(videoIndexerResult);
                }
                else
                {
                    // Create Bing Search tasks
                    BingWebSearchResult bingWebSearchResult =
                        await ServicesUtility.BingSearch.SearchWebAsync(query : request.Question, count : SettingsUtility.MaxResultsCount);

                    // Process Bing search results
                    if (bingWebSearchResult.WebPagesResult?.Values?.Count() > 0)
                    {
                        response.Results = ServicesUtility.GetAskQuestionResults(bingWebSearchResult);
                    }
                }

                // Write to session table
                sessionTable.Add(new SessionTableEntity(id, timestampUtc, "LearnMore", request, response));

                // Return response
                return(response);
            }
Example #6
0
        private static IMessageActivity GetHeroCardMessage(IDialogContext context, AskQuestionRequest request, AskQuestionResult result)
        {
            // Create message
            IMessageActivity message = context.MakeMessage();

            // Create hero card
            HeroCard card = new HeroCard();

            if (string.IsNullOrEmpty(result.Title) == false)
            {
                card.Title = result.Title;
            }

            if (string.IsNullOrEmpty(result.Answer) == false)
            {
                card.Subtitle = result.Answer;
            }

            if (string.IsNullOrEmpty(result.ImageUrl) == false)
            {
                card.Images = new List <CardImage> {
                    new CardImage(url: result.ImageUrl)
                };
            }

            if (string.IsNullOrEmpty(result.Url) == false)
            {
                card.Buttons = new List <CardAction> {
                    new CardAction()
                    {
                        Value = result.Url,
                        Type  = "openUrl",
                        Title = string.IsNullOrEmpty(result.UrlDisplayName) == false ? result.UrlDisplayName : "Open Url"
                    }
                };
            }

            // Attach card to message
            message.Attachments.Add(card.ToAttachment());

            return(message);
        }
Example #7
0
        public async ValueTask <AskQuestionResult> AskQuestionYesNoAsync(AskQuestionRequest request)
        {
            using (Frame.CreateVisibleScope())
            {
                var viewModel = ViewModelBase.CreateViewModel <AskQuestionYesNoViewModel>(Frame);
                var nResult   = ViewModelBase.Navigate <AskQuestionYesNoPage>(viewModel, request);

                if (nResult.IsNavigate)
                {
                    while (viewModel.VisibilityPage != Visibility.Collapsed)
                    {
                        await Task.Delay(100);
                    }
                }

                return(new AskQuestionResult
                {
                    Answer = viewModel.Answer,
                });
            }
        }
Example #8
0
        public static async Task <HttpResponseMessage> Run(
            [HttpTrigger(AuthorizationLevel.Function, "post", Route = "AskWho")] HttpRequestMessage request,
            [Table("Session", Connection = "AzureWebJobsStorage")] ICollector <SessionTableEntity> sessionTable,
            TraceWriter log)
        {
            // Get content type
            MediaTypeHeaderValue contentType = request.Content.Headers.ContentType;

            // Check if content type is empty
            if (contentType == null)
            {
                return(request.CreateResponse(HttpStatusCode.BadRequest, "Missing content-type from header."));
            }
            else if (contentType.MediaType.Contains("application/json") == false)
            {
                return(request.CreateErrorResponse(HttpStatusCode.UnsupportedMediaType,
                                                   string.Format("Request's content type ({0}) is not supported.", string.Join(", ", contentType.MediaType))));
            }

            // Read content from request
            AskQuestionRequest requestBody = await request.Content.ReadAsAsync <AskQuestionRequest>();

            // Verify content contains valid values
            if (string.IsNullOrEmpty(requestBody.Question) == true)
            {
                return(request.CreateResponse(HttpStatusCode.BadRequest, "Question is missing from the request content."));
            }
            else if (string.IsNullOrEmpty(requestBody.SessionId) == true)
            {
                return(request.CreateResponse(HttpStatusCode.BadRequest, "Session id is missing from the request content."));
            }

            // Answer the question
            AskQuestionResponse response = await AnswerQuestion(requestBody, sessionTable);

            // Return request response with result and 200 OK
            return(request.CreateResponse(HttpStatusCode.OK, response));
        }
Example #9
0
        public static async Task <AskQuestionResponse> AnswerQuestion(AskQuestionRequest request, ICollector <SessionTableEntity> sessionTable)
        {
            // Get unique identifier
            string   id           = Guid.NewGuid().ToString();
            DateTime timestampUtc = DateTime.UtcNow;

            // Run keyphrases extraction
            request.Topics = await ServicesUtility.GetTopics(request.Question, request.Topics);

            // Run search services
            string queryWithTopics = request.Topics?.Count() > 0 ? string.Join(" ", request.Topics).Trim() : request.Question;

            // Create Bing Search task
            BingWebSearchResult bingWebSearchResult =
                await ServicesUtility.BingSearch.SearchWebAsync(query : request.Question, count : SettingsUtility.MaxResultsCount);

            // Process results
            AskQuestionResponse response = new AskQuestionResponse()
            {
                Id      = id,
                Results = new AskQuestionResult[0]
            };

            // Process Bing search results
            if (bingWebSearchResult.WebPagesResult?.Values?.Count() > 0)
            {
                response.Results = ServicesUtility.GetAskQuestionResults(bingWebSearchResult);
            }

            // Upload search document to dashboard
            await ServicesUtility.UploadDocumentToSearchService(SettingsUtility.AzureSearchIndexName, new SessionSearchDocument(id, timestampUtc, "AskQuestion", request, response));

            // Write to session table
            sessionTable.Add(new SessionTableEntity(id, timestampUtc, "Question", request, response));

            // Return response
            return(response);
        }
        public SessionSearchDocument(string id, DateTime timestampUtc, string task,
                                     AskQuestionRequest request, AskQuestionResponse response)
            : base(id)
        {
            this.SessionId      = request.SessionId;
            this.ConversationId = request.ConversationId;
            this.UserId         = request.UserId;
            this.Question       = request.Question;
            this.Task           = task;
            this.Topics         = request.Topics;
            this.TimestampUtc   = timestampUtc;

            if (response.Results?.Count() > 0)
            {
                this.AnswerTitle          = response.Results[0].Title;
                this.AnswerContent        = response.Results[0].Answer;
                this.AnswerImageUrl       = response.Results[0].ImageUrl;
                this.AnswerSource         = response.Results[0].Source;
                this.AnswerUrl            = response.Results[0].Url;
                this.AnswerUrlDisplayName = response.Results[0].UrlDisplayName;
            }

            this.IsAnswered = false;
        }
Example #11
0
        public AskQuestionResponse Post(AskQuestionRequest request)
        {
            byte[] bytes = Convert.FromBase64String(request.Bytes);
            var stream = new MemoryStream(bytes);

            Uri normal = SaveNormalImage(stream);
            Uri small = SaveSmallImage(stream);

            HashSet<string> tags = request.Tags.Select(tag => tag.ToLowerInvariant()).ToHashSet();
            string questionId = IdGenerator.Generate();

            var command = new AskQuestion
            {
                AggregateId = questionId,
                Body = request.Body,
                Tags = tags,
                AuthorId = TypedSession.UserId,
                ImageUri = normal.ToString(),
                ThumbnailUri = small.ToString(),
                CreatedAt = DateTime.UtcNow
            };

            SendCommand(command);

            return new AskQuestionResponse()
            {
                QuestionId = questionId
            };
        }
 public SessionTableEntity(string id, DateTime timestampUtc, string questionType, AskQuestionRequest request, AskQuestionResponse response)
 {
     this.PartitionKey   = request.SessionId;
     this.RowKey         = id;
     this.ConversationId = request.ConversationId;
     this.UserId         = request.UserId;
     this.Question       = request.Question;
     this.QuestionType   = questionType;
     this.Topics         = request.Topics?.Count() > 0 ? string.Join(";", request.Topics) : string.Empty;
     this.Timestamp      = timestampUtc;
     this.ResponseJson   = JsonConvert.SerializeObject(response);
 }
Example #13
0
 AskQuestionResponse ISecuredService.AskQuestion(AskQuestionRequest request)
 {
     return(base.Channel.AskQuestion(request));
 }
Example #14
0
        private static IMessageActivity GetAdaptiveCardMessage(IDialogContext context, AskQuestionRequest request, AskQuestionResult result)
        {
            // Create message
            IMessageActivity message = context.MakeMessage();

            // Create adaptive card
            AdaptiveCard card = new AdaptiveCard();

            if (string.IsNullOrEmpty(result.Title) == false)
            {
                card.Body.Add(new AdaptiveTextBlock()
                {
                    Text = result.Title,
                    Size = AdaptiveTextSize.Large,
                    HorizontalAlignment = AdaptiveHorizontalAlignment.Left,
                    IsSubtle            = false,
                    Weight = AdaptiveTextWeight.Bolder,
                    Wrap   = true
                });
            }

            if (string.IsNullOrEmpty(result.Answer) == false)
            {
                card.Body.Add(new AdaptiveTextBlock()
                {
                    Text = result.Answer,
                    Size = AdaptiveTextSize.Medium,
                    HorizontalAlignment = AdaptiveHorizontalAlignment.Left,
                    IsSubtle            = false,
                    Wrap = true
                });
            }

            if (string.IsNullOrEmpty(result.ImageUrl) == false)
            {
                AdaptiveImage currentImage = new AdaptiveImage();
                currentImage.Url  = new Uri(result.ImageUrl);
                currentImage.Size = AdaptiveImageSize.Stretch;
                card.Body.Add(currentImage);
            }

            if (string.IsNullOrEmpty(result.Url) == false)
            {
                card.Actions.Add(new AdaptiveOpenUrlAction()
                {
                    Title = string.IsNullOrEmpty(result.UrlDisplayName) == false ? result.UrlDisplayName : "Open Url...",
                    Url   = new Uri(result.Url)
                });
            }

            // Attach card to message
            Attachment attachment = new Attachment()
            {
                Content     = card,
                ContentType = "application/vnd.microsoft.card.adaptive"
            };

            message.Attachments.Add(attachment);

            return(message);
        }