Ejemplo n.º 1
0
        private QueryResponse QueryQnA(QueryRequest request)
        {
            try
            {
                string uri = $"https://westus.api.cognitive.microsoft.com/qnamaker/v1.0/knowledgebases/a6b25d23-f807-4257-8d4e-1b31e4c93bce/generateAnswer";
                using (var aiCLient = new HttpClient())
                {
                    aiCLient.DefaultRequestHeaders.Add("Ocp-Apim-Subscription-Key", "65a01e9af16a4c78a0a736a10efb920f");
                    QnaRequest qna = new QnaRequest {
                        question = request.Query
                    };
                    var input      = JsonConvert.SerializeObject(qna);
                    var response   = aiCLient.PostAsync(uri, new StringContent(input.ToString(), Encoding.UTF8, "application/json"));
                    var dataString = response.Result.Content.ReadAsStringAsync();

                    QnaResponse data = JsonConvert.DeserializeObject <QnaResponse>(dataString.Result);
                    if (!string.IsNullOrEmpty(data?.answer ?? string.Empty))
                    {
                        return(new QueryResponse {
                            Response = data.answer, Intent = string.Empty, SessionId = request.SessionId
                        });
                    }
                    return(null);
                }
            }
            catch (Exception ex)
            {
                return(null);
            }
        }
Ejemplo n.º 2
0
        public async Task MessageReceivedAsync(IDialogContext context, IAwaitable <IMessageActivity> argument)
        {
            var message = await argument;

            /*
             * if (message.Text == "reset")
             * {
             *  PromptDialog.Confirm(
             *      context,
             *      AfterResetAsync,
             *      "Are you sure you want to reset the count?",
             *      "Didn't get that!",
             *      promptStyle: PromptStyle.Auto);
             * }
             * else
             * {
             *  await context.PostAsync($"{this.count++}: You said {message.Text}");
             *  context.Wait(MessageReceivedAsync);
             * }*/

            try
            {
                string kbId   = ConfigurationManager.AppSettings["QnaMaker.KbId"];
                string kbKey  = ConfigurationManager.AppSettings["QnaMaker.KbKey"];
                string qnaUrl =
                    $"https://westus.api.cognitive.microsoft.com/qnamaker/v2.0/knowledgebases/{kbId}/generateAnswer";
                HttpClient client    = new HttpClient();
                string     strtosend = message.Text;
                if (message.ChannelId == "email")
                {
                    var str    = strtosend.Split('\n');
                    int maxidx = str.Length;
                    if (maxidx > 3)
                    {
                        maxidx = 4;
                    }
                    for (int i = 0; i < maxidx; i++)
                    {
                        strtosend += str[i] + " ";
                    }
                }

                var json = new
                {
                    question = strtosend,
                    top      = 3
                };
                var content = new StringContent(JsonConvert.SerializeObject(json), Encoding.UTF8, "application/json");
                content.Headers.Add("Ocp-Apim-Subscription-Key", kbKey);
                HttpResponseMessage response = await client.PostAsync(qnaUrl, content);

                if (response.StatusCode == HttpStatusCode.OK)
                {
                    QnaResponse qnaResponse =
                        JsonConvert.DeserializeObject <QnaResponse>(await response.Content.ReadAsStringAsync());

                    if (qnaResponse.answers.Count == 0)
                    {
                        await context.PostAsync(
                            "Не могу найти информацию по теме.\n Могу ли еще чем-нибудь помочь из раздела QNA ?");

                        context.Done(true);
                    }
                    else if ((qnaResponse.answers.Count == 1) || (message.ChannelId == "email"))
                    {
                        await context.PostAsync(qnaResponse.answers.First().answer);

                        context.Done(true);
                    }
                    else
                    {
                        qnaResponse.answers.Add(new Answer()
                        {
                            answer    = "(exit)",
                            questions = new string[] { "Ничего из предложенного." }
                        });

                        PromptDialog.Choice <Answer>(context, OnSelectedAnswer,
                                                     qnaResponse.answers,
                                                     "Это то,что Вы искали ?",
                                                     descriptions: qnaResponse.answers.Select(x => Tools.UnEscapeXML(x.questions.First())),
                                                     promptStyle: PromptStyle.Auto
                                                     );
                    }
                }
                else
                {
                    await context.PostAsync(
                        "Что-то пошло не так. Вам необходимо задать этот вопрос оператору.");

                    context.Done(true);
                }
            }
            catch (Exception e)
            {
                // Write Log
                throw;
            }
        }
Ejemplo n.º 3
0
    public async Task SendQnaMessageAsync(ITurnContext turnContext, CancellationToken cancellationToken, QnaResponse qnaResponse)
    {
        var qnaResponseText = qnaResponse.Answers.First().Text;

        await SendMessageAsync(turnContext, cancellationToken, new Message {
            Text = qnaResponseText
        });
    }
Ejemplo n.º 4
0
        public virtual async Task MessageReceivedAsync(IDialogContext context, IAwaitable <IMessageActivity> item)
        {
            var message = await item;

            //if (message.Text == "no")
            //{
            //    context.Done(true);
            //}
            //else if (message.Text == "yes")
            //{
            //    await context.PostAsync("What do you want to find out?");
            //    context.Wait(MessageReceivedAsync);
            //}
            //else
            {
                string kbId   = ConfigurationManager.AppSettings["QnaMaker.KbId"];
                string kbKey  = ConfigurationManager.AppSettings["QnaMaker.KbKey"];
                string qnaUrl =
                    $"https://westus.api.cognitive.microsoft.com/qnamaker/v2.0/knowledgebases/{kbId}/generateAnswer";

                HttpClient client    = new HttpClient();
                string     strtosend = message.Text;
                if (message.ChannelId == "email")
                {
                    var str    = strtosend.Split('\n');
                    int maxidx = str.Length;
                    if (maxidx > 3)
                    {
                        maxidx = 4;
                    }
                    for (int i = 0; i < maxidx; i++)
                    {
                        strtosend += str[i] + " ";
                    }
                }

                var json = new
                {
                    question = strtosend,
                    top      = 3
                };
                var content = new StringContent(JsonConvert.SerializeObject(json), Encoding.UTF8, "application/json");
                content.Headers.Add("Ocp-Apim-Subscription-Key", kbKey);
                HttpResponseMessage response = await client.PostAsync(qnaUrl, content);

                if (response.StatusCode == HttpStatusCode.OK)
                {
                    QnaResponse qnaResponse =
                        JsonConvert.DeserializeObject <QnaResponse>(await response.Content.ReadAsStringAsync());

                    if (qnaResponse.answers.Count == 0)
                    {
                        await context.PostAsync(
                            "I couldn't find any information on the topic. \nAnything else from the QNA section I can help you with ?");

                        context.Done(true);
                    }
                    else if ((qnaResponse.answers.Count == 1) || (message.ChannelId == "email"))
                    {
                        await context.PostAsync(qnaResponse.answers.First().answer);

                        context.Done(true);
                    }
                    else
                    {
                        qnaResponse.answers.Add(new Answer()
                        {
                            answer    = "(exit)",
                            questions = new string[] { "None of the above." }
                        });

                        PromptDialog.Choice <Answer>(context, OnSelectedAnswer,
                                                     qnaResponse.answers,
                                                     "Is this what you were looking for ?",
                                                     descriptions: qnaResponse.answers.Select(x => x.questions.First()),
                                                     promptStyle: PromptStyle.Auto
                                                     );
                    }
                }
                else
                {
                    await context.PostAsync(
                        "Something went terribly wrong. You will have to figure this out by human interraction.");

                    context.Done(true);
                }
            }
        }
Ejemplo n.º 5
0
        private async Task PerformActionListAsync(ITurnContext turnContext, CancellationToken cancellationToken,
                                                  List <TriggerAction> actionList)
        {
            foreach (var action in actionList)
            {
                var userInput = turnContext.Activity.Text;

                if (action.Type == Model.ActionTypes.SendMessage)
                {
                    try
                    {
                        var message = this.dialogModel.Messages.Where(x => x.Id == action.MessageId).Select(x => x).First();
                        message.Text = message.Text.Replace("{input}", userInput);

                        await dialogMessageHandler.SendMessageAsync(turnContext, cancellationToken, message);
                    }
                    catch (System.Exception e)
                    {
                        throw new Exception("[DialogGenerator] Please check, if your messageIds match the actions.", e);
                    }
                }
                else if (action.Type == Model.ActionTypes.SendInitMessage)
                {
                    await dialogMessageHandler.SendInitialMessage(turnContext, cancellationToken);
                }
                else if (action.Type == Model.ActionTypes.SendQnaMessage)
                {
                    try
                    {
                        QnaResponse qnaResponse = await QnaMakerService.GetQnaResultAsync(
                            userInput,
                            dialogModel.QnaSettings.Host,
                            dialogModel.QnaSettings.Route,
                            dialogModel.QnaSettings.EndpointKey);

                        await dialogMessageHandler.SendQnaMessageAsync(turnContext, cancellationToken, qnaResponse);
                    }
                    catch (System.Exception e)
                    {
                        throw new Exception("[DialogGenerator] Qna Message failed to send properly.", e);
                    }
                }
                else if (action.Type == Model.ActionTypes.SendLuisMessage)
                {
                    try
                    {
                        LuisResponse luisResponse = await LuisService.GetLuisResultAsync(
                            userInput,
                            dialogModel.LuisSettings.Region,
                            dialogModel.LuisSettings.AppId,
                            dialogModel.LuisSettings.SubscriptionKey
                            );

                        var topIntent = luisResponse.TopScoringIntent;
                        if (topIntent.IntentIntent == "None" || topIntent.Score < dialogModel.LuisSettings.Threshold)
                        {
                            await dialogMessageHandler.SendDefaultMessage(turnContext, cancellationToken);
                        }
                        else
                        {
                            // Send the message specified in the dialog structure
                            var message = this.dialogModel.Messages.Where(x => x.Id == topIntent.IntentIntent).First();
                            message.Text = ReplaceWithLuisEntities(message.Text, luisResponse);

                            await dialogMessageHandler.SendMessageAsync(turnContext, cancellationToken, message);
                        }
                    }
                    catch (System.Exception e)
                    {
                        throw new Exception("[DialogGenerator] LUIS Message failed to send properly.", e);
                    }
                }
                else if (action.Type == Model.ActionTypes.SendAzureSearchMessage)
                {
                    try
                    {
                        string azureSearchResultJson = await AzureSearchService.GetAzureSearchAnswersAsync(
                            userInput,
                            dialogModel.AzureSearchSettings.HostUrl.ToString(),
                            dialogModel.AzureSearchSettings.EndpointKey
                            );

                        await dialogMessageHandler.SendAzureSearchResultAsync(
                            turnContext,
                            cancellationToken,
                            dialogModel.AzureSearchSettings.MessageMapping,
                            azureSearchResultJson
                            );
                    }
                    catch (System.Exception e)
                    {
                        throw new Exception("[DialogGenerator] Azure Search message failed to process.", e);
                    }
                }
                else if (action.Type == Model.ActionTypes.SendAzureSearchFilterMessage)
                {
                    try
                    {
                        // Perform an Azure Search filter and return results as string
                        string azureSearchResultJson = await AzureSearchService.GetAzureSearchFilterAnswersAsync(
                            action.Value,
                            action.Parameters,
                            _topicState.TopicStateStrings,
                            dialogModel.AzureSearchSettings.HostUrl.ToString(),
                            dialogModel.AzureSearchSettings.EndpointKey
                            );

                        // Send the results of the AzureSearchQuery
                        await dialogMessageHandler.SendAzureSearchResultAsync(
                            turnContext,
                            cancellationToken,
                            dialogModel.AzureSearchSettings.MessageMapping,
                            azureSearchResultJson
                            );
                    }
                    catch (System.Exception e)
                    {
                        throw new Exception("[DialogGenerator] Azure Search message failed to process.", e);
                    }
                }
                else if (action.Type == Model.ActionTypes.StoreState)
                {
                    try
                    {
                        _topicState.TopicStateStrings["dialogState"] = action.Value;
                    }
                    catch (System.Exception e)
                    {
                        throw new Exception("[DialogGenerator] State could not be stored properly.", e);
                    }
                }
                else if (action.Type == Model.ActionTypes.StoreCustomValue)
                {
                    try
                    {
                        // store the userInput in a state variable that is specified in the triggerAction of the dialog structure
                        _topicState.TopicStateStrings[action.Value] = userInput;
                    }
                    catch (System.Exception e)
                    {
                        throw new Exception("[DialogGenerator] State could not be stored properly.", e);
                    }
                }
                else
                {
                    await dialogMessageHandler.SendDefaultMessage(turnContext, cancellationToken);
                }
            }
        }