Anteckning
Åtkomst till den här sidan kräver auktorisering. Du kan prova att logga in eller ändra kataloger.
Åtkomst till den här sidan kräver auktorisering. Du kan prova att ändra kataloger.
Det här dokumentet innehåller en djupgående titt på komponenten Executors i Microsoft Agent Framework Workflow-systemet.
Översikt
Utförare är de grundläggande byggstenarna som bearbetar meddelanden i ett arbetsflöde. De är autonoma bearbetningsenheter som tar emot inskrivna meddelanden, utför åtgärder och kan generera utdatameddelanden eller händelser.
Utförare implementerar gränssnitten IMessageHandler<TInput> eller IMessageHandler<TInput, TOutput> och ärver från basklassen ReflectingExecutor<T> . Varje exekutor har en unik identifikator och kan hantera särskilda meddelandetyper.
Grundläggande körstruktur
using Microsoft.Agents.Workflows;
using Microsoft.Agents.Workflows.Reflection;
internal sealed class UppercaseExecutor() : ReflectingExecutor<UppercaseExecutor>("UppercaseExecutor"),
IMessageHandler<string, string>
{
public async ValueTask<string> HandleAsync(string message, IWorkflowContext context)
{
string result = message.ToUpperInvariant();
return result; // Return value is automatically sent to connected executors
}
}
Det går att skicka meddelanden manuellt utan att returnera ett värde:
internal sealed class UppercaseExecutor() : ReflectingExecutor<UppercaseExecutor>("UppercaseExecutor"),
IMessageHandler<string>
{
public async ValueTask HandleAsync(string message, IWorkflowContext context)
{
string result = message.ToUpperInvariant();
await context.SendMessageAsync(result); // Manually send messages to connected executors
}
}
Det går också att hantera flera indatatyper genom att implementera flera gränssnitt:
internal sealed class SampleExecutor() : ReflectingExecutor<SampleExecutor>("SampleExecutor"),
IMessageHandler<string, string>, IMessageHandler<int, int>
{
/// <summary>
/// Converts input string to uppercase
/// </summary>
public async ValueTask<string> HandleAsync(string message, IWorkflowContext context)
{
string result = message.ToUpperInvariant();
return result;
}
/// <summary>
/// Doubles the input integer
/// </summary>
public async ValueTask<int> HandleAsync(int message, IWorkflowContext context)
{
int result = message * 2;
return result;
}
}
Utförare ärver från basklassen Executor . Varje köre har en unik identifierare och kan hantera specifika meddelandetyper med hjälp av metoder som är dekorerade med dekoratören @handler . Hanterare måste ha rätt anteckning för att ange vilken typ av meddelanden de kan bearbeta.
Grundläggande körstruktur
from agent_framework import (
Executor,
WorkflowContext,
handler,
)
class UpperCase(Executor):
@handler
async def to_upper_case(self, text: str, ctx: WorkflowContext[str]) -> None:
"""Convert the input to uppercase and forward it to the next node.
Note: The WorkflowContext is parameterized with the type this handler will
emit. Here WorkflowContext[str] means downstream nodes should expect str.
"""
await ctx.send_message(text.upper())
Det är möjligt att skapa en exekverare från en funktion med hjälp av dekoratören @executor.
from agent_framework import (
WorkflowContext,
executor,
)
@executor(id="upper_case_executor")
async def upper_case(text: str, ctx: WorkflowContext[str]) -> None:
"""Convert the input to uppercase and forward it to the next node.
Note: The WorkflowContext is parameterized with the type this handler will
emit. Here WorkflowContext[str] means downstream nodes should expect str.
"""
await ctx.send_message(text.upper())
Det går också att hantera flera indatatyper genom att definiera flera hanterare:
class SampleExecutor(Executor):
@handler
async def to_upper_case(self, text: str, ctx: WorkflowContext[str]) -> None:
"""Convert the input to uppercase and forward it to the next node.
Note: The WorkflowContext is parameterized with the type this handler will
emit. Here WorkflowContext[str] means downstream nodes should expect str.
"""
await ctx.send_message(text.upper())
@handler
async def double_integer(self, number: int, ctx: WorkflowContext[int]) -> None:
"""Double the input integer and forward it to the next node.
Note: The WorkflowContext is parameterized with the type this handler will
emit. Here WorkflowContext[int] means downstream nodes should expect int.
"""
await ctx.send_message(number * 2)
Objektet WorkflowContext
Objektet WorkflowContext innehåller metoder som hanteraren kan använda för att interagera med arbetsflödet under körningen.
WorkflowContext parameteriseras med den typ av meddelanden som hanteraren genererar och vilken typ av utdata den kan ge.
Den vanligaste metoden är send_message, som gör att hanteraren kan skicka meddelanden till anslutna köre.
from agent_framework import WorkflowContext
class SomeHandler(Executor):
@handler
async def some_handler(message: str, ctx: WorkflowContext[str]) -> None:
await ctx.send_message("Hello, World!")
En hanterare kan använda yield_output för att skapa utdata som ska betraktas som arbetsflödesutdata och returneras/strömmas till anroparen som en utdatahändelse:
from agent_framework import WorkflowContext
class SomeHandler(Executor):
@handler
async def some_handler(message: str, ctx: WorkflowContext[Never, str]) -> None:
await ctx.yield_output("Hello, World!")
Om en hanterare varken skickar meddelanden eller ger utdata behövs ingen typparameter för WorkflowContext:
from agent_framework import WorkflowContext
class SomeHandler(Executor):
@handler
async def some_handler(message: str, ctx: WorkflowContext) -> None:
print("Doing some work...")
Nästa steg
- Lär dig mer om Kanter för att förstå hur exekutorer är kopplade i ett arbetsflöde.