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 tutorial se muestra cómo crear un flujo de trabajo secuencial sencillo mediante flujos de trabajo del marco de agente.
Los flujos de trabajo secuenciales son la base de la creación de sistemas complejos de agentes de IA. En este tutorial se muestra cómo crear un flujo de trabajo sencillo de dos pasos en el que cada paso procesa los datos y lo pasa al paso siguiente.
Información general
En este tutorial, creará un flujo de trabajo con dos ejecutores:
- Ejecutor en mayúsculas : convierte el texto de entrada en mayúsculas.
- Ejecutor de texto inverso : invierte el texto y genera el resultado final.
El flujo de trabajo muestra conceptos básicos como:
- Creación de un ejecutor personalizado con un controlador
- Creación de un ejecutor personalizado a partir de una función
- Usar
WorkflowBuilderpara conectar ejecutores con bordes - Procesamiento de datos mediante pasos secuenciales
- Observar la ejecución del flujo de trabajo a través de eventos
Conceptos tratados
Prerrequisitos
- SDK de .NET 8.0 o posterior
- No se requiere ningún servicio de inteligencia artificial externo para este ejemplo básico
- Una nueva aplicación de consola
Implementación paso a paso
En las secciones siguientes se muestra cómo compilar el flujo de trabajo secuencial paso a paso.
Paso 1: Instalar paquetes NuGet
En primer lugar, instale los paquetes necesarios para el proyecto de .NET:
dotnet add package Microsoft.Agents.AI.Workflows --prerelease
Paso 2: Definir el ejecutor en mayúsculas
Defina un ejecutor que convierta texto en mayúsculas:
using System;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.Agents.AI.Workflows;
/// <summary>
/// First executor: converts input text to uppercase.
/// </summary>
Func<string, string> uppercaseFunc = s => s.ToUpperInvariant();
var uppercase = uppercaseFunc.BindExecutor("UppercaseExecutor");
Puntos clave:
- Cree una función que tome una cadena y devuelva la versión en mayúsculas.
- Uso
BindExecutor()para crear un ejecutor a partir de la función
Paso 3: Definir el ejecutor de texto inverso
Defina un ejecutor que invierte el texto:
/// <summary>
/// Second executor: reverses the input text and completes the workflow.
/// </summary>
internal sealed class ReverseTextExecutor() : Executor<string, string>("ReverseTextExecutor")
{
public override ValueTask<string> HandleAsync(string input, IWorkflowContext context, CancellationToken cancellationToken = default)
{
// Reverse the input text
return ValueTask.FromResult(new string(input.Reverse().ToArray()));
}
}
ReverseTextExecutor reverse = new();
Puntos clave:
- Creación de una clase que herede de
Executor<TInput, TOutput> - Implementación
HandleAsync()para procesar la entrada y devolver la salida
Paso 4: Compilar y conectar el flujo de trabajo
Conecte los ejecutores mediante WorkflowBuilder:
// Build the workflow by connecting executors sequentially
WorkflowBuilder builder = new(uppercase);
builder.AddEdge(uppercase, reverse).WithOutputFrom(reverse);
var workflow = builder.Build();
Puntos clave:
-
WorkflowBuilderconstructor toma el ejecutor inicial -
AddEdge()crea una conexión dirigida desde mayúsculas a inversas -
WithOutputFrom()especifica qué ejecutores generan salidas de flujo de trabajo. -
Build()crea el flujo de trabajo inmutable.
Paso 5: Ejecutar el flujo de trabajo
Ejecute el flujo de trabajo y observe los resultados:
// Execute the workflow with input data
await using Run run = await InProcessExecution.RunAsync(workflow, "Hello, World!");
foreach (WorkflowEvent evt in run.NewEvents)
{
switch (evt)
{
case ExecutorCompletedEvent executorComplete:
Console.WriteLine($"{executorComplete.ExecutorId}: {executorComplete.Data}");
break;
}
}
Paso 6: Descripción de la salida del flujo de trabajo
Al ejecutar el flujo de trabajo, verá una salida similar a la siguiente:
UppercaseExecutor: HELLO, WORLD!
ReverseTextExecutor: !DLROW ,OLLEH
La entrada "Hello, World!" se convierte primero en mayúsculas ("HELLO, WORLD!") y luego se invierte ("! DLROW ,OLLEH").
Conceptos clave explicados
Interfaz ejecutor
Ejecutores de funciones:
- Uso
BindExecutor()para crear un ejecutor a partir de una función
Los ejecutores implementan Executor<TInput, TOutput>:
- TInput: el tipo de datos que acepta este ejecutor
- TOutput: el tipo de datos que genera este ejecutor
- HandleAsync: el método que procesa la entrada y devuelve la salida.
Patrón del Generador de flujos de trabajo de .NET
WorkflowBuilder proporciona una API fluida para construir flujos de trabajo:
- Constructor: toma el ejecutor inicial
- AddEdge(): crea conexiones dirigidas entre ejecutores
- WithOutputFrom():especifica qué ejecutores generan salidas de flujo de trabajo.
- Build(): crea el flujo de trabajo inmutable final.
Tipos de eventos de .NET
Durante la ejecución, puede observar estos tipos de eventos:
-
ExecutorCompletedEvent- Cuando un ejecutor termina de procesar
Ejemplo completo de .NET
Para obtener la implementación completa y lista para ejecutarse, consulte el ejemplo de 01_ExecutorsAndEdges en el repositorio de Agent Framework.
Este ejemplo incluye:
- Implementación completa con todas las sentencias using y la estructura de clase
- Comentarios adicionales que explican los conceptos del flujo de trabajo
- Finalizar la preparación y la configuración del proyecto
Información general
En este tutorial, creará un flujo de trabajo con dos ejecutores:
- Ejecutor de mayúsculas : convierte el texto de entrada en mayúsculas
- Ejecutor de texto inverso : invierte el texto y genera el resultado final.
El flujo de trabajo muestra conceptos básicos como:
- Uso del
@executordecorador para crear nodos de flujo de trabajo - Conexión de ejecutores con
WorkflowBuilder - Paso de datos entre pasos con
ctx.send_message() - Generando la salida final con
ctx.yield_output() - Streaming de eventos para la observabilidad en tiempo real
Conceptos tratados
Prerrequisitos
- Python 3.10 o posterior
- Paquete de Python de Agent Framework Core instalado:
pip install agent-framework-core --pre - No se requiere ningún servicio de inteligencia artificial externo para este ejemplo básico
Implementación paso a paso
En las secciones siguientes se muestra cómo compilar el flujo de trabajo secuencial paso a paso.
Paso 1: Importar módulos necesarios
En primer lugar, importe los módulos necesarios desde Agent Framework:
import asyncio
from typing_extensions import Never
from agent_framework import WorkflowBuilder, WorkflowContext, WorkflowOutputEvent, executor
Paso 2: Crear el primer ejecutor
Cree un ejecutor que convierta texto en mayúsculas mediante la implementación de un ejecutor con un método de controlador:
class UpperCase(Executor):
def __init__(self, id: str):
super().__init__(id=id)
@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.
"""
result = text.upper()
# Send the result to the next executor in the workflow.
await ctx.send_message(result)
Puntos clave:
- El
@executordecorador registra esta función como un nodo de flujo de trabajo. -
WorkflowContext[str]indica que este ejecutor envía una cadena hacia abajo especificando el primer tipo de parámetro. -
ctx.send_message()pasa datos al paso siguiente
Paso 3: Crear el segundo ejecutor
Cree un ejecutor que invierte el texto y genere la salida final de un método decorado con @executor:
@executor(id="reverse_text_executor")
async def reverse_text(text: str, ctx: WorkflowContext[Never, str]) -> None:
"""Reverse the input and yield the workflow output."""
result = text[::-1]
# Yield the final output for this workflow run
await ctx.yield_output(result)
Puntos clave:
-
WorkflowContext[Never, str]indica que se trata de un ejecutor de terminal que no envía ningún mensaje especificandoNevercomo primer parámetro de tipo, pero genera salidas de flujo de trabajo especificandostrcomo segundo parámetro. -
ctx.yield_output()proporciona el resultado final del flujo de trabajo. - El flujo de trabajo se completa cuando se vuelve inactivo.
Paso 4: Compilar el flujo de trabajo
Conecte los ejecutores mediante WorkflowBuilder:
upper_case = UpperCase(id="upper_case_executor")
workflow = (
WorkflowBuilder()
.add_edge(upper_case, reverse_text)
.set_start_executor(upper_case)
.build()
)
Puntos clave:
-
add_edge()crea conexiones dirigidas entre ejecutores -
set_start_executor()define el punto de entrada. -
build()finaliza el flujo de trabajo.
Paso 5: Ejecución del flujo de trabajo con streaming
Ejecute el flujo de trabajo y observe eventos en tiempo real:
async def main():
# Run the workflow and stream events
async for event in workflow.run_stream("hello world"):
print(f"Event: {event}")
if isinstance(event, WorkflowOutputEvent):
print(f"Workflow completed with result: {event.data}")
if __name__ == "__main__":
asyncio.run(main())
Paso 6: Comprender la salida
Al ejecutar el flujo de trabajo, verá eventos como:
Event: ExecutorInvokedEvent(executor_id=upper_case_executor)
Event: ExecutorCompletedEvent(executor_id=upper_case_executor)
Event: ExecutorInvokedEvent(executor_id=reverse_text_executor)
Event: ExecutorCompletedEvent(executor_id=reverse_text_executor)
Event: WorkflowOutputEvent(data='DLROW OLLEH', source_executor_id=reverse_text_executor)
Workflow completed with result: DLROW OLLEH
Conceptos clave explicados
Tipos de contexto de flujo de trabajo
El WorkflowContext tipo genérico define qué flujos de datos fluyen entre ejecutores:
-
WorkflowContext[str]- Envía una cadena al siguiente ejecutor. -
WorkflowContext[Never, str]- Ejecutor de terminal que produce la salida del flujo de trabajo de tipo cadena
Tipos de eventos
Durante la ejecución de streaming, observará estos tipos de eventos:
-
ExecutorInvokedEvent- Cuando un ejecutor inicia el procesamiento -
ExecutorCompletedEvent- Cuando un ejecutor termina de procesar -
WorkflowOutputEvent: contiene el resultado final del flujo de trabajo.
Patrón del Generador de flujos de trabajo de Python
WorkflowBuilder proporciona una API fluida para construir flujos de trabajo:
- add_edge(): crea conexiones dirigidas entre ejecutores
- set_start_executor(): define el punto de entrada del flujo de trabajo.
- build(): finaliza y devuelve un objeto de flujo de trabajo inmutable.
Ejemplo completo
Para obtener la implementación completa y lista para ejecutarse, consulte el ejemplo en el repositorio de Agent Framework.
Este ejemplo incluye:
- Implementación completa con todas las importaciones y documentación
- Comentarios adicionales que explican los conceptos del flujo de trabajo
- Salida de ejemplo que muestra los resultados esperados