* Bump Python package versions to 1.5.0 for a release
* Promote orchestrations to 1.0.0rc1
* ci(python-setup): merge dynamic exclude into existing workspace exclude
The python-setup action injected exclude = [...] verbatim into
[tool.uv.workspace], producing a duplicate 'exclude' key when the
section already had a static exclude. Scope the rewrite to the
[tool.uv.workspace] section and append the package to the existing
array when present; idempotent if the package is already excluded.
* Address Copilot review feedback: raise inter-package floors to 1.5.0
- foundry, foundry-local: agent-framework-openai >=1.4.0 -> >=1.5.0
- azure-contentunderstanding: agent-framework-foundry >=1.4.0 -> >=1.5.0
- azurefunctions: pin agent-framework-durabletask to >=1.0.0b260519,<2
Keeps lockstep cohort consistent and avoids mixed 1.4.x / 1.5.0 installs.
* Re-include azurefunctions and durabletask in the uv workspace
The pinned durabletask>=1.4.0 floor is enough to make resolution succeed;
the workspace exclude was over-correction and broke CI samples and pyright
type-checking (re-exports in agent_framework/azure/__init__.pyi plus
samples/04-hosting/{azure_functions,durabletask}/ could not resolve their
imports). Dropping them from agent-framework-core[all] still stands so the
metapackage does not pull them.
* Restore azurefunctions and durabletask in agent-framework-core[all]
The durabletask floor pin keeps users on the safe 1.4.0, so they are once
again included in the metapackage. Update CHANGELOG to reflect the pin
rather than an [all] removal.
* Raise uvicorn ceiling in ag-ui and devui to allow 0.42+
The root override-dependencies pins uvicorn[standard]>=0.34.0 (no upper)
and the workspace lock resolves to 0.47.0. The package ceiling <0.42.0
meant the workspace was no longer testing the declared supported range.
Bump to <1 so the lock fits within the declared bounds.
Also picked up by validate-dependency-bounds: refresh stale orchestrations
RC pin in devui dev deps.
Agent Framework Orchestrations
Orchestration patterns for Microsoft Agent Framework. This package provides high-level builders for common multi-agent workflow patterns.
Installation
pip install agent-framework-orchestrations --pre
Orchestration Patterns
SequentialBuilder
Chain agents/executors in sequence, passing conversation context along:
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:
from agent_framework.orchestrations import ConcurrentBuilder
workflow = ConcurrentBuilder(participants=[agent1, agent2, agent3]).build()
HandoffBuilder
Decentralized agent routing where agents decide handoff targets:
from agent_framework.orchestrations import HandoffBuilder
workflow = (
HandoffBuilder()
.participants([triage, billing, support])
.with_start_agent(triage)
.build()
)
GroupChatBuilder
Orchestrator-directed multi-agent conversations:
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:
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_fromdesignates participant emissions as Workflow Output (type='output'events).intermediate_output_fromdesignates 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.