Kommentar
Åtkomst till den här sidan kräver auktorisering. Du kan prova att logga in eller ändra kataloger.
Åtkomst till den här sidan kräver auktorisering. Du kan prova att ändra kataloger.
Det här dokumentet innehåller en översikt över hur du använder arbetsflöden som agenter i Microsoft Agent Framework.
Översikt
Ibland har du skapat ett avancerat arbetsflöde med flera agenter, anpassade utförare och komplex logik – men du vill använda det precis som andra agenter. Det är precis vad arbetsflödesagenter låter dig göra. Genom att omsluta arbetsflödet som en Agentkan du interagera med det via samma välbekanta API som du skulle använda för en enkel chattagent.
Viktiga fördelar
- Enhetligt gränssnitt: Interagera med komplexa arbetsflöden med samma API som enkla agenter
- API-kompatibilitet: Integrera arbetsflöden med befintliga system som stöder agentgränssnittet
- Sammansättning: Använd arbetsflödesagenter som byggstenar i större agentsystem eller i andra arbetsflöden
- Sessionshantering: Utnyttja agentsessioner för konversationstillstånd och återupptagande
- Stöd för direktuppspelning: Hämta realtidsuppdateringar när arbetsflödet körs
Så här fungerar det
När du konverterar ett arbetsflöde till en agent:
- Arbetsflödet verifieras för att säkerställa att startexekutor kan acceptera de indatatyper som krävs
- En session skapas för att hantera konversationstillstånd
- Indatameddelanden dirigeras till arbetsflödets startexekutor
- Arbetsflödeshändelser konverteras till agentsvarsuppdateringar
- Externa indatabegäranden (från
RequestInfoExecutor) visas som funktionsanrop
Kravspecifikation
Om du vill använda ett arbetsflöde som agent måste arbetsflödets startexekutor kunna hantera IEnumerable<ChatMessage> som indata. Detta uppfylls automatiskt när du använder agentbaserade utförare som skapats med AsAIAgent.
Skapa en arbetsflödesagent
AsAIAgent() Använd tilläggsmetoden för att konvertera alla kompatibla arbetsflöden till en agent:
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 parametrar
| Parameter | Typ | Description |
|---|---|---|
id |
string? |
Valfri unik identifierare för agenten. Genereras automatiskt om det inte tillhandahålls. |
name |
string? |
Valfritt visningsnamn för agenten. |
description |
string? |
Valfri beskrivning av agentens syfte. |
executionEnvironment |
IWorkflowExecutionEnvironment? |
Valfri körningsmiljö. Standardvärdet är InProcessExecution.OffThread eller InProcessExecution.Concurrent som baseras på arbetsflödeskonfiguration. |
includeExceptionDetails |
bool |
Om true inkluderar undantagsmeddelanden i felinnehåll. Standardinställningen är false. |
includeWorkflowOutputsInResponse |
bool |
Om trueomvandlas utgående arbetsflödesutdata till innehåll i agentsvar. Standardinställningen är false. |
Använda arbetsflödesagenter
Skapa en session
Varje konversation med en arbetsflödesagent kräver en session för att hantera tillstånd:
// Create a new session for the conversation
AgentSession session = await workflowAgent.CreateSessionAsync();
Körning utan direktuppspelning
För enkla användningsfall där du vill ha ett fullständigt svar:
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}");
}
Körning av direktuppspelning
För realtidsuppdateringar när arbetsflödet körs:
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);
}
}
Hantera externa indatabegäranden
När ett arbetsflöde innehåller utförare som begär externa indata (med RequestInfoExecutor), visas dessa begäranden som funktionsanrop i agentsvaret:
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
}
}
}
Seriellisering och återupptagande av sessioner
Arbetsflödesagentsessioner kan serialiseras för beständighet och återupptas senare:
// 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);
}
Kravspecifikation
Om du vill använda ett arbetsflöde som agent måste arbetsflödets startexekutor kunna hantera meddelandeindata. Detta uppfylls automatiskt när du använder Agent eller agentbaserade utförare.
Skapa en arbetsflödesagent
Anropa as_agent() alla kompatibla arbetsflöden för att konvertera det till en agent:
from agent_framework.foundry import FoundryChatClient
from agent_framework.orchestrations import SequentialBuilder
from azure.identity import AzureCliCredential
# Create your chat client and agents
client = FoundryChatClient(
project_endpoint="<your-endpoint>",
model="<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 parametrar
| Parameter | Typ | Description |
|---|---|---|
name |
str | None |
Valfritt visningsnamn för agenten. Genereras automatiskt om det inte tillhandahålls. |
Använda arbetsflödesagenter
Skapa en session
Du kan också skapa en session för att hantera konversationstillstånd över flera varv:
# Create a new session for the conversation
session = await workflow_agent.create_session()
Anmärkning
Sessioner är valfria. Om du inte skickar en session till run()hanterar agenten tillståndet internt.
Om workflow.as_agent() skapas utan context_providers, lägger ramverket som standard till en InMemoryHistoryProvider() så att historiken för konversationer fungerar direkt utan ytterligare inställningar.
Om du uttryckligen skickar context_providers, används den listan som den är.
Körning utan direktuppspelning
För enkla användningsfall där du vill ha ett fullständigt svar:
# 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}")
Körning av direktuppspelning
För realtidsuppdateringar när arbetsflödet körs:
async for update in workflow_agent.run(
"Write an article about AI trends",
stream=True,
):
if update.text:
print(update.text, end="", flush=True)
Hantera externa indatabegäranden
När ett arbetsflöde innehåller utförare som begär externa indata (med hjälp av request_info) visas dessa begäranden som funktionsanrop i agentsvaret. Funktionsanropet använder namnet 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
Tillhandahålla svar på väntande begäranden
Om du vill fortsätta arbetsflödeskörningen efter en extern indatabegäran skapar du ett funktionsresultat och skickar tillbaka det:
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]))
Fullständigt exempel
Här är ett fullständigt exempel som visar en arbetsflödesagent med strömmande utdata:
import asyncio
import os
from agent_framework.foundry import FoundryChatClient
from agent_framework.orchestrations import SequentialBuilder
from azure.identity import AzureCliCredential
async def main():
# Set up the chat client
client = FoundryChatClient(
project_endpoint=os.environ["FOUNDRY_PROJECT_ENDPOINT"],
model=os.environ["FOUNDRY_MODEL"],
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())
Att förstå händelsekonvertering
När ett arbetsflöde körs som en agent konverteras arbetsflödeshändelser till agentsvar. Typen av svar beror på hur du anropar run():
-
run(): Returnerar ettAgentResponseinnehållande det fullständiga resultatet när arbetsflödet har slutförts -
run(..., stream=True): Returnerar en asynkron iterbar mängdAgentResponseUpdateobjekt när arbetsflödet körs, vilket ger realtidsuppdateringar
Under körning mappas interna arbetsflödeshändelser till agentsvar på följande sätt:
| Arbetsflödeshändelse | Agentsvar |
|---|---|
event.type == "output" |
Skickas som AgentResponseUpdate (direktuppspelning) eller aggregeras till AgentResponse (icke-direktuppspelning) |
event.type == "request_info" |
Konverterat till funktionsanropsinnehåll med hjälp av WorkflowAgent.REQUEST_INFO_FUNCTION_NAME |
| Andra händelser | Ignoreras (endast internt arbetsflöde) |
Med den här konverteringen kan du använda standardagentgränssnittet samtidigt som du har åtkomst till detaljerad arbetsflödesinformation när det behövs.
Användningsfall
Komplexa agent-pipelines
Omsluta ett arbetsflöde med flera agenter som en enda agent för användning i program:
User Request --> [Workflow Agent] --> Final Response
|
+-- Researcher Agent
+-- Writer Agent
+-- Reviewer Agent
2. Agentsammansättning
Använd arbetsflödesagenter som komponenter i större system:
- En arbetsflödesagent kan användas som ett verktyg av en annan agent
- Flera arbetsflödesagenter kan samordnas tillsammans
- Arbetsflödesagenter kan kapslas i andra arbetsflöden
3. API-integrering
Exponera komplexa arbetsflöden via API:er som förväntar sig standardgränssnittet för agenten, vilket aktiverar:
- Chattgränssnitt som använder avancerade serverdelsarbetsflöden
- Integrering med befintliga agentbaserade system
- Gradvis migrering från enkla agenter till komplexa arbetsflöden