Notitie
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen u aan te melden of de directory te wijzigen.
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen de mappen te wijzigen.
Groepschatorchestratie modelleert een gezamenlijk gesprek tussen meerdere agenten, gecoördineerd door een orkestrator die de sprekerselectie en gespreksstroom bepaalt. Dit patroon is ideaal voor scenario's waarvoor iteratieve verfijning, probleemoplossing voor samenwerking of analyse met meerdere perspectieven is vereist.
Intern verzamelt de groepschatorchestratie agenten in een stertopologie, met een orchestrator in het midden. De orchestrator kan verschillende strategieën implementeren voor het selecteren van welke agent hierna spreekt, zoals round robin, selectie op basis van prompts of aangepaste logica op basis van gesprekscontext, waardoor deze een flexibel en krachtig patroon is voor samenwerking met meerdere agents.
Verschillen tussen groepschat en andere patronen
Groepschatcoördinatie heeft verschillende kenmerken in vergelijking met andere patronen met meerdere agenten.
- Gecentraliseerde coördinatie: in tegenstelling tot handoff-patronen waarbij agents rechtstreeks controle overdragen, maakt groepschat gebruik van een orchestrator om te coördineren wie hierna spreekt
- Iteratieve verfijning: agents kunnen elkaars antwoorden in meerdere rondes beoordelen en erop voortbouwen
- Flexibele sprekerselectie: de orchestrator kan verschillende strategieën (round robin, op prompt gebaseerde, aangepaste logica) gebruiken om sprekers te selecteren
- Gedeelde context: alle agents zien de volledige gespreksgeschiedenis, waardoor gezamenlijke verfijning mogelijk is
Wat u leert
- Gespecialiseerde agenten creëren voor samenwerking in groepen
- Strategieën voor sprekerselectie configureren
- Werkstromen bouwen met iteratieve agentverfijning
- Hoe u de gespreksstroom kunt aanpassen met orchestrators op maat
De Azure OpenAI-client instellen
using System;
using System.Collections.Generic;
using System.Threading.Tasks;
using Azure.AI.Projects;
using Azure.Identity;
using Microsoft.Agents.AI.Workflows;
using Microsoft.Extensions.AI;
using Microsoft.Agents.AI;
// Set up the Azure OpenAI client
var endpoint = Environment.GetEnvironmentVariable("AZURE_OPENAI_ENDPOINT") ??
throw new InvalidOperationException("AZURE_OPENAI_ENDPOINT is not set.");
var deploymentName = Environment.GetEnvironmentVariable("AZURE_OPENAI_DEPLOYMENT_NAME") ?? "gpt-4o-mini";
var client = new AIProjectClient(new Uri(endpoint), new DefaultAzureCredential())
.GetProjectOpenAIClient()
.GetProjectResponsesClient()
.AsIChatClient(deploymentName);
Waarschuwing
DefaultAzureCredential is handig voor ontwikkeling, maar vereist zorgvuldige overwegingen in de productieomgeving. Overweeg in productie een specifieke referentie te gebruiken (bijvoorbeeld ManagedIdentityCredential) om latentieproblemen, onbedoelde referentieprobing en potentiële beveiligingsrisico's van terugvalmechanismen te voorkomen.
Uw agents definiëren
Maak gespecialiseerde agents voor verschillende rollen in het groepsgesprek:
// Create a copywriter agent
ChatClientAgent writer = new(client,
"You are a creative copywriter. Generate catchy slogans and marketing copy. Be concise and impactful.",
"CopyWriter",
"A creative copywriter agent");
// Create a reviewer agent
ChatClientAgent reviewer = new(client,
"You are a marketing reviewer. Evaluate slogans for clarity, impact, and brand alignment. " +
"Provide constructive feedback or approval.",
"Reviewer",
"A marketing review agent");
Groepschat configureren met Round-Robin Orchestrator
Bouw de werkstroom voor groepschats met behulp van AgentWorkflowBuilder:
// Build group chat with round-robin speaker selection
// The manager factory receives the list of agents and returns a configured manager
var workflow = AgentWorkflowBuilder
.CreateGroupChatBuilderWith(agents =>
new RoundRobinGroupChatManager(agents)
{
MaximumIterationCount = 5 // Maximum number of turns
})
.AddParticipants(writer, reviewer)
.Build();
De groepschatwerkstroom uitvoeren
Voer de werkstroom uit en bekijk het iteratieve gesprek:
// Start the group chat
var messages = new List<ChatMessage> {
new(ChatRole.User, "Create a slogan for an eco-friendly electric vehicle.")
};
await using StreamingRun run = await InProcessExecution.RunStreamingAsync(workflow, messages);
await run.TrySendMessageAsync(new TurnToken(emitEvents: true));
await foreach (WorkflowEvent evt in run.WatchStreamAsync().ConfigureAwait(false))
{
if (evt is AgentResponseUpdateEvent update)
{
// Process streaming agent responses
AgentResponse response = update.AsResponse();
foreach (ChatMessage message in response.Messages)
{
Console.WriteLine($"[{update.ExecutorId}]: {message.Text}");
}
}
else if (evt is WorkflowOutputEvent output)
{
// Workflow completed
var conversationHistory = output.As<List<ChatMessage>>();
Console.WriteLine("\n=== Final Conversation ===");
foreach (var message in conversationHistory)
{
Console.WriteLine($"{message.AuthorName}: {message.Text}");
}
break;
}
}
Voorbeeldinteractie
[CopyWriter]: "Green Dreams, Zero Emissions" - Drive the future with style and sustainability.
[Reviewer]: The slogan is good, but "Green Dreams" might be a bit abstract. Consider something
more direct like "Pure Power, Zero Impact" to emphasize both performance and environmental benefit.
[CopyWriter]: "Pure Power, Zero Impact" - Experience electric excellence without compromise.
[Reviewer]: Excellent! This slogan is clear, impactful, and directly communicates the key benefits.
The tagline reinforces the message perfectly. Approved for use.
[CopyWriter]: Thank you! The final slogan is: "Pure Power, Zero Impact" - Experience electric
excellence without compromise.
De chatclient instellen
import os
from agent_framework.foundry import FoundryChatClient
from azure.identity import AzureCliCredential
# Initialize the Azure OpenAI client
client = FoundryChatClient(
project_endpoint=os.environ["FOUNDRY_PROJECT_ENDPOINT"],
model=os.environ["FOUNDRY_MODEL"],
credential=AzureCliCredential(),
)
Uw agents definiëren
Maak gespecialiseerde agents met verschillende rollen:
from agent_framework import Agent
# Create a researcher agent
researcher = Agent(
client=client,
name="Researcher",
description="Collects relevant background information.",
instructions="Gather concise facts that help answer the question. Be brief and factual.",
)
# Create a writer agent
writer = Agent(
client=client,
name="Writer",
description="Synthesizes polished answers using gathered information.",
instructions="Compose clear, structured answers using any notes provided. Be comprehensive.",
)
Groepschat configureren met eenvoudige selector
Bouw een groepschat met aangepaste logica voor sprekerselectie:
from agent_framework.orchestrations import GroupChatBuilder, GroupChatState
def round_robin_selector(state: GroupChatState) -> str:
"""A round-robin selector function that picks the next speaker based on the current round index."""
participant_names = list(state.participants.keys())
return participant_names[state.current_round % len(participant_names)]
# Build the group chat workflow
workflow = GroupChatBuilder(
participants=[researcher, writer],
termination_condition=lambda conversation: len(conversation) >= 4,
intermediate_output_from=[researcher, writer],
selection_func=round_robin_selector,
).build()
Groepschat configureren met Agent-Based Orchestrator
U kunt ook een agent-gebaseerde orchestrator gebruiken voor intelligente sprekerselectie. De orchestrator is een volledige Agent met toegang tot hulpprogramma's, context en waarneembaarheid:
# Create orchestrator agent for speaker selection
orchestrator_agent = Agent(
name="Orchestrator",
description="Coordinates multi-agent collaboration by selecting speakers",
instructions="""
You coordinate a team conversation to solve the user's task.
Guidelines:
- Start with Researcher to gather information
- Then have Writer synthesize the final answer
- Only finish after both have contributed meaningfully
""",
client=client,
)
# Build group chat with agent-based orchestrator
workflow = GroupChatBuilder(
participants=[researcher, writer],
# Set a hard termination condition: stop after 4 assistant messages
# The agent orchestrator will intelligently decide when to end before this limit but just in case
termination_condition=lambda messages: sum(1 for msg in messages if msg.role == "assistant") >= 4,
orchestrator_agent=orchestrator_agent,
intermediate_output_from=[researcher, writer],
).build()
De groepschatwerkstroom uitvoeren
Voer de werkstroom uit en verwerkt updates van streamingdeelnemers. De terminaluitvoer zonder streaming is een AgentResponse; streamende terminaluitvoer wordt weergegeven als AgentResponseUpdate delen.
from agent_framework import AgentResponseUpdate, Message
task = "What are the key benefits of async/await in Python?"
print(f"Task: {task}\n")
print("=" * 80)
last_author: str | None = None
# Run the workflow with streaming enabled
stream = workflow.run(task, stream=True)
async for event in stream:
if event.type in ("intermediate", "output") and isinstance(event.data, AgentResponseUpdate):
# Print streaming agent updates
author = event.data.author_name
if author != last_author:
if last_author is not None:
print()
print(f"[{author}]:", end=" ", flush=True)
last_author = author
print(event.data.text, end="", flush=True)
result = await stream.get_final_response()
if outputs := result.get_outputs():
print("\n\n" + "=" * 80)
print("Final Response:")
print(outputs[-1])
print("\nWorkflow completed.")
Voorbeeldinteractie
Task: What are the key benefits of async/await in Python?
================================================================================
[Researcher]: Async/await in Python provides non-blocking I/O operations, enabling
concurrent execution without threading overhead. Key benefits include improved
performance for I/O-bound tasks, better resource utilization, and simplified
concurrent code structure using native coroutines.
[Writer]: The key benefits of async/await in Python are:
1. **Non-blocking Operations**: Allows I/O operations to run concurrently without
blocking the main thread, significantly improving performance for network
requests, file I/O, and database queries.
2. **Resource Efficiency**: Avoids the overhead of thread creation and context
switching, making it more memory-efficient than traditional threading.
3. **Simplified Concurrency**: Provides a clean, synchronous-looking syntax for
asynchronous code, making concurrent programs easier to write and maintain.
4. **Scalability**: Enables handling thousands of concurrent connections with
minimal resource consumption, ideal for high-performance web servers and APIs.
--------------------------------------------------------------------------------
Workflow completed.
Configuratie van Foundry instellen
endpoint := os.Getenv("FOUNDRY_PROJECT_ENDPOINT")
model := cmp.Or(os.Getenv("FOUNDRY_MODEL"), "gpt-4o-mini")
token, err := azidentity.NewDefaultAzureCredential(nil)
if err != nil {
return err
}
Waarschuwing
azidentity.NewDefaultAzureCredential is handig voor ontwikkeling, maar vereist zorgvuldige overwegingen in de productieomgeving. In productie kunt u overwegen om een specifieke referentie te gebruiken, zoals azidentity.NewManagedIdentityCredential, om latentieproblemen, onbedoelde referentieprobing en potentiële beveiligingsrisico's van terugvalmechanismen te voorkomen.
Uw agents definiëren
Maak gespecialiseerde agents met verschillende rollen in het gesprek:
copywriter := foundryprovider.NewAgent(
endpoint,
token,
foundryprovider.ModelDeployment(model),
foundryprovider.AgentConfig{
Instructions: "You are a creative copywriter. Generate catchy slogans and marketing copy. Be concise and impactful.",
Config: agent.Config{Name: "CopyWriter"},
},
)
reviewer := foundryprovider.NewAgent(
endpoint,
token,
foundryprovider.ModelDeployment(model),
foundryprovider.AgentConfig{
Instructions: "You are a marketing reviewer. Evaluate slogans for clarity, impact, and brand alignment. Provide constructive feedback or approval.",
Config: agent.Config{Name: "Reviewer"},
},
)
Groepschat configureren met Round-Robin Manager
Bouw de workflow voor de groepschat met agentworkflow.NewGroupChatWorkflowBuilder. De bouwer accepteert een managerfabriek en de deelnemende agenten.
NewRoundRobinGroupChatManager selecteert elke agent om de beurt en stopt nadat het geconfigureerde maximumaantal beurten van deelnemers is bereikt.
managerFactory := func(agents []*agent.Agent) *agentworkflow.GroupChatManager {
return agentworkflow.NewRoundRobinGroupChatManager(
agents,
agentworkflow.RoundRobinGroupChatOptions{MaximumIterationCount: 5},
)
}
wf, err := agentworkflow.NewGroupChatWorkflowBuilder(managerFactory, copywriter, reviewer).
WithName("Marketing Review Group Chat").
WithDescription("A copywriter and reviewer collaborate on marketing copy.").
Build()
if err != nil {
return err
}
De groepschatwerkstroom uitvoeren
Voer de workflow uit met een gebruikersbericht en een beurttoken. Wanneer gebeurtenisuitgifte is ingeschakeld, komen deelnemersupdates binnen als tussenliggende uitvoerevenementen en komt de uiteindelijke transcriptie binnen als een terminaluitvoerevenement.
run, err := inproc.Default.RunStreaming(ctx, wf, []*message.Message{
message.NewText("Create a slogan for an eco-friendly electric vehicle."),
})
if err != nil {
return err
}
defer run.Close(ctx)
emitEvents := true
if err := run.SendMessage(ctx, workflow.TurnToken{EmitEvents: &emitEvents}); err != nil {
return err
}
lastExecutorID := ""
for evt, err := range run.WatchStream(ctx) {
if err != nil {
return err
}
switch e := evt.(type) {
case workflow.OutputEvent:
switch value := e.Output.(type) {
case *agent.ResponseUpdate:
if e.ExecutorID != lastExecutorID {
lastExecutorID = e.ExecutorID
fmt.Printf("\n[%s]: ", e.ExecutorID)
}
fmt.Print(value.String())
case []*message.Message:
fmt.Println("\n\n=== Final Conversation ===")
for _, msg := range value {
author := msg.AuthorName
if author == "" {
author = string(msg.Role)
}
fmt.Printf("%s: %s\n", author, msg.String())
}
}
case workflow.ErrorEvent:
return e.Error
case workflow.ExecutorFailedEvent:
return fmt.Errorf("executor %q failed: %w", e.ExecutorID, e.Error)
}
}
Voorbeeldinteractie
[CopyWriter]: "Pure Power, Zero Impact" - Experience electric performance without compromise.
[Reviewer]: This is clear and memorable. It communicates performance and sustainability directly.
Approved.
[CopyWriter]: The final slogan is: "Pure Power, Zero Impact" - Experience electric performance
without compromise.
=== Final Conversation ===
user: Create a slogan for an eco-friendly electric vehicle.
CopyWriter: "Pure Power, Zero Impact" - Experience electric performance without compromise.
Reviewer: This is clear and memorable. It communicates performance and sustainability directly. Approved.
CopyWriter: The final slogan is: "Pure Power, Zero Impact" - Experience electric performance without compromise.
Sleutelbegrippen
- Gecentraliseerd beheer: Groepschat maakt gebruik van een manager om sprekerselectie en -stroom te coördineren
- AgentWorkflowBuilder.CreateGroupChatBuilderWith(): Hiermee maakt u werkstromen met een managerfactoryfunctie
- RoundRobinGroupChatManager: Ingebouwde manager die sprekers op round robin-wijze omwisselt
- MaximumIterationCount: bepaalt het maximum aantal agentbeurten voordat er wordt beëindigd
-
Aangepaste managers:
RoundRobinGroupChatManageruitbreiden of aangepaste logica implementeren - Iteratieve verfijning: agents beoordelen en verbeteren elkaars bijdragen
- Gedeelde context: alle deelnemers zien de volledige gespreksgeschiedenis
-
Flexibele orchestratorstrategieën: kiezen tussen eenvoudige selectors, op agents gebaseerde orchestrators of aangepaste logica via constructorparameters (
selection_func,orchestrator_agentoforchestrator). - GroupChatBuilder: Hiermee maakt u werkstromen met configureerbare sprekerselectie
- GroupChatState: geeft de gespreksstatus voor selectiebeslissingen
- Iteratieve samenwerking: Agents bouwen voort op elkaars bijdragen
-
AgentResponse-uitvoer: de terminaluitvoer is een
AgentResponsemet het voltooiingsbericht van de orchestrator -
Gebeurtenisstreaming: gebeurtenissen in realtime verwerken
AgentResponseUpdateviaworkflow.run(task, stream=True) -
Tussentijdse uitvoer: Geef
intermediate_output_from=[participant, ...]door om de uitvoer van elke vermelde deelnemer weer te geven als"intermediate"-events, naast de afsluitende"output"-event van de orchestrator
- GroupChatWorkflowBuilder: Hiermee maakt u een stertopologiewerkstroom met een groepschathost in het centrum en gehoste agents als deelnemers
- GroupChatManager: selecteert de volgende deelnemer, kan de uitzendingsgeschiedenis bijwerken en kan het gesprek beëindigen
- NewRoundRobinGroupChatManager: Ingebouwde manager die deelnemers in round robin-volgorde afwisselt
- RoundRobinGroupChatOptions: hiermee configureert u het maximum aantal beurten van de deelnemer en een optionele beëindigingsfunctie
- Uitvoer gebeurtenissen: deelnemersuitvoer is standaard tussenliggende gebeurtenissen en de groepschathost levert de terminaltranscriptie op
-
Aangepaste managers: Implementeer
SelectNextAgenten optionele levenscycluscallbacks voor aangepaste sprekerselectie of gecheckpointte status
Geavanceerd: Aangepaste sprekerselectie
U kunt aangepaste managerlogica implementeren door een aangepast groepschatbeheer te maken:
public class ApprovalBasedManager : RoundRobinGroupChatManager
{
private readonly string _approverName;
public ApprovalBasedManager(IReadOnlyList<AIAgent> agents, string approverName)
: base(agents)
{
_approverName = approverName;
}
// Override to add custom termination logic
protected override ValueTask<bool> ShouldTerminateAsync(
IReadOnlyList<ChatMessage> history,
CancellationToken cancellationToken = default)
{
var last = history.LastOrDefault();
bool shouldTerminate = last?.AuthorName == _approverName &&
last.Text?.Contains("approve", StringComparison.OrdinalIgnoreCase) == true;
return ValueTask.FromResult(shouldTerminate);
}
}
// Use custom manager in workflow
var workflow = AgentWorkflowBuilder
.CreateGroupChatBuilderWith(agents =>
new ApprovalBasedManager(agents, "Reviewer")
{
MaximumIterationCount = 10
})
.AddParticipants(writer, reviewer)
.Build();
U kunt geavanceerde selectielogica implementeren op basis van de gespreksstatus:
def smart_selector(state: GroupChatState) -> str:
"""Select speakers based on conversation content and context."""
conversation = state.conversation
last_message = conversation[-1] if conversation else None
# If no messages yet, start with Researcher
if not last_message:
return "Researcher"
# Check last message content
last_text = last_message.text.lower()
# If researcher finished gathering info, switch to writer
if "i have finished" in last_text and last_message.author_name == "Researcher":
return "Writer"
# Else continue with researcher until it indicates completion
return "Researcher"
workflow = GroupChatBuilder(
participants=[researcher, writer],
selection_func=smart_selector,
).build()
Belangrijk
Wanneer u een aangepaste implementatie van BaseGroupChatOrchestrator geavanceerde scenario's gebruikt, moeten alle eigenschappen worden ingesteld, inclusief participant_registry, max_roundsen termination_condition.
max_rounds en termination_condition ingesteld in de builder worden genegeerd.
Tussenliggende uitvoer
Standaard verschijnt alleen de uiteindelijke uitvoer van de orchestrator als een workflow-"output"(terminal)-event. Geef via intermediate_output_from de deelnemers op die u als tussenliggende bronnen wilt aanmerken, zodat ook hun afzonderlijke uitvoer zichtbaar wordt als "intermediate" gebeurtenissen:
workflow = GroupChatBuilder(
participants=[researcher, writer],
termination_condition=lambda conversation: len(conversation) >= 4,
selection_func=round_robin_selector,
intermediate_output_from=[researcher, writer],
).build()
Implementeer aangepaste luidsprekerselectie door een GroupChatManager uit de manager factory van de builder te retourneren:
type approvalManager struct {
agents []*agent.Agent
}
func newApprovalManager(agents []*agent.Agent) *agentworkflow.GroupChatManager {
manager := &approvalManager{agents: agents}
return &agentworkflow.GroupChatManager{
SelectNextAgent: manager.selectNextAgent,
ShouldTerminate: manager.shouldTerminate,
}
}
func (m *approvalManager) selectNextAgent(_ context.Context, history []*message.Message) (*agent.Agent, error) {
last := lastAssistantMessage(history)
if last == nil || last.AuthorName == "Reviewer" {
return m.agentByName("CopyWriter")
}
return m.agentByName("Reviewer")
}
func (m *approvalManager) shouldTerminate(_ context.Context, history []*message.Message, iterationCount int) (bool, error) {
if iterationCount >= 10 {
return true, nil
}
last := lastAssistantMessage(history)
return last != nil &&
last.AuthorName == "Reviewer" &&
strings.Contains(strings.ToLower(last.String()), "approve"), nil
}
func (m *approvalManager) agentByName(name string) (*agent.Agent, error) {
for _, currentAgent := range m.agents {
if currentAgent.Name() == name {
return currentAgent, nil
}
}
return nil, fmt.Errorf("agent %q is not part of the group chat", name)
}
func lastAssistantMessage(history []*message.Message) *message.Message {
for i := len(history) - 1; i >= 0; i-- {
if history[i].Role == message.RoleAssistant {
return history[i]
}
}
return nil
}
wf, err := agentworkflow.NewGroupChatWorkflowBuilder(newApprovalManager, copywriter, reviewer).
WithName("Approval Group Chat").
Build()
GroupChatManager ondersteunt ook UpdateHistory, Reset, OnCheckpoint en OnCheckpointRestored callbacks voor geavanceerde managers die broadcastberichten filteren of door managers beheerde status opslaan.
Tussenliggende uitvoer
Standaard genereert GroupChatWorkflowBuilder deelnemersuitvoer als tussenliggende werkstroomuitvoer en genereert het de geaccumuleerde gesprekstranscriptie als einduitvoer. Gebruik OutputEvent.IsIntermediate() dit om de updates van deelnemers te onderscheiden van de uiteindelijke transcriptie:
if output, ok := evt.(workflow.OutputEvent); ok {
if output.IsIntermediate() {
fmt.Printf("intermediate from %s: %v\n", output.ExecutorID, output.Output)
return nil
}
fmt.Printf("terminal output: %v\n", output.Output)
}
Door WithOutputFrom of WithIntermediateOutputFrom aan te roepen op de groepschatbouwer wordt overgeschakeld naar expliciete uitvoeraanduiding. Gebruik deze methoden wanneer u uitvoer van geselecteerde deelnemers wilt in plaats van het standaard eindtranscript plus alle tussentijdse uitvoer van deelnemers.
Contextsynchronisatie
Zoals vermeld aan het begin van deze handleiding, zien alle agents in een groepschat de volledige gespreksgeschiedenis.
Agents in Agent Framework zijn afhankelijk van agentsessies (AgentSession) om context te beheren. In een groepschatorchestratie delen agents niet dezelfde sessie-instantie, maar de orchestrator zorgt dat de sessie van elke agent vóór elke omslag wordt gesynchroniseerd met de volledige gespreksgeschiedenis. Om dit te bereiken, zendt de orchestrator na de beurt van elke agent het antwoord uit naar alle andere agents, zodat alle deelnemers de nieuwste context voor hun volgende beurt hebben.
Aanbeveling
Agents delen niet hetzelfde sessie-exemplaar omdat verschillende agenttypen mogelijk verschillende implementaties van de AgentSession abstractie hebben. Het delen van hetzelfde sessie-exemplaar kan leiden tot inconsistenties in de wijze waarop elke agent de context verwerkt en onderhoudt.
Na het uitzenden van het antwoord beslist de orchestrator de volgende spreker en verzendt een aanvraag naar de geselecteerde agent, die nu de volledige gespreksgeschiedenis heeft om het antwoord te genereren.
Wanneer gebruikt u Groepschat?
Groepschatindeling is ideaal voor:
- Iteratieve verfijning: Meerdere rondes van beoordeling en verbetering
- Collaborative Problem-Solving: Agents met complementaire expertise die samenwerken
- Inhoud maken: Werkstromen van schrijver-revisor voor het maken van documenten
- Analyse met meerdere perspectieven: diverse standpunten op dezelfde invoer krijgen
- Kwaliteitsgarantie: Geautomatiseerde beoordelings- en goedkeuringsprocessen
Houd rekening met alternatieven wanneer:
- U hebt strikte sequentiële verwerking nodig (gebruik sequentiële indeling)
- Agents moeten volledig onafhankelijk werken (concurrente orkestratie gebruiken)
- Directe handoffs van agent naar agent zijn nodig (gebruik Handoff-indeling)
- Complexe dynamische planning is vereist (gebruik Magentic-orchestratie)