15
14

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

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

Last updated at Posted at 2018-02-14

(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)を呼び出す必要がありました。

wcs.png

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

wcsicf.png

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

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

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

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

ICFのActionの作成

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

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

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

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

ランタイムは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の名前を入力とします。

image.png

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

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

Namespace名、Action名の取得

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

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

API キーの取得

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

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

「開始」セクションの「APIキー」を選択し、右側の画面で image.png をクリックして、伏字で表示されたキーを保存しておきます。
image.png

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

AssistantのDialogフローの作成

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

Intentの構成例
image.png

Entityの構成例
image.png

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

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 を設定します。
image.png

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

Dialog フローのテスト

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

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

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

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

15
14
3

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
15
14

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?