アダプティブダイアログのアクション-リファレンスガイドActions in adaptive dialogs - reference guide

適用対象: 対象 SDK v4 対象外 SDK v3 APPLIES TO: yesSDK v4 no SDK v3

この記事では、Bot Framework SDK で定義されているアクションを、一般的な目的別にまとめて示します。This article lists the actions defined in the Bot Framework SDK, grouped by their general purpose.

ActivitiesActivities

実行するアクティビティActivity to accomplish アクション名Action Name このアクションで実行することWhat this action does
ユーザーへの応答などのアクティビティを送信します。Send any activity such as responding to a user. SendActivitySendActivity ユーザーへの応答などのアクティビティを送信します。Sends an activity, such as a response to a user.
アクティビティを更新するUpdate an activity UpdateActivityUpdateActivity 送信されたアクティビティを更新します。Updates an activity that was sent.
DeleteActivityDeleteActivity DeleteActivityDeleteActivity 送信されたアクティビティを削除します。Deletes an activity that was sent.
アクティビティのメンバーを取得するGet activity members GetActivityMembersGetActivityMembers アクティビティメンバーの一覧を取得し、メモリ内のプロパティに保存します。Gets a list of activity members and saves it to a property in memory.

コードサンプルについては、「アクティビティの例」を参照してください。For a code sample see Activities examples.

条件付きステートメントConditional statements

最初の 2 つのアクションは、作成した定義済みの条件に基づいて、ボットが決断を下すのに役立つように設計された条件付きステートメントです。The first two actions are conditional statements designed to help your bot make decisions based on any pre-defined condition that you have created. これらの条件は、true または false のブール値に評価されるブール式を使用する一連の条件付きステートメントによって指定します。These conditions are specified by a set of conditional statements having boolean expressions which are evaluated to a boolean value of true or false.

残りのアクションは、コレクション内のすべての要素に対してコード ブロックの実行を繰り返すことができるループ ステートメントに関連しています。The remaining actions relate to looping statements which enable you to repeat the execution of a block of code for every element in a collection.

実行するアクティビティActivity to accomplish アクション名Action Name このアクションで実行することWhat this action does
分岐: if/elseBranch: if/else IfConditionIfCondition ブール式に基づいて一連のアクションを実行します。Runs a set of actions based on a Boolean expression.
分岐:Switch (複数のオプション)Branch: Switch (Multiple options) SwitchConditionSwitchCondition パターン一致に基づいて一連のアクションを実行します。Runs a set of actions based on a pattern match.
ループ: 項目ごとLoop: for each item ForEachForEach 配列に格納されている値のセットをループします。Loops through a set of values stored in an array.
ループ: ページごと (複数の項目)Loop: for each page (multiple items) ForEachPageForEachPage 配列に格納されている大きな値のセットを、一度に1ページずつループします。Loops through a large set of values stored in an array, one page at a time.
ループを終了するExit a loop BreakLoopBreakLoop 外側のループを終了します。Exits the enclosing loop.
ループを続行するContinue a loop ContinueLoopContinueLoop 外側のループの次の反復処理を開始します。Starts the next iteration of the enclosing loop.
別のアクションに移動するGoto a different Action GotoActionGotoAction アクションの ID で識別される、指定されたアクションに制御を転送します。Transfers control to the specified action, identified by the action's ID.

コード サンプルについては「条件の作成例」を参照してください。For code samples see Create a condition examples.

ダイアログ管理Dialog management

実行するアクティビティActivity to accomplish アクション名Action Name このアクションで実行することWhat this action does
新しいダイアログを開始するBegin a new dialog BeginDialogBeginDialog 別のダイアログの実行を開始します。Begins executing another dialog. そのダイアログが終了すると、現在のトリガーの実行が再開されます。When that dialog finishes, the execution of the current trigger will resume.
ダイアログを取り消すCancel a dialog CancelDialog アクティブなダイアログを取り消します。Cancels the active dialog. ダイアログをすぐに閉じるときに (それが処理中の停止を意味する場合でも) 使用します。Use when you want the dialog to close immediately, even if that means stopping mid-process.
すべてのダイアログを取り消すCancel all dialogs CancelAllDialogsCancelAllDialogs アクティブな親ダイアログを含むすべてのアクティブなダイアログを取り消します。Cancels all active dialogs including any active parent dialogs. スタックからすべてのダイアログを取り出す場合にこれを使用し、ダイアログ コンテキストの cancel all dialogs メソッドを呼び出すことで、ダイアログ スタックをクリアできます。Use this if you want to pop all dialogs off the stack, you can clear the dialog stack by calling the dialog context's cancel all dialogs method. CancelAllDialogs イベントが生成されます。Emits the CancelAllDialogs event.
このダイアログを終了するEnd this dialog EndDialogEndDialog アクティブなダイアログを終了します。Ends the active dialog. ダイアログを完了し、終了する前に結果を返す場合に使用します。Use when you want the dialog to complete and return results before ending. EndDialog イベントが生成されます。Emits the EndDialog event.
ダイアログのターンを終了するEnd dialog turn EndTurnEndTurn ダイアログを終了せずに、会話の現在のターンを終了します。Ends the current turn of conversation without ending the dialog.
このダイアログを繰り返すRepeat this dialog RepeatDialogRepeatDialog 親ダイアログを再起動するために使用します。Used to restart the parent dialog.
このダイアログを置換するReplace this dialog ReplaceDialogReplaceDialog 現在のダイアログを新しいダイアログに置き換えますReplaces the current dialog with a new dialog
GetConversationMembersGetConversationMembers GetConversationMembersGetConversationMembers 会話のメンバーの一覧を取得し、それをメモリ内のプロパティに保存できます。Enables you to get a list of the conversation members and save it to a property in memory.
EditActionsEditActions EditActionsEditActions ユーザー入力に基づいて、現在のアクション シーケンスをすぐに編集できます。Enables you to edit the current action sequence on the fly based on user input. 中断を処理する場合に特に便利です。Especially useful when handling interruptions.

コード サンプルについては、「ダイアログ管理の例」を参照してください。For code samples see Dialog management examples.

プロパティの管理Manage properties

実行するアクティビティActivity to accomplish アクション名Action Name このアクションで実行することWhat this action does
配列を編集するEdit an array EditArrayEditArray 配列に対して操作を実行します。Performs an operation on an array.
プロパティを削除するDelete a property DeletePropertyDeleteProperty メモリからプロパティを削除します。Removes a property from memory.
プロパティを削除するDelete properties DeletePropertiesDeleteProperties 一度に複数のプロパティを削除します。Removes multiple properties at once.
プロパティを作成または更新するCreate or update a property SetPropertySetProperty メモリ内のプロパティの値を設定します。Sets a property's value in memory.
プロパティを作成または更新するCreate or update properties SetPropertiesSetProperties 一度に複数のプロパティの値を設定します。Sets the value of multiple properties at once.

コード サンプルについては、「プロパティの管理の例」を参照してください。For code samples see Manage properties examples.

外部リソースにアクセスするAccess external resources

実行するアクティビティActivity to accomplish アクション名Action Name このアクションで実行することWhat this action does
スキル ダイアログを開始するBegin a skill dialog BeginSkillBeginSkill スキルを開始し、スキルが終了するまで活動をスキルに転送します。Begins a skill and forwards activities to the skill until the skill ends.
HTTP 要求を送信するSend an HTTP request HttpRequestHttpRequest エンドポイントに対して HTTP 要求を行います。Makes an HTTP request to an endpoint.
カスタム イベントを生成するEmit a custom event EmitEventEmitEvent カスタムイベントを発生させます。Raises a custom event. イベントに反応するカスタムトリガーをアダプティブダイアログに追加します。Add a custom trigger to the adaptive dialog to react to the event.
ユーザーのサインアウトSign out a user SignOutUserSignOutUser 現在サインインしているユーザーをサインアウトします。Signs out the currently signed in user.
カスタム コードを呼び出すCall custom code CodeActionCodeAction カスタムコードを呼び出します。Calls custom code. カスタムコードは非同期である必要があり、ダイアログコンテキストとオブジェクトをパラメーターとして受け取り、ダイアログの結果を返す必要があります。The custom code must be asynchronous, take a dialog context and an object as parameters, and return a dialog turn result.

コード サンプルについては、「外部リソースへのアクセスの例」を参照してください。For code samples see Access external resource examples.

デバッグ オプションDebugging options

実行するアクティビティActivity to accomplish アクション名Action Name このアクションで実行することWhat this action does
コンソールにログを記録するLog to console LogActionLogAction コンソールに書き込み、必要に応じて、メッセージをトレース アクティビティとして送信します。Writes to the console and optionally sends the message as a trace activity.
トレース イベントを生成するEmit a trace event TraceActivityTraceActivity 指定した任意のペイロードで、トレース アクティビティを送信します。Sends a trace activity with whatever payload you specify.

コード サンプルについては、「デバッグ オプションの例」を参照してください。For code samples see Debugging option examples.

ソース コードの例Source code examples

アクティビティの例Activities examples

アクティビティを送信するSend activity

アクティビティを送信します。Sends an activity.

// Example of a simple SendActivity step
var greetUserDialog = new AdaptiveDialog("greetUserDialog");
greetUserDialog.Triggers.Add(new OnIntent()
{
    Intent = "greetUser", 
    Actions = new List<Dialog>() {
        new SendActivity("Hello")
    }
});

// Example that includes reference to property on bot state.
var greetUserDialog = new AdaptiveDialog("greetUserDialog");
greetUserDialog.Triggers.Add(new OnIntent()
{
    Intent = "greetUser",
    Actions = new List<Dialog>()
    {
        new TextInput()
        {
            Property = "user.name",
            Prompt = new ActivityTemplate("What is your name?")
        },
        new SendActivity("Hello, ${user.name}")
    }
});

アクティビティを更新するUpdate activity

以前に送信されたアクティビティを更新します。Updates an activity that was previously sent. この ID は SendActivity への呼び出しから返されます。This ID is returned from the call to SendActivity.

new UpdateActivity ()
{
    ActivityId = "id",
    Activity = new ActivityTemplate("updated value")
}

アクティビティを削除するDelete activity

以前に送信されたアクティビティを削除します。Deletes an activity that was previously sent. 以前のアクティビティの ID が必要です。Requires the ID of the previous activity.

new DeleteActivity ()
{
    ActivityId = "id"
}

アクティビティのメンバーを取得するGet activity members

このターンに関連付けられているアクティビティのメンバーを取得し、その一覧をプロパティに保存します。Gets the members of the activity associated with this turn and saves the list to a property.

new GetActivityMembers()
{
    Property = "turn.activityMembers"
}

_アクティビティの送信_アクションに実際の応答テキストをハード コーディングする代わりに、言語の生成の使用に関する詳細について、「アダプティブ ダイアログでの言語の生成」を参照してください。See language generation in adaptive dialogs to learn more about using language generation instead of hard coding actual response text in the send activity action.

条件の作成の例Create a condition examples

IfConditionIfCondition

特定の条件に基づいて、会話フローを分岐します。Branches the conversational flow based on a specific condition. 条件は、アダプティブ式を使用して表します。Conditions are expressed using Adaptive expressions.

var addToDoDialog = new AdaptiveDialog("addToDoDialog");
addToDoDialog.Triggers.Add(new OnIntent()
{
    Intent = "addToDo",
    Actions = new List<Dialog>()
    {
        // Save the userName entity from a recognizer.
        new SaveEntity("dialog.addTodo.title", "@todoTitle"),
        new TextInput()
        {
            Prompt = new ActivityTemplate("What is the title of your todo?"),
            Property = "dialog.addTodo.title"
        },
        // Add the current todo to the todo's list for this user.
        new EditArray()
        {
            ItemsProperty = "user.todos",
            Value = "=dialog.addTodo.title"
            ChangeType = EditArray.ArrayChangeType.Push
        },
        new SendActivity("Ok, I have added ${dialog.addTodo.title} to your todos."),
        new IfCondition()
        {
            Condition = "toLower(dialog.addTodo.title) == 'call santa'",
            Actions = new List<Dialog>()
            {
                new SendActivity("Yes master. On it right now \\[You have unlocked an easter egg] :)")
            }
        },
        new SendActivity("You now have ${count(user.todos)} items in your todo.")
    }
});

SwitchConditionSwitchCondition

式の評価の結果に基づいて、会話フローを分岐します。Branches a conversational flow based on the outcome of an expression evaluation. 詳細については、「アダプティブ式」を参照してください。See Adaptive expressions for more information.

// Create an adaptive dialog.
var cardDialog = new AdaptiveDialog("cardDialog");
cardDialog.Triggers.Add(new OnIntent()
{
    Intent = "ShowCards",
    Actions = new List<Dialog>()
    {
        // Add choice input.
        new ChoiceInput()
        {
            // Output from the user is automatically set to this property
            Property = "turn.cardDialog.cardChoice",

            // List of possible styles supported by choice prompt.
            Style = ListStyle.Auto,
            Prompt = new ActivityTemplate("What card would you like to see?"),
            Choices = new ChoiceSet(new List<Choice>() {
                new Choice("Adaptive card"),
                new Choice("Hero card"),
                new Choice("Video card")
            })
        },
        // Use SwitchCondition step to dispatch to right dialog based on choice input.
        new SwitchCondition()
        {
            Condition = "turn.cardDialog.cardChoice",
            Cases = new List<Case>()
            {
                new Case("Adaptive card",  new List<Dialog>() { new SendActivity("${AdaptiveCardRef()}") } ),
                new Case("Hero card", new List<Dialog>() { new SendActivity("${HeroCard()}") } ),
                new Case("Video card",     new List<Dialog>() { new SendActivity("${VideoCard()}") } ),
            },
            Default = new List<Dialog>()
            {
                new SendActivity("[AllCards]")
            }
        }
}));

ForEachForEach

Foreach ループは、配列やコレクションの要素を取得するための便利な方法です。The Foreach loop is a convenient way to retrieve elements of an array or a collection. コレクション内の各項目に対してアクションを実行するために多く使われます。It is often used to perform action on each item in a collection.

var rootDialog = new AdaptiveDialog(nameof(AdaptiveDialog))
{
    Generator = new TemplateEngineLanguageGenerator(),
    Triggers = new List<OnCondition>()
    {
        new OnUnknownIntent()
        {
            Actions = new List<Dialog>()
            {
                new SetProperty()
                {
                    Property = "turn.colors",
                    Value = "=createArray('red', 'blue', 'green', 'yellow', 'orange', 'indigo')"
                },
                new Foreach()
                {
                    ItemsProperty = "turn.colors",
                    Actions = new List<Dialog>()
                    {
                        // By default, dialog.foreach.value holds the value of the item
                        // dialog.foreach.index holds the index of the item.
                        // You can use short hands to refer to these via
                        //      $foreach.value
                        //      $foreach.index
                        new SendActivity("${$foreach.index}: Found '${$foreach.value}' in the collection!")
                    }
                }
            }
        }
    }
};

ForEachPageForEachPage

コレクション内の項目にステップを適用するために使用します。Used to apply steps to items in a collection. ページ サイズは、一度に選択できるコレクション内の項目の数を示します。Page size denotes how many items from the collection are selected at a time.

var rootDialog = new AdaptiveDialog(nameof(AdaptiveDialog))
{
    Generator = new TemplateEngineLanguageGenerator(),
    Triggers = new List<OnCondition>()
    {
        new OnUnknownIntent()
        {
            Actions = new List<Dialog>()
            {
                new SetProperty()
                {
                    Property = "turn.colors",
                    Value = "=createArray('red', 'blue', 'green', 'yellow', 'orange', 'indigo')"
                },
                new ForeachPage()
                {
                    ItemsProperty = "turn.colors",
                    PageSize = 2,
                    Actions = new List<Dialog>()
                    {
                        // By default, dialog.foreach.page holds the value of the page
                        //      $foreach.page
                        new SendActivity("Page content: ${join($foreach.page, ', ')}")
                    }
                }
            }
        }
    }
};

ループを中断するBreak Loop

ループまたは現在のアクション シーケンスを中断します。Breaks out of a loop or the current action sequence.

var rootDialog = new AdaptiveDialog(nameof(AdaptiveDialog))
{
    Generator = new TemplateEngineLanguageGenerator(),
    Triggers = new List<OnCondition>()
    {
        new OnUnknownIntent()
        {
            Actions = new List<Dialog>()
            {
                new SetProperty()
                {
                    Property = "turn.colors",
                    Value = "=createArray('red', 'blue', 'green', 'yellow', 'orange', 'indigo')"
                },
                new Foreach()
                {
                    ItemsProperty = "turn.colors",
                    Actions = new List<Dialog>()
                    {
                        new IfCondition()
                        {
                            Condition = "$foreach.value == 'green'",
                            Actions = new List<Dialog>()
                            {
                                new BreakLoop()
                            },
                            ElseActions = new List<Dialog>()
                            {
                                // By default, dialog.foreach.value holds the value of the item
                                // dialog.foreach.index holds the index of the item.
                                // You can use short hands to refer to these via 
                                //      $foreach.value
                                //      $foreach.index
                                new SendActivity("${$foreach.index}: Found '${$foreach.value}' in the collection!")
                            }
                        },
                    }
                }
            }
        }
    }
};

ループを続行するContinue Loop

残りのステートメントを処理せずに、現在のループまたはアクション シーケンスを続行します。Continues the current loop or action sequence without processing the rest of the statements.

var rootDialog = new AdaptiveDialog(nameof(AdaptiveDialog))
{
    Generator = new TemplateEngineLanguageGenerator(),
    Triggers = new List<OnCondition>()
    {
        new OnUnknownIntent()
        {
            Actions = new List<Dialog>()
            {
                new SetProperty()
                {
                    Property = "turn.colors",
                    Value = "=createArray('red', 'blue', 'green', 'yellow', 'orange', 'indigo')"
                },
                new Foreach()
                {
                    ItemsProperty = "turn.colors",
                    Actions = new List<Dialog>()
                    {
                        new IfCondition()
                        {
                            // Skip items at even position in the collection.
                            Condition = "$foreach.index % 2 == 0",
                            Actions = new List<Dialog>()
                            {
                                new ContinueLoop()
                            },
                            ElseActions = new List<Dialog>()
                            {
                                // By default, dialog.foreach.value holds the value of the item
                                // dialog.foreach.index holds the index of the item.
                                // You can use short hands to refer to these via 
                                //      $foreach.value
                                //      $foreach.index
                                new SendActivity("${$foreach.index}: Found '${$foreach.value}' in the collection!")
                            }
                        },
                    }
                }
            }
        }
    }
};

Goto アクションGoto action

現在のアクション スコープ内のラベル付きアクションにジャンプします。Jump to a labelled action within the current action scope.

var adaptiveDialog = new AdaptiveDialog()
{
    Triggers = new List<OnCondition>()
    {
        new OnBeginDialog()
        {
            Actions = new List<Dialog>()
            {
                new GotoAction()
                {
                    ActionId = "end"
                },
                new SendActivity("this will be skipped."),
                new SendActivity()
                {
                    Id = "end",
                    Activity = new ActivityTemplate("The End.")
                }
            }
        }
    }
};

ダイアログ管理の例Dialog management examples

BeginDialogBeginDialog

新しいダイアログを開始し、ダイアログ スタックにプッシュします。Starts a new dialog and pushes it onto the dialog stack. BeginDialog では、ターゲット ダイアログの名前が必要です。これは、アダプティブ ダイアログやウォーターフォール ダイアログなどの任意の種類のダイアログを指定できます。BeginDialog requires the name of the target dialog, which can be any type of dialog including Adaptive dialog or Waterfall dialog etc.

BeginDialog アクションでは ResultProperty という名前のプロパティを定義します。これにより、ダイアログの終了時に結果を保存する場所を指定できます。The BeginDialog action defines a property named ResultProperty that allows you to specify where to save the results when the dialog ends.

new BeginDialog("BookFlightDialog")
{
    // Any value returned by BookFlightDialog will be captured in the property specified here.
    ResultProperty = "$bookFlightResult"
}

ヒント

Bot Framework SDK の任意のダイアログを呼び出すときと同様に、BeginDialog を呼び出して、アダプティブ ダイアログを呼び出すときに、options パラメーターを使用して、ダイアログの入力情報を渡すことができます。Just like when invoking any dialog in the Bot Framework SDK, when calling BeginDialog to invoke an adaptive dialog, you can use the options parameter to pass input information for the dialog.

EndDialogEndDialog

アクティブなダイアログは、スタックから取り出し、ダイアログの親に省略可能な結果を返すことで終了します。Ends the active dialog by popping it off the stack and returns an optional result to the dialog's parent.

既定で、アダプティブ ダイアログの defaultResultPropertydialog.results に設定されているため、ダイアログが自動的に終了するシナリオでは、メモリ スコープに設定されているすべてのものが呼び出し元に自動的に返されます。By default, adaptive dialogs have their defaultResultProperty set to dialog.results so anything that is set in that memory scope will automatically be returned to the caller in scenarios when the dialog auto ends itself. EndDialog アクションを使用してダイアログを終了する場合は、value プロパティで、呼び出し元に返されるものを指定する必要があります。If you end the dialog using the EndDialog action you'll need to specify what is returned to the caller in the value property.

new EndDialog()
{
    // Value property indicates value to return to the caller.
    Value = "=$userName"
}

ヒント

アダプティブ ダイアログでそのすべてのアクションの実行が完了すると、既定でダイアログが自動的に終了します。Adaptive dialogs will end automatically by default if the dialog has completed running all of its actions. この動作をオーバーライドするには、アダプティブ ダイアログの AutoEndDialog プロパティを false に設定します。To override this behavior, set the AutoEndDialog property on Adaptive Dialog to false.

CancelAllDialogCancelAllDialog

親ダイアログと子ダイアログを含む、スタック上のすべてのダイアログを削除します。Deletes all dialogs on the stack, including parent and child dialogs.

new CancelAllDialog()

EndTurnEndTurn

ダイアログを終了せずに、会話の現在のターンを終了します。Ends the current turn of conversation without ending the dialog.

new EndTurn()

RepeatDialogRepeatDialog

親ダイアログを再起動します。Restarts the parent dialog. これは、ボットがユーザーに対して結果をページングして、ユーザーが移動できるようにする会話を行おうとする場合に特に便利です。This is particularly useful if you are trying to have a conversation where the bot is paging results to the user that they can navigate through.

重要

誤って無限ループを実装することがないように、EndTurn() またはユーザーから情報を収集するいずれかの入力を使用してください。Make sure to use EndTurn() or one of the Inputs to collect information from the user so you do not accidentally end up implementing an infinite loop.

var rootDialog = new AdaptiveDialog(nameof(AdaptiveDialog))
{
    Triggers = new List<OnCondition>()
    {
        new OnUnknownIntent()
        {
            Actions = new List<Dialog>()
            {
                new TextInput()
                {
                    Prompt = new ActivityTemplate("Give me your favorite color. You can always say cancel to stop this."),
                    Property = "turn.favColor",
                },
                new EditArray()
                {
                    ArrayProperty = "user.favColors",
                    Value = "=turn.favColor",
                    ChangeType = EditArray.ArrayChangeType.Push
                },
                // This is required because TextInput will skip prompt if the property exists - which it will from the previous turn.
                // Alternately you can also set `AlwaysPrompt = true` on the TextInput.
                new DeleteProperty() {
                    Property = "turn.favColor"
                },
                // Repeat dialog step will restart this dialog.
                new RepeatDialog()
            }
        },
        new OnIntent("CancelIntent")
        {
            Actions = new List<Dialog>()
            {
                new SendActivity("You have ${count(user.favColors)} favorite colors - ${join(user.favColors, ',', 'and')}"),
                new EndDialog()
            }
        }
    },
    Recognizer = new RegexRecognizer()
    {
        Intents = new List<IntentPattern>()
        {
            new IntentPattern()
            {
                Intent = "HelpIntent",
                Pattern = "(?i)help"
            },
            new IntentPattern()
            {
                Intent = "CancelIntent",
                Pattern = "(?i)cancel|never mind"
            }
        }
    }
};

ReplaceDialogReplaceDialog

新しいダイアログを開始し、スタック上の現在アクティブなダイアログを新しいダイアログで置き換えます。Starts a new dialog and replaces on the stack the currently active dialog with the new one.

// This sample illustrates the use of ReplaceDialog tied to explicit user confirmation
// to switch to a different dialog.

// Create an adaptive dialog.
var getUserName = new AdaptiveDialog("getUserName");
getUserName.Triggers.Add(new OnIntent()
{
    Intent = "getUserName",
    Actions = new List<Dialog>()
    {
        new TextInput()
        {
            Property = "user.name",
            Prompt = new ActivityTemplate("What is your name?")
        },
        new SendActivity("Hello ${user.name}, nice to meet you!")
    }
});

getUserName.Triggers.Add(new OnIntent()
{
    Intent = "GetWeather",
    Actions = new List<Dialog>()
    {
        // confirm with user that they do want to switch to another dialog
        new ChoiceInput()
        {
            Prompt = new ActivityTemplate("Are you sure you want to switch to talk about the weather?"),
            Property = "turn.contoso.getWeather.confirmChoice",
            Choices = new ChoiceSet(new List<Choice>()
            {
                new Choice("Yes"),
                new Choice("No")
            })
        },
        new SwitchCondition()
        {
            Condition = "turn.contoso.getWeather.confirmChoice",
            Cases = new List<Case>()
            {
                // Call ReplaceDialog to switch to a different dialog.
                // BeginDialog will keep current dialog in the stack to be resumed after child dialog ends.
                // ReplaceDialog will remove current dialog from the stack and add the new dialog.
                {
                    Value = "Yes",
                    Actions = new List<Dialog>()
                    {
                        new ReplaceDialog("getWeatherDialog")
                    }
                },
                {
                    Value = "No",
                    Actions = new List<Dialog>()
                    {
                        new EndDialog()
                    }
                }
            }
        }
    }
});

会話のメンバーを取得するGet conversation members

現在の会話のメンバーを取得し、その一覧をプロパティに保存します。Gets the members of the current conversation and saves the list to a property.

new GetConversationMembers()
{
    Property = "turn.convMembers"
}

EditActionsEditActions

現在のアクションのシーケンスを変更します。Modifies the current sequence of actions. 特に、中断を処理する場合に役立ちます。Specifically helpful when handling an interruption. EditActions を使用して、シーケンスの先頭または末尾にアクションを追加するなど、シーケンスの任意の場所でアクションを挿入または削除できます。You can use EditActions to insert or remove actions anywhere in the sequence, including adding actions to the beginning or end of the sequence.

var rootDialog = new AdaptiveDialog(nameof(AdaptiveDialog))
{
    Generator = new TemplateEngineLanguageGenerator(),
    Recognizer = new RegexRecognizer()
    {
        Intents = new List<IntentPattern>()
        {
            new IntentPattern()
            {
                Intent = "appendSteps",
                Pattern = "(?i)append"
            },
            new IntentPattern()
            {
                Intent = "insertSteps",
                Pattern = "(?i)insert"
            },
            new IntentPattern()
            {
                Intent = "endSteps",
                Pattern = "(?i)end"
            }
        }
    },
    Triggers = new List<OnCondition>()
    {
        new OnUnknownIntent()
        {
            Actions = new List<Dialog>()
            {
                new ChoiceInput()
                {
                    Prompt = new ActivityTemplate("What type of EditAction would you like to see?"),
                    Property = "$userChoice",
                    AlwaysPrompt = true,
                    Choices = new ChoiceSet(new List<Choice>()
                    {
                        new Choice("Append actions"),
                        new Choice("Insert actions"),
                        new Choice("End actions"),
                    })
                },
                new SendActivity("This message is after your EditActions choice..")
            }
        },
        new OnIntent()
        {
            Intent = "appendSteps",
            Actions = new List<Dialog>() {
                new SendActivity("In append steps .. Steps specified via EditSteps will be added to the current plan."),
                new EditActions()
                {
                    Actions = new List<Dialog>() {
                        // These steps will be appended to the current set of steps being executed.
                        new SendActivity("I was appended!")
                    },
                    ChangeType = ActionChangeType.AppendActions
                }
            }
        },
        new OnIntent() {
            Intent = "insertSteps",
            Actions = new List<Dialog>() {
                new SendActivity("In insert steps .. "),
                new EditActions()
                {
                    Actions = new List<Dialog>() {
                        // These steps will be inserted before the current steps being executed.
                        new SendActivity("I was inserted")
                    },
                    ChangeType = ActionChangeType.InsertActions
                }
            }
        },
        new OnIntent()
        {
            Intent = "endSteps",
            Actions = new List<Dialog>()
            {
                new SendActivity("In end steps .. "),
                new EditActions()
                {
                    // The current sequence will be ended. This is especially useful if you are looking to end an active interruption.
                    ChangeType = ActionChangeType.EndSequence
                }
            }
        }
    }
};

プロパティの管理の例Manage properties examples

SetPropertySetProperty

メモリにプロパティの値を設定するために使用します。Used to set a property's value in memory. 値には、明示的な文字列または式のいずれかを指定できます。The value can either be an explicit string or an expression. 式の詳細については、「アダプティブ式」を参照してください。See adaptive expressions to learn more about expressions.

new SetProperty()
{
    Property = "user.firstName",
    // If the value of user.name is 'Mahatma Gandhi', this sets first name to 'Mahatma'
    Value = "=split(user.name, ' ')[0]"
},

SetPropertiesSetProperties

1 つのアクションで 1 つ以上のプロパティを初期化します。Initialize one or more properties in a single action.

new SetProperties()
{
    Assignments = new List<PropertyAssignment>()
    {
        new PropertyAssignment()
        {
            Property = "user.name",
            Value = "Vishwac"
        },
        new PropertyAssignment()
        {
            Property = "user.age",
            Value = "=coalesce($age, 30)"
        }
    }
}

DeletePropertyDeleteProperty

メモリからプロパティを削除します。Removes a property from memory.

new DeleteProperty
{
    Property = "user.firstName"
}

DeletePropertiesDeleteProperties

1 回のアクションで複数のプロパティを削除します。Delete more than one property in a single action.

new DeleteProperties()
{
    Properties = new List<StringExpression>()
    {
        new StringExpression("user.name"),
        new StringExpression("user.age")
    }
}

EditArrayEditArray

配列プロパティに対して編集操作を実行するために使用します。Used to perform edit operations on an array property.

var addToDoDialog = new AdaptiveDialog("addToDoDialog");
addToDoDialog.Triggers.Add(new OnIntent()
{
    Intent = "addToDo",
    Actions = new List<Dialog>() {
        // Save the userName entity from a recognizer.
        new SaveEntity("dialog.addTodo.title", "@todoTitle"),
        new TextInput()
        {
            Prompt = new ActivityTemplate("What is the title of your todo?"),
            Property = "dialog.addTodo.title"
        },
        // Add the current todo to the todo's list for this user.
        new EditArray()
        {
            ItemsProperty = "user.todos",
            Value = "=dialog.addTodo.title"
            ChangeType = EditArray.ArrayChangeType.Push
        },
        new SendActivity("Ok, I have added ${dialog.addTodo.title} to your todos."),
        new SendActivity("You now have ${count(user.todos)} items in your todo.")
}));

外部リソースへのアクセスの例Access external resource examples

BeginSkillBeginSkill

BeginSkill アクションでは、指定されたスキルを開始し、スキルへのアクティビティの送信とスキルからのアクティビティの受信を管理し、スキルの終了時にスキルの結果があればそれを処理します。The BeginSkill action starts the specified skill, manages the forwarding of activities to the skill and receiving activities from the skill, and processes the skill result if any when the skill ends.

HttpRequestHttpRequest

これは、任意のエンドポイントに対して HTTP 要求を行う場合に使用します。Use this to make HTTP requests to any endpoint.

new HttpRequest()
{
    // Set response from the http request to turn.httpResponse property in memory.
    ResultProperty = "turn.httpResponse",
    Method = HttpRequest.HttpMethod.POST,
    Header = new Dictionary<string,string> (), /* request header */
    Body = { }                                 /* request body */
};

EmitEventEmitEvent

ボットが応答できるカスタム イベントを発生させるために使用します。Used to raise a custom event that your bot can respond to. 発生したイベントに対してバブリング動作を制御できるため、独自のダイアログにだけ含めたり、親チェーンに通知したりできます。You can control bubbling behavior on the event raised so it can be contained just to your own dialog or bubbled up the parent chain.

var rootDialog = new AdaptiveDialog(nameof(AdaptiveDialog))
    {
        Generator = new TemplateEngineLanguageGenerator(),
        Triggers = new List<OnCondition>()
        {
            new OnUnknownIntent()
            {
                Actions = new List<Dialog>()
                {
                    new TextInput()
                    {
                        Prompt = new ActivityTemplate("What's your name?"),
                        Property = "user.name",
                        AlwaysPrompt = true,
                        OutputFormat = "toLower(this.value)"
                    },
                    new EmitEvent()
                    {
                        EventName = "contoso.custom",
                        EventValue = "=user.name",
                        BubbleEvent = true,
                    },
                    new SendActivity("Your name is ${user.name}"),
                    new SendActivity("And you are ${$userType}")
                }
            },
            new OnDialogEvent()
            {
                Event = "contoso.custom",

                // You can use conditions (expression) to examine value of the event as part of the trigger selection process.
                Condition = "turn.dialogEvent.value && (substring(turn.dialogEvent.value, 0, 1) == 'v')",
                Actions = new List<Dialog>()
                {
                    new SendActivity("In custom event: '${turn.dialogEvent.name}' with the following value '${turn.dialogEvent.value}'"),
                    new SetProperty()
                    {
                        Property = "$userType",
                        Value = "VIP"
                    }
                }
            },
            new OnDialogEvent()
            {
                Event = "contoso.custom",

                // You can use conditions (expression) to examine value of the event as part of the trigger selection process.
                Condition = "turn.dialogEvent.value && (substring(turn.dialogEvent.value, 0, 1) == 's')",
                Actions = new List<Dialog>()
                {
                    new SendActivity("In custom event: '${turn.dialogEvent.name}' with the following value '${turn.dialogEvent.value}'"),
                    new SetProperty()
                    {
                        Property = "$userType",
                        Value = "Special"
                    }
                }
            },
            new OnDialogEvent()
            {
                Event = "contoso.custom",
                Actions = new List<Dialog>()
                {
                    new SendActivity("In custom event: '${turn.dialogEvent.name}' with the following value '${turn.dialogEvent.value}'"),
                    new SetProperty()
                    {
                        Property = "$userType",
                        Value = "regular customer"
                    }
                }
            }
        }
    };

ユーザーをサインアウトするSign out user

OAuth 入力を使用してサインインした、現在サインインしているユーザーをサインアウトします。Sign out current signed in user that's been signed in using an OAuth Input.

new SignOutUser()
{
    UserId = "userid",
    ConnectionName = "connection-name"
}

CodeActionCodeAction

名前が示すように、このアクションにより、カスタム コードを呼び出すことができます。As the name implies, this action enables you to call a custom piece of code.

// Example customCodeStep method
private async Task<DialogTurnResult> CodeActionSampleFn(DialogContext dc, System.Object options)
{
    await dc.Context.SendActivityAsync(MessageFactory.Text("In custom code step"));
    // This code step decided to just return the input payload as the result.
    return dc.EndDialogAsync(options)
}

// Adaptive dialog that calls a code step.
var rootDialog = new AdaptiveDialog(rootDialogName) {
    Triggers = new List<OnCondition>()
    {
        new OnUnknownIntent()
        {
            Actions = new List<Dialog>()
            {
                new CodeAction(CodeActionSampleFn),
                new SendActivity("After code step")
            }
        }
    }
};

デバッグ オプションの例Debugging option examples

TraceActivityTraceActivity

指定したペイロードで、トレース アクティビティを送信します。Sends a trace activity with a payload you specify.

注意

トレース アクティビティはトランスクリプトとしてキャプチャでき、デバッグで役立つようにエミュレーターにのみ送信します。Trace activities can be captured as transcripts and are only sent to Emulator to help with debugging.

new TraceActivity()
{
    // Name of the trace event.
    Name = "contoso.TraceActivity",
    ValueType = "Object",
    // Property from memory to include in the trace
    ValueProperty = "user"
}

ログ アクションLog action

コンソールに書き込み、必要に応じて、メッセージをトレース アクティビティとして送信します。Writes to the console and optionally sends the message as a trace activity.

new LogAction()
{
    Text = new TextTemplate("Hello"),
    // Automatically sends the provided text as a trace activity
    TraceActivity = true
}

追加情報Additional Information