Ejemplo n.º 1
0
        /// <summary>
        /// Add a single QnA pair to the database, and call EFQnARepository to
        /// add the pair to knowledgebase on QnAMaker.ai
        /// </summary>
        /// <param name="qna">the QnA to be added</param>
        /// <returns>true if added, false if not</returns>
        public async Task <bool> AddSingleQnAPairToBaseAsync(QnATrainBase qna)
        {
            var r = await qnaRepository.AddSingleQnAPairAsync(qna);

            if (r)
            {
                QnAPairs pair = new QnAPairs
                {
                    Query           = qna.Query,
                    Answer          = qna.Answer,
                    Dep             = qna.Dep,
                    KnowledgeBaseId = qna.KnowledgeBaseId,
                    Trained         = true,
                    TrainedDate     = DateTime.Now,
                    Published       = false,
                    PublishingType  = "add"
                };

                await db.AddAsync(pair);

                await db.SaveChangesAsync();

                return(true);
            }
            else
            {
                return(false);
            }
        }
        /// <summary>
        /// Delete the given QnAPair from the knowledgebase it belongs to
        /// </summary>
        /// <param name="qnaPair">QnAPair to be deleted</param>
        /// <returns><bool>True if ok, false if not</bool></returns>
        public async Task <bool> DeleteSingleQnAPairAsync(QnAPairs qnaPair)
        {
            var b = await Task.Run(() => db.QnAKnowledgeBase.FirstOrDefault(X => X.QnAKnowledgeBaseId == qnaPair.KnowledgeBaseId));

            var c = await Task.Run(() => db.QnABaseClass.FirstOrDefault(X => X.QnAId == b.QnABotId));

            var client = new HttpClient();

            client.DefaultRequestHeaders.Add("Ocp-Apim-Subscription-Key", c.subscriptionKey);

            string pair = "{'delete': {'qnaPairs': [{'answer': '" + qnaPair.Answer + "','question': '" + qnaPair.Query + "'}]},}";

            HttpResponseMessage response;

            var uri = b.AddQnAPairUrl;

            var         method  = new HttpMethod("PATCH");
            HttpContent content = new StringContent(pair, Encoding.UTF8, "application/json");
            var         request = new HttpRequestMessage(method, uri)
            {
                Content = content
            };

            response = await client.SendAsync(request);

            if (response.IsSuccessStatusCode)
            {
                return(true);
            }
            else
            {
                return(false);
            }
        }
        /// <summary>
        /// Download the given knowledgebase and return the QnAPairs found
        /// </summary>
        /// <param name="knowledgebase">knowledgebase id in database</param>
        /// <returns>QnAPairs found</returns>
        public async Task <List <QnAPairs> > DownloadKnowledgeBase(int knowledgebase)
        {
            var b = await Task.Run(() => db.QnAKnowledgeBase.FirstOrDefault(X => X.QnAKnowledgeBaseId == knowledgebase));

            var c = await Task.Run(() => db.QnABaseClass.FirstOrDefault(X => X.QnAId == b.QnABotId));

            var client = new HttpClient();

            client.DefaultRequestHeaders.Add("Ocp-Apim-Subscription-Key", c.subscriptionKey);

            var uri = b.PublishKnowledgeBaseUrl;

            HttpResponseMessage response;

            response = await client.GetAsync(uri);

            if (response.IsSuccessStatusCode)
            {
                string url = await response.Content.ReadAsStringAsync();

                string urlClean = url.Replace("\"", "");
                string result   = GetCSV(urlClean);

                var clean = result.Replace("Editorial", "\t");

                string[] temp = clean.Split("\t");
                temp[2] = temp[2].Replace("Source", "");
                for (int x = 2; x < temp.Count(); x++)
                {
                    temp[x] = temp[x].Trim();
                }
                result = temp.Count().ToString();
                List <QnAPairs> qnas = new List <QnAPairs>();
                int             i    = 2;
                while (i < temp.Count() - 1)
                {
                    var qna = new QnAPairs
                    {
                        Query           = temp[i],
                        Answer          = temp[i + 1],
                        Trained         = true,
                        Published       = true,
                        TrainedDate     = DateTime.Now,
                        PublishedDate   = DateTime.Now,
                        Dep             = "Web",
                        KnowledgeBaseId = b.QnAKnowledgeBaseId
                    };
                    qnas.Add(qna);
                    i = i + 3;
                }

                return(qnas);
            }
            else
            {
                return(null);
            }
            //throw new NotImplementedException();
        }
Ejemplo n.º 4
0
        /// <summary>
        /// Update a single QnAPair
        /// </summary>
        /// <param name="qna">QnA to update</param>
        /// <returns>true if updated, false if not</returns>
        public async Task <bool> UpdateQnAPairAsync(QnAPairs qna)
        {
            var q = await db.QnAPairs.FirstOrDefaultAsync(x => x.QnAPairsId == qna.QnAPairsId);

            q.Dep = qna.Dep;
            db.Update(q);
            if (await db.SaveChangesAsync() > 0)
            {
                return(true);
            }
            else
            {
                return(false);
            }
        }
        public async Task <IActionResult> EditQnAPair([FromForm][Bind("QnAPairsId", "Query", "Answer", "Dep", "KnowledgeBaseId")] QnAPairs qna)
        {
            var m = await chatbotRepository.UpdateQnAPairAsync(qna);

            if (ModelState.IsValid)
            {
                TempData["success"] = String.Format("QnA par ble oppdatert");
                return(RedirectToAction("ViewPublishedQnAPairs", new { id = qna.KnowledgeBaseId }));
            }
            else
            {
                TempData["error"] = String.Format("QnA par ble ikke oppdatert");
                return(RedirectToAction("ViewPublishedQnAPairs", new { id = qna.KnowledgeBaseId }));
            }
        }
Ejemplo n.º 6
0
        /// <summary>
        /// Check the local knowledgebase to the published knowledgebase and
        /// add the missing QnAPairs to the local db, if any are missing.
        /// This function is added since you can add QnA pairs on QnAMaker.ai. With this function you
        /// can get them and add them to the local db so you can manage them (delete, view)
        /// </summary>
        /// <param name="id">KnowledgeBase id in database</param>
        /// <returns>number of pairs added</returns>
        public async Task <int> VerifyLocalDbToPublishedDb(int id)
        {
            // Fetch all QnAPairs active in the knowledgbase
            var onlineQnA = await qnaRepository.DownloadKnowledgeBase(id);

            // If no where found, return -1. Something is wrong
            if (onlineQnA == null)
            {
                return(-1);
            }
            // Fetch local QnA
            var localQnA = await GetAllQnAPairsAsync(id);

            int  number  = 0;
            bool present = false;

            // If we already have some QnAPairs in local db
            if (localQnA.Count > 0)
            {
                foreach (QnAPairs external_qna in onlineQnA)
                {
                    for (int i = 0; i < onlineQnA.Count(); i++)
                    {
                        if (external_qna.Answer.ToLower().Equals(onlineQnA[i].Answer.ToLower()) &&
                            external_qna.Query.ToLower().Equals(onlineQnA[i].Query.ToLower()))
                        {
                            present = true;
                            break;
                        }
                    }
                    if (!present)
                    {
                        var newQnA = new QnAPairs
                        {
                            Query           = external_qna.Query,
                            Answer          = external_qna.Answer,
                            KnowledgeBaseId = id,
                            Trained         = true,
                            Published       = true,
                            PublishedDate   = DateTime.Now,
                            TrainedDate     = DateTime.Now,
                            Dep             = "Web-sync - Må oppdateres"
                        };
                        await db.AddAsync(newQnA);

                        await db.SaveChangesAsync();

                        number++;
                    }
                }
            }
            else // Or if we dont have any in the local db, just store them all. No need to check them
            {
                foreach (QnAPairs external_qna in onlineQnA)
                {
                    var newQnA = new QnAPairs
                    {
                        Query           = external_qna.Query,
                        Answer          = external_qna.Answer,
                        KnowledgeBaseId = id,
                        Trained         = true,
                        Published       = true,
                        PublishedDate   = DateTime.Now,
                        TrainedDate     = DateTime.Now,
                        Dep             = "Web-sync - Må oppdateres"
                    };
                    await db.AddAsync(newQnA);

                    await db.SaveChangesAsync();

                    number++;
                }
            }
            //update last edit for knowledgebase
            var b = await GetQnAKnowledgeBaseAsync(id);

            b.LastEdit = DateTime.Now;
            db.Update(b);
            db.SaveChanges();
            // Return result
            if (number > 0)
            {
                return(number);
            }
            else if (number == 0)
            {
                return(0);
            }
            else
            {
                return(-1);
            }
        }