注意:このバージョン(Microsoft.Bot.Builder 1.2.5)は、これを書いた数日後にメジャーバージョンアップデートがあったため古いです。新しい投稿をご参照ください。
レッツ 第4次産業革命♪
Microsoft Bot Frameworkの中の「Bot Builder for C#」の FormFlowについてです。
前段としてBot Frameworkとは?みたいな話は書いてません....こちらを参考に...
Bot Builder を使って開発する際、「Dialogs」と「FormFlow」というものがキーになるようですが、今回は「FormFlow」についてです。
公式のドキュメント
をざっくり試したメモです。
2016年7月時点の内容なので、数カ月でドキュメントも変わってしまう可能性高いですね。
> Environment
検証した環境は以下です。
- Visual Studio 2015 (update3)
- Microsoft.Bot.Builder 1.2.5
- Micfrosoft.Bot.Connector 1.1.0
- Microsoft.Rest.ClientRuntime 1.8.2
> Overview
- 1. シンプルなサンドイッチBot作成
- 2. Attributeを使ってみる
- 3. 次回...
1. シンプルなサンドイッチBot作成
なんと、classを作ればpublicの変数が質問の選択肢となって簡易なBotが作れるとのことなので、プロジェクトを作成してコーディングしていきます。
VSを開いて新しい[プロジェクト作成]→右上の検索で「bot」を入力して「BotApprication」を選択します。
出来上がったプロジェクトを見ると、ASP.NETのWebAPIってのがわかります。
Nugetで必要なライブラリをインポートしたり最新にしたりします。
VSの上部のメニューから、[ツール] → [Nugetパッケージマネージャー] → [ソリューションのNugetパッケージマネージャーの管理]を開きます。
まずは[更新プログラム]を選択して全部新しいのにしときました。(依存関係で更新できないものがあれば、それはそのままで....。)
次は、「Microsoft.Bot.Builder」をインストールします。
[参照]で、「microsoft.bot」と入れて検索すればさっと出てきます。
次に、Dialogsってフォルダーを作りました(検証なのでプロジェクトのフォルダ構成なんてどうでもいいですが)。
その中に「SandwichOrder」クラスを新規に作ります。このクラスが、質問とその回答の選択肢となるようです。
次は、既存のMessagesControllerクラスを開きます。
さっそく(このブログを書いてる時期ではお決まりの)エラーがでてますでしょうかね....Microsoft.Bot.Connectorの1.0から1.1への変更によるもので...
不要なusingを削除するエラーを消します。
MakeRootDialogメソッドの追加(29行目)と、Postメソッドの変更(21行目)をします。
こ....これだけ?と思いつつ、デバッグ開始。
Botにアクセスするためのクライアントは、Bot Framework Emulatorを利用します。
起動したら、以下を設定
- ポート番号を空にする(しなくても大丈夫なんだけど、気持ち的に...)
- APIのURLを書く
- Localeをja-JPに(しなくてもいいんだけど、気持ち的に...)
- 「Hi」とか適当な文字を入れて送信ポチっ
でました。
サンドイッチの選択肢の最初「BLT」は、「ボーイズラブトラブル」というマンガのことですね(#違う)。
「ヘルプ」って入力すると、ヘルプっぽいのが出てきます。ほうほう...。
ヘルプに対応するコーディングはしてないけど、色々ついてますね。謎が深まります。
さらに、I18N用のコード書いてないけど、Localeをenにすると英語に切り替わる....ほほう...
SandwichOrderクラスで設定したpublicのPropertyの順番に質問を聞いてくるBotができました。
実用レベルではないけど...なんと簡単♪
2. Attributeを使ってみる
本家の「Improved Sandwich Bot」あたりの内容です。最初は、Attributeを使ってみようのコーナーです。
Attributeの一覧とソースはこちらに。
http://docs.botframework.com/sdkreference/csharp/dc/dfd/_attributes_8cs.html
http://docs.botframework.com/sdkreference/csharp/dc/dfd/_attributes_8cs_source.html
DescribeAttribute
最初は、Microsoft.Bot.Builder.FormFlow.DescribeAttribute Class Referenceです。
SandwichOptions Enumに以下のように設定すれば、
ふむふむ。
PromptAttribute
Microsoft.Bot.Builder.FormFlow.PromptAttribute Class Referenceです。
説明より見たほうが早い。
これでデバッグすると、
ふむふむ、いい感じです。
Promptに書いた「どの {&} にしますか ? {||}」の、{&}や{||}は、Pattern Languageと呼ばれるものだそうです。今回登場した2つについて、
{&} は、DescribeAttributeで設定した値(設定してなければ、プロパティ名)を表示してくれます。
{||}は、enumを選択肢の一覧として表示してくれます。特にコーディングしてないのに、選択肢が出てきたのは、これが作用していたからですね。
ということは、以下のようにPromptで{||}を消すと
選択肢がでなくなります。しかし、「?」または「ヘルプ」を入力すると、
あれま、親切に色々と機能がついてるもんですね。
(仕組みがわかってないけど...)
OptionalAttribute
Microsoft.Bot.Builder.FormFlow.OptionalAttribute Class Referenceは、C#でいうところのOption引数とにた感じですね(テキトー...)
選択肢はあるけど選ばなくてもいい場合に、Optionalをつけると幸せになれます。
こう実装すると...
「優先設定なし」という選択肢が追加されました。
(優先設定なしって日本語は微妙...)
TemplateAttribute
次は、Promptの代わりにTemplateを使ってみます。
まずは、SandwichOptionsにつけてみます。
TemplateUsageとChoiceStyleOptionsは、それぞれのリンク先に詳細あり....。
ここら辺の設定がDefaultで設定されてるから、簡易なBotをサラッと作成できるんでしょうか...。
では、SandwichOrderクラスにTemplateをつけてみます。
TemplateUsage.NotUnderstoodは、クライアント側が入力した内容をBotが理解できなかった場合の応答をカスタムに設定できます。
PatternAttribute
http://docs.botframework.com/sdkreference/csharp/da/d2b/class_microsoft_1_1_bot_1_1_builder_1_1_form_flow_1_1_pattern_attribute.html
さっとしか触れませんが、正規表現もできるようですね。
ざっくりとした内容のみになってしまいましたが....長くなったので、続き(Adding Business Logicあたり)は次回にします。
→次を書いている途中でV1からV3に更新されてしまったので、続きを書くのはやめました...今後V3の情報を公開します。