Bot Builder SDK v4 からは、LUIS や QnA Maker サービスなどの接続情報を .bot ファイルに記述しておくことが推奨されています。ここでは、.bot ファイルから接続情報を取得するためのクラスを作成します。
ここで作るもの
こちらの実装 では、最初のステップとしてボットサーバ自体 (Azure Web Apps) のエンドポイント情報を .bot
ファイルから取得する実装を行いました (config.js
)。
ここでは、さらに、LUIS サービスや QnA Maker サービスを利用することを想定し、これらの情報も .bot
ファイルから取得できるように拡張します。
使用イメージとしては、下記のようにしてそれぞれの接続情報を簡単に読み込めるようにします。
単一のオブジェクトとしてまとめて取得するように実装することもできるのですが、分かりやすさのために、3 つの情報に分けて取得するようにしています。
LUIS や QnA Maker は、複数のアプリ(ナレッジベース)を同時に使用する可能性があるので、アプリ名を指定して接続情報を取得できるようにしています。
取得した情報は、次のように BotBuilder SDK が提供するクラスへの入力として使用することを想定しています。
botEndpoint
オブジェクトは、botbuilder
パッケージの BotFrameworkAdapter
クラスのコンストラクタに渡されます。luisEndpoint
オブジェクトは、botbuilder-ai
パッケージの LuisRecognizer
クラスのコンストラクタに渡されます。qnaEndpoint
オブジェクトは、botbuilder-ai
パッケージの QnAMaker
クラスのコンストラクタに渡されます。
下記は、実際に取得されるオブジェクトの内容の例です。
これらのオブジェクトは、上記のように SDK のクラスへの入力用に使用するので、各プロパティの値を直接参照することはないと思います。
botframework-config パッケージのインストール
.bot
ファイルのロードには、Node の botframework-config
パッケージが提供する BotConfiguration
クラスを使用します。
必要があれば、下記のようにインストールして、package.json
に依存関係を追記します。
実装
config.js 全体のコード
BotConfiguration.loadSync() のエラーについてのメモ
BotConfiguration.loadSync()
でエラーが発生して .bot
ファイルがうまく読み込めなかった場合、Microsoft 公式のサンプルコードでは「botFilePath
と botFileSecret
をちゃんと設定してください」といった感じのメッセージだけ表示して済ませています。
しかし、実際には .bot
ファイルを読み込めても記述内容がおかしい場合にはエラーが発生します(URL が求められているプロパティなのに URL の形式になっていない場合など)。
このチグハグなエラーメッセージのせいで結構ハマりました。。。
.bot
ファイルの読み込みがエラーになった場合に、その原因を明確にするためには、最低限 Error オブジェクトの内容(err.message
など)を出力してあげた方がよいです。
BotConfiguration#findServiceByNameOrId() で返される接続情報についてのメモ
BotConfiguration#findServiceByNameOrId()
で返される各サービスの接続情報に何が含まれるかは、下記の TypeScript のクラスとして定義されています。
- EndpointService class
appId
、appPassword
、endpoint
プロパティなどを持つ。
- LuisService class
appId
、authoringKey
、region
、subscriptionKey
、version
プロパティ、getEndpoint()
メソッドなどを持つ。getEndpoint()
メソッドの戻り値を使用すれば、通常は region
や version
プロパティの値を個別に参照する必要はない。authoringKey
は管理用のキーなので、実運用では subscriptionKey
を LUIS のエンドポイントキーとして使用すること。
- QnaMakerService class
endpointKey
、hostname
、kbId
、subscriptionKey
プロパティなどを持つ。subscriptionKey
は管理用のキーなので、実運用では endpointKey
を QnA Maker のエンドポイントキーとして使用すること。
LUIS と QnAMaker のキーはそれぞれ 2 種類ずつあって、どちらを実際のエンドポイントキーとして使用するかは注意すべきポイントです。
キーの区別がよくわからなくなってきた場合は、こちらの記事「LUIS と QnA Maker でキーの管理方法が異なるのはなぜか?」を参照してください。
findServiceByNameOrId()
の返すオブジェクトには、各種サービスの API を利用するために必要十分な情報が含まれていますが、.bot
ファイルに記述した内容をすべて取得できるというわけではないことに注意してください。
他にも、DispatchService、FileService、CosmosDbService、BlobStorageService など、サービスタイプに応じたクラスが定義されています。
サービスタイプの一覧は、ServiceType enum の定義を見れば分かるでしょう。
使用例
上記の config.js
で取得した接続情報の使用例です。
ボットコード全体を示すと長大になってしまうので、ここでは、BotFrameworkAdapter
、LuisRecgonizer
、QnAMaker
クラスのインスタンスを作成する部分を抜粋して示します。
BotFrameworkAdapter の初期化
LuisRecognizer の初期化
QnAMaker の初期化
関連記事