Agentic Workflows: From Chains to Graphs — LangGraph, AutoGen, and CrewAI Compared
The Hook
You built a chain: prompt → LLM → tool → LLM → output. It works for happy path. But agents need loops, branches, retries, human-in-the-loop, parallel execution. Chains are linear; agents need graphs. LangGraph, AutoGen, and CrewAI each model agent coordination differently. Here’s the 2024 comparison.
The Thesis
Agent coordination is graph orchestration, not chain execution. Three frameworks dominate: LangGraph (explicit state machines), AutoGen (multi-agent conversation), CrewAI (role-based crews). Each models coordination differently: state machines, conversation protocols, role-based delegation. Your choice determines debugging, observability, and scaling ceiling.
The Science
The Coordination Spectrum
| Framework | Coordination Model | Best For | Learning Curve |
|---|---|---|---|
| LangGraph | Explicit state machine (nodes/edges) | Complex workflows, debugging, human-in-the-loop | Medium |
| AutoGen | Multi-agent chat (conversation) | Code generation, research, collaborative tasks | Low |
| CrewAI | Role-based crews (agents + tasks) | Business process automation, content pipelines | Low |
LangGraph: Explicit State Machines
Model: StateGraph with nodes (LLM, tool, human) and edges (conditional, unconditional).
from langgraph.graph import StateGraph, END
workflow = StateGraph(AgentState)
workflow.add_node("researcher", researcher_node)
workflow.add_node("coder", coder_node)
workflow.add_node("reviewer", reviewer_node)
workflow.add_edge("researcher", "coder")
workflow.add_conditional_edges(
"coder",
lambda s: "reviewer" if s["needs_review"] else END
)
workflow.add_edge("reviewer", "coder")
app = workflow.compile()
Strengths:
- Explicit state = full observability
- Checkpointing = resume from any node
- Human-in-the-loop = interrupt edges
- Cycles = retries, refinement loops
AutoGen: Multi-Agent Conversation
Model: Agents as chat participants with UserProxyAgent, AssistantAgent, custom roles.
from autogen import AssistantAgent, UserProxyAgent
coder = AssistantAgent(
name="coder",
system_message="Write clean Python code.",
llm_config={"model": "gpt-4"}
)
reviewer = AssistantAgent(
name="reviewer",
system_message="Review code for bugs, style, security.",
llm_config={"llm_config": {"model": "gpt-4"}}
)
user_proxy = UserProxyAgent(
name="user",
code_execution_config={"work_dir": "coding"}
)
user_proxy.initiate_chat(coder, message="Write a REST API for todos")
Strengths:
- Natural conversation metaphor
- Built-in code execution
- Group chat orchestration
- Easy multi-agent collaboration
CrewAI: Role-Based Crews
Model: Agents with roles, goals, backstories → Tasks → Crew (sequential/hierarchical).
from crewai import Agent, Task, Crew
researcher = Agent(
role="Senior Researcher",
goal="Find latest info on {topic}",
backstory="Expert at finding credible sources",
tools=[search_tool]
)
writer = Agent(
role="Technical Writer",
goal="Write comprehensive article on {topic}",
backstory="Expert at technical communication"
)
research_task = Task(
description="Research {topic}",
agent=researcher,
expected_output="Bullet points with sources"
)
write_task = Task(
description="Write article on {topic}",
agent=writer,
expected_output="Full article",
context=[research_task]
)
crew = Crew(agents=[researcher, writer], tasks=[research_task, write_task])
result = crew.kickoff(inputs={"topic": "LLM context windows"})
Strengths:
- Business-friendly abstraction
- Role-based delegation intuitive
- Task dependencies explicit
- Built-in output validation
The Comparison
| Dimension | LangGraph | AutoGen | CrewAI |
|---|---|---|---|
| Abstraction | State machine | Conversation | Role + Task |
| Debugging | Full state inspection | Chat logs | Task outputs |
| Human-in-loop | Native (interrupt edges) | UserProxyAgent | Manual |
| Parallelism | Explicit (fan-out/fan-in) | Group chat | Sequential/hierarchical |
| State mgmt | Explicit (checkpoints) | Conversation history | Task outputs |
| Learning curve | Medium | Low | Low |
| Best for | Complex workflows, production | Code gen, research | Business automation |
The Protocol: Choose Your Framework
| Use Case | Choose |
|---|---|
| Complex multi-step with retries, HIL, debugging | LangGraph |
| Code generation, research, collaborative coding | AutoGen |
| Content pipelines, business automation, non-technical team | CrewAI |
| Custom orchestration, fine-grained control | LangGraph |
| Rapid prototyping, chat-based | AutoGen |
| Business process automation, non-devs | CrewAI |
The Protocol: Build with LangGraph (Production Pattern)
from langgraph.graph import StateGraph, END
from langgraph.checkpoint.sqlite import SqliteSaver
# 1. Define state
class AgentState(TypedDict):
messages: List[BaseMessage]
context: dict
retry_count: int
# 2. Define nodes
def researcher(state: AgentState):
# ... research logic
return {"messages": [result], "context": {...}}
def coder(state: AgentState):
# ... coding logic
return {"messages": [result], "retry_count": state["retry_count"] + 1}
# 3. Build graph with checkpoints
workflow = StateGraph(AgentState)
workflow.add_node("researcher", researcher)
workflow.add_node("coder", coder)
workflow.add_edge("researcher", "coder")
workflow.add_conditional_edges("coder", should_retry)
checkpointer = SqliteSaver.from_conn_string("checkpoints.db")
app = workflow.compile(checkpointer=checkpointer)
# 4. Run with thread_id for resumability
config = {"configurable": {"thread_id": "session-123"}}
for chunk in app.stream({"messages": [HumanMessage("Build a REST API")]}, config):
print(chunk)
The Counterpoint
- LangGraph: Verbose for simple chains; state management overhead
- AutoGen: Hard to debug multi-agent loops; conversation history grows
- CrewAI: Less flexible for non-linear flows; validation can be rigid
Practical Takeaway
Prototyping: AutoGen or CrewAI (15 min to working agent). Production: LangGraph (explicit state, checkpoints, observability). Team with non-devs: CrewAI (business-friendly). Code-heavy: AutoGen (built-in execution).
Sources: LangGraph docs; AutoGen (Wu et al., 2023); CrewAI docs; LangChain “LangGraph vs Chains” (2024); Agent benchmarks (AgentBench, 2024); LangGraph vs AutoGen benchmarks (2024).