LangGraph 0.5 – the “Getting-Ready-for-1.0” release 🎉
TL;DR – 0.5 is not a radical rewrite, but a scrub-down and tune-up of the LangGraph core.
APIs are a little stricter, you have more control over streaming, checkpoints are lighter, etc. 99 % of users can upgrade with nothing more than a pip install --upgrade langgraph==0.5.*.
Why 0.5?
The team’s next big milestone is a 1.0 release in a few months.
To get there we needed to:
- lock in the few API surfaces that still felt “fuzzy”
- prune internal code paths that made distributed execution harder
- land long-queued performance work
0.5 is that housekeeping release.
Headline changes
1. A leaner, stricter StateGraph
-
state_schemais now mandatory.“Untyped” graphs were never shown in the docs and produced surprising runtime errors. Requiring an explicit schema fixes that class of bugs and improves static analysis.
-
input/output→input_schema/output_schemaThe old names still work but raise a deprecation warning.
graph = StateGraph( state_schema=MyState, input_schema=UserQuery, output_schema=AssistantResponse, )
-
New
NodeBuilderutilityA simpler, declarative way to create nodes and attach them to channels. The old
Channel.subscribe_tohelper keeps working but will be removed in 1.0.
2. Smarter streaming modes
stream_mode="debug"is now an alias for the pair["tasks", "checkpoints"]. You can now turn them on individually:
graph.stream(stream_mode="tasks") # only task-level updates
graph.stream(stream_mode="checkpoints") # only checkpoint deltasThis makes it cheaper to subscribe only to the information you need.
3. Checkpointing overhaul
- Smaller blobs & faster restores
Redundant keys have been dropped and per-task writes are stored directly. - Seamless migrations
Legacy “pending _sends” data is auto-migrated the first time it is loaded. Custom checkpointers continue to work unchanged.
4. Better serialization
JsonPlusSerializernow handles NumPy arrays stored in your state (including Fortran-ordered ones) without falling back topickle.
Minor breaking changes you might notice
state_schemarequired – add it if you were passing only input and output schemas instead (very rare).input/outputrenaming – rename toinput_schema/output_schema.- Subclassing internals – if you subclassed
PregelNodeandRunnable, drop the latter.
Nothing else should require code changes.
How to upgrade
pip install -U "langgraph>=0.5"If you maintain a plugin / custom checkpointer, run your test suite once; the public interfaces are untouched.
What’s next?
We’re hard at work on LangGraph 1.0, chime in here with any comments, feedback or questions, we want to hear from everyone.
Detailed Changelog
- feat: crons sorting sdk (#5197)
- feat(langgraph): task masquerading with update state
- Add print_mode= arg to invoke/stream (#5201)
- Fix bug where Command(update=) could be ignored if there was a 2nd interrupt after it
- Reduce extraneous keys in checkpoint.metadata
- If FuturesDict callback has been GCed, don't call it
- Add migration for pending_sends (#5106)
- Introduce "tasks" and "checkpoints" stream modes
- Add migration for pending_sends
- Restore compatibility with custom checkpointer classes created in prior versions
- Revert "Remove UntrackedValue channel"
- Revert "Remove
MessageGraph(#4875)" - fix(langgraph): remove deprecated
outputusage in favor ofoutput_schema(#5095) - refactor(langgraph): Remove
PregelNode's inheritance fromRunnable(#5093) - Remove support for node reading a single managed value
- PregelLoop: Simplify tick() method (#5080)
- serialize/deserialize pandas with pickle fallback (#5057)
- Remove code paths no longer needed
- Avoid saving checkpoints for subgraphs when checkpoint_during=False (#5051)
- Remove gitmcp badge (#5055)
- Avoid saving checkpoints for subgraphs when checkpoint_during=False
- Clean up things for Matt!
- Support numpy array serialization in JsonPlusSerializer (#5035)
- Update ormsgpack (#5034)
- deprecate
inputandoutputin favor ofinput_schemaandoutput_schema(#4983) - using StateT as default for InputT
- lint: use
pep 604union syntax andpep 585generic syntax (#4963) - docs: remove references to
StateGraph(dict)(#4964) - rename
retry->retry_policy(#4957) - Fix step_timeout causing ParentCommand/GraphInterrupt exception to bubble up
- docs: fix a grammar issue in multiple files (#4935)
- Make it possible to run test command without docker installed (#4948)
- Fix async callback manager tag handling (#4949)
- Pass tags when configuring async callback manager
- Allow same-name channels and nodes in StateGraph (#4944)
- Make it possible to run test command without docker installed
- docs: fix ensure_config docstring
- Allow same-name channels and nodes in StateGraph
- Improve type checking on graph
initandinvoke/stream(#4932) - docs: fix a grammar issue in multiple files
- Fix makefile command file for dev server - pidfile was always empty
- Fix Command(graph=PARENT) when used together w checkpointer=True
- Remove unused deprecation decorator/warning (#4917)
- Require
state_schemainStateGraph.__init__(#4897) - Remove add_conditional_edge(..., then=) (#4893)
- Avoid repeated runtime calls to get_type_hints
- Remove
MessageGraph(#4875) - Remove non-state Graph
- Remove UntrackedValue channel
- Remove UntrackedValue channel (#4859)
- Flip default for checkpoint_during
- Remove Channel node builder
- Update managed value usage in local_read (#4854)
- Modify stream mode messages and custom to respect subgraphs=False (#4843)
- Remove Checkpoint.writes (#4822)
- Remove Checkpoint.pending_sends (#4820)
- Pregel: Add NodeBuilder class to replace Channel.subscribe_to (#4819)
- Remove dict subclasses used for values/updates stream chunks (#4816)
- Remove old checkpoint test fixtures (#4814)
- Remove postgres shallow checkpointer (#4813)
- Remove ChannelsManager, ManagedValues are now static classes and never instantiated (#4812)
- Remove Context channel / managed value, Remove SharedValue (#4857)
- Pregel: Add NodeBuilder class to replace Channel.subscribe_to
- Remove old checkpoint test fixtures
- Remove postgres shallow checkpointer
- Remove ChannelsManager, ManagedValues are now static classes and never instantiated
- Remove Context channel / managed value, Remove SharedValue