Skip to content
FrameworkHunt

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

89/100

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.

    lg-sm-baselg-sm-replay

  • Control flow is authored and inspectable before execution, so routing can be reviewed, diffed and tested rather than inferred from a prompt at runtime.

    lg-cf-statelg-cf-types

  • 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.

    lg-rs-typeslg-rs-retry

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.

    lg-ob-doclg-ob-trace

  • 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.

    lg-dx-doc

  • 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.

    lg-ti-srclg-ti-doc

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.

    lg-sm-baselg-cf-fork

  • Workflows that need a human approval gate which provably does not mutate state while it waits.

    lg-rs-interrupt

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.

    lg-ob-doc

  • You need a stable import surface right now — tool and interrupt schemas are actively being moved to the langchain package at this revision.

    lg-ti-src

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.

    lg-sm-base

  • Make retry a policy object with a predicate instead of a try/except loop. It becomes inspectable, testable and attachable per unit of work.

    lg-rs-typeslg-rs-retry

  • 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.

    lg-cf-types

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.

    README.md — Why use LangGraph

    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.

    README.md — Why use LangGraph

    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.

    README.md — install

    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