Bot Framework SDK for Javaで作ったWebアプリケーションとローカル環境で会話する


Botを開発できるBot Frameworkには現在4言語のSDKが用意されています。

Javaはまだプレビューですが、GitHubにサンプルがあったので試してみました。

echo-botを起動する

試したのは入力したメッセージをオウム返しする「02.echo-bot」です。このサンプルはSpring Bootで実装されています。

BotBuilder-Samplesをクローンして、「02.echo-bot」のフォルダを開きます。

git clone https://github.com/microsoft/BotBuilder-Samples.git

ビルドして

mvn clean package

実行します。

java -jar /target/*.jar

すると以下の画面が表示されます。

Emulatorを準備する

今回はローカル環境で試すため、Emulatorをダウンロードします。

https://github.com/Microsoft/BotFramework-Emulator/releases/tag/v4.5.2

実行すると以下のような画面が表示されます。

画面左下の設定(ギアマークのアイコン)をクリックします。

ngrokをダウンロードします。

「Path to ngrok」にダウンロードしたngrokの実行ファイルのパスを指定します。

Emulator起動後に表示された最初の画面を再度開いて、「Open Bot」ボタンでSpring BootのサンプルURLを設定します。

設定は以上です。Emulatorにメッセージを入力するとオウム返しで同じメッセージが返ってきます。

ハマったこと

最初ローカル環境で実行する際にはngrokは不要なのかなと(勝手に)思いこんでいて、「Path to ngrok」を空にしていました。そしてEmulatorでメッセージを入力すると以下のエラーが出て、原因がよくわからなくて困っていました。

POST 500 directline/conversations/<conversationId>/activities

Spring Bootでは以下のログが出ていて、ポート番号が異なるので、ngrokでトンネルしないだめなのかな?と試したところうまくいきました。

ERROR 11362 --- [          Bot-1] c.m.b.i.AdapterWithErrorHandler          : onTurnError

java.util.concurrent.CompletionException: java.net.ConnectException: Failed to connect to localhost/127.0.0.1:62833
        at java.base/java.util.concurrent.CompletableFuture.encodeThrowable(CompletableFuture.java:331) ~[na:na]
        at java.base/java.util.concurrent.CompletableFuture.completeThrowable(CompletableFuture.java:346) ~[na:na]
        at java.base/java.util.concurrent.CompletableFuture$UniApply.tryFire(CompletableFuture.java:632) ~[na:na]
        at java.base/java.util.concurrent.CompletableFuture.postComplete(CompletableFuture.java:506) ~[na:na]
        at java.base/java.util.concurrent.CompletableFuture.completeExceptionally(CompletableFuture.java:2088) ~[na:na]
        at retrofit2.CompletableFutureCallAdapterFactory$ResponseCallAdapter$2.onFailure(CompletableFutureCallAdapterFactory.java:123) ~[retrofit-2.5.0.jar!/:na]

以下のドキュメントをベースに進めていましたが、ngrok周りの設定が細かく出てこないのでハマってしまいました。

これをAzureのBot Serviceにデプロイしたいけど方法がわからない...と思っていたら以下に書いてありました。