Commit Graph
11 Commits
Author SHA1 Message Date
Elior Nataf Lackritz e901fc1746 fix(sdk-py): restart the lifecycle watcher when run.start creates the thread
An explicit thread_id can name a thread that run.start is about to create.
Under custom auth its lifecycle stream gets a 404 first, which stopped the
watcher for good, so thread.output raised that 404 after a successful run.
run.start now starts a fresh watcher and run result when the watcher has
stopped, and a 404 on a stream opened before run.start gets one more try
once a run has started.

Also reports the last error frame when lifecycle reconnects run out, and
checks the stream error types with isinstance instead of getattr.
2026-10-16 13:37:35 -04:00
Elior Nataf Lackritz 6181497340 fix(sdk-py): surface thread stream errors and stop retrying a rejected stream
A thread stream's unsolicited error frame (`{"type": "error", "id": null}`)
was dropped, so `thread.output` failed with a generic "lifecycle stream
ended before terminal event" error, and the sync client's `thread.output`
blocked forever on the same clean close. The lifecycle watcher now fails
the run with the frame's error on both clients, and the shared stream logs
it instead of dropping it.

A 4xx other than 408 and 429, as an HTTP status or as a WebSocket close
code of 4000 plus the status, now ends the stream at once with that error
instead of being retried. A WebSocket closed this way after a successful
connect no longer reconnects forever.

The lifecycle watcher for a minted thread_id now starts after run.start
creates the thread, so under custom auth it no longer opens a stream for a
thread that doesn't exist yet. The sync client starts it under a lock,
since run.start can be called from several threads. Also drops a dead
duplicate of SyncStreamController._reconnect_shared_stream.
2026-10-14 19:48:49 -04:00
Elior Nataf LackritzandGitHub a0053bb616 fix(sdk-py): end a thread stream's run only on a root lifecycle event (#9228)
The thread stream's lifecycle watcher ended the run on any `completed`
or `failed` lifecycle event, including the one a subgraph sends when it
finishes. So `thread.output` could read the thread state before the
parent stored the step that ran the subgraph, and a run that failed
after a subgraph completed was reported as completed. The async and sync
watchers now end the run only on a root event, with the
`_is_root_terminal_lifecycle` check the fanout already uses. The JS SDK
checks the root namespace here too.

This is the `sdk-py integration` flake where the final `items` comes
back as `['streamed', 'tool', 'asked']` without `'sub'`: the example
graph's last node runs a subgraph.

## Tests

New async and sync tests send a subgraph `completed` and then a root
`failed`. Without the fix the run ends as completed. `make lint` and
`make test` in `libs/sdk-py` pass.
2026-10-07 19:03:46 -04:00
dependabot[bot]GitHubdependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>John Kennedyopen-swe[bot] <open-swe@users.noreply.github.com>
c0a13bb22d chore(deps): bump the minor-and-patch group across 1 directory with 7 updates (#8779)
Bumps the minor-and-patch group with 7 updates in the /libs/sdk-py
directory:

| Package | From | To |
| --- | --- | --- |
| [orjson](https://github.com/ijl/orjson) | `3.11.9` | `3.12.0` |
| [langchain-protocol](https://github.com/langchain-ai/agent-protocol) |
`0.0.18` | `0.0.19` |
| [langchain-core](https://github.com/langchain-ai/langchain) | `1.5.3`
| `1.6.1` |
| [ruff](https://github.com/astral-sh/ruff) | `0.16.1` | `0.16.5` |
| [ty](https://github.com/astral-sh/ty) | `0.0.66` | `0.0.75` |
| [starlette](https://github.com/Kludex/starlette) | `1.3.1` | `1.6.0` |
| [pydantic](https://github.com/pydantic/pydantic) | `2.13.4` | `2.13.5`
|


Updates `orjson` from 3.11.9 to 3.12.0
<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.12.0</h2>
<h3>Changed</h3>
<ul>
<li>Serialization implementation substantially rewritten.</li>
<li>Publish PyPI wheels for Python 3.15. For Python 3.15 and later,
<code>manylinux_2_39</code> (2024) is targeted instead of
<code>manylinux_2_17</code> (2012).</li>
<li>No longer publish PyPI wheels for ppc64le and s390x.</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.12.0 - 2026-08-14</h2>
<h3>Changed</h3>
<ul>
<li>Serialization implementation substantially rewritten.</li>
<li>Publish PyPI wheels for Python 3.15. For Python 3.15 and later,
<code>manylinux_2_39</code> (2024) is targeted instead of
<code>manylinux_2_17</code> (2012).</li>
<li>No longer publish PyPI wheels for ppc64le and s390x.</li>
</ul>
</blockquote>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="https://github.com/ijl/orjson/commit/6737895a1a4e3e26df0569a40147893a786f9a58"><code>6737895</code></a>
3.12.0</li>
<li><a
href="https://github.com/ijl/orjson/commit/c2a6e8ff7b898635fb68a85bd5a62df1edf61cfc"><code>c2a6e8f</code></a>
JsonWriter, iterators</li>
<li><a
href="https://github.com/ijl/orjson/commit/6a2d7a7d66dc3c5698625a7b334c40db459e46ae"><code>6a2d7a7</code></a>
yyjson 1ea2fb0</li>
<li><a
href="https://github.com/ijl/orjson/commit/97bf170d9726e91c891f35eae4892801520b9dce"><code>97bf170</code></a>
build update</li>
<li>See full diff in <a
href="https://github.com/ijl/orjson/compare/3.11.9...3.12.0">compare
view</a></li>
</ul>
</details>
<br />

Updates `langchain-protocol` from 0.0.18 to 0.0.19
<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.19</h2>
<h2>What's Changed</h2>
<ul>
<li>fix(tooling): resolve datamodel-code-generator alerts by <a
href="https://github.com/jkennedyvz"><code>@​jkennedyvz</code></a> in <a
href="https://redirect.github.com/langchain-ai/agent-protocol/pull/93">langchain-ai/agent-protocol#93</a></li>
<li>feat: add LangSmith routing to run start by <a
href="https://github.com/mdrxy"><code>@​mdrxy</code></a> in <a
href="https://redirect.github.com/langchain-ai/agent-protocol/pull/95">langchain-ai/agent-protocol#95</a></li>
<li>release: v0.19.0 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/96">langchain-ai/agent-protocol#96</a></li>
<li>fix(py): pin hatchling to avoid metadata 2.5 publish failure 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/97">langchain-ai/agent-protocol#97</a></li>
</ul>
<p><strong>Full Changelog</strong>: <a
href="https://github.com/langchain-ai/agent-protocol/compare/langchain-protocol==0.0.18...langchain-protocol==0.0.19">https://github.com/langchain-ai/agent-protocol/compare/langchain-protocol==0.0.18...langchain-protocol==0.0.19</a></p>
</blockquote>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="https://github.com/langchain-ai/agent-protocol/commit/59c02be488eb7adb98ae3450983fff293294e67a"><code>59c02be</code></a>
fix(py): pin hatchling to avoid metadata 2.5 publish failure (<a
href="https://redirect.github.com/langchain-ai/agent-protocol/issues/97">#97</a>)</li>
<li><a
href="https://github.com/langchain-ai/agent-protocol/commit/c59077b743fd3dd0b86f048a2b59128de413663d"><code>c59077b</code></a>
release: v0.19.0 (<a
href="https://redirect.github.com/langchain-ai/agent-protocol/issues/96">#96</a>)</li>
<li><a
href="https://github.com/langchain-ai/agent-protocol/commit/870ef9560fab320236d6e24770e8950c5a9be63d"><code>870ef95</code></a>
Merge pull request <a
href="https://redirect.github.com/langchain-ai/agent-protocol/issues/95">#95</a>
from langchain-ai/open-swe/v3-replica-routing</li>
<li><a
href="https://github.com/langchain-ai/agent-protocol/commit/175a1b8f2ac974e9b5097de90a51f1bc7ade73e0"><code>175a1b8</code></a>
feat(protocol): add LangSmith routing to run start</li>
<li><a
href="https://github.com/langchain-ai/agent-protocol/commit/d9fd23d762bf4cffe876890a854fb79bcdd14f1a"><code>d9fd23d</code></a>
Merge pull request <a
href="https://redirect.github.com/langchain-ai/agent-protocol/issues/93">#93</a>
from langchain-ai/langster/fix-datamodel-code-generato...</li>
<li><a
href="https://github.com/langchain-ai/agent-protocol/commit/9476948ab0ce1027131b58b9813f6bd3ba238ef8"><code>9476948</code></a>
fix(tooling): update code generator dependencies</li>
<li>See full diff in <a
href="https://github.com/langchain-ai/agent-protocol/compare/langchain-protocol==0.0.18...langchain-protocol==0.0.19">compare
view</a></li>
</ul>
</details>
<br />

Updates `langchain-core` from 1.5.3 to 1.6.1
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/langchain-ai/langchain/releases">langchain-core's
releases</a>.</em></p>
<blockquote>
<h2>langchain-core==1.6.1</h2>
<p>Changes since langchain-core==1.6.0</p>
<p>revert: release(core): 1.6.2 (<a
href="https://redirect.github.com/langchain-ai/langchain/issues/39971">#39971</a>)
release(core): 1.6.2 (<a
href="https://redirect.github.com/langchain-ai/langchain/issues/39967">#39967</a>)
fix(core): shore up indexing in genai v1 streaming content (<a
href="https://redirect.github.com/langchain-ai/langchain/issues/39964">#39964</a>)
fix(core): make <code>StructuredTool</code> JSON-serializable (<a
href="https://redirect.github.com/langchain-ai/langchain/issues/39631">#39631</a>)
chore(deps): bump minor and patch dependencies (<a
href="https://redirect.github.com/langchain-ai/langchain/issues/39869">#39869</a>)
release(core): 1.6.1 (<a
href="https://redirect.github.com/langchain-ai/langchain/issues/39832">#39832</a>)
feat(core): propagate gateway information on error path (<a
href="https://redirect.github.com/langchain-ai/langchain/issues/39829">#39829</a>)</p>
<h2>langchain-core==1.6.0</h2>
<p>Changes since langchain-core==1.5.6</p>
<p>release(core): 1.6.0 (<a
href="https://redirect.github.com/langchain-ai/langchain/issues/39760">#39760</a>)
fix(core): resolve postponed annotations in
<code>StructuredTool._injected_args_keys</code> (<a
href="https://redirect.github.com/langchain-ai/langchain/issues/39602">#39602</a>)
feat(core): add standard model exception types (<a
href="https://redirect.github.com/langchain-ai/langchain/issues/39538">#39538</a>)
fix(core): allow deserializing <code>RunnablePick</code> (<a
href="https://redirect.github.com/langchain-ai/langchain/issues/39753">#39753</a>)
fix(core): make <code>convert_to_openai_function</code> handle callables
and non-dict mappings (<a
href="https://redirect.github.com/langchain-ai/langchain/issues/39750">#39750</a>)
fix(core): make subprocess and temporary file tests portable on Windows
(<a
href="https://redirect.github.com/langchain-ai/langchain/issues/39664">#39664</a>)
fix(core): fail fast when tool schemas can't resolve forward refs during
serialization (<a
href="https://redirect.github.com/langchain-ai/langchain/issues/39570">#39570</a>)
test(core): avoid version-dependent runnable snapshots (<a
href="https://redirect.github.com/langchain-ai/langchain/issues/39705">#39705</a>)
fix(core): require all nested properties for strict tool schemas (<a
href="https://redirect.github.com/langchain-ai/langchain/issues/39306">#39306</a>)
fix(core): remove stale sync-stream <code>xfail</code> [closes <a
href="https://redirect.github.com/langchain-ai/langchain/issues/39720">#39720</a>]
(<a
href="https://redirect.github.com/langchain-ai/langchain/issues/39723">#39723</a>)
perf(core): Lazily import transformers (<a
href="https://redirect.github.com/langchain-ai/langchain/issues/38037">#38037</a>)
fix(core): accept non-dict Mapping values in mustache templates (<a
href="https://redirect.github.com/langchain-ai/langchain/issues/39680">#39680</a>)
docs(core): clarify <code>Runnable</code> pipe coercion [closes <a
href="https://redirect.github.com/langchain-ai/langchain/issues/39075">#39075</a>]
(<a
href="https://redirect.github.com/langchain-ai/langchain/issues/39707">#39707</a>)
fix(core): finalize chain-group runs on <code>BaseException</code> (<a
href="https://redirect.github.com/langchain-ai/langchain/issues/39699">#39699</a>)</p>
<h2>langchain-core==1.5.6</h2>
<p>Changes since langchain-core==1.5.5</p>
<p>chore(core): release 1.5.6 (<a
href="https://redirect.github.com/langchain-ai/langchain/issues/39704">#39704</a>)
feat(core): incorporate gateway metadata to traces (<a
href="https://redirect.github.com/langchain-ai/langchain/issues/39703">#39703</a>)</p>
<h2>langchain-core==1.5.5</h2>
<p>Changes since langchain-core==1.5.4</p>
<p>release(core): 1.5.5 (<a
href="https://redirect.github.com/langchain-ai/langchain/issues/39655">#39655</a>)
fix(core): make abatch_iterate consistent with batch_iterate for None
and zero size (<a
href="https://redirect.github.com/langchain-ai/langchain/issues/39367">#39367</a>)
fix(core): respect pydantic aliases when validating tool inputs (<a
href="https://redirect.github.com/langchain-ai/langchain/issues/39572">#39572</a>)
fix(core): issues in merging chunks (<a
href="https://redirect.github.com/langchain-ai/langchain/issues/39535">#39535</a>)
fix(core): handle v1 base model validation in async path (<a
href="https://redirect.github.com/langchain-ai/langchain/issues/39576">#39576</a>)
fix(core): handle tool descriptions for infer_schema=False (<a
href="https://redirect.github.com/langchain-ai/langchain/issues/39573">#39573</a>)
fix(core): clear usage metadata callback on exceptions in context
manager (<a
href="https://redirect.github.com/langchain-ai/langchain/issues/39616">#39616</a>)
fix(core): handle falsy LLM and chat model caches (<a
href="https://redirect.github.com/langchain-ai/langchain/issues/39283">#39283</a>)
chore(core): add httpx as an explicit dep (<a
href="https://redirect.github.com/langchain-ai/langchain/issues/39612">#39612</a>)
fix(core): preserve non-str/non-dict items in
<code>DictPromptTemplate</code> list values (<a
href="https://redirect.github.com/langchain-ai/langchain/issues/39588">#39588</a>)
fix(core): raise ValueError when explicit tool_outputs length mismatches
tool_calls in tool_example_to_messages (<a
href="https://redirect.github.com/langchain-ai/langchain/issues/39142">#39142</a>)
fix(core): guard malformed Anthropic content blocks (<a
href="https://redirect.github.com/langchain-ai/langchain/issues/38670">#38670</a>)</p>
<!-- raw HTML omitted -->
</blockquote>
<p>... (truncated)</p>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="https://github.com/langchain-ai/langchain/commit/4fe9d3062f4b68e2e472eb92decf369c93aebb46"><code>4fe9d30</code></a>
chore(openai): fix tests (<a
href="https://redirect.github.com/langchain-ai/langchain/issues/39972">#39972</a>)</li>
<li><a
href="https://github.com/langchain-ai/langchain/commit/8fa38dc143faecec0287395bce4484af4b82254c"><code>8fa38dc</code></a>
revert: release(core): 1.6.2 (<a
href="https://redirect.github.com/langchain-ai/langchain/issues/39971">#39971</a>)</li>
<li><a
href="https://github.com/langchain-ai/langchain/commit/122030d79e944a5b55c33847d29bcfbe64488372"><code>122030d</code></a>
release(core): 1.6.2 (<a
href="https://redirect.github.com/langchain-ai/langchain/issues/39967">#39967</a>)</li>
<li><a
href="https://github.com/langchain-ai/langchain/commit/7d4b42b57235020e6f496fdfebab44c3ca1b1f5b"><code>7d4b42b</code></a>
release(langchain): 1.3.18 (<a
href="https://redirect.github.com/langchain-ai/langchain/issues/39966">#39966</a>)</li>
<li><a
href="https://github.com/langchain-ai/langchain/commit/4a66e355da07b8fad7d6cb8db99287fb4d7e6d83"><code>4a66e35</code></a>
fix(langchain): preserve content-block shape in PIIMiddleware redaction
(<a
href="https://redirect.github.com/langchain-ai/langchain/issues/39894">#39894</a>)</li>
<li><a
href="https://github.com/langchain-ai/langchain/commit/38e211359f0b65b480d9ee4c53f2385f8c249bb3"><code>38e2113</code></a>
fix(core): shore up indexing in genai v1 streaming content (<a
href="https://redirect.github.com/langchain-ai/langchain/issues/39964">#39964</a>)</li>
<li><a
href="https://github.com/langchain-ai/langchain/commit/13b1b2feae476fdcebc0a285a723d5cbfed9df2e"><code>13b1b2f</code></a>
fix(core): make <code>StructuredTool</code> JSON-serializable (<a
href="https://redirect.github.com/langchain-ai/langchain/issues/39631">#39631</a>)</li>
<li><a
href="https://github.com/langchain-ai/langchain/commit/3b3b308e6d956c9a670e41e66a468466fe6f8c26"><code>3b3b308</code></a>
release(anthropic): 1.7.0 (<a
href="https://redirect.github.com/langchain-ai/langchain/issues/39963">#39963</a>)</li>
<li><a
href="https://github.com/langchain-ai/langchain/commit/e3f6adfe1976a773704a20fef7bb03ac0309e0e4"><code>e3f6adf</code></a>
feat(anthropic): support top-level param for skills via
<code>container</code>; `updates...</li>
<li><a
href="https://github.com/langchain-ai/langchain/commit/c253f54b905f9648c50b723f01945f39a256d8aa"><code>c253f54</code></a>
fix(openai): correct <code>reasoning_effort_levels</code> for gpt-5 and
gpt-5.1 profiles...</li>
<li>Additional commits viewable in <a
href="https://github.com/langchain-ai/langchain/compare/langchain-core==1.5.3...langchain-core==1.6.1">compare
view</a></li>
</ul>
</details>
<br />

Updates `ruff` from 0.16.1 to 0.16.5
<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.16.5</h2>
<h2>Release Notes</h2>
<p>Released on 2026-08-27.</p>
<h3>Preview features</h3>
<ul>
<li>Allow rules without codes (<a
href="https://redirect.github.com/astral-sh/ruff/pull/28049">#28049</a>)</li>
<li>Introduce category selectors (<a
href="https://redirect.github.com/astral-sh/ruff/pull/27666">#27666</a>)</li>
<li>Update preview default rules and categories (<a
href="https://redirect.github.com/astral-sh/ruff/pull/27877">#27877</a>)</li>
</ul>
<h3>Bug fixes</h3>
<ul>
<li>[<code>flake8-async</code>] Detect blocking generic HTTP requests
(<code>ASYNC210</code>) (<a
href="https://redirect.github.com/astral-sh/ruff/pull/28024">#28024</a>)</li>
<li>[<code>flake8-datetimez</code>] Allow timezone-safe
<code>strptime</code> chains (<code>DTZ007</code>) (<a
href="https://redirect.github.com/astral-sh/ruff/pull/28023">#28023</a>)</li>
<li>[<code>flake8-simplify</code>] Respect side effects in
<code>lambda</code> defaults (<code>SIM401</code>) (<a
href="https://redirect.github.com/astral-sh/ruff/pull/28000">#28000</a>)</li>
</ul>
<h3>Server</h3>
<ul>
<li>Fix duplicated &quot;of&quot; in <code>ClientOptions</code> doc
comment (<a
href="https://redirect.github.com/astral-sh/ruff/pull/27978">#27978</a>)</li>
</ul>
<h3>Documentation</h3>
<ul>
<li>Document rule acceptance guidelines (<a
href="https://redirect.github.com/astral-sh/ruff/pull/27910">#27910</a>)</li>
<li>Document the new category selectors (<a
href="https://redirect.github.com/astral-sh/ruff/pull/27906">#27906</a>)</li>
</ul>
<h3>Contributors</h3>
<ul>
<li><a
href="https://github.com/AlexWaygood"><code>@​AlexWaygood</code></a></li>
<li><a href="https://github.com/sharkdp"><code>@​sharkdp</code></a></li>
<li><a
href="https://github.com/jelle-openai"><code>@​jelle-openai</code></a></li>
<li><a
href="https://github.com/charliermarsh"><code>@​charliermarsh</code></a></li>
<li><a href="https://github.com/ntBre"><code>@​ntBre</code></a></li>
<li><a
href="https://github.com/aarushkandukoori"><code>@​aarushkandukoori</code></a></li>
</ul>
<h2>Install ruff 0.16.5</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.16.5/ruff-installer.sh
| sh
</code></pre>
<h3>Install prebuilt binaries via powershell script</h3>
<pre lang="sh"><code>powershell -ExecutionPolicy Bypass -c &quot;irm
https://releases.astral.sh/github/ruff/releases/download/0.16.5/ruff-installer.ps1
| iex&quot;
</code></pre>
<h2>Download ruff 0.16.5</h2>
<!-- 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.16.5</h2>
<p>Released on 2026-08-27.</p>
<h3>Preview features</h3>
<ul>
<li>Allow rules without codes (<a
href="https://redirect.github.com/astral-sh/ruff/pull/28049">#28049</a>)</li>
<li>Introduce category selectors (<a
href="https://redirect.github.com/astral-sh/ruff/pull/27666">#27666</a>)</li>
<li>Update preview default rules and categories (<a
href="https://redirect.github.com/astral-sh/ruff/pull/27877">#27877</a>)</li>
</ul>
<h3>Bug fixes</h3>
<ul>
<li>[<code>flake8-async</code>] Detect blocking generic HTTP requests
(<code>ASYNC210</code>) (<a
href="https://redirect.github.com/astral-sh/ruff/pull/28024">#28024</a>)</li>
<li>[<code>flake8-datetimez</code>] Allow timezone-safe
<code>strptime</code> chains (<code>DTZ007</code>) (<a
href="https://redirect.github.com/astral-sh/ruff/pull/28023">#28023</a>)</li>
<li>[<code>flake8-simplify</code>] Respect side effects in
<code>lambda</code> defaults (<code>SIM401</code>) (<a
href="https://redirect.github.com/astral-sh/ruff/pull/28000">#28000</a>)</li>
</ul>
<h3>Server</h3>
<ul>
<li>Fix duplicated &quot;of&quot; in <code>ClientOptions</code> doc
comment (<a
href="https://redirect.github.com/astral-sh/ruff/pull/27978">#27978</a>)</li>
</ul>
<h3>Documentation</h3>
<ul>
<li>Document rule acceptance guidelines (<a
href="https://redirect.github.com/astral-sh/ruff/pull/27910">#27910</a>)</li>
<li>Document the new category selectors (<a
href="https://redirect.github.com/astral-sh/ruff/pull/27906">#27906</a>)</li>
</ul>
<h3>Contributors</h3>
<ul>
<li><a
href="https://github.com/AlexWaygood"><code>@​AlexWaygood</code></a></li>
<li><a href="https://github.com/sharkdp"><code>@​sharkdp</code></a></li>
<li><a
href="https://github.com/jelle-openai"><code>@​jelle-openai</code></a></li>
<li><a
href="https://github.com/charliermarsh"><code>@​charliermarsh</code></a></li>
<li><a href="https://github.com/ntBre"><code>@​ntBre</code></a></li>
<li><a
href="https://github.com/aarushkandukoori"><code>@​aarushkandukoori</code></a></li>
</ul>
<h2>0.16.4</h2>
<p>Released on 2026-08-20.</p>
<h3>Preview features</h3>
<ul>
<li>[<code>flake8-use-pathlib</code>] Add autofix for
<code>PTH116</code> (<a
href="https://redirect.github.com/astral-sh/ruff/pull/26460">#26460</a>)</li>
<li>[<code>refurb</code>] Restrict <code>delete-full-slice</code> to
lists (<code>FURB131</code>) (<a
href="https://redirect.github.com/astral-sh/ruff/pull/27711">#27711</a>)</li>
<li>[<code>refurb</code>] Skip <code>FURB101</code> and
<code>FURB103</code> when the <code>open</code> argument is a file
descriptor (<a
href="https://redirect.github.com/astral-sh/ruff/pull/27643">#27643</a>)</li>
</ul>
<h3>Bug fixes</h3>
<ul>
<li>Fix <code>InvalidInstruction</code> on Windows CPUs that do not
support <code>POPCNT</code> (<a
href="https://redirect.github.com/astral-sh/ruff/pull/27803">#27803</a>)</li>
<li>[<code>pyflakes</code>] Emit semantic syntax errors in string type
definitions as <code>F722</code> (<a
href="https://redirect.github.com/astral-sh/ruff/pull/27835">#27835</a>)</li>
<li>[<code>pylint</code>] Allow <code>os._exit</code> imports in
<code>import-private-name</code> (<code>PLC2701</code>) (<a
href="https://redirect.github.com/astral-sh/ruff/pull/27738">#27738</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/9e4938c4a60bed3e87a11ee1e1db1bd23f4d964a"><code>9e4938c</code></a>
Bump 0.16.5 (<a
href="https://redirect.github.com/astral-sh/ruff/issues/28110">#28110</a>)</li>
<li><a
href="https://github.com/astral-sh/ruff/commit/aad0e909ef1390f4b2a3ba8aa0a67fb8ea5cbacd"><code>aad0e90</code></a>
Allow rules without codes (<a
href="https://redirect.github.com/astral-sh/ruff/issues/28049">#28049</a>)</li>
<li><a
href="https://github.com/astral-sh/ruff/commit/5fdab73c5052350400c36b08c5d7710210343bc4"><code>5fdab73</code></a>
Update preview default rules and categories (<a
href="https://redirect.github.com/astral-sh/ruff/issues/27877">#27877</a>)</li>
<li><a
href="https://github.com/astral-sh/ruff/commit/29c8e5b2d0a46eb7dc4ff11c1b0a0dc5ccea52e4"><code>29c8e5b</code></a>
Document rule acceptance guidelines (<a
href="https://redirect.github.com/astral-sh/ruff/issues/27910">#27910</a>)</li>
<li><a
href="https://github.com/astral-sh/ruff/commit/50a4d7fd106603a5616b01ac3bef3306252b248f"><code>50a4d7f</code></a>
Document the new category selectors (<a
href="https://redirect.github.com/astral-sh/ruff/issues/27906">#27906</a>)</li>
<li><a
href="https://github.com/astral-sh/ruff/commit/ada87950ea188f882f69b7bd6e2213a9696e3ee2"><code>ada8795</code></a>
Introduce category selectors (<a
href="https://redirect.github.com/astral-sh/ruff/issues/27666">#27666</a>)</li>
<li><a
href="https://github.com/astral-sh/ruff/commit/d8947238863b61922bfc83f07edcc697c1cc07c0"><code>d894723</code></a>
[ty] Infer lambda parameters through callable type aliases (<a
href="https://redirect.github.com/astral-sh/ruff/issues/28109">#28109</a>)</li>
<li><a
href="https://github.com/astral-sh/ruff/commit/2685fdebbcf9938736fed8c45886a629f9c99a06"><code>2685fde</code></a>
[ty] Narrow functional enum members in <code>==</code> and
<code>match</code> (<a
href="https://redirect.github.com/astral-sh/ruff/issues/28103">#28103</a>)</li>
<li><a
href="https://github.com/astral-sh/ruff/commit/efcffd2178ce62e9951a53d4c50cadc225a0cfec"><code>efcffd2</code></a>
[ty] Intersection simplifications with subtype-related generic
specialization...</li>
<li><a
href="https://github.com/astral-sh/ruff/commit/eb780488037504e11f145ed778654fd8a825028b"><code>eb78048</code></a>
[ty] Bump ecosystem-analyzer for HTML escaping (<a
href="https://redirect.github.com/astral-sh/ruff/issues/28104">#28104</a>)</li>
<li>Additional commits viewable in <a
href="https://github.com/astral-sh/ruff/compare/0.16.1...0.16.5">compare
view</a></li>
</ul>
</details>
<br />

Updates `ty` from 0.0.66 to 0.0.75
<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.75</h2>
<h2>Release Notes</h2>
<p>Released on 2026-08-26.</p>
<h3>Preview features</h3>
<ul>
<li>Initialize PEP 723 script environments in the CLI (<a
href="https://redirect.github.com/astral-sh/ruff/pull/27544">#27544</a>)</li>
<li>Refresh PEP 723 script environments in watch mode (<a
href="https://redirect.github.com/astral-sh/ruff/pull/27617">#27617</a>)</li>
<li>Run PEP 723 script synchronization on bounded workers (<a
href="https://redirect.github.com/astral-sh/ruff/pull/27615">#27615</a>)</li>
</ul>
<h3>Bug fixes</h3>
<ul>
<li>Specialize <code>Self</code> bounds of inherited methods (<a
href="https://redirect.github.com/astral-sh/ruff/pull/27990">#27990</a>)</li>
</ul>
<h3>LSP server</h3>
<ul>
<li>Add &quot;Go to Definition&quot; support for pytest fixtures (<a
href="https://redirect.github.com/astral-sh/ruff/pull/27444">#27444</a>)</li>
</ul>
<h3>Documentation</h3>
<ul>
<li>Fix documented Python package build command (<a
href="https://redirect.github.com/astral-sh/ty/pull/4384">#4384</a>)</li>
<li>Link untyped-call tracking issue in migration guide (<a
href="https://redirect.github.com/astral-sh/ty/pull/4382">#4382</a>)</li>
</ul>
<h3>Library support</h3>
<ul>
<li>Resolve imported pytest fixture exposures (<a
href="https://redirect.github.com/astral-sh/ruff/pull/27539">#27539</a>)</li>
<li>Resolve installed core pytest fixture providers (<a
href="https://redirect.github.com/astral-sh/ruff/pull/27770">#27770</a>)</li>
<li>Resolve pytest fixtures through conftest (<a
href="https://redirect.github.com/astral-sh/ruff/pull/27540">#27540</a>)</li>
</ul>
<h3>Diagnostics</h3>
<ul>
<li>Add more autofixes (<a
href="https://redirect.github.com/astral-sh/ruff/pull/28029">#28029</a>)</li>
<li>Add a dedicated missing-slot diagnostic (<a
href="https://redirect.github.com/astral-sh/ruff/pull/28039">#28039</a>)</li>
<li>Explain missing storage for declared slotted attributes (<a
href="https://redirect.github.com/astral-sh/ruff/pull/27969">#27969</a>)</li>
<li>Improve diagnostic spans for unpacked variable assignments (<a
href="https://redirect.github.com/astral-sh/ruff/pull/28041">#28041</a>)</li>
</ul>
<h3>Core type checking</h3>
<ul>
<li>Account for known subclasses in equality inference (<a
href="https://redirect.github.com/astral-sh/ruff/pull/28005">#28005</a>)</li>
<li>Expand <code>ParamSpec</code> signatures inferred from bound
receivers (<a
href="https://redirect.github.com/astral-sh/ruff/pull/28020">#28020</a>)</li>
<li>Fix <code>Self</code> binding in <code>ParamSpec</code> protocols
(<a
href="https://redirect.github.com/astral-sh/ruff/pull/28016">#28016</a>)</li>
<li>Fix <code>TypedDict</code> variance inference (<a
href="https://redirect.github.com/astral-sh/ruff/pull/28052">#28052</a>)</li>
<li>Fix unsound narrowing through branch-assigned conditions (<a
href="https://redirect.github.com/astral-sh/ruff/pull/28006">#28006</a>)</li>
<li>Ignore inconsistent binding decorators on overloads (<a
href="https://redirect.github.com/astral-sh/ruff/pull/28036">#28036</a>)</li>
<li>Infer <code>yield from</code> send/return types from the iterator
returned by <code>__iter__</code> (<a
href="https://redirect.github.com/astral-sh/ruff/pull/27987">#27987</a>)</li>
<li>Infer tuple type parameters from union arguments (<a
href="https://redirect.github.com/astral-sh/ruff/pull/28062">#28062</a>)</li>
<li>Infer variance through nonrecursive protocol references (<a
href="https://redirect.github.com/astral-sh/ruff/pull/28065">#28065</a>)</li>
<li>Preserve bounds of non-literal metaclasses (<a
href="https://redirect.github.com/astral-sh/ruff/pull/28046">#28046</a>)</li>
<li>Preserve correlated generic-call inference (<a
href="https://redirect.github.com/astral-sh/ruff/pull/28043">#28043</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/ty/blob/main/CHANGELOG.md">ty's
changelog</a>.</em></p>
<blockquote>
<h2>0.0.75</h2>
<p>Released on 2026-08-26.</p>
<h3>Preview features</h3>
<ul>
<li>Initialize PEP 723 script environments in the CLI (<a
href="https://redirect.github.com/astral-sh/ruff/pull/27544">#27544</a>)</li>
<li>Refresh PEP 723 script environments in watch mode (<a
href="https://redirect.github.com/astral-sh/ruff/pull/27617">#27617</a>)</li>
<li>Run PEP 723 script synchronization on bounded workers (<a
href="https://redirect.github.com/astral-sh/ruff/pull/27615">#27615</a>)</li>
</ul>
<h3>Bug fixes</h3>
<ul>
<li>Specialize <code>Self</code> bounds of inherited methods (<a
href="https://redirect.github.com/astral-sh/ruff/pull/27990">#27990</a>)</li>
</ul>
<h3>LSP server</h3>
<ul>
<li>Add &quot;Go to Definition&quot; support for pytest fixtures (<a
href="https://redirect.github.com/astral-sh/ruff/pull/27444">#27444</a>)</li>
</ul>
<h3>Documentation</h3>
<ul>
<li>Fix documented Python package build command (<a
href="https://redirect.github.com/astral-sh/ty/pull/4384">#4384</a>)</li>
<li>Link untyped-call tracking issue in migration guide (<a
href="https://redirect.github.com/astral-sh/ty/pull/4382">#4382</a>)</li>
</ul>
<h3>Library support</h3>
<ul>
<li>Resolve imported pytest fixture exposures (<a
href="https://redirect.github.com/astral-sh/ruff/pull/27539">#27539</a>)</li>
<li>Resolve installed core pytest fixture providers (<a
href="https://redirect.github.com/astral-sh/ruff/pull/27770">#27770</a>)</li>
<li>Resolve pytest fixtures through conftest (<a
href="https://redirect.github.com/astral-sh/ruff/pull/27540">#27540</a>)</li>
</ul>
<h3>Diagnostics</h3>
<ul>
<li>Add more autofixes (<a
href="https://redirect.github.com/astral-sh/ruff/pull/28029">#28029</a>)</li>
<li>Add a dedicated missing-slot diagnostic (<a
href="https://redirect.github.com/astral-sh/ruff/pull/28039">#28039</a>)</li>
<li>Explain missing storage for declared slotted attributes (<a
href="https://redirect.github.com/astral-sh/ruff/pull/27969">#27969</a>)</li>
<li>Improve diagnostic spans for unpacked variable assignments (<a
href="https://redirect.github.com/astral-sh/ruff/pull/28041">#28041</a>)</li>
</ul>
<h3>Core type checking</h3>
<ul>
<li>Account for known subclasses in equality inference (<a
href="https://redirect.github.com/astral-sh/ruff/pull/28005">#28005</a>)</li>
<li>Expand <code>ParamSpec</code> signatures inferred from bound
receivers (<a
href="https://redirect.github.com/astral-sh/ruff/pull/28020">#28020</a>)</li>
<li>Fix <code>Self</code> binding in <code>ParamSpec</code> protocols
(<a
href="https://redirect.github.com/astral-sh/ruff/pull/28016">#28016</a>)</li>
<li>Fix <code>TypedDict</code> variance inference (<a
href="https://redirect.github.com/astral-sh/ruff/pull/28052">#28052</a>)</li>
<li>Fix unsound narrowing through branch-assigned conditions (<a
href="https://redirect.github.com/astral-sh/ruff/pull/28006">#28006</a>)</li>
<li>Ignore inconsistent binding decorators on overloads (<a
href="https://redirect.github.com/astral-sh/ruff/pull/28036">#28036</a>)</li>
<li>Infer <code>yield from</code> send/return types from the iterator
returned by <code>__iter__</code> (<a
href="https://redirect.github.com/astral-sh/ruff/pull/27987">#27987</a>)</li>
<li>Infer tuple type parameters from union arguments (<a
href="https://redirect.github.com/astral-sh/ruff/pull/28062">#28062</a>)</li>
<li>Infer variance through nonrecursive protocol references (<a
href="https://redirect.github.com/astral-sh/ruff/pull/28065">#28065</a>)</li>
<li>Preserve bounds of non-literal metaclasses (<a
href="https://redirect.github.com/astral-sh/ruff/pull/28046">#28046</a>)</li>
<li>Preserve correlated generic-call inference (<a
href="https://redirect.github.com/astral-sh/ruff/pull/28043">#28043</a>)</li>
<li>Preserve invariant materialization constraints (<a
href="https://redirect.github.com/astral-sh/ruff/pull/28047">#28047</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/a553dcc1a4c464b22d6fff8c46d444e326e0ae2d"><code>a553dcc</code></a>
Bump version to 0.0.75 (<a
href="https://redirect.github.com/astral-sh/ty/issues/4396">#4396</a>)</li>
<li><a
href="https://github.com/astral-sh/ty/commit/26b1b50998e92a5f50c342dc4a1fed84db2f8ee4"><code>26b1b50</code></a>
Update prek dependencies (<a
href="https://redirect.github.com/astral-sh/ty/issues/4392">#4392</a>)</li>
<li><a
href="https://github.com/astral-sh/ty/commit/73d226ee4d5a9274bc559c50a244159b61dfa315"><code>73d226e</code></a>
Fix documented Python package build command (<a
href="https://redirect.github.com/astral-sh/ty/issues/4384">#4384</a>)</li>
<li><a
href="https://github.com/astral-sh/ty/commit/5e264dac66970648d461a3fc8f2ebebd30a44dc9"><code>5e264da</code></a>
Link untyped-call tracking issue in migration guide (<a
href="https://redirect.github.com/astral-sh/ty/issues/4382">#4382</a>)</li>
<li><a
href="https://github.com/astral-sh/ty/commit/00199f0aaa6a8cd264fea08eae4f3c3fe4451c17"><code>00199f0</code></a>
Bump version to 0.0.74 (<a
href="https://redirect.github.com/astral-sh/ty/issues/4351">#4351</a>)</li>
<li><a
href="https://github.com/astral-sh/ty/commit/5769062fa10db84f6c03145bdf42d0b8da9aeb63"><code>5769062</code></a>
Update mypy/pyright comparison table (<a
href="https://redirect.github.com/astral-sh/ty/issues/4165">#4165</a>)</li>
<li><a
href="https://github.com/astral-sh/ty/commit/4fcb06010f2219b80adf3e688964abd9b0d72866"><code>4fcb060</code></a>
Remove Zulip from the PGO training (<a
href="https://redirect.github.com/astral-sh/ty/issues/4336">#4336</a>)</li>
<li><a
href="https://github.com/astral-sh/ty/commit/a7a706442a710db4a93c1a79779dff5ec5824cf6"><code>a7a7064</code></a>
Use the versions bot's ruleset bypass when merging (<a
href="https://redirect.github.com/astral-sh/ty/issues/4333">#4333</a>)</li>
<li><a
href="https://github.com/astral-sh/ty/commit/01b0fab0093c64535a401bc2731f80d7f5b6a7a8"><code>01b0fab</code></a>
Update prek dependencies (<a
href="https://redirect.github.com/astral-sh/ty/issues/4325">#4325</a>)</li>
<li><a
href="https://github.com/astral-sh/ty/commit/deef42f517bfbacb2ffe673046bef1e206c6b8ab"><code>deef42f</code></a>
Update dependency python to 3.14 (<a
href="https://redirect.github.com/astral-sh/ty/issues/4326">#4326</a>)</li>
<li>Additional commits viewable in <a
href="https://github.com/astral-sh/ty/compare/0.0.66...0.0.75">compare
view</a></li>
</ul>
</details>
<br />

Updates `starlette` from 1.3.1 to 1.6.0
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/Kludex/starlette/releases">starlette's
releases</a>.</em></p>
<blockquote>
<h2>Version 1.6.0</h2>
<h2>What's Changed</h2>
<ul>
<li>Add <code>max_body_size</code> to <code>Starlette</code> and route
classes by <a href="https://github.com/Kludex"><code>@​Kludex</code></a>
in <a
href="https://redirect.github.com/Kludex/starlette/pull/3431">Kludex/starlette#3431</a></li>
<li>Expose <code>http.response.debug</code> info via response extensions
by <a href="https://github.com/y2kbugger"><code>@​y2kbugger</code></a>
in <a
href="https://redirect.github.com/Kludex/starlette/pull/3130">Kludex/starlette#3130</a></li>
</ul>
<h2>New Contributors</h2>
<ul>
<li><a href="https://github.com/y2kbugger"><code>@​y2kbugger</code></a>
made their first contribution in <a
href="https://redirect.github.com/Kludex/starlette/pull/3130">Kludex/starlette#3130</a></li>
</ul>
<p><strong>Full Changelog</strong>: <a
href="https://github.com/Kludex/starlette/compare/1.5.1...1.6.0">https://github.com/Kludex/starlette/compare/1.5.1...1.6.0</a></p>
<h2>Version 1.5.1</h2>
<h2>What's Changed</h2>
<ul>
<li>Reject inverted single-byte Range like <code>bytes=5-4</code> by <a
href="https://github.com/nikolauspschuetz"><code>@​nikolauspschuetz</code></a>
in <a
href="https://redirect.github.com/encode/starlette/pull/3389">encode/starlette#3389</a></li>
<li>Limit <code>FileResponse</code> to 100 ranges by <a
href="https://github.com/Kludex"><code>@​Kludex</code></a> in <a
href="https://redirect.github.com/encode/starlette/pull/3430">encode/starlette#3430</a></li>
</ul>
<p><strong>Full Changelog</strong>: <a
href="https://github.com/encode/starlette/compare/1.5.0...1.5.1">https://github.com/encode/starlette/compare/1.5.0...1.5.1</a></p>
<h2>Version 1.5.0</h2>
<p>This release is all about giving <code>GZipMiddleware</code> some
love. 🗜️</p>
<h2>What's Changed</h2>
<ul>
<li>Add <code>exclude_content_types</code> parameter to
<code>GZipMiddleware</code> by <a
href="https://github.com/Kludex"><code>@​Kludex</code></a> in <a
href="https://redirect.github.com/encode/starlette/pull/3418">encode/starlette#3418</a></li>
<li>Flush GZip output for each streamed chunk by <a
href="https://github.com/Kludex"><code>@​Kludex</code></a> in <a
href="https://redirect.github.com/encode/starlette/pull/3419">encode/starlette#3419</a></li>
<li>Skip compression of partial responses in <code>GZipMiddleware</code>
by <a href="https://github.com/Kludex"><code>@​Kludex</code></a> in <a
href="https://redirect.github.com/encode/starlette/pull/3420">encode/starlette#3420</a></li>
<li>Expand default excluded content types in <code>GZipMiddleware</code>
by <a href="https://github.com/Kludex"><code>@​Kludex</code></a> in <a
href="https://redirect.github.com/encode/starlette/pull/3421">encode/starlette#3421</a></li>
</ul>
<p><strong>Full Changelog</strong>: <a
href="https://github.com/encode/starlette/compare/1.4.1...1.5.0">https://github.com/encode/starlette/compare/1.4.1...1.5.0</a></p>
<h2>Version 1.4.1</h2>
<h2>What's Changed</h2>
<ul>
<li>Default <code>thread_minimum_size</code> in
<code>GZipResponder</code> by <a
href="https://github.com/Kludex"><code>@​Kludex</code></a> in <a
href="https://redirect.github.com/Kludex/starlette/pull/3415">Kludex/starlette#3415</a></li>
</ul>
<p><strong>Full Changelog</strong>: <a
href="https://github.com/Kludex/starlette/compare/1.4.0...1.4.1">https://github.com/Kludex/starlette/compare/1.4.0...1.4.1</a></p>
<h2>Version 1.4.0</h2>
<h2>What's Changed</h2>
<ul>
<li>Lazily allocate GZipMiddleware compression resources by <a
href="https://github.com/Kludex"><code>@​Kludex</code></a> in <a
href="https://redirect.github.com/Kludex/starlette/pull/3407">Kludex/starlette#3407</a></li>
<li>Use <code>zlib.compressobj</code> instead of <code>GzipFile</code>
in <code>GZipMiddleware</code> by <a
href="https://github.com/Kludex"><code>@​Kludex</code></a> in <a
href="https://redirect.github.com/Kludex/starlette/pull/3411">Kludex/starlette#3411</a></li>
<li>Offload large GZip compression by <a
href="https://github.com/Kludex"><code>@​Kludex</code></a> in <a
href="https://redirect.github.com/Kludex/starlette/pull/3410">Kludex/starlette#3410</a></li>
</ul>
<h2>New Contributors</h2>
<ul>
<li><a
href="https://github.com/benberryallwood"><code>@​benberryallwood</code></a>
made their first contribution in <a
href="https://redirect.github.com/Kludex/starlette/pull/3334">Kludex/starlette#3334</a></li>
<li><a href="https://github.com/lkk7"><code>@​lkk7</code></a> made their
first contribution in <a
href="https://redirect.github.com/Kludex/starlette/pull/3359">Kludex/starlette#3359</a></li>
</ul>
<p><strong>Full Changelog</strong>: <a
href="https://github.com/Kludex/starlette/compare/1.3.1...1.4.0">https://github.com/Kludex/starlette/compare/1.3.1...1.4.0</a></p>
</blockquote>
</details>
<details>
<summary>Changelog</summary>
<p><em>Sourced from <a
href="https://github.com/Kludex/starlette/blob/main/docs/release-notes.md">starlette's
changelog</a>.</em></p>
<blockquote>
<h2>1.6.0 (August 8, 2026)</h2>
<h4>Added</h4>
<ul>
<li>Add <code>max_body_size</code> to <code>Starlette</code> and route
classes <a
href="https://redirect.github.com/encode/starlette/pull/3431">#3431</a>.</li>
<li>Expose <code>http.response.debug</code> information via response
extensions <a
href="https://redirect.github.com/encode/starlette/pull/3130">#3130</a>.</li>
</ul>
<h2>1.5.1 (August 8, 2026)</h2>
<h4>Fixed</h4>
<ul>
<li>Reject inverted single-byte ranges in <code>FileResponse</code> <a
href="https://redirect.github.com/encode/starlette/pull/3389">#3389</a>.</li>
<li>Limit <code>FileResponse</code> to 100 ranges <a
href="https://redirect.github.com/encode/starlette/pull/3430">#3430</a>.</li>
</ul>
<h2>1.5.0 (August 8, 2026)</h2>
<h4>Added</h4>
<ul>
<li>Add <code>exclude_content_types</code> parameter to
<code>GZipMiddleware</code> <a
href="https://redirect.github.com/encode/starlette/pull/3418">#3418</a>.</li>
</ul>
<h4>Changed</h4>
<ul>
<li>Expand default excluded content types in <code>GZipMiddleware</code>
<a
href="https://redirect.github.com/encode/starlette/pull/3421">#3421</a>.</li>
</ul>
<h4>Fixed</h4>
<ul>
<li>Flush GZip output for each streamed chunk <a
href="https://redirect.github.com/encode/starlette/pull/3419">#3419</a>.</li>
<li>Skip compression of partial responses in <code>GZipMiddleware</code>
<a
href="https://redirect.github.com/encode/starlette/pull/3420">#3420</a>.</li>
</ul>
<h2>1.4.1 (August 5, 2026)</h2>
<h4>Fixed</h4>
<ul>
<li>Default <code>thread_minimum_size</code> to 128 KiB in
<code>GZipResponder</code>, keeping it usable without the new keyword
argument <a
href="https://redirect.github.com/encode/starlette/pull/3415">#3415</a>.</li>
</ul>
<h2>1.4.0 (August 5, 2026)</h2>
<h4>Added</h4>
<ul>
<li>Offload large GZip compression to a worker thread, keeping the event
loop responsive. <code>GZipMiddleware</code> accepts a new
<code>thread_minimum_size</code> parameter (default 128 KiB) controlling
the minimum body chunk size compressed in a thread <a
href="https://redirect.github.com/encode/starlette/pull/3410">#3410</a>.</li>
</ul>
<h4>Changed</h4>
<ul>
<li>Use <code>zlib.compressobj</code> instead of <code>GzipFile</code>
in <code>GZipMiddleware</code>, reducing memory usage during compression
<a
href="https://redirect.github.com/encode/starlette/pull/3411">#3411</a>.</li>
<li>Lazily allocate <code>GZipMiddleware</code> compression resources,
avoiding compressor allocation for responses that are never compressed
<a
href="https://redirect.github.com/encode/starlette/pull/3407">#3407</a>.</li>
</ul>
</blockquote>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="https://github.com/Kludex/starlette/commit/4f250d6b814587e20c5365f0a5f0c4d42bcb929f"><code>4f250d6</code></a>
Version 1.6.0 (<a
href="https://redirect.github.com/Kludex/starlette/issues/3434">#3434</a>)</li>
<li><a
href="https://github.com/Kludex/starlette/commit/9eea41ad3c26ad21b9bdfe4578c1cdad6c9b9ac2"><code>9eea41a</code></a>
Expose <code>http.response.debug</code> info via response extensions (<a
href="https://redirect.github.com/Kludex/starlette/issues/3130">#3130</a>)</li>
<li><a
href="https://github.com/Kludex/starlette/commit/38f8999a229610b36f39d11f67d80515a15c6330"><code>38f8999</code></a>
Add <code>max_body_size</code> to <code>Starlette</code> and route
classes (<a
href="https://redirect.github.com/Kludex/starlette/issues/3431">#3431</a>)</li>
<li><a
href="https://github.com/Kludex/starlette/commit/c41236c03868fb3779a64101f4ea88cd47877e23"><code>c41236c</code></a>
Version 1.5.1 (<a
href="https://redirect.github.com/Kludex/starlette/issues/3432">#3432</a>)</li>
<li><a
href="https://github.com/Kludex/starlette/commit/9c500db197859dba4a8db13fa8e7d2c55de8152c"><code>9c500db</code></a>
Limit <code>FileResponse</code> to 100 ranges (<a
href="https://redirect.github.com/Kludex/starlette/issues/3430">#3430</a>)</li>
<li><a
href="https://github.com/Kludex/starlette/commit/78ae82cad482fe66a73fb1217f0a6609b3f998f6"><code>78ae82c</code></a>
Reject inverted single-byte Range like bytes=5-4 (<a
href="https://redirect.github.com/Kludex/starlette/issues/3389">#3389</a>)</li>
<li><a
href="https://github.com/Kludex/starlette/commit/c1d6edaf43920104d4389e983c3e0314f6af14cf"><code>c1d6eda</code></a>
chore(deps): bump pymdown-extensions from 11.0 to 11.0.1 (<a
href="https://redirect.github.com/Kludex/starlette/issues/3429">#3429</a>)</li>
<li><a
href="https://github.com/Kludex/starlette/commit/ee66ca48418780d6415d231851b31464febc32de"><code>ee66ca4</code></a>
chore(deps): bump the python-packages group across 1 directory with 8
updates...</li>
<li><a
href="https://github.com/Kludex/starlette/commit/00d10167523f819d39d5ca36732348d58645a447"><code>00d1016</code></a>
fix(tests): skip test_staticfiles_filename_too_long on Windows where
os.pathc...</li>
<li><a
href="https://github.com/Kludex/starlette/commit/d96887ea7b49db3d1d15994be6438c7fe99936f4"><code>d96887e</code></a>
Add Pydantic Logfire banner to the docs (<a
href="https://redirect.github.com/Kludex/starlette/issues/3428">#3428</a>)</li>
<li>Additional commits viewable in <a
href="https://github.com/Kludex/starlette/compare/1.3.1...1.6.0">compare
view</a></li>
</ul>
</details>
<br />

Updates `pydantic` from 2.13.4 to 2.13.5
<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.5 (2026-08-28)</h2>
<h3>What's Changed</h3>
<h4>Fixes</h4>
<ul>
<li>Allow reuse of validators when plugins are set by <a
href="https://github.com/Viicos"><code>@​Viicos</code></a> in <a
href="https://redirect.github.com/pydantic/pydantic/pull/13535">#13535</a></li>
<li>Fix missing GC traversal on some <code>pydantic-core</code> struct
fields by <a href="https://github.com/Viicos"><code>@​Viicos</code></a>
in <a
href="https://redirect.github.com/pydantic/pydantic/pull/13624">#13624</a></li>
<li>Fix missing GC traversal in <code>pydantic-core</code> for
<code>GeneralFieldsSerializer</code> by <a
href="https://github.com/Viicos"><code>@​Viicos</code></a> in <a
href="https://redirect.github.com/pydantic/pydantic/pull/13629">#13629</a></li>
<li>Count validated model fields once in smart unions by <a
href="https://github.com/tamird"><code>@​tamird</code></a> in <a
href="https://redirect.github.com/pydantic/pydantic/pull/13731">#13731</a></li>
</ul>
</blockquote>
</details>
<details>
<summary>Changelog</summary>
<p><em>Sourced from <a
href="https://github.com/pydantic/pydantic/blob/v2.13.5/HISTORY.md">pydantic's
changelog</a>.</em></p>
<blockquote>
<h2>v2.13.5 (2026-08-28)</h2>
<p><a
href="https://github.com/pydantic/pydantic/releases/tag/v2.13.5">GitHub
release</a></p>
<h3>What's Changed</h3>
<h4>Fixes</h4>
<ul>
<li>Allow reuse of validators when plugins are set by <a
href="https://github.com/Viicos"><code>@​Viicos</code></a> in <a
href="https://redirect.github.com/pydantic/pydantic/pull/13535">#13535</a></li>
<li>Fix missing GC traversal on some <code>pydantic-core</code> struct
fields by <a href="https://github.com/Viicos"><code>@​Viicos</code></a>
in <a
href="https://redirect.github.com/pydantic/pydantic/pull/13624">#13624</a></li>
<li>Fix missing GC traversal in <code>pydantic-core</code> for
<code>GeneralFieldsSerializer</code> by <a
href="https://github.com/Viicos"><code>@​Viicos</code></a> in <a
href="https://redirect.github.com/pydantic/pydantic/pull/13629">#13629</a></li>
<li>Count validated model fields once in smart unions by <a
href="https://github.com/tamird"><code>@​tamird</code></a> in <a
href="https://redirect.github.com/pydantic/pydantic/pull/13731">#13731</a></li>
</ul>
</blockquote>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="https://github.com/pydantic/pydantic/commit/001dea020e0809844e5b17666432c9135a976f46"><code>001dea0</code></a>
Bump <code>pypa/gh-action-pypi-publish</code> action to v1.14.2</li>
<li><a
href="https://github.com/pydantic/pydantic/commit/558379fee957fad25858e33596146c72d5674843"><code>558379f</code></a>
Bump twine to v7.0.0</li>
<li><a
href="https://github.com/pydantic/pydantic/commit/2cfd5d3d2ae721ea882c045f83b7f7a4003aab01"><code>2cfd5d3</code></a>
Do not check for docs build</li>
<li><a
href="https://github.com/pydantic/pydantic/commit/a735bee5c64e1fe50785c376adaf1275e752b8ac"><code>a735bee</code></a>
Fix more Clippy lints</li>
<li><a
href="https://github.com/pydantic/pydantic/commit/7eed4a16b87afaced4d0eafae230453de3410d64"><code>7eed4a1</code></a>
Fix Clippy 0.1.95 warnings</li>
<li><a
href="https://github.com/pydantic/pydantic/commit/b353bbb20a4989b4c033e2be2b4a40d36178b16a"><code>b353bbb</code></a>
Prepare release v2.13.5</li>
<li><a
href="https://github.com/pydantic/pydantic/commit/63d2cccd6e760da6bbc7fe81a53cb2bde3768f5e"><code>63d2ccc</code></a>
Count validated model fields once in smart unions</li>
<li><a
href="https://github.com/pydantic/pydantic/commit/a53ec2ed342fda4e6aa3684399d04ea57be9a6e4"><code>a53ec2e</code></a>
Speed up PyPy CI tests</li>
<li><a
href="https://github.com/pydantic/pydantic/commit/d65e0f96e890ca82f4b66a15d5b3bd65af2c661c"><code>d65e0f9</code></a>
Workaround circular import error in Mypy</li>
<li><a
href="https://github.com/pydantic/pydantic/commit/47a6dbf8ad6216211bd0df6ec5c2c6c6ed905b72"><code>47a6dbf</code></a>
Fix missing GC traversal in <code>pydantic-core</code> for
<code>GeneralFieldsSerializer</code></li>
<li>Additional commits viewable in <a
href="https://github.com/pydantic/pydantic/compare/v2.13.4...v2.13.5">compare
view</a></li>
</ul>
</details>
<br />

Made by [Open
SWE](https://openswe.vercel.app/agents/0758e158-6746-5095-b8a0-7f69acf36b73)

---------

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: open-swe[bot] <open-swe@users.noreply.github.com>
2026-09-02 09:52:39 +00:00
Mason DaughertyGitHubopen-swe[bot] <open-swe@users.noreply.github.com>
bdb8a9c7a4 feat: route LangSmith traces from thread streams (#8723)
## Description
Expose the existing `langsmith_tracing` option on Python sync and async
thread-stream run starts and forward it through the protocol.

## Release Note
Python thread streams can route traces to an additional LangSmith
project per run.

## Test Plan
- [x] Verify sync and async run-start payloads include tracing settings

## Related PRs
- langchain-ai/agent-protocol#95
- langchain-ai/langgraphjs#2745
- langchain-ai/langgraph-api#4033

Made by [Open
SWE](https://openswe.vercel.app/agents/f9e34294-b9c3-52f0-815a-0102188e1181)

Co-authored-by: open-swe[bot] <open-swe@users.noreply.github.com>
2026-08-26 16:57:39 -04:00
Elior Nataf LackritzandGitHub ea5f9cc9fb chore: enforce PLC0415 in tests for the remaining packages (#8547)
Follow-up to #8540, which turned on `PLC0415` (import-outside-top-level)
for checkpoint-postgres and checkpoint-sqlite. This does the remaining
six packages: checkpoint, checkpoint-conformance, langgraph, prebuilt,
cli, sdk-py.

Scoped to tests, per @sydney-runkle's call on #8540: library code is
exempted with `per-file-ignores`, since it still has deferred imports
nobody has reviewed and mixing that in would make this hard to read.

## What changed

Function-level imports across 56 test files moved to module level. Nine
could not move and carry an explicit `# noqa: PLC0415` with a reason:

| File | Why it stays local |
|---|---|
| `libs/langgraph/tests/test_deprecation.py` (4) | the import has to run
inside `pytest.warns` for the warning to be observed |
| `libs/langgraph/tests/test_serde_allowlist.py` | try/except guard,
skips when langchain_core is absent |
| `libs/langgraph/tests/test_delta_channel_benchmark.py` | optional
psycopg probe |
| `libs/checkpoint/tests/test_conformance_delta.py` (3) | protected by a
module-level `pytest.importorskip`; hoisting past the guard turns a skip
into a collection error |

That last one is the trap: an import moved above `pytest.importorskip`
silently defeats the guard. I hit it locally and it turned the skip into
a `ModuleNotFoundError` at collection. Every file with an `importorskip`
or `except ImportError` was checked by hand for this.

## Verification

`make lint` and `make test` in each of the six:

| Package | Tests |
|---|---|
| checkpoint | 156 passed, 17 skipped |
| checkpoint-conformance | 1 passed |
| langgraph | 1968 passed, 4 skipped |
| prebuilt | 284 passed |
| cli | 336 passed |
| sdk-py | 493 passed |

Also confirmed the rule actually fires: a throwaway test file with a
function-level import is flagged in all six packages, and the source
exemption holds.
2026-08-07 09:40:18 -04:00
Nick HollonandGitHub 1fcb768182 feat(sdk-py): extract stream decoders and add interleave_projections (#7935)
## Summary

Refactors the four (now five) sdk-py streaming projections into
reusable, transport-agnostic `Decoder` classes and adds a new
`interleave_projections(channels)` method to `AsyncThreadStream` and
`SyncThreadStream` that drives multiple decoders from one shared
subscription, yielding `(channel_name, item)` tuples in arrival order
(the SDK analog of local `GraphRunStream.interleave`).

- **New `langgraph_sdk/stream/decoders.py`**: pure `feed(event) ->
Iterable[item]` state machines — `ValuesDecoder`, `MessagesDecoder`,
`ToolCallsDecoder`, `SubgraphsDecoder`, `ExtensionsDecoder` — behind a
`Decoder` Protocol. No subscription/queue/thread access.
- **Projection migration (async + sync)**: the five existing projections
now delegate their per-event logic to the decoders. Behavior-preserving
— the existing test suite is the regression net. Thread-coupled side
effects (active-stream registration, terminal-error-on-close, root-inbox
forwarding) stay in the projection wrappers; sync messages/tool_calls
keep their pre-dispatch contract (handle/stream resolved on yield) via a
FIFO-head buffer.
- **`interleave_projections`**: flat-namespace channel list (built-ins +
extension names), `tool_calls`↔`tools` wire mapping, subgraphs fed every
event, extensions keyed by bare name.

### Notable
- Fixes a latent sync bug surfaced by the refactor: two tool calls /
messages whose events interleave previously dropped the second; both now
surface. Locked in with a regression test.
- `Decoder.feed` takes `Mapping[str, Any]` (read-only), so the Protocol
is load-bearing in both stream files.

### Deferred (not in this PR)
- Wiring `RemoteGraph._RemoteGraphRunStream.interleave` to
`interleave_projections` (gated on #7927).
- Migrating the handle-scoped projections (`_Handle*Projection`) to the
decoders — hence the small, verified-identical helper duplication
between `decoders.py` and `_async/stream.py`.
- `interleave_projections` handles aren't registered for thread-close
cleanup (additive follow-up).

## Test Plan
- [x] `make test` in `libs/sdk-py` — 464 passed, 0 failures
- [x] `make format` / `make lint` (ruff + ty) clean
- [x] Per-decoder unit tests in `tests/streaming/test_decoders.py`
- [x] `interleave_projections` tests (single-channel, multi-channel
arrival order, builtin+extension mix, tool_calls public-name, subgraphs
discovery) async + sync
- [x] Existing projection suites pass unchanged (regression net for the
migration)
2026-05-29 17:14:14 -04:00
Nick HollonandGitHub 8cb0f3a96d feat(sdk-py): add thread stream helpers (#7833) 2026-05-27 17:02:59 -04:00
Nick HollonandGitHub fd4257300e feat(sdk-py): wire websocket stream selection (#7832) 2026-05-27 16:48:22 -04:00
Nick HollonandGitHub 4f3ab2f969 feat(sdk-py): harden streaming reconnects (#7829) 2026-05-27 15:24:25 -04:00
Nick HollonandGitHub fe1c683fe1 feat(sdk-py): add sync thread stream core (#7826) 2026-05-27 13:41:55 -04:00