步驟五:工作流程

工作流程讓你能串連多個步驟——每個步驟處理資料並傳遞給下一個步驟。

定義工作流程步驟(執行者):

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();

建立並執行工作流程:

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

請見 此 處的完整可執行範例應用。

完整範例定義兩個執行器,並以邊將兩者連接起來,並執行工作流程:

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

請參閱 完整的圖形工作流程範例。 關於功能替代方案,請參閱 基本功能工作流程 及 含代理程式的功能工作流程。

定義工作流程步驟(執行者),並將它們與邊緣連結:

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

完整範例可執行檔案請參閱 完整範例 。

下一步

深入探討: