db620d33df
dotnet-build-and-test / dotnet-test-functions (push) Has been cancelled
dotnet-build-and-test / paths-filter (push) Has been cancelled
dotnet-build-and-test / dotnet-build (Debug, windows-latest, net9.0) (push) Has been cancelled
dotnet-build-and-test / dotnet-build (Release, ubuntu-latest, net10.0) (push) Has been cancelled
dotnet-build-and-test / dotnet-build (Release, ubuntu-latest, net8.0) (push) Has been cancelled
dotnet-build-and-test / dotnet-build (Release, windows-latest, net472) (push) Has been cancelled
dotnet-build-and-test / dotnet-test (Release, integration, true, ubuntu-latest, net10.0) (push) Has been cancelled
dotnet-build-and-test / dotnet-test (Release, integration, true, windows-latest, net472) (push) Has been cancelled
dotnet-build-and-test / dotnet-foundry-hosted-it (push) Has been cancelled
dotnet-build-and-test / dotnet-build-and-test-check (push) Has been cancelled
dotnet-build-and-test / Integration Test Report (push) Has been cancelled
CodeQL / Analyze (csharp) (push) Has been cancelled
CodeQL / Analyze (python) (push) Has been cancelled
122 lines
4.7 KiB
Markdown
122 lines
4.7 KiB
Markdown
# Agent Framework Orchestrations
|
|
|
|
Orchestration patterns for Microsoft Agent Framework. This package provides high-level builders for common multi-agent workflow patterns.
|
|
|
|
## Installation
|
|
|
|
```bash
|
|
pip install agent-framework-orchestrations
|
|
```
|
|
|
|
## Orchestration Patterns
|
|
|
|
### SequentialBuilder
|
|
|
|
Chain agents/executors in sequence, passing conversation context along:
|
|
|
|
```python
|
|
from agent_framework.orchestrations import SequentialBuilder
|
|
|
|
workflow = SequentialBuilder(participants=[agent1, agent2, agent3]).build()
|
|
|
|
# Preserve agent1 and agent2 as visible progress, while the default builder output remains Workflow Output.
|
|
workflow = SequentialBuilder(
|
|
participants=[agent1, agent2, agent3],
|
|
intermediate_output_from=[agent1, agent2],
|
|
).build()
|
|
```
|
|
|
|
### ConcurrentBuilder
|
|
|
|
Fan-out to multiple agents in parallel, then aggregate results:
|
|
|
|
```python
|
|
from agent_framework.orchestrations import ConcurrentBuilder
|
|
|
|
workflow = ConcurrentBuilder(participants=[agent1, agent2, agent3]).build()
|
|
```
|
|
|
|
### HandoffBuilder
|
|
|
|
Decentralized agent routing where agents decide handoff targets:
|
|
|
|
```python
|
|
from agent_framework.orchestrations import HandoffBuilder
|
|
|
|
workflow = (
|
|
HandoffBuilder()
|
|
.participants([triage, billing, support])
|
|
.with_start_agent(triage)
|
|
.build()
|
|
)
|
|
```
|
|
|
|
### GroupChatBuilder
|
|
|
|
Orchestrator-directed multi-agent conversations:
|
|
|
|
```python
|
|
from agent_framework.orchestrations import GroupChatBuilder
|
|
|
|
workflow = GroupChatBuilder(
|
|
participants=[agent1, agent2],
|
|
selection_func=my_selector,
|
|
intermediate_output_from=[agent1, agent2],
|
|
).build()
|
|
```
|
|
|
|
### MagenticBuilder
|
|
|
|
Sophisticated multi-agent orchestration using the Magentic One pattern:
|
|
|
|
```python
|
|
from agent_framework.orchestrations import MagenticBuilder
|
|
|
|
workflow = MagenticBuilder(
|
|
participants=[researcher, writer, reviewer],
|
|
manager_agent=manager_agent,
|
|
intermediate_output_from=[researcher, writer, reviewer],
|
|
).build()
|
|
```
|
|
|
|
## Output Selection
|
|
|
|
Orchestration builders expose Workflow Output selection using participant names. The core rule is that `output_from`
|
|
is an allow-list for Workflow Output, not a routing rule for every other participant output. Unselected participant
|
|
payloads are hidden unless `intermediate_output_from` explicitly selects them as Intermediate Output.
|
|
|
|
- `output_from` designates participant emissions as Workflow Output (`type='output'` events).
|
|
- `intermediate_output_from` designates participant emissions as Intermediate Output (`type='intermediate'` events).
|
|
|
|
If neither list is provided, each builder uses its documented default Workflow Output contract. Sequential emits the
|
|
last participant; Concurrent, GroupChat, and Magentic emit their aggregator/orchestrator/manager output; Handoff emits
|
|
participants.
|
|
|
|
| Selection | Workflow Output | Intermediate Output | Hidden payloads |
|
|
| --- | --- | --- | --- |
|
|
| Omit both selections | Builder default Workflow Output contract | None | Builder-specific non-output participant payloads |
|
|
| `output_from="all"` | Every output-capable participant | None | None |
|
|
| `output_from=[writer]` | Only `writer` | None | All other participant payloads |
|
|
| `output_from=[writer], intermediate_output_from="all_other"` | Only `writer` | Every output-capable participant not selected by `output_from` | None |
|
|
| `intermediate_output_from="all_other"` | None, except builder-internal default output executors where applicable | Every output-capable participant | Builder-internal plumbing payloads |
|
|
| `output_from=[], intermediate_output_from="all_other"` | None, except builder-internal default output executors where applicable | Every output-capable participant | Builder-internal plumbing payloads |
|
|
| `output_from=[writer], intermediate_output_from=[researcher, reviewer]` | Only `writer` | `researcher` and `reviewer` | Any other participant payloads |
|
|
|
|
Invalid selections fail at construction or build time:
|
|
|
|
| Invalid selection | Why it fails |
|
|
| --- | --- |
|
|
| `output_from="all_other"` | `"all_other"` is only valid for `intermediate_output_from` |
|
|
| `intermediate_output_from="all"` | `"all"` is only valid for `output_from` |
|
|
| The same participant in both selections | One payload cannot be both Workflow Output and Intermediate Output |
|
|
| Duplicate participant selections | Duplicates are treated as configuration errors |
|
|
| Unknown participant selections | Typos and missing participants are rejected |
|
|
| `output_from=[], intermediate_output_from=[]` | Both explicit selections are empty |
|
|
|
|
When an orchestration is wrapped with `workflow.as_agent()`, Workflow Output becomes normal response text. Intermediate
|
|
Output becomes `text_reasoning` content so callers can inspect progress without changing `.text` behavior.
|
|
|
|
## Documentation
|
|
|
|
For more information, see the [Agent Framework documentation](https://aka.ms/agent-framework).
|