Dialogflow ES(Trial)のGlobal以外のリージョンにAPI接続する

今日はちょっとしたTipsを。

最近、チャットボットはDialogflowで作ることが多くなっています。Trial版でかなりのことができますし、特に有効期限があるわけでもありません。そこで、Dialogflowで会話の流れを作り、それを他のシステムからAPIで呼び出すということをしています。

Dialogflowは、デフォルトのGlobalリージョンのほか、例えば東京リージョンもあるので、日本のユーザーは東京を選びがちですよね。もちろん、それは理由あってのことなのですが。(レイテンシを気にしたりとか、データを海外に置きたくないとか。)

ただ、APIで呼び出すときにGlobal以外を選んでいる場合にどうやって呼び出したら良いのかが公式のリファレンスを読んでもよく分からなくて、結構迷ってしまったので、その方法を書いておきます。

JSONキーの取得

これは東京リージョンだからという話ではないのですが、API接続時には必要なので、まずはそこから書いておきます。

Dialogflow ES(またはTrial)でチャットボットを作る分には、特にGCPのユーザー登録は不要です。ただ、APIで呼び出したいということになると、GCPにユーザー登録する必要がでてきます。

GCP上にそのチャットボット用のプロジェクトが作成されるので、そのプロジェクトを使うためのJSONキーを取得します。

Dialogflowのフローの歯車アイコンから設定画面に入り、Generalタブの中にGoogle ProjectのProject IDが表示されています。これをクリックすると、GCPのプロジェクトの画面に遷移します。

このプロジェクトはデフォルトでDialogflow APIは有効になっているので、あとはJSONキーを発行すればOKです。
GCPのプロジェクトのメニューから、APIとサービス>認証情報の画面を開き、さらにサービスアカウントを管理画面を開いて、サービスアカウントの作成をクリックします。

適当なサービスアカウント名を付けた後、「このサービスアカウントにプロジェクトへのアクセスを許可する」でロール>オーナーを選択して完了ボタンをクリックすると、サービスカウントが作成されます。

ここで、ロールの設定をしないと、いざAPIを呼び出したときに権限エラーになるので注意しましょう。

次に、作成したサービスアカウントの画面を開き、キータブから鍵を追加>新しい鍵を追加>JSONと選択すると、JSONキーが作成されて、自動的にダウンロード画面が開きます。

NotebookでAPIを呼び出し

ここではJupyter Notebookを開いて、APIの呼び出しを試します。

まず、Dialogflow SDKをインストールします。これで、必要な依存パッケージを含め、すべてインストールされます。

!pip install google-cloud-dialogflow

いよいよDialogflow APIを呼び出します。

ここで、東京リージョンだとasia-northeast1となりますが、SessionClient作成時にclient_optionsとしてリージョンを指定したURLを指定します。また、セッションパス作成時のプロジェクトIDにもリージョンを含めます。

この2点が今回のTipsの神髄。(それ以外は単純にDialogflow APIを呼び出すまでの手順でしたね。)
ちなみに、asia-northeast1の代わりにglobalと指定するとGlobalにもアクセスできるようです。

from google.oauth2 import service_account
from google.cloud import dialogflow_v2beta1 as dialogflow
import json
import uuid

dialogflow_credential_path ='<ダウンロードしたJSONキーファイルパス>'
# 東京リージョン
location = 'asia-northeast1'

# セッションを識別するためUUIDでセッションIDを作成
session_id = uuid.uuid4()

with open(dialogflow_credential_path, 'r') as f:
    service_account_info = json.load(f)

credential = service_account.Credentials.from_service_account_info(service_account_info)
session_client = dialogflow.SessionsClient(
    credentials=credential,
    client_options={
        'api_endpoint': '%s-dialogflow.googleapis.com:443' % (location,)
    }
)
project_id = '%s/locations/%s' % (service_account_info['project_id'], location,)
session_path = session_client.session_path(project_id, session_id)

query_input = dialogflow.QueryInput(event=dialogflow.EventInput(name='WELCOME', language_code='ja'))

res = session_client.detect_intent(session=session_path, query_input=query_input)
response = res.query_result

print(response)

最初に書いたように、最近はDialogflowをよく使っているので、何かTipsがあればまた書いてみたいと思います。

この記事を書いた人

井上 研一

株式会社ビビンコ代表取締役、ITエンジニア/経済産業省推進資格ITコーディネータ。AI・IoTに強いITコーディネータとして活動。2018年、株式会社ビビンコを北九州市に創業。IoTソリューションの開発・導入や、画像認識モデルを活用したアプリの開発などを行っている。近著に「使ってわかった AWSのAI」、「ワトソンで体感する人工知能」。日本全国でセミナー・研修講師としての登壇も多数。