Stock image illustrating data
OPERATOR READ · COVER · APR 27, 2026 · ISSUE LEAD
OPERATOR READ·Apr 27, 2026·6 MIN

LangGraph Cracks NotRequired Keys, Drags Langsmith Across a Version Line

The state-injection fix is the clean part. The 0.6.4-to-0.7.31 langsmith jump crossing a minor boundary is what deserves the audit pass before you pin.

Maya Bhatt·
OPERATOR READAPR 27, 2026 · MAYA BHATT

fix(prebuilt): handle injected NotRequired keys (#7392); chore(deps): bump langsmith from 0.6.4 to 0.7.31 in /libs/prebuilt (#7530)

LangChain GitHub — langchain-ai/langgraph release notes

What AutoKaam Thinks
  • The NotRequired fix resolves a real state-injection defect — TypedDict with optional fields in prebuilt agents now behaves correctly; verify your state schemas before pinning.
  • Langsmith crossed from 0.6.4 to 0.7.31 in a single dep PR, clearing a minor version boundary — six months of API surface changes arrive at once.
  • Checkpoint 4.0.2 ships alongside; if you run custom checkpointers, test compatibility before upgrading the prebuilt pin.
  • Metadata-only tracing (#7383) cuts trace noise without touching agent logic — the one additive win in an otherwise defensive release.
30.5k
GitHub stars
LANGGRAPH + LANGSMITH
Named stake

Point releases in a maintained framework are supposed to be the forgettable part of the job. You skim the changelog, see a handful of dep bumps and a chore entry or two, increment your lockfile, and move on before the build completes. LangGraph prebuilt 1.0.10, tagged April 17, looks like that release from a distance. Up close, there's one genuine defect fix and one dependency whose version number crossed a minor boundary in a single PR. The fix matters to anyone running TypedDict state injection in prebuilt agents. The dependency jump matters to anyone who hasn't thought carefully about what six months of langsmith API drift arriving at once actually costs.

What Shipped

The substance of 1.0.10 comes down to two entries in the changelog and one additive feature alongside them.

The first: a bug fix in the prebuilt layer for injected state keys typed as NotRequired (#7392). Python's typing module uses NotRequired[T] to mark a TypedDict key as optional, it may or may not be present in the dictionary at runtime, and consuming code is expected to handle the absent case gracefully. The prebuilt layer wasn't handling this correctly when those keys were part of injected state. The fix corrects that. If you've been hitting unexpected behavior in prebuilt agents where some state keys were conditionally present, this is the release to test.

The second: langsmith moves from 0.6.4 to 0.7.31 inside /libs/prebuilt (#7530). That's a minor version boundary crossed, 0.6.x to 0.7.x is a transition the langsmith maintainers marked with intentional interface changes. The 31 patch versions following 0.7.0 accumulated smaller fixes and additions on top. Your tracing code was written against the 0.6.x surface. Now it isn't.

Rounding out the release: langgraph core ships at 1.1.7, checkpoint lands at 4.0.2, and a new option lands for passing metadata exclusively for tracing purposes without that metadata touching agent runtime behavior (#7383). The project holds 30.5k stars and 5.2k forks as of this writing, not a toy, not a greenfield experiment.

[[IMG: a software engineer reviewing a Python TypedDict schema diff in a terminal, agent framework changelog open in a browser tab alongside]]

Why It Matters

The NotRequired fix is the kind of defect that lives in production longer than it should because its failure mode is subtle. When a TypedDict key is NotRequired and you're injecting state from outside the prebuilt, the error isn't always a loud exception. It can surface as state that's silently empty where it shouldn't be, or as a node receiving a dictionary that's shaped differently than its type annotation implies. Subtle state corruption in stateful agents is exactly the failure category that's hardest to catch in test suites and easiest to misattribute to business logic.

This is the recurring pattern with the prebuilt layer. LangGraph's core state model is deliberately flexible, typed reducers, union types, annotated fields. The prebuilt is a convenience layer that makes strong assumptions about that state model so you don't have to wire everything yourself. Every time the core's state expressiveness grows, the prebuilt has to catch up. The NotRequired case is one more catch-up pass. It won't be the last.

The langsmith jump is a different kind of signal. A dependency moving from 0.6.4 to 0.7.31 in a single maintenance PR suggests the prebuilt had been lagging behind the langsmith 0.7.x series for some time, possibly because the minor version boundary contained interface changes that needed validation before adoption. Whatever the cause, the result is the same: a large surface area of version history arrives in your environment simultaneously rather than incrementally. When you upgrade through minor versions one at a time, you absorb API changes in manageable pieces. When you receive the whole delta at once, the only way to know what changed is to read the langsmith changelog or run your test suite against it. Most teams haven't written the latter.

The metadata-only tracing feature deserves more attention than it typically gets in release summaries. Filtering what lands in your trace records at the call site is meaningfully better than filtering at the dashboard. It means your observability layer captures the right signal without the noise. For production agents that fire dense traces across many nodes, this is a quality-of-life change that reduces LangSmith costs and makes dashboards readable.

What to Migrate

Upgrading to prebuilt 1.0.10 is a three-pass process. Run each pass before touching your shared environments.

Pass 1: Audit state schemas for NotRequired keys. The fix in #7392 corrects the behavior, which means agents using this pattern will behave differently after the upgrade. That's the right outcome, but it means runtime semantics change for affected agents. Before pinning, find every TypedDict definition that includes NotRequired fields and trace how that state is injected. A simple grep surfaces the candidates:

grep -r "NotRequired" src/ --include="*.py" -l

For each file returned, verify the injection logic against the corrected behavior. This is a one-time pass and it's mechanical, but skip it and you're flying blind on what changed.

Pass 2: Test langsmith 0.7.31 compatibility. This is the pass where surprises live. The 0.6-to-0.7 transition in langsmith is a minor version boundary with intentional API changes. Before upgrading your main environment, create an isolated environment, install prebuilt 1.0.10, and run your tracing integration tests:

python -m venv .venv-upgrade && source .venv-upgrade/bin/activate
pip install "langgraph-prebuilt==1.0.10"
python -m pytest tests/tracing/ -v

If you don't have tracing integration tests, write the minimal version now, a test that submits a trace to LangSmith and confirms it arrives with the expected keys. Four lines. The alternative is discovering the break in production.

Do not pin langsmith independently in your requirements file at a version below what prebuilt 1.0.10 requires. Version conflicts between prebuilt's transitive pin and a direct pin in the same environment are the follow-on failure mode.

Pass 3: Checkpoint compatibility check. Checkpoint 4.0.2 ships alongside this release. If you're using the default in-memory checkpointer, no action needed. If you're running a custom checkpointer backed by Redis, Postgres, or a local SQLite store, verify it against the new checkpoint version before upgrading. The patch bump number makes breaking changes unlikely, but "unlikely" is not "impossible" and custom checkpointer code is often the least-tested surface in an agent stack.

The minor version boundary in langsmith is the real upgrade cost here, a two-line dep bump can carry six months of API drift, and your tracing code was written against the old surface.

Pin only after all three passes clear. Treat the lockfile as production infrastructure.

[[IMG: an engineering lead at a standing desk running a pytest suite in a terminal, tracing integration test output scrolling, a second monitor showing a LangSmith trace dashboard]]

Looking Ahead

Watch the langsmith 0.7.x tracking cadence over the next two months. If the prebuilt library was this conservative about adopting the 0.7.x series, the version management model for this dependency has a structural gap. Either the prebuilt starts tracking langsmith more tightly, or teams can expect to keep absorbing large version batches at unpredictable intervals. Neither option is great.

The signal to watch is simple: does the next prebuilt release pin langsmith at 0.7.32 or 0.7.35, indicating tight tracking from here? Or does it hold at 0.7.31 for three more releases before jumping again? The former means the lag was a one-time catch-up. The latter means it's a pattern. Twelve weeks from now, check the prebuilt changelog against the langsmith release history and count the gap.

Sources