Skip to content
This repository was archived by the owner on Dec 4, 2023. It is now read-only.

Commit 4573f00

Browse files
[Generator] Include Core Bot in the bot generator (#1097)
* Add core-bot as a template * Add missing ApplicationTest in sample and template * Rename generator to follow documentation as yo botbuilder-java, cleaning dependencies * Update echo and empty templates to use artifact property to execute the bot manually * Add descriptions for Core Bot Sample * Integrate Core Bot in generator, use of kebabCase for artifact, add big and tinyBot Co-authored-by: Martin Battaglino <martinbatta32@gmail.com>
1 parent 1eb5a85 commit 4573f00

File tree

30 files changed

+6177
-3548
lines changed

30 files changed

+6177
-3548
lines changed

Generator/generator-botbuilder-java/README.md

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,24 +15,30 @@ The generator supports three different template options. The table below can he
1515
| ---------- | --------- |
1616
| Echo&nbsp;Bot | A good template if you want a little more than "Hello World!", but not much more. This template handles the very basics of sending messages to a bot, and having the bot process the messages by repeating them back to the user. This template produces a bot that simply "echoes" back to the user anything the user says to the bot. |
1717
| Empty&nbsp;Bot | A good template if you are familiar with Bot Framework v4, and simply want a basic skeleton project. Also a good option if you want to take sample code from the documentation and paste it into a minimal bot in order to learn. |
18+
| Core Bot | A good template if you want to create advanced bots, as it uses multi-turn dialogs and [LUIS](https://www.luis.ai), an AI based cognitive service, to implement language understanding. This template creates a bot that can extract places and dates to book a flight. |
1819

1920
### How to Choose a Template
2021

2122
| Template | When This Template is a Good Choice |
2223
| -------- | -------- |
2324
| Echo&nbsp;Bot | You are new to Bot Framework v4 and want a working bot with minimal features. |
2425
| Empty&nbsp;Bot | You are a seasoned Bot Framework v4 developer. You've built bots before, and want the minimum skeleton of a bot. |
26+
| Core Bot | You are a medium to advanced user of Bot Framework v4 and want to start integrating language understanding as well as multi-turn dialogs in your bots. |
2527

2628
### Template Overview
2729

2830
#### Echo Bot Template
2931

30-
The Echo Bot template is slightly more than the a classic "Hello World!" example, but not by much. This template shows the basic structure of a bot, how a bot recieves messages from a user, and how a bot sends messages to a user. The bot will "echo" back to the user, what the user says to the bot. It is a good choice for first time, new to Bot Framework v4 developers.
32+
The Echo Bot template is slightly more than the a classic "Hello World!" example, but not by much. This template shows the basic structure of a bot, how a bot receives messages from a user, and how a bot sends messages to a user. The bot will "echo" back to the user, what the user says to the bot. It is a good choice for first time, new to Bot Framework v4 developers.
3133

3234
#### Empty Bot Template
3335

3436
The Empty Bot template is the minimal skeleton code for a bot. It provides a stub `onTurn` handler but does not perform any actions. If you are experienced writing bots with Bot Framework v4 and want the minimum scaffolding, the Empty template is for you.
3537

38+
#### Core Bot Template
39+
40+
The Core Bot template uses [LUIS](https://www.luis.ai) to implement core AI capabilities, a multi-turn conversation using Dialogs, handles user interruptions, and prompts for and validate requests for information from the user. This template implements a basic three-step waterfall dialog, where the first step asks the user for an input to book a flight, then asks the user if the information is correct, and finally confirms the booking with the user. Choose this template if want to create an advanced bot that can extract information from the user's input.
41+
3642
## Installation
3743

3844
1. Install [Yeoman](http://yeoman.io) using [npm](https://www.npmjs.com) (we assume you have pre-installed [node.js](https://nodejs.org/)).

Generator/generator-botbuilder-java/generators/app/index.js

Lines changed: 35 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -5,10 +5,9 @@
55
const pkg = require('../../package.json');
66
const Generator = require('yeoman-generator');
77
const path = require('path');
8-
const _ = require('lodash');
98
const chalk = require('chalk');
109
const mkdirp = require('mkdirp');
11-
const camelCase = require('camelcase');
10+
const _ = require('lodash');
1211

1312
const BOT_TEMPLATE_NAME_EMPTY = 'Empty Bot';
1413
const BOT_TEMPLATE_NAME_SIMPLE = 'Echo Bot';
@@ -18,6 +17,33 @@ const BOT_TEMPLATE_NOPROMPT_EMPTY = 'empty';
1817
const BOT_TEMPLATE_NOPROMPT_SIMPLE = 'echo';
1918
const BOT_TEMPLATE_NOPROMPT_CORE = 'core';
2019

20+
const bigBot =
21+
` ╭─────────────────────────────╮\n` +
22+
` ` +
23+
chalk.blue.bold(`//`) +
24+
` ` +
25+
chalk.blue.bold(`\\\\`) +
26+
` │ Welcome to the │\n` +
27+
` ` +
28+
chalk.blue.bold(`//`) +
29+
` () () ` +
30+
chalk.blue.bold(`\\\\`) +
31+
` │ Microsoft Java Bot Builder │\n` +
32+
` ` +
33+
chalk.blue.bold(`\\\\`) +
34+
` ` +
35+
chalk.blue.bold(`//`) +
36+
` /│ generator! │\n` +
37+
` ` +
38+
chalk.blue.bold(`\\\\`) +
39+
` ` +
40+
chalk.blue.bold(`//`) +
41+
` ╰─────────────────────────────╯\n` +
42+
` v${pkg.version}`;
43+
44+
const tinyBot =
45+
` ` + chalk.blue.bold(`<`) + ` ** ` + chalk.blue.bold(`>`) + ` `;
46+
2147
module.exports = class extends Generator {
2248
constructor(args, opts) {
2349
super(args, opts);
@@ -31,7 +57,7 @@ module.exports = class extends Generator {
3157

3258
initializing() {
3359
// give the user some data before we start asking them questions
34-
this.log(`\nWelcome to the Microsoft Java Bot Builder generator v${pkg.version}. `);
60+
this.log(bigBot);
3561
}
3662

3763
prompting() {
@@ -59,8 +85,8 @@ module.exports = class extends Generator {
5985
const botName = this.templateConfig.botName;
6086
const packageName = this.templateConfig.packageName.toLowerCase();
6187
const packageTree = packageName.replace(/\./g, '/');
62-
const artifact = camelCase(this.templateConfig.botName);
63-
const directoryName = camelCase(this.templateConfig.botName);
88+
const artifact = _.kebabCase(this.templateConfig.botName).replace(/([^a-z0-9-]+)/gi, ``);
89+
const directoryName = _.camelCase(this.templateConfig.botName);
6490
const template = this.templateConfig.template.toLowerCase();
6591

6692
if (path.basename(this.destinationPath()) !== directoryName) {
@@ -104,16 +130,16 @@ module.exports = class extends Generator {
104130
this.log(chalk.green('------------------------ '));
105131
this.log(chalk.green(' Your new bot is ready! '));
106132
this.log(chalk.green('------------------------ '));
107-
this.log(`Your bot should be in a directory named "${camelCase(this.templateConfig.botName)}"`);
133+
this.log(`Your bot should be in a directory named "${_.camelCase(this.templateConfig.botName)}"`);
108134
this.log('Open the ' + chalk.green.bold('README.md') + ' to learn how to run your bot. ');
109135
this.log('Thank you for using the Microsoft Bot Framework. ');
110-
this.log('\n< ** > The Bot Framework Team');
136+
this.log(`\n${tinyBot} The Bot Framework Team`);
111137
} else {
112138
this.log(chalk.red.bold('-------------------------------- '));
113139
this.log(chalk.red.bold(' New bot creation was canceled. '));
114140
this.log(chalk.red.bold('-------------------------------- '));
115141
this.log('Thank you for using the Microsoft Bot Framework. ');
116-
this.log('\n< ** > The Bot Framework Team');
142+
this.log(`\n${tinyBot} The Bot Framework Team`);
117143
}
118144
}
119145

@@ -191,14 +217,11 @@ module.exports = class extends Generator {
191217
{
192218
name: BOT_TEMPLATE_NAME_EMPTY,
193219
value: BOT_TEMPLATE_NOPROMPT_EMPTY
194-
}
195-
196-
/*,
220+
},
197221
{
198222
name: BOT_TEMPLATE_NAME_CORE,
199223
value: BOT_TEMPLATE_NOPROMPT_CORE
200224
}
201-
*/
202225
],
203226
default: (this.options.template ? _.toLower(this.options.template) : BOT_TEMPLATE_NOPROMPT_SIMPLE)
204227
}).then(answer => {
Lines changed: 216 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,216 @@
1+
# Setting up LUIS via CLI:
2+
3+
This README contains information on how to create and deploy a LUIS application. When the bot is ready to be deployed to production, we recommend creating a LUIS Endpoint Resource for usage with your LUIS App.
4+
5+
> _For instructions on how to create a LUIS Application via the LUIS portal, see these Quickstart steps:_
6+
> 1. _[Quickstart: Create a new app in the LUIS portal][Quickstart-create]_
7+
> 2. _[Quickstart: Deploy an app in the LUIS portal][Quickstart-deploy]_
8+
9+
[Quickstart-create]: https://docs.microsoft.com/azure/cognitive-services/luis/get-started-portal-build-app
10+
[Quickstart-deploy]:https://docs.microsoft.com/azure/cognitive-services/luis/get-started-portal-deploy-app
11+
12+
## Table of Contents:
13+
14+
- [Prerequisites](#Prerequisites)
15+
- [Import a new LUIS Application using a local LUIS application](#Import-a-new-LUIS-Application-using-a-local-LUIS-application)
16+
- [How to create a LUIS Endpoint resource in Azure and pair it with a LUIS Application](#How-to-create-a-LUIS-Endpoint-resource-in-Azure-and-pair-it-with-a-LUIS-Application)
17+
18+
___
19+
20+
## [Prerequisites](#Table-of-Contents):
21+
22+
#### Install Azure CLI >=2.0.61:
23+
24+
Visit the following page to find the correct installer for your OS:
25+
- https://docs.microsoft.com/en-us/cli/azure/install-azure-cli?view=azure-cli-latest
26+
27+
#### Install LUIS CLI >=2.4.0:
28+
29+
Open a CLI of your choice and type the following:
30+
31+
```bash
32+
npm i -g luis-apis@^2.4.0
33+
```
34+
35+
#### LUIS portal account:
36+
37+
You should already have a LUIS account with either https://luis.ai, https://eu.luis.ai, or https://au.luis.ai. To determine where to create a LUIS account, consider where you will deploy your LUIS applications, and then place them in [the corresponding region][LUIS-Authoring-Regions].
38+
39+
After you've created your account, you need your [Authoring Key][LUIS-AKey] and a LUIS application ID.
40+
41+
[LUIS-Authoring-Regions]: https://docs.microsoft.com/azure/cognitive-services/luis/luis-reference-regions#luis-authoring-regions]
42+
[LUIS-AKey]: https://docs.microsoft.com/azure/cognitive-services/luis/luis-concept-keys#authoring-key
43+
44+
___
45+
46+
## [Import a new LUIS Application using a local LUIS application](#Table-of-Contents)
47+
48+
### 1. Import the local LUIS application to luis.ai
49+
50+
```bash
51+
luis import application --region "LuisAppAuthoringRegion" --authoringKey "LuisAuthoringKey" --appName "FlightBooking" --in "./cognitiveModels/FlightBooking.json"
52+
```
53+
54+
Outputs the following JSON:
55+
56+
```json
57+
{
58+
"id": "########-####-####-####-############",
59+
"name": "FlightBooking",
60+
"description": "A LUIS model that uses intent and entities.",
61+
"culture": "en-us",
62+
"usageScenario": "",
63+
"domain": "",
64+
"versionsCount": 1,
65+
"createdDateTime": "2019-03-29T18:32:02Z",
66+
"endpoints": {},
67+
"endpointHitsCount": 0,
68+
"activeVersion": "0.1",
69+
"ownerEmail": "bot@contoso.com",
70+
"tokenizerVersion": "1.0.0"
71+
}
72+
```
73+
74+
For the next step, you'll need the `"id"` value for `--appId` and the `"activeVersion"` value for `--versionId`.
75+
76+
### 2. Train the LUIS Application
77+
78+
```bash
79+
luis train version --region "LuisAppAuthoringRegion" --authoringKey "LuisAuthoringKey" --appId "LuisAppId" --versionId "LuisAppversion" --wait
80+
```
81+
82+
### 3. Publish the LUIS Application
83+
84+
```bash
85+
luis publish version --region "LuisAppAuthoringRegion" --authoringKey "LuisAuthoringKey" --appId "LuisAppId" --versionId "LuisAppversion" --publishRegion "LuisAppPublishRegion"
86+
```
87+
88+
> `--region` corresponds to the region you _author_ your application in. The regions available for this are "westus", "westeurope" and "australiaeast". <br/>
89+
> These regions correspond to the three available portals, https://luis.ai, https://eu.luis.ai, or https://au.luis.ai. <br/>
90+
> `--publishRegion` corresponds to the region of the endpoint you're publishing to, (e.g. "westus", "southeastasia", "westeurope", "brazilsouth"). <br/>
91+
> See the [reference docs][Endpoint-API] for a list of available publish/endpoint regions.
92+
93+
[Endpoint-API]: https://westus.dev.cognitive.microsoft.com/docs/services/5819c76f40a6350ce09de1ac/operations/5819c77140a63516d81aee78
94+
95+
Outputs the following:
96+
97+
```json
98+
{
99+
"versionId": "0.1",
100+
"isStaging": false,
101+
"endpointUrl": "https://westus.api.cognitive.microsoft.com/luis/v2.0/apps/########-####-####-####-############",
102+
"region": "westus",
103+
"assignedEndpointKey": null,
104+
"endpointRegion": "westus",
105+
"failedRegions": "",
106+
"publishedDateTime": "2019-03-29T18:40:32Z",
107+
"directVersionPublish": false
108+
}
109+
```
110+
111+
To see how to create an LUIS Cognitive Service Resource in Azure, please see [the next README][README-LUIS]. This Resource should be used when you want to move your bot to production. The instructions will show you how to create and pair the resource with a LUIS Application.
112+
113+
[README-LUIS]: ./README-LUIS.md
114+
115+
___
116+
117+
## [How to create a LUIS Endpoint resource in Azure and pair it with a LUIS Application](#Table-of-Contents)
118+
119+
### 1. Create a new LUIS Cognitive Services resource on Azure via Azure CLI
120+
121+
> _Note:_ <br/>
122+
> _If you don't have a Resource Group in your Azure subscription, you can create one through the Azure portal or through using:_
123+
> ```bash
124+
> az group create --subscription "AzureSubscriptionGuid" --location "westus" --name "ResourceGroupName"
125+
> ```
126+
> _To see a list of valid locations, use `az account list-locations`_
127+
128+
129+
```bash
130+
# Use Azure CLI to create the LUIS Key resource on Azure
131+
az cognitiveservices account create --kind "luis" --name "NewLuisResourceName" --sku "S0" --location "westus" --subscription "AzureSubscriptionGuid" -g "ResourceGroupName"
132+
```
133+
134+
The command will output a response similar to the JSON below:
135+
136+
```json
137+
{
138+
"endpoint": "https://westus.api.cognitive.microsoft.com/luis/v2.0",
139+
"etag": "\"########-####-####-####-############\"",
140+
"id": "/subscriptions/########-####-####-####-############/resourceGroups/ResourceGroupName/providers/Microsoft.CognitiveServices/accounts/NewLuisResourceName",
141+
"internalId": "################################",
142+
"kind": "luis",
143+
"location": "westus",
144+
"name": "NewLuisResourceName",
145+
"provisioningState": "Succeeded",
146+
"resourceGroup": "ResourceGroupName",
147+
"sku": {
148+
"name": "S0",
149+
"tier": null
150+
},
151+
"tags": null,
152+
"type": "Microsoft.CognitiveServices/accounts"
153+
}
154+
```
155+
156+
157+
158+
Take the output from the previous command and create a JSON file in the following format:
159+
160+
```json
161+
{
162+
"azureSubscriptionId": "00000000-0000-0000-0000-000000000000",
163+
"resourceGroup": "ResourceGroupName",
164+
"accountName": "NewLuisResourceName"
165+
}
166+
```
167+
168+
### 2. Retrieve ARM access token via Azure CLI
169+
170+
```bash
171+
az account get-access-token --subscription "AzureSubscriptionGuid"
172+
```
173+
174+
This will return an object that looks like this:
175+
176+
```json
177+
{
178+
"accessToken": "eyJ0eXAiOiJKVtokentokentokentokentokeng1dCI6Ik4tbEMwbi05REFMcXdodUhZbkhRNjNHZUNYYyIsItokenI6Ik4tbEMwbi05REFMcXdodUhZbkhRNjNHZUNYYyJ9.eyJhdWQiOiJodHRwczovL21hbmFnZW1lbnQuY29yZS53aW5kb3dzLm5ldC8iLCJpc3MiOiJodHRwczovL3N0cy53aW5kb3dzLm5ldC83MmY5ODhiZi04NmYxLTQxYWYtOTFhYi0yZDdjZDAxMWRiNDcvIiwiaWF0IjoxNTUzODc3MTUwLCJuYmYiOjE1NTM4NzcxNTAsImV4cCI6MTU1Mzg4MTA1MCwiX2NsYWltX25hbWVzIjp7Imdyb3VwcyI6InNyYzEifSwiX2NsYWltX3NvdXJjZXMiOnsic3JjMSI6eyJlbmRwb2ludCI6Imh0dHBzOi8vZ3JhcGgud2luZG93cy5uZXQvNzJmOTg4YmYtODZmMS00MWFmLTkxYWItMmQ3Y2QwMTFkYjQ3L3VzZXJzL2ZmZTQyM2RkLWJhM2YtNDg0Ny04NjgyLWExNTI5MDA4MjM4Ny9nZXRNZW1iZXJPYmplY3RzIn19LCJhY3IiOiIxIiwiYWlvIjoiQVZRQXEvOEtBQUFBeGVUc201NDlhVHg4RE1mMFlRVnhGZmxxOE9RSC9PODR3QktuSmRqV1FqTkkwbmxLYzB0bHJEZzMyMFZ5bWZGaVVBSFBvNUFFUTNHL0FZNDRjdk01T3M0SEt0OVJkcE5JZW9WU0dzd0kvSkk9IiwiYW1yIjpbIndpYSIsIm1mYSJdLCJhcHBpZCI6IjA0YjA3Nzk1LThkZGItNDYxYS1iYmVlLTAyZjllMWJmN2I0NiIsImFwcGlkYWNyIjoiMCIsImRldmljZWlkIjoiNDhmNDVjNjEtMTg3Zi00MjUxLTlmZWItMTllZGFkZmMwMmE3IiwiZmFtaWx5X25hbWUiOiJHdW0iLCJnaXZlbl9uYW1lIjoiU3RldmVuIiwiaXBhZGRyIjoiMTY3LjIyMC4yLjU1IiwibmFtZSI6IlN0ZXZlbiBHdW0iLCJvaWQiOiJmZmU0MjNkZC1iYTNmLTQ4NDctODY4Mi1hMTUyOTAwODIzODciLCJvbnByZW1fc2lkIjoiUy0xLTUtMjEtMjEyNzUyMTE4NC0xNjA0MDEyOTIwLTE4ODc5Mjc1MjctMjYwOTgyODUiLCJwdWlkIjoiMTAwMzdGRkVBMDQ4NjlBNyIsInJoIjoiSSIsInNjcCI6InVzZXJfaW1wZXJzb25hdGlvbiIsInN1YiI6Ik1rMGRNMWszN0U5ckJyMjhieUhZYjZLSU85LXVFQVVkZFVhNWpkSUd1Nk0iLCJ0aWQiOiI3MmY5ODhiZi04NmYxLTQxYWYtOTFhYi0yZDdjZDAxMWRiNDciLCJ1bmlxdWVfbmFtZSI6InN0Z3VtQG1pY3Jvc29mdC5jb20iLCJ1cG4iOiJzdGd1bUBtaWNyb3NvZnQuY29tIiwidXRpIjoiT2w2NGN0TXY4RVNEQzZZQWRqRUFtokenInZlciI6IjEuMCJ9.kFAsEilE0mlS1pcpqxf4rEnRKeYsehyk-gz-zJHUrE__oad3QjgDSBDPrR_ikLdweynxbj86pgG4QFaHURNCeE6SzrbaIrNKw-n9jrEtokenlosOxg_0l2g1LeEUOi5Q4gQREAU_zvSbl-RY6sAadpOgNHtGvz3Rc6FZRITfkckSLmsKAOFoh-aWC6tFKG8P52rtB0qVVRz9tovBeNqkMYL49s9ypduygbXNVwSQhm5JszeWDgrFuVFHBUP_iENCQYGQpEZf_KvjmX1Ur1F9Eh9nb4yI2gFlKncKNsQl-tokenK7-tokentokentokentokentokentokenatoken",
179+
"expiresOn": "2200-12-31 23:59:59.999999",
180+
"subscription": "AzureSubscriptionGuid",
181+
"tenant": "tenant-guid",
182+
"tokenType": "Bearer"
183+
}
184+
```
185+
186+
The value needed for the next step is the `"accessToken"`.
187+
188+
### 3. Use `luis add appazureaccount` to pair your LUIS resource with a LUIS Application
189+
190+
```bash
191+
luis add appazureaccount --in "path/to/created/requestBody.json" --appId "LuisAppId" --authoringKey "LuisAuthoringKey" --armToken "accessToken"
192+
```
193+
194+
If successful, it should yield a response like this:
195+
196+
```json
197+
{
198+
"code": "Success",
199+
"message": "Operation Successful"
200+
}
201+
```
202+
203+
### 4. See the LUIS Cognitive Services' keys
204+
205+
```bash
206+
az cognitiveservices account keys list --name "NewLuisResourceName" --subscription "AzureSubscriptionGuid" -g "ResourceGroupName"
207+
```
208+
209+
This will return an object that looks like this:
210+
211+
```json
212+
{
213+
"key1": "9a69####dc8f####8eb4####399f####",
214+
"key2": "####f99e####4b1a####fb3b####6b9f"
215+
}
216+
```

0 commit comments

Comments
 (0)