mirror of
https://github.com/microsoft/agent-framework.git
synced 2026-06-16 21:04:09 +08:00
904a5b843e
* Python: .NET Samples - Restructure and Improve Samples (Feature Branch) (#4091) * Moved by agent (#4094) * Fix readme links * .NET Samples - Create `04-hosting` learning path step (#4098) * Agent move * Agent reorderd * Remove A2A section from README Removed A2A section from the Getting Started README. * Agent fixed links * Fix broken sample links in durable-agents README (#4101) * Initial plan * Fix broken internal links in documentation Co-authored-by: crickman <66376200+crickman@users.noreply.github.com> * Revert template link changes; keep only durable-agents README fix Co-authored-by: crickman <66376200+crickman@users.noreply.github.com> --------- Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com> Co-authored-by: crickman <66376200+crickman@users.noreply.github.com> * .NET Samples - Create `03-workflows` learning path step (#4102) * Fix solution project path * Python: Fix broken markdown links to repo resources (outside /docs) (#4105) * Initial plan * Fix broken markdown links to repo resources Co-authored-by: crickman <66376200+crickman@users.noreply.github.com> * Update README to rename .NET Workflows Samples section --------- Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com> Co-authored-by: crickman <66376200+crickman@users.noreply.github.com> * .NET Samples - Create `02-agents` learning path step (#4107) * .NET: Fix broken relative link in GroupChatToolApproval README (#4108) * Initial plan * Fix broken link in GroupChatToolApproval README Co-authored-by: crickman <66376200+crickman@users.noreply.github.com> --------- Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com> Co-authored-by: crickman <66376200+crickman@users.noreply.github.com> * Update labeler configuration for workflow samples * .NET - Reorder Agents samples to start from Step01 instead of Step04 (#4110) * Fix solution * Resolve new sample paths * Move new AgentSkills and AgentWithMemory_Step04 samples * Fix link * Fix readme path * fix: update stale dotnet/samples/Durable path reference in AGENTS.md Co-authored-by: crickman <66376200+crickman@users.noreply.github.com> * Moved new sample * Update solution * Resolve merge (new sample) * Sync to new sample - FoundryAgents_Step21_BingCustomSearch * Updated README * .NET Samples - Configuration Naming Update (#4149) * .NET: Restore AzureFunctions index parity with ConsoleApps under DurableAgents samples (#4221) * Clean-up `05_host_your_agent` * Config setting consistency * Refine samples * AGENTS.md * Move new samples * Re-order samples * Move new project and fixup solution * Fixup model config * Fix up new UT project --------- Co-authored-by: Copilot <198982749+Copilot@users.noreply.github.com>
64 lines
2.6 KiB
C#
64 lines
2.6 KiB
C#
// Copyright (c) Microsoft. All rights reserved.
|
|
|
|
using Microsoft.Agents.AI.Workflows;
|
|
|
|
namespace WorkflowExecutorsAndEdgesSample;
|
|
|
|
/// <summary>
|
|
/// This sample introduces the concepts of executors and edges in a workflow.
|
|
///
|
|
/// Workflows are built from executors (processing units) connected by edges (data flow paths).
|
|
/// In this example, we create a simple text processing pipeline that:
|
|
/// 1. Takes input text and converts it to uppercase using an UppercaseExecutor
|
|
/// 2. Takes the uppercase text and reverses it using a ReverseTextExecutor
|
|
///
|
|
/// The executors are connected sequentially, so data flows from one to the next in order.
|
|
/// For input "Hello, World!", the workflow produces "!DLROW ,OLLEH".
|
|
/// </summary>
|
|
public static class Program
|
|
{
|
|
private static async Task Main()
|
|
{
|
|
// Create the executors
|
|
Func<string, string> uppercaseFunc = s => s.ToUpperInvariant();
|
|
var uppercase = uppercaseFunc.BindAsExecutor("UppercaseExecutor");
|
|
|
|
ReverseTextExecutor reverse = new();
|
|
|
|
// Build the workflow by connecting executors sequentially
|
|
WorkflowBuilder builder = new(uppercase);
|
|
builder.AddEdge(uppercase, reverse).WithOutputFrom(reverse);
|
|
var workflow = builder.Build();
|
|
|
|
// Execute the workflow with input data
|
|
await using Run run = await InProcessExecution.RunAsync(workflow, "Hello, World!");
|
|
foreach (WorkflowEvent evt in run.NewEvents)
|
|
{
|
|
if (evt is ExecutorCompletedEvent executorComplete)
|
|
{
|
|
Console.WriteLine($"{executorComplete.ExecutorId}: {executorComplete.Data}");
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
/// Second executor: reverses the input text and completes the workflow.
|
|
/// </summary>
|
|
internal sealed class ReverseTextExecutor() : Executor<string, string>("ReverseTextExecutor")
|
|
{
|
|
/// <summary>
|
|
/// Processes the input message by reversing the text.
|
|
/// </summary>
|
|
/// <param name="message">The input text to reverse</param>
|
|
/// <param name="context">Workflow context for accessing workflow services and adding events</param>
|
|
/// <param name="cancellationToken">The <see cref="CancellationToken"/> to monitor for cancellation requests.
|
|
/// The default is <see cref="CancellationToken.None"/>.</param>
|
|
/// <returns>The input text reversed</returns>
|
|
public override ValueTask<string> HandleAsync(string message, IWorkflowContext context, CancellationToken cancellationToken = default)
|
|
{
|
|
// Because we do not suppress it, the returned result will be yielded as an output from this executor.
|
|
return ValueTask.FromResult(string.Concat(message.Reverse()));
|
|
}
|
|
}
|