8000 Merge pull request #176 from microsoft/daveta-flask-corebot · zigri2612/botbuilder-python@51be326 · GitHub
[go: up one dir, main page]

Skip to content

Commit 51be326

Browse files
authored
Merge pull request microsoft#176 from microsoft/daveta-flask-corebot
Flask Core-Bot Sample
2 parents de7e87f + 222876b commit 51be326

20 files changed

+1081
-0
lines changed
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+
```
Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
# CoreBot
2+
3+
Bot Framework v4 core bot sample.
4+
5+
This bot has been created using [Bot Framework](https://dev.botframework.com), it shows how to:
6+
7+
- Use [LUIS](https://www.luis.ai) to implement core AI capabilities
8+
- Implement a multi-turn conversation using Dialogs
9+
- Handle user interruptions for such things as `Help` or `Cancel`
10+
- Prompt for and validate requests for information from the user
11+
12+
## Prerequisites
13+
14+
This sample **requires** prerequisites in order to run.
15+
16+
### Overview
17+
18+
This bot uses [LUIS](https://www.luis.ai), an AI based cognitive service, to implement language understanding.
19+
20+
### Install Python 3.6
21+
22+
23+
### Create a LUIS Application to enable language understanding
24+
25+
LUIS language model setup, training, and application configuration steps can be found [here](https://docs.microsoft.com/azure/bot-service/bot-builder-howto-v4-luis?view=azure-bot-service-4.0&tabs=cs).
26+
27+
If you wish to create a LUIS application via the CLI, these steps can be found in the [README-LUIS.md](README-LUIS.md).
28+
29+
30+
## Testing the bot using Bot Framework Emulator
31+
32+
[Bot Framework Emulator](https://github.com/microsoft/botframework-emulator) is a desktop application that allows bot developers to test and debug their bots on localhost or running remotely through a tunnel.
33+
34+
- Install the Bot Framework Emulator version 4.3.0 or greater from [here](https://github.com/Microsoft/BotFramework-Emulator/releases)
35+
36+
### Connect to the bot using Bot Framework Emulator
37+
38+
- Launch Bot Framework Emulator
39+
- File -> Open Bot
40+
- Enter a Bot URL of `http://localhost:3978/api/messages`
41+
42+
43+
## Further reading
44+
45+
- [Bot Framework Documentation](https://docs.botframework.com)
46+
- [Bot Basics](https://docs.microsoft.com/azure/bot-service/bot-builder-basics?view=azure-bot-service-4.0)
47+
- [Dialogs](https://docs.microsoft.com/azure/bot-service/bot-builder-concept-dialog?view=azure-bot-service-4.0)
48+
- [Gathering Input Using Prompts](https://docs.microsoft.com/azure/bot-service/bot-builder-prompts?view=azure-bot-service-4.0&tabs=csharp)
49+
- [Activity processing](https://docs.microsoft.com/en-us/azure/bot-service/bot-builder-concept-activity-processing?view=azure-bot-service-4.0)
50+
- [Azure Bot Service Introduction](https://docs.microsoft.com/azure/bot-service/bot-service-overview-introduction?view=azure-bot-service-4.0)
51+
- [Azure Bot Service Documentation](https://docs.microsoft.com/azure/bot-service/?view=azure-bot-service-4.0)
52+
- [.NET Core CLI tools](https://docs.microsoft.com/dotnet/core/tools/?tabs=netcore2x)
53+
- [Azure CLI](https://docs.microsoft.com/cli/azure/?view=azure-cli-latest)
54+
- [Azure Portal](https://portal.azure.com)
55+
- [Language Understanding using LUIS](https://docs.microsoft.com/azure/cognitive-services/luis/)
56+
- [Channels and Bot Connector Service](https://docs.microsoft.com/azure/bot-service/bot-concepts?view=azure-bot-service-4.0)
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
# Copyright (c) Microsoft Corporation. All rights reserved.
2+
# Licensed under the MIT License.
3+
4+
class BookingDetails:
5+
def __init__(self, destination: str = None, origin: str = None, travel_date: str = None):
6+
self.destination = destination
7+
self.origin = origin
8+
self.travel_date = travel_date
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
# Copyright (c) Microsoft Corporation. All rights reserved.
2+
# Licensed under the MIT License.
3+
4+
from .dialog_bot import DialogBot
5+
from .dialog_and_welcome_bot import DialogAndWelcomeBot
6+
7+
__all__ = [
8+
'DialogBot',
9+
'DialogAndWelcomeBot']
Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
# Copyright (c) Microsoft Corporation. All rights reserved.
2+
# Licensed under the MIT License.
3+
4+
import json
5+
import os.path
6+
7+
from typing import List
8+
from botbuilder.core import CardFactory
9+
from botbuilder.core import ActivityHandler, ConversationState, UserState, TurnContext
10+
from botbuilder.dialogs import Dialog
11+
from botbuilder.schema import Activity, Attachment, ChannelAccount
12+
from helpers.activity_helper import create_activity_reply
13+
14+
from .dialog_bot import DialogBot
15+
16+
class DialogAndWelcomeBot(DialogBot):
17+
18+
def __init__(self, conversation_state: ConversationState, user_state: UserState, dialog: Dialog):
19+
super(DialogAndWelcomeBot, self).__init__(conversation_state, user_state, dialog)
20+
21+
async def on_members_added_activity(self, members_added: List[ChannelAccount], turn_context: TurnContext):
22+
for member in members_added:
23+
# Greet anyone that was not the target (recipient) of this message.
24+
# To learn more about Adaptive Cards, see https://aka.ms/msbot-adaptivecards for more details.
25+
if member.id != turn_context.activity.recipient.id:
26+
welcome_card = self.create_adaptive_card_attachment()
27+
response = self.create_response(turn_context.activity, welcome_card)
28+
await turn_context.send_activity(response)
29+
30+
# Create an attachment message response.
31+
def create_response(self, activity: Activity, attachment: Attachment):
32+
response = create_activity_reply(activity)
33+
response.attachments = [attachment]
34+
return response
35+
36+
# Load attachment from file.
37+
def create_adaptive_card_attachment(self):
38+
relative_path = os.path.abspath(os.path.dirname(__file__))
39+
path = os.path.join(relative_path, "resources/welcomeCard.json")
40+
with open(path) as f:
41+
card = json.load(f)
42+
43+
return Attachment(
44+
content_type= "application/vnd.microsoft.card.adaptive",
45+
content= card)
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
# Copyright (c) Microsoft Corporation. All rights reserved.
2+
# Licensed under the MIT License.
3+
4+
import asyncio
5+
6+
from botbuilder.core import ActivityHandler, ConversationState, UserState, TurnContext
7+
from botbuilder.dialogs import Dialog
8+
from helpers.dialog_helper import DialogHelper
9+
10+
class DialogBot(ActivityHandler):
11+
12+
def __init__(self, conversation_state: ConversationState, user_state: UserState, dialog: Dialog):
13+
if conversation_state is None:
14+
raise Exception('[DialogBot]: Missing parameter. conversation_state is required')
15+
if user_state is None:
16+
raise Exception('[DialogBot]: Missing parameter. user_state is required')
17+
if dialog is None:
18+
raise Exception('[DialogBot]: Missing parameter. dialog is required')
19+
20+
self.conversation_state = conversation_state
21+
self.user_state = user_state
22+
self.dialog = dialog
23+
self.dialogState = self.conversation_state.create_property('DialogState')
24+
25+
async def on_turn(self, turn_context: TurnContext):
26+
await super().on_turn(turn_context)
27+
28+
# Save any state changes that might have occured during the turn.
29+
await self.conversation_state.save_changes(turn_context, False)
30+
await self.user_state.save_changes(turn_context, False)
31+
32+
async def on_message_activity(self, turn_context: TurnContext):
33+
await DialogHelper.run_dialog(self.dialog, turn_context, self.conversation_state.create_property("DialogState"))

0 commit comments

Comments
 (0)
0