Étape 5 : Flux de travail

Les flux de travail vous permettent de chaîner plusieurs étapes ensemble : chaque étape traite les données et les transmet à la suivante.

Définir les étapes du flux de travail (exécuteurs) :

using Microsoft.Agents.AI.Workflows;

// Step 1: Convert text to uppercase
Func<string, string> uppercaseFunc = s => s.ToUpperInvariant();
var uppercase = uppercaseFunc.BindAsExecutor("UppercaseExecutor");

// Step 2: Reverse the string and yield output
class ReverseTextExecutor() : Executor<string, string>("ReverseTextExecutor")
{
    public override ValueTask<string> HandleAsync(string message, IWorkflowContext context, CancellationToken cancellationToken = default)
    {
        return ValueTask.FromResult(string.Concat(message.Reverse()));
    }
}
ReverseTextExecutor reverse = new();

Générez et exécutez le flux de travail :

WorkflowBuilder builder = new(uppercase);
builder.AddEdge(uppercase, reverse).WithOutputFrom(reverse);
var workflow = builder.Build();

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}");
    }
}

Tip

Consultez cet article pour obtenir un exemple d’application exécutable complet.

L’exemple complet définit deux exécutants, les connecte par une arête et exécute le workflow :

import asyncio

from agent_framework import WorkflowBuilder, WorkflowContext, executor
from typing_extensions import Never


@executor(id="upper_case")
async def upper_case(text: str, ctx: WorkflowContext[str]) -> None:
    await ctx.send_message(text.upper())


@executor(id="reverse_text")
async def reverse_text(text: str, ctx: WorkflowContext[Never, str]) -> None:
    await ctx.yield_output(text[::-1])


async def main() -> None:
    workflow = WorkflowBuilder(start_executor=upper_case).add_edge(upper_case, reverse_text).build()
    result = await workflow.run("hello world")
    print(result.get_outputs()[0])


if __name__ == "__main__":
    asyncio.run(main())

Tip

Consultez l’exemple de flux de travail de graphe complet. Pour obtenir des alternatives fonctionnelles, consultez le flux de travail fonctionnel de base et le flux de travail fonctionnel avec des agents.

Définissez les étapes de flux de travail (exécuteurs) et connectez-les à des arêtes :

package main

import (
    "context"
    "fmt"
    "slices"
    "strings"

    "github.com/microsoft/agent-framework-go/workflow"
    "github.com/microsoft/agent-framework-go/workflow/inproc"
)

func main() {
    // Step 1: Convert text to uppercase.
    uppercase := workflow.NewExecutor("UppercaseExecutor", func(input string) string {
        return strings.ToUpper(input)
    }).Bind()

    // Step 2: Reverse the string.
    reverse := workflow.NewExecutor("ReverseExecutor", func(input string) string {
        runes := []rune(input)
        slices.Reverse(runes)
        return string(runes)
    }).Bind()

    // Build the workflow by connecting executors sequentially.
    wf, err := workflow.NewBuilder(uppercase).
        AddEdge(uppercase, reverse).
        WithOutputFrom(reverse).
        Build()
    if err != nil {
        panic(err)
    }

    // Execute the workflow with sample input.
    run, err := inproc.Default.Run(context.Background(), wf, "Hello, World!")
    if err != nil {
        panic(err)
    }
    for evt := range run.NewEvents() {
        if evt, ok := evt.(workflow.ExecutorCompletedEvent); ok {
            fmt.Printf("%s: %v\n", evt.ExecutorID, evt.Result)
        }
    }
}

Tip

Consultez l’exemple complet du fichier exécutable complet.

Étapes suivantes

Aller plus loin :