From 853677c5b78454f1eb00c8db2a0ca0c6c5fef7a1 Mon Sep 17 00:00:00 2001 From: Sanoobk <53408701+Sanoobk@users.noreply.github.com> Date: Wed, 25 Sep 2019 10:09:15 +0000 Subject: [PATCH] Base Commit --- .gitattributes | 63 ++ .gitignore | 266 ++++++ BikeMike.sln | 25 + BikeMikeBot.csproj | 31 + Bots/BikeMikeBot.cs | 344 ++++++++ Controllers/BotController.cs | 35 + HelperFiles/Bikes.sql | 35 + HelperFiles/luis.json | 1006 ++++++++++++++++++++++ HelperFiles/searchindexschema.json | 196 +++++ Images/ComponentsConfiguration.PNG | Bin 0 -> 34405 bytes Images/IndexSchema.PNG | Bin 0 -> 28928 bytes Images/SolutionArchitectureMicrosoft.PNG | Bin 0 -> 34802 bytes Images/SolutionArchitectureUpdated.png | Bin 0 -> 39364 bytes Program.cs | 28 + Properties/launchSettings.json | 28 + README.md | 248 ++++++ Startup.cs | 65 ++ appsettings.json | 20 + wwwroot/default.html | 418 +++++++++ 19 files changed, 2808 insertions(+) create mode 100644 .gitattributes create mode 100644 .gitignore create mode 100644 BikeMike.sln create mode 100644 BikeMikeBot.csproj create mode 100644 Bots/BikeMikeBot.cs create mode 100644 Controllers/BotController.cs create mode 100644 HelperFiles/Bikes.sql create mode 100644 HelperFiles/luis.json create mode 100644 HelperFiles/searchindexschema.json create mode 100644 Images/ComponentsConfiguration.PNG create mode 100644 Images/IndexSchema.PNG create mode 100644 Images/SolutionArchitectureMicrosoft.PNG create mode 100644 Images/SolutionArchitectureUpdated.png create mode 100644 Program.cs create mode 100644 Properties/launchSettings.json create mode 100644 README.md create mode 100644 Startup.cs create mode 100644 appsettings.json create mode 100644 wwwroot/default.html diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000..1ff0c42 --- /dev/null +++ b/.gitattributes @@ -0,0 +1,63 @@ +############################################################################### +# Set default behavior to automatically normalize line endings. +############################################################################### +* text=auto + +############################################################################### +# Set default behavior for command prompt diff. +# +# This is need for earlier builds of msysgit that does not have it on by +# default for csharp files. +# Note: This is only used by command line +############################################################################### +#*.cs diff=csharp + +############################################################################### +# Set the merge driver for project and solution files +# +# Merging from the command prompt will add diff markers to the files if there +# are conflicts (Merging from VS is not affected by the settings below, in VS +# the diff markers are never inserted). Diff markers may cause the following +# file extensions to fail to load in VS. An alternative would be to treat +# these files as binary and thus will always conflict and require user +# intervention with every merge. To do so, just uncomment the entries below +############################################################################### +#*.sln merge=binary +#*.csproj merge=binary +#*.vbproj merge=binary +#*.vcxproj merge=binary +#*.vcproj merge=binary +#*.dbproj merge=binary +#*.fsproj merge=binary +#*.lsproj merge=binary +#*.wixproj merge=binary +#*.modelproj merge=binary +#*.sqlproj merge=binary +#*.wwaproj merge=binary + +############################################################################### +# behavior for image files +# +# image files are treated as binary by default. +############################################################################### +#*.jpg binary +#*.png binary +#*.gif binary + +############################################################################### +# diff behavior for common document formats +# +# Convert binary document formats to text before diffing them. This feature +# is only available from the command line. Turn it on by uncommenting the +# entries below. +############################################################################### +#*.doc diff=astextplain +#*.DOC diff=astextplain +#*.docx diff=astextplain +#*.DOCX diff=astextplain +#*.dot diff=astextplain +#*.DOT diff=astextplain +#*.pdf diff=astextplain +#*.PDF diff=astextplain +#*.rtf diff=astextplain +#*.RTF diff=astextplain diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..7eb3a7e --- /dev/null +++ b/.gitignore @@ -0,0 +1,266 @@ +## Ignore Visual Studio temporary files, build results, and +## files generated by popular Visual Studio add-ons. + +# ignore appsettings configuration files +**/appsettings.development.json +**/appsettings.staging.json +**/appsettings.production.json + +# User-specific files +*.suo +*.user +*.userosscache +*.sln.docstates + +# User-specific files (MonoDevelop/Xamarin Studio) +*.userprefs + +# Build results +[Dd]ebug/ +[Dd]ebugPublic/ +[Rr]elease/ +[Rr]eleases/ +x64/ +x86/ +bld/ +[Bb]in/ +[Oo]bj/ +[Ll]og/ + +# Visual Studio 2015 cache/options directory +.vs/ +# Uncomment if you have tasks that create the project's static files in wwwroot +#wwwroot/ + +# MSTest test Results +[Tt]est[Rr]esult*/ +[Bb]uild[Ll]og.* + +# NUNIT +*.VisualState.xml +TestResult.xml + +# Build Results of an ATL Project +[Dd]ebugPS/ +[Rr]eleasePS/ +dlldata.c + +# DNX +project.lock.json +project.fragment.lock.json +artifacts/ + +*_i.c +*_p.c +*_i.h +*.ilk +*.meta +*.obj +*.pch +*.pdb +*.pgc +*.pgd +*.rsp +*.sbr +*.tlb +*.tli +*.tlh +*.tmp +*.tmp_proj +*.log +*.vspscc +*.vssscc +.builds +*.pidb +*.svclog +*.scc + +# Chutzpah Test files +_Chutzpah* + +# Visual C++ cache files +ipch/ +*.aps +*.ncb +*.opendb +*.opensdf +*.sdf +*.cachefile +*.VC.db +*.VC.VC.opendb + +# Visual Studio profiler +*.psess +*.vsp +*.vspx +*.sap + +# TFS 2012 Local Workspace +$tf/ + +# Guidance Automation Toolkit +*.gpState + +# ReSharper is a .NET coding add-in +_ReSharper*/ +*.[Rr]e[Ss]harper +*.DotSettings.user + +# JustCode is a .NET coding add-in +.JustCode + +# TeamCity is a build add-in +_TeamCity* + +# DotCover is a Code Coverage Tool +*.dotCover + +# NCrunch +_NCrunch_* +.*crunch*.local.xml +nCrunchTemp_* + +# MightyMoose +*.mm.* +AutoTest.Net/ + +# Web workbench (sass) +.sass-cache/ + +# Installshield output folder +[Ee]xpress/ + +# DocProject is a documentation generator add-in +DocProject/buildhelp/ +DocProject/Help/*.HxT +DocProject/Help/*.HxC +DocProject/Help/*.hhc +DocProject/Help/*.hhk +DocProject/Help/*.hhp +DocProject/Help/Html2 +DocProject/Help/html + +# Click-Once directory +publish/ + +# Publish Web Output +*.[Pp]ublish.xml +*.azurePubxml +# TODO: Comment the next line if you want to checkin your web deploy settings +# but database connection strings (with potential passwords) will be unencrypted +*.pubxml +*.publishproj + +# Microsoft Azure Web App publish settings. Comment the next line if you want to +# checkin your Azure Web App publish settings, but sensitive information contained +# in these scripts will be unencrypted +PublishScripts/ + +# NuGet Packages +*.nupkg +# The packages folder can be ignored because of Package Restore +**/packages/* +# except build/, which is used as an MSBuild target. +!**/packages/build/ +# Uncomment if necessary however generally it will be regenerated when needed +#!**/packages/repositories.config +# NuGet v3's project.json files produces more ignoreable files +*.nuget.props +*.nuget.targets + +# Microsoft Azure Build Output +csx/ +*.build.csdef + +# Microsoft Azure Emulator +ecf/ +rcf/ + +# Windows Store app package directories and files +AppPackages/ +BundleArtifacts/ +Package.StoreAssociation.xml +_pkginfo.txt + +# Visual Studio cache files +# files ending in .cache can be ignored +*.[Cc]ache +# but keep track of directories ending in .cache +!*.[Cc]ache/ + +# Others +ClientBin/ +~$* +*~ +*.dbmdl +*.dbproj.schemaview +*.jfm +*.pfx +*.publishsettings +node_modules/ +orleans.codegen.cs + +# Since there are multiple workflows, uncomment next line to ignore bower_components +# (https://github.com/github/gitignore/pull/1529#issuecomment-104372622) +#bower_components/ + +# RIA/Silverlight projects +Generated_Code/ + +# Backup & report files from converting an old project file +# to a newer Visual Studio version. Backup files are not needed, +# because we have git ;-) +_UpgradeReport_Files/ +Backup*/ +UpgradeLog*.XML +UpgradeLog*.htm + +# SQL Server files +*.mdf +*.ldf + +# Business Intelligence projects +*.rdl.data +*.bim.layout +*.bim_*.settings + +# Microsoft Fakes +FakesAssemblies/ + +# GhostDoc plugin setting file +*.GhostDoc.xml + +# Node.js Tools for Visual Studio +.ntvs_analysis.dat + +# Visual Studio 6 build log +*.plg + +# Visual Studio 6 workspace options file +*.opt + +# Visual Studio LightSwitch build output +**/*.HTMLClient/GeneratedArtifacts +**/*.DesktopClient/GeneratedArtifacts +**/*.DesktopClient/ModelManifest.xml +**/*.Server/GeneratedArtifacts +**/*.Server/ModelManifest.xml +_Pvt_Extensions + +# Paket dependency manager +.paket/paket.exe +paket-files/ + +# FAKE - F# Make +.fake/ + +# JetBrains Rider +.idea/ +*.sln.iml + +# CodeRush +.cr/ + +# Python Tools for Visual Studio (PTVS) +__pycache__/ +*.pyc diff --git a/BikeMike.sln b/BikeMike.sln new file mode 100644 index 0000000..e2efa37 --- /dev/null +++ b/BikeMike.sln @@ -0,0 +1,25 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio 15 +VisualStudioVersion = 15.0.28307.757 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "BikeMikeBot", "BikeMikeBot.csproj", "{3DA11DBC-01E8-4B36-9C9D-7DBF75A27500}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {3DA11DBC-01E8-4B36-9C9D-7DBF75A27500}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {3DA11DBC-01E8-4B36-9C9D-7DBF75A27500}.Debug|Any CPU.Build.0 = Debug|Any CPU + {3DA11DBC-01E8-4B36-9C9D-7DBF75A27500}.Release|Any CPU.ActiveCfg = Release|Any CPU + {3DA11DBC-01E8-4B36-9C9D-7DBF75A27500}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {061CF036-8607-45BE-A9DC-DEFDFB8A17D9} + EndGlobalSection +EndGlobal diff --git a/BikeMikeBot.csproj b/BikeMikeBot.csproj new file mode 100644 index 0000000..c27e805 --- /dev/null +++ b/BikeMikeBot.csproj @@ -0,0 +1,31 @@ + + + + netcoreapp2.1 + latest + + BikeMike + BikeMike + BikeMike + BikeMike + + + + + + + + + + + + + + Always + + + Always + + + + diff --git a/Bots/BikeMikeBot.cs b/Bots/BikeMikeBot.cs new file mode 100644 index 0000000..13d8659 --- /dev/null +++ b/Bots/BikeMikeBot.cs @@ -0,0 +1,344 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. + +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Net; +using System.Text; +using System.Threading; +using System.Threading.Tasks; +using Microsoft.Azure.Search; +using Microsoft.Azure.Search.Models; +using Microsoft.Bot.Builder; +using Microsoft.Bot.Builder.Azure; +using Microsoft.Bot.Schema; +using Microsoft.Extensions.Configuration; +using Newtonsoft.Json; +using Newtonsoft.Json.Linq; + +namespace Microsoft.BotBuilderSamples.Bots +{ + public class BikeMikeBot : ActivityHandler + { + private static string CosmosServiceEndpoint = ""; + private static string CosmosDBKey = ""; + private static string CosmosDBDatabaseName = ""; + private static string CosmosDBCollectionName = ""; + private static string luisEndPoint = ""; + private static string searchServiceName = ""; + private static string queryApiKey = ""; + private static string indexName = ""; + + private IConfigurationRoot Configuration { get; } + private static CosmosDbStorage _myStorage; + private static SearchIndexClient indexClient; + + + public BikeMikeBot(IConfiguration config) + { + Configuration = config as IConfigurationRoot; + Load(); + } + + private void Load() + { + //Set all service settings from config files. + CosmosDBCollectionName = Configuration.GetValue("CosmosDBSettings:CosmosDBCollectionName"); + CosmosServiceEndpoint = Configuration.GetValue("CosmosDBSettings:CosmosServiceEndpoint"); + CosmosDBDatabaseName = Configuration.GetValue("CosmosDBSettings:CosmosDBDatabaseName"); + CosmosDBKey = Configuration.GetValue("CosmosDBSettings:CosmosDBKey"); + searchServiceName = Configuration.GetValue("AzureSearchSettings:searchServiceName"); + queryApiKey = Configuration.GetValue("AzureSearchSettings:queryApiKey"); + indexName = Configuration.GetValue("AzureSearchSettings:indexName"); + luisEndPoint = Configuration.GetValue("LuisSettings:luisEndPoint"); + + //Open connection with CosmosDB. + _myStorage = new CosmosDbStorage(new CosmosDbStorageOptions + { + AuthKey = CosmosDBKey, + CollectionId = CosmosDBCollectionName, + CosmosDBEndpoint = new Uri(CosmosServiceEndpoint), + DatabaseId = CosmosDBDatabaseName, + }); + + //Create a search index client object to interact with Azure Search Service. + indexClient = new SearchIndexClient( + searchServiceName, + indexName, + new SearchCredentials(queryApiKey)); + } + + + // Create cancellation token (used by Async Write operation). + public CancellationToken cancellationToken { get; private set; } + + // Class for storing a log of utterances (text of messages) as a list. + public class UtteranceLog : IStoreItem + { + // A list of things that users have said to the bot + public List UtteranceList { get; } = new List(); + + // The number of conversational turns that have occurred + public int TurnNumber { get; set; } = 0; + + // Create concurrency control where this is used. + public string ETag { get; set; } = "*"; + } + + + protected override async Task OnMessageActivityAsync(ITurnContext turnContext, CancellationToken cancellationToken) + { + // preserve user input. + var utterance = turnContext.Activity.Text; + // make empty local logitems list. + UtteranceLog logItems = null; + // Object to help in manipulating the search results object. + StringBuilder searchresults = new StringBuilder(); + + // see if there are previous messages saved in storage. + try + { + string[] utteranceList = { "UtteranceLog" }; + logItems = _myStorage.ReadAsync(utteranceList).Result?.FirstOrDefault().Value; + } + catch + { + // Inform the user an error occured. + await turnContext.SendActivityAsync( + Speak($"Echo: Sorry, something went wrong reading your stored messages!"), cancellationToken); + } + + // If no stored messages were found, create and store a new entry. + if (logItems is null) + { + // add the current utterance to a new object. + logItems = new UtteranceLog(); + logItems.UtteranceList.Add(utterance); + // set initial turn counter to 1. + logItems.TurnNumber++; + + await turnContext.SendActivityAsync(Speak($"Echo: {turnContext.Activity.Text}"), cancellationToken); + + // Create Dictionary object to hold received user messages. + var changes = new Dictionary(); + { + changes.Add("UtteranceLog", logItems); + } + try + { + // Save the user message to your Storage. + await _myStorage.WriteAsync(changes, cancellationToken); + } + catch + { + // Inform the user an error occured. + ProcessSpeechForResults(turnContext, + "Echo: Sorry, something went wrong reading your stored messages!", cancellationToken); + } + } + // Else, our Storage already contained saved user messages, add new one to the list. + else + { + // add new message to list of messages to display. + logItems.UtteranceList.Add(utterance); + // increment turn counter. + logItems.TurnNumber++; + + //Pass the utterance to the LUIS endpoint and furthur to Azure Search for processing. + DocumentSearchResult searchResults = await ProcessUserUtterance(utterance); + + //After LUIS and Azure Search processing, provide results if any back to the Bot. + + if (searchResults != null) + { + if (searchResults.Results.Count > 0) + { + searchResults.Results.ToList>() + .ForEach(x => + { + searchresults.Append("Bike " + x.Document["BikeName"].ToString() + " with price " + + x.Document["BaseRate"].ToString() + " Dollars and Color " + + x.Document["Color"].ToString() + ". "); + } + ); + ProcessSpeechForResults(turnContext, + searchresults.ToString(), cancellationToken); + } + else + ProcessSpeechForResults(turnContext, + "Echo: Sorry, unable to find any bikes. Please try a different query.", cancellationToken); + } + else + ProcessSpeechForResults(turnContext, + "Echo: Sorry, unable to find any bikes. Please try a different query.", cancellationToken); + + // Create Dictionary object to hold new list of messages. + var changes = new Dictionary(); + { + changes.Add("UtteranceLog", logItems); + }; + + try + { + // Save new list to your Storage. + await _myStorage.WriteAsync(changes, cancellationToken); + } + catch + { + // Inform the user an error occured. + ProcessSpeechForResults(turnContext, + "Echo: Sorry, something went wrong reading your stored messages!", cancellationToken); + } + } + } + + private async void ProcessSpeechForResults(ITurnContext turnContext, string message, CancellationToken cancellationToken) + { + //Speech property needed to be set for the Bot to read out to the user for voice based conversation. + await turnContext.SendActivityAsync( + Speak($"{message}"), cancellationToken); + } + + /// + /// Funcion to process the user utterance by passing the Azure Speech Service response to LUIS. + /// The response from LUIS is furthur processed to find the Intent of the user and then invoke the function to search or order bikes. + /// + /// + /// Azure Search Query Results as a list of dynamic objects. + private async Task> ProcessUserUtterance(string utterance) + { + dynamic LuisResponse; + var LuisIntents = new List(); + var LuisEntities = new List(); + dynamic LuisTopScoringIntent; + + var response = FecthLUISResponseAsync(luisEndPoint + utterance); + + if (response != null) + { + //Deserialize using Newtonsoft.json + LuisResponse = JsonConvert.DeserializeObject(response.Result); + + //fetch the Top Scoring Intent + LuisTopScoringIntent = LuisResponse.topScoringIntent; + + //Convert from Newtonsoft JArray + LuisIntents = (LuisResponse.intents as JArray).ToList(); + LuisEntities = (LuisResponse.entities as JArray).ToList(); + + var SearchEntities = new List(); + + //Based on the Intent from LUIS, invoke the function. + switch (LuisTopScoringIntent.intent) + { + case "BikeMike.GetLatestBikes": + return await AzureSearchQueryRequest(LuisEntities); + case "BikeMike.OrderBike": + return null; + default: + return null; + } + } + + return null; + } + + private async Task> AzureSearchQueryRequest(List luisEntities) + { + // Configure the search service and establish a connection. + + SearchParameters searchParameters; + DocumentSearchResult searchResults = null; + string filter = string.Empty; + + //Logic to build the search filter for the query. For this sample, limiting to only 2 entities. + foreach (var entity in luisEntities) + { + switch (entity.type.ToString()) + { + case "BikeMike.Color": + filter += filter.Length > 0 ? ($" AND Color eq '{entity.resolution.values[0].ToString()}'") : ($"Color eq '{entity.resolution.values[0].ToString()}'"); + break; + case "BikeMike.BikeTypes": + filter += filter.Length > 0 ? ($" AND Category eq '{entity.resolution.values[0].ToString()}'") : ($"Category eq '{entity.resolution.values[0].ToString()}'"); + break; + default: + break; + } + } + try + { + searchParameters = + new SearchParameters() + { + Filter = filter, + Select = new[] { "BikeName", "BaseRate", "Color" } + }; + + searchResults = (await indexClient.Documents.SearchAsync("*", searchParameters)); + } + catch (Exception ex) + { + } + + return searchResults; + } + + /// + /// Function to invoke the LUIS enpoint to fetch the Intents, Entities and Top Scoring Intent. + /// + /// + /// Response from LUIS in json format. + public async Task FecthLUISResponseAsync(string luisEndPoint) + { + HttpWebRequest request = (HttpWebRequest)WebRequest.Create(luisEndPoint); + request.AutomaticDecompression = DecompressionMethods.GZip | DecompressionMethods.Deflate; + + using (HttpWebResponse response = (HttpWebResponse)await request.GetResponseAsync()) + using (Stream stream = response.GetResponseStream()) + using (StreamReader reader = new StreamReader(stream)) + { + return await reader.ReadToEndAsync(); + } + } + + /// + /// Based on the Intent from LUIS to Order Bikes, invoke this function to Order a Bike based on values from Entities. + /// + /// + /// Response from LUIS in json format. + public async Task InsertDatatoSQLDB(dynamic Entities) + { + //To be implemented for Order Entity from LUIS + return string.Empty; + } + + protected override async Task OnMembersAddedAsync(IList membersAdded, ITurnContext turnContext, CancellationToken cancellationToken) + { + foreach (var member in membersAdded) + { + if (member.Id != turnContext.Activity.Recipient.Id) + { + await turnContext.SendActivityAsync(Speak($"Hello and welcome!"), cancellationToken); + } + } + } + + /// + /// Function to set the Speak property for the bot to read out user voice based utterances. + /// + /// + /// Activity object with the Speak property. + public IActivity Speak(string message) + { + var activity = MessageFactory.Text(message); + string body = @" + " + + $"{message}" + ""; + activity.Speak = body; + return activity; + } + } +} diff --git a/Controllers/BotController.cs b/Controllers/BotController.cs new file mode 100644 index 0000000..a98fffa --- /dev/null +++ b/Controllers/BotController.cs @@ -0,0 +1,35 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. + +using System.Threading.Tasks; +using Microsoft.AspNetCore.Mvc; +using Microsoft.Bot.Builder; +using Microsoft.Bot.Builder.Integration.AspNet.Core; + +namespace Microsoft.BotBuilderSamples.Controllers +{ + // This ASP Controller is created to handle a request. Dependency Injection will provide the Adapter and IBot + // implementation at runtime. Multiple different IBot implementations running at different endpoints can be + // achieved by specifying a more specific type for the bot constructor argument. + [Route("api/messages")] + [ApiController] + public class BotController : ControllerBase + { + private readonly IBotFrameworkHttpAdapter Adapter; + private readonly IBot Bot; + + public BotController(IBotFrameworkHttpAdapter adapter, IBot bot) + { + Adapter = adapter; + Bot = bot; + } + + [HttpGet, HttpPost] + public async Task ReceiveActivityAsync() + { + // Delegate the processing of the HTTP POST to the adapter. + // The adapter will invoke the bot. + await Adapter.ProcessAsync(Request, Response, Bot); + } + } +} diff --git a/HelperFiles/Bikes.sql b/HelperFiles/Bikes.sql new file mode 100644 index 0000000..3d108da --- /dev/null +++ b/HelperFiles/Bikes.sql @@ -0,0 +1,35 @@ +USE [IVRBotdB] +GO + +SET ANSI_NULLS ON +GO + +SET QUOTED_IDENTIFIER ON +GO + +CREATE TABLE [dbo].[Bikes] ( + [BikeId] NVARCHAR (450) NOT NULL, + [BaseRate] FLOAT (53) NULL, + [Category] NVARCHAR (MAX) NULL, + [Description] NVARCHAR (MAX) NULL, + [Description_fr] NVARCHAR (MAX) NULL, + [BikeName] NVARCHAR (MAX) NULL, + [Tags] NVARCHAR (MAX) NULL, + [IsDeleted] BIT NOT NULL, + [Color] NVARCHAR (MAX) NULL, + [Electric] BIT NULL, + [Rating] INT NULL, + [Date] DATETIME NULL, + [Location] [sys].[geography] NULL +); + + +GO +ALTER TABLE [dbo].[Bikes] ENABLE CHANGE_TRACKING WITH (TRACK_COLUMNS_UPDATED = ON); + +INSERT INTO [dbo].[Bikes] ([BikeId], [BaseRate], [Category], [Description], [Description_fr], [BikeName], [Tags], [IsDeleted], [Color], [Electric], [Rating], [Date], [Location]) VALUES (N'B001', 100, N'Mountain', N'Mountain bike', NULL, N'Mountain King', N'["Sporty","Tough"]', 0, N'Red', 0, 4, N'2018-12-12 00:00:00', NULL) +INSERT INTO [dbo].[Bikes] ([BikeId], [BaseRate], [Category], [Description], [Description_fr], [BikeName], [Tags], [IsDeleted], [Color], [Electric], [Rating], [Date], [Location]) VALUES (N'B002', 150, N'Mountain', N'Mountain bike', NULL, N'Mountain King', N'["Sporty","Tough"]', 0, N'Blue', 0, 4, N'2017-12-12 00:00:00', NULL) +INSERT INTO [dbo].[Bikes] ([BikeId], [BaseRate], [Category], [Description], [Description_fr], [BikeName], [Tags], [IsDeleted], [Color], [Electric], [Rating], [Date], [Location]) VALUES (N'B003', 350, N'Roadster', N'Road compatible bike', NULL, N'Road Tiger', N'["Simple","Elegant"]', 0, N'Green', 1, 5, N'2019-10-10 00:00:00', NULL) +INSERT INTO [dbo].[Bikes] ([BikeId], [BaseRate], [Category], [Description], [Description_fr], [BikeName], [Tags], [IsDeleted], [Color], [Electric], [Rating], [Date], [Location]) VALUES (N'B004', 500, N'Roadster', N'Road compatible bike with high electric efficiency', NULL, N'Road Tiger Plus', N'["Simple","Elegant","Power"]', 0, N'Blue', 1, 5, N'2019-10-06 00:00:00', NULL) + + diff --git a/HelperFiles/luis.json b/HelperFiles/luis.json new file mode 100644 index 0000000..7d10d8e --- /dev/null +++ b/HelperFiles/luis.json @@ -0,0 +1,1006 @@ +{ + "luis_schema_version": "4.0.0", + "versionId": "0.1", + "name": "BikeMikeLUIS", + "desc": "LUIS for BikeMike Bot", + "culture": "en-us", + "tokenizerVersion": "1.0.0", + "intents": [ + { + "name": "BikeMike.GetLatestBikes" + }, + { + "name": "BikeMike.OrderBike" + }, + { + "name": "None" + } + ], + "entities": [ + { + "name": "BikeMike.Latest", + "roles": [], + "hierarchyChildren": [] + }, + { + "name": "BikeMike.NumericalChange", + "roles": [], + "hierarchyChildren": [] + }, + { + "name": "HomeAutomation.Location", + "inherits": { + "domain_name": "HomeAutomation", + "model_name": "Location" + }, + "roles": [], + "hierarchyChildren": [] + }, + { + "name": "HomeAutomation.NumericalChange", + "inherits": { + "domain_name": "HomeAutomation", + "model_name": "NumericalChange" + }, + "roles": [], + "hierarchyChildren": [] + }, + { + "name": "HomeAutomation.Setting", + "inherits": { + "domain_name": "HomeAutomation", + "model_name": "Setting" + }, + "roles": [], + "hierarchyChildren": [] + }, + { + "name": "HomeAutomation.Unit", + "inherits": { + "domain_name": "HomeAutomation", + "model_name": "Unit" + }, + "roles": [], + "hierarchyChildren": [] + } + ], + "composites": [ + { + "name": "BikeMike.Order", + "children": [ + "BikeMike.Color", + "BikeMike.BikeTypes" + ], + "roles": [] + } + ], + "closedLists": [ + { + "name": "BikeMike.BikePrice", + "subLists": [ + { + "canonicalForm": "100", + "list": [ + "cheap" + ] + }, + { + "canonicalForm": "200", + "list": [] + }, + { + "canonicalForm": "300", + "list": [] + }, + { + "canonicalForm": "400", + "list": [] + }, + { + "canonicalForm": "500", + "list": [] + }, + { + "canonicalForm": "1000", + "list": [] + }, + { + "canonicalForm": "900", + "list": [] + } + ], + "roles": [] + }, + { + "name": "BikeMike.BikeTypes", + "subLists": [ + { + "canonicalForm": "Mountain", + "list": [] + }, + { + "canonicalForm": "Electric", + "list": [] + }, + { + "canonicalForm": "Normal", + "list": [] + } + ], + "roles": [] + }, + { + "name": "BikeMike.Color", + "subLists": [ + { + "canonicalForm": "Green", + "list": [] + }, + { + "canonicalForm": "Red", + "list": [] + }, + { + "canonicalForm": "pink", + "list": [] + }, + { + "canonicalForm": "yellow", + "list": [] + }, + { + "canonicalForm": "blue", + "list": [] + } + ], + "roles": [] + }, + { + "name": "BikeMike.PriceOperator", + "subLists": [ + { + "canonicalForm": "less than", + "list": [ + "greater than", + "equal to", + "less than or equal to", + "greater than or equal to" + ] + } + ], + "roles": [] + }, + { + "name": "HomeAutomation.DeviceName", + "inherits": { + "domain_name": "HomeAutomation", + "model_name": "DeviceName" + }, + "subLists": [ + { + "canonicalForm": "lamp 1", + "list": [ + "lamps 1" + ] + }, + { + "canonicalForm": "living room light", + "list": [] + }, + { + "canonicalForm": "kitchen light", + "list": [] + }, + { + "canonicalForm": "christmas tree light", + "list": [] + }, + { + "canonicalForm": "peppercorn lights", + "list": [] + }, + { + "canonicalForm": "ceiling lights", + "list": [] + }, + { + "canonicalForm": "living room lamp 1", + "list": [] + }, + { + "canonicalForm": "night sleep light", + "list": [] + }, + { + "canonicalForm": "fish pond light", + "list": [] + }, + { + "canonicalForm": "den light", + "list": [] + }, + { + "canonicalForm": "levis light", + "list": [] + }, + { + "canonicalForm": "light 31", + "list": [] + }, + { + "canonicalForm": "blue lights", + "list": [] + }, + { + "canonicalForm": "christmas lights", + "list": [] + }, + { + "canonicalForm": "tulip light", + "list": [ + "tulip lights" + ] + }, + { + "canonicalForm": "evening lights", + "list": [] + }, + { + "canonicalForm": "security system", + "list": [] + }, + { + "canonicalForm": "penelope's light", + "list": [] + }, + { + "canonicalForm": "siena's lamp", + "list": [] + }, + { + "canonicalForm": "dining lamp", + "list": [] + }, + { + "canonicalForm": "reading living room light", + "list": [] + }, + { + "canonicalForm": "sophia's light", + "list": [] + }, + { + "canonicalForm": "matthew lights", + "list": [] + }, + { + "canonicalForm": "steeple led bulb", + "list": [] + }, + { + "canonicalForm": "great light", + "list": [] + }, + { + "canonicalForm": "tulips light", + "list": [] + }, + { + "canonicalForm": "hue light", + "list": [] + }, + { + "canonicalForm": "lcd light", + "list": [] + }, + { + "canonicalForm": "pot light 2", + "list": [] + }, + { + "canonicalForm": "hue white lamp 3", + "list": [] + }, + { + "canonicalForm": "david thermo", + "list": [] + }, + { + "canonicalForm": "main light", + "list": [ + "main lamp" + ] + }, + { + "canonicalForm": "living room lamp 3", + "list": [] + }, + { + "canonicalForm": "hue lamp two", + "list": [] + }, + { + "canonicalForm": "kuelap light", + "list": [] + }, + { + "canonicalForm": "hue white lamp 1", + "list": [] + }, + { + "canonicalForm": "hallway lamp three", + "list": [] + }, + { + "canonicalForm": "david's light", + "list": [] + }, + { + "canonicalForm": "green light", + "list": [] + }, + { + "canonicalForm": "red light", + "list": [] + }, + { + "canonicalForm": "brake lights", + "list": [] + }, + { + "canonicalForm": "dream lights", + "list": [] + }, + { + "canonicalForm": "weekend lights", + "list": [] + }, + { + "canonicalForm": "lightstrip 3", + "list": [] + }, + { + "canonicalForm": "ceiling light", + "list": [] + }, + { + "canonicalForm": "bronze lamp", + "list": [] + }, + { + "canonicalForm": "thermostat three", + "list": [] + }, + { + "canonicalForm": "sink light two", + "list": [] + }, + { + "canonicalForm": "favorites lights", + "list": [] + }, + { + "canonicalForm": "tv light", + "list": [] + }, + { + "canonicalForm": "biube light", + "list": [] + }, + { + "canonicalForm": "couch light", + "list": [] + }, + { + "canonicalForm": "surface pro three", + "list": [ + "surface pro four" + ] + }, + { + "canonicalForm": "yellow lights", + "list": [ + "yellow light", + "yellow lamp", + "yellow lamps" + ] + }, + { + "canonicalForm": "night light", + "list": [] + }, + { + "canonicalForm": "dining thermostat", + "list": [] + } + ], + "roles": [] + }, + { + "name": "HomeAutomation.DeviceType", + "inherits": { + "domain_name": "HomeAutomation", + "model_name": "DeviceType" + }, + "subLists": [ + { + "canonicalForm": "ac", + "list": [ + "air conditioner", + "a/c", + "a / c", + "air conditioning", + "air condition" + ] + }, + { + "canonicalForm": "coffee maker", + "list": [ + "coffee pot", + "coffee machine" + ] + }, + { + "canonicalForm": "coffeemaker", + "list": [] + }, + { + "canonicalForm": "dish washer", + "list": [ + "dish washing machine", + "dish-washing machine" + ] + }, + { + "canonicalForm": "dishwasher", + "list": [] + }, + { + "canonicalForm": "dog feeder", + "list": [ + "feeder" + ] + }, + { + "canonicalForm": "dvd player", + "list": [ + "dvd players" + ] + }, + { + "canonicalForm": "fan", + "list": [ + "electric fan", + "fans", + "ceiling fan", + "light-fan" + ] + }, + { + "canonicalForm": "floor mopping robot", + "list": [] + }, + { + "canonicalForm": "ice maker", + "list": [] + }, + { + "canonicalForm": "lamp", + "list": [ + "lamps" + ] + }, + { + "canonicalForm": "light", + "list": [ + "lights", + "top light", + "top lights", + "bottom light", + "pendant light", + "overhead light", + "lighting", + "spotlights", + "pendant lights", + "nightlight" + ] + }, + { + "canonicalForm": "outlet", + "list": [ + "outlets", + "switches" + ] + }, + { + "canonicalForm": "radio", + "list": [] + }, + { + "canonicalForm": "refrigerator", + "list": [] + }, + { + "canonicalForm": "sensor", + "list": [] + }, + { + "canonicalForm": "thermostat", + "list": [] + }, + { + "canonicalForm": "tv", + "list": [ + "television" + ] + }, + { + "canonicalForm": "washing machine", + "list": [ + "washer" + ] + }, + { + "canonicalForm": "wifi", + "list": [ + "wifi router", + "router" + ] + }, + { + "canonicalForm": "led bulb", + "list": [] + }, + { + "canonicalForm": "oven", + "list": [ + "toaster" + ] + }, + { + "canonicalForm": "electric water heater", + "list": [] + }, + { + "canonicalForm": "microwave oven", + "list": [] + }, + { + "canonicalForm": "bread maker", + "list": [] + }, + { + "canonicalForm": "speaker", + "list": [] + }, + { + "canonicalForm": "fridge", + "list": [] + }, + { + "canonicalForm": "humidifier", + "list": [] + }, + { + "canonicalForm": "computer", + "list": [] + }, + { + "canonicalForm": "vacuum cleaner", + "list": [] + }, + { + "canonicalForm": "xbox", + "list": [] + }, + { + "canonicalForm": "hair dryer", + "list": [ + "dryer" + ] + }, + { + "canonicalForm": "telephone", + "list": [] + }, + { + "canonicalForm": "remote", + "list": [] + }, + { + "canonicalForm": "media", + "list": [ + "media console", + "movie" + ] + }, + { + "canonicalForm": "camera", + "list": [] + }, + { + "canonicalForm": "ipad", + "list": [ + "ipod" + ] + }, + { + "canonicalForm": "sink", + "list": [] + }, + { + "canonicalForm": "stove", + "list": [] + }, + { + "canonicalForm": "alarms", + "list": [ + "alarm" + ] + }, + { + "canonicalForm": "showers", + "list": [ + "shower" + ] + }, + { + "canonicalForm": "sprinkler", + "list": [ + "sprinklers" + ] + }, + { + "canonicalForm": "cars", + "list": [ + "car" + ] + }, + { + "canonicalForm": "heaters", + "list": [ + "heater" + ] + } + ], + "roles": [] + }, + { + "name": "HomeAutomation.Quantifier", + "inherits": { + "domain_name": "HomeAutomation", + "model_name": "Quantifier" + }, + "subLists": [ + { + "canonicalForm": "all", + "list": [] + }, + { + "canonicalForm": "any", + "list": [] + }, + { + "canonicalForm": "every", + "list": [] + }, + { + "canonicalForm": "everything", + "list": [] + } + ], + "roles": [] + }, + { + "name": "HomeAutomation.SettingType", + "inherits": { + "domain_name": "HomeAutomation", + "model_name": "SettingType" + }, + "subLists": [ + { + "canonicalForm": "backgrounds", + "list": [] + }, + { + "canonicalForm": "brightness", + "list": [] + }, + { + "canonicalForm": "cold", + "list": [] + }, + { + "canonicalForm": "color", + "list": [] + }, + { + "canonicalForm": "contrast", + "list": [] + }, + { + "canonicalForm": "distance", + "list": [] + }, + { + "canonicalForm": "heat", + "list": [] + }, + { + "canonicalForm": "hot", + "list": [] + }, + { + "canonicalForm": "hue", + "list": [] + }, + { + "canonicalForm": "humidity", + "list": [] + }, + { + "canonicalForm": "power levels", + "list": [ + "power level", + "power" + ] + }, + { + "canonicalForm": "saturation", + "list": [] + }, + { + "canonicalForm": "speed", + "list": [] + }, + { + "canonicalForm": "temperature", + "list": [ + "temp" + ] + }, + { + "canonicalForm": "time", + "list": [] + }, + { + "canonicalForm": "volume level", + "list": [ + "volume", + "sound", + "sounds" + ] + }, + { + "canonicalForm": "mode", + "list": [] + } + ], + "roles": [] + } + ], + "patternAnyEntities": [ + { + "name": "BikeMike.OrderNumber", + "roles": [], + "explicitList": [] + } + ], + "regex_entities": [], + "prebuiltEntities": [ + { + "name": "datetimeV2", + "roles": [ + "Duration", + "Time" + ] + }, + { + "name": "ordinal", + "roles": [] + } + ], + "model_features": [], + "regex_features": [], + "patterns": [], + "utterances": [ + { + "text": "buy blue mountain cheap bike", + "intent": "BikeMike.OrderBike", + "entities": [] + }, + { + "text": "buy cheap bike", + "intent": "BikeMike.OrderBike", + "entities": [] + }, + { + "text": "buy green bike", + "intent": "BikeMike.OrderBike", + "entities": [] + }, + { + "text": "buy motorbike", + "intent": "None", + "entities": [] + }, + { + "text": "create an order for a mountain bike price less than 1000 dollars and color blue", + "intent": "BikeMike.OrderBike", + "entities": [] + }, + { + "text": "get a mountain please", + "intent": "BikeMike.GetLatestBikes", + "entities": [] + }, + { + "text": "get green one", + "intent": "BikeMike.GetLatestBikes", + "entities": [] + }, + { + "text": "get latest bikes", + "intent": "BikeMike.GetLatestBikes", + "entities": [ + { + "entity": "BikeMike.Latest", + "startPos": 4, + "endPos": 9 + } + ] + }, + { + "text": "get me all types of bikes", + "intent": "BikeMike.GetLatestBikes", + "entities": [] + }, + { + "text": "get me electric bike price less than 100 dollars and color green", + "intent": "BikeMike.OrderBike", + "entities": [] + }, + { + "text": "get worlds fastest bike", + "intent": "None", + "entities": [] + }, + { + "text": "list aeroplanes", + "intent": "None", + "entities": [] + }, + { + "text": "list all green bikes", + "intent": "BikeMike.GetLatestBikes", + "entities": [] + }, + { + "text": "list all new motor", + "intent": "None", + "entities": [] + }, + { + "text": "list latest electric bikes", + "intent": "BikeMike.GetLatestBikes", + "entities": [ + { + "entity": "BikeMike.Latest", + "startPos": 5, + "endPos": 10 + } + ] + }, + { + "text": "list red ones", + "intent": "BikeMike.GetLatestBikes", + "entities": [] + }, + { + "text": "normal bike green color price around 300 dollars", + "intent": "BikeMike.OrderBike", + "entities": [] + }, + { + "text": "order a bike less than 200 dollars", + "intent": "BikeMike.OrderBike", + "entities": [] + }, + { + "text": "order a cheap electric bike", + "intent": "BikeMike.OrderBike", + "entities": [] + }, + { + "text": "order a green bike", + "intent": "BikeMike.OrderBike", + "entities": [] + }, + { + "text": "order a mountain bike with red color", + "intent": "BikeMike.OrderBike", + "entities": [] + }, + { + "text": "show a pink one please", + "intent": "BikeMike.GetLatestBikes", + "entities": [] + }, + { + "text": "show all bikes price less than 200", + "intent": "BikeMike.GetLatestBikes", + "entities": [] + }, + { + "text": "show all electric bikes", + "intent": "BikeMike.GetLatestBikes", + "entities": [] + }, + { + "text": "show cars", + "intent": "None", + "entities": [] + }, + { + "text": "show me all red ones", + "intent": "BikeMike.GetLatestBikes", + "entities": [] + }, + { + "text": "show me cheap bikes", + "intent": "BikeMike.GetLatestBikes", + "entities": [] + }, + { + "text": "show me list of all mountian bikes price less than 200 dollars", + "intent": "BikeMike.GetLatestBikes", + "entities": [] + }, + { + "text": "show mountain", + "intent": "BikeMike.GetLatestBikes", + "entities": [] + }, + { + "text": "show pink ones", + "intent": "BikeMike.GetLatestBikes", + "entities": [] + }, + { + "text": "what is a bike", + "intent": "None", + "entities": [] + }, + { + "text": "what is a motor", + "intent": "None", + "entities": [] + }, + { + "text": "what is plane", + "intent": "None", + "entities": [] + }, + { + "text": "what is your name", + "intent": "None", + "entities": [] + }, + { + "text": "which movie has this bike", + "intent": "None", + "entities": [] + }, + { + "text": "who is the father of this bike", + "intent": "None", + "entities": [] + }, + { + "text": "who is the mother of bikes", + "intent": "None", + "entities": [] + } + ], + "settings": [] +} \ No newline at end of file diff --git a/HelperFiles/searchindexschema.json b/HelperFiles/searchindexschema.json new file mode 100644 index 0000000..6b0bf3a --- /dev/null +++ b/HelperFiles/searchindexschema.json @@ -0,0 +1,196 @@ +{ + "name": "azuresql-index", + "fields": [ + { + "name": "BikeId", + "type": "Edm.String", + "facetable": false, + "filterable": false, + "key": true, + "retrievable": true, + "searchable": true, + "sortable": false, + "analyzer": "standard.lucene", + "indexAnalyzer": null, + "searchAnalyzer": null, + "synonymMaps": [], + "fields": [] + }, + { + "name": "BaseRate", + "type": "Edm.Double", + "facetable": false, + "filterable": true, + "retrievable": true, + "sortable": true, + "analyzer": null, + "indexAnalyzer": null, + "searchAnalyzer": null, + "synonymMaps": [], + "fields": [] + }, + { + "name": "Category", + "type": "Edm.String", + "facetable": true, + "filterable": true, + "key": false, + "retrievable": true, + "searchable": true, + "sortable": true, + "analyzer": "standard.lucene", + "indexAnalyzer": null, + "searchAnalyzer": null, + "synonymMaps": [], + "fields": [] + }, + { + "name": "Description", + "type": "Edm.String", + "facetable": false, + "filterable": false, + "key": false, + "retrievable": true, + "searchable": true, + "sortable": false, + "analyzer": "standard.lucene", + "indexAnalyzer": null, + "searchAnalyzer": null, + "synonymMaps": [], + "fields": [] + }, + { + "name": "Description_fr", + "type": "Edm.String", + "facetable": false, + "filterable": false, + "key": false, + "retrievable": false, + "searchable": false, + "sortable": false, + "analyzer": null, + "indexAnalyzer": null, + "searchAnalyzer": null, + "synonymMaps": [], + "fields": [] + }, + { + "name": "BikeName", + "type": "Edm.String", + "facetable": false, + "filterable": false, + "key": false, + "retrievable": true, + "searchable": true, + "sortable": true, + "analyzer": "standard.lucene", + "indexAnalyzer": null, + "searchAnalyzer": null, + "synonymMaps": [], + "fields": [] + }, + { + "name": "Tags", + "type": "Edm.String", + "facetable": true, + "filterable": true, + "key": false, + "retrievable": true, + "searchable": true, + "sortable": true, + "analyzer": "standard.lucene", + "indexAnalyzer": null, + "searchAnalyzer": null, + "synonymMaps": [], + "fields": [] + }, + { + "name": "IsDeleted", + "type": "Edm.Boolean", + "facetable": true, + "filterable": true, + "retrievable": true, + "sortable": true, + "analyzer": null, + "indexAnalyzer": null, + "searchAnalyzer": null, + "synonymMaps": [], + "fields": [] + }, + { + "name": "Color", + "type": "Edm.String", + "facetable": true, + "filterable": true, + "key": false, + "retrievable": true, + "searchable": true, + "sortable": true, + "analyzer": "standard.lucene", + "indexAnalyzer": null, + "searchAnalyzer": null, + "synonymMaps": [], + "fields": [] + }, + { + "name": "Electric", + "type": "Edm.Boolean", + "facetable": true, + "filterable": true, + "retrievable": true, + "sortable": true, + "analyzer": null, + "indexAnalyzer": null, + "searchAnalyzer": null, + "synonymMaps": [], + "fields": [] + }, + { + "name": "Rating", + "type": "Edm.Int32", + "facetable": true, + "filterable": true, + "retrievable": true, + "sortable": true, + "analyzer": null, + "indexAnalyzer": null, + "searchAnalyzer": null, + "synonymMaps": [], + "fields": [] + }, + { + "name": "Date", + "type": "Edm.DateTimeOffset", + "facetable": false, + "filterable": true, + "retrievable": true, + "sortable": true, + "analyzer": null, + "indexAnalyzer": null, + "searchAnalyzer": null, + "synonymMaps": [], + "fields": [] + }, + { + "name": "Location", + "type": "Edm.GeographyPoint", + "filterable": false, + "retrievable": false, + "sortable": false, + "analyzer": null, + "indexAnalyzer": null, + "searchAnalyzer": null, + "synonymMaps": [], + "fields": [] + } + ], + "suggesters": [], + "scoringProfiles": [], + "defaultScoringProfile": "", + "corsOptions": null, + "analyzers": [], + "charFilters": [], + "tokenFilters": [], + "tokenizers": [], + "@odata.etag": "\"xxxxxxxxxxxxxx\"" +} diff --git a/Images/ComponentsConfiguration.PNG b/Images/ComponentsConfiguration.PNG new file mode 100644 index 0000000000000000000000000000000000000000..b78b59e66b3ea89dd4fe7da3df603555433281d4 GIT binary patch literal 34405 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

t$3H z+OcZKKmY*w`LAQ)Mo=$rObd@(K9-k%Mdj+UlDUKZ`&DIL)1I=WL|S*G!jbIemXGhT zXX}cpCN-&@K7kp5?*LG;=`|H|{NcTz~srfNx@~vf3UtMq6w7+U!waIMcg<{aODXj+r zLsW{I1Hz%)Gy7Yp$?3HI#b+%Zn3TwmV}4tnGm#E(c&L_?a85!r_V6^SK1Tu4oF<(v z@A=%z!|$w<%f0kU!uP1)c437EPmImRXD7W}$*}huBR>%kCqOv=)&DGf4N0F~v6R~J z)A3&b09>^hwDA`}P5svelgZ;=uqj~xK#l*ued>**b0bP|aa?@Z*hySz@a$Nawl^-G zNe-*Z#xe6qaT}$}7hi~3jq9>LuS zKh1tW57Aou2j=2O%s2PHdqf;oTbv%q*{)In>oHad&z%X=q+y0B?raiE|FQTIF#Jb4SWw^e}V0x)YP4Fwr&AuICQlt4fDh1>ip~Z89Cms@N-2~Wm zxuDmmp3-q_1I^(@HsI7BgQ6lMje){+Yo6izK}9J0Mk(@4hv4@pZg3J%`e>RJr($Tf z%-}JOx#h&Kp5KUyR2WfG8fOL$RbJt++@@8*cjD5qxeojqiU(Ku0nUHU%?~-px_ZZx zAYyDU6Ea<$MiH9k4UXilTKsECIqhuMbFs!#Zw|GJpo=jiw^T3d97Qo!jGGS+;_a=^QEYn^9pxA}U@o-3mx-x}m_k3KkzRFaOQ z9c>^2@5puQ@U;3p5=GBsB9$a;meOhWcuj=$k>1l4NH{A}VZLURww*pz%rvI?ELLX& z-tzH^+8z)A0*=R~x|ux|J1|1Oup4X@mY>rPN{X5C8~f!tWr&ld0>Sd7?j1=%y!s7* zY(fKRM;glDaCy^2h|}ckc{_tvrvQOaue8az1e&_D<+qmpd8RPMHXu7$Jo`>na7i2% z1|LAY^64}M{P^>pMru)GnXWMn05`a%uk)?cs9DJn8&2{N z0&E}r@3e2C%}toLcvU=^1;wyrbtt&_5vSfgE4wpyh@e58WheSL$S|TVQoK%AO`2}P z-A6gfp-A#&J2dHVjD$doZoV5;@640p{sV=_os#c=L`dLBWlO9t2yO4Z2c7`WI$IPn z&SWKbijLQ6qm%8ByggNprI1SM-l2&YYf;Bukk(3vCqgr z!{dfCaQy##=o;^cDSZ8Bdv(O!xT@ne)2)^4gw9nt&J>|(#+ERp>yzx*+d68KI#uFy zLs}AQO>-AIT(qnJTSAtvxX(fF=D(fKO<7Fq!hA2Ev1wKowIDH|?bQZUTk&Vdk1b5P zbbE=7%yW!9VfR&;#&I=n6C=VOhHAUVil~)C#ImJTgdIZ7 z-m#T+y2FW@Uw?ee=S1roOn#@Ia-xs!x0zhbyc*(JvrZzhZgSZLJeGsAPm|+D2`-dX zz4V2m)f?FF>ZtwvZng?$Pl*dqIr2SD6&|N!jv{CznPJ0;PJ?aBHH$rX`uw6NVUteU z*pLF{*G%7@rhlhAnzk#el^YRN?~7?mPSFiz8%~C<6*J&6nqs<|yczv^SXB#EC}_hJ z#}%7r`*LH-3*5x>5+epcCHiXnu|sIJ1O2+*_S=zsA(B$ldsWy~{LCBK&tA>JUUxCi z^werH(ku1G`})W)ItAM?af^1Co8^PLutWG3n3R?%*!DHl%qLa+9_zu93^?p7XKce- zUnm!Z7b0>6rVEu-IgCtl8Yt`07gf!Iy{CeL&+Eic5-W?Il4Cw1X54&6X#?uMMr+T( zgd9XlO+&?6_Z5t4g_iP_F-un8h!B9iQ+Ke;#W9D-M1||d@Dh&et~E{{mK3w>nfs__YaT4Zg!MtLATC(-jvE4a*O zyvr)PauagQrIdlKBSMbPyIqJ++kMN8V*45iLx8d@MbRl78m3RK^7tn$RbOzuVIpP_ zy$7jOi~30Z-ts-hz+fy}j1!C+eK9b5wkAFuuPH}4;TJ}@DAV1vVG03p)m+cTeGw54 z&PZ7%7+H%)*Mh^3ij~O*^zTJ)5h^EeG1_;+M&e=HZ-%b|PwBJ|s9z)om4@Fx=C`im z`H#?v`M-t!rdiaf%++#rfUB4d{H2rUqE}2>=MHh%%*c1aQsd}Jo&5h5BdPc2L6S{xUM}e${-VDdEExbc8q|%JEqQNH(CE zk!sA5Dj28}$n!45*p$3L?T+kXkf<9#kOtIkg8o8Vt6>V`fQc^r0Bu0YJc9Ma+>1gt zBWSMa>_s{Rf$^Fv-8TDvtM)Ednt!m=U)QiM1lY~2_2uS5TvW}5^Ow4v+^DSnsS~H2fJsz7XA2L%(B`mGJnd+WIy|~}{IgAWT*nO4#qt!D} zXjydkGgx51#eAdoY3EXkgJE{=1-=p2*tb;RQB~skf&&jEA&!a=5R}Vap zK)vdXNNr;JzXff5O{4d5a}l+TpuK=_%0E6ZOm)+=Sz$Ve!4DBZFRZ0fjkb2}a})yn zwEf%lKczHtYJC*q1k8Dyy;0q8`+N%L6|=RKRikh1$x(Cl%7!_m zRzvOL1g24C0h=(*Y}%O4iRP-I`ZN`yZB`B?f3=a);mJFa5EvE7+r95U5sPtxn`2LK zsLu6f;R9bY!d7m?9ZQod{9@;y!80$mmdN*EdqKTkIO_F= zT)R1Y1}*QaP}JqIZ1yH2r@9DH`~rSH?@gslf%?92>YVpMm9@E=7CiH~?08XmOesX{1t1a&=8eZ_MP zVyw8`>;D^n_+l4rZ?#@IU93jUH(W^dvu`Or5s2uJZ~W8+A12422MYXHO|8*V+&+D~ z`SVrewP8a}smZP22A`*3wKKj-QLk0)JdBA@Ox6obBA*fT)sQpPR&KK!cecgE#k4DB zFxcRe9aTg2$5!b{CQ{J?o?bz3ka1M+xTs@LadwboL%KJ1H*kF?VgG-0$s0T~PdG#B z6@5Zr@;4LJDu1o3S=uBB=G$zAI>nTMvRm2 zFeChu@)#=s&R}xPnVd@Kp720aA-8-s+CH_m5k$<-bK*y8;-~L_+paHg*3YG>zWbH2 zRtLMXXPO_Xm@f#bGJG+(j8F5en?;h zV0V6z;nv7y)k#Rcv1YLS=F1Au$3NLdAT~L?Se2pVlSY_V>i%nPpjyIzty9^E}E0ZXFJW8C; zGAef$K7Ur^%*C>k-e+F_magTkb08&i(J=>wxFs+Zv7y4f4Ana?fw@J~EVo|OT)S*> z&S3KdB3Q?cdSg`xSo6?3F}lVIo-TMN_6i|zn38~Z8?)9h?5!7PvO{@ubDUa7-%PDe z71Sd#m6-uC%bWChAz0jdOeM60BJd&0POA7Gug$69Tz`wzBeM(vKzCD1q?ZZMGa!Q> zdJC;FSG>O&{wU|=^x4Fu{`B)^S1a~EbYb;rDj94{Es^-T_x=M*()jjCQmdNb3nHYG zRl*ms-m~hp!qID~Cb!6=3|>rff#M{Bc%iMm7B-b0{B$0(z>&bEp;Tf zr|VblYj&{F6wdW^eXxB~CX(`=7#+-co=e_C+TzWqZ2gLansT;C3N>wUPP{hXHsk=A zaZB97FW{V&!v60P5$cbNb*UqHw+#t!M_G~2X9_o`mPYuxxn>4<>1x?H6W2kBr7oc& z>Kd|d^V)1%6q7Wy2a_ma#n^ z!iu9lN<(n)M;5;kZw=h{3H(>qpg%_2e%xDxXW+Gf@w3rVX;KfC2~(ukP_TNRmgq#U z7dwj%a`>K(V0=W;yIV=Zq21anoANVlaXAj=0il>pf(9P|{=|;ghRbhAdNA`$SsTCq zQ{qj*-k{Y2iE4g&l5l7jm>x`kOf!<1q|BI_;U=WDBJC>_W6z@p`Pk(oBk|6@z&nj&zEx(>z}7xsrl>=)Hz&#$+-rRyRno@~6`IB=GyrnGfw!;vn!0aKdRJ$h1c=@6uw zHAKA+zIwolJazkE{iB&&5g;y3hIwH1z83-A!#xt9b)5)f_Nz<63>EnmGH{8=D_v3NlluT2rdKtUfF-o$1U7s zZ|X4n-g1i6&y9-|Rq)cr`|SCE#iXp3Fp#=mcaf}qaaPMW&4x+`o)5>f9{CqCr(v}n zl@8xSaXT%9p!tu^{Q++8BBLU17rkoJdyRC8F&n#Wspe)y z`C9rs!*+BURY~Z``D{|UWDb;V!x>~|ncGwx-A-+3s4>`N$Y+}_1-GJuZ4d6rHT#C*wl8? z+9P4Lp5iKlK*wBI{v+VOghU}c>`%pfPP;GBrrUPtS@7o2OWBXnj^6S0NR0OmY3F7i zCsPT5SZjscf>CBOY`FQ6;)CgXt6pEWN@a{Zb&9kpLo-|F+Ar)5f`tvD{NhZFaYmM; zQ&)v3^TaKs(}Sv;v_%;g>_o?&TLJoU1^WKk5=COUd(L7*G1_C3_M1koQ^Q-NIFr@j zNuzPUKUP&=;Ls8KtbWi@MiA`r=}xEDtEwM;crn%8?+6fuTOB#5ALi|FpKJx*jC6h) zHKyxBfqcCeN@Or3B6uOV58Z2NZ2<`zv@&-8Ie&I`UNql`d}>oJ3cIi&PHUq3R?3wmJjl&35^ zbkZTF{B5au1__y6L}Co-ooW2EL7@IQTvB{_$=pH9;67M?#b!OkX6UsM zt)u#Lpwz7FU?`^CI9Xx{y4_g}hEcX`?oiEZOur=A;fpCny9E$b9jTKGzAt&3(+o}^ z2*P)Gl*1OnJPBoQNVME^v=S#=}n0 zGO|=y$!3u@WJoY!GRgEwLq}$BYLB>CB>ygdo1@QhVc*&nY4c5_J)D6h_c`=e%O^6S zL#7x@X4pxb{Ae9BXw}W>^ZSnLT}sQ_Wh4ns->gvU(SgbVn*0xSb2WiK5BQX@ni%Q} zUQYwCE%q;z&soVC3N;sD1*Y3Eax#PUQ$;N;EpPd$F|6HI~!?bjD@)tJWECb-G zq-?kD?KsJ?5 zz0(3Z*C#Tk)ZxD>jAEdf2C7SDbw|0kCFk}H%@>^FAfNSM&TgNT=iE9_0!f!FrfJ%_ z4Njs)i?;`^W})ltr58CfC#E7Imqz@w_HzLN>T{us{n=%)OWbhj?I@COwdMJjhPJ(_ zry364qSTbxXAh}UdDfpN4qDyWp(%8G0mUsfPUL=8MJ<~)K{H45{kvPw9}}T5SNWzN z28}y$go2lz9&-D_dHU`#32TmZlEv96=XLz^?J%2?pwk$(wa&s2GhG+lX>=R$?FJAC zHb4F8fK$Bshl%Vx&kQ+Hmk+MF$RoDCrLT|-*tI6@z2a?7%$vQ8iEE;uboru8{%Nz% zY&Dlg3*AYTLrqrcx{{{KV{bq&+ky<8Xt=}J8}Ze+OL(}<7;BfA#YviTh^O>SUTKNT z)s9Fjn!Y_LBs+hB_rh5*-7Vh{ooK|-(#*seh^8Tk?4dIxtgkXQSTnM8aGiRh{t5eh zKJ<30<)dvaPs;rx7Y72hI!yb{oTF@^#s;k%r}VX*I|ruMiERo#pIn^n<|#M6&A+CN zmUC;oH%5-W*!-aJPO2zBd;B&s^Y+3_1t~8z@BL)T#>HK}Fof2R9@LMH?kcxl5z1oa zs~G_|F;ZcDex`Ygz_uQjp{rabs^omgBH@ks86^HLo_q@bSY)S8Oz-0mKXC*41&Q96 z?CT@yl`1P^v*BH<6R@&tYDTEjj*>{!%@E-J6l%wl#+cUgCuRip19@N2i&=&?>%`*9 z(*bz@!8kOp?DB&6oBb}=9t;k&+d8j1=dTWchS12-xcGj3$eEd^>AG%13c7cx27{{a zraNhl+2KT{o~G)wdQij~U!*k~zN)pWS<{vLZ0l3Qqygqw!L&L`y9X{VaTOlcYN5T; zSiLyV*Xe{OT{KMg2mHV~p0Z)sVDg4mUjD4>Jv`CRTc4U|Ez}Jnl#SgmZN=Ehl@8t3 zEg%NrTGH*QTBz=|blu)jf09wJbW|DC!}Dh;s@S2z06!r`JRE*OIfL((#O|Ch`}%{v zlt$)FH1_;LcFHqPCxg7>2Z*qHy}#OcUM&8hTgB}JufD=!$c_Ui|kaub*g zp>uou59lzZ_iAi*b)0e$C+e58BJMyZi1n9rWAWVL%HoTQYeymJXZgoPOyOrzpwwjA zE0pwvbki;NqwgH#2MP$oGlHLwzh*Vtrb2J0x{O+$4{2h~gc1@SPP^3lGIgxIRH5;V zcZsF}%{|XFl2i#+eLTd*lE@`7@p znXV&PA-*ULXq;vT$|-8G{!*#q?#xHlGc`6YPIS>)&Eu)GY1{nEe{W7#$;l3r+nrhc z9HFxkNEj?DeBk>+={fIx)?+K#UFPjxn1j!033u&}Z}bL3HFUxu?*__-g65?x_)VL` zREZL7_`5In9i`Z(aW?FE7LRtr_&yDsU)XjW)vvqiWm>x?F_|(;f{9BMZ66;YGJ&Mp zDfO-ze{lq&5sl;S?rXB-rLy*WB^*uQfJIVy-4cc!EbdTOFEn zlE|}<6m^iG!glQx7C<>9`pN&*1QRwiIU!^8vdbq==Pw7Gd_@hGztjdFiMsH^Ed&VO zI($?6jDagld$G-EvdE+lW;>EJvUCk*SHWpMGv7M6 zO(t5|jU+5Dc`mawI_*4B%~?g2%w_8ejd1fn=BWgRjZM|}H2hy#AA#SsFA?iT=y7C z4C)e(v*-Gdgf1?ivBx23mHK|?g$BU#{ewVd^j`t=-e&Eor_})pk#S3B(?E*qr9nsP z)uq(G#J}A&h)hy%egD`x33RT6TG4vU@C-VW?kz8`>^2#Q^qjP8a)%-0JRPal+JZ`S zd*_DH)pZ>er;*tN_xk5H&IdpXP|vm{rpznq-5QRG?xnRhqFOYya%D0Axc-FpK=xB>dx0FnZ!qNDh;-wyOrpTF~a6m)ljhQSCF$M zw@s)oD54)EEqHBa*OBNGG^bqvyY3V>MNS;I9000{jX%AdKz7C4Zu5>OaFjE(S#S+5ha+Zou*V|5dG3|MX$mOS0;Gwnsbx0Lq_!ga46)idVJv zr@S0r@Ck+2_b!DI2XxC>tk}Np$R*JYR(-s-CLsLCpRC~+w<>n5ihS)Z{as;g+g`}j z`$#WudHgh&HC3f5qbY(mpXC8O^8OP+`ytarUd)v0ID~o3oTOXka7j+D(o;54bGO4< zwjEQaMpVReWEa18T(7CE=|9mUcN)=GGYlo74pUA3Q;>irky}q6#>9*KN(qCfuj*5%g zHW}^pnErR}uLbS<@$<(JyaKfR)BS56jFI2~5Vy=1@voxC2;f*=4rt@da_J2RBcZ{nbudd&Uc1eXwg&X6m}{;wOfbibM10jYg;uNMHIFjqu}9)%-Y--E$4cRVk6kgOGLf3uq~D?Q zKN!=zWp>(%Jd2|fY<$f_V~|6VdHV2JFKDkVWfK0eX6`%xr;x6uhVtdo+3BG)Wbs-) z^8;;@+rk2~%i2k;&3G6leYbJ22a8bxe4+gz{QY7Qeva7VibSBm}Y1B_I`{3Yzi=xhK0!~cu^ z`Ww0ZyH(}Cgbn-u-%`JMwpH=*WPNVfNXBdVSzu09kz2WpBe}WQKze;C`%TH!*Be&K zWNreXzHsbe-0M3@x#ZDorTcpT|3WahltIy?5$b7;&p#GNr=Id(`0S98f%2!5sfro* zTivG9xj^dL#;8mQZZWgwv8IP8m!JCQ>i?qPUcZ|(?tmCiz%EbaOSBnGmM6@`?zLW% z?o_g(nQD?QX+>xi3|Y0D!`^MyE=H!+;vAEzF9i&32AQAk>S35R$boVd;09(;N zCy?ys=+w(t@P|GEA{7$NC=nJH z3tAFiMn>~LH0dep3Mi-yF!ACAd{Oyh0(XLMuo5SK0{z~lxnGjJ;<{idrM?W*y$ZjE z9pkmZrz8@LT0j#`nJKtEK=4B8lN;iI@R&ceKW_UJwAJNo@5ApQlc=w#t{3h%U(0tb zM;3b;X002Jeo7i~?mh@6^k=&B7>fe75B=-yNr-)Xjb>SBa&1sFaGGaSN^VsQTULBi zb6zJV6b)8-l#U87AIa!bR|SOg`~e}Hs4p2C?owKYyjML0ohSReZf#xyQ-kO{=29wB z3tN7=r2`?aUr%b=SXeOK9CuYRWJ)Sx?K97M`EyrXjE{XEHq)uh;Hp&kk4lwrd3&yJ zCtn|E%FAyPho&cTapF^5h0D6C=N}qflAWmWaJ{e`)FBu(Pza7Ykgbr)b}@>#Qr9Q1 zi(CPOFZ^cO{h}0KLkb(M8j1n{pMT$i|Mk|bKQw^E=or~WMUCnGwKBy89s&i5^J?%2sy$QZ-Z=rj-;C)7(h7!}o zV_(W@+o8glIxqRf9(G)8;V4AV@{$Gg;)fD7%vY($Da=ENON%j{5n7?yh1xh7v9(}t zRNXZ5yx>g7hJ$U1@|vwS;O(C}Y!^DxOYuhYWsl>&r!@sibB@P5b-=9afHKf`bp>f@ z_`D^X&@Nhg_~v#phPV7MP2>%2$bDKA=D6#vX!T2bA?FeePtrQLH)sw~&86v={D?hrzuXfW0EjS^z!&rQ$ z%**ZjhwJ#=M7rXxc0sq#cm-9(-a&2@uLPc;vEHTg7NzzUIwgJe{Ql81ls!8nWWcT- zWAK{vd!-kNRF!3icH8(t<}6B-97}3x&&Z;H+y6tw9)!`IcX6?Lp7QBb6&!7_eWz7| z^QH)T-afeV_>Xj@LfpbJIt8sPxM3C_7IoulXF|E3)BB9KcE+g=_+g|jnjrMTw^N6= zm)>>ZBihf8GXLv4-2|)(8*u86Nmdj(KoJ6myTWB}4}?Ly3f?HD3(I0FE$h96a2N&t zu3($!u(RfIazMiUz8*c*ijSyhUys-TAs@;>j(U1 zlrE9|qqiRp+IX$c-0i6?Y&kc3|KyAjPAWEW#BPMDPr~?PFX1cBW>zL1!JX$Eb@kgv z^Wh+uwa3~wLPgLX+dIDO{9_RKvNUD6D=epy z(>~bX+cTD_^Z~aZK<9^`d$Lleo24#m2}SFPE;eM=&3^vpj;=3OxYai6yT< zz00V;43#yH+%u8;w?4Uy-G*aWpvkkDcN-mofG?)MAKQPpybT1<$Xe+&t~Y+<`Y%)t z%k6yG{MGsLw>|!!d3!>6=1Bf`ID*m#$JZnJ$t=20sL>JS#O#+<(B=?&{7<&UcV$xB zdr>r`?TYS~xh0X6xaH4u%G9-RZ0mBQg4DD4B!NSx3!@N!QJMa^Zy1W;FEc^5rA+9Q zauds1{KpQxX8fe9&bLcoVG*?F4;aKGvio8ijg;(WANNoM-SxU=LtsyR?ytzCqQZg6 zB@TPzn5-;=Wj)ME+{pS4yMZ*n?alas%9ujAaTRb?Ysm2GF0JZ^o>v<;i@6tTUwx$U zOj?4Eext?X$YO3x_J!gCYD`Je2PYcc(NZ;8$i7TO&M{{sl#`#C@oxng;rg>}^Zmzk zdtNeU8niTgUlNOu0u7_|p_VeK_)5Pgx$7cmKX1D2W~&ALt09znvbj3?d9c#PW3N__ z$NA&Ox-9!fps)my`Uz5RP(3-)ZNl^@RdOXk zx~_EH-*;)ygfmUHyh6^jukdu?)IH1|q1>DZg-%}Yn~~QgN*G!y0W&iNLYaQR!|0jesQu@HzZvmvwM4 z{eyI%=2E2BAY@2-EXM2U8O_C>SrpN_Xk-!L0L4i!G$aq$EM#xAhbTUVxs6tNj<3|I zlVW_D`KDWHyB^vWjyxoUZ0_Q2l~~q1RVkIjh!Ich)F{n%HZwDubS-_BToe^03)gDO zZ1BDNBw)R~dHbqv!ne>_E@XJ97UhDw-SW)dY0?%3(6(9|4P6y#jfEd_xziI>MZ_eg zAJTVfs0*yYl$F-fuD`~{C6jvyb*`REHF-5?m(tVSIL7nfIHmY4yK;kq&$K01YIQ}t z?MU(x;Sy>gGXy;t_L(Lx62v>gkc;S6w}aJ9icA*~tp!XkHV5IP=Q^YBs|5|-dtIV5 zEExqA(*_dkXDqH5d;ggHt~uOS;0e`@+iY+HJd)(H3iO`NNbO2Gf2KiVQi7#^r=8Ea zmJua2UwHI^jY+yvtM50z^$Tr2@3U`?YX|XWXy{H;+l2+iZD4TEgQ?_?6C+8IIGEvy z81>qHwz4tNCiP2PNLB3PDs!GV&G@D>iDzhv}0p(9D%9}F8<=H-4NM72MZq?sY+rur^yz{Y0w!s%8}RK!y^g~C>LOn}w1 zk~&fsddK_Gk0-@4LKuEt%dI`jVfz57T<|C5s2+VHW1_`SZS2=(-nf6tEPlZX@%@DH zfWLp^JH5d#Tfeu|!Cd(RLBz%Zx%FaNy?b=+sk?IT9Tqy_id z6hon_Qb!&hK?uVjjeW6~O>c;ljtp$~Kt-X9d zp5fN;lkQ%F7$^}j^CoRxs2Y6bJF;q7Rajt3nhD5ETV00#x`8TSjr}*Te~W7iPM0q6 zH%L!Kn(iMl=zPER8vNQQ;SD$29J!C4&WpcU>mA>kXIS(m{ky>h` @(B#+^MSBQg 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 literal 0 HcmV?d00001 diff --git a/Images/IndexSchema.PNG b/Images/IndexSchema.PNG new file mode 100644 index 0000000000000000000000000000000000000000..a1010103d3050862a9fce7db0543fd97511a7b70 GIT binary patch literal 28928 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

+#kpu63?$u@_ts;TLf6wE2VHKNpZ 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 literal 0 HcmV?d00001 diff --git a/Program.cs b/Program.cs new file mode 100644 index 0000000..facd6eb --- /dev/null +++ b/Program.cs @@ -0,0 +1,28 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. + +using System.IO; +using Microsoft.AspNetCore; +using Microsoft.AspNetCore.Hosting; +using Microsoft.Extensions.Configuration; + +namespace Microsoft.BotBuilderSamples +{ + public class Program + { + public static void Main(string[] args) + { + CreateWebHostBuilder(args).Build().Run(); + } + + public static IWebHostBuilder CreateWebHostBuilder(string[] args) => + WebHost.CreateDefaultBuilder(args) + .ConfigureAppConfiguration((hostingContext, config) => + { + config.SetBasePath(Directory.GetCurrentDirectory()); + config.AddJsonFile("appsettings.json", optional: true, reloadOnChange: true) + .AddJsonFile($"appsettings.{hostingContext.HostingEnvironment.EnvironmentName}.json", optional: true, reloadOnChange: true); + }) + .UseStartup(); + } +} diff --git a/Properties/launchSettings.json b/Properties/launchSettings.json new file mode 100644 index 0000000..0c45c8b --- /dev/null +++ b/Properties/launchSettings.json @@ -0,0 +1,28 @@ +{ + "$schema": "http://json.schemastore.org/launchsettings.json", + "iisSettings": { + "windowsAuthentication": false, + "anonymousAuthentication": true, + "iisExpress": { + "applicationUrl": "http://localhost:3978", + "sslPort": 0 + } + }, + "profiles": { + "IIS Express": { + "commandName": "IISExpress", + "launchBrowser": true, + "environmentVariables": { + "ASPNETCORE_ENVIRONMENT": "Development" + } + }, + "EchoBot": { + "commandName": "Project", + "launchBrowser": true, + "applicationUrl": "https://localhost:3979;http://localhost:3978", + "environmentVariables": { + "ASPNETCORE_ENVIRONMENT": "Development" + } + } + } +} diff --git a/README.md b/README.md new file mode 100644 index 0000000..28e4399 --- /dev/null +++ b/README.md @@ -0,0 +1,248 @@ +## Interactive Voice Response Bot (IVR) using LUIS, Azure Search & Direct Line Speech + +Proof of Concept for the solution design provided by Microsoft in their Azure Solution Architecture examples. + + - Intent is to integrate services with basic configurations to make the solution work end to end. + - Not designed for Security, Performance, Availability and Resilience best practices. + - Wherever possible, external references are provided which helps in configuration. + +**Base Solution Architecture** - Provided by Microsoft - https://azure.microsoft.com/en-in/solutions/architecture/interactive-voice-response-bot + +![Image of Solution from Microsoft](https://github.com/Sanoobk/Azure-DirectLineSpeech-Search-LUIS-Bot-Solution/blob/master/Images/SolutionArchitectureMicrosoft.PNG) + +**Final Solution Architecture** - Modified to replace Skype with Direct Line Speech Client Application and Bing Speech API with Azure Speech Services + +![Image of Solution updated](https://github.com/Sanoobk/Azure-DirectLineSpeech-Search-LUIS-Bot-Solution/blob/master/Images/SolutionArchitectureUpdated.png) + +**Below is a rough aggregation of components, configurations and tools required for completing the solution.** + +![Components and Configuraiton list](https://github.com/Sanoobk/Azure-DirectLineSpeech-Search-LUIS-Bot-Solution/blob/master/Images/ComponentsConfiguration.PNG) + + +## Stage 1: Create and Configure Bot Web App in Azure + +**Create Azure Bot Web App** +- Bot Web App was created using the Microsoft [article](https://docs.microsoft.com/en-gb/azure/bot-service/abs-quickstart?view=azure-bot-service-4.0). 'Echo Bot' Bot Template was used. +- Connect the Bot to Direct Line Speech (DLS) channel using the Microsoft [article](https://docs.microsoft.com/en-us/azure/bot-service/bot-service-channel-connect-directlinespeech?view=azure-bot-service-4.0). +- Ignore the last step of downloading the code from Azure portal. +- Microsoft GitHub [source template](https://github.com/microsoft/BotBuilder-Samples/tree/master/experimental/directline-speech/csharp_dotnetcore/02.echo-bot) was used which covers basic Direct Link Speech (DLS) configurations. +- There are many bot templates to choose from. For a good comparison, review the [link](https://marketplace.visualstudio.com/items?itemName=BotBuilder.botbuilderv4) and choose the template that suits the requirements and make necessary configurations needed for DLS in the code. +- Dialogs based bot template such as Core Bot is a preferred choice for production scenarios. [Template Source code with DLS](https://github.com/microsoft/BotBuilder-Samples/tree/master/experimental/directline-speech/csharp_dotnetcore/13.core-bot). + +## Stage 2: Create and configure Cosmos DB Account and Container to store ASP.NET Session state + +Cosmos DB Account and Container was created using the [instructions](https://docs.microsoft.com/en-us/azure/bot-service/bot-builder-howto-v4-storage?view=azure-bot-service-4.0&tabs=csharp) from Microsoft. + +**Configure appsettings.json key values for AzureSearchSettings.** + + - Navigate to Azure Portal Cosmos DB created and in the 'Overview' section, copy the 'URI' and update the appsettings.json 'cosmosServiceEndpoint'. + - Navigate to 'Containers -> Browse' and copy the corresponding 'Collection ID' and 'Database' and update the appsettings.json 'cosmosDbCollectionName' and 'cosmosDBDatabaseName' respectively. + - Navigate to 'Settings -> Keys' and copy the corresponding 'Primary Key' and update the appsettings.json 'cosmosDBKey'. + +**Important - Update Code to extend the Echo Bot template to use Cosmos DB and store Session State.** + - The sample Echo Bot template code used from Step 1 do not use any session data preservation. + - Please refer the source code of this repository to use the required changes to configure Cosmos DB in code. + - This step preserves the data provided by the user via DLS on each Turn and saves the input to Cosmos DB. + +## Key Source Code Excerpts: + +Create a Cosmos DB connection using the instantiation below. +``` Csharp +_myStorage = new CosmosDbStorage(new CosmosDbStorageOptions +{ +AuthKey = CosmosDBKey, +CollectionId = CosmosDBCollectionName, +CosmosDBEndpoint = new Uri(CosmosServiceEndpoint), +DatabaseId = CosmosDBDatabaseName, +}); +``` +Below is a sample line of code to write changes to the Cosmos DB using .Net TPL. 'changes' object is a Dictionary that keeps track of the user inputs over each Turn. +``` CSharp +// Save the user message to your Storage. +await _myStorage.WriteAsync(changes, cancellationToken); +``` + +## Quick Test: + + Deploy the solution from Visual Studio to the Azure Echo Bot Web App Bot. + - Perform tests using the 'Web Chat' under Bot Management. + - Navigate to Cosmos DB Container to validate entry saved as part of the 'Web Chat' conversation. + +## Stage 3: Install Bot Framework Emulator + +Download and Install the [Bot Framework Emulator](https://github.com/microsoft/BotFramework-Emulator/releases/tag/v4.5.1). + + At this point the Echo bot solution can be tested using the Bot + Framework Emulator. + 1. Run the Echo bot solution in Visual Studio and copy the Echo bot localhost URL endpoint shown in the browser window where the bot framework service is listening. e.g. "http://localhost:port/api/messages" + + 2. Run the Bot Framework Emulator and paste the url and leave other fields blank. + + 3. For troubleshooting errors, please read this [article](https://docs.microsoft.com/en-us/azure/bot-service/bot-service-troubleshoot-authentication-problems?view=azure-bot-service-4.0#step-1-disable-security-and-test-on-localhost). + + 4. If you have downloaded the source code of the bot from Azure portal in Step 1, then the appsettings.json will have the Azure bot MicrosoftAppId and MicrosoftAppPassword added. + - If you prefer this way of testing, then ensure to use that ID and Password in step 2 above. + - To copy the values later, you could navigate to the Bot Web App Resource in Azure, Naviagte to 'Settings -> Configuration' and copy the 'MicrosoftAppId' and 'MicrosoftAppPassword' + + 5. Ignore the https endpoint error shown in the console output window as this local testing is scoped to http endpoint. + + +## Stage 4: Create and Configure LUIS +Create a basic LUIS (Language Understanding Intelligent Service) app following the Microsoft [article](https://docs.microsoft.com/en-gb/azure/cognitive-services/luis/luis-get-started-create-app). + + - Try steps up to testing the endpoint with a GET https request. + - In this solution, we will reuse the 'Entities' of the 'Home Automation' prebuilt domain of LUIS. + - Export of Utterances, Entities and Intents used for this solution is added to the source repo. + - Utterances and Intents of 'Home Automation' prebuilt domain was deleted. + - Import the provided luis.json file and upload via the LUIS portal [Manage link](https://www.luis.ai/applications/{yourapplicationidhere}/versions/0.1/manage/versions). (Ensure to update the link with your Application ID) + - Train the App and Test with some Utterances. + - E.g. 1: "Get all blue bikes" - This should return 'BikeMike.GetLatestBikes' as the Top Scoring Intent. + - E.g. 2: "Show list of beans" - This should return 'None' as the Top Scoring Intent. + - Adding Utterances to Intent 'None' is important and should constitute 10-20% of the total Utterances authored. +- Curating the Utterances, Entities and Intents is important to improve accuracy. +- Publish the App as the final step. + +**Configure appsettings.json key values for LUISSettings.** + +- Copy the end point url and update the appsettings.json file 'luisEndPoint' key. For reference later, naviagate to 'https://www.luis.ai/applications/{PasteLUISappIDhere}/versions/0.1/manage/endpoints' +## Key Source Code Excerpts: + +Below lines of code will fetch the LUIS response based on the user input utterance. Response is managed using dynamic objects. Strongly typed objects based on custom LUIS response Intents and Entities can also be implemented for flexibility. +``` csharp +private async Task> ProcessUserUtterance(string utterance) +{ +dynamic LuisResponse; +var LuisIntents = new List(); +var LuisEntities = new List(); +var Luisquery = string.Empty; +dynamic LuisTopScoringIntent; + +var response = FecthLUISResponseAsync(luisEndPoint + utterance); +``` +Below lines of code first deserialize the LUIS response to list of dynamic objects using the Newtonsoft.json nuget package. Based on the Intent returned from LUIS, the corresponding function is called. In the below case, the intent is to search for latest bikes. +``` csharp +LuisIntents = (LuisResponse.intents as JArray).ToList(); +LuisEntities = (LuisResponse.entities as JArray).ToList(); +var SearchEntities = new List(); + +if (LuisTopScoringIntent.intent == "BikeMike.GetLatestBikes") +{ +return await AzureSearchQueryRequest(LuisEntities); +} +``` +## Stage 5: Create and Configure SQL Database +Create an Azure Single SQL Database using the Microsoft [link](https://docs.microsoft.com/en-us/azure/sql-database/sql-database-single-database-get-started?tabs=azure-portal). + + - Use a 'Basic' tier and 100 MB storage as this is sufficient for this POC. For DataSource, use 'None'. + + - Complete rest of the steps up to 10. + + - In the Query the database step 3, copy paste the 'bikes.sql' contents file provided as part of this source repo and 'Run'. + - The Bikes SQL Table with sample data should be populated. + - A document database like Cosmos DB could be a better alternative. + - Integration with Azure search index schema is better with Cosmos DB as both services are in the direction of Schema-less. + - If a Normalized SQL DB is used, then a View can be used joining the required tables and then integrate the view with Azure Search. + +## Stage 6: Create and Configure Azure Search +Create and configure the Azure Search Service using the Microsoft [link](https://docs.microsoft.com/en-us/azure/search/search-create-service-portal). + + - Follow all the instructions provided in the link. Choose 'Free' tier + instead of 'Standard' for this POC. + + - Now create an Indexer to load data into the search service index. + Follow instructions from + [link](https://docs.microsoft.com/en-us/azure/search/search-get-started-portal). + + - In Step 1, point 2 from the above link, ensure to select "SQL + Database" as the Data Source instead of "Samples". + + - Rest of the configurations can be followed. Connect to the Database that was created for this POC in Stage 4. + - In Step 3 from the above link, you can use the [IndexSchema.png](https://github.com/Sanoobk/Azure-DirectLineSpeech-Search-LUIS-Bot-Solution/blob/master/Images/IndexSchema.PNG) image to configure the index. + - Once defined, many field attributes cannot be changed via Portal and API's. + - Copy of the Index Definition JSON file is also added in the source repo for reference. + - In Step 4 create the Indexer and configure a 'Once' schedule. + - Navigate to the 'Search Explorer' and try the default search with the pre-filled input in the Request URL. This should now return all the values from the index. + - For reference on queryType 'full' which processes Lucene query syntax, check the [link](https://docs.microsoft.com/en-us/azure/search/search-query-lucene-examples). + + **Configure appsettings.json key values for AzureSearchSettings.** + + - Navigate to the 'Setting -> Keys' and copy paste the Primary Admin Key to the appsettings.json 'queryApiKey'. + - Copy and paste the Search Service Name from 'Settings -> Properties -> Name' to the appsettings.json searchServiceName key. + - Copy and paste the Index name from 'Overview -> Indexes -> Name' to the appsettings.json 'indexName' key. + +## Key Source Code Excerpts: + + - Below code uses the searchServiceName, indexName and queryApiKey from the appsettings.json file to create an instance of the search index client. + ``` csharp +//Create a search index client object to interact with Azure Search Service. +indexClient = new SearchIndexClient(searchServiceName, indexName,new SearchCredentials(queryApiKey)); +``` + +- The below code uses a Switch case construct to update the filter parameter based on the LUIS entity passed as a parameter to this function. + +- Entity creation in LUIS and its corresponding Search query should be well thought of. For complex queries, helper and mapper classes need to be added. + +- Using Cognitive Services Skillsets in Search index pipeline could be better alternative to reduce developing queries based on LUIS intents. + +``` csharp +private async Task> AzureSearchQueryRequest(List luisEntities) +{ +----skipped---- +Switch (entity.type.ToString()) +{ +case "BikeMike.Color": + +filter += filter.Length > 0 ? ($" AND Color eq '{entity.resolution.values[0].ToString()}'") : ($"Color eq '{entity.resolution.values[0].ToString()}'"); + +break; + +case "BikeMike.BikeTypes": +----skipped---- +} +``` +The Search Parameters and query (*) is then passed on to the index client for async execution to return a list of dynamic objects. +``` csharp +searchParameters = new SearchParameters() +{ +Filter = filter, +Select = new[] { "BikeName", "BaseRate", "Color" } +}; +searchResults = (await indexClient.Documents.SearchAsync("*", searchParameters)); +``` +## Stage 7: Deployment + + - To deploy the Bot into Azure, please refer the [link](https://docs.microsoft.com/en-gb/azure/bot-service/bot-builder-deploy-az-cli?view=azure-bot-service-4.0&tabs=csharp). + - For this POC we have already created all resources shown in step 1 to 4 in the link above. + - Fast forward to step 5 to deploy the code to Azure. + +## Stage 8: Testing + + - To test text based conversation with the bot, use the Azure Web Chat feature under Bot Management. + - Testing from virtual machine using Bot Emulator to Azure Bot is also possible for text based conversations by downloading a tunneling software like [ngrok](https://github.com/Microsoft/BotFramework-Emulator/wiki/Tunneling-%28ngrok%29). + - To test Direct Line Speech plugged voice based conversation with the bot, follow the steps below to download and install a UWP client application that used the DLS channel. + - Download or clone the repo from the [link](https://github.com/Azure-Samples/Cognitive-Services-Direct-Line-Speech-Client) to a machine that has a microphone input. + - Follow the instructions from the Readme file of the repo + - Use the Microphone button to start the voice based conversation with the bot. + +## Solution Implementation is complete. + +## References + + - [Solution Design Concept](https://azure.microsoft.com/en-in/solutions/architecture/interactive-voice-response-bot/?cdn=disable) + - [Bot Builder Samples](https://github.com/microsoft/BotBuilder-Samples) + - [Create Bot Web App in Azure](https://docs.microsoft.com/en-gb/azure/bot-service/abs-quickstart?view=azure-bot-service-4.0) + - [Store conversation session state in Cosmos DB](https://docs.microsoft.com/en-us/azure/bot-service/bot-builder-howto-v4-storage?view=azure-bot-service-4.0&tabs=csharp) + - [Bot Framework Emulator](https://github.com/microsoft/BotFramework-Emulator/releases/tag/v4.5.1) + - [Create and configure Azure Search service](https://docs.microsoft.com/en-us/azure/search/search-create-service-portal) + - [Create and configure LUIS](https://docs.microsoft.com/en-gb/azure/cognitive-services/luis/luis-get-started-create-app) + - [Index Azure SQL DB with Azure Search service Indexers](https://docs.microsoft.com/en-us/azure/search/search-create-service-portal) + - [Choose a Bot Template](https://marketplace.visualstudio.com/items?itemName=BotBuilder.botbuilderv4) + - [LUIS - Azure Search Integration](https://azure.microsoft.com/en-us/resources/videos/learnai-creating-intelligent-applications-part1-2-azure-search-and-luis-part3/) + - [Lucene Query Examples](https://docs.microsoft.com/en-us/azure/search/search-query-lucene-examples) + - [Direct Line Speech Client](https://github.com/Azure-Samples/Cognitive-Services-Direct-Line-Speech-Client) + - Bot Builder Dialogs Architecture - Link [1](https://github.com/microsoft/botbuilder-dotnet/tree/master/libraries/Microsoft.Bot.Builder.Dialogs), [2](https://github.com/Microsoft/BotBuilder-Samples/tree/v3-sdk-samples/CSharp/demo-Search/RealEstateBot), [3](https://docs.microsoft.com/en-us/azure/bot-service/bot-builder-dialog-manage-conversation-flow?view=azure-bot-service-4.0&tabs=csharp) + +License +---- + +MIT \ No newline at end of file diff --git a/Startup.cs b/Startup.cs new file mode 100644 index 0000000..1397eba --- /dev/null +++ b/Startup.cs @@ -0,0 +1,65 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. + +using Microsoft.AspNetCore.Builder; +using Microsoft.AspNetCore.Hosting; +using Microsoft.AspNetCore.Mvc; +using Microsoft.Bot.Builder; +using Microsoft.Bot.Builder.Integration.AspNet.Core; +using Microsoft.Bot.Connector.Authentication; +using Microsoft.Extensions.Configuration; +using Microsoft.Extensions.DependencyInjection; + +using Microsoft.BotBuilderSamples.Bots; +using Microsoft.Bot.Builder.BotFramework; +using Microsoft.Bot.Builder.StreamingExtensions; +using System.Net; +using Microsoft.Extensions.Options; + +namespace Microsoft.BotBuilderSamples +{ + public class Startup + { + public IConfiguration Configuration { get; } + + public Startup(IConfiguration configuration) + { + Configuration = configuration; + } + + // This method gets called by the runtime. Use this method to add services to the container. + public void ConfigureServices(IServiceCollection services) + { + services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_1); + + // Create the Bot Framework Adapter with error handling enabled. + services.AddSingleton(); + + services.AddSingleton(Configuration); + + // Create the bot as a transient. In this case the ASP Controller is expecting an IBot. + services.AddTransient(); + } + + // This method gets called by the runtime. Use this method to configure the HTTP request pipeline. + public void Configure(IApplicationBuilder app, IHostingEnvironment env) + { + if (env.IsDevelopment()) + { + app.UseDeveloperExceptionPage(); + } + else + { + app.UseHsts(); + } + + + app.UseDefaultFiles(); + app.UseStaticFiles(); + + app.UseWebSockets(); + + app.UseMvc(); + } + } +} diff --git a/appsettings.json b/appsettings.json new file mode 100644 index 0000000..edae994 --- /dev/null +++ b/appsettings.json @@ -0,0 +1,20 @@ +{ + "EmulatorSettings": { + "MicrosoftAppId": "", + "MicrosoftAppPassword": "" + }, + "CosmosDBSettings": { + "CosmosDBCollectionName": "", + "CosmosDBDatabaseName": "", + "CosmosDBKey": "", + "CosmosServiceEndpoint": "" + }, + "LuisSettings": { + "luisEndPoint": "" + }, + "AzureSearchSettings": { + "indexName": "", + "queryApiKey": "", + "searchServiceName": "" + } +} diff --git a/wwwroot/default.html b/wwwroot/default.html new file mode 100644 index 0000000..9585dff --- /dev/null +++ b/wwwroot/default.html @@ -0,0 +1,418 @@ + + + + + + + EchoBot + + + + + +

+
+
+
EchoBot
+
+
+
+
+
Your bot is ready!
+
You can test your bot in the Bot Framework Emulator
+ by connecting to http://localhost:3978/api/messages.
+ +
Visit Azure + Bot Service to register your bot and add it to
+ various channels. The bot's endpoint URL typically looks + like this:
+
https://your_bots_hostname/api/messages
+
+
+
+
+ +
+ + +