Exemplo n.º 1
0
        public static StreamingRequest GetStreamingRequestWithoutAttachments(string conversationId)
        {
            var conId = string.IsNullOrWhiteSpace(conversationId) ? Guid.NewGuid().ToString() : conversationId;

            var request = new StreamingRequest()
            {
                Verb = "POST",
                Path = $"/v3/directline/conversations/{conId}/activities",
            };

            var activity = new Schema.Activity()
            {
                Type       = "message",
                Text       = "hello",
                ServiceUrl = "urn:test:namedpipe:testPipes",
                From       = new Schema.ChannelAccount()
                {
                    Id   = "123",
                    Name = "Fred",
                },
                Conversation = new Schema.ConversationAccount(null, null, conId, null, null, null, null),
            };

            request.SetBody(activity);

            return(request);
        }
Exemplo n.º 2
0
        public static StreamingRequest GetStreamingRequestWithAttachment(string conversationId)
        {
            var conId            = string.IsNullOrWhiteSpace(conversationId) ? Guid.NewGuid().ToString() : conversationId;
            var attachmentData   = "blah blah i am a stream!";
            var streamContent    = new MemoryStream(Encoding.UTF8.GetBytes(attachmentData));
            var attachmentStream = new AttachmentStream("botframework-stream", streamContent);

            var request = new StreamingRequest()
            {
                Verb = "POST",
                Path = $"/v3/directline/conversations/{conId}/activities",
            };
            var activity = new Schema.Activity()
            {
                Type       = "message",
                Text       = "hello",
                ServiceUrl = "urn:test:namedpipe:testPipes",
                From       = new Schema.ChannelAccount()
                {
                    Id   = "123",
                    Name = "Fred",
                },
                Conversation = new Schema.ConversationAccount(null, null, conId, null, null, null, null),
            };

            request.SetBody(activity);

            var contentStream = new StreamContent(attachmentStream.ContentStream);

            contentStream.Headers.TryAddWithoutValidation(HeaderNames.ContentType, attachmentStream.ContentType);
            request.AddStream(contentStream);

            return(request);
        }
        public async Task ItGetsUserAgentInfo()
        {
            // Arrange

            // Act
            var handler  = new StreamingRequestHandler(new MockBot(), new BotFrameworkHttpAdapter(), "fakePipe");
            var activity = new Schema.Activity()
            {
                Type = "message",
                Text = "received from bot",
                From = new Schema.ChannelAccount()
                {
                    Id   = "bot",
                    Name = "bot",
                },
                Conversation = new Schema.ConversationAccount(null, null, "testconvoid", null, null, null, null),
            };

            var payload             = new MemoryStream(Encoding.UTF8.GetBytes(JsonConvert.SerializeObject(activity, SerializationSettings.DefaultDeserializationSettings)));
            var fakeContentStreamId = Guid.NewGuid();
            var fakeContentStream   = new FakeContentStream(fakeContentStreamId, "application/json", payload);
            var testRequest         = new ReceiveRequest();

            testRequest.Path = "/api/version";
            testRequest.Verb = "GET";
            testRequest.Streams.Add(fakeContentStream);
            var response = await handler.ProcessRequestAsync(testRequest);

            // Assert
            Assert.NotNull(response);
        }
Exemplo n.º 4
0
        public async void ItGetsUserAgentInfo()
        {
            // Arrange
            var expectation = new Regex("{\"userAgent\":\"Microsoft-BotFramework\\/[0-9.]+\\s.*BotBuilder\\/[0-9.]+\\s+\\(.*\\)\".*}");

            // Act
            var handler  = new StreamingRequestHandler(new MockBot(), new BotFrameworkHttpAdapter(), Guid.NewGuid().ToString());
            var activity = new Schema.Activity()
            {
                Type = "message",
                Text = "received from bot",
                From = new Schema.ChannelAccount()
                {
                    Id   = "bot",
                    Name = "bot",
                },
                Conversation = new Schema.ConversationAccount(null, null, Guid.NewGuid().ToString(), null, null, null, null),
            };

            var payload             = new MemoryStream(Encoding.UTF8.GetBytes(JsonConvert.SerializeObject(activity, SerializationSettings.DefaultDeserializationSettings)));
            var fakeContentStreamId = Guid.NewGuid();
            var fakeContentStream   = new FakeContentStream(fakeContentStreamId, "application/json", payload);
            var testRequest         = new ReceiveRequest();

            testRequest.Path = "/api/version";
            testRequest.Verb = "GET";
            testRequest.Streams.Add(fakeContentStream);
            var response = await handler.ProcessRequestAsync(testRequest);

            // Assert
            Assert.Matches(expectation, response.Streams[0].Content.ReadAsStringAsync().Result);
        }
Exemplo n.º 5
0
        public void ShouldReturnEmptyFromContextActivityMissingChannel()
        {
            var testActivity = new Schema.Activity()
            {
                ChannelId = null
            };
            var testContext = new TurnContext(new BotFrameworkAdapter(new SimpleCredentialProvider()), testActivity);
            var channelId   = Channel.GetChannelId(testContext);

            Assert.AreEqual(channelId, string.Empty);
        }
Exemplo n.º 6
0
        public void ShouldReturnChannelIdFromContextActivity()
        {
            var testActivity = new Schema.Activity()
            {
                ChannelId = Channels.Facebook
            };
            var testContext = new TurnContext(new BotFrameworkAdapter(new SimpleCredentialProvider()), testActivity);
            var channelId   = Channel.GetChannelId(testContext);

            Assert.AreEqual(Channels.Facebook, channelId);
        }
Exemplo n.º 7
0
        public static Func <Schema.Activity, Task <InvokeResponse> > ProcessActivityWithAttachments(MockBot mockBot, Conversation conversation)
        {
            var attachmentStreamData = new List <string>();

            Func <Schema.Activity, Task <InvokeResponse> > processActivity = async(activity) =>
            {
                if (activity.Attachments != null)
                {
                    foreach (Schema.Attachment attachment in activity.Attachments)
                    {
                        if (attachment.ContentType.Contains("botframework-stream"))
                        {
                            var stream = attachment.Content as Stream;
                            using (var reader = new StreamReader(stream, Encoding.UTF8))
                            {
                                attachmentStreamData.Add(reader.ReadToEnd());
                            }

                            var testActivity = new Schema.Activity()
                            {
                                Type = "message",
                                Text = "received from bot",
                                From = new Schema.ChannelAccount()
                                {
                                    Id   = "bot",
                                    Name = "bot",
                                },
                                Conversation = new Schema.ConversationAccount(null, conversation.ConversationId, null),
                            };
                            var attachmentData1 = "blah blah i am a stream!";
                            var streamContent1  = new MemoryStream(Encoding.UTF8.GetBytes(attachmentData1));
                            var attachmentData2 = "blah blah i am also a stream!";
                            var streamContent2  = new MemoryStream(Encoding.UTF8.GetBytes(attachmentData2));
                            await mockBot.SendActivityAsync(testActivity, new List <AttachmentStream>()
                            {
                                new AttachmentStream("bot-stream1", streamContent1),
                            });

                            await mockBot.SendActivityAsync(testActivity, new List <AttachmentStream>()
                            {
                                new AttachmentStream("bot-stream2", streamContent2),
                            });
                        }
                    }
                }

                return(null);
            };

            return(processActivity);
        }
Exemplo n.º 8
0
        private static async Task MessageAsync()
        {
            if (_client == null || !_client.IsConnected)
            {
                WriteLine("[Program] Client is not connected, connect before sending messages.");
            }

            var text = AskUser("[Program] Enter text:");

            WriteLine($"[User]: {text}", ConsoleColor.Cyan);

            if (string.IsNullOrEmpty(_conversationId))
            {
                _conversationId = Guid.NewGuid().ToString();
            }

            var activity = new Schema.Activity()
            {
                Id   = Guid.NewGuid().ToString(),
                Type = ActivityTypes.Message,
                From = new ChannelAccount {
                    Id = "testUser"
                },
                Conversation = new ConversationAccount {
                    Id = _conversationId
                },
                Recipient = new ChannelAccount {
                    Id = "testBot"
                },
                ServiceUrl = "wss://InvalidServiceUrl/api/messages",
                ChannelId  = "Test",
                Text       = text,
            };

            var request = StreamingRequest.CreatePost("/api/messages", new StringContent(JsonConvert.SerializeObject(activity), Encoding.UTF8, "application/json"));

            var stopwatch = Stopwatch.StartNew();

            var response = await _client.SendAsync(request, CancellationToken.None);
        }
Exemplo n.º 9
0
        public async Task <Schema.ResourceResponse> SendActivityAsync(Schema.Activity activity, List <AttachmentStream> attachmentStreams = null)
        {
            SentActivities.Add(activity);

            var requestPath = $"/v3/conversations/{activity.Conversation?.Id}/activities/{activity.Id}";
            var request     = StreamingRequest.CreatePost(requestPath);

            request.SetBody(activity);
            attachmentStreams?.ForEach(a =>
            {
                var streamContent = new StreamContent(a.ContentStream);
                streamContent.Headers.TryAddWithoutValidation(HeaderNames.ContentType, a.ContentType);
                request.AddStream(streamContent);
            });

            var serverResponse = await _adapter.ProcessStreamingActivityAsync(activity, OnTurnAsync, CancellationToken.None).ConfigureAwait(false);

            if (serverResponse.Status == (int)HttpStatusCode.OK)
            {
                return(JsonConvert.DeserializeObject <Schema.ResourceResponse>(serverResponse.Body.ToString()));
            }

            throw new Exception("SendActivityAsync failed");
        }
Exemplo n.º 10
0
        /// <summary>
        /// Return recognition results.
        /// </summary>
        /// <param name="dc">Context object containing information for a single turn of conversation with a user.</param>
        /// <param name="activity">The incoming activity received from the user. The Text property value is used as the query text for QnA Maker.</param>
        /// <param name="cancellationToken">A cancellation token that can be used by other objects or threads to receive notice of cancellation.</param>
        /// <param name="telemetryProperties">Additional properties to be logged to telemetry with the LuisResult event.</param>
        /// <param name="telemetryMetrics">Additional metrics to be logged to telemetry with the LuisResult event.</param>
        /// <returns>A <see cref="RecognizerResult"/> containing the QnA Maker result.</returns>
        public override async Task <RecognizerResult> RecognizeAsync(DialogContext dc, Schema.Activity activity, CancellationToken cancellationToken, Dictionary <string, string> telemetryProperties = null, Dictionary <string, double> telemetryMetrics = null)
        {
            var text            = activity.Text ?? string.Empty;
            var detectAmbiguity = DetectAmbiguousIntents.GetValue(dc.State);

            _modelFolder  = ModelFolder.GetValue(dc.State);
            _snapshotFile = SnapshotFile.GetValue(dc.State);

            InitializeModel();

            var recognizerResult = new RecognizerResult()
            {
                Text    = text,
                Intents = new Dictionary <string, IntentScore>(),
            };

            if (string.IsNullOrWhiteSpace(text))
            {
                // nothing to recognize, return empty recognizerResult
                return(recognizerResult);
            }

            if (ExternalEntityRecognizer != null)
            {
                // Run external recognition
                var externalResults = await ExternalEntityRecognizer.RecognizeAsync(dc, activity, cancellationToken, telemetryProperties, telemetryMetrics).ConfigureAwait(false);

                recognizerResult.Entities = externalResults.Entities;
            }

            // Score with orchestrator
            var results = _resolver.Score(text);

            // Add full recognition result as a 'result' property
            recognizerResult.Properties.Add(ResultProperty, results);

            if (results.Any())
            {
                var topScore = results[0].Score;

                // if top scoring intent is less than threshold, return None
                if (topScore < UnknownIntentFilterScore)
                {
                    recognizerResult.Intents.Add(NoneIntent, new IntentScore()
                    {
                        Score = 1.0
                    });
                }
                else
                {
                    // add top score
                    recognizerResult.Intents.Add(results[0].Label.Name, new IntentScore()
                    {
                        Score = results[0].Score
                    });

                    // Disambiguate if configured
                    if (detectAmbiguity)
                    {
                        var thresholdScore   = DisambiguationScoreThreshold.GetValue(dc.State);
                        var classifyingScore = Math.Round(topScore, 2) - Math.Round(thresholdScore, 2);
                        var ambiguousResults = results.Where(item => item.Score >= classifyingScore).ToList();

                        if (ambiguousResults.Count > 1)
                        {
                            // create a RecognizerResult for each ambiguous result.
                            var recognizerResults = ambiguousResults.Select(result => new RecognizerResult()
                            {
                                Text        = text,
                                AlteredText = result.ClosestText,
                                Entities    = recognizerResult.Entities,
                                Properties  = recognizerResult.Properties,
                                Intents     = new Dictionary <string, IntentScore>()
                                {
                                    { result.Label.Name, new IntentScore()
                                      {
                                          Score = result.Score
                                      } }
                                },
                            });

                            // replace RecognizerResult with ChooseIntent => Ambiguous recognizerResults as candidates.
                            recognizerResult = CreateChooseIntentResult(recognizerResults.ToDictionary(result => Guid.NewGuid().ToString(), result => result));
                        }
                    }
                }
            }
            else
            {
                // Return 'None' if no intent matched.
                recognizerResult.Intents.Add(NoneIntent, new IntentScore()
                {
                    Score = 1.0
                });
            }

            await dc.Context.TraceActivityAsync($"{nameof(OrchestratorAdaptiveRecognizer)}Result", JObject.FromObject(recognizerResult), nameof(OrchestratorAdaptiveRecognizer), "Orchestrator Recognition", cancellationToken).ConfigureAwait(false);

            TrackRecognizerResult(dc, $"{nameof(OrchestratorAdaptiveRecognizer)}Result", FillRecognizerResultTelemetryProperties(recognizerResult, telemetryProperties, dc), telemetryMetrics);

            return(recognizerResult);
        }
Exemplo n.º 11
0
        private async Task RecognizeEntitiesAsync(DialogContext dialogContext, Schema.Activity activity, RecognizerResult recognizerResult)
        {
            var text       = activity.Text ?? string.Empty;
            var entityPool = new List <Entity>();

            if (EntityRecognizers != null)
            {
                // add entities from regexrecgonizer to the entities pool
                var textEntity = new TextEntity(text);
                textEntity.Properties["start"] = 0;
                textEntity.Properties["end"]   = text.Length;
                textEntity.Properties["score"] = 1.0;

                entityPool.Add(textEntity);

                // process entities using EntityRecognizerSet
                var entitySet   = new EntityRecognizerSet(EntityRecognizers);
                var newEntities = await entitySet.RecognizeEntitiesAsync(dialogContext, activity, entityPool).ConfigureAwait(false);

                if (newEntities.Any())
                {
                    entityPool.AddRange(newEntities);
                }

                entityPool.Remove(textEntity);
            }

            // map entityPool of Entity objects => RecognizerResult entity format
            recognizerResult.Entities = new JObject();

            foreach (var entityResult in entityPool)
            {
                // add value
                JToken values;
                if (!recognizerResult.Entities.TryGetValue(entityResult.Type, StringComparison.OrdinalIgnoreCase, out values))
                {
                    values = new JArray();
                    recognizerResult.Entities[entityResult.Type] = values;
                }

                // The Entity type names are not consistent, map everything to camelcase so we can process them cleaner.
                var entity = JObject.FromObject(entityResult);
                ((JArray)values).Add(entity.GetValue("text", StringComparison.InvariantCulture));

                // get/create $instance
                if (!recognizerResult.Entities.TryGetValue("$instance", StringComparison.OrdinalIgnoreCase, out JToken instanceRoot))
                {
                    instanceRoot = new JObject();
                    recognizerResult.Entities["$instance"] = instanceRoot;
                }

                // add instanceData
                if (!((JObject)instanceRoot).TryGetValue(entityResult.Type, StringComparison.OrdinalIgnoreCase, out JToken instanceData))
                {
                    instanceData = new JArray();
                    instanceRoot[entityResult.Type] = instanceData;
                }

                var instance = new JObject();
                instance.Add("startIndex", entity.GetValue("start", StringComparison.InvariantCulture));
                instance.Add("endIndex", entity.GetValue("end", StringComparison.InvariantCulture));
                instance.Add("score", (double)1.0);
                instance.Add("text", entity.GetValue("text", StringComparison.InvariantCulture));
                instance.Add("type", entity.GetValue("type", StringComparison.InvariantCulture));
                instance.Add("resolution", entity.GetValue("resolution", StringComparison.InvariantCulture));
                ((JArray)instanceData).Add(instance);
            }
        }
Exemplo n.º 12
0
        public Task <InvokeResponse> ProcessActivityAsync(Schema.Activity activity)
        {
            ReceivedActivities.Add(activity);

            return(_processActivityAsync(activity));
        }