Nota:
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
En este documento se proporciona una visión detallada del componente Executors del sistema de flujo de trabajo de Microsoft Agent Framework.
Información general
Los ejecutores son los componentes fundamentales que procesan mensajes en un flujo de trabajo. Son unidades de procesamiento autónomas que reciben mensajes tipados, realizan operaciones y pueden generar mensajes o eventos de salida.
Los ejecutores heredan de la Executor<TInput, TOutput> clase base. Cada ejecutor tiene un identificador único y puede controlar tipos de mensajes específicos.
Estructura básica del ejecutor
using Microsoft.Agents.AI.Workflows;
using Microsoft.Agents.AI.Workflows.Reflection;
internal sealed class UppercaseExecutor() : Executor<string, string>("UppercaseExecutor")
{
public async ValueTask<string> HandleAsync(string message, IWorkflowContext context)
{
string result = message.ToUpperInvariant();
return result; // Return value is automatically sent to connected executors
}
}
Es posible enviar mensajes manualmente sin devolver un valor:
internal sealed class UppercaseExecutor() : Executor<string>("UppercaseExecutor")
{
public async ValueTask HandleAsync(string message, IWorkflowContext context)
{
string result = message.ToUpperInvariant();
await context.SendMessageAsync(result); // Manually send messages to connected executors
}
}
También es posible controlar varios tipos de entrada invalidando el ConfigureRoutes método :
internal sealed class SampleExecutor() : Executor("SampleExecutor")
{
protected override RouteBuilder ConfigureRoutes(RouteBuilder routeBuilder)
{
return routeBuilder
.AddHandler<string>(this.HandleStringAsync)
.AddHandler<int>(this.HandleIntAsync);
}
/// <summary>
/// Converts input string to uppercase
/// </summary>
public async ValueTask<string> HandleStringAsync(string message, IWorkflowContext context)
{
string result = message.ToUpperInvariant();
return result;
}
/// <summary>
/// Doubles the input integer
/// </summary>
public async ValueTask<int> HandleIntAsync(int message, IWorkflowContext context)
{
int result = message * 2;
return result;
}
}
También es posible crear un ejecutor a partir de una función mediante el método de BindExecutor extensión:
Func<string, string> uppercaseFunc = s => s.ToUpperInvariant();
var uppercase = uppercaseFunc.BindExecutor("UppercaseExecutor");
Los ejecutores heredan de la Executor clase base. Cada ejecutor tiene un identificador único y puede controlar tipos de mensajes específicos mediante métodos decorados con el @handler decorador. Los controladores deben tener la anotación adecuada para especificar el tipo de mensajes que pueden procesar.
Estructura básica del ejecutor
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())
Es posible crear un ejecutor a partir de una función mediante el @executor decorador:
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())
También es posible controlar varios tipos de entrada definiendo varios controladores:
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)
El WorkflowContext objeto
El WorkflowContext objeto proporciona métodos para que el controlador interactúe con el flujo de trabajo durante la ejecución.
WorkflowContext se parametriza con el tipo de mensajes que emitirá el controlador y el tipo de salidas que puede producir.
El método más usado es send_message, que permite al controlador enviar mensajes a ejecutores conectados.
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!")
Un controlador puede usar yield_output para generar salidas que se considerarán salidas de flujo de trabajo y que se devolverán o transmitan al autor de la llamada como un evento de salida:
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!")
Si un controlador no envía mensajes ni genera salidas, no se necesita ningún parámetro de tipo para WorkflowContext:
from agent_framework import WorkflowContext
class SomeHandler(Executor):
@handler
async def some_handler(message: str, ctx: WorkflowContext) -> None:
print("Doing some work...")
Paso siguiente
- Obtenga información sobre edges para comprender cómo se conectan los ejecutores en un flujo de trabajo.