/// <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(); }
/// <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 })); } }
/// <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); } }