Create Bot for Microsoft Graph with DevOps 4: Continuous Integration – Build Definition

As I have basic application, it’s time to setup CI (Continuous Integration). Create Build Definition 1. Go to Visual Studio Team Services and go to Build & Release | Build. Click [New definition]. 2. Select ASP.NET (PREVIEW) template. 3. Set name. 4. Select [Get sources] and select the repo. As you see, you can use… Read more

Create Bot for Microsoft Graph with DevOps 3: Unit Testing with Moq, AutoFac and Fakes

In this article, I create an unit test for the feature I implemented in the last article. Mocking the service To do unit testing, you need to mock all dependencies. In this case, Graph Service and AuthBot are the ones. Mocking AuthBot By looking into the source code of AuthBot, it add extend method to… Read more

Create Bot for Microsoft Graph with DevOps 2: Get your appointment from Microsoft Graph and OAuth 2.0 with AuthBot

As we already setup VSTS and unit testing framework, let’s implement actual bot which can get my Outlook appointment. We can use OAuth 2.0 for Microsoft Graph, and AuthBot is the best module for our bot. AuthBot You can see the detail of AuthBot here. 1. Add AuthBot NuGet Package to O365Bot project. You need… Read more

Create Bot for Microsoft Graph with DevOps 1: Unit Testing Bot Framework application

In this series, I will develop a chat bot by using Microsoft Bot Framework and Graph API with VSTS to enable DevOps. Unit Tests for Bot Framework Testing is one of the key concept to make DevOps successful, but unit testing of Bot Framework is different from other projects such as MVC. The article below… Read more

Bot Framework と Microsoft Graph で DevOps その 22 : ダイレクトライン

今回はダイレクトラインについて。一応これでシリーズは終わりにします。まだまだネタはありますが、きりがない。。 概要 ボットコネクターは Skype、Facebook、電子メールなど複数のチャネルとの接続を提供しますが、LINE や独自アプリなどネイティブにサポートされていないアプリを接続する仕組みとして、REST 形式でアクセスできるダイレクトラインが提供されます。DevOps 観点でこのダイレクトラインが重要なのは、ファンクションテストで使っているからです。 機能 以下のことが出来ます。API 詳細はこちら。 REST API に対する認証 会話の開始と終了 メッセージの送受信 また接続方法は通常の HTTP 要求またはWebSocket が利用できます。 制限 WebSocket を使わない場合、ボットアプリからの通知をリアルタイムに順次受けることはできません。動作としては以下のようになります。 1. 会話を開始して、メッセージを送信。 2. ボットアプリ内ですべての処理が終わった時点でメッセージ送信処理が完了とみなされる。処理内でボットアプリからメッセージを返信していても、この時点では取得できない。 3. メッセージの受信を要求。キューされたすべてのメッセージを受信する。尚、自分が送信したメッセージも同時に受信。 差分受信 同一会話内でメッセージを送受信する場合は、Watermark と呼ばれる値をリクエストに付与することで、前回受信した以降のメッセージだけを受信可能。 ファンクションテスト DirectLineHelper.cs でダイレクトラインの機能を使っています。会話の開始とメッセージの送受信だけを行う、非常にシンプルな仕組みです。 WebSocket での利用 ファンクションテストは通常の HTTP 要求しか使っていないため、WebSocket のサンプルを作ってみましょう。 1. ボットアプリソリューションに新しくコンソールアプリプロジェクトを追加。O365Bot.StreamClient としました。 2. NuGet より DirectLine と WebSocketSharpモジュールを追加。また System.Configuration を参照に追加。 3. App.config に DirectLine… Read more

Bot Framework と Microsoft Graph で DevOps その 21 : コルタナを利用したボットアプリの音声対応

今回は音声対応について。Bot Framework の音声対応は二種類あります。 コルタナやエミュレーターなど音声出力をサポートするチャネル向け機能 Skype 向けの音声サポート Skype 向けの音声サポートは、これまで開発したコードの再利用ができないため今回は紹介しません。詳細はこちらをご覧ください。以降はコルタナなど音声出力をサポートするチャネル向け機能のみについて記載します。 音声の入出力 ユーザー視点では音声の入力と出力があります。BotBuilder は出力用の設定のみ可能で、実際に音声として出力されるかはチャネルの機能に依存します。また入力はチャネル側でテキストに変換してから送信する必要があります。尚、コルタナチャネルは現在英語のみサポートしています。 Speak プロパティ Acivity.Speak プロパティに音声出力用のデータを設定可能で、表示用と別に音声出力に最適な値が使えます。PromptDialog の場合には、speak/retrySpeak 引数に設定できます。値は単純な文字列、または Speech Synthesis Markup Language (SSML) が使えます。SSML を使うとボリュームやスピード、アクセントなど細かな制御が可能です。SSML の詳細はこちら。 インプットヒント インプットヒントを使うと、ユーザーに応答をした後、次のインプットを待機するか、終了するかを指示できます。 AcceptingInput: マイクはオフにして、音声の返信を待機しない。 ExpectingInput: マイクをオンにして、音声の返信を待機する。 IgnorningInput: テキスト入力およびマイク共にオフにして、入力を無視する。 既定値は処理によって変わります。 PromptDialog: プロンプトを使っているので回答を期待するため、ExpectingInput が既定。 単純な返信: AcceptingInput が既定。 連続した返信: 最後の返信を送るまでは、IgnorningInput。最後は AcceptingInput。 ボットアプリの構成 コルタナ対応のボットはマイクロソフトアカウントで登録する必要があります。 1. https://dev.botframework.com にログイン。 2. 登録済のボットを選択。 3. Add a channel よりコルタナを選択。… Read more

Bot Framework と Microsoft Graph で DevOps その 20 : ステートサービスで状態の管理

今回は状態管理について。既にアプリのコードで多用してますけど、あらためて説明を。 概要 ボットに欠かせない重要な機能が状態管理。例えば、前回ユーザーが何を言ったかという単純な事から、ユーザーや会話のコンテキストを理解するため等に使います。Bot Framework はステートサービスと呼ばれる状態管理の仕組みを提供しており、ダイアログやフォームフローは、裏でこの仕組みを使ってユーザーとの会話を管理しています。 スコープ Bot Framework は以下 3 つのスコープで状態管理が行えます。 ユーザー単位 (UserData) : 会話に関わらずユーザー個人としてのステート。 会話単位 (ConversationData) : 現在の会話に関するステート。会話は対個人も対グループもある。 会話の中の個人単位 (PrivateConversationData) : 現在の会話かつ、特定個人に関するステート。 どのスコープにデータを保存するかは、データの性質によって変えます。 ステートサービスのデータ保存場所 既定でマイクロソフトが管理するサーバーに保存しますが、独自に管理したい場合、任意の Azure Table Storage か DocumentDB に変更が可能です。サンプルが GitHub に公開されているので参考にしてください。データの保存地域やスペックも独自に決められるため、パフォーマンス向上にもなります。 尚、以下主な注意点。 ステートはチャネル単位。実質同一ユーザーでもチャネルが異なるとステートは別と扱われる。 保存するデータはシリアライズ可能なもの。 保存できるデータサイズは 64 KB。情報元はこちら。マスターデータ的なものは別途他の DB から取得し、ボットアプリに関連する情報のみステートサービスに保存。 ステートサービスはボットアプリを公開するサーバーとは異なる場所にデータを保存するため、サービスを再公開してもデータは消えない。一方エミュレータを使っている場合、ステート情報はエミュレータ内に保持。よってエミュレータを再起動するとデータが消える。 ステートクライアント ステートサービスに接続するためのクライアントは、以下の方法で作成、取得できます。 新規に作成 StateClient stateClient = new StateClient(new MicrosoftAppCredentials(microsoftAppId, microsoftAppPassword)); Activity から作成… Read more

Bot Framework と Microsoft Graph で DevOps その 19 : LUIS と多言語対応ボットの実装編

※2017/6/19 ユニットテストで必要なファイルが抜けていたため、追加 前回は LUIS 応用編ということでエンティティやフォームフローとの連携を紹介しました。今回は開発中のボットアプリに組み込むところとユニットテストについて見ていきます。 多言語対応 将来的に日本語で datetimeV2 が出れば別ですが、今回は英語版の LUIS を使います。よってユーザーからのメッセージは一旦翻訳しましょう。 翻訳サービス Cognitive の翻訳サービスを使います。詳細はこちら。ただ、探し方が悪いのか C# SDK がなかった。。 1. Azure ポータルから Translator Text API のキーを取得します。 2. ボットアプリプロジェクトの Services フォルダに ITranslationService.cs を追加し、コードを差し替え。 using System.Threading.Tasks; namespace O365Bot.Services {     public interface ITranslationService     {         Task<string> Translate(string content, string from, string to);     } } 3. TranslationService.cs を追加し、コードを差し替え。… Read more

Bot Framework と Microsoft Graph で DevOps その 18 : エンティティとフォームフローの連携!LUIS 応用編

前回 LUIS 入門編としてインテントと LUIS ダイアログの簡単な使いかたを紹介しました。今回は応用編として LUIS のエンティティとフォームフローとの密な連携を紹介します。尚、ボットアプリへの本格的な実装は次回で。 エンティティの活用 エンティティとは、文章におけるキーワードをカテゴライズしたものです。 Prebuilt domains 日本語ではまだ対応してませんが、LUIS はよくあるシナリオに関して、事前に定義したインテントとエンティティを追加できます。 1. https://luis.ai より前回作成した O365Bot_EN を開きます。 2. 左のメニューより Prebuilt domains をクリック。Calender を選択します。Learn more クリックすると追加されるインテントとエンティティの情報が表示されます。 3. 追加されたら左のメニューより Intents をクリック。インテント増えていることを確認します。それぞれに例文もあります。 4. Calnder.Add を開いて、どのような例文が登録されているか確認。[] で囲まれているのはエンティティとして認識される場所です。 5. Entities メニューから追加されたエンティティも確認。 6. 内容が重複するため、CreateEvent と GetEvents インテントを削除します。 カスタムエンティティの追加 Prebuild domain 同様、よく使うエンティティも事前定義されています。上記手順では時間についてのエンティティがないため、追加します。 1. 左のメニューより Entities をクリックします。 2. Add prebuild entity をクリック。… Read more

Bot Framework と Microsoft Graph で DevOps その 17 : 自然言語処理を試す LUIS 入門編

今回は LUIS (Language Understanding Intelligent Service) の入門編を。LUIS を使うことで、文章の意図(インテント)とキーワード(エンティティ)を取得することが出来ます。まずはイベント取得とイベント作成のインテントと取れるようにしてみます。 LUIS の登録と作成 1. https://luis.ai にアクセス。アカウントがない場合はアカウントの作成。ある場合はサインイン。 2. New App をクリックして新しいアプリを登録。 3. 日本語用の LUIS アプリをまず作成。 4. Create Intent をクリックして、Add Intent をクリック。 5. インテント名を GetEvents として保存。 6. テキストボックスに例文を入力。最低 5 個は入力して、保存。 7. 同じ手順で CreateEvent インテントも作成。 8. 左のメニューより Train & Test をクリックして、Train Application をクリック。 9. 例文を入力して、結果を確認。登録時とは異なる言い方をしましたが、無事インテント取得出来ました。 10. 左メニューより Publish App を選択して、Add a… Read more