mirror of
https://github.com/langchain-ai/langgraph.git
synced 2026-09-11 04:07:52 +02:00
1.2.5
2101
Commits
| Author | SHA1 | Message | Date | |
|---|---|---|---|---|
|
|
7ab79f9f3e | release(langgraph): 1.2.5 (#8062) | ||
|
|
385033fd9c |
fix(langgraph): merge lc_versions config metadata (#8052)
Preserve LangChain package-version trace metadata when graph-bound config and invoke-time config both contribute `lc_versions`. The earlier broad nested metadata merge has been narrowed to the LangChain-owned `lc_versions` namespace, so arbitrary user metadata keeps the existing last-writer-wins behavior. ## Changes - Add a shared metadata merge path used by `merge_configs()` and `ensure_config()` so top-level metadata keys are preserved across bound and runtime configs. - Special-case only `metadata["lc_versions"]` for one-level package-version accumulation; duplicate package entries remain last-writer-wins and non-mapping values still replace. - Keep generic nested metadata maps, including user-owned `metadata["versions"]`, as replacement-only to avoid changing arbitrary metadata semantics. - Raise the `langchain-core` lower bound to `>=1.4.7` so LangGraph’s `lc_versions` handling aligns with the lc-core package-version instrumentation. - Cover both config merge helpers with tests for `lc_versions` accumulation, non-recursive replacement within the package map, generic nested metadata replacement, and defensive copying of mapping values. ## Test note The stream event assertions for `test_imp_exception` now avoid depending on leaked internal task-path metadata. With older `langchain-core`, callback metadata could be mutated by later task runs, so every task event in this test appeared to have the final task path index. That made even the `task_with_exception` start event report `metadata["langgraph_node"] == "my_task"`, which is inconsistent with the event name. `langchain-core>=1.4.6` preserves per-event metadata more accurately: the first `my_task`, `task_with_exception`, and second `my_task` report distinct task path indexes. The test now asserts the stable behavior instead: event sequence, tags, required metadata, root stream payloads, exception handling, and final outputs, without requiring the old leaked task index. |
||
|
|
f0e814796b |
release(cli): 0.4.28 (#8041)
Bumping the version to support langgraph-api stable versions 0.10.0, 0.11.0rcX and 0.12.0.devY releases. |
||
|
|
d57a74f950 |
fix: updateState bug for deltaChannel on empty thread (#8011)
Fixes langchain-ai/deepagents#3774 ## Summary `Pregel.update_state` / `aupdate_state` on a fresh thread silently dropped the first write to a `DeltaChannel`-backed channel (e.g. `DeepAgentState.messages`). This PR persists the first write under a lazily-created stub checkpoint so the read-path ancestor walk can replay it. ## Root cause `DeltaChannel` reads its value back by walking ancestor checkpoints and replaying writes attached to them — non-snapshot steps don't store the value in `channel_values`. In `bulk_update_state` the channel writes were only persisted via `checkpointer.put_writes(...)` when a previous checkpoint existed: ```python channel_writes = [w for w in task.writes if w[0] != PUSH] if saved and channel_writes: checkpointer.put_writes(checkpoint_config, channel_writes, task_id) ``` On a fresh thread `saved is None`, so the `if saved` guard skipped persistence entirely. `create_checkpoint` then bumped the channel version but stored neither a value nor replayable writes, so reads returned `[]`. ## Fix In both `bulk_update_state` (sync) and `abulk_update_state` (async), when the thread has no persisted parent **and** at least one write targets a `DeltaChannel`, lazily persist an empty stub checkpoint and use it as the parent for both the channel writes and the new update checkpoint. Mirrors the existing exit-mode pattern in `_loop._put_exit_delta_writes`. The behavior for non-delta writes on a fresh thread is preserved (skip `put_writes` — values are stored directly in the new checkpoint's `channel_values`), so non-delta `update_state` paths add no extra checkpoint rows. ## Test coverage New tests in `libs/langgraph/tests/test_delta_channel_update_state.py` (9 tests, sync + async): - **Fresh-thread regression** (the bug): single `update_state` writes a message and reads back via `get_state`. Without the fix, both sync and async fail with `assert [] == ['hello']`. - **`update_state` after `invoke`**: pins down the previously-working non-fresh-thread path so the lazy-stub change doesn't regress it. - **Consecutive `update_state`s**: second call sees a real parent (`saved is not None`) and takes the original write path; both messages round-trip in chronological order. - **Update-by-id end-to-end via `update_state`**: `_messages_delta_reducer`'s dedup-by-id semantics work through the `update_state` path, not just `invoke`. - **`bulk_update_state` with multiple per-superstep updates**: locks in the per-task `put_writes` loop so all task writes persist (not just the last task's). - **State-history chain shape**: validates the lazy stub via the public API — `get_state_history` returns `[update_checkpoint, stub]` where the stub has `source='update'`, `step=-1`, no parent, and the update checkpoint's `parent_config` points at the stub. ## Verification - All 9 tests in `tests/test_delta_channel_update_state.py` pass. - All 4 existing delta-channel suites pass (`test_delta_channel_exit_mode.py`, `test_delta_channel_migration.py`, `test_delta_channel_id_stability.py`, `test_delta_channel_supersteps_bound.py` — 30 tests, 39 total with the new file). - All `update_state`-related tests across `test_pregel`, `test_pregel_async`, `test_time_travel`, `test_time_travel_async` pass (10 tests). - `make format`, `make lint`, full `make test` pass locally in `libs/langgraph`. --------- Co-authored-by: Cursor <cursoragent@cursor.com> |
||
|
|
2b1abc807b |
chore: migrate Python type checking to ty (#8002)
## Summary - replace Python lint type-checking from mypy to ty across LangGraph packages - remove mypy config/cache wiring and mypy-only references - regenerate uv locks with ty 0.0.43 ## Verification - git diff --check - make lint_package && make lint_tests in libs/langgraph - make lint_package && make lint_tests in libs/checkpoint - make lint_package && make lint_tests in libs/checkpoint-sqlite - make lint_package && make lint_tests in libs/checkpoint-postgres - make lint_package && make lint_tests in libs/prebuilt - make lint_package && make lint_tests in libs/cli - make lint in libs/sdk-py - make lint in libs/checkpoint-conformance --------- Co-authored-by: Claude <noreply@anthropic.com> Co-authored-by: open-swe[bot] <215916821+open-swe[bot]@users.noreply.github.com> |
||
|
|
f52dd90756 |
chore(deps-dev): bump types-requests from 2.33.0.20260408 to 2.33.0.20260518 in /libs/langgraph (#7977)
Bumps [types-requests](https://github.com/python/typeshed) from 2.33.0.20260408 to 2.33.0.20260518. <details> <summary>Commits</summary> <ul> <li>See full diff in <a href="https://github.com/python/typeshed/commits">compare view</a></li> </ul> </details> <br /> [](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) --- <details> <summary>Dependabot commands and options</summary> <br /> You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot show <dependency name> ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself) </details> Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> |
||
|
|
0eeef4b13e |
chore(deps): bump the minor-and-patch group in /libs/langgraph with 14 updates (#7975)
Bumps the minor-and-patch group in /libs/langgraph with 14 updates: | Package | From | To | | --- | --- | --- | | [pydantic](https://github.com/pydantic/pydantic) | `2.13.3` | `2.13.4` | | [syrupy](https://github.com/syrupy-project/syrupy) | `5.1.0` | `5.3.1` | | [ruff](https://github.com/astral-sh/ruff) | `0.15.12` | `0.15.15` | | [psycopg-binary](https://github.com/psycopg/psycopg) | `3.3.2` | `3.3.4` | | [ormsgpack](https://github.com/ormsgpack/ormsgpack) | `1.12.1` | `1.12.2` | | [sqlite-vec](https://TODO.com) | `0.1.6` | `0.1.9` | | [orjson](https://github.com/ijl/orjson) | `3.11.6` | `3.11.9` | | [psycopg](https://github.com/psycopg/psycopg) | `3.3.2` | `3.3.4` | | [psycopg-pool](https://github.com/psycopg/psycopg) | `3.3.0` | `3.3.1` | | [anyio](https://github.com/agronholm/anyio) | `4.12.1` | `4.13.0` | | [langchain-protocol](https://github.com/langchain-ai/agent-protocol) | `0.0.15` | `0.0.16` | | [ty](https://github.com/astral-sh/ty) | `0.0.33` | `0.0.42` | | [click](https://github.com/pallets/click) | `8.3.1` | `8.4.1` | | [pathspec](https://github.com/cpburnz/python-pathspec) | `1.0.3` | `1.1.1` | Updates `pydantic` from 2.13.3 to 2.13.4 <details> <summary>Release notes</summary> <p><em>Sourced from <a href="https://github.com/pydantic/pydantic/releases">pydantic's releases</a>.</em></p> <blockquote> <h2>v2.13.4 2026-05-06</h2> <h2>v2.13.4 (2026-05-06)</h2> <h3>What's Changed</h3> <h4>Packaging</h4> <ul> <li>Bump libc from 0.2.155 to 0.2.185 by <a href="https://github.com/Viicos"><code>@Viicos</code></a> in <a href="https://redirect.github.com/pydantic/pydantic/pull/13109">#13109</a></li> <li>Adapt <code>pydantic-core</code> linker flags on macOS by <a href="https://github.com/washingtoneg"><code>@washingtoneg</code></a> and <a href="https://github.com/Viicos"><code>@Viicos</code></a> in <a href="https://redirect.github.com/pydantic/pydantic/pull/13147">#13147</a></li> </ul> <h4>Fixes</h4> <ul> <li>Preserve <code>RootModel</code> core metadata by <a href="https://github.com/Viicos"><code>@Viicos</code></a> in <a href="https://redirect.github.com/pydantic/pydantic/pull/13129">#13129</a></li> </ul> <p><strong>Full Changelog</strong>: <a href="https://github.com/pydantic/pydantic/compare/v2.13.3...v2.13.4">https://github.com/pydantic/pydantic/compare/v2.13.3...v2.13.4</a></p> </blockquote> </details> <details> <summary>Changelog</summary> <p><em>Sourced from <a href="https://github.com/pydantic/pydantic/blob/main/HISTORY.md">pydantic's changelog</a>.</em></p> <blockquote> <h2>v2.13.4 (2026-05-06)</h2> <p><a href="https://github.com/pydantic/pydantic/releases/tag/v2.13.4">GitHub release</a></p> <h3>What's Changed</h3> <h4>Packaging</h4> <ul> <li>Bump libc from 0.2.155 to 0.2.185 by <a href="https://github.com/Viicos"><code>@Viicos</code></a> in <a href="https://redirect.github.com/pydantic/pydantic/pull/13109">#13109</a></li> <li>Adapt <code>pydantic-core</code> linker flags on macOS by <a href="https://github.com/washingtoneg"><code>@washingtoneg</code></a> and <a href="https://github.com/Viicos"><code>@Viicos</code></a> in <a href="https://redirect.github.com/pydantic/pydantic/pull/13147">#13147</a></li> </ul> <h4>Fixes</h4> <ul> <li>Preserve <code>RootModel</code> core metadata by <a href="https://github.com/Viicos"><code>@Viicos</code></a> in <a href="https://redirect.github.com/pydantic/pydantic/pull/13129">#13129</a></li> </ul> </blockquote> </details> <details> <summary>Commits</summary> <ul> <li><a href="https://github.com/pydantic/pydantic/commit/cf67d4b3193c3fe43ede18612ed62785eee11382"><code>cf67d4b</code></a> Fix linting</li> <li><a href="https://github.com/pydantic/pydantic/commit/f0d8a214a5803036db46a56b1f62f1e56b81d662"><code>f0d8a21</code></a> Prepare release v2.13.4</li> <li><a href="https://github.com/pydantic/pydantic/commit/5e3fe1d41a00f441204241c66078003ae0391f9a"><code>5e3fe1d</code></a> Check for pydantic tag pattern in CI</li> <li><a href="https://github.com/pydantic/pydantic/commit/7f9edcc2a191d2eaa9751220eb910914e716a686"><code>7f9edcc</code></a> Document tagging conventions</li> <li><a href="https://github.com/pydantic/pydantic/commit/b46a0c9b8a4dd967fda8ec1a92f6437076bf262c"><code>b46a0c9</code></a> Adapt <code>pydantic-core</code> linker flags on macOS</li> <li><a href="https://github.com/pydantic/pydantic/commit/50629c851e61d887d5420452c311ec6203f1f400"><code>50629c8</code></a> Update to PyPy 7.3.22</li> <li><a href="https://github.com/pydantic/pydantic/commit/8522ebb71e5e9a6f7188af5f009f01785b8cf725"><code>8522ebb</code></a> Preserve <code>RootModel</code> core metadata</li> <li><a href="https://github.com/pydantic/pydantic/commit/a37f3aff090ca342dc5f48304889963530b993f8"><code>a37f3af</code></a> Adapt <code>MISSING</code> sentinel test to work with unreleased <code>typing_extensions</code> ver...</li> <li><a href="https://github.com/pydantic/pydantic/commit/909259a9df660518033aa686b689f045a6eaf9d2"><code>909259a</code></a> Remove Logfire example in documentation</li> <li><a href="https://github.com/pydantic/pydantic/commit/2c4174c366606fc2dc46cb806833a080aefa77df"><code>2c4174c</code></a> Bump libc from 0.2.155 to 0.2.185</li> <li>See full diff in <a href="https://github.com/pydantic/pydantic/compare/v2.13.3...v2.13.4">compare view</a></li> </ul> </details> <br /> Updates `syrupy` from 5.1.0 to 5.3.1 <details> <summary>Release notes</summary> <p><em>Sourced from <a href="https://github.com/syrupy-project/syrupy/releases">syrupy's releases</a>.</em></p> <blockquote> <h2>v5.3.1</h2> <h2>What's Changed</h2> <h3>Fixes</h3> <ul> <li>fix(test): mark pydantic and attrs as dependencies for running internal tests by <a href="https://github.com/noahnu"><code>@noahnu</code></a> in <a href="https://redirect.github.com/syrupy-project/syrupy/pull/1108">syrupy-project/syrupy#1108</a> -- <strong>This only affects users trying to run the syrupy tests themselves, not consumers of syrupy.</strong></li> </ul> <h3>Misc</h3> <ul> <li>chore(deps): update astral-sh/setup-uv action to v8.1.0 by <a href="https://github.com/renovate"><code>@renovate</code></a>[bot] in <a href="https://redirect.github.com/syrupy-project/syrupy/pull/1103">syrupy-project/syrupy#1103</a></li> <li>chore(deps): update python docker tag to v3.14.4 by <a href="https://github.com/renovate"><code>@renovate</code></a>[bot] in <a href="https://redirect.github.com/syrupy-project/syrupy/pull/1102">syrupy-project/syrupy#1102</a></li> <li>chore(deps): update benchmark-action/github-action-benchmark action to v1.22.1 by <a href="https://github.com/renovate"><code>@renovate</code></a>[bot] in <a href="https://redirect.github.com/syrupy-project/syrupy/pull/1105">syrupy-project/syrupy#1105</a></li> </ul> <p><strong>Full Changelog</strong>: <a href="https://github.com/syrupy-project/syrupy/compare/v5.3.0...v5.3.1">https://github.com/syrupy-project/syrupy/compare/v5.3.0...v5.3.1</a></p> <h2>v5.3.0</h2> <h2>What's Changed</h2> <h3>Features</h3> <ul> <li>feat: add --snapshot-update-new-only flag (<a href="https://redirect.github.com/syrupy-project/syrupy/issues/843">#843</a>) by <a href="https://github.com/SAY-5"><code>@SAY-5</code></a> in <a href="https://redirect.github.com/syrupy-project/syrupy/pull/1098">syrupy-project/syrupy#1098</a></li> </ul> <h3>Misc.</h3> <ul> <li>chore: move release marker by <a href="https://github.com/noahnu"><code>@noahnu</code></a> in <a href="https://redirect.github.com/syrupy-project/syrupy/pull/1095">syrupy-project/syrupy#1095</a></li> <li>chore(deps): update codecov/codecov-action action to v5.5.4 by <a href="https://github.com/renovate"><code>@renovate</code></a>[bot] in <a href="https://redirect.github.com/syrupy-project/syrupy/pull/1089">syrupy-project/syrupy#1089</a></li> <li>chore(deps): update dependency pytest to v9.0.3 by <a href="https://github.com/renovate"><code>@renovate</code></a>[bot] in <a href="https://redirect.github.com/syrupy-project/syrupy/pull/1096">syrupy-project/syrupy#1096</a></li> <li>fix: include tests in sdist by <a href="https://github.com/Lovlace777"><code>@Lovlace777</code></a> in <a href="https://redirect.github.com/syrupy-project/syrupy/pull/1099">syrupy-project/syrupy#1099</a></li> <li>chore: skip benchmark on forks by <a href="https://github.com/noahnu"><code>@noahnu</code></a> in <a href="https://redirect.github.com/syrupy-project/syrupy/pull/1100">syrupy-project/syrupy#1100</a></li> <li>chore: update dev dependencies by <a href="https://github.com/noahnu"><code>@noahnu</code></a> in <a href="https://redirect.github.com/syrupy-project/syrupy/pull/1101">syrupy-project/syrupy#1101</a></li> </ul> <h2>New Contributors</h2> <ul> <li><a href="https://github.com/Lovlace777"><code>@Lovlace777</code></a> made their first contribution in <a href="https://redirect.github.com/syrupy-project/syrupy/pull/1099">syrupy-project/syrupy#1099</a></li> <li><a href="https://github.com/SAY-5"><code>@SAY-5</code></a> made their first contribution in <a href="https://redirect.github.com/syrupy-project/syrupy/pull/1098">syrupy-project/syrupy#1098</a></li> </ul> <p><strong>Full Changelog</strong>: <a href="https://github.com/syrupy-project/syrupy/compare/v5.2.0...v5.3.0">https://github.com/syrupy-project/syrupy/compare/v5.2.0...v5.3.0</a></p> <h2>v5.2.0</h2> <h2>What's Changed</h2> <ul> <li>chore(deps): update actions/checkout action to v6.0.2 by <a href="https://github.com/renovate"><code>@renovate</code></a>[bot] in <a href="https://redirect.github.com/syrupy-project/syrupy/pull/1065">syrupy-project/syrupy#1065</a></li> <li>chore(deps): update actions/setup-python action to v6.2.0 by <a href="https://github.com/renovate"><code>@renovate</code></a>[bot] in <a href="https://redirect.github.com/syrupy-project/syrupy/pull/1066">syrupy-project/syrupy#1066</a></li> <li>chore(deps): update dependency ruff to v0.14.14 by <a href="https://github.com/renovate"><code>@renovate</code></a>[bot] in <a href="https://redirect.github.com/syrupy-project/syrupy/pull/1067">syrupy-project/syrupy#1067</a></li> <li>chore(deps): update dependency coverage to v7.13.2 by <a href="https://github.com/renovate"><code>@renovate</code></a>[bot] in <a href="https://redirect.github.com/syrupy-project/syrupy/pull/1068">syrupy-project/syrupy#1068</a></li> <li>chore: migrate to uv, close <a href="https://redirect.github.com/syrupy-project/syrupy/issues/1019">#1019</a> by <a href="https://github.com/noahnu"><code>@noahnu</code></a> in <a href="https://redirect.github.com/syrupy-project/syrupy/pull/1049">syrupy-project/syrupy#1049</a></li> <li>chore(deps): update dependency coverage to v7.13.2 by <a href="https://github.com/renovate"><code>@renovate</code></a>[bot] in <a href="https://redirect.github.com/syrupy-project/syrupy/pull/1069">syrupy-project/syrupy#1069</a></li> <li>chore(deps): update dependency debugpy to v1.8.19 by <a href="https://github.com/renovate"><code>@renovate</code></a>[bot] in <a href="https://redirect.github.com/syrupy-project/syrupy/pull/1070">syrupy-project/syrupy#1070</a></li> <li>chore(deps): update dependency mypy to v1.19.1 by <a href="https://github.com/renovate"><code>@renovate</code></a>[bot] in <a href="https://redirect.github.com/syrupy-project/syrupy/pull/1071">syrupy-project/syrupy#1071</a></li> <li>chore(deps): update dependency ruff to v0.14.14 by <a href="https://github.com/renovate"><code>@renovate</code></a>[bot] in <a href="https://redirect.github.com/syrupy-project/syrupy/pull/1072">syrupy-project/syrupy#1072</a></li> </ul> <!-- raw HTML omitted --> </blockquote> <p>... (truncated)</p> </details> <details> <summary>Changelog</summary> <p><em>Sourced from <a href="https://github.com/syrupy-project/syrupy/blob/main/CHANGELOG.md">syrupy's changelog</a>.</em></p> <blockquote> <h2><a href="https://github.com/syrupy-project/syrupy/releases/tag/v5.3.1">v5.3.1</a> (2026-05-31)</h2> <h2>What's Changed</h2> <h3>Fixes</h3> <ul> <li>fix(test): mark pydantic and attrs as dependencies for running internal tests by <a href="https://github.com/noahnu"><code>@noahnu</code></a> in <a href="https://redirect.github.com/syrupy-project/syrupy/pull/1108">syrupy-project/syrupy#1108</a> -- <strong>This only affects users trying to run the syrupy tests themselves, not consumers of syrupy.</strong></li> </ul> <h3>Misc</h3> <ul> <li>chore(deps): update astral-sh/setup-uv action to v8.1.0 by <a href="https://github.com/renovate"><code>@renovate</code></a>[bot] in <a href="https://redirect.github.com/syrupy-project/syrupy/pull/1103">syrupy-project/syrupy#1103</a></li> <li>chore(deps): update python docker tag to v3.14.4 by <a href="https://github.com/renovate"><code>@renovate</code></a>[bot] in <a href="https://redirect.github.com/syrupy-project/syrupy/pull/1102">syrupy-project/syrupy#1102</a></li> <li>chore(deps): update benchmark-action/github-action-benchmark action to v1.22.1 by <a href="https://github.com/renovate"><code>@renovate</code></a>[bot] in <a href="https://redirect.github.com/syrupy-project/syrupy/pull/1105">syrupy-project/syrupy#1105</a></li> </ul> <p><strong>Full Changelog</strong>: <a href="https://github.com/syrupy-project/syrupy/compare/v5.3.0...v5.3.1">https://github.com/syrupy-project/syrupy/compare/v5.3.0...v5.3.1</a></p> <h2><a href="https://github.com/syrupy-project/syrupy/releases/tag/v5.3.0">v5.3.0</a> (2026-05-31)</h2> <h2>What's Changed</h2> <h3>Features</h3> <ul> <li>feat: add --snapshot-update-new-only flag (<a href="https://redirect.github.com/syrupy-project/syrupy/issues/843">#843</a>) by <a href="https://github.com/SAY-5"><code>@SAY-5</code></a> in <a href="https://redirect.github.com/syrupy-project/syrupy/pull/1098">syrupy-project/syrupy#1098</a></li> </ul> <h3>Misc.</h3> <ul> <li>chore: move release marker by <a href="https://github.com/noahnu"><code>@noahnu</code></a> in <a href="https://redirect.github.com/syrupy-project/syrupy/pull/1095">syrupy-project/syrupy#1095</a></li> <li>chore(deps): update codecov/codecov-action action to v5.5.4 by <a href="https://github.com/renovate"><code>@renovate</code></a>[bot] in <a href="https://redirect.github.com/syrupy-project/syrupy/pull/1089">syrupy-project/syrupy#1089</a></li> <li>chore(deps): update dependency pytest to v9.0.3 by <a href="https://github.com/renovate"><code>@renovate</code></a>[bot] in <a href="https://redirect.github.com/syrupy-project/syrupy/pull/1096">syrupy-project/syrupy#1096</a></li> <li>fix: include tests in sdist by <a href="https://github.com/Lovlace777"><code>@Lovlace777</code></a> in <a href="https://redirect.github.com/syrupy-project/syrupy/pull/1099">syrupy-project/syrupy#1099</a></li> <li>chore: skip benchmark on forks by <a href="https://github.com/noahnu"><code>@noahnu</code></a> in <a href="https://redirect.github.com/syrupy-project/syrupy/pull/1100">syrupy-project/syrupy#1100</a></li> <li>chore: update dev dependencies by <a href="https://github.com/noahnu"><code>@noahnu</code></a> in <a href="https://redirect.github.com/syrupy-project/syrupy/pull/1101">syrupy-project/syrupy#1101</a></li> </ul> <h2>New Contributors</h2> <ul> <li><a href="https://github.com/Lovlace777"><code>@Lovlace777</code></a> made their first contribution in <a href="https://redirect.github.com/syrupy-project/syrupy/pull/1099">syrupy-project/syrupy#1099</a></li> <li><a href="https://github.com/SAY-5"><code>@SAY-5</code></a> made their first contribution in <a href="https://redirect.github.com/syrupy-project/syrupy/pull/1098">syrupy-project/syrupy#1098</a></li> </ul> <p><strong>Full Changelog</strong>: <a href="https://github.com/syrupy-project/syrupy/compare/v5.2.0...v5.3.0">https://github.com/syrupy-project/syrupy/compare/v5.2.0...v5.3.0</a></p> <h2><a href="https://github.com/syrupy-project/syrupy/releases/tag/v5.2.0">v5.2.0</a> (2026-05-16)</h2> <h2>What's Changed</h2> <ul> <li>chore(deps): update actions/checkout action to v6.0.2 by <a href="https://github.com/renovate"><code>@renovate</code></a>[bot] in <a href="https://redirect.github.com/syrupy-project/syrupy/pull/1065">syrupy-project/syrupy#1065</a></li> <li>chore(deps): update actions/setup-python action to v6.2.0 by <a href="https://github.com/renovate"><code>@renovate</code></a>[bot] in <a href="https://redirect.github.com/syrupy-project/syrupy/pull/1066">syrupy-project/syrupy#1066</a></li> <li>chore(deps): update dependency ruff to v0.14.14 by <a href="https://github.com/renovate"><code>@renovate</code></a>[bot] in <a href="https://redirect.github.com/syrupy-project/syrupy/pull/1067">syrupy-project/syrupy#1067</a></li> <li>chore(deps): update dependency coverage to v7.13.2 by <a href="https://github.com/renovate"><code>@renovate</code></a>[bot] in <a href="https://redirect.github.com/syrupy-project/syrupy/pull/1068">syrupy-project/syrupy#1068</a></li> <li>chore: migrate to uv, close <a href="https://redirect.github.com/syrupy-project/syrupy/issues/1019">#1019</a> by <a href="https://github.com/noahnu"><code>@noahnu</code></a> in <a href="https://redirect.github.com/syrupy-project/syrupy/pull/1049">syrupy-project/syrupy#1049</a></li> <li>chore(deps): update dependency coverage to v7.13.2 by <a href="https://github.com/renovate"><code>@renovate</code></a>[bot] in <a href="https://redirect.github.com/syrupy-project/syrupy/pull/1069">syrupy-project/syrupy#1069</a></li> </ul> <!-- raw HTML omitted --> </blockquote> <p>... (truncated)</p> </details> <details> <summary>Commits</summary> <ul> <li><a href="https://github.com/syrupy-project/syrupy/commit/c528216d5fa53517f9df34f49db55d3e455377c9"><code>c528216</code></a> fix(test): mark pydantic and attrs as dependencies for running internal tests...</li> <li><a href="https://github.com/syrupy-project/syrupy/commit/32b9ccb6d2da49b91e3052e33b9e1e208963bf55"><code>32b9ccb</code></a> chore(deps): update benchmark-action/github-action-benchmark action to v1.22....</li> <li><a href="https://github.com/syrupy-project/syrupy/commit/520f813ebf7f5c61bc45564b750cbfa836df0f2f"><code>520f813</code></a> chore(deps): update python docker tag to v3.14.4 (<a href="https://redirect.github.com/syrupy-project/syrupy/issues/1102">#1102</a>)</li> <li><a href="https://github.com/syrupy-project/syrupy/commit/9ad6eb48c90cadf3f1e13705414a612eed72637f"><code>9ad6eb4</code></a> chore(deps): update astral-sh/setup-uv action to v8.1.0 (<a href="https://redirect.github.com/syrupy-project/syrupy/issues/1103">#1103</a>)</li> <li><a href="https://github.com/syrupy-project/syrupy/commit/06c5ab4688ad816ef50c320f764f20e53ea89ae5"><code>06c5ab4</code></a> chore(release): 5.3.0 [skip ci]</li> <li><a href="https://github.com/syrupy-project/syrupy/commit/5887f25a02e6bb6d0b2b0cd9853d86c259345f1c"><code>5887f25</code></a> chore: update dev dependencies (<a href="https://redirect.github.com/syrupy-project/syrupy/issues/1101">#1101</a>)</li> <li><a href="https://github.com/syrupy-project/syrupy/commit/2daa56e2b74f7ed1b3e74086d9509ac7454a41be"><code>2daa56e</code></a> feat: add --snapshot-update-new-only flag (<a href="https://redirect.github.com/syrupy-project/syrupy/issues/843">#843</a>) (<a href="https://redirect.github.com/syrupy-project/syrupy/issues/1098">#1098</a>)</li> <li><a href="https://github.com/syrupy-project/syrupy/commit/61c4e07e7a710270c4ebc3435652bc7d945fc60c"><code>61c4e07</code></a> chore: skip benchmark on forks (<a href="https://redirect.github.com/syrupy-project/syrupy/issues/1100">#1100</a>)</li> <li><a href="https://github.com/syrupy-project/syrupy/commit/a4880a798e64546118c4afc4e1b655cf1ea17cb2"><code>a4880a7</code></a> fix: include tests in sdist (<a href="https://redirect.github.com/syrupy-project/syrupy/issues/1099">#1099</a>)</li> <li><a href="https://github.com/syrupy-project/syrupy/commit/719a71ab83f94119072d5db79568b90b0455a7a1"><code>719a71a</code></a> chore(deps): update dependency pytest to v9.0.3 (<a href="https://redirect.github.com/syrupy-project/syrupy/issues/1096">#1096</a>)</li> <li>Additional commits viewable in <a href="https://github.com/syrupy-project/syrupy/compare/v5.1.0...v5.3.1">compare view</a></li> </ul> </details> <br /> Updates `ruff` from 0.15.12 to 0.15.15 <details> <summary>Release notes</summary> <p><em>Sourced from <a href="https://github.com/astral-sh/ruff/releases">ruff's releases</a>.</em></p> <blockquote> <h2>0.15.15</h2> <h2>Release Notes</h2> <p>Released on 2026-05-28.</p> <h3>Preview features</h3> <ul> <li>Fix Markdown closing fence handling (<a href="https://redirect.github.com/astral-sh/ruff/pull/25310">#25310</a>)</li> <li>[<code>pyflakes</code>] Report duplicate imports in <code>typing.TYPE_CHECKING</code> block (<code>F811</code>) (<a href="https://redirect.github.com/astral-sh/ruff/pull/22560">#22560</a>)</li> </ul> <h3>Bug fixes</h3> <ul> <li>[<code>pyflakes</code>] Treat function-scope bare annotations as locals per PEP 526 (<code>F821</code>) (<a href="https://redirect.github.com/astral-sh/ruff/pull/21540">#21540</a>)</li> </ul> <h3>Performance</h3> <ul> <li>Avoid redundant <code>TokenValue</code> drops in the lexer (<a href="https://redirect.github.com/astral-sh/ruff/pull/25300">#25300</a>)</li> <li>Reduce memory usage by dropping token-excess capacity and improve performance by approximating the initial tokens <code>Vec</code> size (<a href="https://redirect.github.com/astral-sh/ruff/pull/25354">#25354</a>)</li> <li>Use <code>ThinVec</code> in AST to shrink <code>Stmt</code> (<a href="https://redirect.github.com/astral-sh/ruff/pull/25361">#25361</a>)</li> </ul> <h3>Documentation</h3> <ul> <li>Fix <code>line-length</code> example for <code>--config</code> option (<a href="https://redirect.github.com/astral-sh/ruff/pull/25389">#25389</a>)</li> <li>[<code>flake8-comprehensions</code>] Document <code>RecursionError</code> edge case in <code>__len__</code> (<code>C416</code>) (<a href="https://redirect.github.com/astral-sh/ruff/pull/25286">#25286</a>)</li> <li>[<code>mccabe</code>] Improve example (<code>C901</code>) (<a href="https://redirect.github.com/astral-sh/ruff/pull/25287">#25287</a>)</li> <li>[<code>pyupgrade</code>] Clarify fix safety docs (<code>UP007</code>, <code>UP045</code>) (<a href="https://redirect.github.com/astral-sh/ruff/pull/25288">#25288</a>)</li> <li>[<code>refurb</code>] Document <code>FURB192</code> exception change for empty sequences (<a href="https://redirect.github.com/astral-sh/ruff/pull/25317">#25317</a>)</li> <li>[<code>ruff</code>] Document false negative for user-defined types (<code>RUF013</code>) (<a href="https://redirect.github.com/astral-sh/ruff/pull/25289">#25289</a>)</li> </ul> <h3>Formatter</h3> <ul> <li>Fix formatting of lambdas nested within f-strings (<a href="https://redirect.github.com/astral-sh/ruff/pull/25398">#25398</a>)</li> </ul> <h3>Server</h3> <ul> <li>Return code action for <code>codeAction/resolve</code> requests that contain no or no valid URL (<a href="https://redirect.github.com/astral-sh/ruff/pull/25365">#25365</a>)</li> </ul> <h3>Other changes</h3> <ul> <li>Expand semantic syntax errors for invalid walruses (<a href="https://redirect.github.com/astral-sh/ruff/pull/25415">#25415</a>)</li> </ul> <h3>Contributors</h3> <ul> <li><a href="https://github.com/chirizxc"><code>@chirizxc</code></a></li> <li><a href="https://github.com/ntBre"><code>@ntBre</code></a></li> <li><a href="https://github.com/adityasingh2400"><code>@adityasingh2400</code></a></li> <li><a href="https://github.com/charliermarsh"><code>@charliermarsh</code></a></li> <li><a href="https://github.com/fallintoplace"><code>@fallintoplace</code></a></li> <li><a href="https://github.com/martin-schlossarek"><code>@martin-schlossarek</code></a></li> <li><a href="https://github.com/MichaReiser"><code>@MichaReiser</code></a></li> </ul> <!-- raw HTML omitted --> </blockquote> <p>... (truncated)</p> </details> <details> <summary>Changelog</summary> <p><em>Sourced from <a href="https://github.com/astral-sh/ruff/blob/main/CHANGELOG.md">ruff's changelog</a>.</em></p> <blockquote> <h2>0.15.15</h2> <p>Released on 2026-05-28.</p> <h3>Preview features</h3> <ul> <li>Fix Markdown closing fence handling (<a href="https://redirect.github.com/astral-sh/ruff/pull/25310">#25310</a>)</li> <li>[<code>pyflakes</code>] Report duplicate imports in <code>typing.TYPE_CHECKING</code> block (<code>F811</code>) (<a href="https://redirect.github.com/astral-sh/ruff/pull/22560">#22560</a>)</li> </ul> <h3>Bug fixes</h3> <ul> <li>[<code>pyflakes</code>] Treat function-scope bare annotations as locals per PEP 526 (<code>F821</code>) (<a href="https://redirect.github.com/astral-sh/ruff/pull/21540">#21540</a>)</li> </ul> <h3>Performance</h3> <ul> <li>Avoid redundant <code>TokenValue</code> drops in the lexer (<a href="https://redirect.github.com/astral-sh/ruff/pull/25300">#25300</a>)</li> <li>Reduce memory usage by dropping token-excess capacity and improve performance by approximating the initial tokens <code>Vec</code> size (<a href="https://redirect.github.com/astral-sh/ruff/pull/25354">#25354</a>)</li> <li>Use <code>ThinVec</code> in AST to shrink <code>Stmt</code> (<a href="https://redirect.github.com/astral-sh/ruff/pull/25361">#25361</a>)</li> </ul> <h3>Documentation</h3> <ul> <li>Fix <code>line-length</code> example for <code>--config</code> option (<a href="https://redirect.github.com/astral-sh/ruff/pull/25389">#25389</a>)</li> <li>[<code>flake8-comprehensions</code>] Document <code>RecursionError</code> edge case in <code>__len__</code> (<code>C416</code>) (<a href="https://redirect.github.com/astral-sh/ruff/pull/25286">#25286</a>)</li> <li>[<code>mccabe</code>] Improve example (<code>C901</code>) (<a href="https://redirect.github.com/astral-sh/ruff/pull/25287">#25287</a>)</li> <li>[<code>pyupgrade</code>] Clarify fix safety docs (<code>UP007</code>, <code>UP045</code>) (<a href="https://redirect.github.com/astral-sh/ruff/pull/25288">#25288</a>)</li> <li>[<code>refurb</code>] Document <code>FURB192</code> exception change for empty sequences (<a href="https://redirect.github.com/astral-sh/ruff/pull/25317">#25317</a>)</li> <li>[<code>ruff</code>] Document false negative for user-defined types (<code>RUF013</code>) (<a href="https://redirect.github.com/astral-sh/ruff/pull/25289">#25289</a>)</li> </ul> <h3>Formatter</h3> <ul> <li>Fix formatting of lambdas nested within f-strings (<a href="https://redirect.github.com/astral-sh/ruff/pull/25398">#25398</a>)</li> </ul> <h3>Server</h3> <ul> <li>Return code action for <code>codeAction/resolve</code> requests that contain no or no valid URL (<a href="https://redirect.github.com/astral-sh/ruff/pull/25365">#25365</a>)</li> </ul> <h3>Other changes</h3> <ul> <li>Expand semantic syntax errors for invalid walruses (<a href="https://redirect.github.com/astral-sh/ruff/pull/25415">#25415</a>)</li> </ul> <h3>Contributors</h3> <ul> <li><a href="https://github.com/chirizxc"><code>@chirizxc</code></a></li> <li><a href="https://github.com/ntBre"><code>@ntBre</code></a></li> <li><a href="https://github.com/adityasingh2400"><code>@adityasingh2400</code></a></li> <li><a href="https://github.com/charliermarsh"><code>@charliermarsh</code></a></li> <li><a href="https://github.com/fallintoplace"><code>@fallintoplace</code></a></li> <li><a href="https://github.com/martin-schlossarek"><code>@martin-schlossarek</code></a></li> <li><a href="https://github.com/MichaReiser"><code>@MichaReiser</code></a></li> <li><a href="https://github.com/Ruchir28"><code>@Ruchir28</code></a></li> </ul> <!-- raw HTML omitted --> </blockquote> <p>... (truncated)</p> </details> <details> <summary>Commits</summary> <ul> <li><a href="https://github.com/astral-sh/ruff/commit/db5aa0a5f1b92cb91d910bf0866a967554dd94f5"><code>db5aa0a</code></a> Bump 0.15.15 (<a href="https://redirect.github.com/astral-sh/ruff/issues/25431">#25431</a>)</li> <li><a href="https://github.com/astral-sh/ruff/commit/366fe21ba369ccdd01eb99c1043c9a969c99230b"><code>366fe21</code></a> [ty] Improve diagnostics for syntax errors in forward annotations (<a href="https://redirect.github.com/astral-sh/ruff/issues/25158">#25158</a>)</li> <li><a href="https://github.com/astral-sh/ruff/commit/e2e1e647d182b8567845039c9a65fb0608a4dcfc"><code>e2e1e64</code></a> [ty] Remove excess capacity from more Salsa cached collections (<a href="https://redirect.github.com/astral-sh/ruff/issues/25411">#25411</a>)</li> <li><a href="https://github.com/astral-sh/ruff/commit/1bd77e1646f2213d86b8da215f08279187867d72"><code>1bd77e1</code></a> [ty] Use diagnostic message as tie breaker when sorting (<a href="https://redirect.github.com/astral-sh/ruff/issues/25424">#25424</a>)</li> <li><a href="https://github.com/astral-sh/ruff/commit/7e1bc1e75f15795f12c846294b13df4535f2abbf"><code>7e1bc1e</code></a> Add agent skills for working on ty (<a href="https://redirect.github.com/astral-sh/ruff/issues/25422">#25422</a>)</li> <li><a href="https://github.com/astral-sh/ruff/commit/574e10752f8cfa9e0cdbe3b01e96c4380950469b"><code>574e107</code></a> Expand semantic syntax errors for invalid walruses (<a href="https://redirect.github.com/astral-sh/ruff/issues/25415">#25415</a>)</li> <li><a href="https://github.com/astral-sh/ruff/commit/4a7ca062fccd80443a43aa61e5dc7e5858e88dc1"><code>4a7ca06</code></a> [ty] Display docs for matching parameter when hovering over the name of an ar...</li> <li><a href="https://github.com/astral-sh/ruff/commit/54327092dbfe455040690d63bb1e5e4b5f551239"><code>5432709</code></a> Refine a few agents instructions (<a href="https://redirect.github.com/astral-sh/ruff/issues/25423">#25423</a>)</li> <li><a href="https://github.com/astral-sh/ruff/commit/3cb09eba689ebb49e799131092121928cc789c18"><code>3cb09eb</code></a> [ty] Support <code>typing.TypeForm</code> (<a href="https://redirect.github.com/astral-sh/ruff/issues/25334">#25334</a>)</li> <li><a href="https://github.com/astral-sh/ruff/commit/c8cd59f189f2b6f55d542b29bddb953622add6fc"><code>c8cd59f</code></a> [ty] Infer class attributes assigned by metaclass initialization (<a href="https://redirect.github.com/astral-sh/ruff/issues/25342">#25342</a>)</li> <li>Additional commits viewable in <a href="https://github.com/astral-sh/ruff/compare/0.15.12...0.15.15">compare view</a></li> </ul> </details> <br /> Updates `psycopg-binary` from 3.3.2 to 3.3.4 <details> <summary>Changelog</summary> <p><em>Sourced from <a href="https://github.com/psycopg/psycopg/blob/master/docs/news.rst">psycopg-binary's changelog</a>.</em></p> <blockquote> <p>.. currentmodule:: psycopg</p> <p>.. index:: single: Release notes single: News</p> <h1><code>psycopg</code> release notes</h1> <h2>Future releases</h2> <p>Psycopg 3.3.5 (unreleased) ^^^^^^^^^^^^^^^^^^^^^^^^^^</p> <ul> <li>Discard prepared statements upon :sql:<code>ALTER *</code> or <code>DISCARD *</code> (🎫<code>[#1307](https://github.com/psycopg/psycopg/issues/1307)</code>).</li> </ul> <h2>Current release</h2> <p>Psycopg 3.3.4 ^^^^^^^^^^^^^</p> <ul> <li>Fix possible spurious connection timeout in systems with very long uptimes in C extension (🎫<code>[#1280](https://github.com/psycopg/psycopg/issues/1280)</code>).</li> <li>Fix client-side adaptation of enums whose name require quotes (🎫<code>[#1298](https://github.com/psycopg/psycopg/issues/1298)</code>).</li> <li>Consistently populate <code>~Cursor.statusmessage</code> after <code>~Cursor.executemany()</code> (🎫<code>[#1302](https://github.com/psycopg/psycopg/issues/1302)</code>).</li> </ul> <p>Psycopg 3.3.3 ^^^^^^^^^^^^^</p> <ul> <li>Retain <code>Error.pgconn</code> when raising a single exception for multiple connection attempt errors (🎫<code>[#1246](https://github.com/psycopg/psycopg/issues/1246)</code>).</li> <li>Return a proper error when server sends <code>ErrorResponse</code> for a <code>Sync</code> after a <code>Parse</code> (🎫<code>[#1260](https://github.com/psycopg/psycopg/issues/1260)</code>).</li> </ul> <p>Psycopg 3.3.2 ^^^^^^^^^^^^^</p> <p>Fix race condition in adapters at startup (🎫<code>[#1230](https://github.com/psycopg/psycopg/issues/1230)</code>).</p> <p>Psycopg 3.3.1 ^^^^^^^^^^^^^</p> <!-- raw HTML omitted --> </blockquote> <p>... (truncated)</p> </details> <details> <summary>Commits</summary> <ul> <li><a href="https://github.com/psycopg/psycopg/commit/83f110367cdd249cc0a352e2246ecea9e878e5a0"><code>83f1103</code></a> chore: bump psycopg_pool package version to 3.3.1</li> <li><a href="https://github.com/psycopg/psycopg/commit/18287707f56a2b4f0817d9c23d137f5d69db6e31"><code>1828770</code></a> chore: bump psycopg package version to 3.3.4</li> <li><a href="https://github.com/psycopg/psycopg/commit/8be14bbc18f74de7652606d2777e0950ec804cc0"><code>8be14bb</code></a> Merge pull request <a href="https://redirect.github.com/psycopg/psycopg/issues/1301">#1301</a> from oliverhaas/fix/sync-pool-open-race</li> <li><a href="https://github.com/psycopg/psycopg/commit/aee0bf2659db77c31154acf583baf0a98675c192"><code>aee0bf2</code></a> fix(pool): fix race in the construction of the sync ConnectionPool lock</li> <li><a href="https://github.com/psycopg/psycopg/commit/bc4d30375557fc32f2a91c2f8b75a5d21711ea89"><code>bc4d303</code></a> chore(deps): bump the actions group across 1 directory with 4 updates</li> <li><a href="https://github.com/psycopg/psycopg/commit/785379f196fc17473d312451a1fd4a06ef8dc895"><code>785379f</code></a> fix: retain statusmessage after executemany with returning=False</li> <li><a href="https://github.com/psycopg/psycopg/commit/8882a73871e65727549657085922d043a106127c"><code>8882a73</code></a> perf: do less if X in Y: return Y[X] for cache-like patterns</li> <li><a href="https://github.com/psycopg/psycopg/commit/2f785395c189e709da5fa74a02d3797bfb9db6a4"><code>2f78539</code></a> Merge pull request <a href="https://redirect.github.com/psycopg/psycopg/issues/1299">#1299</a> from dvarrazzo/fix-camel-enum</li> <li><a href="https://github.com/psycopg/psycopg/commit/37ef1dc4e6d19dc4af062d45a63243cb96a261c2"><code>37ef1dc</code></a> test: skip test on crdb depending on precise regtype behaviour</li> <li><a href="https://github.com/psycopg/psycopg/commit/7f2f1d159df881260e3086fd61ea71343ca98e58"><code>7f2f1d1</code></a> fix: fix client-side representation of enums requiring quotes</li> <li>Additional commits viewable in <a href="https://github.com/psycopg/psycopg/compare/3.3.2...3.3.4">compare view</a></li> </ul> </details> <br /> Updates `ormsgpack` from 1.12.1 to 1.12.2 <details> <summary>Release notes</summary> <p><em>Sourced from <a href="https://github.com/ormsgpack/ormsgpack/releases">ormsgpack's releases</a>.</em></p> <blockquote> <h2>1.12.2</h2> <p>Changed</p> <ul> <li>Add Python 3.14 free-threaded Windows x86_64 wheel</li> <li>Improve serialization performance</li> <li>Update dependencies</li> </ul> <p>Fixed</p> <ul> <li>Fix <code>unpackb</code> crash on Windows with Python 3.14 free-threaded and on Linux s390x (<a href="https://redirect.github.com/ormsgpack/ormsgpack/issues/499">#499</a>)</li> </ul> </blockquote> </details> <details> <summary>Changelog</summary> <p><em>Sourced from <a href="https://github.com/ormsgpack/ormsgpack/blob/master/docs/changelog.rst">ormsgpack's changelog</a>.</em></p> <blockquote> <h2>1.12.2 - 2026-01-18</h2> <p>Changed</p> <pre><code> - Add Python 3.14 free-threaded Windows x86_64 wheel - Improve serialization performance - Update dependencies <p>Fixed</p> <pre><code> - Fix ``unpackb`` crash on Windows with Python 3.14 free-threaded and on Linux s390x (:issue:`499`) </code></pre> </blockquote> </details> <details> <summary>Commits</summary> <ul> <li><a href="https://github.com/ormsgpack/ormsgpack/commit/9645772ab1e19420fa509197a95fb40fcc92fe9f"><code>9645772</code></a> 1.12.2</li> <li><a href="https://github.com/ormsgpack/ormsgpack/commit/cfc189fe17ea41cce9baffff0c55da105fce0d2e"><code>cfc189f</code></a> Update Changelog</li> <li><a href="https://github.com/ormsgpack/ormsgpack/commit/cf8c3bb3988e063f628e62e3ead0de24c3a95381"><code>cf8c3bb</code></a> Lint docs</li> <li><a href="https://github.com/ormsgpack/ormsgpack/commit/cc6e45a07d5cb13098da5752cc552deed525c8f6"><code>cc6e45a</code></a> Update development dependencies</li> <li><a href="https://github.com/ormsgpack/ormsgpack/commit/42f501fc0fdbb86601bcecafd77e0096e41b266f"><code>42f501f</code></a> Update dependencies</li> <li><a href="https://github.com/ormsgpack/ormsgpack/commit/6e621b8abcfa48cd9b4248bb5889baf3fdca06d3"><code>6e621b8</code></a> Update repository url</li> <li><a href="https://github.com/ormsgpack/ormsgpack/commit/079c7fcf9b96d5c869af106c61d156f06bd5f6cd"><code>079c7fc</code></a> Bump urllib3 from 2.6.0 to 2.6.3</li> <li><a href="https://github.com/ormsgpack/ormsgpack/commit/4bb944cf066fca788024ebd3614164627daeac33"><code>4bb944c</code></a> Bump ruff from 0.14.11 to 0.14.12 in the uv group</li> <li><a href="https://github.com/ormsgpack/ormsgpack/commit/2f447c2475c60f0e966428825229f456734a35dc"><code>2f447c2</code></a> Trigger workflows on merge group events</li> <li><a href="https://github.com/ormsgpack/ormsgpack/commit/2acc85d4437bcf6baa3a4f16fe333e46c97d7a66"><code>2acc85d</code></a> Bump chrono from 0.4.42 to 0.4.43</li> <li>Additional commits viewable in <a href="https://github.com/ormsgpack/ormsgpack/compare/1.12.1...1.12.2">compare view</a></li> </ul> </details> <br /></code></pre> Updates `sqlite-vec` from 0.1.6 to 0.1.9 Updates `orjson` from 3.11.6 to 3.11.9 <details> <summary>Release notes</summary> <p><em>Sourced from <a href="https://github.com/ijl/orjson/releases">orjson's releases</a>.</em></p> <blockquote> <h2>3.11.9</h2> <h3>Changed</h3> <ul> <li>Build now depends on Rust 1.95 or later instead of 1.89.</li> </ul> <h3>Fixed</h3> <ul> <li>Fix building on Rust 1.95.</li> </ul> <h2>3.11.8</h2> <h3>Changed</h3> <ul> <li>Build and compatibility improvements.</li> </ul> <h2>3.11.7</h2> <h3>Changed</h3> <ul> <li>Use a faster library to serialize <code>float</code>. Users with byte-exact regression tests should note positive exponents are now written using a <code>+</code>, e.g., <code>1.2e+30</code> instead of <code>1.2e30</code>. Both formats are spec-compliant.</li> <li>ABI compatibility with CPython 3.15 alpha 5 free-threading.</li> </ul> </blockquote> </details> <details> <summary>Changelog</summary> <p><em>Sourced from <a href="https://github.com/ijl/orjson/blob/master/CHANGELOG.md">orjson's changelog</a>.</em></p> <blockquote> <h2>3.11.9 - 2026-05-06</h2> <h3>Changed</h3> <ul> <li>Build now depends on Rust 1.95 or later instead of 1.89.</li> </ul> <h3>Fixed</h3> <ul> <li>Fix building on Rust 1.95.</li> </ul> <h2>3.11.8 - 2026-03-31</h2> <h3>Changed</h3> <ul> <li>Build and compatibility improvements.</li> </ul> <h2>3.11.7 - 2026-02-02</h2> <h3>Changed</h3> <ul> <li>Use a faster library to serialize <code>float</code>. Users with byte-exact regression tests should note positive exponents are now written using a <code>+</code>, e.g., <code>1.2e+30</code> instead of <code>1.2e30</code>. Both formats are spec-compliant.</li> <li>ABI compatibility with CPython 3.15 alpha 5 free-threading.</li> </ul> </blockquote> </details> <details> <summary>Commits</summary> <ul> <li><a href="https://github.com/ijl/orjson/commit/705515d77b28429d0b7c30c3d781abe52e8a1e5a"><code>705515d</code></a> 3.11.9</li> <li><a href="https://github.com/ijl/orjson/commit/d19055d5bab432f98d53b71606a9c6c23fb21bf6"><code>d19055d</code></a> build update</li> <li><a href="https://github.com/ijl/orjson/commit/77e2d96c3febe099cde2447856fe2523d68c71b0"><code>77e2d96</code></a> MSRV 1.95, remove compiler feature detection</li> <li><a href="https://github.com/ijl/orjson/commit/5cbb3d0398a2f42de51210270286fecd798c5d78"><code>5cbb3d0</code></a> 3.11.8</li> <li><a href="https://github.com/ijl/orjson/commit/4195d7f263e33076295b75efdcbaf6a55af8674e"><code>4195d7f</code></a> writer::half</li> <li><a href="https://github.com/ijl/orjson/commit/d00641b69410728a735f0855eb1c2843b0a5819b"><code>d00641b</code></a> writer::uuid</li> <li><a href="https://github.com/ijl/orjson/commit/c84d9b4ba4853781af943fa5c493e261e2f82b84"><code>c84d9b4</code></a> build and compatibility misc</li> <li><a href="https://github.com/ijl/orjson/commit/4547234b681fac5e0e0734cf44c21e75f9654e43"><code>4547234</code></a> ffi::numpy</li> <li><a href="https://github.com/ijl/orjson/commit/0d4a5ad1f17a72528ba027554466fdec6580cdeb"><code>0d4a5ad</code></a> datetime PyRef idiom</li> <li><a href="https://github.com/ijl/orjson/commit/e93a13d372ec956d027e71d023eb534b8445ac85"><code>e93a13d</code></a> Cross-compile avoids maturin v1.12 build-details.json error</li> <li>Additional commits viewable in <a href="https://github.com/ijl/orjson/compare/3.11.6...3.11.9">compare view</a></li> </ul> </details> <br /> Updates `psycopg` from 3.3.2 to 3.3.4 <details> <summary>Changelog</summary> <p><em>Sourced from <a href="https://github.com/psycopg/psycopg/blob/master/docs/news.rst">psycopg's changelog</a>.</em></p> <blockquote> <p>.. currentmodule:: psycopg</p> <p>.. index:: single: Release notes single: News</p> <h1><code>psycopg</code> release notes</h1> <h2>Future releases</h2> <p>Psycopg 3.3.5 (unreleased) ^^^^^^^^^^^^^^^^^^^^^^^^^^</p> <ul> <li>Discard prepared statements upon :sql:<code>ALTER *</code> or <code>DISCARD *</code> (🎫<code>[#1307](https://github.com/psycopg/psycopg/issues/1307)</code>).</li> </ul> <h2>Current release</h2> <p>Psycopg 3.3.4 ^^^^^^^^^^^^^</p> <ul> <li>Fix possible spurious connection timeout in systems with very long uptimes in C extension (🎫<code>[#1280](https://github.com/psycopg/psycopg/issues/1280)</code>).</li> <li>Fix client-side adaptation of enums whose name require quotes (🎫<code>[#1298](https://github.com/psycopg/psycopg/issues/1298)</code>).</li> <li>Consistently populate <code>~Cursor.statusmessage</code> after <code>~Cursor.executemany()</code> (🎫<code>[#1302](https://github.com/psycopg/psycopg/issues/1302)</code>).</li> </ul> <p>Psycopg 3.3.3 ^^^^^^^^^^^^^</p> <ul> <li>Retain <code>Error.pgconn</code> when raising a single exception for multiple connection attempt errors (🎫<code>[#1246](https://github.com/psycopg/psycopg/issues/1246)</code>).</li> <li>Return a proper error when server sends <code>ErrorResponse</code> for a <code>Sync</code> after a <code>Parse</code> (🎫<code>[#1260](https://github.com/psycopg/psycopg/issues/1260)</code>).</li> </ul> <p>Psycopg 3.3.2 ^^^^^^^^^^^^^</p> <p>Fix race condition in adapters at startup (🎫<code>[#1230](https://github.com/psycopg/psycopg/issues/1230)</code>).</p> <p>Psycopg 3.3.1 ^^^^^^^^^^^^^</p> <!-- raw HTML omitted --> </blockquote> <p>... (truncated)</p> </details> <details> <summary>Commits</summary> <ul> <li><a href="https://github.com/psycopg/psycopg/commit/83f110367cdd249cc0a352e2246ecea9e878e5a0"><code>83f1103</code></a> chore: bump psycopg_pool package version to 3.3.1</li> <li><a href="https://github.com/psycopg/psycopg/commit/18287707f56a2b4f0817d9c23d137f5d69db6e31"><code>1828770</code></a> chore: bump psycopg package version to 3.3.4</li> <li><a href="https://github.com/psycopg/psycopg/commit/8be14bbc18f74de7652606d2777e0950ec804cc0"><code>8be14bb</code></a> Merge pull request <a href="https://redirect.github.com/psycopg/psycopg/issues/1301">#1301</a> from oliverhaas/fix/sync-pool-open-race</li> <li><a href="https://github.com/psycopg/psycopg/commit/aee0bf2659db77c31154acf583baf0a98675c192"><code>aee0bf2</code></a> fix(pool): fix race in the construction of the sync ConnectionPool lock</li> <li><a href="https://github.com/psycopg/psycopg/commit/bc4d30375557fc32f2a91c2f8b75a5d21711ea89"><code>bc4d303</code></a> chore(deps): bump the actions group across 1 directory with 4 updates</li> <li><a href="https://github.com/psycopg/psycopg/commit/785379f196fc17473d312451a1fd4a06ef8dc895"><code>785379f</code></a> fix: retain statusmessage after executemany with returning=False</li> <li><a href="https://github.com/psycopg/psycopg/commit/8882a73871e65727549657085922d043a106127c"><code>8882a73</code></a> perf: do less if X in Y: return Y[X] for cache-like patterns</li> <li><a href="https://github.com/psycopg/psycopg/commit/2f785395c189e709da5fa74a02d3797bfb9db6a4"><code>2f78539</code></a> Merge pull request <a href="https://redirect.github.com/psycopg/psycopg/issues/1299">#1299</a> from dvarrazzo/fix-camel-enum</li> <li><a href="https://github.com/psycopg/psycopg/commit/37ef1dc4e6d19dc4af062d45a63243cb96a261c2"><code>37ef1dc</code></a> test: skip test on crdb depending on precise regtype behaviour</li> <li><a href="https://github.com/psycopg/psycopg/commit/7f2f1d159df881260e3086fd61ea71343ca98e58"><code>7f2f1d1</code></a> fix: fix client-side representation of enums requiring quotes</li> <li>Additional commits viewable in <a href="https://github.com/psycopg/psycopg/compare/3.3.2...3.3.4">compare view</a></li> </ul> </details> <br /> Updates `psycopg-pool` from 3.3.0 to 3.3.1 <details> <summary>Changelog</summary> <p><em>Sourced from <a href="https://github.com/psycopg/psycopg/blob/master/docs/news.rst">psycopg-pool's changelog</a>.</em></p> <blockquote> <p>.. currentmodule:: psycopg</p> <p>.. index:: single: Release notes single: News</p> <h1><code>psycopg</code> release notes</h1> <h2>Future releases</h2> <p>Psycopg 3.3.5 (unreleased) ^^^^^^^^^^^^^^^^^^^^^^^^^^</p> <ul> <li>Discard prepared statements upon :sql:<code>ALTER *</code> or <code>DISCARD *</code> (🎫<code>[#1307](https://github.com/psycopg/psycopg/issues/1307)</code>).</li> </ul> <h2>Current release</h2> <p>Psycopg 3.3.4 ^^^^^^^^^^^^^</p> <ul> <li>Fix possible spurious connection timeout in systems with very long uptimes in C extension (🎫<code>[#1280](https://github.com/psycopg/psycopg/issues/1280)</code>).</li> <li>Fix client-side adaptation of enums whose name require quotes (🎫<code>[#1298](https://github.com/psycopg/psycopg/issues/1298)</code>).</li> <li>Consistently populate <code>~Cursor.statusmessage</code> after <code>~Cursor.executemany()</code> (🎫<code>[#1302](https://github.com/psycopg/psycopg/issues/1302)</code>).</li> </ul> <p>Psycopg 3.3.3 ^^^^^^^^^^^^^</p> <ul> <li>Retain <code>Error.pgconn</code> when raising a single exception for multiple connection attempt errors (🎫<code>[#1246](https://github.com/psycopg/psycopg/issues/1246)</code>).</li> <li>Return a proper error when server sends <code>ErrorResponse</code> for a <code>Sync</code> after a <code>Parse</code> (🎫<code>[#1260](https://github.com/psycopg/psycopg/issues/1260)</code>).</li> </ul> <p>Psycopg 3.3.2 ^^^^^^^^^^^^^</p> <p>Fix race condition in adapters at startup (🎫<code>[#1230](https://github.com/psycopg/psycopg/issues/1230)</code>).</p> <p>Psycopg 3.3.1 ^^^^^^^^^^^^^</p> <!-- raw HTML omitted --> </blockquote> <p>... (truncated)</p> </details> <details> <summary>Commits</summary> <ul> <li><a href="https://github.com/psycopg/psycopg/commit/9bdd78cf4360b9229ab3f641c646e232fc69cc8a"><code>9bdd78c</code></a> chore: bump psycopg package version to 3.3.1</li> <li><a href="https://github.com/psycopg/psycopg/commit/4d27426bf197a1eca8ea99ab9e236e1c8e0f15fa"><code>4d27426</code></a> Merge branch 'fix/server-cursor-iter'</li> <li><a href="https://github.com/psycopg/psycopg/commit/b9b82e86e3ce1972581a495ccbe28d5dbb15c449"><code>b9b82e8</code></a> fix: fix iteration on server-side cursor</li> <li><a href="https://github.com/psycopg/psycopg/commit/2a75357de22bb63ede33006cd17c99b30e360cdf"><code>2a75357</code></a> fix: add test to verify iteration in server-side cursor broken</li> <li><a href="https://github.com/psycopg/psycopg/commit/25ebaa3946bc0912e645dbf4d490a29865a2fc3f"><code>25ebaa3</code></a> chore: bump psycopg_pool package version to 3.3.1.dev1</li> <li><a href="https://github.com/psycopg/psycopg/commit/754282246e04c7ea32643de763fabd7fca7169d4"><code>7542822</code></a> chore: bump psycopg package version to 3.3.1.dev1</li> <li><a href="https://github.com/psycopg/psycopg/commit/380ccceb57ef44452a4c3e851e5e6dee09eb9eaf"><code>380ccce</code></a> chore: bump psycopg_pool package version to 3.3.0</li> <li>See full diff in <a href="https://github.com/psycopg/psycopg/compare/3.3.0...3.3.1">compare view</a></li> </ul> </details> <br /> Updates `anyio` from 4.12.1 to 4.13.0 <details> <summary>Release notes</summary> <p><em>Sourced from <a href="https://github.com/agronholm/anyio/releases">anyio's releases</a>.</em></p> <blockquote> <h2>4.13.0</h2> <ul> <li>Dropped support for Python 3.9</li> <li>Added a <code>ttl</code> parameter to the <code>anyio.functools.lru_cache</code> wrapper (<a href="https://redirect.github.com/agronholm/anyio/pull/1073">#1073</a>; PR by <a href="https://github.com/Graeme22"><code>@Graeme22</code></a>)</li> <li>Widened the type annotations of file I/O streams to accept <code>IO[bytes]</code> instead of just <code>BinaryIO</code> (<a href="https://redirect.github.com/agronholm/anyio/issues/1078">#1078</a>)</li> <li>Fixed <code>anyio.Path</code> not being compatible with Python 3.15 due to the removal of <code>pathlib.Path.is_reserved()</code> and the addition of <code>pathlib.Path.__vfspath__()</code> (<a href="https://redirect.github.com/agronholm/anyio/issues/1061">#1061</a>; PR by <a href="https://github.com/veeceey"><code>@veeceey</code></a>)</li> <li>Fixed the <code>BrokenResourceError</code> raised by the asyncio <code>SocketStream</code> not having the original exception as its cause (<a href="https://redirect.github.com/agronholm/anyio/issues/1055">#1055</a>; PR by <a href="https://github.com/veeceey"><code>@veeceey</code></a>)</li> <li>Fixed the <code>TypeError</code> raised when using "func" as a parameter name in <code>pytest.mark.parametrize</code> when using the pytest plugin (<a href="https://redirect.github.com/agronholm/anyio/pull/1068">#1068</a>; PR by <a href="https://github.com/JohnnyDeuss"><code>@JohnnyDeuss</code></a>)</li> <li>Fixed the pytest plugin not running tests that had the <code>anyio</code> marker added programmatically via <code>pytest_collection_modifyitems</code> (<a href="https://redirect.github.com/agronholm/anyio/issues/422">#422</a>; PR by <a href="https://github.com/chbndrhnns"><code>@chbndrhnns</code></a>)</li> <li>Fixed cancellation exceptions leaking from a <code>CancelScope</code> on asyncio when they are contained in an exception group alongside non-cancellation exceptions (<a href="https://redirect.github.com/agronholm/anyio/issues/1091">#1091</a>; PR by <a href="https://github.com/gschaffner"><code>@gschaffner</code></a>)</li> <li>Fixed <code>Condition.wait()</code> not passing on a notification when the task is cancelled but already received a notification</li> <li>Fixed inverted condition in the process pool shutdown phase which would cause still-running pooled processes not to be terminated (<a href="https://redirect.github.com/agronholm/anyio/pull/1074">#1074</a>; PR by <a href="https://github.com/bysiber"><code>@bysiber</code></a>)</li> </ul> </blockquote> </details> <details> <summary>Commits</summary> <ul> <li><a href="https://github.com/agronholm/anyio/commit/afbe93ca9d0c447adf26e9c1715ac20870622bf2"><code>afbe93c</code></a> Bumped up the version</li> <li><a href="https://github.com/agronholm/anyio/commit/33bdf2e4b4f40c2df178123746147a6d2471808d"><code>33bdf2e</code></a> Rearranged the changelog entries</li> <li><a href="https://github.com/agronholm/anyio/commit/19e09e25bc5a23dd78a577d8c3909dd377057c78"><code>19e09e2</code></a> Fixed inverted condition in _forcibly_shutdown_process_pool_on_exit (<a href="https://redirect.github.com/agronholm/anyio/issues/1074">#1074</a>)</li> <li><a href="https://github.com/agronholm/anyio/commit/9369d80b9e8292f2a892a9d5c73923c6a28aa08c"><code>9369d80</code></a> Fixed Condition.wait() not handing over notification when cancelled</li> <li><a href="https://github.com/agronholm/anyio/commit/6f122abdc6f6b166c6b6ac27d36d55cdf8fa08e8"><code>6f122ab</code></a> Fixed cancellation exceptions leaking from a <code>CancelScope</code> on asyncio when th...</li> <li><a href="https://github.com/agronholm/anyio/commit/beaa45aff568a4020f2faf317321dd92f0e1f4a0"><code>beaa45a</code></a> [pre-commit.ci] pre-commit autoupdate (<a href="https://redirect.github.com/agronholm/anyio/issues/1097">#1097</a>)</li> <li><a href="https://github.com/agronholm/anyio/commit/602f6606dcf3f37702686a4f3e161328c537b07f"><code>602f660</code></a> Widened type annotations to accept IO[bytes] in file streams</li> <li><a href="https://github.com/agronholm/anyio/commit/b5dcd45170701a756ba634197398f05d4710cab3"><code>b5dcd45</code></a> Added note about erasing the template</li> <li><a href="https://github.com/agronholm/anyio/commit/d68670b3b4e0917d4caff2de082e03220f3e05a1"><code>d68670b</code></a> [pre-commit.ci] pre-commit autoupdate (<a href="https://redirect.github.com/agronholm/anyio/issues/1090">#1090</a>)</li> <li><a href="https://github.com/agronholm/anyio/commit/fc17a22dd948e6a3d90d99908813f0010dfc3d2c"><code>fc17a22</code></a> tweak to_thread docs about abandon_on_cancel (<a href="https://redirect.github.com/agronholm/anyio/issues/1088">#1088</a>)</li> <li>Additional commits viewable in <a href="https://github.com/agronholm/anyio/compare/4.12.1...4.13.0">compare view</a></li> </ul> </details> <br /> Updates `langchain-protocol` from 0.0.15 to 0.0.16 <details> <summary>Release notes</summary> <p><em>Sourced from <a href="https://github.com/langchain-ai/agent-protocol/releases">langchain-protocol's releases</a>.</em></p> <blockquote> <h2>langchain-protocol==0.0.16</h2> <h2>What's Changed</h2> <ul> <li>chore: bump <code>typing-extensions</code> floor from <code>>=4.7.0</code> to <code>>=4.13.0</code> by <a href="https://github.com/mdrxy"><code>@mdrxy</code></a> in <a href="https://redirect.github.com/langchain-ai/agent-protocol/pull/84">langchain-ai/agent-protocol#84</a></li> <li>feat(protocol): add batch resume for parallel interrupts by <a href="https://github.com/christian-bromann"><code>@christian-bromann</code></a> in <a href="https://redirect.github.com/langchain-ai/agent-protocol/pull/86">langchain-ai/agent-protocol#86</a></li> </ul> <h2>New Contributors</h2> <ul> <li><a href="https://github.com/mdrxy"><code>@mdrxy</code></a> made their first contribution in <a href="https://redirect.github.com/langchain-ai/agent-protocol/pull/84">langchain-ai/agent-protocol#84</a></li> </ul> <p><strong>Full Changelog</strong>: <a href="https://github.com/langchain-ai/agent-protocol/compare/langchain-protocol==0.0.15...langchain-protocol==0.0.16">https://github.com/langchain-ai/agent-protocol/compare/langchain-protocol==0.0.15...langchain-protocol==0.0.16</a></p> </blockquote> </details> <details> <summary>Commits</summary> <ul> <li><a href="https://github.com/langchain-ai/agent-protocol/commit/8246ac0b6c2db63fc3d9ffb257faa9325d49c8d2"><code>8246ac0</code></a> feat(protocol): add batch resume for parallel interrupts (<a href="https://redirect.github.com/langchain-ai/agent-protocol/issues/86">#86</a>)</li> <li><a href="https://github.com/langchain-ai/agent-protocol/commit/0f896ba72976145b0f98af1ddc25c3baaf652f1a"><code>0f896ba</code></a> Merge pull request <a href="https://redirect.github.com/langchain-ai/agent-protocol/issues/84">#84</a> from langchain-ai/mdrxy/bump-dep</li> <li><a href="https://github.com/langchain-ai/agent-protocol/commit/2e890bb0fb4887eb5f5f3e8ce21bc77f4cad2659"><code>2e890bb</code></a> chore: bump <code>typing-extensions</code> floor from <code>>=4.7.0</code> to <code>>=4.13.0</code></li> <li>See full diff in <a href="https://github.com/langchain-ai/agent-protocol/compare/langchain-protocol==0.0.15...langchain-protocol==0.0.16">compare view</a></li> </ul> </details> <br /> Updates `ty` from 0.0.33 to 0.0.42 <details> <summary>Release notes</summary> <p><em>Sourced from <a href="https://github.com/astral-sh/ty/releases">ty's releases</a>.</em></p> <blockquote> <h2>0.0.42</h2> <h2>Release Notes</h2> <p>Released on 2026-06-01.</p> <h3>Bug fixes</h3> <ul> <li>Fix narrowing of enum literal unions by member identity (<a href="https://redirect.github.com/astral-sh/ruff/pull/25520">#25520</a>)</li> <li>Detect recursive expansion in constraint-set solving (<a href="https://redirect.github.com/astral-sh/ruff/pull/25442">#25442</a>)</li> </ul> <h3>Core type checking</h3> <ul> <li>Support tagged-union narrowing for nominal types (<a href="https://redirect.github.com/astral-sh/ruff/pull/24916">#24916</a>)</li> <li>Extend <code>Generator</code> assignability workaround to Python 3.13+ (<a href="https://redirect.github.com/astral-sh/ruff/pull/25472">#25472</a>)</li> <li>Sync vendored typeshed stubs (<a href="https://redirect.github.com/astral-sh/ruff/pull/25514">#25514</a>)</li> </ul> <h3>Performance</h3> <ul> <li>Avoid redundant work for empty collection context (<a href="https://redirect.github.com/astral-sh/ruff/pull/25527">#25527</a>)</li> <li>Deduplicate retained use-def place states (<a href="https://redirect.github.com/astral-sh/ruff/pull/25450">#25450</a>)</li> <li>Compact retained semantic maps (<a href="https://redirect.github.com/astral-sh/ruff/pull/25238">#25238</a>)</li> </ul> <h3>Contributors</h3> <ul> <li><a href="https://github.com/aholyoke"><code>@aholyoke</code></a></li> <li><a href="https://github.com/carljm"><code>@carljm</code></a></li> <li><a href="https://github.com/charliermarsh"><code>@charliermarsh</code></a></li> <li><a href="https://github.com/sharkdp"><code>@sharkdp</code></a></li> </ul> <h2>Install ty 0.0.42</h2> <h3>Install prebuilt binaries via shell script</h3> <pre lang="sh"><code>curl --proto '=https' --tlsv1.2 -LsSf https://releases.astral.sh/github/ty/releases/download/0.0.42/ty-installer.sh | sh </code></pre> <h3>Install prebuilt binaries via powershell script</h3> <pre lang="sh"><code>powershell -ExecutionPolicy Bypass -c "irm https://releases.astral.sh/github/ty/releases/download/0.0.42/ty-installer.ps1 | iex" </code></pre> <h2>Download ty 0.0.42</h2> <table> <thead> <tr> <th>File</th> <th>Platform</th> <th>Checksum</th> </tr> </thead> <tbody> <tr> <td><a href="https://releases.astral.sh/github/ty/releases/download/0.0.42/ty-aarch64-apple-darwin.tar.gz">ty-aarch64-apple-darwin.tar.gz</a></td> <td>Apple Silicon macOS</td> <td><a href="https://releases.astral.sh/github/ty/releases/download/0.0.42/ty-aarch64-apple-darwin.tar.gz.sha256">checksum</a></td> </tr> <tr> <td><a href="https://releases.astral.sh/github/ty/releases/download/0.0.42/ty-x86_64-apple-darwin.tar.gz">ty-x86_64-apple-darwin.tar.gz</a></td> <td>Intel macOS</td> <td><a href="https://releases.astral.sh/github/ty/releases/download/0.0.42/ty-x86_64-apple-darwin.tar.gz.sha256">checksum</a></td> </tr> <tr> <td><a href="https://releases.astral.sh/github/ty/releases/download/0.0.42/ty-aarch64-pc-windows-msvc.zip">ty-aarch64-pc-windows-msvc.zip</a></td> <td>ARM64 Windows</td> <td><a href="https://releases.astral.sh/github/ty/releases/download/0.0.42/ty-aarch64-pc-windows-msvc.zip.sha256">checksum</a></td> </tr> </tbody> </table> <!-- raw HTML omitted --> </blockquote> <p>... (truncated)</p> </details> <details> <summary>Changelog</summary> <p><em>Sourced from <a href="https://github.com/astral-sh/ty/blob/main/CHANGELOG.md">ty's changelog</a>.</em></p> <blockquote> <h2>0.0.42</h2> <p>Released on 2026-06-01.</p> <h3>Bug fixes</h3> <ul> <li>Fix narrowing of enum literal unions by member identity (<a href="https://redirect.github.com/astral-sh/ruff/pull/25520">#25520</a>)</li> <li>Detect recursive expansion in constraint-set solving (<a href="https://redirect.github.com/astral-sh/ruff/pull/25442">#25442</a>)</li> </ul> <h3>Core type checking</h3> <ul> <li>Support tagged-union narrowing for nominal types (<a href="https://redirect.github.com/astral-sh/ruff/pull/24916">#24916</a>)</li> <li>Extend <code>Generator</code> assignability workaround to Python 3.13+ (<a href="https://redirect.github.com/astral-sh/ruff/pull/25472">#25472</a>)</li> <li>Sync vendored typeshed stubs (<a href="https://redirect.github.com/astral-sh/ruff/pull/25514">#25514</a>)</li> </ul> <h3>Performance</h3> <ul> <li>Avoid redundant work for empty collection context (<a href="https://redirect.github.com/astral-sh/ruff/pull/25527">#25527</a>)</li> <li>Deduplicate retained use-def place states (<a href="https://redirect.github.com/astral-sh/ruff/pull/25450">#25450</a>)</li> <li>Compact retained semantic maps (<a href="https://redirect.github.com/astral-sh/ruff/pull/25238">#25238</a>)</li> </ul> <h3>Contributors</h3> <ul> <li><a href="https://github.com/aholyoke"><code>@aholyoke</code></a></li> <li><a href="https://github.com/carljm"><code>@carljm</code></a></li> <li><a href="https://github.com/charliermarsh"><code>@charliermarsh</code></a></li> <li><a href="https://github.com/sharkdp"><code>@sharkdp</code></a></li> </ul> <h2>0.0.41</h2> <p>Released on 2026-05-31.</p> <h3>Bug fixes</h3> <ul> <li>Avoid panic for deferred dataclass field annotations (<a href="https://redirect.github.com/astral-sh/ruff/pull/25444">#25444</a>)</li> <li>Avoid panic from cycle in function decorator inference (<a href="https://redirect.github.com/astral-sh/ruff/pull/25475">#25475</a>)</li> <li>Ignore rejected assignments for synthesized bindings (<a href="https://redirect.github.com/astral-sh/ruff/pull/25340">#25340</a>)</li> <li>Infer <code>bool</code> for <code>not</code> applied to dynamic values (<a href="https://redirect.github.com/astral-sh/ruff/pull/25445">#25445</a>)</li> <li>Use diagnostic message as tie-breaker when sorting (<a href="https://redirect.github.com/astral-sh/ruff/pull/25424">#25424</a>)</li> </ul> <h3>LSP server</h3> <ul> <li>Add call hierarchy support (<a href="https://redirect.github.com/astral-sh/ruff/pull/25338">#25338</a>)</li> <li>Add function parentheses completion (<a href="https://redirect.github.com/astral-sh/ruff/pull/25305">#25305</a>)</li> <li>Display docs for matching parameter when hovering over the name of an argument passed by keyword (<a href="https://redirect.github.com/astral-sh/ruff/pull/25283">#25283</a>)</li> <li>Document <code>completeFunctionParentheses</code> editor setting (<a href="https://redirect.github.com/astral-sh/ty/pull/3513">#3513</a>)</li> </ul> <h3>Diagnostics</h3> <ul> <li>Introduce opt-in <code>missing-override-decorator</code> rule (<a href="https://redirect.github.com/astral-sh/ruff/pull/25111">#25111</a>)</li> </ul> <!-- raw HTML omitted --> </blockquote> <p>... (truncated)</p> </details> <details> <summary>Commits</summary> <ul> <li><a href="https://github.com/astral-sh/ty/commit/7f8cb6457e8d77178ae9204f9b81a516f44444ed"><code>7f8cb64</code></a> Bump version to 0.0.42 (<a href="https://redirect.github.com/astral-sh/ty/issues/3615">#3615</a>)</li> <li><a href="https://github.com/astral-sh/ty/commit/41bb0d24412ad97c214bd0019e602c463ae3feba"><code>41bb0d2</code></a> Bump version to 0.0.41 (<a href="https://redirect.github.com/astral-sh/ty/issues/3601">#3601</a>)</li> <li><a href="https://github.com/astral-sh/ty/commit/c690a4996a8ae804dda9a48246118402d855b671"><code>c690a49</code></a> Document <code>completeFunctionParentheses</code> editor setting (<a href="https://redirect.github.com/astral-sh/ty/issues/3513">#3513</a>)</li> <li><a href="https://github.com/astral-sh/ty/commit/85c5e327a7951f3b9d0cfa8163c41fd7b29d69cf"><code>85c5e32</code></a> Document that call hierarchy is now supported (<a href="https://redirect.github.com/astral-sh/ty/issues/3582">#3582</a>)</li> <li><a href="https://github.com/astral-sh/ty/commit/e118dd0553e7d08735c8edee4c48ea7bfe2b02bd"><code>e118dd0</code></a> docs: Add typeHierarchy support in LSP feature reference (<a href="https://redirect.github.com/astral-sh/ty/issues/3382">#3382</a>)</li> <li><a href="https://github.com/astral-sh/ty/commit/aa20b165b285fcfdce79e4dd4427d00524c59e81"><code>aa20b16</code></a> minor changelog nits for the latest release (<a href="https://redirect.github.com/astral-sh/ty/issues/3560">#3560</a>)</li> <li><a href="https://github.com/astral-sh/ty/commit/7b95bc219d1dcebc3ce39d222c66c14a3825c9a0"><code>7b95bc2</code></a> Bump version to 0.0.40 (<a href="https://redirect.github.com/astral-sh/ty/issues/3554">#3554</a>)</li> <li><a href="https://github.com/astral-sh/ty/commit/54c7498ec94de87135edb8b54c311b54d30ec534"><code>54c7498</code></a> Update prek dependencies (<a href="https://redirect.github.com/astral-sh/ty/issues/3546">#3546</a>)</li> <li><a href="https://github.com/astral-sh/ty/commit/0d8540acdbf1340af95a2f364b9fd7d3b6bba3a8"><code>0d8540a</code></a> docs: set Eglot <code>:language-id</code> so ty works with <code>python-base-mode</code> (<a href="https://redirect.github.com/astral-sh/ty/issues/3532">#3532</a>)</li> <li><a href="https://github.com/astral-sh/ty/commit/8f1cee048254accb008fc391428b9c3139cebb2f"><code>8f1cee0</code></a> scripts/update_schemastore: add text=True to git revision check_output calls ...</li> <li>Additional commits viewable in <a href="https://github.com/astral-sh/ty/compare/0.0.33...0.0.42">compare view</a></li> </ul> </details> <br /> Updates `click` from 8.3.1 t... _Description has been truncated_ Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> |
||
|
|
054a6f3d8b |
release(langgraph): 1.2.4 (#7991)
Releases langgraph 1.2.4 replacement for the **yanked 1.2.3**. |
||
|
|
03b2a9fe5f | test(sdk-py): add factory-graph integration test exercising the server factory path (#7978) | ||
|
|
fb2618846b | fix(langgraph): keep _on_started backward-compatible with overrides predating cause (#7987) | ||
|
|
83dd61feac | release(langgraph): 1.2.3 (#7945) | ||
|
|
312c6d0ac1 | feat(langgraph): wire RemoteGraph.interleave to sdk-py interleave_projections (#7938) | ||
|
|
68fa011fc9 |
feat(langgraph): add v3 streaming support to RemoteGraph (#7927)
## Summary
- Adds `stream_events(version="v3")` and `astream_events(version="v3")`
to `RemoteGraph`, matching the local `CompiledStateGraph` surface and
unblocking polymorphic v3 streaming over `Graph | RemoteGraph`.
- Implementation is a thin adapter
(`libs/langgraph/langgraph/pregel/_remote_run_stream.py`) that wraps the
v3 SDK's `AsyncThreadStream` / `SyncThreadStream` and duck-types
`GraphRunStream` / `AsyncGraphRunStream`. No coupling to local v3 mux
internals.
- `v1` / `v2` paths unchanged. `astream_events(version='v1'|'v2')` still
raises `NotImplementedError` (separate gap).
### Scope decisions baked into this PR
- Unsupported v3 kwargs hard-reject at dispatch with
`NotImplementedError`: `control`, `transformers`, `interrupt_before`,
`interrupt_after`, and any unknown `**kwargs`. Server / SDK don't plumb
these through v3 yet; easy to lift later.
- Sync `interleave()` raises `NotImplementedError` pointing callers at
`astream_events`. Real sync interleave would need drainer threads;
deferred since most sync RemoteGraph callers just iterate raw events.
- Async `interleave()` is best-effort ordering (client receive order),
documented as a divergence from local v3's monotonic stamp ordering.
- Adapter `interrupted` / `interrupts` properties are **non-blocking**
snapshots of the SDK's current state. This differs from local
`(Async)GraphRunStream.interrupted`, which pump-drives the run to
terminal before returning. Callers needing a wait-for-interrupt pattern
should drain a projection (e.g., `interleave('values')`) until the SDK's
paused sentinel fires. Documented in the adapter docstrings.
### Audit of impact
Existing RemoteGraph callers in this org all use the v2 `.stream()` /
`.astream()` path (deepagents production wrapper, langgraph-api test
graphs, langgraph-supervisor TS type guard). **Zero callers** use
`stream_events` / `astream_events` on RemoteGraph today, so the new v3
methods are net-new surface — no risk of breaking existing consumers.
### Out of scope (follow-ups)
- Bumping `libs/langgraph/pyproject.toml`'s `langgraph-sdk` constraint
from `<0.4.0` to `<0.5.0`. Deferred until 0.4.0 publishes to PyPI; dev
resolution unaffected via the editable workspace dep.
- Real `astream_events(version='v1'|'v2')` implementation.
- Server-side plumbing for `control` / `interrupt_before` /
`interrupt_after` on v3 runs.
- Sync `interleave()` via drainer threads.
## Test plan
- [x] \`make test\` in \`libs/langgraph/\`: 1874 passed, 4 skipped (43
new in \`test_remote_graph_v3.py\`)
- [x] \`make lint\` in \`libs/langgraph/\`: ruff + mypy clean
- [x] \`pytest -m integration
tests/integration/test_remote_graph_v3.py\` in \`libs/sdk-py/\` against
the docker stack: 4/4 passed in 1.35s
- [x] Manual smoke: \`RemoteGraph('tools_agent',
url='http://localhost:2024').astream_events(..., version='v3')\`
end-to-end against the v3 integration api
- [x] Existing RemoteGraph v2 tests untouched (31 passed, 3 skipped with
docker up)
- [x] Will need rebase after \`langgraph-sdk 0.4.0\` lands on PyPI and
the version constraint is bumped in a separate PR
|
||
|
|
ac3f5b007b | feat(langgraph): name tool-dispatched subagents via lc_agent_name (#7928) | ||
|
|
b7fd3cf9c4 | fix(langgraph): rename ProtocolEvent.eventId to event_id to match the wire field (#7942) | ||
|
|
64bd4d1f13 | fix(langgraph): merge instead of overwrite in ensure_config for callbacks, tags, metadata, configurable (#7926) | ||
|
|
f25a0f4f4c |
fix(langgraph): [LSD-1507] Distinguish between user cancelled and other cancellations (#7920)
- Distinguish between Node cancellations and other cancellations - Use python 3.11+ feature where `cancelling() == 0` when it is the node cancelling - Bubble up the node cancellation example so the client can take care of it instead of silently failing without reporting it. Read the full contributing guidelines: https://docs.langchain.com/oss/python/contributing/overview > **All contributions must be in English.** See the [language policy](https://docs.langchain.com/oss/python/contributing/overview#language-policy). If you paste a large clearly AI generated description here your PR may be IGNORED or CLOSED! Thank you for contributing to LangGraph! Follow these steps to have your pull request considered as ready for review. 1. PR title: Should follow the format: TYPE(SCOPE): DESCRIPTION - feat(langgraph): add multi-tenant support - Allowed TYPE and SCOPE values: https://github.com/langchain-ai/langgraph/blob/main/.github/workflows/pr_lint.yml#L19-L43 2. PR description: - Write 1-2 sentences summarizing the change. - The `Fixes #xx` line at the top is **required** for external contributions — update the issue number and keep the keyword. This links your PR to the approved issue and auto-closes it on merge. - If there are any breaking changes, please clearly describe them. - If this PR depends on another PR being merged first, please include "Depends on #PR_NUMBER" in the description. 3. Run `make format`, `make lint` and `make test` from the root of the package(s) you've modified. - We will not consider a PR unless these three are passing in CI. 4. How did you verify your code works? - Existing unit tests pass - New unit tests added - Used langgraph deployment to make sure the feature is working as expected. Additional guidelines: - All external PRs must link to an issue or discussion where a solution has been approved by a maintainer, and you must be assigned to that issue. PRs without prior approval will be closed. - PRs should not touch more than one package unless absolutely necessary. - Do not update the `uv.lock` files or add dependencies to `pyproject.toml` files (even optional ones) unless you have explicit permission to do so by a maintainer. ## Social handles (optional) <!-- If you'd like a shoutout on release, add your socials below --> Twitter: @ LinkedIn: https://linkedin.com/in/ |
||
|
|
b4018e8222 |
fix(cli): bump api bound to 0.10.0 (#7922)
Allows the CLI to support langgraph-api versions 0.9.x |
||
|
|
d482fca105 | feat(sdk-py): add websocket stream transports (#7830) | ||
|
|
30fea64687 | feat(sdk-py): add messages and tool call projections (#7823) | ||
|
|
3268a54791 | feat(sdk-py): add v3 streaming primitives and SSE transport (#7818) | ||
|
|
add269632b |
chore(langgraph): bump version to 1.2.2 (#7914)
Patch bump to 1.2.2 following the 1.2.1 release. |
||
|
|
5d5a64120e |
fix(langgraph): assign stable IDs to id=None BaseMessages before DeltaChannel checkpoint writes (#7913)
## TL;DR
Applications depend on stable message IDs — LangSmith traces, message
views, and `RemoveMessage` all break when the same message gets a
different ID on every load.
ID assignment has historically lived in the `add_messages` reducer, but
that's the wrong place: reducer logic runs *after* checkpoint
serialisation has already started. The correct long-term fix is to
assign IDs in `BaseMessage.__init__`, but that requires changes to
`langchain-core` equality semantics first.
**This PR is the non-breaking interim fix:** assign IDs to `BaseMessage`
objects in `put_writes()`, before the DeltaChannel write is handed to
the background serialiser. This unblocks applications now without
touching `BaseMessage`.
---
## Problem
In the default durability mode, `put_writes()` submits checkpoint writes
to a background thread before `apply_writes()` runs. For DeltaChannel
writes containing `BaseMessage` objects with `id=None`, the background
thread may serialise `id=None` before the reducer ever sees them. Every
`get_state()` call then replays `id=None` and assigns a fresh UUID — the
same message has a different ID on every load and across every resumed
invocation.
## Fix
Add `ensure_message_ids(value)` to `pregel/_messages.py` and call it in
`put_writes()` for DeltaChannel writes **before** submitting to the
background executor. This assigns UUIDs synchronously so the serialised
bytes always carry a stable ID.
Both `SyncPregelLoop` and `AsyncPregelLoop` delegate to
`super().put_writes()`, so both paths are covered with one change.
## Long-term
ID assignment belongs in `BaseMessage.__init__`. That requires first
excluding `id` from `BaseMessage.__eq__` (currently `HumanMessage("x")
!= HumanMessage("x")` if both get different auto-assigned UUIDs). That
is a `langchain-core` change tracked separately.
## Changes
- `pregel/_messages.py` — `ensure_message_ids(value)`: assigns a UUID to
any `id=None` `BaseMessage`, handles single messages and lists
- `pregel/_loop.py` — call it for DeltaChannel writes in `put_writes()`
- `tests/test_delta_channel_id_stability.py` — two tests (sync + async)
using a plain append reducer (no ID logic), confirmed to **fail on
`main`** and pass with this fix
Related deepagents PR:
https://github.com/langchain-ai/deepagents/pull/3590
|
||
|
|
d1e2ff0561 |
release(checkpoint): 4.1.1 (#7890)
## Summary Bumps `langgraph-checkpoint` `4.1.0` → `4.1.1` and updates all downstream `uv.lock` files. ## Test plan - [x] `make format` / `make lint` / `make test` from `libs/checkpoint/` |
||
|
|
bf7fec0bd1 |
release(langgraph): 1.2.1 (#7883)
releasing 1.2.1 Notable changes since 1.2.0: - feat(langgraph): add `before_builtins` opt-in for stream transformers (#7882) - fix(langgraph): keep tool results out of v3 messages (#7838) - chore(deps): bump langsmith from 0.7.31 to 0.8.0 (#7788) - chore(deps): bump idna from 3.11 to 3.15 (#7866) |
||
|
|
8215a9d024 |
feat(langgraph): add before_builtins opt-in for stream transformers (#7882)
|
||
|
|
a45902061b |
chore(deps): bump idna from 3.11 to 3.15 in /libs/langgraph (#7866)
Bumps [idna](https://github.com/kjd/idna) from 3.11 to 3.15. <details> <summary>Changelog</summary> <p><em>Sourced from <a href="https://github.com/kjd/idna/blob/master/HISTORY.md">idna's changelog</a>.</em></p> <blockquote> <h2>3.15 (2026-05-12)</h2> <ul> <li>Enforce DNS-length cap on individual labels early in <code>check_label</code>, short-circuiting contextual-rule processing for oversized input while staying compatible with UTS 46 usage.</li> <li>Tidy core helpers: hoist bidi category sets to module-level frozensets (avoiding per-codepoint list construction), simplify length checks, and reuse the shared <code>_unicode_dots_re</code> from <code>idna.core</code> in the codec module.</li> <li>Use <code>raise ... from err</code> for proper exception chaining and switch internal string formatting to f-strings.</li> <li>Allow <code>flit_core</code> 4.x in the build backend.</li> <li>Expand the ruff lint set (flake8-bugbear, flake8-simplify, pyupgrade, perflint) and apply the surfaced fixes; pin lint CI to Python 3.14.</li> <li>Add Dependabot configuration for GitHub Actions.</li> <li>Convert README and HISTORY from reStructuredText to Markdown.</li> <li>Reference CVE-2026-45409 for the 3.14 advisory in place of the initial GHSA identifier.</li> </ul> <p>Thanks to Felix Yan, Stan Ulbrych, and metsw24-max for contributions to this release.</p> <h2>3.14 (2026-05-10)</h2> <ul> <li>Removed opportunity to process long inputs into quadratic time by rejecting oversize inputs up-front. Closes a bypass of the CVE-2024-3651 mitigation. [CVE-2026-45409]</li> </ul> <p>Thanks to Stan Ulbrych for reporting the issue.</p> <h2>3.13 (2026-04-22)</h2> <ul> <li>Correct classification error for codepoint U+A7F1</li> </ul> <h2>3.12 (2026-04-21)</h2> <ul> <li>Update to Unicode 17.0.0.</li> <li>Issue a deprecation warning for the transitional argument.</li> <li>Added lazy-loading to provide some performance improvements.</li> <li>Removed vestiges of code related to Python 2 support, including segmentation of data structures specific to Jython.</li> </ul> <p>Thanks to Rodrigo Nogueira for contributions to this release.</p> </blockquote> </details> <details> <summary>Commits</summary> <ul> <li><a href="https://github.com/kjd/idna/commit/af30a092e158181d0b35ac66dfa813788126bdd8"><code>af30a09</code></a> Release 3.15</li> <li><a href="https://github.com/kjd/idna/commit/30314d4628744ca14cf2b5820564e5127a9f86f2"><code>30314d4</code></a> Pre-release 3.15rc0</li> <li><a href="https://github.com/kjd/idna/commit/05d4b219aa9eddc47371fcbd2000f0301016f3e9"><code>05d4b21</code></a> Merge pull request <a href="https://redirect.github.com/kjd/idna/issues/237">#237</a> from kjd/convert-docs-to-markdown</li> <li><a href="https://github.com/kjd/idna/commit/2987fdba1962bbb2358399e0084ba062b98a0bee"><code>2987fdb</code></a> Convert README and HISTORY from reStructuredText to Markdown</li> <li><a href="https://github.com/kjd/idna/commit/59fa8002d514bf4a5ce7b58f67b9ec587d53fa9c"><code>59fa800</code></a> Merge pull request <a href="https://redirect.github.com/kjd/idna/issues/236">#236</a> from kjd/dependabot/github_actions/actions-f3e34333ea</li> <li><a href="https://github.com/kjd/idna/commit/def69834ced5d4b3c50439d8b99c4c856ec19ca2"><code>def6983</code></a> Merge branch 'master' into dependabot/github_actions/actions-f3e34333ea</li> <li><a href="https://github.com/kjd/idna/commit/bbd8004a797185d8c56bb555cd5c88fde05e0631"><code>bbd8004</code></a> Merge pull request <a href="https://redirect.github.com/kjd/idna/issues/234">#234</a> from StanFromIreland/patch-1</li> <li><a href="https://github.com/kjd/idna/commit/edd07c05024344a6ccb517414ccb36683aee99fc"><code>edd07c0</code></a> Bump github/codeql-action from 3.35.2 to 4.35.2 in the actions group</li> <li><a href="https://github.com/kjd/idna/commit/5557db030c11bdec50d62aa5f631d705d33ba123"><code>5557db0</code></a> Merge branch 'master' into patch-1</li> <li><a href="https://github.com/kjd/idna/commit/f11746cf4981d25123ef7830d3ee60f07de8ae3d"><code>f11746c</code></a> Merge pull request <a href="https://redirect.github.com/kjd/idna/issues/235">#235</a> from StanFromIreland/patch-2</li> <li>Additional commits viewable in <a href="https://github.com/kjd/idna/compare/v3.11...v3.15">compare view</a></li> </ul> </details> <br /> [](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) --- <details> <summary>Dependabot commands and options</summary> <br /> You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot show <dependency name> ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself) You can disable automated security fix PRs for this repo from the [Security Alerts page](https://github.com/langchain-ai/langgraph/network/alerts). </details> Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> |
||
|
|
ea44df3476 |
fix(langgraph): keep tool results out of v3 messages (#7838)
## Summary
- Filter `ToolMessage` from v3 `run.messages` streaming (handler +
`MessagesTransformer`) so tool results do not appear as chat text
deltas.
- Normalize `ToolCallStream.output` in `ToolCallTransformer` so live and
serialized `ToolMessage` payloads resolve to raw `content`.
- Add regression tests for message filtering and tool-output unwrapping.
<details>
<summary>Reproducible script</summary>
```python
"""Repro: v3 tool results must not leak through run.messages."""
from __future__ import annotations
import asyncio
from collections.abc import Callable, Sequence
from typing import Any
from uuid import uuid4
from deepagents import create_deep_agent
from langchain_core.callbacks import CallbackManagerForLLMRun
from langchain_core.language_models import BaseChatModel, LanguageModelInput
from langchain_core.messages import AIMessage, HumanMessage, ToolCall, ToolMessage
from langchain_core.outputs import ChatGeneration, ChatResult
from langchain_core.runnables import Runnable
from langchain_core.tools import BaseTool, tool
from pydantic import Field
TOOL_RESULT_SENTINEL = "[]"
class ScriptedChatModel(BaseChatModel):
responses: list[AIMessage] = Field(default_factory=list)
tools: Sequence[dict[str, Any] | type | Callable | BaseTool] = ()
_idx: int = 0
@property
def _llm_type(self) -> str:
return "scripted"
def _generate(
self,
messages: Sequence[Any],
stop: list[str] | None = None,
run_manager: CallbackManagerForLLMRun | None = None,
**kwargs: Any,
) -> ChatResult:
del messages, stop, run_manager, kwargs
idx = min(self._idx, len(self.responses) - 1)
self._idx += 1
return ChatResult(generations=[ChatGeneration(message=self.responses[idx])])
def bind_tools(
self,
tools: Sequence[dict[str, Any] | type | Callable | BaseTool],
*,
tool_choice: str | None = None,
**kwargs: Any,
) -> Runnable[LanguageModelInput, AIMessage]:
del tool_choice, kwargs
self.tools = tools
return self
@tool
def list_items() -> str:
"""List available items."""
return TOOL_RESULT_SENTINEL
def _tool_call_message() -> AIMessage:
return AIMessage(
content="",
tool_calls=[
ToolCall(id="call_list", name="list_items", args={}),
],
)
def _extract_text_delta(event: Any) -> str | None:
if isinstance(event, dict):
if event.get("event") != "content-block-delta":
return None
delta = event.get("delta")
if isinstance(delta, dict) and delta.get("type") == "text-delta":
text = delta.get("text")
return text if isinstance(text, str) else None
elif getattr(event, "event", None) == "content-block-delta":
delta = getattr(event, "delta", None)
if isinstance(delta, dict) and delta.get("type") == "text-delta":
text = delta.get("text")
return text if isinstance(text, str) else None
text = getattr(delta, "text", None)
return text if isinstance(text, str) else None
return None
async def _tool_output(tool_call: Any) -> Any:
output = getattr(tool_call, "output", None)
if callable(output):
return await output()
if hasattr(output, "__await__"):
return await output
return output
async def main() -> None:
model = ScriptedChatModel(
responses=[
_tool_call_message(),
AIMessage(content="No items found."),
]
)
agent = create_deep_agent(model=model, tools=[list_items])
run = await agent.astream_events(
{"messages": [HumanMessage(content="List items")]},
version="v3",
configurable={"thread_id": str(uuid4())},
recursion_limit=50,
)
async def collect_message_texts() -> list[str]:
texts: list[str] = []
async for message_stream in run.messages:
async for event in message_stream:
text = _extract_text_delta(event)
if text is not None:
texts.append(text)
return texts
async def collect_tool_outputs() -> list[Any]:
outputs: list[Any] = []
async for tool_call in run.tool_calls:
outputs.append(await _tool_output(tool_call))
return outputs
message_texts, tool_outputs, final_state = await asyncio.gather(
collect_message_texts(),
collect_tool_outputs(),
run.output(),
)
final_messages = final_state["messages"]
tool_message = next((m for m in final_messages if isinstance(m, ToolMessage)), None)
print("run.messages text deltas:", message_texts)
print("run.tool_calls outputs:", tool_outputs)
print("final state message roles:", [m.type for m in final_messages])
if TOOL_RESULT_SENTINEL in message_texts:
raise AssertionError("Tool result leaked through run.messages.")
if TOOL_RESULT_SENTINEL not in tool_outputs:
raise AssertionError("Tool output was not surfaced through run.tool_calls.")
if tool_message is None or tool_message.tool_call_id != "call_list":
raise AssertionError("Final state does not contain the expected ToolMessage.")
print("Reproduction passed: tool output stayed out of run.messages.")
if __name__ == "__main__":
asyncio.run(main())
```
</details>
<details>
<summary>Current behavior</summary>
```text
run.messages text deltas: ['[]', 'No items found.']
run.tool_calls outputs: [ToolMessage(content='[]', ...)]
final state message roles: ['human', 'ai', 'tool', 'ai']
AssertionError: Tool result leaked through run.messages.
```
</details>
<details>
<summary>Expected behavior</summary>
```text
run.messages text deltas: ['No items found.']
run.tool_calls outputs: ['[]']
final state message roles: ['human', 'ai', 'tool', 'ai']
Reproduction passed: tool output stayed out of run.messages.
```
</details>
## Test plan
- [ ] `uv run --project libs/langgraph pytest
libs/langgraph/tests/test_stream_messages_transformer.py`
- [ ] `uv run --project libs/prebuilt pytest
libs/prebuilt/tests/test_tool_call_transformer.py`
- [ ] `uv run --project libs/langgraph ruff check` (touched files)
- [ ] `uv run --project libs/prebuilt ruff check` (touched files)
Related:
[langchain-ai/langchainjs#10900](https://github.com/langchain-ai/langchainjs/pull/10900)
|
||
|
|
296a83b8ff |
chore(deps): bump langsmith from 0.7.31 to 0.8.0 in /libs/langgraph (#7788)
Bumps [langsmith](https://github.com/langchain-ai/langsmith-sdk) from 0.7.31 to 0.8.0. <details> <summary>Release notes</summary> <p><em>Sourced from <a href="https://github.com/langchain-ai/langsmith-sdk/releases">langsmith's releases</a>.</em></p> <blockquote> <h2>v0.8.0</h2> <h2>What's Changed</h2> <ul> <li>feat(js,py): JS 0.6.0, Py 0.8.0 by <a href="https://github.com/jacoblee93"><code>@jacoblee93</code></a> in <a href="https://redirect.github.com/langchain-ai/langsmith-sdk/pull/2831">langchain-ai/langsmith-sdk#2831</a></li> <li>release(js): 0.6.0 by <a href="https://github.com/jacoblee93"><code>@jacoblee93</code></a> in <a href="https://redirect.github.com/langchain-ai/langsmith-sdk/pull/2832">langchain-ai/langsmith-sdk#2832</a></li> <li>release(py): 0.8.0 by <a href="https://github.com/jacoblee93"><code>@jacoblee93</code></a> in <a href="https://redirect.github.com/langchain-ai/langsmith-sdk/pull/2833">langchain-ai/langsmith-sdk#2833</a></li> </ul> <p><strong>Full Changelog</strong>: <a href="https://github.com/langchain-ai/langsmith-sdk/compare/v0.7.38...v0.8.0">https://github.com/langchain-ai/langsmith-sdk/compare/v0.7.38...v0.8.0</a></p> <h2>v0.7.38</h2> <h2>What's Changed</h2> <ul> <li>feat(js): add tracing of opencode by <a href="https://github.com/dqbd"><code>@dqbd</code></a> in <a href="https://redirect.github.com/langchain-ai/langsmith-sdk/pull/2776">langchain-ai/langsmith-sdk#2776</a></li> <li>chore(js): Remove types/uuid by <a href="https://github.com/jacoblee93"><code>@jacoblee93</code></a> in <a href="https://redirect.github.com/langchain-ai/langsmith-sdk/pull/2814">langchain-ai/langsmith-sdk#2814</a></li> <li>docs(sandbox): document default idle TTL of 10 minutes by <a href="https://github.com/DanielKneipp"><code>@DanielKneipp</code></a> in <a href="https://redirect.github.com/langchain-ai/langsmith-sdk/pull/2788">langchain-ai/langsmith-sdk#2788</a></li> <li>ci(py): Bump pytest timeout to 2m by <a href="https://github.com/jacoblee93"><code>@jacoblee93</code></a> in <a href="https://redirect.github.com/langchain-ai/langsmith-sdk/pull/2815">langchain-ai/langsmith-sdk#2815</a></li> <li>chore(deps-dev): bump the js-minor-and-patch group across 1 directory with 4 updates by <a href="https://github.com/dependabot"><code>@dependabot</code></a>[bot] in <a href="https://redirect.github.com/langchain-ai/langsmith-sdk/pull/2803">langchain-ai/langsmith-sdk#2803</a></li> <li>chore(deps): update sphinx-autobuild requirement from >=2024 to >=2024.10.3 in /python by <a href="https://github.com/dependabot"><code>@dependabot</code></a>[bot] in <a href="https://redirect.github.com/langchain-ai/langsmith-sdk/pull/2809">langchain-ai/langsmith-sdk#2809</a></li> <li>chore(deps): update myst-nb requirement from >=1.1.1 to >=1.4.0 in /python by <a href="https://github.com/dependabot"><code>@dependabot</code></a>[bot] in <a href="https://redirect.github.com/langchain-ai/langsmith-sdk/pull/2810">langchain-ai/langsmith-sdk#2810</a></li> <li>chore(deps-dev): bump types-pyyaml from 6.0.12.20250915 to 6.0.12.20260408 in /python by <a href="https://github.com/dependabot"><code>@dependabot</code></a>[bot] in <a href="https://redirect.github.com/langchain-ai/langsmith-sdk/pull/2812">langchain-ai/langsmith-sdk#2812</a></li> <li>chore(deps-dev): bump <code>@langchain/openai</code> from 0.5.18 to 0.6.17 in /js by <a href="https://github.com/dependabot"><code>@dependabot</code></a>[bot] in <a href="https://redirect.github.com/langchain-ai/langsmith-sdk/pull/2806">langchain-ai/langsmith-sdk#2806</a></li> <li>chore(deps): bump the py-minor-and-patch group across 1 directory with 18 updates by <a href="https://github.com/dependabot"><code>@dependabot</code></a>[bot] in <a href="https://redirect.github.com/langchain-ai/langsmith-sdk/pull/2808">langchain-ai/langsmith-sdk#2808</a></li> <li>feat(py): Adds strands OTEL exporter by <a href="https://github.com/jacoblee93"><code>@jacoblee93</code></a> in <a href="https://redirect.github.com/langchain-ai/langsmith-sdk/pull/2817">langchain-ai/langsmith-sdk#2817</a></li> <li>chore(js): Switch to oxfmt and oxlint by <a href="https://github.com/jacoblee93"><code>@jacoblee93</code></a> in <a href="https://redirect.github.com/langchain-ai/langsmith-sdk/pull/2819">langchain-ai/langsmith-sdk#2819</a></li> <li>fix(py): fix RunTree ValidationError when inputs or outputs is a Pydantic BaseModel by <a href="https://github.com/QuentinBrosse"><code>@QuentinBrosse</code></a> in <a href="https://redirect.github.com/langchain-ai/langsmith-sdk/pull/2820">langchain-ai/langsmith-sdk#2820</a></li> <li>chore: add apac support by <a href="https://github.com/joaquin-borggio-lc"><code>@joaquin-borggio-lc</code></a> in <a href="https://redirect.github.com/langchain-ai/langsmith-sdk/pull/2821">langchain-ai/langsmith-sdk#2821</a></li> <li>fix(js): Pull Claude Agent SDK subagent runs from transcript, add tool span for subagents, merge message blocks by id by <a href="https://github.com/jacoblee93"><code>@jacoblee93</code></a> in <a href="https://redirect.github.com/langchain-ai/langsmith-sdk/pull/2816">langchain-ai/langsmith-sdk#2816</a></li> <li>release(js): 0.5.26 by <a href="https://github.com/jacoblee93"><code>@jacoblee93</code></a> in <a href="https://redirect.github.com/langchain-ai/langsmith-sdk/pull/2824">langchain-ai/langsmith-sdk#2824</a></li> <li>release(py): 0.7.38 by <a href="https://github.com/jacoblee93"><code>@jacoblee93</code></a> in <a href="https://redirect.github.com/langchain-ai/langsmith-sdk/pull/2825">langchain-ai/langsmith-sdk#2825</a></li> </ul> <p><strong>Full Changelog</strong>: <a href="https://github.com/langchain-ai/langsmith-sdk/compare/v0.7.37...v0.7.38">https://github.com/langchain-ai/langsmith-sdk/compare/v0.7.37...v0.7.38</a></p> <h2>v0.7.37</h2> <h2>What's Changed</h2> <ul> <li>perf(js): Offload serialize to worker thread at flush time by <a href="https://github.com/jacoblee93"><code>@jacoblee93</code></a> in <a href="https://redirect.github.com/langchain-ai/langsmith-sdk/pull/2781">langchain-ai/langsmith-sdk#2781</a></li> <li>release(js): 0.5.24 by <a href="https://github.com/emil-lc"><code>@emil-lc</code></a> in <a href="https://redirect.github.com/langchain-ai/langsmith-sdk/pull/2790">langchain-ai/langsmith-sdk#2790</a></li> <li>chore(js): Fix perf test flagging by <a href="https://github.com/jacoblee93"><code>@jacoblee93</code></a> in <a href="https://redirect.github.com/langchain-ai/langsmith-sdk/pull/2792">langchain-ai/langsmith-sdk#2792</a></li> <li>feat(js,python): Adds hub model config and provider to schemas by <a href="https://github.com/jacoblee93"><code>@jacoblee93</code></a> in <a href="https://redirect.github.com/langchain-ai/langsmith-sdk/pull/2793">langchain-ai/langsmith-sdk#2793</a></li> <li>fix(js): minor test improvements by <a href="https://github.com/christian-bromann"><code>@christian-bromann</code></a> in <a href="https://redirect.github.com/langchain-ai/langsmith-sdk/pull/2429">langchain-ai/langsmith-sdk#2429</a></li> <li>fix(js): Include auth headers on info requests by <a href="https://github.com/jacoblee93"><code>@jacoblee93</code></a> in <a href="https://redirect.github.com/langchain-ai/langsmith-sdk/pull/2800">langchain-ai/langsmith-sdk#2800</a></li> <li>release(js): 0.5.25 by <a href="https://github.com/jacoblee93"><code>@jacoblee93</code></a> in <a href="https://redirect.github.com/langchain-ai/langsmith-sdk/pull/2801">langchain-ai/langsmith-sdk#2801</a></li> <li>fix(python): flush both tracing_queue and compressed_traces in flush() by <a href="https://github.com/angus-langchain"><code>@angus-langchain</code></a> in <a href="https://redirect.github.com/langchain-ai/langsmith-sdk/pull/2796">langchain-ai/langsmith-sdk#2796</a></li> <li>chore(deps): bump postcss from 8.5.8 to 8.5.10 in /js/internal/environment_tests/test-exports-vite in the npm_and_yarn group across 1 directory by <a href="https://github.com/dependabot"><code>@dependabot</code></a>[bot] in <a href="https://redirect.github.com/langchain-ai/langsmith-sdk/pull/2791">langchain-ai/langsmith-sdk#2791</a></li> <li>chore(deps-dev): bump google-adk from 1.10.0 to 1.28.1 in /python by <a href="https://github.com/dependabot"><code>@dependabot</code></a>[bot] in <a href="https://redirect.github.com/langchain-ai/langsmith-sdk/pull/2794">langchain-ai/langsmith-sdk#2794</a></li> <li>fix(python): flush pending traces during Client.cleanup() by <a href="https://github.com/angus-langchain"><code>@angus-langchain</code></a> in <a href="https://redirect.github.com/langchain-ai/langsmith-sdk/pull/2799">langchain-ai/langsmith-sdk#2799</a></li> <li>fix(py): Fix concurrency for multiple Claude Agent SDK sessions by <a href="https://github.com/jacoblee93"><code>@jacoblee93</code></a> in <a href="https://redirect.github.com/langchain-ai/langsmith-sdk/pull/2795">langchain-ai/langsmith-sdk#2795</a></li> <li>release(py): 0.7.37 by <a href="https://github.com/jacoblee93"><code>@jacoblee93</code></a> in <a href="https://redirect.github.com/langchain-ai/langsmith-sdk/pull/2802">langchain-ai/langsmith-sdk#2802</a></li> </ul> <p><strong>Full Changelog</strong>: <a href="https://github.com/langchain-ai/langsmith-sdk/compare/v0.7.36...v0.7.37">https://github.com/langchain-ai/langsmith-sdk/compare/v0.7.36...v0.7.37</a></p> <!-- raw HTML omitted --> </blockquote> <p>... (truncated)</p> </details> <details> <summary>Commits</summary> <ul> <li><a href="https://github.com/langchain-ai/langsmith-sdk/commit/cf01c873d50f2f50249f1975b8d443a546168a85"><code>cf01c87</code></a> release(py): 0.8.0 (<a href="https://redirect.github.com/langchain-ai/langsmith-sdk/issues/2833">#2833</a>)</li> <li><a href="https://github.com/langchain-ai/langsmith-sdk/commit/fd049c84648aa168e42636744587be0e0589da01"><code>fd049c8</code></a> release(js): 0.6.0 (<a href="https://redirect.github.com/langchain-ai/langsmith-sdk/issues/2832">#2832</a>)</li> <li><a href="https://github.com/langchain-ai/langsmith-sdk/commit/092a8866c473810712fb7983459923cbbfce3069"><code>092a886</code></a> feat(js,py): JS 0.6.0, Py 0.8.0 (<a href="https://redirect.github.com/langchain-ai/langsmith-sdk/issues/2831">#2831</a>)</li> <li><a href="https://github.com/langchain-ai/langsmith-sdk/commit/ff180c04237511b341ed455cfbfe6cadd9a5eeab"><code>ff180c0</code></a> release(py): 0.7.38 (<a href="https://redirect.github.com/langchain-ai/langsmith-sdk/issues/2825">#2825</a>)</li> <li><a href="https://github.com/langchain-ai/langsmith-sdk/commit/d9de3ca801dc8a9e81d6e7dbb0bc5547a505f115"><code>d9de3ca</code></a> release(js): 0.5.26 (<a href="https://redirect.github.com/langchain-ai/langsmith-sdk/issues/2824">#2824</a>)</li> <li><a href="https://github.com/langchain-ai/langsmith-sdk/commit/14283948316ba4a274622440d537e61aec85b8c3"><code>1428394</code></a> fix(js): Pull Claude Agent SDK subagent runs from transcript, add tool span f...</li> <li><a href="https://github.com/langchain-ai/langsmith-sdk/commit/838e957d8027a8ff2e9e7cf8a10e874bfae328d7"><code>838e957</code></a> chore: add apac support (<a href="https://redirect.github.com/langchain-ai/langsmith-sdk/issues/2821">#2821</a>)</li> <li><a href="https://github.com/langchain-ai/langsmith-sdk/commit/003f22a768f7dad7efdeb775d0b1199a125ce4fe"><code>003f22a</code></a> fix(py): fix RunTree ValidationError when inputs or outputs is a Pydantic Bas...</li> <li><a href="https://github.com/langchain-ai/langsmith-sdk/commit/8f5ef27c2d76dd62353b22f63b32a987e5d07407"><code>8f5ef27</code></a> chore(js): Switch to oxfmt and oxlint (<a href="https://redirect.github.com/langchain-ai/langsmith-sdk/issues/2819">#2819</a>)</li> <li><a href="https://github.com/langchain-ai/langsmith-sdk/commit/9873633c9f066fc1c3ed7641ad54d646c90dae09"><code>9873633</code></a> feat(py): Adds strands OTEL exporter (<a href="https://redirect.github.com/langchain-ai/langsmith-sdk/issues/2817">#2817</a>)</li> <li>Additional commits viewable in <a href="https://github.com/langchain-ai/langsmith-sdk/compare/v0.7.31...v0.8.0">compare view</a></li> </ul> </details> <br /> [](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) --- <details> <summary>Dependabot commands and options</summary> <br /> You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot show <dependency name> ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself) You can disable automated security fix PRs for this repo from the [Security Alerts page](https://github.com/langchain-ai/langgraph/network/alerts). </details> Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> |
||
|
|
3614e88c58 |
release: bump alpha packages to official versions (#7775)
## Summary Bumps all alpha-versioned packages to their official releases: - `langgraph`: `1.2.0a7` → `1.2.0` - `langgraph-checkpoint`: `4.1.0a4` → `4.1.0` - `langgraph-checkpoint-postgres`: `3.1.0a4` → `3.1.0` - `langgraph-checkpoint-sqlite`: `3.1.0a1` → `3.1.0` - `langgraph-prebuilt`: `1.1.0a2` → `1.1.0` Also removes the `a*` alpha specifiers from cross-dependency pins in `langgraph`, `checkpoint-postgres`, and `checkpoint-sqlite`, and regenerates all `uv.lock` files. |
||
|
|
6dff3b3bce |
feat(langgraph): durable error-handler resume across host crashes (#7773)
## Summary - **Consolidate error writes:** When a node fails and has an error handler, `commit()` now appends both `ERROR` and `ERROR_SOURCE_NODE` in a single `put_writes` call, eliminating the redundant overwrite that `schedule_error_handler` used to do. - **Ensure durability before handler execution:** Reuses the `_delta_write_futs` pattern — a new `_error_handler_write_futs` list collects the persistence future from `put_writes` when `ERROR_SOURCE_NODE` is written, and `schedule_error_handler` / `aschedule_error_handler` drain it (sync: `concurrent.futures.wait`, async: `asyncio.gather`) before preparing the handler task. - **Resume directly to error handler:** Adds `_resume_error_handlers_if_applicable()` to `PregelLoop`, called from `tick()` after `_reapply_writes_to_succeeded_nodes()`. On resume, it detects `ERROR_SOURCE_NODE` markers in `checkpoint_pending_writes`, marks the original task as done (so the runner skips it), and schedules a fresh handler task. - **Rename internal methods for clarity:** `_match_writes` → `_reapply_writes_to_succeeded_nodes` (makes it clear that failed/interrupted tasks are skipped); `_resume_error_handlers` → `_resume_error_handlers_if_applicable`. ## Test plan - [x] `test_error_handler_resumes_after_crash`: single node fails, handler crashes, resume re-runs the handler (not the original node). Verifies `NodeError.node` and error content survive checkpoint round-trip. - [x] `test_error_handler_resumes_after_crash_multiple_nodes`: two nodes fail concurrently in the same superstep, each with its own handler. Verifies error handler starts while other nodes are still in-flight (via `threading.Event`), and on resume both handlers re-run with correct `NodeError.node` and error content. - [x] All 101 tests in `test_retry.py` pass (including 19 error-handler tests). - [x] `make format` + `make lint` clean. |
||
|
|
3db82d5b6d |
feat(langgraph): add set_node_defaults() to StateGraph (#7747)
Add `StateGraph.set_node_defaults()` — a fluent builder method for
setting graph-wide node policies in one place. Per-node values from
`add_node()` always take precedence. Defaults are applied at `compile()`
time.
```python
graph = (
StateGraph(State)
.set_node_defaults(
retry_policy=RetryPolicy(max_attempts=3),
error_handler=my_fallback_handler,
timeout=TimeoutPolicy(run_timeout=30),
)
.add_node("a", node_a)
.add_node("b", node_b, retry_policy=custom) # overrides default
.add_edge(START, "a")
.compile()
)
```
Error handlers are never invoked on error-handler nodes themselves —
handler failures fail the run. Not inherited by subgraphs.
## Supported defaults
| `set_node_defaults()` kwarg | Fallback for `add_node(...)` kwarg |
Applies to error-handler nodes? |
|---|---|---|
| `retry_policy` | `retry_policy` | Yes |
| `cache_policy` | `cache_policy` | No — caching handler results is
unsafe |
| `error_handler` | `error_handler` | No — handlers must never catch
themselves |
| `timeout` | `timeout` | Yes |
## Changes
- `libs/langgraph/langgraph/graph/state.py` — new `_NodeDefaults`
dataclass, `set_node_defaults()` method on `StateGraph`; `compile()`
applies builder defaults to node specs with per-branch rules for which
defaults apply to error-handler nodes.
- `libs/langgraph/tests/test_retry.py` — 14 new tests covering all four
policy types, per-node override precedence, chaining, combined
retry+handler, handler exclusion, `RunnableConfig` injection, and name
collision.
## Verification
`make format`, `make lint`, `make test` all passing in `libs/langgraph`.
---------
Co-authored-by: Sydney Runkle <sydneymarierunkle@gmail.com>
|
||
|
|
29fefa0f05 |
chore(deps): bump urllib3 from 2.6.3 to 2.7.0 in /libs/langgraph (#7766)
Bumps [urllib3](https://github.com/urllib3/urllib3) from 2.6.3 to 2.7.0. <details> <summary>Release notes</summary> <p><em>Sourced from <a href="https://github.com/urllib3/urllib3/releases">urllib3's releases</a>.</em></p> <blockquote> <h2>2.7.0</h2> <h2>🚀 urllib3 is fundraising for HTTP/2 support</h2> <p><a href="https://sethmlarson.dev/urllib3-is-fundraising-for-http2-support">urllib3 is raising ~$40,000 USD</a> to release HTTP/2 support and ensure long-term sustainable maintenance of the project after a sharp decline in financial support. If your company or organization uses Python and would benefit from HTTP/2 support in Requests, pip, cloud SDKs, and thousands of other projects <a href="https://opencollective.com/urllib3">please consider contributing financially</a> to ensure HTTP/2 support is developed sustainably and maintained for the long-haul.</p> <p>Thank you for your support.</p> <h2>Security</h2> <p>Addressed high-severity security issues. Impact was limited to specific use cases detailed in the accompanying advisories; overall user exposure was estimated to be marginal.</p> <ul> <li> <p>Decompression-bomb safeguards of the streaming API were bypassed:</p> <ol> <li>When <code>HTTPResponse.drain_conn()</code> was called after the response had been read and decompressed partially. (Reported by <a href="https://github.com/Cycloctane"><code>@Cycloctane</code></a>)</li> <li>During the second <code>HTTPResponse.read(amt=N)</code> or <code>HTTPResponse.stream(amt=N)</code> call when the response was decompressed using the official <a href="https://pypi.org/project/brotli/">Brotli</a> library. (Reported by <a href="https://github.com/kimkou2024"><code>@kimkou2024</code></a>)</li> </ol> <p>See GHSA-mf9v-mfxr-j63j for details.</p> </li> <li> <p>HTTP pools created using <code>ProxyManager.connection_from_url</code> did not strip sensitive headers specified in <code>Retry.remove_headers_on_redirect</code> when redirecting to a different host. (GHSA-qccp-gfcp-xxvc reported by <a href="https://github.com/christos-spearbit"><code>@christos-spearbit</code></a>)</p> </li> </ul> <h2>Deprecations and Removals</h2> <ul> <li>Used <code>FutureWarning</code> instead of <code>DeprecationWarning</code> for better visibility of existing deprecation notices. Rescheduled the removal of deprecated features to version 3.0. (<a href="https://redirect.github.com/urllib3/urllib3/issues/3763">urllib3/urllib3#3763</a>)</li> <li>Removed support for end-of-life Python 3.9. (<a href="https://redirect.github.com/urllib3/urllib3/issues/3720">urllib3/urllib3#3720</a>)</li> <li>Removed support for end-of-life PyPy3.10. (<a href="https://redirect.github.com/urllib3/urllib3/issues/4979">urllib3/urllib3#4979</a>)</li> <li>Bumped the minimum supported pyOpenSSL version to 19.0.0. (<a href="https://redirect.github.com/urllib3/urllib3/issues/3777">urllib3/urllib3#3777</a>)</li> </ul> <h2>Bugfixes</h2> <ul> <li>Fixed a bug where <code>HTTPResponse.read(amt=None)</code> was ignoring decompressed data buffered from previous partial reads. (<a href="https://redirect.github.com/urllib3/urllib3/issues/3636">urllib3/urllib3#3636</a>)</li> <li>Fixed a bug where <code>HTTPResponse.read()</code> could cache only part of the response after a partial read when <code>cache_content=True</code>. (<a href="https://redirect.github.com/urllib3/urllib3/issues/4967">urllib3/urllib3#4967</a>)</li> <li>Fixed <code>HTTPResponse.stream()</code> and <code>HTTPResponse.read_chunked()</code> to handle <code>amt=0</code>. (<a href="https://redirect.github.com/urllib3/urllib3/issues/3793">urllib3/urllib3#3793</a>)</li> <li>Updated <code>_TYPE_BODY</code> type alias to include missing <code>Iterable[str]</code>, matching the documented and runtime behavior of chunked request bodies. (<a href="https://redirect.github.com/urllib3/urllib3/issues/3798">urllib3/urllib3#3798</a>)</li> <li>Fixed <code>LocationParseError</code> when paths resembling schemeless URIs were passed to <code>HTTPConnectionPool.urlopen()</code>. (<a href="https://redirect.github.com/urllib3/urllib3/issues/3352">urllib3/urllib3#3352</a>)</li> <li>Fixed <code>BaseHTTPResponse.readinto()</code> type annotation to accept <code>memoryview</code> in addition to <code>bytearray</code>, matching the <code>io.RawIOBase.readinto</code> contract and enabling use with <code>io.BufferedReader</code> without type errors. (<a href="https://redirect.github.com/urllib3/urllib3/issues/3764">urllib3/urllib3#3764</a>)</li> </ul> </blockquote> </details> <details> <summary>Changelog</summary> <p><em>Sourced from <a href="https://github.com/urllib3/urllib3/blob/main/CHANGES.rst">urllib3's changelog</a>.</em></p> <blockquote> <h1>2.7.0 (2026-05-07)</h1> <h2>Security</h2> <p>Addressed high-severity security issues. Impact was limited to specific use cases detailed in the accompanying advisories; overall user exposure was estimated to be marginal.</p> <ul> <li> <p>Decompression-bomb safeguards of the streaming API were bypassed:</p> <ol> <li>When <code>HTTPResponse.drain_conn()</code> was called after the response had been read and decompressed partially.</li> <li>During the second <code>HTTPResponse.read(amt=N)</code> or <code>HTTPResponse.stream(amt=N)</code> call when the response was decompressed using the official <code>Brotli <https://pypi.org/project/brotli/></code>__ library.</li> </ol> <p>See <code>GHSA-mf9v-mfxr-j63j <https://github.com/urllib3/urllib3/security/advisories/GHSA-mf9v-mfxr-j63j></code>__ for details.</p> </li> <li> <p>HTTP pools created using <code>ProxyManager.connection_from_url</code> did not strip sensitive headers specified in <code>Retry.remove_headers_on_redirect</code> when redirecting to a different host. (<code>GHSA-qccp-gfcp-xxvc <https://github.com/urllib3/urllib3/security/advisories/GHSA-qccp-gfcp-xxvc></code>__)</p> </li> </ul> <h2>Deprecations and Removals</h2> <ul> <li>Used <code>FutureWarning</code> instead of <code>DeprecationWarning</code> for better visibility of existing deprecation notices. Rescheduled the removal of deprecated features to version 3.0. (<code>[#3763](https://github.com/urllib3/urllib3/issues/3763) <https://github.com/urllib3/urllib3/issues/3763></code>__)</li> <li>Removed support for end-of-life Python 3.9. (<code>[#3720](https://github.com/urllib3/urllib3/issues/3720) <https://github.com/urllib3/urllib3/issues/3720></code>__)</li> <li>Removed support for end-of-life PyPy3.10. (<code>[#4979](https://github.com/urllib3/urllib3/issues/4979) <https://github.com/urllib3/urllib3/issues/4979></code>__)</li> <li>Bumped the minimum supported pyOpenSSL version to 19.0.0. (<code>[#3777](https://github.com/urllib3/urllib3/issues/3777) <https://github.com/urllib3/urllib3/issues/3777></code>__)</li> </ul> <h2>Bugfixes</h2> <ul> <li>Fixed a bug where <code>HTTPResponse.read(amt=None)</code> was ignoring decompressed data buffered from previous partial reads. (<code>[#3636](https://github.com/urllib3/urllib3/issues/3636) <https://github.com/urllib3/urllib3/issues/3636></code>__)</li> <li>Fixed a bug where <code>HTTPResponse.read()</code> could cache only part of the response after a partial read when <code>cache_content=True</code>.</li> </ul> <!-- raw HTML omitted --> </blockquote> <p>... (truncated)</p> </details> <details> <summary>Commits</summary> <ul> <li><a href="https://github.com/urllib3/urllib3/commit/9a950b92d999f906b6020bb2d1076ee56cddd5d2"><code>9a950b9</code></a> Release 2.7.0</li> <li><a href="https://github.com/urllib3/urllib3/commit/5ec0de499b9166ca71c65ab04f2a7e4eb0d66fcc"><code>5ec0de4</code></a> Merge commit from fork</li> <li><a href="https://github.com/urllib3/urllib3/commit/2bdcc44d1e163fb5cc48a8662425e35e15adfe6a"><code>2bdcc44</code></a> Merge commit from fork</li> <li><a href="https://github.com/urllib3/urllib3/commit/f45b0df09d8620ac6ed0491eb9362c8c87b7bc2c"><code>f45b0df</code></a> Fix a misleading example for <code>ProxyManager</code> (<a href="https://redirect.github.com/urllib3/urllib3/issues/4970">#4970</a>)</li> <li><a href="https://github.com/urllib3/urllib3/commit/577193ca029872384f82c133449e0935f6d8a64b"><code>577193c</code></a> Switch to nightly PyPy3.11 in CI for now (<a href="https://redirect.github.com/urllib3/urllib3/issues/4984">#4984</a>)</li> <li><a href="https://github.com/urllib3/urllib3/commit/e90af45bb006c3a452a3a21644a2681523f5c7fc"><code>e90af45</code></a> Avoid infinite loop in <code>HTTPResponse.read_chunked</code> when <code>amt=0</code> (<a href="https://redirect.github.com/urllib3/urllib3/issues/4974">#4974</a>)</li> <li><a href="https://github.com/urllib3/urllib3/commit/67ed74fdaec6659a6534621ec8e3aaaa6f976210"><code>67ed74f</code></a> Bump dev dependencies (<a href="https://redirect.github.com/urllib3/urllib3/issues/4972">#4972</a>)</li> <li><a href="https://github.com/urllib3/urllib3/commit/3abd481097b54d87b574ac7ea593c3f40938a84d"><code>3abd481</code></a> Upgrade mypy to version 1.20.2 (<a href="https://redirect.github.com/urllib3/urllib3/issues/4978">#4978</a>)</li> <li><a href="https://github.com/urllib3/urllib3/commit/2b8725dfcac4f21d4d93cc0cc3a64a33af08f890"><code>2b8725d</code></a> Drop support for EOL PyPy3.10 (<a href="https://redirect.github.com/urllib3/urllib3/issues/4979">#4979</a>)</li> <li><a href="https://github.com/urllib3/urllib3/commit/2944b2a0a6c573f5548a39cfd17196f98ee21b33"><code>2944b2a</code></a> Upgrade <code>setup-chrome</code> and <code>setup-firefox</code> to fix warnings (<a href="https://redirect.github.com/urllib3/urllib3/issues/4973">#4973</a>)</li> <li>Additional commits viewable in <a href="https://github.com/urllib3/urllib3/compare/2.6.3...2.7.0">compare view</a></li> </ul> </details> <br /> [](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) --- <details> <summary>Dependabot commands and options</summary> <br /> You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot show <dependency name> ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself) You can disable automated security fix PRs for this repo from the [Security Alerts page](https://github.com/langchain-ai/langgraph/network/alerts). </details> Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> |
||
|
|
57f9d3b1a5 |
chore(deps): bump mistune from 3.2.0 to 3.2.1 in /libs/langgraph (#7733)
Bumps [mistune](https://github.com/lepture/mistune) from 3.2.0 to 3.2.1. <details> <summary>Release notes</summary> <p><em>Sourced from <a href="https://github.com/lepture/mistune/releases">mistune's releases</a>.</em></p> <blockquote> <h2>v3.2.1</h2> <h3> 🐞 Bug Fixes</h3> <ul> <li>Resolve Windows compatibility issues in file inclusion and tests - by <a href="https://github.com/Yuki9814"><code>@Yuki9814</code></a> <a href="https://github.com/lepture/mistune/commit/2547102"><!-- raw HTML omitted -->(25471)<!-- raw HTML omitted --></a></li> <li>Escape html text - by <a href="https://github.com/lepture"><code>@lepture</code></a> <a href="https://github.com/lepture/mistune/commit/a3cb6e5"><!-- raw HTML omitted -->(a3cb6)<!-- raw HTML omitted --></a></li> <li>Update link reference - by <a href="https://github.com/lepture"><code>@lepture</code></a> <a href="https://github.com/lepture/mistune/commit/85eb54f"><!-- raw HTML omitted -->(85eb5)<!-- raw HTML omitted --></a></li> <li>Handle escaped dollar signs in inline math - by <a href="https://github.com/saschabuehrle"><code>@saschabuehrle</code></a> in <a href="https://redirect.github.com/lepture/mistune/issues/370">lepture/mistune#370</a> <a href="https://github.com/lepture/mistune/commit/7bd5709"><!-- raw HTML omitted -->(7bd57)<!-- raw HTML omitted --></a></li> <li>Escape id of toc - by <a href="https://github.com/lepture"><code>@lepture</code></a> <a href="https://github.com/lepture/mistune/commit/04880a0"><!-- raw HTML omitted -->(04880)<!-- raw HTML omitted --></a></li> <li>Escape id of headings - by <a href="https://github.com/lepture"><code>@lepture</code></a> <a href="https://github.com/lepture/mistune/commit/2855622"><!-- raw HTML omitted -->(28556)<!-- raw HTML omitted --></a></li> <li>Remove double-encoding of image alt text - by <a href="https://github.com/lawrence3699"><code>@lawrence3699</code></a> <a href="https://github.com/lepture/mistune/commit/0d6f3d8"><!-- raw HTML omitted -->(0d6f3)<!-- raw HTML omitted --></a></li> <li>Escape xml for math plugin - by <a href="https://github.com/lepture"><code>@lepture</code></a> <a href="https://github.com/lepture/mistune/commit/5fa092e"><!-- raw HTML omitted -->(5fa09)<!-- raw HTML omitted --></a></li> <li>Use strict regex for image's height and width - by <a href="https://github.com/lepture"><code>@lepture</code></a> <a href="https://github.com/lepture/mistune/commit/8d0cb75"><!-- raw HTML omitted -->(8d0cb)<!-- raw HTML omitted --></a></li> </ul> <h5> <a href="https://github.com/lepture/mistune/compare/v3.2.0...v3.2.1">View changes on GitHub</a></h5> </blockquote> </details> <details> <summary>Changelog</summary> <p><em>Sourced from <a href="https://github.com/lepture/mistune/blob/main/docs/changes.rst">mistune's changelog</a>.</em></p> <blockquote> <h2>Version 3.2.1</h2> <p><strong>Released on May 3, 2026</strong></p> <ul> <li>Escape link in <code>render_toc_ul</code>.</li> <li>Escape text in math plugin.</li> <li>Fix regex for math plugin.</li> <li>Escape heading's ID attribute.</li> <li>Fix <code>LINK_TITLE_RE</code> to prevent DoS.</li> <li>Escape class attribute for admonition directive.</li> <li>Remove double-encoding of image alt text.</li> <li>Escape class attribute for image directive.</li> <li>Fix width/height attribute for image directive.</li> </ul> </blockquote> </details> <details> <summary>Commits</summary> <ul> <li><a href="https://github.com/lepture/mistune/commit/067f90861088a496942f5eb43236135352b85d39"><code>067f908</code></a> chore: release 3.2.1</li> <li><a href="https://github.com/lepture/mistune/commit/bf5503067a7d8c3b065fb143f67a3a08eca77bb6"><code>bf55030</code></a> Merge pull request <a href="https://redirect.github.com/lepture/mistune/issues/438">#438</a> from saschabuehrle/fix/issue-370</li> <li><a href="https://github.com/lepture/mistune/commit/8d0cb7539a9ac82e633b98476b9922632eb8b948"><code>8d0cb75</code></a> fix: use strict regex for image's height and width</li> <li><a href="https://github.com/lepture/mistune/commit/5fa092e3053b86f16e4c49b9d3ba0b7ab63f09ab"><code>5fa092e</code></a> fix: escape xml for math plugin</li> <li><a href="https://github.com/lepture/mistune/commit/71ec9477ebfcf8dab0068804baf2c77461d77fbb"><code>71ec947</code></a> Merge pull request <a href="https://redirect.github.com/lepture/mistune/issues/440">#440</a> from lawrence3699/fix/image-alt-double-encoding</li> <li><a href="https://github.com/lepture/mistune/commit/0d6f3d850283d51e9c60e5a1b3c9343a18df3722"><code>0d6f3d8</code></a> fix: remove double-encoding of image alt text</li> <li><a href="https://github.com/lepture/mistune/commit/2855622d7fe235c6c805716edff943b5945d1eea"><code>2855622</code></a> fix: escape id of headings</li> <li><a href="https://github.com/lepture/mistune/commit/04880a004cb28318e5ebd7ee9e63c79fc9f9ed04"><code>04880a0</code></a> fix: escape id of toc</li> <li><a href="https://github.com/lepture/mistune/commit/7bd57096715385062505b3f78972be9fa823d6d4"><code>7bd5709</code></a> fix: handle escaped dollar signs in inline math (fixes <a href="https://redirect.github.com/lepture/mistune/issues/370">#370</a>)</li> <li><a href="https://github.com/lepture/mistune/commit/85eb54ff17da26327399bf188f9ff9b8fd515278"><code>85eb54f</code></a> fix: update link reference</li> <li>Additional commits viewable in <a href="https://github.com/lepture/mistune/compare/v3.2.0...v3.2.1">compare view</a></li> </ul> </details> <br /> [](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) --- <details> <summary>Dependabot commands and options</summary> <br /> You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot show <dependency name> ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself) You can disable automated security fix PRs for this repo from the [Security Alerts page](https://github.com/langchain-ai/langgraph/network/alerts). </details> Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> |
||
|
|
2c04b03f72 | chore(langgraph): bump langchain-core to 1.4.0 (#7767) | ||
|
|
2e5025ec1a |
feat(checkpoint): force delta channel snapshot after max supersteps since last snapshot (#7746)
## Summary Add a system-wide upper bound on supersteps-since-last-snapshot for `DeltaChannel`, preventing unbounded ancestor walks on long-lived threads where a delta channel stops receiving writes. **Problem:** If a delta channel is written a few times (below `snapshot_frequency`) and then never written again, it is never snapshotted. Every subsequent run triggers an ancestor walk that grows linearly with thread length — on long threads this becomes catastrophic. **Solution:** Track a second counter (total supersteps) per delta channel alongside the existing update count. Force a snapshot when EITHER `updates >= snapshot_frequency` OR `supersteps >= DELTA_MAX_SUPERSTEPS_SINCE_SNAPSHOT` (default 5000, overridable via env `LANGGRAPH_DELTA_MAX_SUPERSTEPS_SINCE_SNAPSHOT`). ### Changes - **`checkpoint` lib**: Rename metadata field `delta_updates_since_snapshot: dict[str, int]` -> `counters_since_last_snapshot: dict[str, tuple[int, int]]` where index 0 = updates, index 1 = supersteps. - **`langgraph/_internal/_config.py`**: Add `DELTA_MAX_SUPERSTEPS_SINCE_SNAPSHOT` constant with env override. - **`langgraph/pregel/_checkpoint.py`**: Update `delta_channels_to_snapshot()` predicate to fire on either threshold. Rename reader helper to `read_counters_since_last_snapshot()`. - **`langgraph/pregel/_loop.py`**: Iterate all delta channels each superstep (not just updated ones) to bump the supersteps counter. Reset both counters to `(0, 0)` on snapshot. - **Tests**: Updated existing exit-mode tests for new field shape. Added 4 new tests covering forced snapshot (single run + multi-run accumulation), predicate unit test, and counter reset. ## Test plan - [x] `test_delta_channel_supersteps_bound.py` — 4 new tests all pass - [x] `test_delta_channel_exit_mode.py` — 11 existing tests updated and pass - [x] `test_delta_channel_migration.py` — 11 tests pass - [x] `test_channels.py` — 29 tests pass - [x] `test_pregel.py` — 457 tests pass - [x] `libs/checkpoint` test suite — 151 pass, 16 skipped - [x] `make lint` clean (langgraph + checkpoint) |
||
|
|
d736564eb1 |
test(langgraph): de-flake heartbeat progress test (#7735)
## Summary De-flake `test_arun_with_retry_timeout_observer_emits_progress_on_heartbeat` — the test was hitting a CI-runner-load-sensitive race where the idle-timeout watchdog could fire before the task body's first await ran. ## Root cause `_TimedAttemptScope.__init__` sets `_last_progress = time.monotonic()` immediately, but the watchdog itself doesn't start polling until *after* `wrap_config` and task scheduling. Under heavy CI load that gap can grow large enough that: ``` T₀ scope.__init__() → _last_progress = T₀ … some scheduling slack … Tₙ watchdog runs, computes remaining = T₀ + 0.2 − Tₙ ≤ 0 → TimeoutError fires ``` The error reports `elapsed: 0.000s` because `elapsed` is measured from the post-scheduling `start` (≈Tₙ), not from `_last_progress` (T₀). The previous test set `idle_timeout=0.2s`, which left almost no headroom for that scheduling slack. ## Fix (test-side only — no production change) - **Heartbeat at task-body entry**: `runtime.heartbeat()` is now called before the first `await asyncio.sleep(...)`, which resets `_last_progress` to "now" the moment the task body actually starts running. This eliminates the scope-init-to-first-await gap as a flake source. - **Idle timeout 0.2s → 1.0s**: gives ~5× headroom over the ~400ms task duration, so scheduling pressure stays comfortably within budget. ## Why test-side instead of fixing the production race The proper production fix would be to set `_last_progress` at watchdog-entry time rather than at scope-init time. That's a behaviour change in the retry/timeout machinery and out of scope for a flaky-test fix. The two test-side defenses make this particular test stable without touching production semantics; the underlying race in `_TimedAttemptScope` is worth a separate follow-up. ## Test plan - 10/10 repeated local runs pass: ``` uv run pytest tests/test_retry.py::test_arun_with_retry_timeout_observer_emits_progress_on_heartbeat --count=10 ``` - All assertions still meaningful: still verifies start/finish events, at least one progress event, rate-limited progress count (≤ total events), and per-event metadata (task_name, attempt, idle_timeout_secs, progress_at). Co-authored-by: Cursor <cursoragent@cursor.com> |
||
|
|
69f2d3a430 |
chore(langgraph): re-implement exit mode for delta channel (#7730)
## Summary Replaces `durability="exit"`'s blanket force-snapshot of every `DeltaChannel` with proper write persistence that honors per-channel `snapshot_frequency`, plus closes two latent bugs the force-snapshot was masking. Before: every exit-mode run wrote a full `_DeltaSnapshot` blob for every delta channel, even when the channel had zero updates this run and was nowhere near its `snapshot_frequency`. After: the same count-based decision used by `durability="sync"`/`"async"` applies — channels at or above `snapshot_frequency` snapshot; channels below it persist their accumulated writes via a lazy "stub" anchor; untouched channels write nothing. ## What changed **Core redesign** (`pregel/_loop.py`, `pregel/_checkpoint.py`) - Drop `force_delta_snapshot` from `create_checkpoint` and `_should_snapshot_delta`. - Add `decide_delta_snapshots(channels, counts)` pure helper used by both `create_checkpoint` and the new exit-mode peek-ahead path. - Add `_exit_delta_writes` accumulator: every delta-channel write produced during a `durability="exit"` run (input writes from `_first` + per-superstep writes captured before `pending_writes.clear()` in `after_tick`) is collected into this list. - Add `_put_exit_delta_writes` (sync + async): runs from `_suppress_interrupt` BEFORE `_put_checkpoint(exiting=True)`. Filters out channels that will snapshot, then persists remaining writes to `checkpoint_writes` under an anchor parent. The anchor is the existing saved parent on resumed runs, or a lazily-created empty stub on first runs. - Visibility ordering: stub put goes onto `_put_checkpoint_fut` (becomes the next put's `prev`); exit-write futures go onto `_delta_write_futs`. The existing `_checkpointer_put_after_previous` already drains both before calling `saver.put`, so `final_checkpoint` is structurally guaranteed to land last — readers never see a partial view. **Latent bugs fixed (previously masked by force-snapshot)** - **Sync drain race**: `SyncPregelLoop` now initializes `_delta_write_futs = []` in `__enter__` and drains it in sync `_checkpointer_put_after_previous` before `put`, mirroring the async version. Without this, a multi-worker `BackgroundExecutor` could publish a checkpoint before the writes that produced it. - **Count double-bump in exit mode**: in `_put_checkpoint`, `delta_updates_since_snapshot` was being incremented twice for the last superstep — once by the intermediate `after_tick` call, once by `_suppress_interrupt`. Force-snapshot used to reset all counts to 0 so this never persisted; without it, snapshots would fire one superstep early after every exit-mode run. Fixed by gating the count-bump behind `not exiting`. **Pre-existing input-durability gap** - In the plain (non-Command) input path of `_first`, delta-channel input writes are now persisted via `put_writes` (mirroring the Command path), so sub-frequency inputs survive a `get_state` on resumed runs in `sync`/`async` durability. Note: first-run `sync`/`async` still has the same gap (writes orphan on the synthetic-empty parent id). That's flagged as a follow-up — out of scope for this PR. ## Test plan - Existing `tests/test_pregel.py` and `tests/test_pregel_async.py` pass unchanged. - Existing `tests/test_channels.py` (29 tests) and `tests/test_delta_channel_migration.py` pass unchanged. - New `tests/test_exit_delta_persistence.py` (11 tests) covers: - **Write-path**: zero-write exit (no stub), all-snapshot first run (no stub), sub-freq first run (single shared stub), sub-freq resumed run (anchor on saved parent), sync-vs-exit count parity, mixed snapshot/non-snapshot channels, snapshot fires at frequency. - **Read-path**: K-run replay chain reads correctly across stub→saved-parent transition; metadata `delta_updates_since_snapshot` round-trips correctly; mixed sync/exit durability alternation produces correct final state; snapshot+tail-deltas combination reads correctly. - `make format && make lint && make test` in `libs/langgraph/`. --------- Co-authored-by: Cursor <cursoragent@cursor.com> Co-authored-by: Sydney Runkle <sydneymarierunkle@gmail.com> |
||
|
|
e49c093f48 |
chore(deps): bump ty from 0.0.23 to 0.0.33 in /libs/sdk-py (#7666)
Bumps the minor-and-patch group with 1 update in the /libs/sdk-py directory: [ty](https://github.com/astral-sh/ty). Updates `ty` from 0.0.23 to 0.0.33 <details> <summary>Release notes</summary> <p><em>Sourced from <a href="https://github.com/astral-sh/ty/releases">ty's releases</a>.</em></p> <blockquote> <h2>0.0.33</h2> <h2>Release Notes</h2> <p>Released on 2026-04-28.</p> <h3>Notable changes</h3> <ul> <li> <p>ty now prefers the declared type of an annotated assignment in more situations (<a href="https://redirect.github.com/astral-sh/ruff/pull/24802">#24802</a>). Consider this example:</p> <pre lang="py"><code>from some_library import untyped_function <p>threshold: int | None = 0 result: str = untyped_function() </code></pre></p> <p>ty previously favored the <em>inferred</em> type of the right hand side expression when <code>threshold</code> and <code>result</code> were used. This is useful for <code>threshold</code>, as it allows something like <code>threshold += 1</code> to work without an error: we know that <code>threshold</code> could later become <code>None</code>, but <em>right now</em>, we see that it is an <code>int</code>. However, for <code>result</code>, the inferred type is <code>Unknown</code>. This is <em>not</em> a useful type and it can lead to false negatives. Starting with this release, ty will therefore prefer the declared type <em>if the inferred and declared types are mutually assignable</em>. In the above example, <code>threshold</code> will still be inferred as <code>int</code> (or rather <code>Literal[1]</code>), but <code>result</code> will now be inferred as <code>str</code>. If you previously added <code>cast</code>s to work around this behavior, you should be able to remove them after upgrading.</p> </li> </ul> <h3>Bug fixes</h3> <ul> <li>Fix reporting of annotation-only locals as unused (<a href="https://redirect.github.com/astral-sh/ruff/pull/24811">#24811</a>)</li> <li>Fix project and workspace selection (<a href="https://redirect.github.com/astral-sh/ruff/pull/24824">#24824</a>)</li> <li>Fix go-to definition for generic classes (<a href="https://redirect.github.com/astral-sh/ruff/pull/24714">#24714</a>)</li> <li>Fix receiver coloring for aliased decorators (<a href="https://redirect.github.com/astral-sh/ruff/pull/24884">#24884</a>)</li> </ul> <h3>LSP server</h3> <ul> <li>Add support for go-to definition in literal enum member inlay hints (<a href="https://redirect.github.com/astral-sh/ruff/pull/24792">#24792</a>)</li> <li>Add support for "baking" keyword argument inlay hints into the source code (<a href="https://redirect.github.com/astral-sh/ruff/pull/24667">#24667</a>)</li> <li>Don't allow inlay hint edits when introducing a non global scope symbol (<a href="https://redirect.github.com/astral-sh/ruff/pull/24797">#24797</a>)</li> <li>Omit semantic highlighting for unresolved symbols (<a href="https://redirect.github.com/astral-sh/ruff/pull/24718">#24718</a>)</li> </ul> <h3>Core type checking</h3> <ul> <li>Support narrowing with aliased conditional expressions (<a href="https://redirect.github.com/astral-sh/ruff/pull/24302">#24302</a>)</li> <li>Model short-circuiting control flow in Boolean expressions (<a href="https://redirect.github.com/astral-sh/ruff/pull/24458">#24458</a>)</li> <li>Handle <code>finally</code> blocks where all <code>try</code>/<code>except</code> blocks are terminal (<a href="https://redirect.github.com/astral-sh/ruff/pull/24882">#24882</a>)</li> <li>Detect invalid <code>ClassVar</code> vs instance-attribute overrides (<a href="https://redirect.github.com/astral-sh/ruff/pull/24767">#24767</a>)</li> <li>Emit diagnostic for invalid uses of <code>Unpack[...]</code> (<a href="https://redirect.github.com/astral-sh/ruff/pull/24868">#24868</a>)</li> <li>Infer lambda parameter types with <code>Callable</code> type context (<a href="https://redirect.github.com/astral-sh/ruff/pull/24317">#24317</a>)</li> <li>Support <code>**</code> unpacking of <code>TypedDict</code> in dict-literal assignments (<a href="https://redirect.github.com/astral-sh/ruff/pull/24703">#24703</a>)</li> <li>Support <code>Unpack[TypedDict]</code> in <code>**kwargs</code> signatures (<a href="https://redirect.github.com/astral-sh/ruff/pull/24653">#24653</a>)</li> <li>Treat <code>[*xs]</code> as an irrefutable pattern when matching on <code>Sequence</code> (<a href="https://redirect.github.com/astral-sh/ruff/pull/24787">#24787</a>)</li> <li>Improve generics solving for unions in invariant positions (<a href="https://redirect.github.com/astral-sh/ruff/pull/24698">#24698</a>)</li> <li>Improve generics solving for unions when matching against protocols (<a href="https://redirect.github.com/astral-sh/ruff/pull/24837">#24837</a>)</li> </ul> <h3>Diagnostics</h3> <!-- raw HTML omitted --> </blockquote> <p>... (truncated)</p> </details> <details> <summary>Changelog</summary> <p><em>Sourced from <a href="https://github.com/astral-sh/ty/blob/main/CHANGELOG.md">ty's changelog</a>.</em></p> <blockquote> <h2>0.0.33</h2> <p>Released on 2026-04-28.</p> <h3>Notable changes</h3> <ul> <li> <p>ty now prefers the declared type of an annotated assignment in more situations (<a href="https://redirect.github.com/astral-sh/ruff/pull/24802">#24802</a>). Consider this example:</p> <pre lang="py"><code>from some_library import untyped_function <p>threshold: int | None = 0 result: str = untyped_function() </code></pre></p> <p>ty previously favored the <em>inferred</em> type of the right hand side expression when <code>threshold</code> and <code>result</code> were used. This is useful for <code>threshold</code>, as it allows something like <code>threshold += 1</code> to work without an error: we know that <code>threshold</code> could later become <code>None</code>, but <em>right now</em>, we see that it is an <code>int</code>. However, for <code>result</code>, the inferred type is <code>Unknown</code>. This is <em>not</em> a useful type and it can lead to false negatives. Starting with this release, ty will therefore prefer the declared type <em>if the inferred and declared types are mutually assignable</em>. In the above example, <code>threshold</code> will still be inferred as <code>int</code> (or rather <code>Literal[1]</code>), but <code>result</code> will now be inferred as <code>str</code>. If you previously added <code>cast</code>s to work around this behavior, you should be able to remove them after upgrading.</p> </li> </ul> <h3>Bug fixes</h3> <ul> <li>Fix reporting of annotation-only locals as unused (<a href="https://redirect.github.com/astral-sh/ruff/pull/24811">#24811</a>)</li> <li>Fix project and workspace selection (<a href="https://redirect.github.com/astral-sh/ruff/pull/24824">#24824</a>)</li> <li>Fix go-to definition for generic classes (<a href="https://redirect.github.com/astral-sh/ruff/pull/24714">#24714</a>)</li> <li>Fix receiver coloring for aliased decorators (<a href="https://redirect.github.com/astral-sh/ruff/pull/24884">#24884</a>)</li> </ul> <h3>LSP server</h3> <ul> <li>Add support for go-to definition in literal enum member inlay hints (<a href="https://redirect.github.com/astral-sh/ruff/pull/24792">#24792</a>)</li> <li>Add support for "baking" keyword argument inlay hints into the source code (<a href="https://redirect.github.com/astral-sh/ruff/pull/24667">#24667</a>)</li> <li>Don't allow inlay hint edits when introducing a non global scope symbol (<a href="https://redirect.github.com/astral-sh/ruff/pull/24797">#24797</a>)</li> <li>Omit semantic highlighting for unresolved symbols (<a href="https://redirect.github.com/astral-sh/ruff/pull/24718">#24718</a>)</li> </ul> <h3>Core type checking</h3> <ul> <li>Support narrowing with aliased conditional expressions (<a href="https://redirect.github.com/astral-sh/ruff/pull/24302">#24302</a>)</li> <li>Model short-circuiting control flow in Boolean expressions (<a href="https://redirect.github.com/astral-sh/ruff/pull/24458">#24458</a>)</li> <li>Handle <code>finally</code> blocks where all <code>try</code>/<code>except</code> blocks are terminal (<a href="https://redirect.github.com/astral-sh/ruff/pull/24882">#24882</a>)</li> <li>Detect invalid <code>ClassVar</code> vs instance-attribute overrides (<a href="https://redirect.github.com/astral-sh/ruff/pull/24767">#24767</a>)</li> <li>Emit diagnostic for invalid uses of <code>Unpack[...]</code> (<a href="https://redirect.github.com/astral-sh/ruff/pull/24868">#24868</a>)</li> <li>Infer lambda parameter types with <code>Callable</code> type context (<a href="https://redirect.github.com/astral-sh/ruff/pull/24317">#24317</a>)</li> <li>Support <code>**</code> unpacking of <code>TypedDict</code> in dict-literal assignments (<a href="https://redirect.github.com/astral-sh/ruff/pull/24703">#24703</a>)</li> <li>Support <code>Unpack[TypedDict]</code> in <code>**kwargs</code> signatures (<a href="https://redirect.github.com/astral-sh/ruff/pull/24653">#24653</a>)</li> <li>Treat <code>[*xs]</code> as an irrefutable pattern when matching on <code>Sequence</code> (<a href="https://redirect.github.com/astral-sh/ruff/pull/24787">#24787</a>)</li> <li>Improve generics solving for unions in invariant positions (<a href="https://redirect.github.com/astral-sh/ruff/pull/24698">#24698</a>)</li> <li>Improve generics solving for unions when matching against protocols (<a href="https://redirect.github.com/astral-sh/ruff/pull/24837">#24837</a>)</li> </ul> <h3>Diagnostics</h3> <ul> <li>Add error context to <code>invalid-return-type</code> diagnostics, <code>invalid-yield</code> diagnostics, attribute assignment diagnostics (<a href="https://redirect.github.com/astral-sh/ruff/pull/24770">#24770</a>, <a href="https://redirect.github.com/astral-sh/ruff/pull/24771">#24771</a>)</li> </ul> <!-- raw HTML omitted --> </blockquote> <p>... (truncated)</p> </details> <details> <summary>Commits</summary> <ul> <li><a href="https://github.com/astral-sh/ty/commit/c512d8425418a2170e92aa7fbbd70952d4e04118"><code>c512d84</code></a> Bump version to 0.0.33 (<a href="https://redirect.github.com/astral-sh/ty/issues/3368">#3368</a>)</li> <li><a href="https://github.com/astral-sh/ty/commit/4cd7b334b90eba09042700e7b654044c2d6bcd15"><code>4cd7b33</code></a> Upgrade Depot runners from macOS 14 to 15 (<a href="https://redirect.github.com/astral-sh/ty/issues/3363">#3363</a>)</li> <li><a href="https://github.com/astral-sh/ty/commit/c78b8324515bf15a662f61e1d74fd85484d67e8c"><code>c78b832</code></a> Update rui314/setup-mold digest to 9c9c13b (<a href="https://redirect.github.com/astral-sh/ty/issues/3342">#3342</a>)</li> <li><a href="https://github.com/astral-sh/ty/commit/dea338134aef96d741a48886e414f622dbf10426"><code>dea3381</code></a> Update actions/cache action to v5.0.5 (<a href="https://redirect.github.com/astral-sh/ty/issues/3343">#3343</a>)</li> <li><a href="https://github.com/astral-sh/ty/commit/d451af477bd5517e132609c3b016799d697f4182"><code>d451af4</code></a> update typing-features and faqs (<a href="https://redirect.github.com/astral-sh/ty/issues/3335">#3335</a>)</li> <li><a href="https://github.com/astral-sh/ty/commit/052d70bc1a7457f50c5acbafe8de7a846f7d5e77"><code>052d70b</code></a> Update prek dependencies (<a href="https://redirect.github.com/astral-sh/ty/issues/3344">#3344</a>)</li> <li><a href="https://github.com/astral-sh/ty/commit/66b5e878163ce4ab4810a45a2679a98011932b8b"><code>66b5e87</code></a> Update astral-sh/setup-uv action to v8.1.0 (<a href="https://redirect.github.com/astral-sh/ty/issues/3345">#3345</a>)</li> <li><a href="https://github.com/astral-sh/ty/commit/7ec6712a6f02d0255de4c7f0066d5bb23987a9bb"><code>7ec6712</code></a> Add a 'Diagnostics improvements' section to the changelogs (<a href="https://redirect.github.com/astral-sh/ty/issues/3309">#3309</a>)</li> <li><a href="https://github.com/astral-sh/ty/commit/978dfdb38dfb568943f73779d769a965c1d5a397"><code>978dfdb</code></a> Add version metadata publishing to the release process (<a href="https://redirect.github.com/astral-sh/ty/issues/3292">#3292</a>)</li> <li><a href="https://github.com/astral-sh/ty/commit/4d1e1fc57ca8bfdcbcee513ba92135d2932eb279"><code>4d1e1fc</code></a> Bump version to 0.0.32 (<a href="https://redirect.github.com/astral-sh/ty/issues/3302">#3302</a>)</li> <li>Additional commits viewable in <a href="https://github.com/astral-sh/ty/compare/0.0.23...0.0.33">compare view</a></li> </ul> </details> <br /> --------- Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: John Kennedy <65985482+jkennedyvz@users.noreply.github.com> Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com> |
||
|
|
9032a3f90a |
docs(checkpoint): mark DeltaChannel and delta-history APIs as beta (#7732)
## Summary Adds a Beta admonition to the `DeltaChannel` surface area so users can distinguish stable from in-progress contracts. Single-sourced on the base class; subclass overrides in `checkpoint-postgres` / `checkpoint-sqlite` / memory inherit the marker via their existing references back to the base. Touched: - `DeltaChannel` (`libs/langgraph/langgraph/channels/delta.py`) - `BaseCheckpointSaver.get_delta_channel_history` and `aget_delta_channel_history` (`libs/checkpoint/.../base/__init__.py`) - `DeltaChannelHistory` TypedDict - `CheckpointMetadata.delta_updates_since_snapshot` ## Why docstring admonitions, not `@beta` The base `get_delta_channel_history` methods are designed to be overridden by savers. Wrapping with `@beta` (from `langchain_core._api`) would emit warnings whenever a subclass called `super().get_delta_channel_history(...)` or whenever the default ancestor walk fired. Docstring-only keeps the signal advisory and noise-free. `_DeltaSnapshot` is already leading-underscore-private, so it implicitly signals "internal." ## Versioning note This intentionally stays a **minor** bump for the checkpoint releases (4.0 → 4.1, 3.0 → 3.1): - The new methods are strictly additive — defaults provided on the base, no signatures changed, no removed APIs. Third-party savers keep working without overriding anything. - The beta marker and the version bump do orthogonal jobs: semver answers "is this a breaking change?" (no), the marker answers "is this contract stable?" (no). - Bumping major now would consume the lever you want available for when the delta contract actually changes in a breaking way. ## Test plan - [ ] Docstring-only — no behavioral change - [x] `make format && make lint` clean in `libs/checkpoint` and `libs/langgraph` |
||
|
|
b1331fb9a6 |
chore(deps): bump jupyter-server from 2.17.0 to 2.18.0 in /libs/langgraph (#7713)
Bumps [jupyter-server](https://github.com/jupyter-server/jupyter_server) from 2.17.0 to 2.18.0. <details> <summary>Release notes</summary> <p><em>Sourced from <a href="https://github.com/jupyter-server/jupyter_server/releases">jupyter-server's releases</a>.</em></p> <blockquote> <h2>v2.18.0</h2> <h2>2.18.0</h2> <p>(<a href="https://github.com/jupyter-server/jupyter_server/compare/v2.17.0...49b34392feaa97735b3b777e3baf8f22f2a14ed8">Full Changelog</a>)</p> <h3>Security patches</h3> <ul> <li>CVE-2026-40110 <a href="https://github.com/jupyter-server/jupyter_server/security/advisories/GHSA-24qx-w28j-9m6p">https://github.com/jupyter-server/jupyter_server/security/advisories/GHSA-24qx-w28j-9m6p</a></li> <li>CVE-2025-61669 <a href="https://github.com/jupyter-server/jupyter_server/security/advisories/GHSA-qh7q-6qm3-653w">https://github.com/jupyter-server/jupyter_server/security/advisories/GHSA-qh7q-6qm3-653w</a></li> <li>CVE-2026-40934 <a href="https://github.com/jupyter-server/jupyter_server/security/advisories/GHSA-5mrq-x3x5-8v8f">https://github.com/jupyter-server/jupyter_server/security/advisories/GHSA-5mrq-x3x5-8v8f</a></li> <li>CVE-2026-35397 <a href="https://github.com/jupyter-server/jupyter_server/security/advisories/GHSA-5789-5fc7-67v3">https://github.com/jupyter-server/jupyter_server/security/advisories/GHSA-5789-5fc7-67v3</a></li> </ul> <h3>API and Breaking Changes</h3> <ul> <li>Add query param to sanitize HTML in GET /nbconvert/html <a href="https://redirect.github.com/jupyter-server/jupyter_server/pull/1618">#1618</a> (<a href="https://github.com/Yann-P"><code>@Yann-P</code></a>, <a href="https://github.com/Carreau"><code>@Carreau</code></a>)</li> </ul> <h3>Enhancements made</h3> <ul> <li>Update handlers.py to fix ioloop blockers(sync file operations) <a href="https://redirect.github.com/jupyter-server/jupyter_server/pull/1617">#1617</a> (<a href="https://github.com/zolyfarkas-fb"><code>@zolyfarkas-fb</code></a>, <a href="https://github.com/Carreau"><code>@Carreau</code></a>)</li> <li>Add resolvePath API for resolving kernel-relative paths <a href="https://redirect.github.com/jupyter-server/jupyter_server/pull/1331">#1331</a> (<a href="https://github.com/krassowski"><code>@krassowski</code></a>, <a href="https://github.com/Carreau"><code>@Carreau</code></a>, <a href="https://github.com/blink1073"><code>@blink1073</code></a>)</li> </ul> <h3>Bugs fixed</h3> <ul> <li>Move check origin into a util function and add it to websocket <a href="https://redirect.github.com/jupyter-server/jupyter_server/pull/1630">#1630</a> (<a href="https://github.com/Carreau"><code>@Carreau</code></a>, <a href="https://github.com/Yann-P"><code>@Yann-P</code></a>)</li> <li>Fix flaky test_restart_kernel by unsticking nudge() after port-changing restart <a href="https://redirect.github.com/jupyter-server/jupyter_server/pull/1628">#1628</a> (<a href="https://github.com/Carreau"><code>@Carreau</code></a>, <a href="https://github.com/claude"><code>@claude</code></a>, <a href="https://github.com/krassowski"><code>@krassowski</code></a>)</li> <li>Try to fix flaky test "test_restart_kernel" <a href="https://redirect.github.com/jupyter-server/jupyter_server/pull/1625">#1625</a> (<a href="https://github.com/Carreau"><code>@Carreau</code></a>)</li> <li>Fix potential unraisable pytest error <a href="https://redirect.github.com/jupyter-server/jupyter_server/pull/1624">#1624</a> (<a href="https://github.com/Carreau"><code>@Carreau</code></a>)</li> <li>fix: use %s placeholders in HTTPError to prevent Tornado from doubling % in gateway URLs <a href="https://redirect.github.com/jupyter-server/jupyter_server/pull/1620">#1620</a> (<a href="https://github.com/terminalchai"><code>@terminalchai</code></a>, <a href="https://github.com/krassowski"><code>@krassowski</code></a>, <a href="https://github.com/ptch314"><code>@ptch314</code></a>)</li> <li>Fix three file descriptor leaks in kernel connection lifecycle (<a href="https://redirect.github.com/jupyter-server/jupyter_server/issues/1506">#1506</a>) <a href="https://redirect.github.com/jupyter-server/jupyter_server/pull/1619">#1619</a> (<a href="https://github.com/tonyx93"><code>@tonyx93</code></a>, <a href="https://github.com/Carreau"><code>@Carreau</code></a>)</li> <li>Use web.HTTPError for kernel restart failures <a href="https://redirect.github.com/jupyter-server/jupyter_server/pull/1616">#1616</a> (<a href="https://github.com/YDawn"><code>@YDawn</code></a>, <a href="https://github.com/Carreau"><code>@Carreau</code></a>)</li> <li>Handle EADDRINUSE and EACCES in _bind_http_server_tcp <a href="https://redirect.github.com/jupyter-server/jupyter_server/pull/1613">#1613</a> (<a href="https://github.com/YDawn"><code>@YDawn</code></a>, <a href="https://github.com/Zsailer"><code>@Zsailer</code></a>, <a href="https://github.com/minrk"><code>@minrk</code></a>)</li> <li>Use st_birthtime for file created timestamp on macOS/BSD <a href="https://redirect.github.com/jupyter-server/jupyter_server/pull/1594">#1594</a> (<a href="https://github.com/ktaletsk"><code>@ktaletsk</code></a>, <a href="https://github.com/krassowski"><code>@krassowski</code></a>, <a href="https://github.com/minrk"><code>@minrk</code></a>)</li> <li>Fix double write when refusing hidden files in contents handler <a href="https://redirect.github.com/jupyter-server/jupyter_server/pull/1585">#1585</a> (<a href="https://github.com/Krish-876"><code>@Krish-876</code></a>, <a href="https://github.com/minrk"><code>@minrk</code></a>)</li> <li>Close all sockets in _find_http_port explicitly <a href="https://redirect.github.com/jupyter-server/jupyter_server/pull/1584">#1584</a> (<a href="https://github.com/MaryushSoroka"><code>@MaryushSoroka</code></a>, <a href="https://github.com/minrk"><code>@minrk</code></a>)</li> <li>Fix writing on remote file systems with attribute cache <a href="https://redirect.github.com/jupyter-server/jupyter_server/pull/1574">#1574</a> (<a href="https://github.com/krassowski"><code>@krassowski</code></a>, <a href="https://github.com/Zsailer"><code>@Zsailer</code></a>)</li> <li>Add IdentityProvider.cookie_secret_hook <a href="https://redirect.github.com/jupyter-server/jupyter_server/pull/1569">#1569</a> (<a href="https://github.com/emin63"><code>@emin63</code></a>, <a href="https://github.com/minrk"><code>@minrk</code></a>)</li> <li>fix context pollution <a href="https://redirect.github.com/jupyter-server/jupyter_server/pull/1561">#1561</a> (<a href="https://github.com/dualc"><code>@dualc</code></a>, <a href="https://github.com/Zsailer"><code>@Zsailer</code></a>)</li> <li>Fix gateway cookie handling <a href="https://redirect.github.com/jupyter-server/jupyter_server/pull/1558">#1558</a> (<a href="https://github.com/kevin-bates"><code>@kevin-bates</code></a>, <a href="https://github.com/RRosio"><code>@RRosio</code></a>, <a href="https://github.com/lresende"><code>@lresende</code></a>, <a href="https://github.com/minrk"><code>@minrk</code></a>)</li> <li>fix connection exception cause high cpu load <a href="https://redirect.github.com/jupyter-server/jupyter_server/pull/1484">#1484</a> (<a href="https://github.com/dualc"><code>@dualc</code></a>, <a href="https://github.com/lresende"><code>@lresende</code></a>, <a href="https://github.com/minrk"><code>@minrk</code></a>)</li> </ul> <h3>Maintenance and upkeep improvements</h3> <ul> <li>Start to test on Python 3.13 and 3.14 <a href="https://redirect.github.com/jupyter-server/jupyter_server/pull/1623">#1623</a> (<a href="https://github.com/Carreau"><code>@Carreau</code></a>)</li> <li>Bump actions/create-github-app-token from 2 to 3 in the actions group across 1 directory <a href="https://redirect.github.com/jupyter-server/jupyter_server/pull/1621">#1621</a> (<a href="https://github.com/Carreau"><code>@Carreau</code></a>)</li> <li>Bump brace-expansion from 1.1.12 to 1.1.13 <a href="https://redirect.github.com/jupyter-server/jupyter_server/pull/1615">#1615</a> (<a href="https://github.com/minrk"><code>@minrk</code></a>)</li> <li>Fix package spec for jupytext <a href="https://redirect.github.com/jupyter-server/jupyter_server/pull/1614">#1614</a> (<a href="https://github.com/krassowski"><code>@krassowski</code></a>, <a href="https://github.com/Zsailer"><code>@Zsailer</code></a>)</li> <li>chore: update pre-commit hooks <a href="https://redirect.github.com/jupyter-server/jupyter_server/pull/1607">#1607</a> (<a href="https://github.com/minrk"><code>@minrk</code></a>)</li> <li>try to fix ci on windows <a href="https://redirect.github.com/jupyter-server/jupyter_server/pull/1600">#1600</a> (<a href="https://github.com/minrk"><code>@minrk</code></a>, <a href="https://github.com/krassowski"><code>@krassowski</code></a>)</li> <li>run prerelease tests on 3.14 <a href="https://redirect.github.com/jupyter-server/jupyter_server/pull/1599">#1599</a> (<a href="https://github.com/minrk"><code>@minrk</code></a>)</li> <li>Pin sphinx to an older version (<9) to fix docs <a href="https://redirect.github.com/jupyter-server/jupyter_server/pull/1597">#1597</a> (<a href="https://github.com/krassowski"><code>@krassowski</code></a>, <a href="https://github.com/minrk"><code>@minrk</code></a>)</li> </ul> <!-- raw HTML omitted --> </blockquote> <p>... (truncated)</p> </details> <details> <summary>Changelog</summary> <p><em>Sourced from <a href="https://github.com/jupyter-server/jupyter_server/blob/main/CHANGELOG.md">jupyter-server's changelog</a>.</em></p> <blockquote> <h2>2.18.0</h2> <p>(<a href="https://github.com/jupyter-server/jupyter_server/compare/v2.9.1...49b34392feaa97735b3b777e3baf8f22f2a14ed8">Full Changelog</a>)</p> <h3>API and Breaking Changes</h3> <ul> <li>Add query param to sanitize HTML in GET /nbconvert/html <a href="https://redirect.github.com/jupyter-server/jupyter_server/pull/1618">#1618</a> (<a href="https://github.com/Yann-P"><code>@Yann-P</code></a>, <a href="https://github.com/Carreau"><code>@Carreau</code></a>)</li> </ul> <h3>Enhancements made</h3> <ul> <li>Update handlers.py to fix ioloop blockers(sync file operations) <a href="https://redirect.github.com/jupyter-server/jupyter_server/pull/1617">#1617</a> (<a href="https://github.com/zolyfarkas-fb"><code>@zolyfarkas-fb</code></a>, <a href="https://github.com/Carreau"><code>@Carreau</code></a>)</li> <li>Avoid redundant call to <code>_get_os_path</code> in <code>_dir_model</code> <a href="https://redirect.github.com/jupyter-server/jupyter_server/pull/1547">#1547</a> (<a href="https://github.com/joeyutong"><code>@joeyutong</code></a>, <a href="https://github.com/vidartf"><code>@vidartf</code></a>)</li> <li>Allow specifying extra params to scrub from logs <a href="https://redirect.github.com/jupyter-server/jupyter_server/pull/1538">#1538</a> (<a href="https://github.com/jtpio"><code>@jtpio</code></a>, <a href="https://github.com/Zsailer"><code>@Zsailer</code></a>, <a href="https://github.com/vidartf"><code>@vidartf</code></a>)</li> <li>Add a logger to the ExtensionPoint API <a href="https://redirect.github.com/jupyter-server/jupyter_server/pull/1523">#1523</a> (<a href="https://github.com/Zsailer"><code>@Zsailer</code></a>, <a href="https://github.com/vidartf"><code>@vidartf</code></a>)</li> <li>Allow user to update identity values <a href="https://redirect.github.com/jupyter-server/jupyter_server/pull/1518">#1518</a> (<a href="https://github.com/brichet"><code>@brichet</code></a>, <a href="https://github.com/minrk"><code>@minrk</code></a>)</li> <li>If ServerApp.ip is ipv6 use [::1] as local_url <a href="https://redirect.github.com/jupyter-server/jupyter_server/pull/1495">#1495</a> (<a href="https://github.com/manics"><code>@manics</code></a>, <a href="https://github.com/afshin"><code>@afshin</code></a>)</li> <li>Better error message when starting kernel for session. <a href="https://redirect.github.com/jupyter-server/jupyter_server/pull/1478">#1478</a> (<a href="https://github.com/Carreau"><code>@Carreau</code></a>, <a href="https://github.com/davidbrochart"><code>@davidbrochart</code></a>, <a href="https://github.com/krassowski"><code>@krassowski</code></a>, <a href="https://github.com/minrk"><code>@minrk</code></a>)</li> <li>Add a traitlet to disable recording HTTP request metrics <a href="https://redirect.github.com/jupyter-server/jupyter_server/pull/1472">#1472</a> (<a href="https://github.com/yuvipanda"><code>@yuvipanda</code></a>, <a href="https://github.com/Zsailer"><code>@Zsailer</code></a>)</li> <li>prometheus: Expose 3 activity metrics <a href="https://redirect.github.com/jupyter-server/jupyter_server/pull/1471">#1471</a> (<a href="https://github.com/yuvipanda"><code>@yuvipanda</code></a>, <a href="https://github.com/Zsailer"><code>@Zsailer</code></a>)</li> <li>Add prometheus info metrics listing server extensions + versions <a href="https://redirect.github.com/jupyter-server/jupyter_server/pull/1470">#1470</a> (<a href="https://github.com/yuvipanda"><code>@yuvipanda</code></a>, <a href="https://github.com/Zsailer"><code>@Zsailer</code></a>)</li> <li>Add prometheus metric with version information <a href="https://redirect.github.com/jupyter-server/jupyter_server/pull/1467">#1467</a> (<a href="https://github.com/yuvipanda"><code>@yuvipanda</code></a>, <a href="https://github.com/Zsailer"><code>@Zsailer</code></a>)</li> <li>Don't hide .so,.dylib files by default <a href="https://redirect.github.com/jupyter-server/jupyter_server/pull/1457">#1457</a> (<a href="https://github.com/nokados"><code>@nokados</code></a>, <a href="https://github.com/krassowski"><code>@krassowski</code></a>, <a href="https://github.com/minrk"><code>@minrk</code></a>, <a href="https://github.com/vidartf"><code>@vidartf</code></a>)</li> <li>Better hash format error message <a href="https://redirect.github.com/jupyter-server/jupyter_server/pull/1442">#1442</a> (<a href="https://github.com/fcollonval"><code>@fcollonval</code></a>, <a href="https://github.com/Zsailer"><code>@Zsailer</code></a>)</li> <li>Removing excessive logging from reading local files <a href="https://redirect.github.com/jupyter-server/jupyter_server/pull/1420">#1420</a> (<a href="https://github.com/lresende"><code>@lresende</code></a>, <a href="https://github.com/kevin-bates"><code>@kevin-bates</code></a>)</li> <li>Add async start hook to ExtensionApp API <a href="https://redirect.github.com/jupyter-server/jupyter_server/pull/1417">#1417</a> (<a href="https://github.com/Zsailer"><code>@Zsailer</code></a>, <a href="https://github.com/Darshan808"><code>@Darshan808</code></a>, <a href="https://github.com/bollwyvl"><code>@bollwyvl</code></a>, <a href="https://github.com/fcollonval"><code>@fcollonval</code></a>, <a href="https://github.com/krassowski"><code>@krassowski</code></a>)</li> <li>Do not include token in dashboard link, when available <a href="https://redirect.github.com/jupyter-server/jupyter_server/pull/1406">#1406</a> (<a href="https://github.com/minrk"><code>@minrk</code></a>, <a href="https://github.com/blink1073"><code>@blink1073</code></a>)</li> <li>Add an option to have authentication enabled for all endpoints by default <a href="https://redirect.github.com/jupyter-server/jupyter_server/pull/1392">#1392</a> (<a href="https://github.com/krassowski"><code>@krassowski</code></a>, <a href="https://github.com/Wh1isper"><code>@Wh1isper</code></a>, <a href="https://github.com/blink1073"><code>@blink1073</code></a>, <a href="https://github.com/bollwyvl"><code>@bollwyvl</code></a>, <a href="https://github.com/minrk"><code>@minrk</code></a>, <a href="https://github.com/yuvipanda"><code>@yuvipanda</code></a>)</li> <li>websockets: add configurations for ping interval and timeout <a href="https://redirect.github.com/jupyter-server/jupyter_server/pull/1391">#1391</a> (<a href="https://github.com/oliver-sanders"><code>@oliver-sanders</code></a>, <a href="https://github.com/blink1073"><code>@blink1073</code></a>)</li> <li>log extension import time at debug level unless it's actually slow <a href="https://redirect.github.com/jupyter-server/jupyter_server/pull/1375">#1375</a> (<a href="https://github.com/minrk"><code>@minrk</code></a>, <a href="https://github.com/Zsailer"><code>@Zsailer</code></a>, <a href="https://github.com/yuvipanda"><code>@yuvipanda</code></a>)</li> <li>Add support for async Authorizers (part 2) <a href="https://redirect.github.com/jupyter-server/jupyter_server/pull/1374">#1374</a> (<a href="https://github.com/Zsailer"><code>@Zsailer</code></a>, <a href="https://github.com/blink1073"><code>@blink1073</code></a>)</li> <li>Support async Authorizers <a href="https://redirect.github.com/jupyter-server/jupyter_server/pull/1373">#1373</a> (<a href="https://github.com/Zsailer"><code>@Zsailer</code></a>, <a href="https://github.com/blink1073"><code>@blink1073</code></a>)</li> <li>Support get file(notebook) md5 <a href="https://redirect.github.com/jupyter-server/jupyter_server/pull/1363">#1363</a> (<a href="https://github.com/Wh1isper"><code>@Wh1isper</code></a>, <a href="https://github.com/blink1073"><code>@blink1073</code></a>, <a href="https://github.com/bollwyvl"><code>@bollwyvl</code></a>, <a href="https://github.com/krassowski"><code>@krassowski</code></a>)</li> <li>Update kernel env to reflect changes in session <a href="https://redirect.github.com/jupyter-server/jupyter_server/pull/1354">#1354</a> (<a href="https://github.com/blink1073"><code>@blink1073</code></a>, <a href="https://github.com/Carreau"><code>@Carreau</code></a>, <a href="https://github.com/krassowski"><code>@krassowski</code></a>)</li> <li>Add resolvePath API for resolving kernel-relative paths <a href="https://redirect.github.com/jupyter-server/jupyter_server/pull/1331">#1331</a> (<a href="https://github.com/krassowski"><code>@krassowski</code></a>, <a href="https://github.com/Carreau"><code>@Carreau</code></a>, <a href="https://github.com/blink1073"><code>@blink1073</code></a>)</li> </ul> <h3>Bugs fixed</h3> <ul> <li>Move check origin into a util function and add it to websocket <a href="https://redirect.github.com/jupyter-server/jupyter_server/pull/1630">#1630</a> (<a href="https://github.com/Carreau"><code>@Carreau</code></a>, <a href="https://github.com/Yann-P"><code>@Yann-P</code></a>)</li> <li>Fix flaky test_restart_kernel by unsticking nudge() after port-changing restart <a href="https://redirect.github.com/jupyter-server/jupyter_server/pull/1628">#1628</a> (<a href="https://github.com/Carreau"><code>@Carreau</code></a>, <a href="https://github.com/claude"><code>@claude</code></a>, <a href="https://github.com/krassowski"><code>@krassowski</code></a>)</li> <li>Try to fix flaky test "test_restart_kernel" <a href="https://redirect.github.com/jupyter-server/jupyter_server/pull/1625">#1625</a> (<a href="https://github.com/Carreau"><code>@Carreau</code></a>)</li> <li>Fix potential unraisable pytest error <a href="https://redirect.github.com/jupyter-server/jupyter_server/pull/1624">#1624</a> (<a href="https://github.com/Carreau"><code>@Carreau</code></a>)</li> <li>fix: use %s placeholders in HTTPError to prevent Tornado from doubling % in gateway URLs <a href="https://redirect.github.com/jupyter-server/jupyter_server/pull/1620">#1620</a> (<a href="https://github.com/terminalchai"><code>@terminalchai</code></a>, <a href="https://github.com/krassowski"><code>@krassowski</code></a>, <a href="https://github.com/ptch314"><code>@ptch314</code></a>)</li> <li>Fix three file descriptor leaks in kernel connection lifecycle (<a href="https://redirect.github.com/jupyter-server/jupyter_server/issues/1506">#1506</a>) <a href="https://redirect.github.com/jupyter-server/jupyter_server/pull/1619">#1619</a> (<a href="https://github.com/tonyx93"><code>@tonyx93</code></a>, <a href="https://github.com/Carreau"><code>@Carreau</code></a>)</li> <li>Use web.HTTPError for kernel restart failures <a href="https://redirect.github.com/jupyter-server/jupyter_server/pull/1616">#1616</a> (<a href="https://github.com/YDawn"><code>@YDawn</code></a>, <a href="https://github.com/Carreau"><code>@Carreau</code></a>)</li> <li>Handle EADDRINUSE and EACCES in _bind_http_server_tcp <a href="https://redirect.github.com/jupyter-server/jupyter_server/pull/1613">#1613</a> (<a href="https://github.com/YDawn"><code>@YDawn</code></a>, <a href="https://github.com/Zsailer"><code>@Zsailer</code></a>, <a href="https://github.com/minrk"><code>@minrk</code></a>)</li> <li>Use st_birthtime for file created timestamp on macOS/BSD <a href="https://redirect.github.com/jupyter-server/jupyter_server/pull/1594">#1594</a> (<a href="https://github.com/ktaletsk"><code>@ktaletsk</code></a>, <a href="https://github.com/krassowski"><code>@krassowski</code></a>, <a href="https://github.com/minrk"><code>@minrk</code></a>)</li> <li>Fix double write when refusing hidden files in contents handler <a href="https://redirect.github.com/jupyter-server/jupyter_server/pull/1585">#1585</a> (<a href="https://github.com/Krish-876"><code>@Krish-876</code></a>, <a href="https://github.com/minrk"><code>@minrk</code></a>)</li> <li>Close all sockets in _find_http_port explicitly <a href="https://redirect.github.com/jupyter-server/jupyter_server/pull/1584">#1584</a> (<a href="https://github.com/MaryushSoroka"><code>@MaryushSoroka</code></a>, <a href="https://github.com/minrk"><code>@minrk</code></a>)</li> <li>Fix writing on remote file systems with attribute cache <a href="https://redirect.github.com/jupyter-server/jupyter_server/pull/1574">#1574</a> (<a href="https://github.com/krassowski"><code>@krassowski</code></a>, <a href="https://github.com/Zsailer"><code>@Zsailer</code></a>)</li> <li>Add IdentityProvider.cookie_secret_hook <a href="https://redirect.github.com/jupyter-server/jupyter_server/pull/1569">#1569</a> (<a href="https://github.com/emin63"><code>@emin63</code></a>, <a href="https://github.com/minrk"><code>@minrk</code></a>)</li> </ul> <!-- raw HTML omitted --> </blockquote> <p>... (truncated)</p> </details> <details> <summary>Commits</summary> <ul> <li><a href="https://github.com/jupyter-server/jupyter_server/commit/0ceed45a803ca36735f0fcfeb6d9db9430a50aa0"><code>0ceed45</code></a> Publish 2.18.0</li> <li><a href="https://github.com/jupyter-server/jupyter_server/commit/49b34392feaa97735b3b777e3baf8f22f2a14ed8"><code>49b3439</code></a> Move check origin into a util function and add it to websocket (<a href="https://redirect.github.com/jupyter-server/jupyter_server/issues/1630">#1630</a>)</li> <li><a href="https://github.com/jupyter-server/jupyter_server/commit/e2e08c845ddbc41fddcb2449601d2ecbd9dd5977"><code>e2e08c8</code></a> Add test case for bad next URL format</li> <li><a href="https://github.com/jupyter-server/jupyter_server/commit/624d6c0daf573e254a3fd69ca5318ce8194235bf"><code>624d6c0</code></a> Delete outdated patch code</li> <li><a href="https://github.com/jupyter-server/jupyter_server/commit/d825b93d9cf2da248d5baa6ca910611f275fa449"><code>d825b93</code></a> Apply suggestion from <a href="https://github.com/minrk"><code>@minrk</code></a></li> <li><a href="https://github.com/jupyter-server/jupyter_server/commit/789fed081a489ff38c50ec9f6c0364cb677d4cd2"><code>789fed0</code></a> patch open redirect in /login</li> <li><a href="https://github.com/jupyter-server/jupyter_server/commit/2ee51eccf3ff2e27068cc0b7a39101eeedc4f665"><code>2ee51ec</code></a> fix(CVE-2026-35397): path traversal when target dir starts with root dir</li> <li><a href="https://github.com/jupyter-server/jupyter_server/commit/057869a327c46730afede3eab0ca2d2e3e74acea"><code>057869a</code></a> Fix allow_origin_pat to do full matching instead of prefix matching</li> <li><a href="https://github.com/jupyter-server/jupyter_server/commit/4862199a0fffacd4d2e4a0c2e61fc8bb5ffa52f0"><code>4862199</code></a> Add resolvePath API for resolving kernel-relative paths</li> <li><a href="https://github.com/jupyter-server/jupyter_server/commit/e31d51406de6a9b167b796ec79ab3315630d514a"><code>e31d514</code></a> Bump actions/create-github-app-token from 2 to 3 in the actions group across ...</li> <li>Additional commits viewable in <a href="https://github.com/jupyter-server/jupyter_server/compare/v2.17.0...v2.18.0">compare view</a></li> </ul> </details> <br /> [](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) --- <details> <summary>Dependabot commands and options</summary> <br /> You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot show <dependency name> ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself) You can disable automated security fix PRs for this repo from the [Security Alerts page](https://github.com/langchain-ai/langgraph/network/alerts). </details> Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> |
||
|
|
86baa5d08e |
feat(checkpoint-sqlite): override get_delta_channel_history with streaming walk (#7702)
## Summary Adds a sqlite-specific override of `BaseCheckpointSaver.get_delta_channel_history` (and async). Before this PR, `SqliteSaver` / `AsyncSqliteSaver` inherited the default impl, which calls `get_tuple` once per ancestor — N round-trips, full pending-writes fetch per step regardless of channel relevance. The override mirrors the postgres two-stage shape (ancestor walk + per-channel UNION ALL writes fetch) but adapted for sqlite: - **No JSONB** → stage 1 streams the cursor row-by-row in `checkpoint_id` DESC order. The merged walk advances one row at a time, deserializing only on-path checkpoints and dropping each before advancing — peak in-flight is one deserialized checkpoint, no `fetchall()` materialization. - **No separate blob table** → `channel_values` lives inline in the checkpoint blob, so seeds come back from stage 1 with no second fetch. - **Single merged walk (not K independent walks)**: each visited cid is deserialized exactly once, regardless of how many channels are still seeking their seed. - **Stage 2** stays per-channel UNION ALL to avoid over-fetching writes when channels have different chain depths — same rationale as postgres. `AsyncSqliteSaver.get_delta_channel_history` bridges to its async form via `run_coroutine_threadsafe`, matching the same cross-thread guard used by `get_tuple` / `delete_thread`. ## Tests - New `tests/test_delta_channel_migration.py`: covers the `BinaryOperatorAggregate -> DeltaChannel` migration path on sqlite (sync round-trip, sync continuation with post-migration delta folding, async round-trip). Mirrors `libs/langgraph/tests/test_delta_channel_migration.py` (which covered `InMemorySaver`); without these, the override's behavior on pre-migration threads was unverified — the override has to identify a plain accumulated `channel_values[ch]` at a pre-migration ancestor as a valid `seed`, not just `_DeltaSnapshot` sentinels. - Existing `tests/test_get_delta_channel_history.py` (7 tests) continues to pass and now exercises the optimized override end-to-end (previously hit the inherited default impl). - `make format`, `make lint`, `make test`: clean. 97/97 in the non-flaky sqlite suite (the one ignored test, `test_async_asearch_refresh_ttl`, is a known TTL-store timing flake on a separate module unrelated to this PR). ## Benchmarks ### `get_delta_channel_history` micro-bench (override vs inherited default impl) 1000-turn synthetic threads with sentinel snapshots + per-step writes; `bench_sqlite_delta_history.py`. Per-call latency in microseconds. | Scenario | min | median | mean | |---|---:|---:|---:| | S1 single channel, root-only snapshot | **4.60x** | **4.90x** | **5.13x** | | S2 mixed cadence (every-50 + root-only), 2 channels | **6.08x** | **6.37x** | **6.84x** | | S3 K=8 channels, root-only snapshot | 1.23x | 1.27x | 0.90x | S2 wins biggest because per-channel UNION ALL avoids over-fetching writes for the shallow channel. S3 is the worst case for sqlite (8 channels all walking to root, 1000 deserializations either way) — the override still wins on min/median. ### Long-running thread mem/storage bench (delta vs no-delta) `bench_sqlite_delta_memory.py`. `delta` mode uses `DeltaChannel` + the override; `no_delta` uses `Annotated[list, _messages_delta_reducer]` (full state in every blob). Same workload, file-backed sqlite. Latency measured untraced (30 iterations); peak heap measured separately under tracemalloc. | Scenario | Turns | Storage Δ | Peak heap Δ | Read latency Δ | |---|---:|---|---|---| | K=1, freq=50 | 200 | **-96%** (942 KB vs 25.1 MB) | +21% (504 KB vs 418 KB) | **+13%** | | K=1, freq=50 | 500 | **-98%** (2.9 MB vs 152.3 MB) | +20% (1.2 MB vs 1.0 MB) | **-6%** (delta wins) | | K=3, freq=50 uniform | 200 | **-98%** (1.7 MB vs 73.5 MB) | +7% (1.3 MB vs 1.2 MB) | **+10%** | | K=3, freq=50 uniform | 500 | **-99%** (6.0 MB vs 452.5 MB) | +7% (3.3 MB vs 3.0 MB) | **+6%** | | K=3, freq=mixed | 200 | **-98%** (1.4 MB vs 73.5 MB) | +5% (1.3 MB vs 1.2 MB) | +190% (5.1 ms vs 1.7 ms abs) | | K=3, freq=mixed | 500 | **-99%** (4.1 MB vs 452.5 MB) | +8% (3.3 MB vs 3.0 MB) | +377% (20.9 ms vs 4.4 ms abs) | - **Storage**: -96 to -99% on long threads (a 500-turn K=3 thread shrinks from 452 MB to 6 MB on disk). This is the headline win. - **Peak heap**: within +5 to +21% of the no-delta path — the streaming cursor + merged walk + drop-after-deserialize keep peak in-flight at one checkpoint at a time. - **Read latency**: equivalent-ish (within ~15%) on uniform-cadence scenarios; at K=1/500 turns delta even wins by 6%. The mixed-cadence rows have one channel with `snapshot_frequency=1000` walking to root on a 500-turn thread — by configuration. Absolute mixed-delta latency is still 5-21 ms per read. Bench scripts (not committed; workspace-root convention matches other `bench_*.py` files): - `bench_sqlite_delta_history.py` - `bench_sqlite_delta_memory.py` ## Test plan - [x] `cd libs/checkpoint-sqlite && make format` clean - [x] `cd libs/checkpoint-sqlite && make lint` clean - [x] `cd libs/checkpoint-sqlite && make test` — 97 passed (1 known flake unrelated) - [x] `tests/test_get_delta_channel_history.py` — 7/7 (now exercises the override) - [x] `tests/test_delta_channel_migration.py` — 3/3 (new) |
||
|
|
127c6c2c7b |
chore: "chore: minor clean up around checkpoint and delta channel" (#7706)
Reverts langchain-ai/langgraph#7705 |
||
|
|
0ae8870432 | chore: minor clean up around checkpoint and delta channel (#7705) | ||
|
|
125d10052c |
release: alpha bump (a4) for langgraph, checkpoint, checkpoint-postgres (#7701)
- Bumps `langgraph` 1.2.0a6 → 1.2.0a7 - Bumps `langgraph-checkpoint` 4.1.0a3 → 4.1.0a4 - Bumps `langgraph-checkpoint-postgres` 3.1.0a3 → 3.1.0a4 - Bumps min `langgraph-checkpoint` constraint in `langgraph` and `checkpoint-postgres` to `>=4.1.0a4` - Refreshes uv locks across the workspace |
||
|
|
0a53c385b2 |
feat: public get_writes_history saver API + delta cadence rework (#7699)
## Summary
- Promotes the private K-channel batched ancestor-walk to a stable
public `get_delta_channel_history` / `aget_delta_channel_history` API on
`BaseCheckpointSaver` (returns `Mapping[str, DeltaChannelHistory]`, a
TypedDict with `writes` always present and `seed` `NotRequired`)
- Removes `DELTA_SENTINEL` / `_DeltaSentinel` entirely — the saver layer
is now delta-agnostic on both write and read paths
- Reworks `DeltaChannel` snapshot cadence from "every Nth superstep" to
"every N updates to this channel," persisted in
`CheckpointMetadata.delta_updates_since_snapshot`
- Adds Postgres optimizations: paged stage-1 with cursor (1024-row
pages) and per-channel UNION ALL stage-2 (no over-fetch when channels
have different chain depths)
- Default `snapshot_frequency` becomes a positive int (default `1000`);
the previous `None` opt-out is removed
## Public API
```python
class DeltaChannelHistory(TypedDict):
writes: list[PendingWrite] # always present, possibly empty
seed: NotRequired[Any] # absent if walk reached root
def get_delta_channel_history(
self, *, config: RunnableConfig, channels: Sequence[str]
) -> Mapping[str, DeltaChannelHistory]: ...
async def aget_delta_channel_history(
self, *, config: RunnableConfig, channels: Sequence[str]
) -> Mapping[str, DeltaChannelHistory]: ...
```
`config` and `channels` are keyword-only so later additions (e.g.
`page_size`) don't shift the positional API.
The TypedDict-with-`NotRequired[seed]` shape matches the existing
checkpoint-package convention (`CheckpointMetadata` is
`TypedDict(total=False)`) — absence-via-key-omission rather than
introducing a new sentinel. Pregel translates `"seed" not in hist` to
`MISSING` on its side at consume time.
The default impl walks `get_tuple` + `parent_config` correctly but is
slow on long chains; savers that care override (`InMemorySaver`,
`PostgresSaver`).
## Sentinel removal
`DELTA_SENTINEL` and `_DeltaSentinel` are deleted entirely. The saver
layer becomes delta-agnostic:
- `DeltaChannel.checkpoint()` returns `MISSING` for non-snapshot steps;
pregel's `create_checkpoint` skips MISSING so delta channels without a
snapshot simply don't appear in `channel_values`
- `InMemorySaver.put` and Postgres `put` no longer filter sentinels
(they have nothing to filter)
- `_needs_replay` becomes `stored is MISSING`
- `DeltaChannel.from_checkpoint` accepts: `MISSING` → empty,
`_DeltaSnapshot(value)` → snapshot value, plain value → pre-migration
legacy
## Snapshot cadence
`DeltaChannel.snapshot_frequency: int` (default `1000`, positive). The
previous `None` opt-out is gone.
```python
def should_snapshot(ch_name, ch):
if force_delta_snapshot: # durability="exit"
return True
return updates_since_snapshot.get(ch_name, 0) >= ch.snapshot_frequency
```
Per-channel update counters are persisted in
`CheckpointMetadata.delta_updates_since_snapshot` (`NotRequired`,
`total=False`). The counter is incremented by `_put_checkpoint` for any
delta channel in `updated_channels` and reset to `0` by
`create_checkpoint` for channels that fire a snapshot this step.
Version-format-independent — works for `int`, `float`, and `str`
versioning schemes alike.
## Postgres optimization
Two improvements internal to the override:
**Stage-1 paged with cursor** (`LIMIT 1024` internal const, `AND
checkpoint_id < ?` for subsequent pages). The previous unpaged form
scanned every checkpoint in `(thread_id, ns)` and was pathological at
high thread depths.
**Stage-2 per-channel UNION ALL**: one `WHERE channel='X' AND
checkpoint_id = ANY(chain_X)` branch per channel plus one seed-blob
branch per channel with a seed. The previous form filtered by `channel =
ANY(channels) AND checkpoint_id = ANY(union_chain_cids)`, over-fetching
writes when channels had different chain depths (`K ×
max(chain_lengths)` vs the correct `sum(chain_lengths)`).
Both improvements stay internal to `PostgresSaver`/`AsyncPostgresSaver`;
the public contract returns a single `Mapping`.
## Benchmarks
`libs/langgraph/tests/test_delta_channel_benchmark.py`. Run via `python
libs/langgraph/tests/test_delta_channel_benchmark.py`. Postgres against
local pg:5441.
Results below trimmed to the high-signal cells. Sub-millisecond /
sub-100-turn rows omitted as warmup-bound; freq=1 omitted (chain depth =
1, nothing to optimize); peak read-time memory and Postgres storage are
flat between branches and omitted. Deep-thread reads and the
cadence-rework storage win are the load-bearing numbers.
### Postgres reads, 500 turns
| Scenario | main | branch | Δ |
|---|---:|---:|---:|
| Single-channel deep read | 17.7 ms | **6.1 ms** | **-66%** |
| Single-channel, 1000 turns | 35.0 ms | **14.3 ms** | **-59%** |
| K=3 channels, freq=50 uniform | 70.5 ms | **41.4 ms** | **-41%** |
| K=8 channels, freq=50 uniform | 214.2 ms | **139.4 ms** | **-35%** |
| K=8 channels, mixed freq (25/50/100/.../1000) | 295.6 ms | **214.4
ms** | **-27%** |
K-channel batching + paged stage-1 + per-channel UNION ALL stage-2 doing
exactly what they should at depth.
### InMemory reads, 500 turns
| Scenario | main | branch | Δ |
|---|---:|---:|---:|
| Single-channel deep read | 7.9 ms | **3.8 ms** | **-52%** |
| Single-channel, 1000 turns | 15.6 ms | **7.2 ms** | **-54%** |
| K=8 channels, freq=50 uniform | 112.3 ms | 94.6 ms | -16% |
| K=8 channels, mixed freq | 184.9 ms | **134.5 ms** | **-27%** |
### InMemory storage, 500 turns (cadence-rework win)
| Scenario | main | branch | Δ |
|---|---:|---:|---:|
| K=3, freq=50 uniform | 8.7 MB | **3.3 MB** | **-62%** |
| K=3 mixed freq | 3.8 MB | **1.3 MB** | **-66%** |
| K=8, freq=50 uniform | 23.1 MB | **8.7 MB** | **-62%** |
| K=8 mixed freq | 11.5 MB | **4.2 MB** | **-64%** |
Snapshot frequency now counts **channel updates** instead of
**supersteps**. On graphs where supersteps outpace per-channel updates
(e.g., input/end steps that don't write to channels), branch stores ~3×
fewer snapshot blobs.
### Tradeoff worth flagging
InMemory K=3 with mixed frequencies (50/200/1000) at 500 turns: **+64%
read latency** (46.6 → 76.5 ms). The mixed scenario has a channel with
`freq=1000` that goes the entire 500-turn run with no snapshot. On main,
the old superstep-counted cadence happened to fire at step=500 anyway.
New cadence gives users explicit control over walk depth via
`snapshot_frequency`. The K=8 mixed case still wins overall (-27%); this
regression is specific to the K=3 mixed shape.
Default `snapshot_frequency=1000` is the upper bound on walk depth —
it's a tunable knob.
## Tests
- New sqlite smoke test (`test_get_delta_channel_history.py`) exercises
the inherited default `BaseCheckpointSaver` impl via `SqliteSaver` /
`AsyncSqliteSaver` end-to-end with a real `DeltaChannel`-backed graph.
Sqlite uses the default unchanged — this validates the default path
actually works on a real second saver, not just on the optimized
override.
- Module-level `pytest.importorskip("langgraph.channels.delta")` guards
the test for sqlite's standalone CI environment (matches the postgres
pattern).
## Test plan
- [x] `libs/checkpoint`: 150 passed, 16 skipped
- [x] `libs/langgraph` (channels + delta migration): 41/41 (post-merge)
- [x] `libs/langgraph` (full pregel suite): 1784 passing — 6 "failures"
verified via `env -i` clean shell are local LangSmith env vars + `git
describe revision_id` polluting LangChain metadata fixtures; CI is
unaffected
- [x] `libs/checkpoint-postgres`: 40/40 saver tests + 3/3 delta channel
reconstruction tests against local Postgres
- [x] `libs/checkpoint-sqlite`: 105/105 (incl. retry-passed flake
`test_ttl_refresh`, unrelated to this PR)
- [x] Lint clean across all four libs (`ruff format`, `ruff check`,
`mypy`)
- [x] Branch-vs-main benchmarks — see results above
---------
Co-authored-by: Quanzheng Long <long@langchain.dev>
Co-authored-by: Cursor <cursoragent@cursor.com>
|
||
|
|
35cea28707 | release: alpha bump langgraph 1.2.0a6 (#7697) | ||
|
|
3fff7bc928 | feat(langgraph): forward kwargs through stream_events(version="v3") (#7696) | ||
|
|
a0c4bdc3cb |
chore(deps): bump the minor-and-patch group across 1 directory with 6 updates (#7675)
Bumps the minor-and-patch group with 6 updates in the /libs/langgraph directory: | Package | From | To | | --- | --- | --- | | [xxhash](https://github.com/ifduyue/python-xxhash) | `3.6.0` | `3.7.0` | | [pydantic](https://github.com/pydantic/pydantic) | `2.12.5` | `2.13.3` | | [py-spy](https://github.com/benfred/py-spy) | `0.4.1` | `0.4.2` | | [mypy](https://github.com/python/mypy) | `1.19.1` | `1.20.2` | | [ruff](https://github.com/astral-sh/ruff) | `0.15.7` | `0.15.12` | | [types-requests](https://github.com/python/typeshed) | `2.32.4.20260324` | `2.33.0.20260408` | Updates `xxhash` from 3.6.0 to 3.7.0 <details> <summary>Release notes</summary> <p><em>Sourced from <a href="https://github.com/ifduyue/python-xxhash/releases">xxhash's releases</a>.</em></p> <blockquote> <h2>v3.7.0</h2> <ul> <li>Drop support for Python 3.7</li> <li>Build armv7l manylinux/musllinux wheels</li> <li>Build riscv64 manylinux/musllinux wheels</li> <li>Build android and ios wheels</li> </ul> <hr /> <p>Full list of changes: <a href="https://github.com/ifduyue/python-xxhash/compare/v3.6.0...v3.7.0">https://github.com/ifduyue/python-xxhash/compare/v3.6.0...v3.7.0</a></p> </blockquote> </details> <details> <summary>Changelog</summary> <p><em>Sourced from <a href="https://github.com/ifduyue/python-xxhash/blob/master/CHANGELOG.rst">xxhash's changelog</a>.</em></p> <blockquote> <p>v3.7.0 2025-04-25</p> <pre><code> - Drop support for Python 3.7 - Build armv7l manylinux/musllinux wheels - Build riscv64 manylinux/musllinux wheels - Build android and ios wheels </code></pre> </blockquote> </details> <details> <summary>Commits</summary> <ul> <li><a href="https://github.com/ifduyue/python-xxhash/commit/404589e3d5735591755d2e7f32c87a15f8724c02"><code>404589e</code></a> Prepare 3.7.0</li> <li><a href="https://github.com/ifduyue/python-xxhash/commit/d3cd66446da1bea6de24b4edebc31a84cee45aab"><code>d3cd664</code></a> Bump pypa/gh-action-pypi-publish from 1.13.0 to 1.14.0</li> <li><a href="https://github.com/ifduyue/python-xxhash/commit/0d7d943288e3ad86988d57002ec5ebd3ce8e61da"><code>0d7d943</code></a> Bump pypa/cibuildwheel from 3.4.0 to 3.4.1</li> <li><a href="https://github.com/ifduyue/python-xxhash/commit/c4b8775fe0fd60598e4244ea0c522134cc3c3cf5"><code>c4b8775</code></a> Bump actions/download-artifact from 7 to 8</li> <li><a href="https://github.com/ifduyue/python-xxhash/commit/1ae3e5b60e4cf1f5f78278183dde90dba932962a"><code>1ae3e5b</code></a> Bump actions/upload-artifact from 6 to 7</li> <li><a href="https://github.com/ifduyue/python-xxhash/commit/8faaa340c9a647dd78ce1c6515097b28f744352b"><code>8faaa34</code></a> Bump pypa/cibuildwheel from 3.3.1 to 3.4.0</li> <li><a href="https://github.com/ifduyue/python-xxhash/commit/4ba9b0cc343c50f903ff67918032971e0d9842c3"><code>4ba9b0c</code></a> Bump docker/setup-qemu-action from 3 to 4</li> <li><a href="https://github.com/ifduyue/python-xxhash/commit/43bb2030f1a7fd389cc876037e653674b850e9e7"><code>43bb203</code></a> Bump actions/download-artifact from 6 to 7</li> <li><a href="https://github.com/ifduyue/python-xxhash/commit/a7a3bd22f2a536220bd08c5765e2fe06e9210ba8"><code>a7a3bd2</code></a> Bump actions/upload-artifact from 5 to 6</li> <li><a href="https://github.com/ifduyue/python-xxhash/commit/c35bf0125bfe2a11794d7d5440159ed8b124e0e1"><code>c35bf01</code></a> Bump pypa/cibuildwheel from 3.3.0 to 3.3.1</li> <li>Additional commits viewable in <a href="https://github.com/ifduyue/python-xxhash/compare/v3.6.0...v3.7.0">compare view</a></li> </ul> </details> <br /> Updates `pydantic` from 2.12.5 to 2.13.3 <details> <summary>Release notes</summary> <p><em>Sourced from <a href="https://github.com/pydantic/pydantic/releases">pydantic's releases</a>.</em></p> <blockquote> <h2>v2.13.3 2026-04-20</h2> <h2>v2.13.3 (2026-04-20)</h2> <h3>What's Changed</h3> <h4>Fixes</h4> <ul> <li>Handle <code>AttributeError</code> subclasses with <code>from_attributes</code> by <a href="https://github.com/Viicos"><code>@Viicos</code></a> in <a href="https://redirect.github.com/pydantic/pydantic/pull/13096">#13096</a></li> </ul> <p><strong>Full Changelog</strong>: <a href="https://github.com/pydantic/pydantic/compare/v2.13.2...v2.13.3">https://github.com/pydantic/pydantic/compare/v2.13.2...v2.13.3</a></p> <h2>v2.13.2 2026-04-17</h2> <h2>v2.13.2 (2026-04-17)</h2> <h3>What's Changed</h3> <h4>Fixes</h4> <ul> <li>Fix <code>ValidationInfo.field_name</code> missing with <code>model_validate_json()</code> by <a href="https://github.com/Viicos"><code>@Viicos</code></a> in <a href="https://redirect.github.com/pydantic/pydantic/pull/13084">#13084</a></li> </ul> <p><strong>Full Changelog</strong>: <a href="https://github.com/pydantic/pydantic/compare/v2.13.1...v2.13.2">https://github.com/pydantic/pydantic/compare/v2.13.1...v2.13.2</a></p> <h2>v2.13.1 2026-04-15</h2> <h2>v2.13.1 (2026-04-15)</h2> <h3>What's Changed</h3> <h4>Fixes</h4> <ul> <li>Fix <code>ValidationInfo.data</code> missing with <code>model_validate_json()</code> by <a href="https://github.com/davidhewitt"><code>@davidhewitt</code></a> in <a href="https://redirect.github.com/pydantic/pydantic/pull/13079">#13079</a></li> </ul> <p><strong>Full Changelog</strong>: <a href="https://github.com/pydantic/pydantic/compare/v2.13.0...v2.13.1">https://github.com/pydantic/pydantic/compare/v2.13.0...v2.13.1</a></p> <h2>v2.13.0 2026-04-13</h2> <h2>v2.13.0 (2026-04-13)</h2> <p>The highlights of the v2.13 release are available in the <a href="https://pydantic.dev/articles/pydantic-v2-13-release">blog post</a>. Several minor changes (considered non-breaking changes according to our <a href="https://pydantic.dev/docs/validation/2.13/get-started/version-policy/#pydantic-v2">versioning policy</a>) are also included in this release. Make sure to look into them before upgrading.</p> <p>This release contains the updated <code>pydantic.v1</code> namespace, matching version 1.10.26 which includes support for Python 3.14.</p> <h3>What's Changed</h3> <p>See the beta releases for all changes sinces 2.12.</p> <h4>Packaging</h4> <ul> <li>Add zizmor for GitHub Actions workflow linting by <a href="https://github.com/Viicos"><code>@Viicos</code></a> in <a href="https://redirect.github.com/pydantic/pydantic/pull/13039">#13039</a></li> <li>Update jiter to v0.14.0 to fix a segmentation fault on musl Linux by <a href="https://github.com/Viicos"><code>@Viicos</code></a> in <a href="https://redirect.github.com/pydantic/pydantic/pull/13064">#13064</a></li> </ul> <!-- raw HTML omitted --> </blockquote> <p>... (truncated)</p> </details> <details> <summary>Changelog</summary> <p><em>Sourced from <a href="https://github.com/pydantic/pydantic/blob/main/HISTORY.md">pydantic's changelog</a>.</em></p> <blockquote> <h2>v2.13.3 (2026-04-20)</h2> <p><a href="https://github.com/pydantic/pydantic/releases/tag/v2.13.3">GitHub release</a></p> <h3>What's Changed</h3> <h4>Fixes</h4> <ul> <li>Handle <code>AttributeError</code> subclasses with <code>from_attributes</code> by <a href="https://github.com/Viicos"><code>@Viicos</code></a> in <a href="https://redirect.github.com/pydantic/pydantic/pull/13096">#13096</a></li> </ul> <h2>v2.13.2 (2026-04-17)</h2> <p><a href="https://github.com/pydantic/pydantic/releases/tag/v2.13.2">GitHub release</a></p> <h3>What's Changed</h3> <h4>Fixes</h4> <ul> <li>Fix <code>ValidationInfo.field_name</code> missing with <code>model_validate_json()</code> by <a href="https://github.com/Viicos"><code>@Viicos</code></a> in <a href="https://redirect.github.com/pydantic/pydantic/pull/13084">#13084</a></li> </ul> <h2>v2.13.1 (2026-04-15)</h2> <p><a href="https://github.com/pydantic/pydantic/releases/tag/v2.13.1">GitHub release</a></p> <h3>What's Changed</h3> <h4>Fixes</h4> <ul> <li>Fix <code>ValidationInfo.data</code> missing with <code>model_validate_json()</code> by <a href="https://github.com/davidhewitt"><code>@davidhewitt</code></a> in <a href="https://redirect.github.com/pydantic/pydantic/pull/13079">#13079</a></li> </ul> <h2>v2.13.0 (2026-04-13)</h2> <p><a href="https://github.com/pydantic/pydantic/releases/tag/v2.13.0">GitHub release</a></p> <p>The highlights of the v2.13 release are available in the <a href="https://pydantic.dev/articles/pydantic-v2-13-release">blog post</a>. Several minor changes (considered non-breaking changes according to our <a href="https://pydantic.dev/docs/validation/2.13/get-started/version-policy/#pydantic-v2">versioning policy</a>) are also included in this release. Make sure to look into them before upgrading.</p> <p>This release contains the updated <code>pydantic.v1</code> namespace, matching version 1.10.26 which includes support for Python 3.14.</p> <h3>What's Changed</h3> <p>See the beta releases for all changes sinces 2.12.</p> <h4>New Features</h4> <ul> <li>Allow default factories of private attributes to take validated model data by <a href="https://github.com/Viicos"><code>@Viicos</code></a> in <a href="https://redirect.github.com/pydantic/pydantic/pull/13013">#13013</a></li> </ul> <h4>Changes</h4> <!-- raw HTML omitted --> </blockquote> <p>... (truncated)</p> </details> <details> <summary>Commits</summary> <ul> <li><a href="https://github.com/pydantic/pydantic/commit/9e9a11132c980c4ec84ff6d2df06d4c1a55ca8f3"><code>9e9a111</code></a> Fix backported test</li> <li><a href="https://github.com/pydantic/pydantic/commit/1ec8c6aa0cae1c78409c6f31af738a24e16c7124"><code>1ec8c6a</code></a> Prepare release v2.13.3</li> <li><a href="https://github.com/pydantic/pydantic/commit/fb4f2044436e9fa4ff9745479ce263016a99c4d6"><code>fb4f204</code></a> Handle <code>AttributeError</code> subclasses with <code>from_attributes</code></li> <li><a href="https://github.com/pydantic/pydantic/commit/ca3ddd1149bd3b14273922a29da174804496a055"><code>ca3ddd1</code></a> Prepare release v2.13.2</li> <li><a href="https://github.com/pydantic/pydantic/commit/000e823a3ab7545b0c6064fde34effdcd02044ab"><code>000e823</code></a> Fix <code>ValidationInfo.field_name</code> missing with <code>model_validate_json()</code></li> <li><a href="https://github.com/pydantic/pydantic/commit/d45d8be3ffb6dfc6d0c64da6980140c91ff841fb"><code>d45d8be</code></a> Prepare release 2.13.1</li> <li><a href="https://github.com/pydantic/pydantic/commit/54aca609ce58e73dfe1c681d93432fbe3a4621da"><code>54aca60</code></a> Fix <code>ValidationInfo.data</code> missing with <code>model_validate_json()</code></li> <li><a href="https://github.com/pydantic/pydantic/commit/46bf4fa648af3a1fbf4603a37f210e9d9c618357"><code>46bf4fa</code></a> Fix Pydantic release workflow (<a href="https://redirect.github.com/pydantic/pydantic/issues/13067">#13067</a>)</li> <li><a href="https://github.com/pydantic/pydantic/commit/1b359edab09c623464d23c6fd2503ae5ff276d43"><code>1b359ed</code></a> Prepare release v2.13.0 (<a href="https://redirect.github.com/pydantic/pydantic/issues/13065">#13065</a>)</li> <li><a href="https://github.com/pydantic/pydantic/commit/b1bf19445d8ac144a7a0e82674d2d87eebab6c18"><code>b1bf194</code></a> Fix model equality when using runtime <code>extra</code> configuration (<a href="https://redirect.github.com/pydantic/pydantic/issues/13062">#13062</a>)</li> <li>Additional commits viewable in <a href="https://github.com/pydantic/pydantic/compare/v2.12.5...v2.13.3">compare view</a></li> </ul> </details> <br /> Updates `py-spy` from 0.4.1 to 0.4.2 <details> <summary>Release notes</summary> <p><em>Sourced from <a href="https://github.com/benfred/py-spy/releases">py-spy's releases</a>.</em></p> <blockquote> <h2>v0.4.2</h2> <h2>Changes</h2> <h2>🚀 Features</h2> <ul> <li>Add Python 3.14 support <a href="https://github.com/benfred"><code>@benfred</code></a> (<a href="https://redirect.github.com/benfred/py-spy/issues/833">#833</a>)</li> <li>Add support for native extensions on linux aarch64 <a href="https://github.com/tehrengruber"><code>@tehrengruber</code></a> (<a href="https://redirect.github.com/benfred/py-spy/issues/779">#779</a>)</li> <li>Use Py_Version symbol for detecting the python version <a href="https://github.com/benfred"><code>@benfred</code></a> (<a href="https://redirect.github.com/benfred/py-spy/issues/835">#835</a>)</li> <li>Show backtrace on errors when RUST_BACKTRACE=1 environment variable is set <a href="https://github.com/benfred"><code>@benfred</code></a> (<a href="https://redirect.github.com/benfred/py-spy/issues/841">#841</a>)</li> </ul> <h2>🐛 Bug Fixes</h2> <ul> <li>Fix getting symbols from OSX universal binaries <a href="https://github.com/benfred"><code>@benfred</code></a> (<a href="https://redirect.github.com/benfred/py-spy/issues/843">#843</a>)</li> <li>Fix intermittent OSX CI errors <a href="https://github.com/benfred"><code>@benfred</code></a> (<a href="https://redirect.github.com/benfred/py-spy/issues/842">#842</a>)</li> <li>Fix corrupted <code>subprocess</code> output <a href="https://github.com/ravwojdyla"><code>@ravwojdyla</code></a> (<a href="https://redirect.github.com/benfred/py-spy/issues/832">#832</a>)</li> </ul> <h2>🧰 Maintenance</h2> <ul> <li>Minor code cleanups <a href="https://github.com/benfred"><code>@benfred</code></a> (<a href="https://redirect.github.com/benfred/py-spy/issues/844">#844</a>)</li> <li>Set github actions workflow permissions <a href="https://github.com/benfred"><code>@benfred</code></a> (<a href="https://redirect.github.com/benfred/py-spy/issues/840">#840</a>)</li> <li>Fix release drafter config <a href="https://github.com/benfred"><code>@benfred</code></a> (<a href="https://redirect.github.com/benfred/py-spy/issues/839">#839</a>)</li> <li>Update dependencies <a href="https://github.com/benfred"><code>@benfred</code></a> (<a href="https://redirect.github.com/benfred/py-spy/issues/838">#838</a>)</li> <li>Bump the github-actions group across 1 directory with 6 updates @<a href="https://github.com/apps/dependabot">dependabot[bot]</a> (<a href="https://redirect.github.com/benfred/py-spy/issues/836">#836</a>)</li> <li>fix: make build and cargo clippy happy <a href="https://github.com/yihong0618"><code>@yihong0618</code></a> (<a href="https://redirect.github.com/benfred/py-spy/issues/795">#795</a>)</li> <li>Bump the github-actions group with 2 updates @<a href="https://github.com/apps/dependabot">dependabot[bot]</a> (<a href="https://redirect.github.com/benfred/py-spy/issues/798">#798</a>)</li> </ul> </blockquote> </details> <details> <summary>Commits</summary> <ul> <li><a href="https://github.com/benfred/py-spy/commit/d230d8208d652ba168256ffb66170d1c6cd8b650"><code>d230d82</code></a> Bump version: 0.4.1 → 0.4.2</li> <li><a href="https://github.com/benfred/py-spy/commit/48af4e5d69bd016db193f9113c041b9baf105130"><code>48af4e5</code></a> Minor code cleanups (<a href="https://redirect.github.com/benfred/py-spy/issues/844">#844</a>)</li> <li><a href="https://github.com/benfred/py-spy/commit/13c8863569cdd220c3d1a611f7c87ee515a845a9"><code>13c8863</code></a> Add support for native extensions on linux aarch64 (<a href="https://redirect.github.com/benfred/py-spy/issues/779">#779</a>)</li> <li><a href="https://github.com/benfred/py-spy/commit/2982dab1df02958add15e7c9c60100c22580a2a8"><code>2982dab</code></a> Use Py_Version symbol for detecting the python version (<a href="https://redirect.github.com/benfred/py-spy/issues/835">#835</a>)</li> <li><a href="https://github.com/benfred/py-spy/commit/c478370afbd0ee6bb3706d00e7b33295bcaf4e22"><code>c478370</code></a> Fix getting symbols from OSX universal binaries (<a href="https://redirect.github.com/benfred/py-spy/issues/843">#843</a>)</li> <li><a href="https://github.com/benfred/py-spy/commit/344703d74c720c62e3990a635705df485c0cf078"><code>344703d</code></a> Set github actions workflow permissions (<a href="https://redirect.github.com/benfred/py-spy/issues/840">#840</a>)</li> <li><a href="https://github.com/benfred/py-spy/commit/f84084a403cd172d7593a75fd1128966c43f7bea"><code>f84084a</code></a> Fix intermittent OSX CI errors (<a href="https://redirect.github.com/benfred/py-spy/issues/842">#842</a>)</li> <li><a href="https://github.com/benfred/py-spy/commit/d7d22b616a6918a57f7ef11fbcb85afac41b2758"><code>d7d22b6</code></a> Show backtrace on errors when RUST_BACKTRACE=1 environment variable is set (#...</li> <li><a href="https://github.com/benfred/py-spy/commit/4580345efeb494f8d5efe251506f70d2af0c5f41"><code>4580345</code></a> Fix corrupted <code>subprocess</code> output (<a href="https://redirect.github.com/benfred/py-spy/issues/832">#832</a>)</li> <li><a href="https://github.com/benfred/py-spy/commit/39bbc405d41fc02deb4bc62ff39b4e010e4ab07f"><code>39bbc40</code></a> Fix release drafter config (<a href="https://redirect.github.com/benfred/py-spy/issues/839">#839</a>)</li> <li>Additional commits viewable in <a href="https://github.com/benfred/py-spy/compare/v0.4.1...v0.4.2">compare view</a></li> </ul> </details> <br /> Updates `mypy` from 1.19.1 to 1.20.2 <details> <summary>Changelog</summary> <p><em>Sourced from <a href="https://github.com/python/mypy/blob/master/CHANGELOG.md">mypy's changelog</a>.</em></p> <blockquote> <h3>Mypy 1.20.2</h3> <ul> <li>Use WAL with SQLite cache and fix close (Shantanu, PR <a href="https://redirect.github.com/python/mypy/pull/21154">21154</a>)</li> <li>Adjust SQLite journal mode (Ivan Levkivskyi, PR <a href="https://redirect.github.com/python/mypy/pull/21217">21217</a>)</li> <li>Correctly aggregate narrowing information on parent expressions (Shantanu, PR <a href="https://redirect.github.com/python/mypy/pull/21206">21206</a>)</li> <li>Fix regression related to generic callables (Shantanu, PR <a href="https://redirect.github.com/python/mypy/pull/21208">21208</a>)</li> <li>Fix regression by avoiding widening types in some contexts (Shantanu, PR <a href="https://redirect.github.com/python/mypy/pull/21242">21242</a>)</li> <li>Fix slicing in non-strict optional mode (Shantanu, PR <a href="https://redirect.github.com/python/mypy/pull/21282">21282</a>)</li> <li>mypyc: Fix match statement semantics for "or" pattern (Shantanu, PR <a href="https://redirect.github.com/python/mypy/pull/21156">21156</a>)</li> <li>mypyc: Fix issue with module dunder attributes (Piotr Sawicki, PR <a href="https://redirect.github.com/python/mypy/pull/21275">21275</a>)</li> <li>Initial support for Python 3.15.0a8 (Marc Mueller, PR <a href="https://redirect.github.com/python/mypy/pull/21255">21255</a>)</li> </ul> <h3>Acknowledgements</h3> <p>Thanks to all mypy contributors who contributed to this release:</p> <ul> <li>A5rocks</li> <li>Aaron Wieczorek</li> <li>Adam Turner</li> <li>Ali Hamdan</li> <li>asce</li> <li>BobTheBuidler</li> <li>Brent Westbrook</li> <li>Brian Schubert</li> <li>bzoracler</li> <li>Chris Burroughs</li> <li>Christoph Tyralla</li> <li>Colin Watson</li> <li>Donghoon Nam</li> <li>E. M. Bray</li> <li>Emma Smith</li> <li>Ethan Sarp</li> <li>George Ogden</li> <li>getzze</li> <li>grayjk</li> <li>Gregor Riepl</li> <li>Ivan Levkivskyi</li> <li>James Hilliard</li> <li>James Le Cuirot</li> <li>Jeremy Nimmer</li> <li>Joren Hammudoglu</li> <li>Kai (Kazuya Ito)</li> <li>kaushal trivedi</li> <li>Kevin Kannammalil</li> <li>Lukas Geiger</li> <li>Łukasz Langa</li> <li>Marc Mueller</li> <li>Michael R. Crusoe</li> <li>michaelm-openai</li> <li>Neil Schemenauer</li> <li>Piotr Sawicki</li> </ul> <!-- raw HTML omitted --> </blockquote> <p>... (truncated)</p> </details> <details> <summary>Commits</summary> <ul> <li><a href="https://github.com/python/mypy/commit/145a062651b5f9996b75ef32b7040bd2e885ed82"><code>145a062</code></a> Bump version to 1.20.2</li> <li><a href="https://github.com/python/mypy/commit/81cd49215c288eacb987de066f02daff2553b7c7"><code>81cd492</code></a> Fix slicing with nonstrict optional (<a href="https://redirect.github.com/python/mypy/issues/21282">#21282</a>)</li> <li><a href="https://github.com/python/mypy/commit/908d3441eecbaa2a6193165317177db834d7ca1a"><code>908d344</code></a> [mypyc] Set dunder attrs when adding module to sys.modules (<a href="https://redirect.github.com/python/mypy/issues/21275">#21275</a>)</li> <li><a href="https://github.com/python/mypy/commit/ba28610fac9d2b33be210ca8dcfe4bc47b7af424"><code>ba28610</code></a> Initial support for Python 3.15.0a8 (<a href="https://redirect.github.com/python/mypy/issues/21255">#21255</a>)</li> <li><a href="https://github.com/python/mypy/commit/7b0e09f48dbd3717ed008a273cd17e8e960c2037"><code>7b0e09f</code></a> Fix match statement semantics for "or" pattern (<a href="https://redirect.github.com/python/mypy/issues/21156">#21156</a>)</li> <li><a href="https://github.com/python/mypy/commit/92b74f226de62f7505f5ef5cb158e8ec9c58b8b7"><code>92b74f2</code></a> Avoid widening types in conditional_types (<a href="https://redirect.github.com/python/mypy/issues/21242">#21242</a>)</li> <li><a href="https://github.com/python/mypy/commit/0dcbfaa40b0e360a16baea9cf851955375d91b54"><code>0dcbfaa</code></a> Fix is_overlapping_types for generic callables (<a href="https://redirect.github.com/python/mypy/issues/21208">#21208</a>)</li> <li><a href="https://github.com/python/mypy/commit/210f518dede35292033ef0d387847406a0ccef8f"><code>210f518</code></a> Correctly aggregate narrowing information on parent expressions (<a href="https://redirect.github.com/python/mypy/issues/21206">#21206</a>)</li> <li><a href="https://github.com/python/mypy/commit/c34530e53a10e385d8b0f1af4baa88a596b5ceaa"><code>c34530e</code></a> Only set journal mode in coordinator (<a href="https://redirect.github.com/python/mypy/issues/21217">#21217</a>)</li> <li><a href="https://github.com/python/mypy/commit/79a3ec6d01b56a27c00e9b3320c2b1d4d73a77f9"><code>79a3ec6</code></a> Use WAL with SQLite cache, fix close (<a href="https://redirect.github.com/python/mypy/issues/21154">#21154</a>)</li> <li>Additional commits viewable in <a href="https://github.com/python/mypy/compare/v1.19.1...v1.20.2">compare view</a></li> </ul> </details> <br /> Updates `ruff` from 0.15.7 to 0.15.12 <details> <summary>Release notes</summary> <p><em>Sourced from <a href="https://github.com/astral-sh/ruff/releases">ruff's releases</a>.</em></p> <blockquote> <h2>0.15.12</h2> <h2>Release Notes</h2> <p>Released on 2026-04-24.</p> <h3>Preview features</h3> <ul> <li>Implement <code>#ruff:file-ignore</code> file-level suppressions (<a href="https://redirect.github.com/astral-sh/ruff/pull/23599">#23599</a>)</li> <li>Implement <code>#ruff:ignore</code> logical-line suppressions (<a href="https://redirect.github.com/astral-sh/ruff/pull/23404">#23404</a>)</li> <li>Revert preview changes to displayed diagnostic severity in LSP (<a href="https://redirect.github.com/astral-sh/ruff/pull/24789">#24789</a>)</li> <li>[<code>airflow</code>] Implement <code>task-branch-as-short-circuit</code> (<code>AIR004</code>) (<a href="https://redirect.github.com/astral-sh/ruff/pull/23579">#23579</a>)</li> <li>[<code>flake8-bugbear</code>] Fix <code>break</code>/<code>continue</code> handling in <code>loop-iterator-mutation</code> (<code>B909</code>) (<a href="https://redirect.github.com/astral-sh/ruff/pull/24440">#24440</a>)</li> <li>[<code>pylint</code>] Fix <code>PLC2701</code> for type parameter scopes (<a href="https://redirect.github.com/astral-sh/ruff/pull/24576">#24576</a>)</li> </ul> <h3>Rule changes</h3> <ul> <li>[<code>pandas-vet</code>] Suggest <code>.array</code> as well in <code>PD011</code> (<a href="https://redirect.github.com/astral-sh/ruff/pull/24805">#24805</a>)</li> </ul> <h3>CLI</h3> <ul> <li>Respect default Unix permissions for cache files (<a href="https://redirect.github.com/astral-sh/ruff/pull/24794">#24794</a>)</li> </ul> <h3>Documentation</h3> <ul> <li>[<code>pylint</code>] Fix <code>PLR0124</code> description not to claim self-comparison always returns the same value (<a href="https://redirect.github.com/astral-sh/ruff/pull/24749">#24749</a>)</li> <li>[<code>pyupgrade</code>] Expand docs on reusable <code>TypeVar</code>s and scoping (<code>UP046</code>) (<a href="https://redirect.github.com/astral-sh/ruff/pull/24153">#24153</a>)</li> <li>Improve rules table accessibility (<a href="https://redirect.github.com/astral-sh/ruff/pull/24711">#24711</a>)</li> </ul> <h3>Contributors</h3> <ul> <li><a href="https://github.com/dylwil3"><code>@dylwil3</code></a></li> <li><a href="https://github.com/AlexWaygood"><code>@AlexWaygood</code></a></li> <li><a href="https://github.com/woodruffw"><code>@woodruffw</code></a></li> <li><a href="https://github.com/avasis-ai"><code>@avasis-ai</code></a></li> <li><a href="https://github.com/Dev-iL"><code>@Dev-iL</code></a></li> <li><a href="https://github.com/denyszhak"><code>@denyszhak</code></a></li> <li><a href="https://github.com/ShipItAndPray"><code>@ShipItAndPray</code></a></li> <li><a href="https://github.com/anishgirianish"><code>@anishgirianish</code></a></li> <li><a href="https://github.com/augustelalande"><code>@augustelalande</code></a></li> <li><a href="https://github.com/amyreese"><code>@amyreese</code></a></li> <li><a href="https://github.com/majiayu000"><code>@majiayu000</code></a></li> </ul> <h2>Install ruff 0.15.12</h2> <h3>Install prebuilt binaries via shell script</h3> <pre lang="sh"><code>curl --proto '=https' --tlsv1.2 -LsSf https://releases.astral.sh/github/ruff/releases/download/0.15.12/ruff-installer.sh | sh </code></pre> <!-- raw HTML omitted --> </blockquote> <p>... (truncated)</p> </details> <details> <summary>Changelog</summary> <p><em>Sourced from <a href="https://github.com/astral-sh/ruff/blob/main/CHANGELOG.md">ruff's changelog</a>.</em></p> <blockquote> <h2>0.15.12</h2> <p>Released on 2026-04-24.</p> <h3>Preview features</h3> <ul> <li>Implement <code>#ruff:file-ignore</code> file-level suppressions (<a href="https://redirect.github.com/astral-sh/ruff/pull/23599">#23599</a>)</li> <li>Implement <code>#ruff:ignore</code> logical-line suppressions (<a href="https://redirect.github.com/astral-sh/ruff/pull/23404">#23404</a>)</li> <li>Revert preview changes to displayed diagnostic severity in LSP (<a href="https://redirect.github.com/astral-sh/ruff/pull/24789">#24789</a>)</li> <li>[<code>airflow</code>] Implement <code>task-branch-as-short-circuit</code> (<code>AIR004</code>) (<a href="https://redirect.github.com/astral-sh/ruff/pull/23579">#23579</a>)</li> <li>[<code>flake8-bugbear</code>] Fix <code>break</code>/<code>continue</code> handling in <code>loop-iterator-mutation</code> (<code>B909</code>) (<a href="https://redirect.github.com/astral-sh/ruff/pull/24440">#24440</a>)</li> <li>[<code>pylint</code>] Fix <code>PLC2701</code> for type parameter scopes (<a href="https://redirect.github.com/astral-sh/ruff/pull/24576">#24576</a>)</li> </ul> <h3>Rule changes</h3> <ul> <li>[<code>pandas-vet</code>] Suggest <code>.array</code> as well in <code>PD011</code> (<a href="https://redirect.github.com/astral-sh/ruff/pull/24805">#24805</a>)</li> </ul> <h3>CLI</h3> <ul> <li>Respect default Unix permissions for cache files (<a href="https://redirect.github.com/astral-sh/ruff/pull/24794">#24794</a>)</li> </ul> <h3>Documentation</h3> <ul> <li>[<code>pylint</code>] Fix <code>PLR0124</code> description not to claim self-comparison always returns the same value (<a href="https://redirect.github.com/astral-sh/ruff/pull/24749">#24749</a>)</li> <li>[<code>pyupgrade</code>] Expand docs on reusable <code>TypeVar</code>s and scoping (<code>UP046</code>) (<a href="https://redirect.github.com/astral-sh/ruff/pull/24153">#24153</a>)</li> <li>Improve rules table accessibility (<a href="https://redirect.github.com/astral-sh/ruff/pull/24711">#24711</a>)</li> </ul> <h3>Contributors</h3> <ul> <li><a href="https://github.com/dylwil3"><code>@dylwil3</code></a></li> <li><a href="https://github.com/AlexWaygood"><code>@AlexWaygood</code></a></li> <li><a href="https://github.com/woodruffw"><code>@woodruffw</code></a></li> <li><a href="https://github.com/avasis-ai"><code>@avasis-ai</code></a></li> <li><a href="https://github.com/Dev-iL"><code>@Dev-iL</code></a></li> <li><a href="https://github.com/denyszhak"><code>@denyszhak</code></a></li> <li><a href="https://github.com/ShipItAndPray"><code>@ShipItAndPray</code></a></li> <li><a href="https://github.com/anishgirianish"><code>@anishgirianish</code></a></li> <li><a href="https://github.com/augustelalande"><code>@augustelalande</code></a></li> <li><a href="https://github.com/amyreese"><code>@amyreese</code></a></li> <li><a href="https://github.com/majiayu000"><code>@majiayu000</code></a></li> </ul> <h2>0.15.11</h2> <p>Released on 2026-04-16.</p> <h3>Preview features</h3> <ul> <li>[<code>ruff</code>] Ignore <code>RUF029</code> when function is decorated with <code>asynccontextmanager</code> (<a href="https://redirect.github.com/astral-sh/ruff/pull/24642">#24642</a>)</li> <li>[<code>airflow</code>] Implement <code>airflow-xcom-pull-in-template-string</code> (<code>AIR201</code>) (<a href="https://redirect.github.com/astral-sh/ruff/pull/23583">#23583</a>)</li> <li>[<code>flake8-bandit</code>] Fix <code>S103</code> false positives and negatives in mask analysis (<a href="https://redirect.github.com/astral-sh/ruff/pull/24424">#24424</a>)</li> </ul> <!-- raw HTML omitted --> </blockquote> <p>... (truncated)</p> </details> <details> <summary>Commits</summary> <ul> <li><a href="https://github.com/astral-sh/ruff/commit/66f93cf7ed4d36325f35a452e4afa28268fbcd28"><code>66f93cf</code></a> Bump 0.15.12 (<a href="https://redirect.github.com/astral-sh/ruff/issues/24815">#24815</a>)</li> <li><a href="https://github.com/astral-sh/ruff/commit/476a4d02e8e3b6c157ac39979d8b698a1b6baa91"><code>476a4d0</code></a> [ty] Complete support for more detailed diagnostics on possibly unbound error...</li> <li><a href="https://github.com/astral-sh/ruff/commit/ed669eab30095d6c51fe6cdef6050fb01276bcb3"><code>ed669ea</code></a> Implement <code>#ruff:file-ignore</code> file-level suppressions (<a href="https://redirect.github.com/astral-sh/ruff/issues/23599">#23599</a>)</li> <li><a href="https://github.com/astral-sh/ruff/commit/e73d952e43feb51356ee740c5a973fce81396ff6"><code>e73d952</code></a> [ty] Include inferred type in <code>invalid-key</code> concise diagnostic for union/inte...</li> <li><a href="https://github.com/astral-sh/ruff/commit/80feb29b31cd98c093316df2e0407b0c70c01b55"><code>80feb29</code></a> [ty] report only dead annotation-only locals as unused (<a href="https://redirect.github.com/astral-sh/ruff/issues/24811">#24811</a>)</li> <li><a href="https://github.com/astral-sh/ruff/commit/0fbf2bc27336a3d17d39af52cf89b78dcda8c7c8"><code>0fbf2bc</code></a> Drop deprecated license classifier (<a href="https://redirect.github.com/astral-sh/ruff/issues/24808">#24808</a>)</li> <li><a href="https://github.com/astral-sh/ruff/commit/43b174cc7f2fcb0080bb1d4843cd4bf6b72bbe27"><code>43b174c</code></a> [ty] Infer lambda parameter types with <code>Callable</code> type context (<a href="https://redirect.github.com/astral-sh/ruff/issues/24317">#24317</a>)</li> <li><a href="https://github.com/astral-sh/ruff/commit/4f449ae4a2377569330a5ab94799d389357b5a3f"><code>4f449ae</code></a> [ty] Add error context for intersection types (<a href="https://redirect.github.com/astral-sh/ruff/issues/24772">#24772</a>)</li> <li><a href="https://github.com/astral-sh/ruff/commit/5b4e753acb46e96ad408e4904c15308e33efe307"><code>5b4e753</code></a> [ty] Add support for goto in literal enum member inlay hint (<a href="https://redirect.github.com/astral-sh/ruff/issues/24792">#24792</a>)</li> <li><a href="https://github.com/astral-sh/ruff/commit/e7cc76275a758ce1c636ea1c2d091fd576aac794"><code>e7cc762</code></a> [ty] Add error context for TypedDict assignments (<a href="https://redirect.github.com/astral-sh/ruff/issues/24790">#24790</a>)</li> <li>Additional commits viewable in <a href="https://github.com/astral-sh/ruff/compare/0.15.7...0.15.12">compare view</a></li> </ul> </details> <br /> Updates `types-requests` from 2.32.4.20260324 to 2.33.0.20260408 <details> <summary>Commits</summary> <ul> <li>See full diff in <a href="https://github.com/python/typeshed/commits">compare view</a></li> </ul> </details> <br /> Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> |
||
|
|
67cd5b7718 |
chore(deps): bump notebook from 7.5.2 to 7.5.6 in /libs/langgraph (#7657)
Bumps [notebook](https://github.com/jupyter/notebook) from 7.5.2 to 7.5.6. <details> <summary>Release notes</summary> <p><em>Sourced from <a href="https://github.com/jupyter/notebook/releases">notebook's releases</a>.</em></p> <blockquote> <h2>v7.5.6</h2> <h2>7.5.6</h2> <p>(<a href="https://github.com/jupyter/notebook/compare/@jupyter-notebook/application-extension@7.5.5...2e642f0cb10be314ba5d97d709cffe41bf992d9e">Full Changelog</a>)</p> <h3>Security patches</h3> <ul> <li>CVE-2026-42557 <a href="https://github.com/jupyterlab/jupyterlab/security/advisories/GHSA-mqcg-5x36-vfcg">https://github.com/jupyterlab/jupyterlab/security/advisories/GHSA-mqcg-5x36-vfcg</a></li> <li>CVE-2026-40171 <a href="https://github.com/jupyter/notebook/security/advisories/GHSA-rch3-82jr-f9w9">https://github.com/jupyter/notebook/security/advisories/GHSA-rch3-82jr-f9w9</a></li> </ul> <h3>Maintenance and upkeep improvements</h3> <ul> <li>Update to JupyterLab v4.5.7 <a href="https://redirect.github.com/jupyter/notebook/pull/7902">#7902</a> (<a href="https://github.com/jtpio"><code>@jtpio</code></a>)</li> </ul> <h3>Documentation improvements</h3> <ul> <li>docs: Fix broken links in troubleshooting and migration docs <a href="https://redirect.github.com/jupyter/notebook/pull/7824">#7824</a> (<a href="https://github.com/RamiNoodle733"><code>@RamiNoodle733</code></a>)</li> </ul> <h3>Contributors to this release</h3> <p>The following people contributed discussions, new ideas, code and documentation contributions, and review. See <a href="https://github-activity.readthedocs.io/en/latest/use/#how-does-this-tool-define-contributions-in-the-reports">our definition of contributors</a>.</p> <p>(<a href="https://github.com/jupyter/notebook/graphs/contributors?from=2026-03-11&to=2026-04-30&type=c">GitHub contributors page for this release</a>)</p> <p><a href="https://github.com/jtpio"><code>@jtpio</code></a> (<a href="https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3Ajtpio+updated%3A2026-03-11..2026-04-30&type=Issues">activity</a>) | <a href="https://github.com/RamiNoodle733"><code>@RamiNoodle733</code></a> (<a href="https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3ARamiNoodle733+updated%3A2026-03-11..2026-04-30&type=Issues">activity</a>)</p> <h2>v7.5.5</h2> <h2>7.5.5</h2> <p>(<a href="https://github.com/jupyter/notebook/compare/@jupyter-notebook/application-extension@7.5.4...4f8438b0c67dc4f010bf8cd052da4f16e2ed3828">Full Changelog</a>)</p> <h3>Maintenance and upkeep improvements</h3> <ul> <li>Update to JupyterLab v4.5.6 <a href="https://redirect.github.com/jupyter/notebook/pull/7861">#7861</a> (<a href="https://github.com/jtpio"><code>@jtpio</code></a>)</li> <li>[7.5.x] Drop Python 3.9 on CI <a href="https://redirect.github.com/jupyter/notebook/pull/7860">#7860</a> (<a href="https://github.com/jtpio"><code>@jtpio</code></a>)</li> <li>Fix check links <a href="https://redirect.github.com/jupyter/notebook/pull/7857">#7857</a> (<a href="https://github.com/jtpio"><code>@jtpio</code></a>)</li> </ul> <h3>Contributors to this release</h3> <p>The following people contributed discussions, new ideas, code and documentation contributions, and review. See <a href="https://github-activity.readthedocs.io/en/latest/use/#how-does-this-tool-define-contributions-in-the-reports">our definition of contributors</a>.</p> <p>(<a href="https://github.com/jupyter/notebook/graphs/contributors?from=2026-02-24&to=2026-03-11&type=c">GitHub contributors page for this release</a>)</p> <p><a href="https://github.com/jtpio"><code>@jtpio</code></a> (<a href="https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3Ajtpio+updated%3A2026-02-24..2026-03-11&type=Issues">activity</a>)</p> <!-- raw HTML omitted --> </blockquote> <p>... (truncated)</p> </details> <details> <summary>Changelog</summary> <p><em>Sourced from <a href="https://github.com/jupyter/notebook/blob/@jupyter-notebook/tree@7.5.6/CHANGELOG.md">notebook's changelog</a>.</em></p> <blockquote> <h2>7.5.6</h2> <p>(<a href="https://github.com/jupyter/notebook/compare/@jupyter-notebook/application-extension@7.5.5...2e642f0cb10be314ba5d97d709cffe41bf992d9e">Full Changelog</a>)</p> <h3>Maintenance and upkeep improvements</h3> <ul> <li>Update to JupyterLab v4.5.7 <a href="https://redirect.github.com/jupyter/notebook/pull/7902">#7902</a> (<a href="https://github.com/jtpio"><code>@jtpio</code></a>)</li> </ul> <h3>Documentation improvements</h3> <ul> <li>docs: Fix broken links in troubleshooting and migration docs <a href="https://redirect.github.com/jupyter/notebook/pull/7824">#7824</a> (<a href="https://github.com/RamiNoodle733"><code>@RamiNoodle733</code></a>)</li> </ul> <h3>Contributors to this release</h3> <p>The following people contributed discussions, new ideas, code and documentation contributions, and review. See <a href="https://github-activity.readthedocs.io/en/latest/use/#how-does-this-tool-define-contributions-in-the-reports">our definition of contributors</a>.</p> <p>(<a href="https://github.com/jupyter/notebook/graphs/contributors?from=2026-03-11&to=2026-04-30&type=c">GitHub contributors page for this release</a>)</p> <p><a href="https://github.com/jtpio"><code>@jtpio</code></a> (<a href="https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3Ajtpio+updated%3A2026-03-11..2026-04-30&type=Issues">activity</a>) | <a href="https://github.com/RamiNoodle733"><code>@RamiNoodle733</code></a> (<a href="https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3ARamiNoodle733+updated%3A2026-03-11..2026-04-30&type=Issues">activity</a>)</p> <!-- raw HTML omitted --> <h2>7.5.5</h2> <p>(<a href="https://github.com/jupyter/notebook/compare/@jupyter-notebook/application-extension@7.5.4...4f8438b0c67dc4f010bf8cd052da4f16e2ed3828">Full Changelog</a>)</p> <h3>Maintenance and upkeep improvements</h3> <ul> <li>Update to JupyterLab v4.5.6 <a href="https://redirect.github.com/jupyter/notebook/pull/7861">#7861</a> (<a href="https://github.com/jtpio"><code>@jtpio</code></a>)</li> <li>[7.5.x] Drop Python 3.9 on CI <a href="https://redirect.github.com/jupyter/notebook/pull/7860">#7860</a> (<a href="https://github.com/jtpio"><code>@jtpio</code></a>)</li> <li>Fix check links <a href="https://redirect.github.com/jupyter/notebook/pull/7857">#7857</a> (<a href="https://github.com/jtpio"><code>@jtpio</code></a>)</li> </ul> <h3>Contributors to this release</h3> <p>The following people contributed discussions, new ideas, code and documentation contributions, and review. See <a href="https://github-activity.readthedocs.io/en/latest/use/#how-does-this-tool-define-contributions-in-the-reports">our definition of contributors</a>.</p> <p>(<a href="https://github.com/jupyter/notebook/graphs/contributors?from=2026-02-24&to=2026-03-11&type=c">GitHub contributors page for this release</a>)</p> <p><a href="https://github.com/jtpio"><code>@jtpio</code></a> (<a href="https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3Ajtpio+updated%3A2026-02-24..2026-03-11&type=Issues">activity</a>)</p> <h2>7.5.4</h2> <p>(<a href="https://github.com/jupyter/notebook/compare/@jupyter-notebook/application-extension@7.5.3...e5d8418b706fcefd4208bb61c22399dd3123555b">Full Changelog</a>)</p> <h3>Maintenance and upkeep improvements</h3> <ul> <li>Update to JupyterLab v4.5.5 <a href="https://redirect.github.com/jupyter/notebook/pull/7842">#7842</a> (<a href="https://github.com/jtpio"><code>@jtpio</code></a>)</li> <li>Fix PyO3 CI failure with Python 3.15 <a href="https://redirect.github.com/jupyter/notebook/pull/7836">#7836</a> (<a href="https://github.com/jtpio"><code>@jtpio</code></a>)</li> </ul> <!-- raw HTML omitted --> </blockquote> <p>... (truncated)</p> </details> <details> <summary>Commits</summary> <ul> <li><a href="https://github.com/jupyter/notebook/commit/1ab2d2b99261996e94069ca53dd3d74b8b2ee1ba"><code>1ab2d2b</code></a> Publish 7.5.6</li> <li><a href="https://github.com/jupyter/notebook/commit/50e5222c9670121c3369900c7dce01aae53823fc"><code>50e5222</code></a> Merge commit from fork</li> <li><a href="https://github.com/jupyter/notebook/commit/2e642f0cb10be314ba5d97d709cffe41bf992d9e"><code>2e642f0</code></a> Update to JupyterLab v4.5.7 (<a href="https://redirect.github.com/jupyter/notebook/issues/7902">#7902</a>)</li> <li><a href="https://github.com/jupyter/notebook/commit/4b93f98b5a6e57027a2e1d58694b56e2ebd793a3"><code>4b93f98</code></a> Backport PR <a href="https://redirect.github.com/jupyter/notebook/issues/7824">#7824</a>: docs: Fix broken links in troubleshooting and migration do...</li> <li><a href="https://github.com/jupyter/notebook/commit/9a2c88fe646bac05b39dbe53e3e0ce95cafee016"><code>9a2c88f</code></a> Publish 7.5.5</li> <li><a href="https://github.com/jupyter/notebook/commit/4f8438b0c67dc4f010bf8cd052da4f16e2ed3828"><code>4f8438b</code></a> Update to JupyterLab v4.5.6 (<a href="https://redirect.github.com/jupyter/notebook/issues/7861">#7861</a>)</li> <li><a href="https://github.com/jupyter/notebook/commit/f78fcfada85f9e4b46003bc1b831c83e6f4c30b3"><code>f78fcfa</code></a> Backport PR <a href="https://redirect.github.com/jupyter/notebook/issues/7857">#7857</a>: Fix check links (<a href="https://redirect.github.com/jupyter/notebook/issues/7858">#7858</a>)</li> <li><a href="https://github.com/jupyter/notebook/commit/9e4cf2a44594e650e1ae3da49f81ae420135f32f"><code>9e4cf2a</code></a> [7.5.x] Drop Python 3.9 on CI (<a href="https://redirect.github.com/jupyter/notebook/issues/7860">#7860</a>)</li> <li><a href="https://github.com/jupyter/notebook/commit/ecc3aaf1bbf8f9cbec9c5d85df79db0f62b6d1e6"><code>ecc3aaf</code></a> Publish 7.5.4</li> <li><a href="https://github.com/jupyter/notebook/commit/e5d8418b706fcefd4208bb61c22399dd3123555b"><code>e5d8418</code></a> Update to JupyterLab v4.5.5 (<a href="https://redirect.github.com/jupyter/notebook/issues/7842">#7842</a>)</li> <li>Additional commits viewable in <a href="https://github.com/jupyter/notebook/compare/@jupyter-notebook/tree@7.5.2...@jupyter-notebook/tree@7.5.6">compare view</a></li> </ul> </details> <br /> [](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) --- <details> <summary>Dependabot commands and options</summary> <br /> You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot show <dependency name> ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself) You can disable automated security fix PRs for this repo from the [Security Alerts page](https://github.com/langchain-ai/langgraph/network/alerts). </details> Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> |