// Copyright (c) Microsoft. All rights reserved. using Microsoft.SemanticKernel; using Step03.Models; using Step03.Steps; namespace Step03.Processes; /// /// Sample process that showcases how to create a process with sequential steps and reuse of existing steps.
///
public static class PotatoFriesProcess { public static class ProcessEvents { public const string PreparePotatoFries = nameof(PreparePotatoFries); // When multiple processes use the same final step, the should event marked as public // so that the step event can be used as the output event of the process too. // In these samples both fried fish and potato fries end with FryStep success public const string PotatoFriesReady = nameof(FryFoodStep.OutputEvents.FriedFoodReady); } /// /// For a visual reference of the PotatoFriesProcess check this /// diagram /// /// name of the process /// public static ProcessBuilder CreateProcess(string processName = "PotatoFriesProcess") { var processBuilder = new ProcessBuilder(processName); var gatherIngredientsStep = processBuilder.AddStepFromType(); var sliceStep = processBuilder.AddStepFromType("sliceStep"); var fryStep = processBuilder.AddStepFromType(); processBuilder .OnInputEvent(ProcessEvents.PreparePotatoFries) .SendEventTo(new ProcessFunctionTargetBuilder(gatherIngredientsStep)); gatherIngredientsStep .OnEvent(GatherPotatoFriesIngredientsStep.OutputEvents.IngredientsGathered) .SendEventTo(new ProcessFunctionTargetBuilder(sliceStep, functionName: CutFoodStep.ProcessStepFunctions.SliceFood)); sliceStep .OnEvent(CutFoodStep.OutputEvents.SlicingReady) .SendEventTo(new ProcessFunctionTargetBuilder(fryStep)); fryStep .OnEvent(FryFoodStep.OutputEvents.FoodRuined) .SendEventTo(new ProcessFunctionTargetBuilder(gatherIngredientsStep)); return processBuilder; } /// /// For a visual reference of the PotatoFriesProcess with stateful steps check this /// diagram /// /// name of the process /// public static ProcessBuilder CreateProcessWithStatefulSteps(string processName = "PotatoFriesWithStatefulStepsProcess") { var processBuilder = new ProcessBuilder(processName); var gatherIngredientsStep = processBuilder.AddStepFromType(); var sliceStep = processBuilder.AddStepFromType("sliceStep"); var fryStep = processBuilder.AddStepFromType(); processBuilder .OnInputEvent(ProcessEvents.PreparePotatoFries) .SendEventTo(new ProcessFunctionTargetBuilder(gatherIngredientsStep)); gatherIngredientsStep .OnEvent(GatherPotatoFriesIngredientsWithStockStep.OutputEvents.IngredientsGathered) .SendEventTo(new ProcessFunctionTargetBuilder(sliceStep, functionName: CutFoodWithSharpeningStep.ProcessStepFunctions.SliceFood)); gatherIngredientsStep .OnEvent(GatherPotatoFriesIngredientsWithStockStep.OutputEvents.IngredientsOutOfStock) .StopProcess(); sliceStep .OnEvent(CutFoodWithSharpeningStep.OutputEvents.SlicingReady) .SendEventTo(new ProcessFunctionTargetBuilder(fryStep)); sliceStep .OnEvent(CutFoodWithSharpeningStep.OutputEvents.KnifeNeedsSharpening) .SendEventTo(new ProcessFunctionTargetBuilder(sliceStep, functionName: CutFoodWithSharpeningStep.ProcessStepFunctions.SharpenKnife)); sliceStep .OnEvent(CutFoodWithSharpeningStep.OutputEvents.KnifeSharpened) .SendEventTo(new ProcessFunctionTargetBuilder(sliceStep, functionName: CutFoodWithSharpeningStep.ProcessStepFunctions.SliceFood)); fryStep .OnEvent(FryFoodStep.OutputEvents.FoodRuined) .SendEventTo(new ProcessFunctionTargetBuilder(gatherIngredientsStep)); return processBuilder; } private sealed class GatherPotatoFriesIngredientsStep : GatherIngredientsStep { public GatherPotatoFriesIngredientsStep() : base(FoodIngredients.Pototoes) { } } private sealed class GatherPotatoFriesIngredientsWithStockStep : GatherIngredientsWithStockStep { public GatherPotatoFriesIngredientsWithStockStep() : base(FoodIngredients.Pototoes) { } } }