Bot State Service, 開発

Bot State Service の用途に迫る!

こんにちは!SecretaryBot を開発している、A’ です。

前回の投稿で、Dialog 間でデータを直接受け渡す方法が紹介されていましたが、”Bot State Service” を使ってもデータの受け渡しが可能です。この投稿では、Bot State Service の用途と利用方法をサンプルコードを交えて見ていきましょう!

Bot State Service とは

使い回しまくっている以下の図ですが、Bot State Service には一回も触れてきませんでした。公式ドキュメントのこの記事にも説明がありますが、Bot State Service は、会話がどこまで進んだかという状態や、会話の中で保持したい情報をキャッシュするためのサービスです。publish0

“会話の状態” とはもう少し具体的に各ユーザー毎の Dialog スタックの状況です。この記事で紹介されているとおり、各ユーザー毎の Dialog の処理を行っているかはスタックとして保持されており、スタックされた情報は、Bot State Service に保持されています。ということは知らない間にすでに State Service を使っています。

また、Dialog 内で、明示的に State Service 内にデータの書き込み、または取得を実施することが可能です。次の項目で State Service のデータの書き込みと取得方法を見ていきます。

State Service を使って Dialog 間の情報を渡してみる

Github にサンプルを追加しました。前回の MultiDialog のサンプルを書き換えたものです。ユーザーから見た時に書き換え前後で実施できることは変わりませんが、内部的には Bot State Service を使っています。大きな書き換え部分としては、以下です。

前回 :
FlightDialog クラスで取得した destination の情報を HotelDialog クラスに引数として渡していた。

今回 : 
FlightDialog クラスで取得した destination の情報を Bot State Service に保存。 HotelDialog クラス側では State Service に保存されていた情報を取得。

FlightDialog クラスで取得した destination の情報を Bot State Service へ保存しているのは FlightDialog.cs の AskOrigin メソッドの下記 5 行目の処理です。
保存する際は、Key-Value 型で保存するのでここでは例として、destinationKeyというキー名で保存しています。

private async Task AskOrigin(IDialogContext context, IAwaitable<IMessageActivity> result)
{
    var reply = await result;
    destination = reply.Text;
    context.UserData.SetValue("destinationKey", destination);
    await context.PostAsync($"OK you want to go {destination}.Where is the   origin place?");
    context.Wait(BookFlight);
}

さらに HotelDialog クラスにて Bot State Service 側の情報を取得しているのは HotelDialog.cs の StartAsync メソッドの下記 4 行目の処理です。

public async Task StartAsync(IDialogContext context)
{
    //Retreive UserData
    context.UserData.TryGetValue("destinationKey", out hotelLocation);

    await context.PostAsync("Welcome to HotelDialog");
    if (hotelLocation == null)
    {
        await context.PostAsync("Where do you want to go?");
        context.Wait(AskDuration);
    }
    else
    {
        await context.PostAsync("How long do you want to stay?");
        context.Wait(BookHotel);
    }
}

Bot State Service を利用したデータの保存、取得方法についてイメージできましたでしょうか。状況に応じて Bot State Service の利用も是非実装に応じて是非ご検討してみて下さい。

最後に

Bot State Service にはユーザー毎に何 Byte 程度のデータを保持できるのか等も調べてみたのですが公式ドキュメント、Blog には明確な技術はありませんでした何となくではありますが、あまりに大きなデータを入れるようには作られていないと思考えていますが…もし分かった方がいらっしゃったらコメントいただけますと幸いです。

->後日 Keisuke Fujino さんから、公式ドキュメントに “Each payload may be up to 32 kilobytes in size” と書いてあるというコメントをいただきましたーありがとうございます!この程度のサイズであれば、ユーザー毎の資格情報を保持するくらいの用途でしょうね。

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト / 変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト / 変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト / 変更 )

Google+ フォト

Google+ アカウントを使ってコメントしています。 ログアウト / 変更 )

%s と連携中