Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
Mit Workflows können Sie mehrere Schritte miteinander verketten – jeder Schritt verarbeitet Daten und übergibt sie an die nächste.
Definieren von Workflowschritten (Executoren):
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();
Erstellen und Ausführen des Workflows:
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
Eine voll ausgeführte Beispielanwendung finden Sie hier .
Das vollständige Beispiel definiert zwei Executoren, verbindet sie mit einem Edge und führt den Workflow aus:
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
Sehen Sie sich das vollständige Diagrammworkflowbeispiel an. Informationen zu funktionalen Alternativen finden Sie im grundlegenden funktionalen Workflow und im funktionalen Workflow mit Agents.
Definieren Sie Workflowschritte (Executoren), und verbinden Sie sie mit Kanten:
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
Sehen Sie sich das vollständige Beispiel für die vollständige ausgeführte Datei an.
Nächste Schritte
Gehen Sie tiefer:
- Workflows – Grundlegendes zur Workflowarchitektur
- Sequenzielle Workflows – lineare Schritt-für-Schritt-Muster
- Agents in Workflows – Verwenden von Agents als Workflowschritte