AI Blog

LangGraph vs CrewAI vs OpenAI Agents SDK vs Google ADK: Pick the State Model

Framework comparisons argue about graphs versus crews versus handoffs, but the metaphor stops mattering by week three. What you cannot re-pick eighteen months in is where a run lives, what resume means after a crash, and whether a human can pause a half-finished task — so choose on the state model and the rest of the comparison resolves itself.

By Agentic AI Wiki 14 min read

Framework comparisons argue about the metaphor — graphs versus crews versus handoffs versus agent trees — and the metaphor is the part you stop noticing by week three. What you cannot re-pick eighteen months in is the state model: where a run lives, what "resume" means after a crash, and whether a human can pause a half-finished task without you building the machinery yourself. Choose on that, and the rest of the comparison mostly resolves itself.

At a glance

Four frameworks that dominate production agent work in 2026, sorted by the thing that actually differs.

FrameworkCore abstractionWhere the run livesBest fit
LangGraph Directed graph of nodes with conditional edges Typed graph state, checkpointed to an external store at each superstep Long-running work that must survive a crash and pause for a human
Google ADK Hierarchical agent tree plus Sequential / Parallel / Loop workflow agents Session service holding shared state and events, with pluggable backends Teams already on Google Cloud, and deterministic multi-step pipelines
CrewAI Role-based crews, wrapped in event-driven Flows Flow state as a dict or Pydantic model, persisted where you ask for it Fast modelling of a team-shaped process by people who think in roles
OpenAI Agents SDK Agents, tools, handoffs, guardrails — four primitives, thin runner Run context in the process; sessions carry conversation history Short-horizon agents on OpenAI models, shipped quickly
Where each agent framework leans hardest A matrix of four frameworks against five axes: built-in durability, human-in-the-loop pause and resume, model portability, multi-agent shape, and out-of-the-box observability. Five axes, four bets Built-indurability Pause fora human Modelportability Multi-agentshape Tracing outof the box LangGraph Checkpointer interrupt() Agnostic Explicit graph Vendor suite Google ADK Session store Callbacks Gemini-first Agent tree Cloud-native CrewAI @persist Roll your own Agnostic Role crews Bring your own OpenAI SDK In-process Approval hook OpenAI-first Handoffs Built in Strong Present, with work Not the framework's job No row is best. Column one is the one you cannot add later without redrawing the other four.
No row is best. The first column is the one you cannot add later without redrawing the other four.

Why the state model is the load-bearing choice

Where agent state lives in four frameworks LangGraph checkpoints a typed graph state to an external store at every superstep. Google ADK holds session state in a session service with pluggable backends. CrewAI threads flow state through event handlers with opt-in persistence. The OpenAI Agents SDK keeps run context in memory with sessions for conversation history. Four answers to one question: where does the run live? LangGraph Typed graph state nodes + conditional edges Checkpointer external store, written at every superstep resume · fork · interrupt() Google ADK Hierarchical agent tree Sequential / Parallel / Loop Session service shared state + events, pluggable backend shared keys · temp: scope CrewAI Crews inside Flows @start / @listen / @router Flow state dict or Pydantic model, persisted where you ask @persist · opt-in OpenAI Agents SDK Agents + handoffs runner drives the loop Run context in memory; sessions hold conversation history tracing to the platform The question that separates them is not “graph or crew or handoff”. It is: after a crash mid-run, what does the framework let you reconstruct — and from where? State externalised by default Resume, fork and human approval are properties of the runtime. You inherit them. State in the process by default Durability is yours to build, and retrofitting it means re-drawing the control flow.
Four answers to one question: after a crash mid-run, what can you reconstruct, and from where?

Agents are not requests. A meaningful agent run is minutes to hours, calls tools with side effects, and will be interrupted — by a crash, a deploy, a rate limit, a human who wants to look at it before it sends the email. Every one of those events asks the same question: what is the durable representation of this run, and can the framework rebuild the loop from it?

That question is answered differently by each of these four, and the answer propagates upward through everything you write. If the framework externalises state, then resume, fork, replay and human approval are properties you inherit. If it keeps state in the process, they are yours to build, and building them means introducing a persistence boundary the control flow above was not written to cross. That is why the migration hurts: not because the prompts are hard to port, but because "where do we pick up from" has no answer in the code you already have.

This is also why the frameworks look more similar than they are on a tutorial. Every one of them will build you a tool-calling loop with a few agents in an afternoon. The divergence appears the first time something needs to survive the afternoon.

LangGraph — durability as the primitive

What it actually does

LangGraph models the agent as a directed graph: nodes are steps, edges are explicit transitions, and conditional edges encode where control goes when a step produces one outcome rather than another. State is a typed object threaded through the graph, and a checkpointer writes it to an external store at every superstep, organised by thread. Durability is configurable — persist synchronously before each step, asynchronously alongside the next one, or only on exit — which is a real trade of write amplification against how much you are willing to lose in a crash.

What that buys you

Three things that are otherwise projects. Resume: a run picks up from its last checkpoint rather than restarting. Time travel: invoke the graph with a specific checkpoint ID to replay from a prior state or fork an alternate branch, which is as useful for debugging as it is for product features. And interrupt(), a durable pause that stops mid-graph, waits for a human decision, and continues — the primitive that makes approval flows a few lines instead of a queue, a webhook and a state machine.

The cost

You write the graph. Explicit edges mean explicit thinking about failure paths and control flow, which is precisely what you want in production and precisely what makes the first week slower than a framework where you describe roles and let the model route. If your agent genuinely is a short conversation with three tools, that structure is overhead you are paying for nothing.

Google ADK — the workflow agents are the point

What it actually does

ADK's fundamental unit is an agent, and its distinctive move is that some agents are not model-driven at all. SequentialAgent runs its children in a fixed order, ParallelAgent runs them concurrently, and LoopAgent repeats until a stopping condition or a maximum iteration count. These compose into a hierarchical tree, and the whole tree shares one session state — including a temp: namespace scoped to a single turn — carried by a session service whose storage backend you choose.

What that buys you

Determinism where you want it and model judgement where you need it, in the same tree, without writing an orchestrator. A pipeline of "fetch, then analyse three ways in parallel, then synthesise, then loop until the critic is satisfied" is four built-in constructs, and the parts that must happen in order actually happen in order rather than being requested politely in a prompt. Java support alongside Python is unusual in this space and matters more than it sounds if your platform team is a JVM shop.

The cost

Shared session state across a ParallelAgent is exactly the concurrency hazard it looks like — sub-agents run in separate threads over one state object, so each has to write to a distinct key or they clobber each other. That is a documented, avoidable footgun, and it is a footgun. The gravity toward Gemini and Vertex is real: everything works better inside Google Cloud, which is a feature if you are there and a tax if you are not.

CrewAI — role modelling, with the real engine one layer down

What it actually does

A Crew is a set of role-defined agents collaborating on a shared goal — the abstraction that made CrewAI popular, because "researcher, writer, editor" is a description a product manager can write. What the popularity obscures is that Crews deliberately do not give you sequential control, and the answer to that is Flows: a Python class wrapping crews and direct LLM calls in an event-driven engine, with methods decorated @start, @listen and @router. State is a dict or, better, a Pydantic model, and @persist() saves it so a run can resume.

What that buys you

The fastest path from "here is our process, described as people" to something running. For workflows that genuinely are a team of specialists producing a document, the metaphor is not a toy — it maps, and the code reads like the process. Flows then give you back the determinism the crew metaphor gave away, which is why the honest recommendation is Flows-with-Crews-inside rather than Crews alone.

The cost

Persistence is opt-in and placement-sensitive; the community guidance is to persist at a terminal step rather than decorating the whole class, which tells you this is a layer you are managing rather than a runtime guarantee you inherit. There is no equivalent of a durable interrupt, so human-in-the-loop is something you construct. And the role metaphor invites more agents than a task needs — a crew of five where a graph would have had two nodes is a cost paid every run, in tokens and in the failure modes that multi-agent systems catalogue.

OpenAI Agents SDK — the thinnest thing that works

What it actually does

Four primitives and almost no ceremony: agents with instructions and tools, handoffs that transfer control between agents, guardrails that check inputs and outputs, and a runner that drives the tool loop, switches agents on a handoff, and stops when the run finishes or pauses for approval. Sessions carry conversation history; tracing is built in and collects LLM generations, tool calls, handoffs and guardrail events, uploaded to the OpenAI platform by default. A TypeScript SDK mirrors the same primitives.

What that buys you

Speed, and a debugging story you did not have to instrument. The tracing in particular is the best out-of-the-box observability of the four — for a small team, "I can replay exactly what happened" on day one is worth more than most architectural elegance. Handoffs are the right abstraction for triage-and-delegate shapes, which is a large fraction of real support and routing agents.

The cost

Run context is in the process, so durability across a crash is your problem, and handoffs get awkward when the pattern is genuine parallel collaboration rather than delegation. The SDK is designed around OpenAI's own API surface; other providers are reachable but off the golden path, so this is the framework where model portability costs you the most, and the one whose default tracing destination is a decision your security review will have an opinion about.

What actually transfers, and what does not

What it costs to change your mind, by layer Prompts and tool definitions port between frameworks in hours. Orchestration shape ports in weeks. The state and persistence contract does not port at all, because everything above it is written against its assumptions. The layer you pick a framework for is the layer you cannot re-pick Prompts & tool defs Function schemas, system text, MCP servers you already run Hours Orchestration shape Graph, crew, tree or handoff — a rewrite, but a mechanical one Weeks State & persistence contract Where the run lives, what resume means, how a human pauses it Everything above is written against it Teams evaluate frameworks on the first two columns because those are what a tutorial shows. The migration that hurts eighteen months later is always the third. Pick for the state model. The metaphor is the part you will stop noticing by week three.
Teams evaluate on the first two columns because that is what a tutorial shows. The migration that hurts is always the third.

Prompts and tool definitions are close to free to move. A function schema is a function schema, and if your tools are behind MCP servers they are not framework-coupled at all — which is the strongest argument for putting them there regardless of what you pick. Evals move too, provided they were written against outcomes rather than against the framework's internals.

Orchestration shape is a rewrite, but a mechanical one. Converting a crew to a graph or a graph to an agent tree is tedious and predictable; you know what it costs before you start.

The state contract does not move. If you built on in-process context and now need to resume a four-hour run after a deploy, there is no incremental path — the control flow above the persistence boundary was written assuming the boundary was not there. This is the same lesson durable state and resumability reaches from the operations side, and it is why the pairing of an orchestration framework with a durable execution engine keeps recurring in production architectures.

When to pick which

SituationPickBecause
Runs last minutes to hours and must survive a deployLangGraphCheckpointed state and resume are the primitive, not an add-on
A human must approve a step mid-runLangGraphinterrupt() is a durable pause; elsewhere you build a queue
Already on Vertex AI, or you need JavaGoogle ADKDeployment and identity are solved; Java is a genuine differentiator
The pipeline has deterministic stages with a model in the middleGoogle ADKSequential / Parallel / Loop agents encode order without an orchestrator
The process is genuinely a team of specialistsCrewAI (Flows)The metaphor maps, and Flows restore the control the crew gave up
Triage-and-delegate on OpenAI models, shipping this monthOpenAI Agents SDKFour primitives, and tracing you did not have to build
Multi-provider by policy or by costLangGraph or CrewAIBoth are model-agnostic by design; the other two have gravity
You cannot tell yetStart thinnerPut tools behind MCP, keep evals framework-free, and decide when the run length tells you

One caveat worth stating plainly: none of these choices is as consequential as the shape of the problem. A well-scoped agent with three good tools works on all four. A badly scoped one fails on all four, and the framework will get the blame.

FAQ

Which agent framework is best in 2026?

There is no best, but there is a best question: how long does a run last, and what happens when it is interrupted? If the answer involves minutes, crashes or human approval, pick a framework where state is externalised by default — LangGraph most clearly, ADK's session service next. If runs are short and self-contained, the thinner frameworks cost less and ship faster.

Can I mix them?

Partly, and along one seam in particular. Tools behind MCP servers are framework-neutral, so they compose with anything. Evals written against outcomes are portable too. Orchestration does not mix — running two frameworks' loops inside one process gives you two state models and no clear owner of the run.

Is CrewAI only for multi-agent work?

No, and treating it that way is the common mistake. Flows wrap direct LLM calls as happily as they wrap crews, and a Flow with one crew and several plain steps is often the right shape. The role metaphor invites more agents than most tasks need; resist it and CrewAI is a reasonable single-agent framework.

Does the OpenAI Agents SDK lock me into OpenAI?

Not contractually, but practically it is designed around OpenAI's API surface, and the default tracing destination is OpenAI's platform. Other providers are reachable. If multi-provider routing is a requirement rather than a preference, the model-agnostic frameworks start ahead.

What about durable execution engines?

They are complementary rather than competing, and the pairing is common: the agent framework owns the reasoning loop while a workflow engine owns retries, timers and exactly-once side effects. That combination is worth reaching for when your agent's side effects are expensive or irreversible.

Further reading

On this wiki:

Project sources: