public void QnAMakerTraceInfo_Serialization() { var qnaMakerTraceInfo = new QnAMakerTraceInfo { QueryResults = new QueryResult[] { new QueryResult { Questions = new string[] { "What's your name?" }, Answer = "My name is Mike", Score = 0.9F, }, }, KnowledgeBaseId = Guid.NewGuid().ToString(), ScoreThreshold = 0.5F, Top = 1, }; var serializerSettings = new JsonSerializerSettings { TypeNameHandling = TypeNameHandling.Auto }; var serialized = JsonConvert.SerializeObject(qnaMakerTraceInfo, serializerSettings); var deserialized = JsonConvert.DeserializeObject <QnAMakerTraceInfo>(serialized, serializerSettings); Assert.NotNull(deserialized); Assert.NotNull(deserialized.QueryResults); Assert.NotNull(deserialized.KnowledgeBaseId); Assert.Equal(0.5, deserialized.ScoreThreshold); Assert.Equal(1, deserialized.Top); Assert.Equal(qnaMakerTraceInfo.QueryResults[0].Questions[0], deserialized.QueryResults[0].Questions[0]); Assert.Equal(qnaMakerTraceInfo.QueryResults[0].Answer, deserialized.QueryResults[0].Answer); Assert.Equal(qnaMakerTraceInfo.KnowledgeBaseId, deserialized.KnowledgeBaseId); Assert.Equal(qnaMakerTraceInfo.ScoreThreshold, deserialized.ScoreThreshold); Assert.Equal(qnaMakerTraceInfo.Top, deserialized.Top); }
private async Task EmitTraceInfoAsync(ITurnContext turnContext, Activity messageActivity, QueryResult[] result, QnAMakerOptions options) { var traceInfo = new QnAMakerTraceInfo { Message = messageActivity, QueryResults = result, KnowledgeBaseId = _endpoint.KnowledgeBaseId, ScoreThreshold = options.ScoreThreshold, Top = options.Top, StrictFilters = options.StrictFilters, Context = options.Context, QnAId = options.QnAId, IsTest = options.IsTest, RankerType = options.RankerType, Filters = options.Filters, EnablePreciseAnswer = options.EnablePreciseAnswer, IncludeUnstructuredSources = options.IncludeUnstructuredSources }; var traceActivity = Activity.CreateTraceActivity(QnAMaker.QnAMakerName, QnAMaker.QnAMakerTraceType, traceInfo, QnAMaker.QnAMakerTraceLabel); await turnContext.SendActivityAsync(traceActivity).ConfigureAwait(false); }
public async Task QnaMaker_TraceActivity() { // Mock Qna var mockHttp = new MockHttpMessageHandler(); mockHttp.When(HttpMethod.Post, GetRequestUrl()) .Respond("application/json", GetResponse("QnaMaker_ReturnsAnswer.json")); var qna = GetQnAMaker(mockHttp, new QnAMakerEndpoint { KnowledgeBaseId = _knowlegeBaseId, EndpointKey = _endpointKey, Host = _hostname }, new QnAMakerOptions { Top = 1 }); // Invoke flow which uses mock var transcriptStore = new MemoryTranscriptStore(); TestAdapter adapter = new TestAdapter() .Use(new TranscriptLoggerMiddleware(transcriptStore)); string conversationId = null; await new TestFlow(adapter, async(context, ct) => { // Simulate Qna Lookup if (context?.Activity?.Text.CompareTo("how do I clean the stove?") == 0) { var results = await qna.GetAnswersAsync(context); Assert.IsNotNull(results); Assert.AreEqual(results.Length, 1, "should get one result"); StringAssert.StartsWith(results[0].Answer, "BaseCamp: You can use a damp rag to clean around the Power Pack"); } conversationId = context.Activity.Conversation.Id; var typingActivity = new Activity { Type = ActivityTypes.Typing, RelatesTo = context.Activity.RelatesTo }; await context.SendActivityAsync(typingActivity); await Task.Delay(500); await context.SendActivityAsync("echo:" + context.Activity.Text); }) .Send("how do I clean the stove?") .AssertReply((activity) => Assert.AreEqual(activity.Type, ActivityTypes.Typing)) .AssertReply("echo:how do I clean the stove?") .Send("bar") .AssertReply((activity) => Assert.AreEqual(activity.Type, ActivityTypes.Typing)) .AssertReply("echo:bar") .StartTestAsync(); // Validate Trace Activity created var pagedResult = await transcriptStore.GetTranscriptActivitiesAsync("test", conversationId); Assert.AreEqual(7, pagedResult.Items.Length); Assert.AreEqual("how do I clean the stove?", pagedResult.Items[0].AsMessageActivity().Text); Assert.IsTrue(pagedResult.Items[1].Type.CompareTo(ActivityTypes.Trace) == 0); QnAMakerTraceInfo traceInfo = ((JObject)((ITraceActivity)pagedResult.Items[1]).Value).ToObject <QnAMakerTraceInfo>(); Assert.IsNotNull(traceInfo); Assert.IsNotNull(pagedResult.Items[2].AsTypingActivity()); Assert.AreEqual("echo:how do I clean the stove?", pagedResult.Items[3].AsMessageActivity().Text); Assert.AreEqual("bar", pagedResult.Items[4].AsMessageActivity().Text); Assert.IsNotNull(pagedResult.Items[5].AsTypingActivity()); Assert.AreEqual("echo:bar", pagedResult.Items[6].AsMessageActivity().Text); foreach (var activity in pagedResult.Items) { Assert.IsTrue(!string.IsNullOrWhiteSpace(activity.Id)); Assert.IsTrue(activity.Timestamp > default(DateTimeOffset)); } }