Events

Systém událostí pracovního postupu poskytuje pozorovatelnost při provádění pracovního postupu. Události jsou vyvolávány v klíčových bodech během provádění a dají se využívat v reálném čase přes streamování.

Předdefinované typy událostí

// 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

Poznámka:

Když agenti používají nástroje vyžadující schválení, RequestInfoEvent obvykle nese ToolApprovalRequestContent datový obsah pro volání nástrojů, které vyžadují lidské schválení. Podrobnosti o zpracování těchto událostí najdete v tématu Human-in-the-Loop .

# 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 a terminal (final) output
WorkflowEvent.type == "intermediate"        # Workflow produces an intermediate (observational) 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"                # Deprecated alias for "intermediate"

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

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

Poznámka:

Když agenti používají nástroje s vyžadovaným schválením, request_info události obvykle nesou Content zatížení s type == "function_approval_request" pro volání nástrojů, které vyžadují lidské schválení. Podrobnosti o zpracování těchto událostí najdete v tématu Human-in-the-Loop .

Poznámka:

"output" a "intermediate" jsou to dva diskriminátory výstupu. Vykonavatel určený jako zdroj výstupu terminálu vysílá události "output" (které zpracovává WorkflowRunResult.get_outputs()). Ten, který je označen jako mezilehlý výstupní zdroj, vysílá "intermediate" události (které zpracovává WorkflowRunResult.get_intermediate_outputs()). Typ "data" je zastaralý alias pro "intermediate" a bude odebrán v budoucí verzi. Preferujte filtrování "intermediate" v novém kódu.

Zpracovávání událostí

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(input_message, stream=True):
    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 == "intermediate":
        print(f"Intermediate output from {event.executor_id}: {event.data}")
    elif event.type == "output":
        print(f"Terminal output: {event.data}")
        return
    elif event.type == "error":
        print(f"Workflow error: {event.data}")
        return

Vlastní události

Vlastní události umožňují exekutorům generovat signály specifické pro doménu během provádění pracovního postupu přizpůsobené potřebám vaší aplikace. Mezi příklady případů použití patří:

  • Sledovat průběh – hlásit přechodné kroky, aby volající mohli zobrazovat aktualizace stavu.
  • Emitovat diagnostiku – zobrazit upozornění, metriky nebo informace o ladění bez změny výstupu pracovního postupu.
  • Přenosová data domény – odesílání strukturovaných datových zátěží (např. zápisy do databáze, volání nástrojů) posluchačům v reálném čase.

Definování vlastních událostí

Definujte vlastní událost podtřídou WorkflowEvent. Základní konstruktor přijímá volitelnou object? data datovou část, která je vystavena prostřednictvím Data vlastnosti.

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) { }

V jazyce Python vytvořte vlastní události přímo pomocí třídy s vlastním řetězcem rozlišení typu. Parametry type a data obsahují všechny informace.

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})

Poznámka:

Typy událostí "started", "status" a "failed" jsou vyhrazeny pro oznámení životního cyklu rámce. Pokud se exekutor pokusí vygenerovat jeden z těchto typů, událost se ignoruje a zaprotokoluje se upozornění.

Definujte vlastní událost vytvořením typu, který implementuje workflow.Event rozhraní. Metoda Data vrátí datovou část události.

type ProgressEvent struct {
    Step string
}

func (e ProgressEvent) Data() any {
    return e.Step
}

Generování vlastních událostí

Generování vlastních událostí z obslužné rutiny zprávy exekutoru voláním AddEventAsync na IWorkflowContext:

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"));
    }
}

Generování vlastních událostí z obslužné rutiny voláním add_event na WorkflowContext:

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"))

Generování vlastních událostí z obslužné rutiny exekutoru voláním AddEvent na workflow.Context:

customExecutor := workflow.NewExecutor("CustomExecutor", func(ctx *workflow.Context, message string) error {
    if err := ctx.AddEvent(ProgressEvent{Step: "Validating input"}); err != nil {
        return err
    }

    // Executor logic...

    return ctx.AddEvent(ProgressEvent{Step: "Processing complete"})
}).Bind()

Využívání vlastních událostí

K filtrování vlastního typu události ve streamu událostí použijte porovnávání vzorů:

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;
    }
}

Filtr na řetězec diskriminátoru vlastního typu:

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

Pomocí přepínače typu nebo typové aserce filtrujte ve streamu událostí váš vlastní typ události:

for evt, err := range run.WatchStream(ctx) {
    if err != nil {
        return err
    }

    switch e := evt.(type) {
    case ProgressEvent:
        fmt.Printf("Progress: %v\n", e.Data())
    case workflow.OutputEvent:
        fmt.Printf("Done: %v\n", e.Output)
        return nil
    }
}

Events

Pracovní postupy generují události během provádění. Události lze sledovat pomocí objektu run.

Sledování událostí

run, err := inproc.Default.Run(ctx, wf, input)
for evt := range run.NewEvents() {
    switch e := evt.(type) {
    case workflow.ExecutorCompletedEvent:
        fmt.Printf("Executor %s completed: %v\n", e.ExecutorID, e.Result)
    case workflow.OutputEvent:
        fmt.Printf("Output from %s: %v\n", e.ExecutorID, e.Output)
    }
}

Události streamování

Pro streamované pracovní postupy použijte inproc.Default.RunStreaming a WatchStream:

run, err := inproc.Default.RunStreaming(ctx, wf, input)
for evt, err := range run.WatchStream(ctx) {
    if err != nil {
        panic(err)
    }
    // process streaming events
}

Další kroky

Související témata: