Remarque
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de vous connecter ou de modifier des répertoires.
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de modifier des répertoires.
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 :
- Flux de travail : comprendre l’architecture des flux de travail
- Flux de travail séquentiels : modèles pas à pas linéaires
- Agents dans les flux de travail : utilisation d’agents comme étapes de flux de travail