What it is
LangGraph models an agent as a graph. Nodes are functions, edges are transitions, and a shared state object gets passed along and mutated as execution moves through. Loops are allowed, which is what separates it from a pipeline and what makes it useful for anything involving retries or reflection.
What goes wrong
Graphs with cycles produce traces that are genuinely hard to read. The same node fires four times and the callback log gives you four near-identical entries with no indication of which iteration mattered or what pushed it back around.
What the adapter does
Attaches as a standard LangChain callback handler and normalizes every node entry, tool call, and model round trip into the shared taxonomy. Each iteration gets its own causal chain, so "the fourth pass at this node was caused by the validation failure in the second" becomes a query rather than an inference.
graph.invoke(input, config={"callbacks": [adapter.callback_handler]})
Caveat
Callback coverage depends on LangChain's callback surface. Anything happening outside a callback-instrumented path is invisible to it.