Freigeben über


Ereignisse

Das Workflow-Ereignissystem ermöglicht die Beobachtbarkeit der Workflow-Ausführung. Ereignisse werden während der Ausführung an wichtigen Punkten ausgegeben und können per Streaming in Echtzeit genutzt werden.

Integrierte Ereignistypen

// Workflow lifecycle events
WorkflowStartedEvent     // Workflow execution begins
WorkflowOutputEvent      // Workflow outputs data
WorkflowErrorEvent       // Workflow encounters an error
WorkflowWarningEvent     // Workflow encountered a warning

// Executor events
ExecutorInvokedEvent     // Executor starts processing
ExecutorCompletedEvent   // Executor finishes processing
ExecutorFailedEvent      // Executor encounters an error
AgentResponseEvent       // An agent run produces output
AgentResponseUpdateEvent // An agent run produces a streaming update

// Superstep events
SuperStepStartedEvent    // Superstep begins
SuperStepCompletedEvent  // Superstep completes

// Request events
RequestInfoEvent         // A request is issued
# All events use the unified WorkflowEvent class with a type discriminator:

# Workflow lifecycle events
WorkflowEvent.type == "started"             # Workflow execution begins
WorkflowEvent.type == "status"              # Workflow state changed (use .state)
WorkflowEvent.type == "output"              # Workflow produces an output
WorkflowEvent.type == "failed"              # Workflow terminated with error (use .details)
WorkflowEvent.type == "error"               # Non-fatal error from user code
WorkflowEvent.type == "warning"             # Workflow encountered a warning

# Executor events
WorkflowEvent.type == "executor_invoked"    # Executor starts processing
WorkflowEvent.type == "executor_completed"  # Executor finishes processing
WorkflowEvent.type == "executor_failed"     # Executor encounters an error
WorkflowEvent.type == "data"                # Executor emitted data (e.g., AgentResponse)

# Superstep events
WorkflowEvent.type == "superstep_started"   # Superstep begins
WorkflowEvent.type == "superstep_completed" # Superstep completes

# Request events
WorkflowEvent.type == "request_info"        # A request is issued

Verarbeiten von Ereignissen

using Microsoft.Agents.AI.Workflows;

await foreach (WorkflowEvent evt in run.WatchStreamAsync())
{
    switch (evt)
    {
        case ExecutorInvokedEvent invoke:
            Console.WriteLine($"Starting {invoke.ExecutorId}");
            break;

        case ExecutorCompletedEvent complete:
            Console.WriteLine($"Completed {complete.ExecutorId}: {complete.Data}");
            break;

        case WorkflowOutputEvent output:
            Console.WriteLine($"Workflow output: {output.Data}");
            return;

        case WorkflowErrorEvent error:
            Console.WriteLine($"Workflow error: {error.Exception}");
            return;
    }
}
from agent_framework import WorkflowEvent

async for event in workflow.run_stream(input_message):
    if event.type == "executor_invoked":
        print(f"Starting {event.executor_id}")
    elif event.type == "executor_completed":
        print(f"Completed {event.executor_id}: {event.data}")
    elif event.type == "output":
        print(f"Workflow produced output: {event.data}")
        return
    elif event.type == "error":
        print(f"Workflow error: {event.data}")
        return

Benutzerdefinierte Ereignisse

Mit benutzerdefinierten Ereignissen können Executoren domänenspezifische Signale während der Workflowausführung ausgeben, die auf die Anforderungen Ihrer Anwendung zugeschnitten sind. Beispiele für Anwendungsfälle sind:

  • Nachverfolgen des Fortschritts – Melden Sie Zwischenschritte, damit Anrufer Statusaktualisierungen anzeigen können.
  • Ausgeben der Diagnose – Anzeigen von Warnungen, Metriken oder Debuginformationen, ohne die Workflowausgabe zu ändern.
  • Domänendaten weiterleiten – Strukturierte Nutzlasten (z. B. Datenbankschreibvorgänge, Toolaufrufe) in Echtzeit an Empfänger senden.

Definieren benutzerdefinierter Ereignisse

Definieren Sie ein benutzerdefiniertes Ereignis, indem Sie eine Unterklasse von WorkflowEvent erstellen. Der Basiskonstruktor akzeptiert eine optionale object? data Nutzlast, die über die Data Eigenschaft verfügbar gemacht wird.

using Microsoft.Agents.AI.Workflows;

// Simple event with a string payload
internal sealed class ProgressEvent(string step) : WorkflowEvent(step) { }

// Event with a structured payload
internal sealed class MetricsEvent(MetricsData metrics) : WorkflowEvent(metrics) { }

Erstellen Sie in Python benutzerdefinierte Ereignisse mithilfe der WorkflowEvent Klasse direkt mit einer benutzerdefinierten Typdiskriminatorzeichenfolge. Die Parameter type und data enthalten alle Informationen.

from agent_framework import WorkflowEvent

# Create a custom event with a custom type string and payload
event = WorkflowEvent(type="progress", data="Step 1 complete")

# Custom event with a structured payload
event = WorkflowEvent(type="metrics", data={"latency_ms": 42, "tokens": 128})

Hinweis

Die Ereignistypen "started", "status"und "failed" sind für Framework-Lebenszyklusbenachrichtigungen reserviert. Wenn ein Executor versucht, einen dieser Typen auszustrahlen, wird das Ereignis ignoriert und eine Warnung protokolliert.

Auslösen von benutzerdefinierten Ereignissen

Geben Sie benutzerdefinierte Ereignisse aus dem Nachrichtenhandler eines Executors aus, indem Sie die Methode AddEventAsync für das Element IWorkflowContext aufrufen.

using Microsoft.Agents.AI.Workflows;

internal sealed class ProgressEvent(string step) : WorkflowEvent(step) { }

internal sealed partial class CustomExecutor() : Executor("CustomExecutor")
{
    [MessageHandler]
    private async ValueTask HandleAsync(string message, IWorkflowContext context)
    {
        await context.AddEventAsync(new ProgressEvent("Validating input"));

        // Executor logic...

        await context.AddEventAsync(new ProgressEvent("Processing complete"));
    }
}

Geben Sie benutzerdefinierte Ereignisse aus einem Handler aus, indem Sie folgendes add_eventaufrufenWorkflowContext:

from agent_framework import (
    handler,
    Executor,
    WorkflowContext,
    WorkflowEvent,
)

class CustomExecutor(Executor):

    @handler
    async def handle(self, message: str, ctx: WorkflowContext[str]) -> None:
        await ctx.add_event(WorkflowEvent(type="progress", data="Validating input"))

        # Executor logic...

        await ctx.add_event(WorkflowEvent(type="progress", data="Processing complete"))

Verwenden von benutzerdefinierten Ereignissen

Verwenden Sie den Musterabgleich, um im Ereignisdatenstrom nach Ihrem benutzerdefinierten Ereignistyp zu filtern:

await foreach (WorkflowEvent evt in run.WatchStreamAsync())
{
    switch (evt)
    {
        case ProgressEvent progress:
            Console.WriteLine($"Progress: {progress.Data}");
            break;

        case WorkflowOutputEvent output:
            Console.WriteLine($"Done: {output.Data}");
            return;
    }
}

Filtern Sie nach der benutzerdefinierten Typendiskriminatorzeichenfolge:

async for event in workflow.run(input_message, stream=True):
    if event.type == "progress":
        print(f"Progress: {event.data}")
    elif event.type == "output":
        print(f"Done: {event.data}")
        return

Nächste Schritte

Verwandte Themen: