// ------------------------------------------------------------------------------ // // This code was generated by a tool. // // ------------------------------------------------------------------------------ #nullable enable #pragma warning disable IDE0005 // Extra using directive is ok. using System; using System.Collections; using System.Collections.Generic; using System.Linq; using System.Threading; using System.Threading.Tasks; using Microsoft.Agents.AI; using Microsoft.Agents.AI.Workflows; using Microsoft.Agents.AI.Workflows.Declarative; using Microsoft.Agents.AI.Workflows.Declarative.Kit; using Microsoft.Extensions.AI; namespace Demo.DeclarativeCode; /// /// This class provides a factory method to create a instance. /// /// /// The workflow defined here was generated from a declarative workflow definition. /// Declarative workflows utilize Power FX for defining conditions and expressions. /// To learn more about Power FX, see: /// https://learn.microsoft.com/power-platform/power-fx/formula-reference-copilot-studio /// public static class SampleWorkflowProvider { /// /// The root executor for a declarative workflow. /// internal sealed class WorkflowDemoRootExecutor( DeclarativeWorkflowOptions options, Func inputTransform) : RootExecutor("workflow_demo_Root", options, inputTransform) where TInput : notnull { protected override async ValueTask ExecuteAsync(TInput message, IWorkflowContext context, CancellationToken cancellationToken) { } } /// /// Invokes an agent to process messages and return a response within a conversation context. /// internal sealed class QuestionStudentExecutor(FormulaSession session, ResponseAgentProvider agentProvider) : AgentExecutor(id: "question_student", session, agentProvider) { // protected override async ValueTask ExecuteAsync(IWorkflowContext context, CancellationToken cancellationToken) { string? agentName = "StudentAgent"; if (string.IsNullOrWhiteSpace(agentName)) { throw new DeclarativeActionException($"Agent name must be defined: {this.Id}"); } string? conversationId = await context.ReadStateAsync(key: "ConversationId", scopeName: "System").ConfigureAwait(false); bool autoSend = true; IList? inputMessages = null; AgentResponse agentResponse = await InvokeAgentAsync( context, agentName, conversationId, autoSend, inputMessages, cancellationToken).ConfigureAwait(false); if (autoSend) { await context.AddEventAsync(new AgentResponseEvent(this.Id, agentResponse)).ConfigureAwait(false); } return default; } } /// /// Invokes an agent to process messages and return a response within a conversation context. /// internal sealed class QuestionTeacherExecutor(FormulaSession session, ResponseAgentProvider agentProvider) : AgentExecutor(id: "question_teacher", session, agentProvider) { // protected override async ValueTask ExecuteAsync(IWorkflowContext context, CancellationToken cancellationToken) { string? agentName = "TeacherAgent"; if (string.IsNullOrWhiteSpace(agentName)) { throw new DeclarativeActionException($"Agent name must be defined: {this.Id}"); } string? conversationId = await context.ReadStateAsync(key: "ConversationId", scopeName: "System").ConfigureAwait(false); bool autoSend = false; IList? inputMessages = null; AgentResponse agentResponse = await InvokeAgentAsync( context, agentName, conversationId, autoSend, inputMessages, cancellationToken).ConfigureAwait(false); if (autoSend) { await context.AddEventAsync(new AgentResponseEvent(this.Id, agentResponse)).ConfigureAwait(false); } await context.QueueStateUpdateAsync(key: "TeacherResponse", value: agentResponse.Messages, scopeName: "Local").ConfigureAwait(false); return default; } } /// /// Assigns an evaluated expression, other variable, or literal value to the "Local.TurnCount" variable. /// internal sealed class SetCountIncrementExecutor(FormulaSession session) : ActionExecutor(id: "set_count_increment", session) { // protected override async ValueTask ExecuteAsync(IWorkflowContext context, CancellationToken cancellationToken) { object? evaluatedValue = await context.EvaluateValueAsync("Local.TurnCount + 1").ConfigureAwait(false); await context.QueueStateUpdateAsync(key: "TurnCount", value: evaluatedValue, scopeName: "Local").ConfigureAwait(false); return default; } } /// /// Conditional branching similar to an if / elseif / elseif / else chain. /// internal sealed class CheckCompletionExecutor(FormulaSession session) : ActionExecutor(id: "check_completion", session) { // protected override async ValueTask ExecuteAsync(IWorkflowContext context, CancellationToken cancellationToken) { bool condition0 = await context.EvaluateValueAsync("""!IsBlank(Find("CONGRATULATIONS", Upper(Last(Local.TeacherResponse).Text)))""").ConfigureAwait(false); if (condition0) { return "check_turn_done"; } bool condition1 = await context.EvaluateValueAsync("Local.TurnCount < 4").ConfigureAwait(false); if (condition1) { return "check_turn_count"; } return "check_completionElseActions"; } } /// /// Formats a message template and sends an activity event. /// internal sealed class SendactivityDoneExecutor(FormulaSession session) : ActionExecutor(id: "sendActivity_done", session) { // protected override async ValueTask ExecuteAsync(IWorkflowContext context, CancellationToken cancellationToken) { string activityText = await context.FormatTemplateAsync( """ GOLD STAR! """ ); AgentResponse response = new([new ChatMessage(ChatRole.Assistant, activityText)]); await context.AddEventAsync(new AgentResponseEvent(this.Id, response)).ConfigureAwait(false); return default; } } /// /// Formats a message template and sends an activity event. /// internal sealed class SendactivityTiredExecutor(FormulaSession session) : ActionExecutor(id: "sendActivity_tired", session) { // protected override async ValueTask ExecuteAsync(IWorkflowContext context, CancellationToken cancellationToken) { string activityText = await context.FormatTemplateAsync( """ Let's try again later... """ ); AgentResponse response = new([new ChatMessage(ChatRole.Assistant, activityText)]); await context.AddEventAsync(new AgentResponseEvent(this.Id, response)).ConfigureAwait(false); return default; } } public static Workflow CreateWorkflow( DeclarativeWorkflowOptions options, Func? inputTransform = null) where TInput : notnull { // Create root executor to initialize the workflow. inputTransform ??= (message) => DeclarativeWorkflowBuilder.DefaultTransform(message); WorkflowDemoRootExecutor workflowDemoRoot = new(options, inputTransform); DelegateExecutor workflowDemo = new(id: "workflow_demo", workflowDemoRoot.Session); QuestionStudentExecutor questionStudent = new(workflowDemoRoot.Session, options.AgentProvider); QuestionTeacherExecutor questionTeacher = new(workflowDemoRoot.Session, options.AgentProvider); SetCountIncrementExecutor setCountIncrement = new(workflowDemoRoot.Session); CheckCompletionExecutor checkCompletion = new(workflowDemoRoot.Session); DelegateExecutor checkTurnDone = new(id: "check_turn_done", workflowDemoRoot.Session); DelegateExecutor checkTurnCount = new(id: "check_turn_count", workflowDemoRoot.Session); DelegateExecutor checkCompletionelseactions = new(id: "check_completionElseActions", workflowDemoRoot.Session); DelegateExecutor checkTurnDoneactions = new(id: "check_turn_doneActions", workflowDemoRoot.Session); SendactivityDoneExecutor sendActivityDone = new(workflowDemoRoot.Session); DelegateExecutor checkTurnCountactions = new(id: "check_turn_countActions", workflowDemoRoot.Session); DelegateExecutor gotoStudentAgent = new(id: "goto_student_agent", workflowDemoRoot.Session); DelegateExecutor checkTurnCountRestart = new(id: "check_turn_count_Restart", workflowDemoRoot.Session); SendactivityTiredExecutor sendActivityTired = new(workflowDemoRoot.Session); DelegateExecutor checkTurnDonePost = new(id: "check_turn_done_Post", workflowDemoRoot.Session); DelegateExecutor checkCompletionPost = new(id: "check_completion_Post", workflowDemoRoot.Session); DelegateExecutor checkTurnCountPost = new(id: "check_turn_count_Post", workflowDemoRoot.Session); DelegateExecutor checkTurnDoneactionsPost = new(id: "check_turn_doneActions_Post", workflowDemoRoot.Session); DelegateExecutor gotoStudentAgentRestart = new(id: "goto_student_agent_Restart", workflowDemoRoot.Session); DelegateExecutor checkTurnCountactionsPost = new(id: "check_turn_countActions_Post", workflowDemoRoot.Session); DelegateExecutor checkCompletionelseactionsPost = new(id: "check_completionElseActions_Post", workflowDemoRoot.Session); // Define the workflow builder WorkflowBuilder builder = new(workflowDemoRoot); // Connect executors builder.AddEdge(workflowDemoRoot, workflowDemo); builder.AddEdge(workflowDemo, questionStudent); builder.AddEdge(questionStudent, questionTeacher); builder.AddEdge(questionTeacher, setCountIncrement); builder.AddEdge(setCountIncrement, checkCompletion); builder.AddEdge(checkCompletion, checkTurnDone, (object? result) => ActionExecutor.IsMatch("check_turn_done", result)); builder.AddEdge(checkCompletion, checkTurnCount, (object? result) => ActionExecutor.IsMatch("check_turn_count", result)); builder.AddEdge(checkCompletion, checkCompletionelseactions, (object? result) => ActionExecutor.IsMatch("check_completionElseActions", result)); builder.AddEdge(checkTurnDone, checkTurnDoneactions); builder.AddEdge(checkTurnDoneactions, sendActivityDone); builder.AddEdge(checkTurnCount, checkTurnCountactions); builder.AddEdge(checkTurnCountactions, gotoStudentAgent); builder.AddEdge(gotoStudentAgent, questionStudent); builder.AddEdge(checkTurnCountRestart, checkCompletionelseactions); builder.AddEdge(checkCompletionelseactions, sendActivityTired); builder.AddEdge(checkTurnDonePost, checkCompletionPost); builder.AddEdge(checkTurnCountPost, checkCompletionPost); builder.AddEdge(sendActivityDone, checkTurnDoneactionsPost); builder.AddEdge(checkTurnDoneactionsPost, checkTurnDonePost); builder.AddEdge(gotoStudentAgentRestart, checkTurnCountactionsPost); builder.AddEdge(checkTurnCountactionsPost, checkTurnCountPost); builder.AddEdge(sendActivityTired, checkCompletionelseactionsPost); builder.AddEdge(checkCompletionelseactionsPost, checkCompletionPost); // Build the workflow return builder.Build(validateOrphans: false); } }