Edited at

Watson Assistant から IBM Cloud Functions の Action を呼び出す方法

More than 1 year has passed since last update.

(2018/6/19 Conversation -> Assistant の変更他、最新の情報にUpdate)

Watson Assistant(以降Assistant)の Dialog ノードから IBM Cloud Functions (以降ICF)の Actionを直接呼び出せるようになったので、設定手順を記載します。



  • 2018年6月現在この機能はβ版での提供となります。

  • 米国南部、ドイツのAssistant及びICFのインスタンスが前提となります。



概要

例えば天気予報を教えてくれるチャットボットを作成する場合、これまでの実装では下図のようにAssistantで抽出されたIntentやEntityに基づき、ユーザーアプリケーションが外部のサービス(ここではWeather Company Data)を呼び出す必要がありました。

ICFを使用するとAssistantのDialogノードからICFで定義したActionを直接呼び出すことができるようになります。ICFが外部サービスを呼び出し、応答の内容を生成することができるため、結果Assistantからの応答内容を動的に変化させることができるようになります。

以降では前述の天気予報チャットボットを題材に、AssistantとICFの連携手順を記載します。


Weather Company Dataインスタンスの作成

IBM Cloudにログインし、Weather Company Dataサービスのインスタンスを作成します。

作成したサービスの資格情報は後ほど必要になるので保存しておきます。


ICFのActionの作成

IBM Cloudのカタログから「機能」を選択します。

「作成の開始」を選択します。

「アクションの作成」を選択します。

「アクション名」「ランタイム」を指定して、「作成」ボタンをクリックします。


ランタイムはNode.js、Python、PHP等、好みのものを指定できます。今回はNode.jsを使用します。


開いたエディターでNode.jsのコードを作成します。

var request = require('request');

var main = function(params){
var options = {
json:true,
auth:{
'user':'aaaaaa',
'password':'bbbbbb'
}
}

return new Promise(function(resolve, reject) {
options.url = 'https://twcservice.mybluemix.net/api/weather/v3/location/search?query=' + encodeURI(params.location) + '&language=ja-JP';
request.get(options, function (error, response, body) {
if (!error && response.statusCode == 200) {
var lat = body.location.latitude[0];
var lng = body.location.longitude[0];

options.url = 'https://twcservice.mybluemix.net/api/weather/v1/geocode/' + lat + '/' + lng + '/forecast/daily/3day.json?language=ja-JP';
request.get(options, function (error, response, body) {
if (!error && response.statusCode == 200) {
var forecast = body.forecasts[0].narrative;
resolve({"forecast":forecast});
}else{
reject();
}
})
} else {
reject();
}
})
})
}


コードの解説


  • user、passwordには前述の手順で保存した Weather Company Data の資格情報を使用します。

  • 1つ目の request.get で入力のlocation名の緯度、経度を取得します。

  • 2つ目の request.get で入力の緯度、経度の地点の天気予報を取得します。

作成したコードはこの画面でテストすることができます。コードを保存したら、「入力の変更」ボタンをクリックし、Actionへの入力値を指定します。今回の例では以下のようにlocationの名前を入力とします。

「起動」ボタンをクリックし、結果が正常に返ってくることを確認します。


Assistant設定に必要な情報の取得


Namespace名、Action名の取得

画面左側の「エンドポイント」を選択し、表示されるHTTPメソッドからNamespace名、Action名を保存しておきます。


一般的にNamespace名は「組織名_スペース名」という形式になります。



API キーの取得

以下の手順でAssistantからICFのActionを呼び出すために必要なAPIキーを取得します。

画面左上の「<-アクション」から前のページに戻ります。

「開始」セクションの「APIキー」を選択し、右側の画面で

をクリックして、伏字で表示されたキーを保存しておきます。


APIキーは xxxxxx:yyyyyy のようにコロン(:)で区切られた2つのフィールドから成っており、1番目のフィールドが user、2番目のフィールドが password となります。



AssistantのDialogフローの作成

Assistantのワークスペースを作成し、Intent、Entityを定義します。簡単のため、Intentは#weather、Entityは@location のみ作成します。(詳細な手順は省略)

Intentの構成例

Entityの構成例

Dialogフローにノードを追加し、条件式(If bot recognizes)は #weather 及び @location を設定します。

JSON editorには以下のように ICF の Action を呼び出すための JSON を定義をします。

{

"actions": [
{
"name": "/scorg01_dev/getWeather",
"type": "server",
"parameters": {
"location": "@location"
},
"credentials": "$private.my_credentials",
"result_variable": "context.getWeather_result"
}
]
}


JSONの解説


  • name には前述の手順で確認した /Namespace名/Action名 を設定します。

  • parameters は Action への入力となります。

  • credentials は ICF を呼び出すための APIキーになります。

  • Action からの出力は result_variable に指定した変数に格納されます。

作成したノードに子ノードを追加し、条件式(If bot recognizes)は true、応答(Then response with)は $getWeather_result.forecast を設定します。

親ノードで「Skip user input」を選択し、子ノードへのユーザー入力をスキップします。


Dialog フローのテスト

Try it outパネルから「Manage Context」を選択し、context変数 $private.my_credentials を設定します。

設定値は前述の手順で確認した、ICFのAPIキーに含まれるuser及びパスワードになります。

{"user":"xxxxxx","password":"yyyyyy"}

Try it out パネルから天気を聞くと応答が @location の値に従って変わることが確認できます。