Framework comparisons often promise a winner. That is the wrong question.
An agent framework is a runtime choice inside a larger system containing a model, tools, identity, data, queues, storage, policy, observability, and operators. A framework that feels elegant in a demo may be a poor choice when a task must resume after a worker crash, prove who approved a refund, or prevent an untrusted document from selecting a tool.
This guide compares seven active agent runtime families without inventing a universal leaderboard. It also treats Microsoft AutoGen as a maintenance and migration decision rather than a greenfield candidate. It provides:
- a vocabulary for separating framework layers;
- a workload-first decision matrix;
- a fair, reproducible evaluation protocol;
- failure and security criteria that marketing tables usually omit;
- migration advice that preserves business logic instead of framework-specific glue.
Lifecycle changed materially in 2026: LangGraph is on its stable 1.x line, Microsoft Agent Framework reached 1.0 for Python and .NET, Microsoft AutoGen entered maintenance mode, and AG2 promoted its new API to an independent 1.x line. The official documentation links at the end are the authority for current APIs.
The Short Answer
Start with the simplest runtime that can express the workflow:
| Requirement | Likely fit | Why |
|---|---|---|
| Explicit branches, durable state, replay, approval pauses | LangGraph or another low-level workflow runtime | The topology and state transitions remain visible |
| Small Python-first loop with handoffs, tools, guardrails, and tracing | OpenAI Agents SDK | Few primitives and a managed agent loop |
| Code-first loop across several model providers | Strands Agents | Lightweight agent abstraction with configurable providers |
| Business workflows expressed as agents, tasks, crews, and flows | CrewAI | Declarative task/process model and enterprise workflow concepts |
| Python or .NET agents plus explicit, typed workflows | Microsoft Agent Framework 1.0 | Stable core APIs, sessions, middleware, providers, and graph workflows |
| Go agents and workflows in a Microsoft-aligned stack | Microsoft Agent Framework for Go | Preview SDK with documented feature gaps; validate the exact surface |
| New protocol-oriented conversational or multi-agent work | AG2 1.x | Active ag2 package with async agents, streams, middleware, and interoperability |
Existing classic autogen / ConversableAgent code |
AG2 Classic or Microsoft AutoGen while planning migration | Both are maintenance paths, not interchangeable greenfield defaults |
| A Claude-centered file, command, and subagent runtime | Claude Agent SDK | Built-in tools are useful when provider coupling and deployer-owned isolation fit |
These are starting hypotheses. A two-day spike with your real tools is stronger evidence than a popularity ranking.
First Decide Whether You Need an Agent
Do not compare frameworks before comparing architectures.
Use a deterministic workflow when:
- the steps and branches are known;
- each operation has a stable input and output;
- auditability matters more than open-ended exploration;
- failure recovery can be modeled as a state machine.
Use one agent with narrow tools when:
- the task needs flexible language interpretation;
- the available actions are limited;
- a human can review consequential results;
- the loop can be bounded.
Use multiple agents only when separate agents provide a real boundary:
- different credentials or data scopes;
- independent contexts that should not be shared;
- specialist work that can be evaluated separately;
- parallel work whose coordination cost is justified.
“More agents” is not a maturity level. It is another distributed system.
Separate the Layers
Many comparisons place unlike products in one row. A clearer model is:
model provider
|
agent loop / harness
|
orchestration runtime ---- state and persistence
|
tool and MCP adapters ---- identity and policy
|
external services -------- tracing and operations
- Model provider: generates text, structured output, or tool proposals.
- Agent loop: decides how to continue after a tool result.
- Orchestration runtime: represents branches, retries, events, and dependencies.
- State layer: stores working state, checkpoints, memory, and artifacts.
- Tool layer: executes capabilities under identity and authorization.
- Operations layer: supplies queues, deadlines, traces, evaluation, and incident response.
No framework removes the need for the other layers. A built-in tracing screen is not a substitute for tenant-aware audit logs. A checkpoint API is not automatically a transaction. An MCP connector is not an authorization system.
Capability Profiles
LangGraph: Explicit Orchestration Runtime
LangGraph describes itself as a low-level orchestration framework and runtime for long-running, stateful agents. Its useful abstraction is a graph whose nodes read and update state. The current documentation emphasizes persistence, durable execution, streaming, and human-in-the-loop interrupts.
Strengths
- visible topology and conditional routing;
- durable checkpoints and resumable work;
- explicit state reducers and subgraph composition;
- a good fit for approval, replay, and operational debugging.
Costs
- more design and state-modeling work;
- easy to build an overcomplicated graph;
- application code still owns authorization, transactions, and tool policy;
- the surrounding LangChain ecosystem is optional, but its abstractions can be mixed in.
Choose it when workflow shape is a product requirement, not merely an implementation detail.
OpenAI Agents SDK: Small Runtime Around an Agent Loop
The OpenAI Agents SDK provides a small set of primitives: agents, tools, handoffs or agents-as-tools, guardrails, sessions, and tracing. Its documentation distinguishes it from using the Responses API directly: the SDK adds a higher-level loop and runtime behavior.
Strengths
- fast path for Python applications;
- handoff and specialist composition;
- function-tool schema generation and validation;
- built-in tracing and optional sessions or sandbox workflows.
Costs
- provider and runtime assumptions must be checked for portability;
- a handoff is not a complete workflow transaction;
- guardrails do not replace object-level authorization;
- long-running durability still needs explicit operational design.
Use it when a small set of primitives maps to the task and the team wants to own the surrounding service.
Strands Agents: Code-First, Model-Driven Loop
Strands presents a lightweight code-first SDK for Python and TypeScript, with a simple Agent abstraction and configurable model providers. Its model-driven loop is concise, but concise code does not imply deterministic behavior.
Strengths
- low ceremony for single-agent and tool workflows;
- provider and deployment flexibility;
- straightforward path from a local prototype to a service;
- useful when the model should choose among a small set of tools.
Costs
- model-selected routing is harder to audit than an explicit graph;
- state durability and business transactions remain application responsibilities;
- community tools require supply-chain and permission review;
- AWS alignment may be an advantage or a coupling, depending on the deployment.
Use it for bounded, tool-oriented tasks after defining external budgets and policy.
CrewAI: Agents, Tasks, Crews, and Flows
CrewAI organizes work around agents, tasks, crews, and flows. Current documentation also describes state, persistence, resume behavior, guardrails, callbacks, and human-in-the-loop triggers.
Strengths
- vocabulary that maps well to business workflows;
- sequential, hierarchical, and hybrid task processes;
- a relatively accessible prototype path;
- flows can provide a more explicit outer workflow than a free-form crew.
Costs
- role and backstory are not a substitute for a permission model;
- task delegation can hide latency, token, and failure costs;
- durable behavior must be tested rather than inferred from the abstraction;
- enterprise features and open-source runtime capabilities may differ.
Use it when task/process semantics are valuable and the team will still inspect the underlying calls.
Microsoft Agent Framework 1.0: Microsoft's Successor Path
Microsoft Agent Framework reached version 1.0 for Python and .NET in April 2026. Microsoft describes it as the direct successor to AutoGen and Semantic Kernel, with stable core APIs and a long-term-support commitment. It combines model clients, agent sessions, context providers, middleware, MCP clients, and graph-based workflows. Its workflow APIs cover typed routing, nesting, checkpointing, and request/response patterns for human intervention.
Microsoft also publishes a separate Go SDK. It supports core agents, tools, middleware, workflows, OpenTelemetry, MCP, A2A, AG-UI, and skills, but remains in public preview and documents gaps such as handoff orchestration, declarative agents, and some hosting capabilities. “MAF supports Go” therefore does not mean Python, .NET, and Go have identical release status or feature parity.
Strengths
- one Microsoft-supported path for Python and .NET agent applications;
- explicit workflows alongside model-driven agents;
- provider abstractions, middleware, sessions, and OpenTelemetry integration;
- migration guides for existing AutoGen and Semantic Kernel projects.
Costs
- preview integrations and Go feature parity must be verified for the exact language and package version;
- Foundry integrations can be useful but introduce Azure-specific operational choices;
- checkpoints still require application-level idempotency and transaction design;
- migration is not a namespace rename because state and orchestration models differ.
Use the stable Python or .NET core for a new Microsoft-stack project only after a version-pinned spike. Treat Go as an approved preview dependency until its own repository says otherwise. Existing AutoGen applications should compare migration cost against continued maintenance rather than assuming an automatic upgrade.
Microsoft AutoGen: A Maintenance Decision
Microsoft AutoGen is no longer an active greenfield framework choice. Its repository states that it is in maintenance mode, receives no new features or enhancements, and is community managed. Existing autogen-agentchat, autogen-core, and autogen-ext applications can continue to run, but their owners need a version pin, a security-support plan, and a migration experiment.
Do not confuse this line with either Microsoft Agent Framework or AG2. Microsoft AutoGen's AgentChat/Core state and message model must be mapped explicitly when migrating to MAF workflows; package replacement alone does not preserve behavior.
AG2 1.x: An Independent Active Framework
AG2 is not Microsoft AutoGen. AG2 1.0 promoted its protocol-oriented beta architecture to the main line: install ag2 and import ag2. The old autogen distribution and ConversableAgent API moved to the separate AG2 Classic repository, which receives security and critical bug fixes. AG2 1.x adds async agents, event streams, middleware, evaluation, MCP, A2A, ACP, AG-UI, skills, and subagent primitives, but each optional integration still needs version and security review.
Strengths
- an actively developed protocol-oriented
ag2package; - composable agents, streams, middleware, subagents, tools, and evaluation;
- explicit interoperability work across MCP, A2A, ACP, and AG-UI;
- a documented boundary between the active v1 line and maintained Classic code.
Costs
- AG2 1.x is not a drop-in upgrade from the classic
autogenpackage; - free-form delegation can multiply calls and obscure termination;
- rapidly expanding integrations enlarge the compatibility and attack surface;
- code execution, serialized state, remote agents, and generated artifacts need explicit isolation;
- code written for AG2, AG2 Classic, Microsoft AutoGen, and Microsoft Agent Framework is not interchangeable.
Use it when its composable agent and protocol model fits the workload. Keep AG2 Classic only when preserving an existing ConversableAgent system is cheaper and safer than migration.
Claude Agent SDK: Product-Coupled Runtime
Claude Agent SDK should be evaluated as a product-specific runtime, not as a generic function-call wrapper. The current Python package is claude-agent-sdk; the TypeScript package is @anthropic-ai/claude-agent-sdk. It exposes the file, shell, web, hooks, subagent, MCP, permission, and session capabilities behind Claude Code.
Potential fit
- Claude-centered applications;
- coding, research, and operations tasks that benefit from built-in file and command tools;
- organizations willing to accept provider coupling.
Questions to answer first
- Which tools, paths, commands, and network routes are allowed?
- What does a session persist, for how long, and where?
- Is the agent running in built-in sandbox mode, a container, gVisor, or a VM?
- How are user identity, approvals, cancellation, and audit propagated?
- What is the exit plan if the runtime or model changes?
Anthropic documents permissions and an optional sandbox mode, then recommends stronger container, network, credential-proxy, or VM boundaries for higher-risk deployments. The SDK does not remove the deployer's responsibility to define that boundary.
Do Not Collapse the AutoGen Names
| Name | Current owner and role | Selection implication |
|---|---|---|
| Microsoft AutoGen | Microsoft maintenance-mode project with AgentChat, Core, Studio, and Extensions | Keep pinned legacy systems supportable; new Microsoft projects should evaluate MAF |
| Microsoft Agent Framework | Microsoft successor; Python and .NET core are stable 1.0, Go is preview | Record language-specific maturity and test migration behavior |
| AG2 1.x | Independent active project installed and imported as ag2 |
Treat as a new runtime with its own state, event, tool, and protocol contracts |
| AG2 Classic | Separate maintenance project publishing the classic autogen package |
Use only to maintain or stage migration of ConversableAgent-era systems |
This naming distinction is operational, not editorial. It determines package names, compatibility, migration work, and who owns the roadmap.
Compare by Decision Dimensions
| Dimension | Questions that matter |
|---|---|
| Workflow topology | Are branches, loops, dependencies, and termination explicit? |
| State | Can work resume after a crash? Is state versioned and tenant-scoped? |
| Human control | Can approval pause and resume the exact operation? |
| Model portability | Can the model change without rewriting business logic? |
| Tool governance | Are identity, object authorization, provenance, and egress external to the model? |
| Failure semantics | What happens on timeout, duplicate delivery, partial failure, and cancellation? |
| Observability | Can an operator reconstruct model, tool, state, policy, and user events? |
| Deployment | Can it run in the required region, network, queue, and compute model? |
| Cost | What is the cost per successful task, including retries and idle workers? |
| Exit cost | Which code is portable, and which code is tied to the framework? |
| Lifecycle | Is the exact package stable, preview, active, or maintenance-only, and who owns its roadmap? |
State Is Not Memory
Separate:
- thread state: the current run and its checkpoint;
- workflow state: business progress and external transaction IDs;
- long-term memory: reusable user or domain information with its own consent and deletion policy;
- artifacts: files and reports with ownership and retention;
- audit events: immutable evidence of what happened.
A framework may provide one of these while leaving the others to you.
Handoffs Are Not Authorization
Whether the framework calls it a handoff, delegation, sub-agent, or manager, the receiving component must receive a reduced capability set. Pass a typed task and scoped context, not the parent’s ambient credentials and entire transcript.
Make the Lifecycle Decision Executable
A framework inventory should fail closed when a team proposes a maintenance-only package for new work or a preview SDK without explicit approval. The following standard-library Go example captures that decision separately from subjective framework scoring:
package main
import (
"errors"
"fmt"
)
type Candidate struct {
Name string
Lifecycle string
Language string
PreviewAllowed bool
MigrationTest bool
}
func eligible(candidate Candidate) error {
if candidate.Lifecycle == "maintenance" {
return errors.New("maintenance-only runtime is not a greenfield default")
}
if candidate.Lifecycle == "preview" && !candidate.PreviewAllowed {
return errors.New("preview dependency lacks an explicit exception")
}
if !candidate.MigrationTest {
return errors.New("state and side-effect migration are unverified")
}
return nil
}
func main() {
candidate := Candidate{
Name: "Microsoft Agent Framework for Go",
Lifecycle: "preview",
Language: "go",
PreviewAllowed: true,
MigrationTest: true,
}
if err := eligible(candidate); err != nil {
panic(err)
}
fmt.Printf("eligible=%s language=%s\n", candidate.Name, candidate.Language)
}
This gate does not rank framework quality. It makes lifecycle risk and migration evidence visible before a team compares ergonomics.
Security and Operations
Treat model output, tool descriptions, MCP metadata, retrieved documents, and tool results as untrusted input. The framework must not be allowed to turn a persuasive sentence into authority.
Minimum controls:
- authenticated principal and tenant context outside the model;
- object-level authorization on each tool call;
- narrow tools rather than generic SQL, HTTP, or shell;
- provenance for data derived from external sources;
- approval bound to canonical arguments and resource version;
- sandboxed code with no ambient secrets;
- egress allowlists and redirect controls;
- durable idempotency for writes;
- step, time, token, cost, and concurrency budgets;
- deletion propagation across checkpoints, memory, indexes, and artifacts.
Framework selection should include an abuse case:
A hostile document asks the agent to send private data to a new address while the worker restarts during approval.
The winning framework is the one whose surrounding architecture can prove that this cannot become an unauthorized side effect. The agent harness architecture guide shows where those controls sit around the model loop.
A Reproducible Evaluation Protocol
Do not publish a score unless another team can reproduce it.
1. Freeze the Variables
Record:
- exact package versions and commit;
- model, endpoint, temperature, and reasoning settings;
- prompts, tool schemas, and tool policy;
- hardware, region, concurrency, and network;
- dataset version and random seeds;
- retry, timeout, and token budgets.
2. Use a Task Matrix
Include:
- a deterministic read;
- a multi-step read with one failure;
- an approval-gated write;
- a duplicate delivery after timeout;
- a worker restart from a checkpoint;
- an adversarial document with an injected instruction;
- a cross-tenant access attempt;
- a cancellation during a tool call;
- a task where the correct answer is to refuse or ask for information.
3. Measure Outcomes
utility_success =
correct user-visible result with no policy violation
unsafe_success =
unauthorized read, write, disclosure, or external side effect
recovery_success =
correct continuation after the injected failure or restart
cost_per_success =
model + tool + compute + operator cost / successful tasks
Report distributions, not a single mean:
- task success and abstention quality;
- unauthorized-action rate;
- p50/p95 latency;
- model calls, tool calls, tokens, and retries;
- restart and duplicate recovery;
- operator minutes per incident;
- deployment and migration effort.
Do not compare raw accuracy across different models or prompts. A framework benchmark is meaningful only when the task, policy, model, and budget are held constant.
4. Test the Negative Path
The strongest framework is not the one that always completes. It is the one that:
- refuses an unauthorized request;
- preserves a failed transaction’s invariant;
- stops an infinite loop;
- reports partial results honestly;
- resumes without duplicating a side effect;
- leaves an auditable explanation for an operator.
Migration Strategy
Keep these boundaries framework-neutral:
domain commands
-> typed tool contracts
-> policy and authorization
-> idempotent adapters
-> state/event schema
-> framework runtime
Do not put business rules inside prompt strings, framework callbacks, or provider-specific message objects. Use contract tests around tools and state transitions. Then a migration changes orchestration code rather than payment, identity, or data policy.
A practical migration sequence:
- inventory tools, side effects, identities, and state;
- extract domain commands from the current agent loop;
- add authorization, idempotency, and result contracts;
- replay anonymized traces against the new runtime;
- run the negative-path matrix;
- shadow traffic before switching writes;
- retain a rollback path for state and external operations.
Frequently Asked Questions
Is a framework with more features more production-ready?
No. More features can increase unexamined behavior. Production readiness is the ability to enforce invariants, recover from failure, observe outcomes, and operate the system within its threat and cost model.
Should I start with a multi-agent design?
No. Start with a deterministic workflow or one bounded agent. Add another agent only when a separate context, permission, or independently testable capability justifies it.
Is vendor lock-in always bad?
No. A managed runtime can reduce operational work and provide useful capabilities. Treat coupling as a deliberate trade-off: document the data path, export state and traces, isolate domain contracts, and calculate the exit cost.
Can benchmark percentages decide the framework?
No. Agent performance is a property of the model, prompt, tools, data, policy, runtime, and budget together. Use published benchmarks as hypotheses, then run a controlled evaluation on your workload.
Conclusion
There is no meaningful “agent framework war” independent of workload. The durable choice is the framework that makes your important properties visible and enforceable:
- explicit state when recovery matters;
- narrow capabilities when security matters;
- controlled loops when cost matters;
- traces and replay when operations matter;
- portable domain contracts when strategy may change.
Prototype with the smallest runtime that expresses the real workflow. Promote it only after it survives failure, abuse, restart, and cost tests. That is a stronger selection method than choosing the framework with the loudest feature list.
Primary Sources
- LangGraph Overview
- OpenAI Agents SDK Documentation
- Strands Agents Documentation
- CrewAI Documentation
- CrewAI Flows and Persistence
- Microsoft Agent Framework Overview
- Microsoft Agent Framework 1.0 Announcement
- Microsoft Agent Framework for Go
- Microsoft AutoGen Documentation
- Microsoft AutoGen Repository and Maintenance Notice
- AG2 Quickstart
- AG2 1.0 Release
- AG2 Classic Maintenance Repository
- LangGraph v1 Release Notes
- Claude Agent SDK Overview
- Claude Agent SDK Secure Deployment
- Model Context Protocol Specification