Compartir a través de


Conceptos básicos de los flujos de trabajo de Microsoft Agent Framework: Edges

En este documento se proporciona una visión detallada del componente Edges del sistema de flujo de trabajo de Microsoft Agent Framework.

Información general

Los bordes definen cómo fluyen los mensajes entre ejecutores con condiciones opcionales. Representan las conexiones en el gráfico de flujo de trabajo y determinan las rutas de flujo de datos.

Tipos de bordes

El marco admite varios patrones perimetrales:

  1. Conexiones directas: sencillas conexiones de uno a uno entre ejecutores
  2. Bordes condicionales: bordes con condiciones que determinan cuándo deben fluir los mensajes
  3. Bordes de distribución ramificada: un ejecutor que envía mensajes a varios destinos
  4. Bordes de convergencia: varios ejecutores que envían mensajes a un único destino

Bordes directos

La forma más sencilla de conexión entre dos ejecutores:

using Microsoft.Agents.AI.Workflows;

WorkflowBuilder builder = new(sourceExecutor);
builder.AddEdge(sourceExecutor, targetExecutor);
from agent_framework import WorkflowBuilder

builder = WorkflowBuilder()
builder.add_edge(source_executor, target_executor)
builder.set_start_executor(source_executor)
workflow = builder.build()

Bordes condicionales

Bordes que solo se activan cuando se cumplen determinadas condiciones:

// Route based on message content
builder.AddEdge(
    source: spamDetector,
    target: emailProcessor,
    condition: result => result is SpamResult spam && !spam.IsSpam
);

builder.AddEdge(
    source: spamDetector,
    target: spamHandler,
    condition: result => result is SpamResult spam && spam.IsSpam
);
from agent_framework import WorkflowBuilder

builder = WorkflowBuilder()
builder.add_edge(spam_detector, email_processor, condition=lambda result: isinstance(result, SpamResult) and not result.is_spam)
builder.add_edge(spam_detector, spam_handler, condition=lambda result: isinstance(result, SpamResult) and result.is_spam)
builder.set_start_executor(spam_detector)
workflow = builder.build()

Bordes de estructura switch-case

Enrutar mensajes a diferentes ejecutores en función de las condiciones:

builder.AddSwitch(routerExecutor, switchBuilder =>
    switchBuilder
        .AddCase(
            message => message.Priority < Priority.Normal,
            executorA
        )
        .AddCase(
            message => message.Priority < Priority.High,
            executorB
        )
        .SetDefault(executorC)
);
from agent_framework import (
    Case,
    Default,
    WorkflowBuilder,
)

builder = WorkflowBuilder()
builder.set_start_executor(router_executor)
builder.add_switch_case_edge_group(
    router_executor,
    [
        Case(
            condition=lambda message: message.priority < Priority.NORMAL,
            target=executor_a,
        ),
        Case(
            condition=lambda message: message.priority < Priority.HIGH,
            target=executor_b,
        ),
        Default(target=executor_c)
    ],
)
workflow = builder.build()

Bordes de expansión

Distribuir mensajes de un ejecutor a varios destinos:

// Send to all targets
builder.AddFanOutEdge(splitterExecutor, targets: [worker1, worker2, worker3]);

// Send to specific targets based on target selector function
builder.AddFanOutEdge(
    source: routerExecutor,
    targetSelector: (message, targetCount) => message.Priority switch
    {
        Priority.High => [0], // Route to first worker only
        Priority.Normal => [1, 2], // Route to workers 2 and 3
        _ => Enumerable.Range(0, targetCount) // Route to all workers
    },
    targets: [highPriorityWorker, normalWorker1, normalWorker2]
);
from agent_framework import WorkflowBuilder

builder = WorkflowBuilder()
builder.set_start_executor(splitter_executor)
builder.add_fan_out_edges(splitter_executor, [worker1, worker2, worker3])
workflow = builder.build()

# Send to specific targets based on partitioner function
builder = WorkflowBuilder()
builder.set_start_executor(splitter_executor)
builder.add_fan_out_edges(
    splitter_executor,
    [worker1, worker2, worker3],
    selection_func=lambda message, target_ids: (
        [0] if message.priority == Priority.HIGH else
        [1, 2] if message.priority == Priority.NORMAL else
        list(range(target_count))
    )
)
workflow = builder.build()

Bordes de ventilador

Recopilar mensajes de varios orígenes en un único destino:

// Aggregate results from multiple workers
builder.AddFanInEdge(aggregatorExecutor, sources: [worker1, worker2, worker3]);
builder.add_fan_in_edge([worker1, worker2, worker3], aggregator_executor)

Paso siguiente