IBM / watson-online-store

Learn how to use Watson Assistant and Watson Discovery. This application demonstrates a simple abstraction of a chatbot interacting with a Cloudant NoSQL database, using a Slack UI.
https://developer.ibm.com/patterns/create-cognitive-retail-chatbot/
156 stars 222 forks source link

Build Status

Creating a Retail Chatbot using Watson Assistant, Discovery and Database Services

Read this in other languages: 한국어

Watson Conversation is now Watson Assistant. Although some images in this code pattern may show the service as Watson Conversation, the steps and processes will still work.

In this developer code pattern we will create a Watson Assistant based chatbot that allows a user to: 1) find items to purchase using Watson Discovery, and 2) add and remove items from their cart by updating a Cloudant NoSQL Database.

When the reader has completed this code pattern, they will understand how to:

"architecture diagram"

Flow

  1. The user sends a message to the slackbot for online store.
  2. Slack sends this message to the running application.
  3. The application orchestrates the interactions between the various Watson services.
  4. The application queries the Cloudant database for the user's information, including the contents of their shopping cart, and writes the contents back to the database as they change.
  5. The application interacts with Watson Assistant to determine which response to send to Slack, and information passed back and forth in the conversation context determines actions within the application.
  6. Watson Discovery is used to get information about the items in the online store.

Included Components

Featured Technologies

Watch the Video

"video"

Steps

NOTE: Perform steps 1-7 OR click the Deploy to IBM Cloud button and hit Deploy and then jump to step 6.

NOTE: The Watson Discovery service is not available in the London region, so this application will require deployment in one of the other IBM Cloud regions.

Deploy to IBM Cloud

Deploy to IBM Cloud

If you encounter deployment errors, refer to Troubleshooting.

You can use the View app button to use a simple web UI to chat. For the Slack integration, use your Slack UI to chat after completing the additional slack configuration. Use the IBM Cloud dashboard to find and manage the app.

Run locally

  1. Clone the repo
  2. Create IBM Cloud services
  3. Get IBM Cloud credentials and add to .env
  4. Configure Watson Assistant
  5. Configure Watson Discovery
  6. Configure slack
  7. Run the application

1. Clone the repo

Clone the watson-online-store locally. In a terminal, run:

git clone https://github.com/ibm/watson-online-store

We’ll be using the file data/workspace.json and the folder data/ibm_store/

2. Create IBM Cloud services

Create the following services:

Cloudant choose legacy

3. Get IBM Cloud services Credentials and add to .env file

As you create the IBM Cloud services, you'll need to create service credentials and get the username and password:

"credentials"

Copy the watson-online-store/env.sample file to watson-online-store/.env and populate the service credentials and URLs as you create the credentials:

# Copy this file to .env and replace the credentials with 
# your own before running run.py.

# Watson Assistant
ASSISTANT_ID=<add_assistant_workspace>
ASSISTANT_URL=<add_assistant_url>
ASSISTANT_APIKEY=<add_assistant_apikey>

# Cloudant DB
CLOUDANT_USERNAME=<add_cloudant_username>
CLOUDANT_DB_NAME=watson-online-store
CLOUDANT_URL=<add_cloudant_url>
CLOUDANT_IAM_APIKEY=<add_cloudant_iam_apikey>

# Watson Discovery
DISCOVERY_URL=<add_discovery_url>
DISCOVERY_ENVIRONMENT_ID=<add_discovery_environment>
DISCOVERY_COLLECTION_ID=<add_discovery_collection>
DISCOVERY_APIKEY=<add_discovery_apikey>

# <Optional> - Slack
# If not set, only the web UI is available to test.
SLACK_BOT_TOKEN=<add_slack_bot_token>
SLACK_BOT_USER=<add_slack_bot_username>

4. Configure Watson Assistant

Import the Assistant workspace.json

To find the ASSISTANT_ID for Watson Assistant:

"Get Workspace ID"

Optionally, to view the conversation dialog select the workspace and choose the Dialog tab, here's a snippet of the dialog:

dialog

NOTE: If you want to modify the dialogs, there is a important context variable called get_input which accepts values yes/no. This controls if there is a need to wait for user input.

5. Configure Watson Discovery

Launch the Watson Discovery tool. wait for the storage to be set up. Create a new data collection by clicking Upload your own data Discovery will setup your storage. (You may be invited to upgrade for production quality, but you will be able to use this code pattern with the free trial version).

name_discovery

Seed the content by using either Drag and drop your documents here or browse from your computer. Choose the JSON files under data/ibm_store/.

Click on the left menu Manage Data icon and then click your newly created Data collection:

manage data

Under the Overview tab, Collection Info section, click Use this collection in API and copy the Collection ID and the Environment ID into your .env file as DISCOVERY_COLLECTION_ID and DISCOVERY_ENVIRONMENT_ID.

"Discovery IDs"

6. Configure Slack

Note: This code pattern includes Slack integration, but if you are only interested in the web UI, you can skip this step.

Create a slack group or use an existing one if you have sufficient authorization. (Refer to Slack's how-to on creating new groups.) To add a new bot, go to the Slack group’s application settings by navigating to https://<slack_group>.slack.com/apps/manage and selecting the Custom Integrations menu on the left.

manage_slack_settings

Click on Bots and then click the green Add Configuration button.

Give the bot a meaningful name. Note that the @ symbol is pre-populated by Slack and you do not include that in your .env configuration file. Save this in .env as SLACK_BOT_USER.

nameSlackbot

Once created save the API Token that is generated into the .env file as SLACK_BOT_TOKEN if you are running locally, or save this if you are using Deploy to IBM Cloud.

view_bot_token

Run /invite <botame> in a channel to invite the bot, or message it directly.

invite_bot

7. Run the application

If you used the Deploy to IBM Cloud button...

If you used Deploy to IBM Cloud, most of the setup is automatic, but not the Slack configuration. For that, we have to update a few environment variables.

In the IBM Cloud dashboard find the App that was created. Click on Runtime on the menu and navigate to the Environment variables tab.

env_vars

Update the three environment variables:

Save the new values and restart the application, watch the logs for errors.

If you decided to run the app locally...

NOTE: python 3 is required. There is no support for python 2.

The general recommendation for Python development is to use a virtual environment (venv). To install and initialize a virtual environment, use the venv module on Python 3.

# Create the virtual environment using Python. Use one of the two commands depending on your Python version.

$ python -m venv mytestenv       # Python 3.X

# Note, it may be named python3 on your system. In that case run:
$ python3 -m venv mytestenv

# Now source the virtual environment. Use one of the two commands depending on your OS.

$ source mytestenv/bin/activate  # Mac or Linux
$ ./mytestenv/Scripts/activate   # Windows PowerShell

Now go to the cloned repo directory:

cd watson-online-store

Install the Python requirements for this code pattern. Run:

$ pip install -r requirements.txt

# Note, it may be named pip3 on your system. In that case run:
$ pip3 install -r requirements.txt

TIP :bulb: To terminate the virtual environment use the deactivate command.

$ deactivate

Finally, run the application:

$ cd python-flask-server
$ python server.py

Demo

Slack Demo

Start a conversation with your bot:

convo_init

Add an item to your cart:

convo_add

convo_add

convo_review

convo_pay

Web UI Demo

Web UI

Troubleshooting

Links

Learn more

License

This code pattern is licensed under the Apache License, Version 2. Separate third-party code objects invoked within this code pattern are licensed by their respective providers pursuant to their own separate licenses. Contributions are subject to the Developer Certificate of Origin, Version 1.1 and the Apache License, Version 2.

Apache License FAQ