LangGraph lets you compile a StateGraph and then use it as a single node inside a parent graph (a subgraph). Describe two concrete scenarios where reaching for a subgraph beats inlining the same nodes in the parent graph, and one scenario where it does not.
Subgraphs earn their keep for reusable specialist flows, supervisor multi-agent patterns, and internal state isolation; inline a flow used in one place with no state hiding needed.
Picture a kitchen. A subgraph is like having a separate pastry station with its own counters, tools, and recipes. The head chef just says "give me a tart" and doesn't need to know how the pastry station works internally. That setup is great if multiple dishes need pastry or if the station genuinely has its own workflow. But if you only ever make one tart a year and the recipe is three steps, hauling out the whole pastry station is overkill, just bake it on the main counter. Same idea with subgraphs: powerful when you need reuse or isolation, overhead when you don't.
Concept explanation~2 min read
Everything you need to truly understand this topic: intuition, mechanics, step by step explanation, code, formulas, and worked example. Click to expand.
Concept explanation~2 min read
Everything you need to truly understand this topic: intuition, mechanics, step by step explanation, code, formulas, and worked example. Click to expand.
LangGraph subgraphs are a structural feature that's easy to over-apply. Any compiled StateGraph can be dropped in as a node inside a parent graph, which makes it tempting to subgraph everything in the name of "clean composition". The honest engineering question is narrower: when does the encapsulation a subgraph provides actually buy you something?
The answer is three structural benefits, reuse across parents, supervisor multi-agent patterns, and internal state isolation. Outside those, subgraphs are overhead. This explanation walks each pattern, names the inline-wins case, and covers the operational tradeoffs (checkpoint granularity, compile cost, state-schema boundaries) that affect real production graphs.
Pattern 1: reuse across parents
The simplest case for a subgraph is the same one that justifies extracting any function: more than one caller. A retrieve rerank deduplicate flow used by both a chat agent and a nightly batch summarizer is the textbook example. Build it once as a StateGraph, compile it, and mount the compiled object in both parents. Update the rerank logic in one place and both parents inherit the change.
The alternative, copy-paste the nodes into both parent graphs, is the same anti-pattern as duplicated functions in any codebase. It works on day one and rots over time as the two copies drift. The subgraph version stays in sync by construction.
Reuse alone is a sufficient justification when the flow has internal structure worth packaging. A three-node linear pipeline used in two places is borderline, you could just extract a helper function and inline it. The subgraph case gets stronger when the flow itself has a loop, branches, or state that benefits from being a graph rather than a function chain.
Situations where this technique stops working.
2–4 min · Everything important, quickly.
Real products, models, and research that use this idea.
- LangGraph's official multi-agent supervisor template uses one subgraph per specialist (researcher, coder, critic), with the supervisor routing among them.
- Replit's Agent uses subgraphs to encapsulate IDE-specific tool sequences so they can run identically from chat and from CI hooks.
What an interviewer would ask next. Try answering before peeking at the approach.
QWalk through how to set up step-level checkpointing inside a subgraph.
Pass the same checkpointer instance to both the parent and the subgraph at compile time, and stream with subgraphs=True (or use graph.stream(..., subgraphs=True)). The runtime now records checkpoints inside the subgraph, addressable by the parent's thread_id plus a subgraph-scoped sub-namespace. You can graph.get_state_history into the subgraph's internal steps.
Red flags & common mistakes
The phrases that signal junior thinking. Click to expand.
Red flags & common mistakes
The phrases that signal junior thinking. Click to expand.
Reaching for a subgraph because "composition is good". The subgraph only earns its keep with reuse, supervisor patterns, or internal state that should stay hidden.
60 second bullets to scan on the way to the call.
Three scenarios where a LangGraph subgraph earns its keep.
One scenario where inlining is the right answer.
Primary sources. Browse if you want the original framing.
Same topic, related formats. Practice these next.