diff --git a/dotnet/samples/GettingStartedWithProcesses/README.md b/dotnet/samples/GettingStartedWithProcesses/README.md index 8e45a68d67a1..395a69cf6df3 100644 --- a/dotnet/samples/GettingStartedWithProcesses/README.md +++ b/dotnet/samples/GettingStartedWithProcesses/README.md @@ -23,7 +23,8 @@ Example|Description ---|--- [Step01_Processes](https://github.com/microsoft/semantic-kernel/blob/main/dotnet/samples/GettingStartedWithProcesses/Step01/Step01_Processes.cs)|How to create a simple process with a loop and a conditional exit [Step02_AccountOpening](https://github.com/microsoft/semantic-kernel/blob/main/dotnet/samples/GettingStartedWithProcesses/Step02/Step02_AccountOpening.cs)|Showcasing processes cycles, fan in, fan out for opening an account. -[Step03_FoodPreparation](https://github.com/microsoft/semantic-kernel/blob/main/dotnet/samples/GettingStartedWithProcesses/Step03/Step03_FoodPreparation.cs)|Showcasing reuse of steps, creation of processes, spawning of multiple events. +[Step03a_FoodPreparation](https://github.com/microsoft/semantic-kernel/blob/main/dotnet/samples/GettingStartedWithProcesses/Step03/Step03a_FoodPreparation.cs)|Showcasing reuse of steps, creation of processes, spawning of multiple events with food preparation samples. +[Step03b_FoodOrdering](https://github.com/microsoft/semantic-kernel/blob/main/dotnet/samples/GettingStartedWithProcesses/Step03/Step03b_FoodOrdering.cs)|Showcasing use of subprocesses as steps, spawning of multiple events conditionally reusing the food preparation samples. ### Step01_Processes @@ -67,7 +68,7 @@ flowchart LR Mailer -->|End of Interaction| User ``` -### Step03_FoodPreparation +### Step03a_FoodPreparation This tutorial contains a set of food recipes associated with the Food Preparation Processes of a restaurant. @@ -135,6 +136,8 @@ flowchart LR AddCondiments -->|Condiments Added| FishAndChipsReadyEvent ``` +### Step03b_FoodOrdering + #### Single Order Preparation Process Now with the existing product preparation processes, they can be used to create an even more complex process that can decide what product order to dispatch. diff --git a/dotnet/samples/GettingStartedWithProcesses/Step03/Processes/FishAndChipsProcess.cs b/dotnet/samples/GettingStartedWithProcesses/Step03/Processes/FishAndChipsProcess.cs index b22553d86823..e60a7dc42a4f 100644 --- a/dotnet/samples/GettingStartedWithProcesses/Step03/Processes/FishAndChipsProcess.cs +++ b/dotnet/samples/GettingStartedWithProcesses/Step03/Processes/FishAndChipsProcess.cs @@ -9,7 +9,7 @@ namespace Step03.Processes; /// /// Sample process that showcases how to create a process with a fan in/fan out behavior and use of existing processes as steps.
-/// Visual reference of this process can be found in the diagram +/// Visual reference of this process can be found in the diagram ///
public static class FishAndChipsProcess { diff --git a/dotnet/samples/GettingStartedWithProcesses/Step03/Processes/FishSandwichProcess.cs b/dotnet/samples/GettingStartedWithProcesses/Step03/Processes/FishSandwichProcess.cs index 2387fdac9d81..3e3779415712 100644 --- a/dotnet/samples/GettingStartedWithProcesses/Step03/Processes/FishSandwichProcess.cs +++ b/dotnet/samples/GettingStartedWithProcesses/Step03/Processes/FishSandwichProcess.cs @@ -8,7 +8,7 @@ namespace Step03.Processes; /// /// Sample process that showcases how to create a process with sequential steps and use of existing processes as steps.
-/// Visual reference of this process can be found in the diagram +/// Visual reference of this process can be found in the diagram ///
public static class FishSandwichProcess { diff --git a/dotnet/samples/GettingStartedWithProcesses/Step03/Processes/FriedFishProcess.cs b/dotnet/samples/GettingStartedWithProcesses/Step03/Processes/FriedFishProcess.cs index a73e143e6c25..31053f64c36f 100644 --- a/dotnet/samples/GettingStartedWithProcesses/Step03/Processes/FriedFishProcess.cs +++ b/dotnet/samples/GettingStartedWithProcesses/Step03/Processes/FriedFishProcess.cs @@ -7,7 +7,7 @@ namespace Step03.Processes; /// /// Sample process that showcases how to create a process with sequential steps and reuse of existing steps.
-/// For a visual reference of the FriedFishProcess check this diagram +/// For a visual reference of the FriedFishProcess check this diagram ///
public static class FriedFishProcess { @@ -20,12 +20,12 @@ public static class ProcessEvents public const string FriedFishReady = nameof(FryFoodStep.OutputEvents.FriedFoodReady); } - public static ProcessBuilder CreateProcess(string processName = "FriedFish") + public static ProcessBuilder CreateProcess(string processName = "FriedFishProcess") { var processBuilder = new ProcessBuilder(processName); var gatherIngredientsStep = processBuilder.AddStepFromType(); - var chopStep = processBuilder.AddStepFromType(); + var chopStep = processBuilder.AddStepFromType("chopStep"); var fryStep = processBuilder.AddStepFromType(); processBuilder diff --git a/dotnet/samples/GettingStartedWithProcesses/Step03/Processes/PotatoFriesProcess.cs b/dotnet/samples/GettingStartedWithProcesses/Step03/Processes/PotatoFriesProcess.cs index 20768cb0dd42..3794c05b86ee 100644 --- a/dotnet/samples/GettingStartedWithProcesses/Step03/Processes/PotatoFriesProcess.cs +++ b/dotnet/samples/GettingStartedWithProcesses/Step03/Processes/PotatoFriesProcess.cs @@ -8,7 +8,7 @@ namespace Step03.Processes; /// /// Sample process that showcases how to create a process with sequential steps and reuse of existing steps.
-/// For a visual reference of the FriedFishProcess check this diagram +/// For a visual reference of the FriedFishProcess check this diagram ///
public static class PotatoFriesProcess { @@ -26,7 +26,7 @@ public static ProcessBuilder CreateProcess(string processName = "PotatoFriesProc var processBuilder = new ProcessBuilder(processName); var gatherIngredientsStep = processBuilder.AddStepFromType(); - var sliceStep = processBuilder.AddStepFromType(); + var sliceStep = processBuilder.AddStepFromType("sliceStep"); var fryStep = processBuilder.AddStepFromType(); processBuilder diff --git a/dotnet/samples/GettingStartedWithProcesses/Step03/Processes/SingleFoodItemProcess.cs b/dotnet/samples/GettingStartedWithProcesses/Step03/Processes/SingleFoodItemProcess.cs index be290c40ddbf..690ebfe791e5 100644 --- a/dotnet/samples/GettingStartedWithProcesses/Step03/Processes/SingleFoodItemProcess.cs +++ b/dotnet/samples/GettingStartedWithProcesses/Step03/Processes/SingleFoodItemProcess.cs @@ -9,7 +9,7 @@ namespace Step03.Processes; /// /// Sample process that showcases how to create a selecting fan out process -/// For a visual reference of the FriedFishProcess check this diagram +/// For a visual reference of the FriedFishProcess check this diagram /// public static class SingleFoodItemProcess { diff --git a/dotnet/samples/GettingStartedWithProcesses/Step03/Step03_FoodPreparation.cs b/dotnet/samples/GettingStartedWithProcesses/Step03/Step03a_FoodPreparation.cs similarity index 58% rename from dotnet/samples/GettingStartedWithProcesses/Step03/Step03_FoodPreparation.cs rename to dotnet/samples/GettingStartedWithProcesses/Step03/Step03a_FoodPreparation.cs index 75651fcd364b..30532c89c748 100644 --- a/dotnet/samples/GettingStartedWithProcesses/Step03/Step03_FoodPreparation.cs +++ b/dotnet/samples/GettingStartedWithProcesses/Step03/Step03a_FoodPreparation.cs @@ -1,17 +1,16 @@ // Copyright (c) Microsoft. All rights reserved. using Microsoft.SemanticKernel; -using Step03.Models; using Step03.Processes; namespace Step03; /// /// Demonstrate creation of and -/// eliciting its response to three explicit user messages. -/// For visual reference of the processes used here check the diagram in: https://github.com/microsoft/semantic-kernel/tree/main/dotnet/samples/GettingStartedWithProcesses/README.md#step03_foodPreparation +/// eliciting different food related events. +/// For visual reference of the processes used here check the diagram in: https://github.com/microsoft/semantic-kernel/tree/main/dotnet/samples/GettingStartedWithProcesses/README.md#step03a_foodPreparation /// -public class Step03_FoodPreparation(ITestOutputHelper output) : BaseTest(output, redirectSystemConsoleOutput: true) +public class Step03a_FoodPreparation(ITestOutputHelper output) : BaseTest(output, redirectSystemConsoleOutput: true) { // Target Open AI Services protected override bool ForceOpenAI => true; @@ -58,40 +57,4 @@ protected async Task UsePrepareSpecificProductAsync(ProcessBuilder processBuilde Id = externalTriggerEvent, Data = new List() }); } - - [Fact] - public async Task UseSingleOrderFriedFishAsync() - { - await UsePrepareFoodOrderProcessSingleItemAsync(FoodItem.FriedFish); - } - - [Fact] - public async Task UseSingleOrderPotatoFriesAsync() - { - await UsePrepareFoodOrderProcessSingleItemAsync(FoodItem.PotatoFries); - } - - [Fact] - public async Task UseSingleOrderFishSandwichAsync() - { - await UsePrepareFoodOrderProcessSingleItemAsync(FoodItem.FishSandwich); - } - - [Fact] - public async Task UseSingleOrderFishAndChipsAsync() - { - await UsePrepareFoodOrderProcessSingleItemAsync(FoodItem.FishAndChips); - } - - protected async Task UsePrepareFoodOrderProcessSingleItemAsync(FoodItem foodItem) - { - Kernel kernel = CreateKernelWithChatCompletion(); - KernelProcess kernelProcess = SingleFoodItemProcess.CreateProcess().Build(); - - using var runningProcess = await kernelProcess.StartAsync(kernel, new KernelProcessEvent() - { - Id = SingleFoodItemProcess.ProcessEvents.SingleOrderReceived, - Data = foodItem - }); - } } diff --git a/dotnet/samples/GettingStartedWithProcesses/Step03/Step03b_FoodOrdering.cs b/dotnet/samples/GettingStartedWithProcesses/Step03/Step03b_FoodOrdering.cs new file mode 100644 index 000000000000..a17f04f43578 --- /dev/null +++ b/dotnet/samples/GettingStartedWithProcesses/Step03/Step03b_FoodOrdering.cs @@ -0,0 +1,54 @@ +// Copyright (c) Microsoft. All rights reserved. + +using Microsoft.SemanticKernel; +using Step03.Models; +using Step03.Processes; + +namespace Step03; + +/// +/// Demonstrate creation of and +/// eliciting different food related events. +/// For visual reference of the processes used here check the diagram in: https://github.com/microsoft/semantic-kernel/tree/main/dotnet/samples/GettingStartedWithProcesses/README.md#step03b_foodOrdering +/// +public class Step03b_FoodOrdering(ITestOutputHelper output) : BaseTest(output, redirectSystemConsoleOutput: true) +{ + // Target Open AI Services + protected override bool ForceOpenAI => true; + + [Fact] + public async Task UseSingleOrderFriedFishAsync() + { + await UsePrepareFoodOrderProcessSingleItemAsync(FoodItem.FriedFish); + } + + [Fact] + public async Task UseSingleOrderPotatoFriesAsync() + { + await UsePrepareFoodOrderProcessSingleItemAsync(FoodItem.PotatoFries); + } + + [Fact] + public async Task UseSingleOrderFishSandwichAsync() + { + await UsePrepareFoodOrderProcessSingleItemAsync(FoodItem.FishSandwich); + } + + [Fact] + public async Task UseSingleOrderFishAndChipsAsync() + { + await UsePrepareFoodOrderProcessSingleItemAsync(FoodItem.FishAndChips); + } + + protected async Task UsePrepareFoodOrderProcessSingleItemAsync(FoodItem foodItem) + { + Kernel kernel = CreateKernelWithChatCompletion(); + KernelProcess kernelProcess = SingleFoodItemProcess.CreateProcess().Build(); + + using var runningProcess = await kernelProcess.StartAsync(kernel, new KernelProcessEvent() + { + Id = SingleFoodItemProcess.ProcessEvents.SingleOrderReceived, + Data = foodItem + }); + } +}