Bot Framework と Microsoft Graph で DevOps その 10 : フォームフロー入門編

前回はダイアログ応用編として DialogPrompt の機能など紹介しました。今回はフォームフロー (FormFlow) 入門編をお届けします。 概要 前回 DialogPrompt を利用して、イベント作成に必要な情報を集めました。しかしフォームフローはこれをさらに簡単にしてくれます。フォームフローはクラスの定義を元に、適切なダイアログを作ってくれます。百読は一コードに如かずということで早速。 フォームフローを利用したイベントの作成 モデルの作成 フォームフローはモデルベースであるため、モデルを作ります。Microsoft.Graph.Event クラスをそのままモデルに使いたいんですが、Serializable 属性ないんですよね。あと不要なフィールドなどもあるので、新規作成を。 1. Visual Studio でボットアプリプロジェクトに Models フォルダを追加。 2. Models フォルダ内に、OutlookEvent.cs を追加し、以下と差し替え。Serializable 属性忘れないように。 using System; namespace O365Bot.Models {     [Serializable]     public class OutlookEvent     {         public string Subject { get; set; }         public string Description { get; set; }        … Read more

Bot Framework と Microsoft Graph で DevOps その 9 : ダイアログ応用編

※ 2017/6/10 ファンクションテスト修正 前回はダイアログ入門編として基礎を紹介しました。今回はイベント (予定) の追加を実装し、その中で応用編としてダイアログの便利な機能を紹介します。 DialogPrompt ボットアプリがユーザーと会話を行う際に、開発者は以下の点を考慮する必要があります。 ユーザーに返信する内容: 単純なテキストか、ボタンなどよりリッチなコンテンツか。 ユーザー入力の検証。数値や日付を期待している場合に、意図したものが返ってきたか。 意図しないものが返った場合のリトライ処理と文言の変更。 リトライしてもダメだった場合の処理。 他にも色々ありますが、DialogPrompt を使えば上記のことは簡単に処理できます。また DialogPrompt は多言語に対応しており、Activity の Locale を設定すれば自動的に任意の言語になります。開発者が指定するメッセージの多言語化はまたの機会に。 イベント追加機能の実装 GraphService の変更 1. IEventService.cs にイベントを作成するメソッドを追加。 public interface IEventService {     Task<List<Event>> GetEvents();     Task CreateEvent(Event @event); } 2. 実体である GraphService.cs もイベントを作る部分を追加します。 public async Task CreateEvent(Event @event) {     var client = await GetClient();            … Read more

Bot Framework と Microsoft Graph で DevOps その 8 : ダイアログ入門編

前回までで DevOps に必要な最低限の環境は整えました。今回から BotBuilder を深く。まずはダイアログ (Dialog) の入門編から。 ダイアログの概念 高度なボットはユーザーと会話することが必要です。つまり、ユーザーが言ったことを覚え、適切に次のアクションをとる必要があります。これ実装するのは結構骨なんですが、BotBuilder の Dialog 機能を使うと、とても簡単に実装ができます。通常 ダイアログは機能単位で分割して実装します。以下に本家の記事を引用して説明します。 引用元: https://docs.microsoft.com/ja-jp/bot-framework/bot-design-conversation-flow 以下の絵は通常のアプリとボットアプリの対比を示したもので、新しいオーダーから製品を探すフローを示しています。 通常アプリはメイン画面が起動。そこからオーダー画面を起動した場合、明示的に閉じられるか処理が完了するま画面はそのままです。一方ボットの場合は全てがルートダイアログから始まり、そこから オーダーダイアログが起動されると会話を引き継ぎ、明示的に中断されるか処理が完了すると ルートダイアログに処理が戻ります。 ダイアログのスタックと実際のユーザーの相違 ユーザーが開発者の意図通りに、ダイアログを順次実行するとは限らず、気分や状況で返事してきます。例えば。。 このようにボットアプリが予約を確定しようとしている段階で、「その映画何時だったかな?」と聞いてきたりします。この場合、以下のような処理が考えられます。 – ユーザーに、まず回答するように促す。 – これまでの処理をすべて破棄して、ユーザーの質問に回答する。 – ユーザーの質問に回答して、確認に戻る。 正確はなく、ユーザーシナリオやボットアプリに対する期待値によって解決策は変わります。 まぁ個人的には 3 つ目がいいですが。。 C# でのダイアログ実装 概念がわかったところで実装を。 RootDialog の実行 ボットアプリの実体はただの Web API で、常に MessagesController の Post メソッドにリクエストがきます。そこから Root Dialog を実行します。テンプレ通りです。 MessagesController.cs public async Task<HttpResponseMessage> Post([FromBody]Activity activity) {… Read more

Bot Framework と Microsoft Graph で DevOps その 7 : リリース定義の作成

※2017/6/10 アプリリリース定義の手順 6 画面ショット差し替え。テストアセンブリの指定が間違っていました。 前回はファンクションテストを実装しました。今回は VSTS でリリース定義を作成します。 リリース定義とは リリース定義はコンパイルしたモジュールを App Service などに公開する用途で使います。今回は以下の 3 つをやります。 – Infrastructure as a Code (Azure の場合は ARM テンプレート) を使って環境を自動整備 – リリース – ファンクションテスト ARM テンプレートの詳細はこちら ※今回の作業を始める前に、前回のファンクションテストチェックインした後に、ビルドが完了していることを確認しておいてください。 Azure Resource Manager テンプレート 前回手動で Azure App Services にアプリを公開しました。今回はこれをテンプレート化して自動的に行えるようにします。 テンプレートの取得 1. https://portal.azure.com にログイン。一旦前回作成したリソースグループを削除。 2. 新規から Web App を選択。 3. 各種設定を行い、作成ボタンが出るところまで進め、Create の横にある Automation options をクリック。 4. Download… Read more

Bot Framework と Microsoft Graph で DevOps その 6 : ファンクションテストのセットアップ

※この記事書いてて、前に出した記事のコード間違っていることに気づきました。すでに見てコピペした人は直してください。 前回はビルド定義まで作りました。今回はファンクションテストについて考えます。ちょっと長いです。 Bot Framework でのファンクションテスト Bot Framework では、Direct Line を使って通しのテストができます。しかし Bot Connector が特定の URL しか見ないので、テスト用のボットアプリも登録する必要があります。Infrastructure as a Code については次回。 Azure App Services へアプリを公開 1. ボットアプリプロジェクトを右クリックして Publish。 2. Microsoft Azure App Services を選択し、新規作成。 3. まず本番用に作成して、公開。 4. 公開が終わったら、Create new profile リンクから、もう 1 つプロファイルを作成。 5. テスト用に公開。別に同じリソースグループやサービスプランである必要はありません。 ボットアプリの登録 1. https://dev.botframework.com に行って、サインイン。 2. My Bots より Create a bot をクリック。… Read more