LangGraph, in depth
The nine-note deep dive. LangChain and LangGraph is the one-page overview — read that if you want the summary, read this if you want to build one.
Verified against LangGraph 1.3.x / LangChain 1.3.x as of 2026-08.
Read in order
| # | File | Covers |
|---|---|---|
| 01 | Why LangGraph | what problem it solves, and when not to use it |
| 02 | State and reducers | TypedDict state, Annotated reducers, add_messages |
| 03 | Nodes, edges and routing | edges, conditional routing, Command, loops, fan-out |
| 04 | create_agent and middleware | the prebuilt loop, and middleware as the 1.0 idea |
| 05 | Persistence and threads | checkpointers, thread_id, state history, time travel |
| 06 | Human in the loop | interrupt(), Command(resume=), the replay rules |
| 07 | Streaming | stream modes, token vs step, wiring SSE |
| 08 | Multi-agent and subgraphs | composition, supervisor, call vs handoff |
| 09 | Production and debugging | durability modes, testing, tracing, failure modes |
The five answers worth having cold
It is a runtime, not a chain library. You declare state, nodes and edges; the runtime owns execution. That indirection is what makes checkpointing, resumption, streaming and time travel possible at all — a node never calls the next node, so the runtime can pause between any two.
create_agent, not create_react_agent. The 1.0 front door is
from langchain.agents import create_agent. The old name dates you to before
October 2025, and it comes up because so much published material predates the
rename.
Reducers are how parallel writes work. By default an update replaces a
key. Annotated[list, add] makes it accumulate — and without a reducer, two
parallel branches writing the same key is a runtime conflict. Fan-out forces
the merge question.
The checkpointer buys four things at once. Conversation memory, crash
resumption, human-in-the-loop, and time-travel debugging all come from the same
mechanism: state written after every superstep, keyed by thread_id.
Resuming replays the node from its start. So anything before an
interrupt() runs twice. Side effects go after the pause or become idempotent
— this is the rule that catches people, and it applies to crash recovery as
much as to approvals.
The senior framing
“A chain is an order I wrote. An agent is an order the model picks. LangGraph is the runtime under both, which lets me put control flow anywhere on that spectrum — and most production agents are a graph with explicit edges and one routing decision, not a free-running loop.”