LangGraph
LangChain · Python
Low-level graph runtime for long-running, stateful agents, with checkpointing as a first-class primitive.
Assessed at langchain-ai/langgraph@644815f9e5 · reviewed 18 Aug 2026 · rubric v1.0.0 · reviewer Fizz
architecture score
Assessment
Six axes, each 0–4, weighted to 100. Every basis line below is backed by citations pinned to the reviewed commit.
Control flow & multi-agent composition
4/4 · weight 20%
Control flow is an explicit, inspectable graph rather than a prompt convention. StateGraph exposes add_node, add_edge and add_conditional_edges, so routing is authored in code; Send provides dynamic fan-out and Command lets a node both update state and choose the next hop. Fork-and-replay tests exercise re-entering the graph at an earlier checkpoint with modified state, which is control-flow recovery rather than a happy-path demo.
State, memory & durability
4/4 · weight 20%
Persistence is a defined protocol, not an add-on. BaseCheckpointSaver specifies get_tuple, list, put and put_writes, and the pending-writes method is what makes mid-superstep failure recoverable rather than merely restartable. Replay tests re-run from a prior checkpoint and assert which nodes fire again, evidencing resume semantics against real state.
Tools, integrations & interoperability
3/4 · weight 15%
ToolNode and InjectedState are first-class in the langgraph-prebuilt package, with an official test invoking ToolNode both sync and async. Held at 3 rather than 4: the tool contract itself is inherited from langchain-core rather than defined here, and this revision ships deprecation shims moving interrupt schemas out to langchain.agents.interrupt, so the tool/interop boundary is still moving.
Reliability, safety & human controls
4/4 · weight 15%
RetryPolicy, CachePolicy and Interrupt are public types on the runtime, and retry is a policy object with a retry_on predicate rather than a loop. Tests assert the predicate's enforcement across single exceptions, sequences, subclasses and callables, and a separate suite covers interrupting a run without applying state updates — enforcement and failure-path evidence, not a claim.
Observability & evaluation
3/4 · weight 15%
Streaming is a supported surface and there is an official test covering nested tracing interop, so runs emit structured events that an external tracer can nest correctly. Held at 3: the deep visibility the README advertises resolves to LangSmith, a separate hosted commercial product, so vendor-neutral observability in this repo is thinner than the marketing suggests.
Developer experience, portability & maintainability
3/4 · weight 15%
Install is a single pip command, the public API is typed and generic over state, and the CLI ships runnable graph examples that import the documented primitives. Held at 3: the repository's own docs directory contains only llms.txt and a redirect map, so conceptual documentation lives on an external site that cannot be pinned to this revision.
Strengths
Persistence is a protocol with pending-write semantics, not a convenience cache — the piece most agent frameworks omit and the reason a failed run can resume mid-step instead of restarting.
Control flow is authored and inspectable before execution, so routing can be reviewed, diffed and tested rather than inferred from a prompt at runtime.
Retry is a declarative policy with a predicate, and its enforcement is pinned by tests across exception types rather than left to user-written loops.
Limitations
The observability story resolves to LangSmith, a separate hosted commercial product; what ships in this repository is the interop seam, not the tooling the README advertises.
Conceptual documentation is not in the repository — the docs directory holds only llms.txt and a redirect map — so no documentation can be pinned to the reviewed revision.
The tool and interrupt surface is still relocating: this revision ships deprecation shims moving interrupt schemas out to langchain.agents.interrupt, so imports written today may move again.
Best for
Long-running agents where a crash must resume mid-run rather than restart, and where an operator needs to fork from a past checkpoint to inspect a different branch.
Workflows that need a human approval gate which provably does not mutate state while it waits.
Avoid if
You want batteries-included tracing without adopting a vendor platform — the in-repo surface is an interop seam and the advertised visibility lives in LangSmith.
You need a stable import surface right now — tool and interrupt schemas are actively being moved to the langchain package at this revision.
Patterns worth stealing
Persist pending writes separately from committed state. Storing what a step was about to do, not just what it finished, is what turns a restart into a resume — portable to any queue or job runner.
Make retry a policy object with a predicate instead of a try/except loop. It becomes inspectable, testable and attachable per unit of work.
Let a step return both its state update and its next destination in one value. Routing stays colocated with the decision that caused it, instead of being re-derived by a separate dispatcher.
Evidence ledger
All 18 citations behind this assessment. Each was fetched at the reviewed commit and checked for the exact text it claims.
- official-docnativedocumented
The project self-describes as a low-level orchestration framework for building, managing and deploying long-running, stateful agents.
README.md — project description
pinned 644815f9e5bc · blob 97c31e9cb4d8f · observed 18 Aug 2026
- sourcenativeobserved
StateGraph defines add_node, add_edge, add_conditional_edges and compile, so routing is declared in code and inspectable before a run.
libs/langgraph/langgraph/graph/state.py — class StateGraph
pinned 644815f9e5bc · blob 9a87f16fa91a7 · observed 18 Aug 2026
- sourcenativeobserved
Send enables runtime fan-out to a node with its own payload; Command lets a node return both a state update and the next destination.
libs/langgraph/langgraph/types.py — Send, Command, Interrupt
pinned 644815f9e5bc · blob 2fcf5bef92963 · observed 18 Aug 2026
- testnativedemonstrated
Official tests fork from a stored checkpoint with altered state and assert which nodes re-execute, demonstrating control-flow recovery rather than only forward execution.
libs/langgraph/tests/test_time_travel.py — fork and replay tests
pinned 644815f9e5bc · blob fe544274f4175 · observed 18 Aug 2026
- official-docnativedocumented
The README claims agents persist through failures and resume from where they left off, with both working and long-term memory.
pinned 644815f9e5bc · blob 97c31e9cb4d8f · observed 18 Aug 2026
- sourcenativeobserved
BaseCheckpointSaver defines get_tuple, list, put and put_writes. Persisting pending writes separately is what allows recovery from a failure part-way through a superstep.
libs/checkpoint/langgraph/checkpoint/base/__init__.py — class BaseCheckpointSaver
pinned 644815f9e5bc · blob 6e42061190d53 · observed 18 Aug 2026
- testnativedemonstrated
Tests replay from before an interrupt and then resume, and assert replay from the final checkpoint is a no-op, pinning resume semantics against persisted state.
libs/langgraph/tests/test_time_travel.py — replay and resume tests
pinned 644815f9e5bc · blob fe544274f4175 · observed 18 Aug 2026
- official-docnativedocumented
The langgraph-prebuilt package documents create_react_agent, ToolNode, validation helpers and Agent Inbox schemas as high-level APIs.
libs/prebuilt/README.md — What is this?
pinned 644815f9e5bc · blob b3da58470454f · observed 18 Aug 2026
- sourcenativeobserved
ToolNode is the tool-execution component and InjectedState annotates tools that need graph state, giving tools a typed path to run context.
libs/prebuilt/langgraph/prebuilt/tool_node.py — ToolNode and InjectedState
pinned 644815f9e5bc · blob 95e161b9078e3 · observed 18 Aug 2026
- testnativedemonstrated
An official test invokes ToolNode through both invoke and ainvoke and asserts the resulting tool messages.
libs/prebuilt/tests/test_tool_node.py — test_tool_node
pinned 644815f9e5bc · blob 47ebdcae0d936 · observed 18 Aug 2026
- official-docnativedocumented
The README states human oversight can inspect and modify agent state at any point during execution.
pinned 644815f9e5bc · blob 97c31e9cb4d8f · observed 18 Aug 2026
- sourcenativeobserved
Retry is expressed as a declarative policy object attached to nodes rather than as ad-hoc looping in user code.
libs/langgraph/langgraph/types.py — RetryPolicy, CachePolicy, Interrupt
pinned 644815f9e5bc · blob 2fcf5bef92963 · observed 18 Aug 2026
- testnativedemonstrated
Tests pin retry_on behaviour for single exceptions, tuples, subclasses and callable predicates, evidencing enforced failure handling.
libs/langgraph/tests/test_retry.py — should_retry cases
pinned 644815f9e5bc · blob aa48b0812692b · observed 18 Aug 2026
- testnativedemonstrated
Sync and async tests assert that interrupting a run leaves state unmodified, which is the property a human-approval gate depends on.
libs/langgraph/tests/test_interruption.py
pinned 644815f9e5bc · blob a484d74e5adc4 · observed 18 Aug 2026
- official-docofficial-addondocumented
The README routes tracing, state-transition capture and runtime metrics to LangSmith, a separate hosted product, rather than to an in-repo tracer.
README.md — Debugging with LangSmith
pinned 644815f9e5bc · blob 97c31e9cb4d8f · observed 18 Aug 2026
- testofficial-addondemonstrated
An official test asserts traces nest correctly when a graph runs inside an external traceable, evidencing a real instrumentation boundary.
libs/langgraph/tests/test_tracing_interops.py — test_nested_tracing
pinned 644815f9e5bc · blob aeac91dc2fdc9 · observed 18 Aug 2026
- official-docnativedocumented
The README opens with a one-line pip install and links a JS/TS sibling library for the same model.
pinned 644815f9e5bc · blob 97c31e9cb4d8f · observed 18 Aug 2026
- examplenativedemonstrated
A shipped CLI example builds a StateGraph with ToolNode and two model providers, showing the documented import surface actually composes.
libs/cli/examples/graphs/agent.py
pinned 644815f9e5bc · blob 931982061ac3a · observed 18 Aug 2026