Freigeben über


Microsoft Agent Framework-Workflows – Verwenden von Workflows als Agents

Dieses Dokument bietet eine Übersicht über die Verwendung von Workflows als Agents in Microsoft Agent Framework.

Überblick

Manchmal haben Sie einen anspruchsvollen Workflow mit mehreren Agents, benutzerdefinierten Executoren und komplexer Logik erstellt – möchten ihn jedoch wie jeden anderen Agenten verwenden. Workflow-Agenten ermöglichen es Ihnen genau das zu tun. Durch das Umschließen Ihres Workflows als Agent können Sie mit dem Workflow über dieselbe vertraute API interagieren, die Sie für einen einfachen Chat-Agenten verwenden.

Wichtige Vorteile

  • Einheitliche Schnittstelle: Interagieren mit komplexen Workflows mit derselben API wie einfache Agents
  • API-Kompatibilität: Integrieren von Workflows in vorhandene Systeme, die die Agent-Schnittstelle unterstützen
  • Komponierbarkeit: Die Verwendung von Workflow-Agenten als Bausteine in größeren Agentensystemen oder anderen Workflows
  • Sitzungsverwaltung: Agent-Sitzungen zur Verwaltung des Gesprächszustands und zur Wiederaufnahme nutzen
  • Streamingunterstützung: Abrufen von Echtzeitupdates während der Ausführung des Workflows

Funktionsweise

Wenn Sie einen Workflow in einen Agent konvertieren:

  1. Der Workflow wird validiert, um sicherzustellen, dass der Start-Executor die erforderlichen Eingabetypen akzeptieren kann.
  2. Eine Sitzung wird erstellt, um den Sitzungszustand zu verwalten.
  3. Eingabemeldungen werden an den Startausführer des Workflows weitergeleitet.
  4. Workflow-Ereignisse werden in Agent-Antwort-Updates umgewandelt.
  5. Externe Eingabeanforderungen (von RequestInfoExecutor) werden als Funktionsaufrufe angezeigt.

Anforderungen

Um einen Workflow als Agent zu verwenden, muss der Startausführer des Workflows als Eingabe verarbeiten IEnumerable<ChatMessage> können. Dies wird automatisch erfüllt, wenn agentbasierte Ausführungsumgebungen verwendet werden, die mit AsAIAgent erstellt wurden.

Erstellen eines Workflow-Agents

Verwenden Sie die AsAIAgent() Erweiterungsmethode, um jeden kompatiblen Workflow in einen Agent zu konvertieren:

using Microsoft.Agents.AI;
using Microsoft.Agents.AI.Workflows;
using Microsoft.Extensions.AI;

// Create agents
AIAgent researchAgent = chatClient.AsAIAgent("You are a researcher. Research and gather information on the given topic.");
AIAgent writerAgent = chatClient.AsAIAgent("You are a writer. Write clear, engaging content based on research.");
AIAgent reviewerAgent = chatClient.AsAIAgent("You are a reviewer. Review the content and provide a final polished version.");

// Build a sequential workflow
var workflow = new WorkflowBuilder(researchAgent)
    .AddEdge(researchAgent, writerAgent)
    .AddEdge(writerAgent, reviewerAgent)
    .Build();

// Convert the workflow to an agent
AIAgent workflowAgent = workflow.AsAIAgent(
    id: "content-pipeline",
    name: "Content Pipeline Agent",
    description: "A multi-agent workflow that researches, writes, and reviews content"
);

AsAIAgent-Parameter

Parameter Typ Description
id string? Optionaler eindeutiger Bezeichner für den Agent. Wird automatisch generiert, falls nicht angegeben.
name string? Optionaler Anzeigename für den Agent.
description string? Optionale Beschreibung des Zwecks des Agenten.
executionEnvironment IWorkflowExecutionEnvironment? Optionale Ausführungsumgebung. Standardmäßig wird InProcessExecution.OffThread oder InProcessExecution.Concurrent basierend auf der Workflowkonfiguration verwendet.
includeExceptionDetails bool Wenn true, sind Ausnahmemeldungen im Fehlerinhalt enthalten. Wird standardmäßig auf false festgelegt.
includeWorkflowOutputsInResponse bool Wenn true, transformiert die ausgehende Workflowausgabe in Inhalte für Agentenantworten um. Wird standardmäßig auf false festgelegt.

Verwenden von Workflow-Agents

Erstellen einer Sitzung

Jede Unterhaltung mit einem Workflow-Agent erfordert eine Sitzung zum Verwalten des Zustands:

// Create a new session for the conversation
AgentSession session = await workflowAgent.CreateSessionAsync();

Nicht-Streaming-Ausführung

Für einfache Anwendungsfälle, in denen Sie die vollständige Antwort benötigen:

var messages = new List<ChatMessage>
{
    new(ChatRole.User, "Write an article about renewable energy trends in 2025")
};

AgentResponse response = await workflowAgent.RunAsync(messages, session);

foreach (ChatMessage message in response.Messages)
{
    Console.WriteLine($"{message.AuthorName}: {message.Text}");
}

Streaming-Ausführung

Für Echtzeitaktualisierungen während der Ausführung des Workflows:

var messages = new List<ChatMessage>
{
    new(ChatRole.User, "Write an article about renewable energy trends in 2025")
};

await foreach (AgentResponseUpdate update in workflowAgent.RunStreamingAsync(messages, session))
{
    // Process streaming updates from each agent in the workflow
    if (!string.IsNullOrEmpty(update.Text))
    {
        Console.Write(update.Text);
    }
}

Behandeln externer Eingabeanforderungen

Wenn ein Workflow Executoren enthält, die externe Eingabe anfordern (mithilfe RequestInfoExecutor), werden diese Anforderungen als Funktionsaufrufe in der Agentantwort angezeigt:

await foreach (AgentResponseUpdate update in workflowAgent.RunStreamingAsync(messages, session))
{
    // Check for function call requests
    foreach (AIContent content in update.Contents)
    {
        if (content is FunctionCallContent functionCall)
        {
            // Handle the external input request
            Console.WriteLine($"Workflow requests input: {functionCall.Name}");
            Console.WriteLine($"Request data: {functionCall.Arguments}");

            // Provide the response in the next message
        }
    }
}

Serialisierung und Wiederaufnahme der Sitzung

Workflow-Agentsitzungen können zur Persistenz serialisiert und später fortgesetzt werden:

// Serialize the session state
JsonElement serializedSession = await workflowAgent.SerializeSessionAsync(session);

// Store serializedSession to your persistence layer...

// Later, resume the session
AgentSession resumedSession = await workflowAgent.DeserializeSessionAsync(serializedSession);

// Continue the conversation
await foreach (var update in workflowAgent.RunStreamingAsync(newMessages, resumedSession))
{
    Console.Write(update.Text);
}

Anforderungen

Um einen Workflow als Agent zu verwenden, muss der Startausführer des Workflows in der Lage sein, die Nachrichteneingabe zu verarbeiten. Dies wird automatisch erfüllt, wenn Agent oder agentenbasierte Executor verwendet werden.

Erstellen eines Workflow-Agents

Rufen Sie as_agent() jeden kompatiblen Workflow auf, um ihn in einen Agent zu konvertieren:

from agent_framework.azure import AzureOpenAIResponsesClient
from agent_framework.orchestrations import SequentialBuilder
from azure.identity import AzureCliCredential

# Create your chat client and agents
client = AzureOpenAIResponsesClient(
    project_endpoint="<your-endpoint>",
    deployment_name="<your-deployment>",
    credential=AzureCliCredential(),
)

researcher = client.as_agent(
    name="Researcher",
    instructions="Research and gather information on the given topic.",
)

writer = client.as_agent(
    name="Writer",
    instructions="Write clear, engaging content based on research.",
)

# Build a sequential workflow
workflow = SequentialBuilder(participants=[researcher, writer]).build()

# Convert the workflow to an agent
workflow_agent = workflow.as_agent(name="Content Pipeline Agent")

as_agent Parameter

Parameter Typ Description
name str | None Optionaler Anzeigename für den Agent. Wird automatisch generiert, falls nicht angegeben.

Verwenden von Workflow-Agents

Erstellen einer Sitzung

Sie können optional eine Sitzung erstellen, um den Gesprächszustand über mehrere Dialogrunden hinweg zu verwalten.

# Create a new session for the conversation
session = await workflow_agent.create_session()

Hinweis

Sitzungen sind optional. Wenn Sie keine Parameter an session und run() übergeben, verwaltet der Agent den Zustand intern. Wenn workflow.as_agent() ohne context_providers erstellt wird, fügt das Framework standardmäßig ein InMemoryHistoryProvider() hinzu, damit der Multi-Turn-Verlauf sofort einsatzbereit ist. Wenn Sie context_providers explizit übergeben, wird diese Liste so wie sie ist verwendet.

Nicht-Streaming-Ausführung

Für einfache Anwendungsfälle, in denen Sie die vollständige Antwort benötigen:

# You can pass a plain string as input
response = await workflow_agent.run("Write an article about AI trends")

for message in response.messages:
    print(f"{message.author_name}: {message.text}")

Streaming-Ausführung

Für Echtzeitaktualisierungen während der Ausführung des Workflows:

async for update in workflow_agent.run(
    "Write an article about AI trends",
    stream=True,
):
    if update.text:
        print(update.text, end="", flush=True)

Behandeln externer Eingabeanforderungen

Wenn ein Workflow Executoren enthält, die externe Eingabe anfordern (mithilfe request_info), werden diese Anforderungen als Funktionsaufrufe in der Agentantwort angezeigt. Der Funktionsaufruf verwendet den Namen WorkflowAgent.REQUEST_INFO_FUNCTION_NAME:

from agent_framework import Content, Message, WorkflowAgent

response = await workflow_agent.run("Process my request")

# Look for function calls in the response
human_review_function_call = None
for message in response.messages:
    for content in message.contents:
        if content.name == WorkflowAgent.REQUEST_INFO_FUNCTION_NAME:
            human_review_function_call = content

Bereitstellen von Antworten auf ausstehende Anforderungen

Um die Workflowausführung nach einer externen Eingabeanforderung fortzusetzen, erstellen Sie ein Funktionsergebnis, und senden Sie ihn zurück:

if human_review_function_call:
    # Parse the request arguments
    request = WorkflowAgent.RequestInfoFunctionArgs.from_json(
        human_review_function_call.arguments
    )

    # Create a response (your custom response type)
    result_data = MyResponseType(approved=True, feedback="Looks good")

    # Create the function call result
    function_result = Content.from_function_result(
        call_id=human_review_function_call.call_id,
        result=result_data,
    )

    # Send the response back to continue the workflow
    response = await workflow_agent.run(Message("tool", [function_result]))

Vollständiges Beispiel

Hier ist ein vollständiges Beispiel, in dem ein Workflow-Agent mit Streamingausgabe veranschaulicht wird:

import asyncio
import os

from agent_framework.azure import AzureOpenAIResponsesClient
from agent_framework.orchestrations import SequentialBuilder
from azure.identity import AzureCliCredential


async def main():
    # Set up the chat client
    client = AzureOpenAIResponsesClient(
        project_endpoint=os.environ["AZURE_AI_PROJECT_ENDPOINT"],
        deployment_name=os.environ["AZURE_AI_MODEL_DEPLOYMENT_NAME"],
        credential=AzureCliCredential(),
    )

    # Create specialized agents
    researcher = client.as_agent(
        name="Researcher",
        instructions="Research the given topic and provide key facts.",
    )

    writer = client.as_agent(
        name="Writer",
        instructions="Write engaging content based on the research provided.",
    )

    reviewer = client.as_agent(
        name="Reviewer",
        instructions="Review the content and provide a final polished version.",
    )

    # Build a sequential workflow
    workflow = SequentialBuilder(participants=[researcher, writer, reviewer]).build()

    # Convert to a workflow agent
    workflow_agent = workflow.as_agent(name="Content Creation Pipeline")

    # Run the workflow
    print("Starting workflow...")
    print("=" * 60)

    current_author = None
    async for update in workflow_agent.run(
        "Write about quantum computing",
        stream=True,
    ):
        # Show when different agents are responding
        if update.author_name and update.author_name != current_author:
            if current_author:
                print("\n" + "-" * 40)
            print(f"\n[{update.author_name}]:")
            current_author = update.author_name

        if update.text:
            print(update.text, end="", flush=True)

    print("\n" + "=" * 60)
    print("Workflow completed!")


if __name__ == "__main__":
    asyncio.run(main())

Verständnis der Ereigniskonvertierung

Wenn ein Workflow als Agent ausgeführt wird, werden Workflowereignisse in Agentantworten konvertiert. Die Art der Antwort hängt davon ab, wie Sie anrufen run():

  • run(): Gibt ein AgentResponse Ergebnis zurück, das das vollständige Ergebnis enthält, nachdem der Workflow abgeschlossen wurde.
  • run(..., stream=True): Gibt eine asynchrone Iterable von AgentResponseUpdate Objekten zurück, während der Workflow ausgeführt wird und Echtzeitaktualisierungen bereitgestellt werden.

Während der Ausführung werden interne Workflow-Ereignisse den Agentantworten wie folgt zugeordnet:

Workflow-Ereignis Antwort des Agenten
event.type == "output" Übergeben als AgentResponseUpdate (Streaming) oder aggregiert in AgentResponse (nicht streaming)
event.type == "request_info" Konvertiert in Funktionsaufrufinhalte mithilfe von WorkflowAgent.REQUEST_INFO_FUNCTION_NAME
Andere Ereignisse Ignoriert (nur workflow-intern)

Mit dieser Konvertierung können Sie die Standard-Agent-Schnittstelle verwenden und gleichzeitig bei Bedarf auf detaillierte Workflowinformationen zugreifen.

Anwendungsfälle

1. Komplexe Agent-Pipelines

Einen Multi-Agenten-Workflow als einzelnen Agenten zusammenfassen zur Nutzung in Anwendungen.

User Request --> [Workflow Agent] --> Final Response
                      |
                      +-- Researcher Agent
                      +-- Writer Agent  
                      +-- Reviewer Agent

2. Zusammensetzung des Agenten

Verwenden Sie Workflow-Agents als Komponenten in größeren Systemen:

  • Ein Workflow-Agent kann von einem anderen Agent als Tool verwendet werden.
  • Mehrere Workflow-Agents können zusammen orchestriert werden
  • Workflow-Agents können in anderen Workflows geschachtelt werden

3. API-Integration

Machen Sie komplexe Workflows über APIs verfügbar, die die Standard-Agent-Schnittstelle erwarten, und ermöglichen Sie Folgendes:

  • Chatschnittstellen, die komplexe Back-End-Workflows verwenden
  • Integration in vorhandene agentbasierte Systeme
  • Schrittweise Migration von einfachen Agents zu komplexen Workflows

Nächste Schritte