CrewAI to LangGraph Migration Guide: Cut 18% Token Overhead (2026)
CrewAI and LangGraph dominate the 2026 agent framework market, but they solve different problems at different costs. CrewAI optimizes for fast prototyping with role-based agents. LangGraph optimizes for production control with explicit state machines. The production cost gap is measurable: CrewAI adds ~18% token overhead vs hand-written LangGraph for equivalent workflows. At
0,000/month LLM spend, that's
,800/month extra — one engineer-day of migration pays for itself in weeks. This guide covers the full migration path: state schema design, node mapping, conditional edges, tool integration via MCP, and the four production patterns where LangGraph's control model actually matters. Tested on LangGraph 1.0.7 (April 2026) and CrewAI 0.115.0.
The migration pattern in production is consistent across teams: build in CrewAI, validate the concept, hit a wall around conditional logic or cost control, and need to move to LangGraph. Understanding this before starting saves weeks of rework.
The three walls that force migration:
Wall 1 — Cost visibility. CrewAI's role-based abstraction buries token usage behind agent conversations. Teams scaling past $5,000/month realize they can't answer "which agent is burning 40% of the budget?" without instrumentation LangGraph gives them by default.
Wall 2 — Conditional routing complexity. CrewAI's sequential and hierarchical processes work for linear flows. When your agent needs to loop with retry logic, branch based on tool output, or spawn parallel sub-tasks with results merged, CrewAI's abstraction fights you. LangGraph's explicit edges make this trivial.
Wall 3 — Production observability. LangGraph ships native integration with LangSmith for trace debugging. CrewAI has its own observability tools but less mature. Teams running 24/7 agents in production usually end up wanting LangSmith anyway.
Adoption signal: LangGraph runs at 34.5M monthly PyPI downloads vs CrewAI's 5.2M as of April 2026. LangGraph leads production adoption; CrewAI leads prototyping mindshare.
Architecture Mapping: Crews to Graphs
The conceptual translation:
CrewAI concept
LangGraph equivalent
Agent
Node (Python function)
Task
Edge + node work
Crew
Compiled StateGraph
Process (sequential/hierarchical)
Explicit edges + conditional routing
Agent role/goal/backstory
System prompt in the node's LLM call
Context sharing via agent.context
Typed state schema field
Tool
LangGraph tool (same function signature)
Manager agent
Supervisor node with routing logic
Memory
Checkpointer + custom state fields
The mental model shift: CrewAI thinks in agents and roles. LangGraph thinks in state transitions. Once you stop thinking "which agent does this" and start thinking "what state change does this produce," the migration is mechanical.
The Token Overhead Gap Explained
CrewAI's 18% token overhead isn't random. Three structural sources:
1. Agent role-play verbosity. CrewAI prepends each agent call with role, goal, and backstory context. On a 5-agent crew, this adds 800-1,500 prompt tokens per agent invocation. LangGraph passes only what's in your explicit state.
2. Inter-agent context propagation. CrewAI's context parameter shares prior task outputs across agents as raw conversation text. LangGraph forces you to pick exactly which state fields each node reads, naturally minimizing context bloat.
3. Tool definition duplication. CrewAI re-declares tool signatures to each agent that has access. LangGraph registers tools once on the graph. On a 10-tool crew, this repetition can add 2,000+ tokens per agent turn.
Measurable impact at scale:
Monthly LLM spend
CrewAI overhead cost
Migration ROI window
,000
80/mo
~6 months
$5,000
$900/mo
~1 month
0,000
,800/mo
~2 weeks
$25,000
$4,500/mo
~3 days
00,000
8,000/mo
Immediate
The 18% is a midpoint — actual overhead on specific workloads ranges from 8% (simple 2-agent sequential) to 35% (10+ agent hierarchical with shared tool pool).
Step 1: Design Your Typed State Schema
This is the only step that matters for migration quality. Get this wrong and the rest is painful; get it right and every other step is mechanical.
The principle: capture exactly what data flows between agents. No more, no less.
For a typical research-and-write workflow:
from typing import TypedDict, List, Optional
from langgraph.graph.message import add_messages
from typing_extensions import Annotated
class ResearchState(TypedDict):
topic: str
research_queries: List[str]
sources: List[dict] # [{"url": str, "content": str, "relevance": float}]
outline: Optional[dict]
draft: Optional[str]
review_feedback: Optional[str]
final: Optional[str]
iteration_count: int
messages: Annotated[list, add_messages]
Three schema design rules:
Use Optional for fields produced later in the flow. Initial state only needs topic.
Use Annotated for lists that accumulate across nodes.add_messages is the standard reducer for LLM message history.
Keep field names semantic.outline not step2_output. Your graph is self-documenting when field names describe intent.
Pydantic alternative (better for runtime validation):
from pydantic import BaseModel, Field
from typing import List, Optional
class ResearchState(BaseModel):
topic: str
research_queries: List[str] = Field(default_factory=list)
sources: List[dict] = Field(default_factory=list)
outline: Optional[dict] = None
draft: Optional[str] = None
review_feedback: Optional[str] = None
final: Optional[str] = None
iteration_count: int = 0
Pydantic adds 5-10ms per node transition but catches schema violations at write time, not at read time. Worth it for production systems.
Step 2: Map Each Agent to a Node
A CrewAI agent:
researcher = Agent(
role="Senior Research Analyst",
goal="Uncover comprehensive info on {topic}",
backstory="20 years in market research, known for thoroughness.",
tools=[search_tool, scrape_tool],
llm=openai_llm,
)
Becomes a LangGraph node:
from langgraph.graph import StateGraph
from langchain_openai import ChatOpenAI
llm = ChatOpenAI(model="gpt-5.4", temperature=0)
def research_node(state: ResearchState) -> dict:
prompt = f"""You are a senior research analyst with 20 years in market research.
Your goal: uncover comprehensive information on {state['topic']}.
Generate 3-5 specific research queries to start with."""
response = llm.invoke(prompt)
queries = parse_queries(response.content)
sources = []
for q in queries:
results = search_tool.invoke(q)
sources.extend(results)
return {
"research_queries": queries,
"sources": sources,
}
Three migration shortcuts:
Drop the role/goal/backstory to a single system prompt. CrewAI's 3-field role structure is redundant in LangGraph. Combine them into a focused system message.
Tools are called directly in the node, not registered with the agent. This is simpler but requires explicit tool routing in the node function. For complex tool flows, use LangGraph's tool calling pattern.
Return only the state fields you're updating. LangGraph merges node outputs into state automatically. Don't return the full state.
The payoff becomes obvious when you need non-sequential flow. CrewAI hierarchical process requires a manager agent and implicit delegation. LangGraph lets you add conditional edges:
def route_after_review(state: ResearchState) -> str:
if state["review_feedback"] and state["iteration_count"] < 3:
return "write"
return END
graph.add_conditional_edges("edit", route_after_review, {
"write": "write",
END: END,
})
Now your flow loops back to the writer if the editor found issues — up to 3 iterations — without a manager agent.
Step 4: Migrate Tools via MCP Servers
This is the step teams skip and regret. If you build tools as MCP servers (Model Context Protocol) instead of framework-specific tool wrappers, your migration becomes transparent:
from mcp import ClientSession, StdioServerParameters
async def search_tool(query: str) -> list:
params = StdioServerParameters(
command="python",
args=["-m", "my_search_mcp_server"],
)
async with ClientSession(params) as session:
return await session.call_tool("web_search", {"query": query})
Why MCP matters for migration:
Tools defined as MCP servers work with CrewAI, LangGraph, OpenAI Agents SDK, Claude Desktop, and any other MCP-compatible framework
Tool implementation isn't coupled to the orchestration layer
If you didn't build tools as MCP originally: factor them into MCP servers as part of the migration. It's 2-4 additional engineer-hours per tool but saves multiples on any future framework change.
CrewAI 0.100+ added native MCP support, so the tool definitions transfer cleanly. LangGraph has community MCP adapters available via langchain-mcp.
Step 5: Handle Conditional Logic
The wall that forces most CrewAI migrations. Three conditional patterns you'll need:
Pattern 1 — Retry with backoff:
def should_retry(state: ResearchState) -> str:
if state.get("error") and state["iteration_count"] < 3:
return "research"
if state.get("error"):
return "handle_failure"
return "write"
graph.add_conditional_edges("research", should_retry, {
"research": "research",
"handle_failure": "handle_failure",
"write": "write",
})
The interrupt_before flag pauses execution until you explicitly resume the graph with an updated state — critical for production workflows where agent output needs review before expensive actions.
CrewAI can do these patterns with custom code, but the resulting complexity negates the "easy prototyping" value proposition of the framework.
Supported LLM Providers and Model Routing
LangGraph is LLM-agnostic. The ChatOpenAI, ChatAnthropic, and similar LangChain wrappers cover the major providers, but you typically want one unified endpoint for cost optimization and failover:
OpenAI direct (gpt-5.5, gpt-5.4, gpt-5.4-mini, gpt-5.4-nano)
Anthropic direct (claude-opus-4-7, claude-sonnet-4-6, claude-haiku-4-5)
Google Vertex AI (gemini-3-1-pro, gemini-2-5-flash, gemini-2-5-flash-lite)
Chinese model providers (Moonshot/Kimi, DeepSeek, Qwen, GLM, Hunyuan)
Custom OpenAI-compatible endpoints
The "custom endpoint" path is where TokenMix.ai fits in. TokenMix.ai is OpenAI-compatible and provides access to 300+ models including Kimi K2.6, DeepSeek V4, Claude Opus 4.7, GPT-5.5, Qwen 3.6, and Gemini 3.1 Pro through one API key. For LangGraph teams routing across mixed workloads — cheap models for classification nodes, frontier models for reasoning nodes — TokenMix.ai means one billing account, one key rotation, and pay-per-token across all providers.
This multi-model routing pattern is where LangGraph's explicit graph structure pays off most — you control exactly which model serves which cognitive load, and TokenMix.ai handles the provider multiplexing. Most teams cut LLM bills by 40-60% this way without measurable quality regressions on routine nodes.
Production Patterns Where LangGraph Wins
The four patterns where CrewAI hits a wall and LangGraph scales cleanly:
1. Long-running agents with state persistence. LangGraph's MemorySaver or SqliteSaver checkpointer lets you pause a graph, shut down the server, restart, and resume execution from the exact node state. CrewAI's crew state is process-local and lost on restart.
2. Complex retry and error recovery. LangGraph's conditional edges model error paths as first-class graph structure. CrewAI requires try/except inside agent task definitions, which breaks the "declarative" abstraction.
3. Cost-tiered model routing within a workflow. LangGraph lets you specify a different LLM per node — cheap models for classification, frontier models for reasoning. CrewAI can do this but it's awkward because the LLM is an agent property, not a task property.
4. Production observability with LangSmith. LangGraph integrates natively with LangSmith tracing. Every node execution, state transition, and tool call is captured for debugging. CrewAI has its own tracing but less mature.
When to Stay on CrewAI
CrewAI wins on:
Prototype-to-demo speed. For a 2-agent research-and-write prototype to show a stakeholder, CrewAI is faster to write than LangGraph.
Role-play-style workflows. If your use case genuinely benefits from "agent as persona" framing (creative writing, roleplay, simulated interviews), CrewAI's abstraction fits the problem.
Teams unfamiliar with state machines. If your team hasn't built production workflow engines before, LangGraph's explicit graph model has a learning curve. CrewAI's agent metaphor is lower cognitive load.
Budget under
,000/month LLM spend. The 18% overhead math doesn't justify migration time.
Don't migrate if your CrewAI implementation works and you're not hitting cost, control, or observability walls.
Migration Checklist
Print this and check each item:
State schema drafted as TypedDict or Pydantic BaseModel
Every CrewAI agent has a corresponding LangGraph node function
Agent role/goal/backstory merged into each node's system prompt
All sequential task dependencies converted to explicit edges
Conditional logic (retries, branches, loops) implemented as conditional edges
Tools refactored as MCP servers or LangChain-compatible tool functions
Tools registered once on the graph, not duplicated per node
Checkpointer configured for state persistence (SqliteSaver for dev, PostgresSaver for prod)
LangSmith tracing configured (set LANGCHAIN_API_KEY and LANGCHAIN_TRACING_V2=true)
Multi-model routing configured — cheap model for classification, frontier for reasoning
Load test against production traffic volume before cutover
Rollback plan documented (keep CrewAI codebase in branch for 2 weeks post-migration)
Typical migration time:
Workflow complexity
Migration time (one engineer)
2-3 agents, sequential
4-8 hours
5-7 agents, with conditional logic
1-2 days
10+ agents, hierarchical, custom tools
3-5 days
Production cutover (load test + canary)
+2-3 days
FAQ
How much does CrewAI cost extra vs LangGraph at scale?
CrewAI's 18% average token overhead translates to ~
80/month per
,000 spend, ~
,800/month per
0,000 spend, and ~
8,000/month per
00,000 spend. One engineer-day of migration work breaks even at ~$300-500/month LLM spend, and pays back in days at
0K+ spend levels.
Can I use CrewAI agents inside a LangGraph workflow?
Technically yes — you can wrap a CrewAI crew invocation inside a LangGraph node function. Practically this defeats the purpose: you keep CrewAI's token overhead, get both frameworks' dependencies, and lose LangGraph's control model benefits. If you're already migrating, go all-in.
Does LangGraph work with async/parallel execution?
Yes. LangGraph 1.0+ supports async nodes with ainvoke and parallel edges with automatic fan-out/fan-in. This is structurally simpler than CrewAI's approach and a significant performance gain for IO-bound workloads (multiple concurrent API calls).
What's the best way to handle tool migration?
Refactor tools as MCP servers if you haven't already. MCP tools work across CrewAI 0.100+, LangGraph (via langchain-mcp), OpenAI Agents SDK, and Claude Desktop. This future-proofs against any framework migration. For non-MCP tools, LangGraph uses LangChain's @tool decorator, which is compatible with most existing tool implementations.
How do I measure whether migration was worth it?
Track three metrics pre- and post-migration: tokens per workflow completion (should drop ~18%), p95 workflow latency (should be similar or slightly better), and engineer-hours spent debugging agent behavior (should drop dramatically thanks to LangSmith tracing). If all three improve, the migration paid off.
Can I route different LangGraph nodes through different LLM providers?
Yes, and you should. Cheap models (GPT-5.4-mini, Claude Haiku 4.5, DeepSeek V4-Flash) for classification, extraction, and routing nodes. Frontier models (GPT-5.5, Claude Opus 4.7, Kimi K2.6) for reasoning and synthesis nodes. TokenMix.ai exposes all these through one OpenAI-compatible endpoint with unified billing, so the routing is a one-line change per node.
Does LangGraph replace LangChain?
No. LangGraph sits on top of LangChain for LLM provider abstractions, tool definitions, and message types. Think of LangGraph as the orchestration layer and LangChain as the provider abstraction layer. You'll use both.
Is LangGraph production-ready?
Yes. As of April 2026, LangGraph 1.0+ has shipped stable APIs, runs at 34.5M monthly PyPI downloads, and powers production agents at OpenAI, Anthropic enterprise customers, Klarna, Elastic, and hundreds of Fortune 500 deployments. CrewAI is production-used but more commonly for internal workflows than customer-facing deployments.