Exemple #1
0
        public static async Task TrainEmptyModel()
        {
            var mockClient = new MockLuisClient();
            var builder    = GetTestLuisBuilder();

            builder.AppVersion = Guid.NewGuid().ToString();
            builder.LuisClient = mockClient;
            using (var luis = builder.Build())
            {
                var utterances = Array.Empty <Models.LabeledUtterance>();
                await luis.TrainAsync(utterances).ConfigureAwait(false);

                // Assert correct import request
                var importRequest = mockClient.Requests.FirstOrDefault(request => request.Method == nameof(ILuisClient.ImportVersionAsync));
                importRequest.Should().NotBeNull();
                importRequest.Arguments[2].Should().NotBeNull();
                var luisApp = importRequest.Arguments[2].As <LuisApp>();

                // Expects 3 intents
                luisApp.Intents.Count.Should().Be(1);
                luisApp.Intents.First().Name.Should().Be("None");

                // Assert train request
                var trainRequest = mockClient.Requests.FirstOrDefault(request => request.Method == nameof(ILuisClient.TrainAsync));
                trainRequest.Should().NotBeNull();

                // Assert publish request
                var publishRequest = mockClient.Requests.FirstOrDefault(request => request.Method == nameof(ILuisClient.PublishAppAsync));
                publishRequest.Should().NotBeNull();

                // Expects publish settings:
                publishRequest.Arguments[0].Should().Be(builder.AppId);
                publishRequest.Arguments[1].Should().Be(builder.AppVersion);
            }
        }
Exemple #2
0
        public static async Task TagsPrebuiltEntityWithReplacementName()
        {
            var text                = Guid.NewGuid().ToString();
            var entityTypeName1     = Guid.NewGuid().ToString();
            var entityTypeName2     = Guid.NewGuid().ToString();
            var prebuiltEntityTypes = new Dictionary <string, string>
            {
                { entityTypeName1, entityTypeName2 },
            };

            var mockClient = new MockLuisClient();
            var builder    = GetTestLuisBuilder();

            builder.LuisClient   = mockClient;
            builder.LuisSettings = new LuisSettings(prebuiltEntityTypes);

            using (var luis = builder.Build())
            {
                var entity1   = new Entity(entityTypeName1, null, text, 0);
                var entity2   = new Entity(entityTypeName2, null, text, 0);
                var utterance = new Models.LabeledUtterance(text, string.Empty, new[] { entity1, entity2 });
                await luis.TrainAsync(new[] { utterance }).ConfigureAwait(false);

                // Ensure LUIS app intent still has role
                var importRequest = mockClient.Requests.FirstOrDefault(request => request.Method == nameof(ILuisClient.ImportVersionAsync));
                importRequest.Should().NotBeNull();
                var luisApp = importRequest.Arguments[2].As <LuisApp>();
                luisApp.Utterances.Should().Contain(u => u.Text == text);
                luisApp.Utterances.First(u => u.Text == text).Entities.Count().Should().Be(2);
                luisApp.Utterances.First(u => u.Text == text).Entities.Should().Contain(e => e.Entity == entityTypeName2);
                luisApp.Utterances.First(u => u.Text == text).Entities.Should().Contain(e => e.Entity == entityTypeName2);
            }
        }
Exemple #3
0
        public static async Task WithLabeledIntentScore()
        {
            var test = "the quick brown fox jumped over the lazy dog";

            var mockClient = new MockLuisClient();

            mockClient.OnRequestResponse = request =>
            {
                if (request.Method == nameof(ILuisClient.QueryAsync))
                {
                    return(new LuisResult
                    {
                        Query = test,
                        TopScoringIntent = new IntentModel {
                            Intent = "intent", Score = 0.42
                        },
                    });
                }

                return(null);
            };

            var builder = GetTestLuisBuilder();

            builder.LuisClient = mockClient;

            using (var luis = builder.Build())
            {
                var result = await luis.TestAsync(test).ConfigureAwait(false);

                result.Should().BeOfType(typeof(ScoredLabeledUtterance));
                result.As <ScoredLabeledUtterance>().Score.Should().Be(0.42);
            }
        }
Exemple #4
0
        public static async Task CreatesAppIfAppIdNotProvided()
        {
            var appId      = Guid.NewGuid().ToString();
            var mockClient = new MockLuisClient();

            mockClient.OnRequestResponse = request =>
            {
                if (request.Method == nameof(ILuisClient.CreateAppAsync))
                {
                    return(appId);
                }

                return(null);
            };

            var builder = GetTestLuisBuilder();

            builder.LuisClient = mockClient;
            builder.AppId      = null;
            using (var luis = builder.Build())
            {
                await luis.TrainAsync(Array.Empty <Models.LabeledUtterance>()).ConfigureAwait(false);

                luis.LuisAppId.Should().Be(appId);
            }
        }
Exemple #5
0
        public static void TrainingFailedThrowsInvalidOperation()
        {
            var mockClient = new MockLuisClient();

            mockClient.OnRequestResponse = request =>
            {
                if (IsTrainingStatusRequest(request))
                {
                    return(new[]
                    {
                        new ModelTrainingInfo
                        {
                            Details = new ModelTrainingDetails {
                                Status = "Fail"
                            }
                        }
                    });
                }

                return(null);
            };

            var builder = GetTestLuisBuilder();

            builder.LuisClient = mockClient;

            using (var luis = builder.Build())
            {
                Func <Task> trainAsync = () => luis.TrainAsync(Array.Empty <Models.LabeledUtterance>());
                trainAsync.Should().Throw <InvalidOperationException>();
            }
        }
Exemple #6
0
        public static async Task TestWithPrebuiltEntity()
        {
            var test        = "the quick brown fox jumped over the lazy dog";
            var builtinType = Guid.NewGuid().ToString();
            var mockClient  = new MockLuisClient();

            mockClient.OnRequestResponse = request =>
            {
                if (request.Method == nameof(ILuisClient.QueryAsync))
                {
                    return(new LuisResult
                    {
                        Query = test,
                        TopScoringIntent = new IntentModel {
                            Intent = "intent"
                        },
                        Entities = new[]
                        {
                            new EntityModel
                            {
                                Entity = "the",
                                Type = "builtin.test",
                                StartIndex = 32,
                                EndIndex = 34
                            },
                        },
                    });
                }

                return(null);
            };

            var prebuiltEntityTypes = new Dictionary <string, string>
            {
                { "type", "test" },
            };

            var builder = GetTestLuisBuilder();

            builder.LuisClient   = mockClient;
            builder.LuisSettings = new LuisSettings(prebuiltEntityTypes);
            using (var luis = builder.Build())
            {
                var result = await luis.TestAsync(test).ConfigureAwait(false);

                result.Text.Should().Be(test);
                result.Intent.Should().Be("intent");
                result.Entities.Count.Should().Be(1);
                result.Entities[0].EntityType.Should().Be("type");
                result.Entities[0].EntityValue.Should().Be(default(string));
                result.Entities[0].MatchText.Should().Be("the");
                result.Entities[0].MatchIndex.Should().Be(1);
            }
        }
Exemple #7
0
        public static async Task TrainModelWithUtterancesAndSimpleEntities()
        {
            var mockClient = new MockLuisClient();
            var builder    = GetTestLuisBuilder();

            builder.LuisClient = mockClient;
            using (var luis = builder.Build())
            {
                var utterances = new[]
                {
                    new Models.LabeledUtterance(
                        "Book me a flight.",
                        "BookFlight",
                        new Entity[] { new Entity("Name", string.Empty, "me", 0) }),
                    new Models.LabeledUtterance(
                        "Cancel my flight.",
                        "CancelFlight",
                        new Entity[] { new Entity("Subject", string.Empty, "flight", 0) })
                };

                await luis.TrainAsync(utterances).ConfigureAwait(false);

                // Assert correct import request
                var importRequest = mockClient.Requests.FirstOrDefault(request => request.Method == nameof(ILuisClient.ImportVersionAsync));
                importRequest.Should().NotBeNull();
                var luisApp = importRequest.Arguments[2].As <LuisApp>();

                // Expects 3 intents
                luisApp.Intents.Count.Should().Be(3);
                luisApp.Intents.Should().Contain(intent => intent.Name == "None");
                luisApp.Intents.Should().Contain(intent => intent.Name == utterances[0].Intent);
                luisApp.Intents.Should().Contain(intent => intent.Name == utterances[1].Intent);

                // Expect 2 utterances
                luisApp.Utterances.Count.Should().Be(2);

                var bookUtterance = luisApp.Utterances.FirstOrDefault(utterance => utterance.Intent == utterances[0].Intent);
                bookUtterance.Should().NotBeNull();
                bookUtterance.Text.Should().Be(utterances[0].Text);
                bookUtterance.Entities.Count.Should().Be(1);
                bookUtterance.Entities.First().Entity.Should().Be(utterances[0].Entities[0].EntityType);
                bookUtterance.Entities.First().StartPos.Should().Be(5);
                bookUtterance.Entities.First().EndPos.Should().Be(6);

                var cancelUtterance = luisApp.Utterances.FirstOrDefault(utterance => utterance.Intent == utterances[1].Intent);
                cancelUtterance.Should().NotBeNull();
                cancelUtterance.Text.Should().Be(utterances[1].Text);
                cancelUtterance.Entities.Count.Should().Be(1);
                cancelUtterance.Entities.First().Entity.Should().Be(utterances[1].Entities[0].EntityType);
                cancelUtterance.Entities.First().StartPos.Should().Be(10);
                cancelUtterance.Entities.First().EndPos.Should().Be(15);
            }
        }
Exemple #8
0
        public static async Task CleanupModel()
        {
            var mockClient = new MockLuisClient();
            var builder    = GetTestLuisBuilder();

            builder.LuisClient = mockClient;
            using (var luis = builder.Build())
            {
                await luis.CleanupAsync().ConfigureAwait(false);

                var cleanupRequest = mockClient.Requests.FirstOrDefault(request => request.Method == nameof(ILuisClient.DeleteAppAsync));
                cleanupRequest.Should().NotBeNull();
            }
        }
Exemple #9
0
        public static async Task WithEntityScore()
        {
            var test = "the quick brown fox jumped over the lazy dog";

            var mockClient = new MockLuisClient();

            mockClient.OnRequestResponse = request =>
            {
                if (request.Method == nameof(ILuisClient.QueryAsync))
                {
                    return(new LuisResult
                    {
                        Query = test,
                        TopScoringIntent = new IntentModel {
                            Intent = "intent"
                        },
                        Entities = new[]
                        {
                            new EntityModel
                            {
                                Entity = "the",
                                Type = "type",
                                StartIndex = 32,
                                EndIndex = 34,
                                AdditionalProperties = new Dictionary <string, object>
                                {
                                    { "score", 0.42 },
                                },
                            },
                        },
                    });
                }

                return(null);
            };

            var builder = GetTestLuisBuilder();

            builder.LuisClient = mockClient;

            using (var luis = builder.Build())
            {
                var result = await luis.TestAsync(test).ConfigureAwait(false);

                result.Entities.Count.Should().Be(1);
                result.Entities[0].Should().BeOfType(typeof(ScoredEntity));
                result.Entities[0].As <ScoredEntity>().Score.Should().Be(0.42);
            }
        }
Exemple #10
0
        public static async Task TestSpeech()
        {
            var test = "the quick brown fox jumped over the lazy dog entity";

            var mockClient = new MockLuisClient();

            mockClient.OnRequestResponse = request =>
            {
                if (request.Method == nameof(ILuisClient.RecognizeSpeechAsync))
                {
                    return(new LuisResult
                    {
                        Query = test,
                        TopScoringIntent = new IntentModel {
                            Intent = "intent"
                        },
                        Entities = new[]
                        {
                            new EntityModel
                            {
                                Entity = "entity",
                                Type = "type",
                                StartIndex = 45,
                                EndIndex = 50,
                            },
                        },
                    });
                }

                return(null);
            };

            var builder = GetTestLuisBuilder();

            builder.LuisClient = mockClient;

            using (var luis = builder.Build())
            {
                var result = await luis.TestSpeechAsync("somefile").ConfigureAwait(false);

                result.Text.Should().Be(test);
                result.Intent.Should().Be("intent");
                result.Entities.Count.Should().Be(1);
                result.Entities[0].EntityType.Should().Be("type");

                result.Entities[0].MatchText.Should().Be("entity");
                result.Entities[0].MatchIndex.Should().Be(0);
            }
        }
Exemple #11
0
        public static async Task TrainingStatusDelayBetweenPolling()
        {
            var count = 0;

            string[] statusArray = { "Queued", "InProgress", "Success" };
            var      mockClient  = new MockLuisClient();

            mockClient.OnRequestResponse = request =>
            {
                if (IsTrainingStatusRequest(request))
                {
                    return(new[]
                    {
                        new ModelTrainingInfo
                        {
                            Details = new ModelTrainingDetails {
                                Status = statusArray[count++]
                            }
                        }
                    });
                }

                return(null);
            };

            var builder = GetTestLuisBuilder();

            builder.LuisClient = mockClient;

            using (var luis = builder.Build())
            {
                await luis.TrainAsync(Array.Empty <Models.LabeledUtterance>()).ConfigureAwait(false);

                // Ensure correct number of training status requests are made.
                mockClient.Requests.Where(IsTrainingStatusRequest).Count().Should().Be(statusArray.Length);

                // Ensure 2 second delay between requests
                var previousRequest = mockClient.TimestampedRequests.Where(t => IsTrainingStatusRequest(t.Instance)).First();
                for (var i = 1; i < statusArray.Length; ++i)
                {
                    var nextRequest    = mockClient.TimestampedRequests.Where(t => IsTrainingStatusRequest(t.Instance)).Skip(i).First();
                    var timeDifference = nextRequest.Timestamp - previousRequest.Timestamp;
                    previousRequest = nextRequest;
                    timeDifference.Should().BeGreaterThan(TimeSpan.FromSeconds(2) - Epsilon);
                }
            }
        }
Exemple #12
0
        public static async Task DoesNotOverwriteTemplateIntents()
        {
            var role        = Guid.NewGuid().ToString();
            var intentName  = Guid.NewGuid().ToString();
            var appTemplate = new LuisApp
            {
                ClosedLists = new List <ClosedList>(),
                Entities    = new List <HierarchicalModel>(),
                Intents     = new List <HierarchicalModel>
                {
                    new HierarchicalModel
                    {
                        Name  = intentName,
                        Roles = new List <string> {
                            role
                        },
                    },
                },
                ModelFeatures    = new List <JSONModelFeature>(),
                PrebuiltEntities = new List <PrebuiltEntity>(),
            };

            var mockClient = new MockLuisClient();
            var builder    = GetTestLuisBuilder();

            builder.LuisSettings = new LuisSettings(appTemplate);
            builder.LuisClient   = mockClient;
            using (var luis = builder.Build())
            {
                var utterance = new Models.LabeledUtterance(null, intentName, null);
                await luis.TrainAsync(new[] { utterance }).ConfigureAwait(false);

                // Ensure LUIS app intent still has role
                var importRequest = mockClient.Requests.FirstOrDefault(request => request.Method == nameof(ILuisClient.ImportVersionAsync));
                importRequest.Should().NotBeNull();
                var luisApp = importRequest.Arguments[2].As <LuisApp>();
                luisApp.Intents.Should().Contain(intent => intent.Name == intentName);
                luisApp.Intents.First(intent => intent.Name == intentName).Roles.Count.Should().Be(1);
                luisApp.Intents.First(intent => intent.Name == intentName).Roles.First().Should().Be(role);
            }
        }
Exemple #13
0
        public static async Task TestModelWithEntityResolution()
        {
            var test = "the quick brown fox jumped over the lazy dog";

            var mockClient = new MockLuisClient();

            mockClient.OnRequestResponse = request =>
            {
                if (request.Method == nameof(ILuisClient.QueryAsync))
                {
                    return(new LuisResult
                    {
                        Query = "the quick brown fox jumped over the lazy dog today",
                        Entities = new[]
                        {
                            new EntityModel
                            {
                                Entity = "today",
                                StartIndex = 45,
                                EndIndex = 49,
                                AdditionalProperties = new Dictionary <string, object>
                                {
                                    {
                                        "resolution",
                                        new JObject
                                        {
                                            { "values", new JArray {
                                                  new JObject {
                                                      { "value", "2018-11-16" }
                                                  }
                                              } },
                                        }
                                    },
                                },
                            },
                            new EntityModel
                            {
                                Entity = "brown fox",
                                StartIndex = 10,
                                EndIndex = 18,
                                AdditionalProperties = new Dictionary <string, object>
                                {
                                    { "resolution", new JObject {
                                          { "values", new JArray {
                                                "Fox"
                                            } }
                                      } },
                                },
                            },
                            new EntityModel
                            {
                                Entity = "the",
                                StartIndex = 0,
                                EndIndex = 2,
                                AdditionalProperties = new Dictionary <string, object>
                                {
                                    { "resolution", new JObject {
                                          { "value", "THE" }
                                      } },
                                },
                            }
                        }
                    });
                }

                return(null);
            };

            var builder = GetTestLuisBuilder();

            builder.LuisClient = mockClient;

            using (var luis = builder.Build())
            {
                var result = await luis.TestAsync(test).ConfigureAwait(false);

                result.Entities.Count.Should().Be(3);
                result.Entities[0].EntityValue.Should().Be("2018-11-16");
                result.Entities[1].EntityValue.Should().Be("Fox");
                result.Entities[2].EntityValue.Should().Be("THE");
            }
        }