On April 3, Microsoft shipped Agent Framework 1.0 — the long-rumored merger of Semantic Kernel and AutoGen into one open-source SDK. If you've been juggling both (orchestration in AutoGen, enterprise plumbing in SK), this is the release that makes picking one unnecessary.
What's in the box
- Single SDK for .NET and Python with matching primitives on both sides:
Agent,AgentGroup,Tool,Workflow,Runtime. - Multi-provider model support — OpenAI, Azure OpenAI, Anthropic, local (Ollama, vLLM), and Azure AI Foundry under a common contract.
- Cross-runtime interop via A2A and MCP. Agents built in Agent Framework can call — and be called by — LangGraph, CrewAI, OpenAI's Agents SDK, and any MCP-compliant server. Your "agent stack" choice is no longer a lock-in.
- Multi-agent orchestration primitives: group chat, sequential handoff, planner/executor, and human-in-the-loop checkpoints — first-class, not recipe-book.
- Observability out of the box: OpenTelemetry traces for every tool call, model call, and handoff.
What this actually changes
AutoGen was research-shaped — great for prototyping, rough in prod. Semantic Kernel was enterprise-shaped — great for integration, weaker on multi-agent ergonomics. 1.0 picks the winning half of each:
| Kept from AutoGen | Kept from SK | Gone |
|---|---|---|
| Agent conversation model | Plugin/connector ecosystem | Two divergent ChatMessage types |
| Group-chat orchestration | DI story, configuration | Two streaming contracts |
| Planner/executor patterns | Enterprise auth + secrets | Framework-specific tool schemas |
The interop story is the real news
A2A (Agent-to-Agent) and MCP (Model Context Protocol) being first-class means you can write a planner in Agent Framework that dispatches sub-tasks to a LangGraph worker running in someone else's cluster. Standardize on the protocols, not the framework.
Getting started
# .NET
dotnet add package Microsoft.AgentFramework --version 1.0.0
# Python
pip install agent-framework==1.0.0
Minimal Python example:
from agent_framework import Agent, Tool, Runtime
@Tool
def get_weather(city: str) -> str:
return f"Sunny in {city}"
agent = Agent(
model="gpt-5.4",
tools=[get_weather],
system="You are a concise travel assistant.",
)
with Runtime() as rt:
print(rt.run(agent, "What's the weather in Hyderabad?"))
Migration notes
- Semantic Kernel users get a compatibility shim — existing plugins keep working while you migrate orchestration code.
- AutoGen users get a codemod that translates
GroupChat/ConversableAgentinto the new primitives. - LTS commitment: stable APIs, security fixes, no breaking changes on the 1.x line.
Should you switch?
If you're greenfield, yes — this is now the default answer for production .NET or Python agents. If you're mid-project on vanilla AutoGen or SK, the migration is mechanical enough that finishing the current milestone first and moving after is the right sequencing. Don't rewrite under deadline.