LangGraph, CrewAI, and Dapr address overlapping parts of agent orchestration, but they do not impose the same operating model. Compare the state you must preserve, the failures you must recover from, and the infrastructure you are willing to run.

This is a documentation-based comparison. No head-to-head latency, recovery-rate, or developer-productivity benchmark was run for this article. The accompanying worksheet is designed to make your own comparison reproducible.

What each system documents

SystemDocumented building blocksConfiguration that matters
LangGraphGraph-state checkpointers and cross-thread storesChoose a persistence backend and identify each thread correctly
CrewAI FlowsStateful event-driven flow methods and @persistDecide what state is persisted and how a run is resumed or forked
Dapr Workflow / Dapr AgentsDurable workflow execution, activities, and agent integrationOperate the workflow runtime and its supporting state infrastructure

LangGraph’s persistence guide distinguishes thread-scoped checkpoints from cross-thread stores. Its in-memory saver loses checkpoints on process restart; persistence must match the failure you want to survive.

CrewAI’s Flows documentation provides persistence at class or method scope and describes resuming or forking saved state. It would be incorrect to describe CrewAI as having no persistence merely because an introductory example keeps state in memory.

Dapr Workflow records completed workflow steps and supports recovery across interruptions. Dapr Agents builds agent capabilities on that infrastructure. Durable orchestration still needs correctly designed application activities.

Choose according to the work you already have

LangGraph is a candidate when you want explicit graph transitions and control over application state in code. Plan checkpoint storage, retention, and operational visibility as part of the implementation rather than treating a working notebook as a production deployment.

CrewAI is a candidate when role-oriented tasks and event-driven Flows match the team’s mental model. Review the actual flow behavior and persistence boundaries; a role description does not itself define transaction or retry semantics.

Dapr is a candidate when durable workflows and service infrastructure are central to the system, particularly if your team already operates Dapr. Include the operational cost of runtime configuration, state services, monitoring, and upgrades in the decision.

These are starting points. A strong existing team workflow can outweigh an attractive feature comparison. Prototype the same business operation in your shortlist before committing.

Use the same failure experiment for every candidate

Download framework-recovery.csv. Every result starts as not run. Populate it with the framework version, storage configuration, repository revision, and an evidence link after executing the case.

Use a synthetic task that creates a draft record with an application idempotency key. It should have a deterministic acceptance check and no real outbound messages.

InterruptionRequired observation
Before the activity startsThe task can resume without losing its input
After the external write, before checkpoint persistenceReconciliation avoids creating a second logical record
After checkpoint persistenceResume does not repeat a completed effect unnecessarily
Duplicate task submissionOne logical task remains identifiable
Cancellation during executionFinal state distinguishes canceled, completed, and uncertain work
Process restart with the configured storeRecovery uses persisted state rather than an in-memory object

Record the actual database or mock-service state. A framework status of “completed” is insufficient if the side effect happened twice.

Separate persistence from correctness

Saving state answers where the workflow can resume. Authorization answers whether an operation is allowed. Idempotency and reconciliation answer what happens when execution is repeated or its outcome is uncertain. None of these can replace the others.

For each candidate, collect a trace that joins the workflow ID, task ID, operation key, attempt number, and final artifact. Check which component owns retry policy. Independent retries at the SDK, worker, and queue layers can multiply attempts even when each layer has a reasonable local limit.

Score correctness before convenience. Then compare implementation effort, observability, deployment footprint, dependency changes, and steady-state cost. Keep failed cases visible. Report an outcome as “passed this case under this configuration,” not a universal recovery percentage.

A practical selection rule

Choose the candidate that satisfies your required failure cases with an operating model your team can maintain. If none does, simplify the workflow or repair the application boundary before changing frameworks.

The multi-agent architecture guide provides a task contract and budget example that can be used across all three. That contract makes it easier to change implementations without changing what success means.

Revision note

Updated October 20, 2026. Removed unsupported recovery percentages, development-speed claims, and the claim that only one framework is production-ready. Added primary-source distinctions and a common failure experiment with no fabricated results.

Primary sources

Checked October 20, 2026: langgraph durability; crewai flows; dapr workflow; dapr agents.