// Copyright (c) Microsoft. All rights reserved. using Microsoft.SemanticKernel; using Microsoft.SemanticKernel.Process; namespace Step03.Steps; /// /// Step used in the Processes Samples: /// - Step_03_FoodPreparation.cs /// [KernelProcessStepMetadata("FryFoodStep.V1")] public class FryFoodStep : KernelProcessStep { public static class ProcessStepFunctions { public const string FryFood = nameof(FryFood); } public static class OutputEvents { public const string FoodRuined = nameof(FoodRuined); public const string FriedFoodReady = nameof(FriedFoodReady); } private readonly Random _randomSeed = new(); [KernelFunction(ProcessStepFunctions.FryFood)] public async Task FryFoodAsync(KernelProcessStepContext context, List foodActions) { var foodToFry = foodActions.First(); // This step may fail sometimes int fryerMalfunction = _randomSeed.Next(0, 10); // foodToFry could potentially be used to set the frying temperature and cooking duration if (fryerMalfunction < 5) { // Oh no! Food got burnt :( foodActions.Add($"{foodToFry}_frying_failed"); Console.WriteLine($"FRYING_STEP: Ingredient {foodToFry} got burnt while frying :("); await context.EmitEventAsync(new() { Id = OutputEvents.FoodRuined, Data = foodActions }); return; } foodActions.Add($"{foodToFry}_frying_succeeded"); Console.WriteLine($"FRYING_STEP: Ingredient {foodToFry} is ready!"); await context.EmitEventAsync(new() { Id = OutputEvents.FriedFoodReady, Data = foodActions, Visibility = KernelProcessEventVisibility.Public }); } }