dependabot[bot] 52ebb7417b build(deps): bump the minor-and-patch group with 5 updates (#629)
Bumps the minor-and-patch group with 5 updates:

| Package | From | To |
| --- | --- | --- |
| [uvicorn](https://github.com/Kludex/uvicorn) | `0.47.0` | `0.48.0` |
| [nvidia-riva-client](https://github.com/nvidia-riva/python-clients) |
`2.25.1` | `2.26.0` |
| [pytest-asyncio](https://github.com/pytest-dev/pytest-asyncio) |
`1.3.0` | `1.4.0` |
| [ty](https://github.com/astral-sh/ty) | `0.0.38` | `0.0.40` |
| [ruff](https://github.com/astral-sh/ruff) | `0.15.14` | `0.15.15` |

Updates `uvicorn` from 0.47.0 to 0.48.0
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/Kludex/uvicorn/releases">uvicorn's
releases</a>.</em></p>
<blockquote>
<h2>Version 0.48.0</h2>
<h2>What's Changed</h2>
<ul>
<li>Default <code>ssl_ciphers</code> to <code>None</code> and use
OpenSSL defaults by <a
href="https://github.com/Kludex"><code>@​Kludex</code></a> in <a
href="https://redirect.github.com/Kludex/uvicorn/pull/2940">Kludex/uvicorn#2940</a></li>
<li>Ignore duplicate forwarding headers in
<code>ProxyHeadersMiddleware</code> by <a
href="https://github.com/Kludex"><code>@​Kludex</code></a> in <a
href="https://redirect.github.com/Kludex/uvicorn/pull/2944">Kludex/uvicorn#2944</a></li>
</ul>
<p><strong>Full Changelog</strong>: <a
href="https://github.com/Kludex/uvicorn/compare/0.47.0...0.48.0">https://github.com/Kludex/uvicorn/compare/0.47.0...0.48.0</a></p>
</blockquote>
</details>
<details>
<summary>Changelog</summary>
<p><em>Sourced from <a
href="https://github.com/Kludex/uvicorn/blob/main/docs/release-notes.md">uvicorn's
changelog</a>.</em></p>
<blockquote>
<h2>0.48.0 (May 24, 2026)</h2>
<h3>Changed</h3>
<ul>
<li>Default <code>ssl_ciphers</code> to <code>None</code> and use
OpenSSL defaults (<a
href="https://redirect.github.com/Kludex/uvicorn/issues/2940">#2940</a>)</li>
</ul>
<h3>Fixed</h3>
<ul>
<li>Ignore duplicate forwarding headers in
<code>ProxyHeadersMiddleware</code> (<a
href="https://redirect.github.com/Kludex/uvicorn/issues/2944">#2944</a>)</li>
</ul>
</blockquote>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="https://github.com/Kludex/uvicorn/commit/73e84e58d7f6b8b3dfd8a9e3e42d716862250f33"><code>73e84e5</code></a>
Version 0.48.0 (<a
href="https://redirect.github.com/Kludex/uvicorn/issues/2951">#2951</a>)</li>
<li><a
href="https://github.com/Kludex/uvicorn/commit/45ea11690b4a62fa6df339d2b6ee3b8545a418e0"><code>45ea116</code></a>
Ignore duplicate forwarding headers in
<code>ProxyHeadersMiddleware</code> (<a
href="https://redirect.github.com/Kludex/uvicorn/issues/2944">#2944</a>)</li>
<li><a
href="https://github.com/Kludex/uvicorn/commit/dd4394c3cbfd9f27a696a7b08047149690058158"><code>dd4394c</code></a>
chore(deps): bump idna from 3.11 to 3.15 (<a
href="https://redirect.github.com/Kludex/uvicorn/issues/2941">#2941</a>)</li>
<li><a
href="https://github.com/Kludex/uvicorn/commit/abe07818a191cd036dc3824d802d052207e01c7e"><code>abe0781</code></a>
Default <code>ssl_ciphers</code> to <code>None</code> and use OpenSSL
defaults (<a
href="https://redirect.github.com/Kludex/uvicorn/issues/2940">#2940</a>)</li>
<li>See full diff in <a
href="https://github.com/Kludex/uvicorn/compare/0.47.0...0.48.0">compare
view</a></li>
</ul>
</details>
<br />

Updates `nvidia-riva-client` from 2.25.1 to 2.26.0
<details>
<summary>Commits</summary>
<ul>
<li>See full diff in <a
href="https://github.com/nvidia-riva/python-clients/commits">compare
view</a></li>
</ul>
</details>
<br />

Updates `pytest-asyncio` from 1.3.0 to 1.4.0
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/pytest-dev/pytest-asyncio/releases">pytest-asyncio's
releases</a>.</em></p>
<blockquote>
<h2>pytest-asyncio v1.4.0</h2>
<h1><a
href="https://github.com/pytest-dev/pytest-asyncio/tree/1.4.0">1.4.0</a>
- 2026-05-26</h1>
<h2>Deprecated</h2>
<ul>
<li>Overriding the <em>event_loop_policy</em> fixture is deprecated. Use
the <code>pytest_asyncio_loop_factories</code> hook instead. (<a
href="https://redirect.github.com/pytest-dev/pytest-asyncio/issues/1419">#1419</a>)</li>
</ul>
<h2>Added</h2>
<ul>
<li>
<p>Added the <code>pytest_asyncio_loop_factories</code> hook to
parametrize asyncio tests with custom event loop factories.</p>
<p>The hook returns a mapping of factory names to loop factories, and
<code>pytest.mark.asyncio(loop_factories=[...])</code> selects a subset
of configured factories per test. When a single factory is configured,
test names are unchanged.</p>
<p>Synchronous <code>@pytest_asyncio.fixture</code> functions now see
the correct event loop when custom loop factories are configured, even
when test code disrupts the current event loop (e.g., via
<code>asyncio.run()</code> or
<code>asyncio.set_event_loop(None)</code>). (<a
href="https://redirect.github.com/pytest-dev/pytest-asyncio/issues/1164">#1164</a>)</p>
</li>
</ul>
<h2>Changed</h2>
<ul>
<li>Improved the readability of the warning message that is displayed
when <code>asyncio_default_fixture_loop_scope</code> is unset (<a
href="https://redirect.github.com/pytest-dev/pytest-asyncio/issues/1298">#1298</a>)</li>
<li>Only import <code>asyncio.AbstractEventLoopPolicy</code> for type
checking to avoid raising
a DeprecationWarning. (<a
href="https://redirect.github.com/pytest-dev/pytest-asyncio/issues/1394">#1394</a>)</li>
<li>Updated minimum supported pytest version to v8.4.0. (<a
href="https://redirect.github.com/pytest-dev/pytest-asyncio/issues/1397">#1397</a>)</li>
</ul>
<h2>Fixed</h2>
<ul>
<li>Fixed a <code>ResourceWarning: unclosed event loop</code> warning
that could occur when a synchronous test called
<code>asyncio.run()</code> or otherwise unset the current event loop
after pytest-asyncio had run an async test or fixture. (<a
href="https://redirect.github.com/pytest-dev/pytest-asyncio/issues/724">#724</a>)</li>
</ul>
<h2>Notes for Downstream Packagers</h2>
<ul>
<li>Added dependency on <code>sphinx-tabs &gt;= 3.5</code> to organize
documentation examples into tabs. (<a
href="https://redirect.github.com/pytest-dev/pytest-asyncio/issues/1395">#1395</a>)</li>
</ul>
<h2>pytest-asyncio v1.4.0a2</h2>
<h1><a
href="https://github.com/pytest-dev/pytest-asyncio/tree/1.4.0a2">1.4.0a2</a>
- 2026-05-02</h1>
<h2>Deprecated</h2>
<ul>
<li>Overriding the <em>event_loop_policy</em> fixture is deprecated. Use
the <code>pytest_asyncio_loop_factories</code> hook instead. (<a
href="https://redirect.github.com/pytest-dev/pytest-asyncio/issues/1419">#1419</a>)</li>
</ul>
<h2>Added</h2>
<ul>
<li>
<p>Added the <code>pytest_asyncio_loop_factories</code> hook to
parametrize asyncio tests with custom event loop factories.</p>
<p>The hook returns a mapping of factory names to loop factories, and
<code>pytest.mark.asyncio(loop_factories=[...])</code> selects a subset
of configured factories per test. When a single factory is configured,
test names are unchanged on pytest 8.4+.</p>
<p>Synchronous <code>@pytest_asyncio.fixture</code> functions now see
the correct event loop when custom loop factories are configured, even
when test code disrupts the current event loop (e.g., via
<code>asyncio.run()</code> or
<code>asyncio.set_event_loop(None)</code>). (<a
href="https://redirect.github.com/pytest-dev/pytest-asyncio/issues/1164">#1164</a>)</p>
</li>
</ul>
<h2>Changed</h2>
<ul>
<li>Improved the readability of the warning message that is displayed
when <code>asyncio_default_fixture_loop_scope</code> is unset (<a
href="https://redirect.github.com/pytest-dev/pytest-asyncio/issues/1298">#1298</a>)</li>
<li>Only import <code>asyncio.AbstractEventLoopPolicy</code> for type
checking to avoid raising
a DeprecationWarning. (<a
href="https://redirect.github.com/pytest-dev/pytest-asyncio/issues/1394">#1394</a>)</li>
</ul>
<!-- raw HTML omitted -->
</blockquote>
<p>... (truncated)</p>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="https://github.com/pytest-dev/pytest-asyncio/commit/6e14cd2af9292dca1fa2b027a06bbc40b0e0e425"><code>6e14cd2</code></a>
chore: Prepare release of v1.4.0.</li>
<li><a
href="https://github.com/pytest-dev/pytest-asyncio/commit/4b900fb5d0c30949c574e55dd904ee179f858a5e"><code>4b900fb</code></a>
Build(deps): Bump codecov/codecov-action from 6.0.0 to 6.0.1</li>
<li><a
href="https://github.com/pytest-dev/pytest-asyncio/commit/ab9f63245094865c42c940a34af724b0dec1debf"><code>ab9f632</code></a>
Build(deps): Bump zipp from 3.23.1 to 4.1.0</li>
<li><a
href="https://github.com/pytest-dev/pytest-asyncio/commit/a56fc77ecd59f781d8471b0f6a82bf58e08c95fa"><code>a56fc77</code></a>
Build(deps): Bump hypothesis from 6.152.6 to 6.152.8</li>
<li><a
href="https://github.com/pytest-dev/pytest-asyncio/commit/e8bae9bc1f197731fc1a210c0da557af7b698e6d"><code>e8bae9b</code></a>
Build(deps): Bump requests from 2.34.0 to 2.34.2</li>
<li><a
href="https://github.com/pytest-dev/pytest-asyncio/commit/fc433402c570fd36a7a227ef4bc3abd4579299de"><code>fc43340</code></a>
Build(deps): Bump idna from 3.14 to 3.15</li>
<li><a
href="https://github.com/pytest-dev/pytest-asyncio/commit/762eaf5033b798b965c92afdbb2cebefa8fc3a8b"><code>762eaf5</code></a>
Build(deps): Bump jaraco-functools from 4.4.0 to 4.5.0</li>
<li><a
href="https://github.com/pytest-dev/pytest-asyncio/commit/b62e2228c80070977baf6b77ba89d5c148af920f"><code>b62e222</code></a>
Build(deps): Bump click from 8.3.3 to 8.4.0</li>
<li><a
href="https://github.com/pytest-dev/pytest-asyncio/commit/919044700627889d25ca63b6e7a3bc785f3137eb"><code>9190447</code></a>
Build(deps): Bump pydantic from 2.13.3 to 2.13.4</li>
<li><a
href="https://github.com/pytest-dev/pytest-asyncio/commit/82a393c5e31b6ebbbd8ec2a8dafc5f35b9cf1236"><code>82a393c</code></a>
ci: Remove unnecessary debug output.</li>
<li>Additional commits viewable in <a
href="https://github.com/pytest-dev/pytest-asyncio/compare/v1.3.0...v1.4.0">compare
view</a></li>
</ul>
</details>
<br />

Updates `ty` from 0.0.38 to 0.0.40
<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.40</h2>
<h2>Release Notes</h2>
<p>Released on 2026-05-27.</p>
<h3>Bug fixes</h3>
<ul>
<li>Accept complete enum-literal alias unions as enums (<a
href="https://redirect.github.com/astral-sh/ruff/pull/25341">#25341</a>)</li>
<li>Fix diagnostics in ignored folders after adding new files (<a
href="https://redirect.github.com/astral-sh/ruff/pull/25236">#25236</a>)</li>
<li>Show <code>LiteralString</code> when hovering over an inline of a
literal string in an IDE (<a
href="https://redirect.github.com/astral-sh/ruff/pull/25373">#25373</a>)</li>
</ul>
<h3>LSP server</h3>
<ul>
<li>Follow aliases when attempting to map a definition in a stub file to
its &quot;real&quot; runtime definition (<a
href="https://redirect.github.com/astral-sh/ruff/pull/25328">#25328</a>)</li>
<li>Treat Python notebook text documents as Python sources (<a
href="https://redirect.github.com/astral-sh/ruff/pull/25393">#25393</a>)</li>
<li>Fix autocompletion for elements inside incomplete list
comprehensions (<a
href="https://redirect.github.com/astral-sh/ruff/pull/25326">#25326</a>)</li>
</ul>
<h3>Diagnostics</h3>
<ul>
<li>Add a subdiagnostic help message to
<code>invalid-generic-class</code> diagnostics regarding incompatible
variance (<a
href="https://redirect.github.com/astral-sh/ruff/pull/25385">#25385</a>)</li>
</ul>
<h3>Core type checking</h3>
<ul>
<li>Ignore and reject annotations on non-name targets (<a
href="https://redirect.github.com/astral-sh/ruff/pull/25324">#25324</a>)</li>
<li>Infer class attributes assigned by metaclass initialization (<a
href="https://redirect.github.com/astral-sh/ruff/pull/25342">#25342</a>)</li>
<li>Reject inconsistent generic bases in &quot;dynamic&quot; classes
created using <code>type(...)</code>, <code>types.new_type(...)</code>,
etc. (<a
href="https://redirect.github.com/astral-sh/ruff/pull/25413">#25413</a>)</li>
<li>Resolve enum names for all unions arms in <code>Literal</code> enum
subsets (<a
href="https://redirect.github.com/astral-sh/ruff/pull/25379">#25379</a>)</li>
<li>Support <code>typing.TypeForm</code> (<a
href="https://redirect.github.com/astral-sh/ruff/pull/25334">#25334</a>)</li>
<li>Fix many issues in the generics solver by using constraint sets more
widely to solve type variables (<a
href="https://redirect.github.com/astral-sh/ruff/pull/24540">#24540</a>)</li>
</ul>
<h3>Contributors</h3>
<ul>
<li><a
href="https://github.com/anuraaga"><code>@​anuraaga</code></a></li>
<li><a
href="https://github.com/dcreager"><code>@​dcreager</code></a></li>
<li><a
href="https://github.com/charliermarsh"><code>@​charliermarsh</code></a></li>
<li><a
href="https://github.com/MichaReiser"><code>@​MichaReiser</code></a></li>
<li><a
href="https://github.com/Dev-X25874"><code>@​Dev-X25874</code></a></li>
</ul>
<h2>Install ty 0.0.40</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.40/ty-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/ty/releases/download/0.0.40/ty-installer.ps1
| iex&quot;
&lt;/tr&gt;&lt;/table&gt; 
</code></pre>
</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.40</h2>
<p>Released on 2026-05-27.</p>
<h3>Bug fixes</h3>
<ul>
<li>Accept complete enum-literal alias unions as enums (<a
href="https://redirect.github.com/astral-sh/ruff/pull/25341">#25341</a>)</li>
<li>Fix diagnostics in ignored folders after adding new files (<a
href="https://redirect.github.com/astral-sh/ruff/pull/25236">#25236</a>)</li>
<li>Show <code>LiteralString</code> when hovering over an inline of a
literal string in an IDE (<a
href="https://redirect.github.com/astral-sh/ruff/pull/25373">#25373</a>)</li>
</ul>
<h3>LSP server</h3>
<ul>
<li>Follow aliases when attempting to map a definition in a stub file to
its &quot;real&quot; runtime definition (<a
href="https://redirect.github.com/astral-sh/ruff/pull/25328">#25328</a>)</li>
<li>Treat Python notebook text documents as Python sources (<a
href="https://redirect.github.com/astral-sh/ruff/pull/25393">#25393</a>)</li>
<li>Fix autocompletion for elements inside incomplete list
comprehensions (<a
href="https://redirect.github.com/astral-sh/ruff/pull/25326">#25326</a>)</li>
</ul>
<h3>Diagnostics</h3>
<ul>
<li>Add a subdiagnostic help message to
<code>invalid-generic-class</code> diagnostics regarding incompatible
variance (<a
href="https://redirect.github.com/astral-sh/ruff/pull/25385">#25385</a>)</li>
</ul>
<h3>Core type checking</h3>
<ul>
<li>Ignore and reject annotations on non-name targets (<a
href="https://redirect.github.com/astral-sh/ruff/pull/25324">#25324</a>)</li>
<li>Infer class attributes assigned by metaclass initialization (<a
href="https://redirect.github.com/astral-sh/ruff/pull/25342">#25342</a>)</li>
<li>Reject inconsistent generic bases in &quot;dynamic&quot; classes
created using <code>type(...)</code>, <code>types.new_type(...)</code>,
etc. (<a
href="https://redirect.github.com/astral-sh/ruff/pull/25413">#25413</a>)</li>
<li>Resolve enum names for all unions arms in <code>Literal</code> enum
subsets (<a
href="https://redirect.github.com/astral-sh/ruff/pull/25379">#25379</a>)</li>
<li>Support <code>typing.TypeForm</code> (<a
href="https://redirect.github.com/astral-sh/ruff/pull/25334">#25334</a>)</li>
<li>Fix many issues in the generics solver by using constraint sets more
widely to solve type variables (<a
href="https://redirect.github.com/astral-sh/ruff/pull/24540">#24540</a>)</li>
</ul>
<h3>Contributors</h3>
<ul>
<li><a
href="https://github.com/anuraaga"><code>@​anuraaga</code></a></li>
<li><a
href="https://github.com/dcreager"><code>@​dcreager</code></a></li>
<li><a
href="https://github.com/charliermarsh"><code>@​charliermarsh</code></a></li>
<li><a
href="https://github.com/MichaReiser"><code>@​MichaReiser</code></a></li>
<li><a
href="https://github.com/Dev-X25874"><code>@​Dev-X25874</code></a></li>
</ul>
<h2>0.0.39</h2>
<p>Released on 2026-05-22.</p>
<p>This release removes the Python 3.9 branches from our vendored
standard library stubs. ty now only has &quot;full&quot; support for
Python 3.10 and later, but will still report version-specific syntax
errors and other diagnostics when <code>--python-version 3.9</code>
is provided via the CLI.</p>
<h3>Bug fixes</h3>
<ul>
<li>Avoid panicking on <code>__new__</code> assignments to classes (<a
href="https://redirect.github.com/astral-sh/ruff/pull/25282">#25282</a>)</li>
<li>Preserve declaration order when synthesizing class fields (<a
href="https://redirect.github.com/astral-sh/ruff/pull/25249">#25249</a>)</li>
<li>Respect <code>dict</code>-compatible fallbacks in TypedDict unions
(<a
href="https://redirect.github.com/astral-sh/ruff/pull/25242">#25242</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/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><a
href="https://github.com/astral-sh/ty/commit/32b654a899f1c2cffd9909a89fec19ec53af2d9d"><code>32b654a</code></a>
docs: add Flycheck note to Emacs editor integration (<a
href="https://redirect.github.com/astral-sh/ty/issues/3528">#3528</a>)</li>
<li><a
href="https://github.com/astral-sh/ty/commit/4e1b4e72018457d0cea0efa818ecccd63b3f3f01"><code>4e1b4e7</code></a>
docs: fix broken link and minor wording in suppression.md (<a
href="https://redirect.github.com/astral-sh/ty/issues/3527">#3527</a>)</li>
<li><a
href="https://github.com/astral-sh/ty/commit/0205125174c135d6fc4014244dee374678b61c72"><code>0205125</code></a>
Bump version to 0.0.39 (<a
href="https://redirect.github.com/astral-sh/ty/issues/3516">#3516</a>)</li>
<li><a
href="https://github.com/astral-sh/ty/commit/ae8058d40e641b545bbad046c487e964206a2286"><code>ae8058d</code></a>
Update maturin to v1.13.3 (<a
href="https://redirect.github.com/astral-sh/ty/issues/3494">#3494</a>)</li>
<li><a
href="https://github.com/astral-sh/ty/commit/33b60f8ad0f2da648b867831548a4b8c7985647d"><code>33b60f8</code></a>
Update prek dependencies (<a
href="https://redirect.github.com/astral-sh/ty/issues/3495">#3495</a>)</li>
<li>See full diff in <a
href="https://github.com/astral-sh/ty/compare/0.0.38...0.0.40">compare
view</a></li>
</ul>
</details>
<br />

Updates `ruff` from 0.15.14 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>
</blockquote>
</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.14...0.15.15">compare
view</a></li>
</ul>
</details>
<br />


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 <dependency name> major version` will close this
group update PR and stop Dependabot creating any more for the specific
dependency's major version (unless you unignore this specific
dependency's major version or upgrade to it yourself)
- `@dependabot ignore <dependency name> minor version` will close this
group update PR and stop Dependabot creating any more for the specific
dependency's minor version (unless you unignore this specific
dependency's minor version or upgrade to it yourself)
- `@dependabot ignore <dependency name>` will close this group update PR
and stop Dependabot creating any more for the specific dependency
(unless you unignore this specific dependency or upgrade to it yourself)
- `@dependabot unignore <dependency name>` will remove all of the ignore
conditions of the specified dependency
- `@dependabot unignore <dependency name> <ignore condition>` will
remove the ignore condition of the specified dependency and ignore
conditions


</details>

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-05-31 15:33:30 -07:00
2026-05-31 13:02:15 -07:00
2026-05-17 16:51:00 -07:00
2026-05-31 14:48:51 -07:00
2026-05-31 15:13:37 -07:00
2026-05-31 15:26:13 -07:00
2026-05-31 15:13:37 -07:00
2026-05-18 05:32:25 -07:00
2026-03-02 05:13:04 -08:00
2026-01-28 13:36:34 -08:00
2026-05-31 15:27:53 -07:00

🤖 Free Claude Code

Use Claude Code CLI, VS Code, JetBrains ACP, or chat bots through your own Anthropic-compatible proxy.

License: MIT Python 3.14 uv Tested with Pytest Type checking: Ty Code style: Ruff Logging: Loguru

Free Claude Code routes Anthropic Messages API traffic from Claude Code to any provider. It keeps Claude Code's client-side protocol stable while letting you choose free, paid, or local models.

Quick Start · Providers · Clients · Integrations · Development

Free Claude Code in action

Star History

What You Get

  • Drop-in proxy for Claude Code's Anthropic API calls.
  • Seventeen provider backends: NVIDIA NIM, OpenRouter, Google AI Studio (Gemini), DeepSeek, Mistral La Plateforme, Mistral Codestral, OpenCode Zen, OpenCode Go, Wafer, Kimi, Cerebras Inference, Groq, Fireworks AI, Z.ai, LM Studio, llama.cpp, and Ollama.
  • Per-model routing: send Opus, Sonnet, Haiku, and fallback traffic to different providers.
  • Native Claude Code /model picker support through the proxy's /v1/models endpoint (Claude Code must opt in to Gateway model discovery; see Model Picker).
  • Streaming, tool use, reasoning/thinking block handling, and local request optimizations.
  • Optional Discord or Telegram bot wrapper for remote coding sessions.
  • Optional Usage through the VSCode extension.
  • Optional voice-note transcription through local Whisper or NVIDIA NIM.
  • Local Admin UI at /admin to edit supported proxy settings, validate changes, and check providers (loopback access only).

Quick Start

1. Install/Update The Proxy

macOS/Linux:

curl -fsSL "https://github.com/Alishahryar1/free-claude-code/blob/main/scripts/install.sh?raw=1" | sh

Windows PowerShell:

irm "https://github.com/Alishahryar1/free-claude-code/blob/main/scripts/install.ps1?raw=1" | iex

Review the installers at scripts/install.sh and scripts/install.ps1.

2. Start The Proxy

fcc-server

After startup, Uvicorn prints the proxy bind address and the app logs the admin URL:

INFO:     Admin UI: http://127.0.0.1:8082/admin (local-only)

Many terminals make these clickable. Use your configured PORT if it is not 8082.

3. Open The Admin UI And Configure NVIDIA NIM

Open the Admin UI URL from the terminal output.

Need an NVIDIA NIM API key? Use the NVIDIA NIM provider section below, then scroll back up here.

Local admin UI for proxy settings

Paste your NVIDIA NIM API key into NVIDIA_NIM_API_KEY, then click Validate and Apply.

The default model is already set to nvidia_nim/nvidia/nemotron-3-super-120b-a12b. You can change it later from the same Admin UI.

4. Run Claude Code

fcc-claude

fcc-claude reads the current configured port and auth token each time it starts, sets the Claude Code environment variables (including a 190k-token CLAUDE_CODE_AUTO_COMPACT_WINDOW for auto-compaction), and then launches the real claude command.

Choose A Provider

Pick one provider, enter its key or local URL in the Admin UI, and set MODEL to a provider-prefixed model slug. MODEL is the fallback. MODEL_OPUS, MODEL_SONNET, and MODEL_HAIKU can override routing for Claude Code's model tiers.

1. NVIDIA NIM

Get a key at build.nvidia.com/settings/api-keys.

In the Admin UI, paste it into NVIDIA_NIM_API_KEY. The default MODEL is nvidia_nim/nvidia/nemotron-3-super-120b-a12b.

Popular examples:

  • nvidia_nim/nvidia/nemotron-3-super-120b-a12b
  • nvidia_nim/z-ai/glm5.1
  • nvidia_nim/moonshotai/kimi-k2.5
  • nvidia_nim/minimaxai/minimax-m2.5

Browse models at build.nvidia.com.

2. OpenRouter

Get a key at openrouter.ai/keys.

In the Admin UI, paste it into OPENROUTER_API_KEY, then set MODEL to an OpenRouter slug such as open_router/openrouter/free.

Browse all models or free models.

3. Google AI Studio (Gemini)

Get a Gemini API key at Google AI Studio (see Google's Gemini OpenAI compatibility docs).

In the Admin UI, paste it into GEMINI_API_KEY, then set MODEL to a Gemini model slug such as gemini/models/gemini-3.1-flash-lite.

The Gemini API exposes an OpenAI-compatible endpoint at https://generativelanguage.googleapis.com/v1beta/openai/. Free tier quotas are per-model; prompts may be used to improve Google's products outside the UK/CH/EEA/EU unless your account region says otherwise—see Google's terms.

Popular examples:

  • gemini/models/gemini-3.1-flash-lite

4. DeepSeek

Get a key at platform.deepseek.com/api_keys.

In the Admin UI, paste it into DEEPSEEK_API_KEY, then set MODEL to a DeepSeek slug such as deepseek/deepseek-chat.

This provider uses DeepSeek's Anthropic-compatible endpoint, not the OpenAI chat-completions endpoint.

5. Mistral La Plateforme

Mistral hosts an OpenAI-compatible Chat Completions API at https://api.mistral.ai/v1. Activate the Experiment plan on console.mistral.ai for free-tier API access with rate limits (upgrade for higher quotas).

In the Admin UI, paste your API key into MISTRAL_API_KEY, then set MODEL to a Mistral model slug such as mistral/devstral-small-latest or mistral/mistral-small-latest.

Popular examples:

  • mistral/devstral-small-latest
  • mistral/mistral-small-latest

Browse models at Mistral documentation.

6. Mistral Codestral

Mistral's Codestral gateway uses a separate API key from La Plateforme: provision CODESTRAL_API_KEY, then route with the mistral_codestral/ prefix. The default upstream is https://codestral.mistral.ai/v1 (OpenAI-compatible Chat Completions; same request shaping as the mistral provider). See Mistral's coding / FIM domains; the curated free LLM API list summarizes typical Codestral access terms.

Popular examples:

  • mistral_codestral/codestral-latest

7. OpenCode Zen

Get an API key at opencode.ai/auth.

In the Admin UI, paste it into OPENCODE_API_KEY, then set MODEL to an OpenCode Zen model slug such as opencode/gpt-5.3-codex. The same OPENCODE_API_KEY powers OpenCode Go (below); use opencode_go/ slugs there.

OpenCode Zen is a curated model gateway that provides access to models from Anthropic, OpenAI, Google, DeepSeek, and more through a single API key and OpenAI-compatible endpoint at https://opencode.ai/zen/v1.

Popular examples:

  • opencode/gpt-5.3-codex
  • opencode/claude-sonnet-4
  • opencode/deepseek-v4-flash-free (free)
  • opencode/gemini-3-flash
  • opencode/big-pickle (free)
  • opencode/glm-5.1

Browse available models at opencode.ai.

8. OpenCode Go

Get an API key at opencode.ai/auth (same as OpenCode Zen).

In the Admin UI, use OPENCODE_API_KEY, then set MODEL to an OpenCode Go model slug such as opencode_go/minimax-m2.7.

OpenCode Go is a subscription gateway with its own curated catalog and OpenAI-compatible endpoint at https://opencode.ai/zen/go/v1. It shares the same OpenCode API key as Zen; only the slug prefix (opencode_go/ vs opencode/) and upstream path differ.

Popular examples:

  • opencode_go/minimax-m2.7

Browse available models at opencode.ai.

9. Wafer

Get a key from wafer.ai. In the Admin UI, paste it into WAFER_API_KEY, then set MODEL to a Wafer Pass model such as wafer/DeepSeek-V4-Pro.

Popular examples:

  • wafer/DeepSeek-V4-Pro
  • wafer/MiniMax-M2.7
  • wafer/Qwen3.5-397B-A17B
  • wafer/GLM-5.1

This provider uses Wafer's Anthropic-compatible endpoint at https://pass.wafer.ai/v1/messages.

10. Kimi

Get a key at platform.moonshot.ai/console/api-keys.

In the Admin UI, paste it into KIMI_API_KEY, then set MODEL to a Kimi slug such as kimi/kimi-k2.5.

This provider calls Kimi's Anthropic-compatible Messages API (https://api.moonshot.ai/anthropic/v1/messages; model discovery uses OpenAI-compat GET https://api.moonshot.ai/v1/models). It is not the OpenAI Chat Completions path.

Browse models at platform.moonshot.ai.

11. Cerebras Inference

Sign up and create an API key in the Cerebras Cloud Console (see Quickstart).

In the Admin UI, set CEREBRAS_API_KEY, then route with MODEL such as cerebras/llama3.1-8b or cerebras/gpt-oss-120b (ids from List models).

Cerebras exposes an OpenAI-compatible API at https://api.cerebras.ai/v1 (OpenAI compatibility). Non-standard request fields should go in extra_body when using the OpenAI client; see the same page. For reasoning models and parameters, see Reasoning. This proxy follows other OpenAI-compat adapters for thinking via reasoning_content when Claude-style thinking is enabled.

12. Groq

Get an API key at console.groq.com/keys.

In the Admin UI, paste it into GROQ_API_KEY, then set MODEL to a Groq OpenAI-compat model slug such as groq/llama-3.3-70b-versatile.

Groq routes through https://api.groq.com/openai/v1 (OpenAI-compatible Chat Completions). Some request fields yield HTTP 400; this adapter strips known-unsupported shapes (documented in Groq's compatibility notes).

Reasoning-heavy models expose extra knobs documented under Groq reasoning. This release mirrors other OpenAI-compat adapters for thinking via reasoning_content deltas when Claude-style thinking is enabled; you can tune advanced parameters through request extra_body when needed.

Browse models at console.groq.com/docs/models.

13. Fireworks AI

Get an API key at fireworks.ai/account/api-keys.

In the Admin UI, paste it into FIREWORKS_API_KEY, then set MODEL to a Fireworks model slug such as fireworks/accounts/fireworks/models/llama-v3p3-70b-instruct.

Fireworks exposes an Anthropic-compatible Messages API at https://api.fireworks.ai/inference/v1/messages (same inference host as before; Chat Completions is not used here). Vendor-specific JSON keys can still be merged from request extra_body when allowed.

Browse models at fireworks.ai/models.

14. Z.ai

Get an API key at Z.ai/manage-apikey/apikey-list.

In the Admin UI, paste it into ZAI_API_KEY, then set MODEL to a Z.ai model slug such as zai/glm-5.1.

This provider calls Z.ai's Anthropic-compatible Messages API (https://api.z.ai/api/anthropic/v1/messages). The former OpenAI Coding Plan base (https://api.z.ai/api/coding/paas/v4) is not used by this gateway.

Popular examples:

  • zai/glm-5.1
  • zai/glm-5-turbo

Browse models at Z.ai.

15. LM Studio

Start LM Studio's local server and load a model. In the Admin UI, keep or update LM_STUDIO_BASE_URL, then set MODEL to the model identifier shown by LM Studio, prefixed with lmstudio/.

Prefer models with tool-use support for Claude Code workflows.

16. llama.cpp

Start llama-server with an Anthropic-compatible /v1/messages endpoint and enough context for Claude Code requests.

In the Admin UI, keep or update LLAMACPP_BASE_URL, then set MODEL to the local model slug, prefixed with llamacpp/.

For local coding models, context size matters. If llama.cpp returns HTTP 400 for normal Claude Code requests, increase --ctx-size and verify the model/server build supports the requested features.

17. Ollama

Run Ollama and pull a model:

ollama pull llama3.1
ollama serve

In the Admin UI, keep or update OLLAMA_BASE_URL, then set MODEL to the same tag shown by ollama list, prefixed with ollama/.

OLLAMA_BASE_URL is the Ollama server root; do not append /v1. Example model slugs include ollama/llama3.1 and ollama/llama3.1:8b.

18. Mix Providers By Model Tier

Each model tier can use a different provider by setting MODEL_OPUS, MODEL_SONNET, and MODEL_HAIKU in the Admin UI. Leave a tier blank to inherit MODEL.

For example, you can route Opus to nvidia_nim/moonshotai/kimi-k2.6, Sonnet to open_router/openrouter/free, Haiku to lmstudio/qwen3.5-coder, and keep the fallback MODEL on zai/glm-5.1.

Connect Claude Code

1. Claude Code CLI

For terminal use, prefer the installed launcher:

fcc-claude

Keep fcc-server running while you work. The Admin UI manages proxy config, restarts the server when runtime settings change, and fcc-claude reads the current Admin UI-managed port and auth token every time it starts. It also sets CLAUDE_CODE_AUTO_COMPACT_WINDOW to 190000 for auto-compaction.

2. VS Code Extension

Open Settings, search for claude-code.environmentVariables, choose Edit in settings.json, and add:

"claudeCode.environmentVariables": [
  { "name": "ANTHROPIC_BASE_URL", "value": "http://localhost:8082" },
  { "name": "ANTHROPIC_AUTH_TOKEN", "value": "freecc" },
  { "name": "CLAUDE_CODE_ENABLE_GATEWAY_MODEL_DISCOVERY", "value": "1" },
  { "name": "CLAUDE_CODE_AUTO_COMPACT_WINDOW", "value": "190000" }
]

Reload the extension. If the extension shows a login screen, choose the Anthropic Console path once; the local proxy still handles model traffic after the environment variables are active.

3. JetBrains ACP

Edit the installed Claude ACP config:

  • Windows: C:\Users\%USERNAME%\AppData\Roaming\JetBrains\acp-agents\installed.json
  • Linux/macOS: ~/.jetbrains/acp.json

Set the environment for acp.registry.claude-acp:

"env": {
  "ANTHROPIC_BASE_URL": "http://localhost:8082",
  "ANTHROPIC_AUTH_TOKEN": "freecc",
  "CLAUDE_CODE_ENABLE_GATEWAY_MODEL_DISCOVERY": "1",
  "CLAUDE_CODE_AUTO_COMPACT_WINDOW": "190000"
}

Restart the IDE after changing the file.

4. Model Picker

Claude Code model picker showing gateway models

Optional Integrations

For every integration below, change managed proxy settings only in the Admin UI at /admin: edit fields, click Validate, then Apply. The footer shows where the managed config is stored; this README does not walk through editing that file by hand.

1. Discord And Telegram Bots

The bot wrapper runs Claude Code sessions remotely, streams progress, supports reply-based conversation branches, and can stop or clear tasks.

Discord

  1. Create the bot in the Discord Developer Portal.
  2. Enable Message Content Intent.
  3. Invite the bot with read, send, and message history permissions.
  4. Copy the bot token and the numeric channel ID (or IDs) where the bot should respond.

Telegram

  1. Create a bot with @BotFather and copy the bot token.
  2. Get your numeric user ID from @userinfobot so only you can use the bot.

Configure in the Admin UI

  1. With fcc-server running, open the Admin UI URL from the terminal output.
  2. In the sidebar, choose Messaging.
  3. Set Messaging Platform to discord or telegram.
  4. For Discord, paste Discord Bot Token and Allowed Discord Channels. For Telegram, paste Telegram Bot Token and Allowed Telegram User ID.
  5. Set Allowed Directory to an absolute path on the machine running the proxy—the workspace root the bot may use.
  6. Click Validate, then Apply. Restart the server if the UI says one is required.
Admin UI Messaging view with bot and voice settings

Admin UI → Messaging (platform, bots, and Voice)

Useful commands

  • /stop cancels a task; reply to a task message to stop only that branch.
  • /clear resets sessions; reply to clear one branch.
  • /stats shows session state.

2. Voice Notes

Voice notes work on Discord and Telegram after you extend your Free Claude Code install with the matching optional extras.

macOS/Linux:

# NVIDIA NIM transcription (Riva gRPC)
curl -fsSL "https://github.com/Alishahryar1/free-claude-code/blob/main/scripts/install.sh?raw=1" | sh -s -- --voice-nim

# Local Whisper (CPU or CUDA)
curl -fsSL "https://github.com/Alishahryar1/free-claude-code/blob/main/scripts/install.sh?raw=1" | sh -s -- --voice-local

# Both backends
curl -fsSL "https://github.com/Alishahryar1/free-claude-code/blob/main/scripts/install.sh?raw=1" | sh -s -- --voice-all

# Local Whisper with CUDA
curl -fsSL "https://github.com/Alishahryar1/free-claude-code/blob/main/scripts/install.sh?raw=1" | sh -s -- --voice-local --torch-backend cu130

Windows PowerShell:

# NVIDIA NIM transcription (Riva gRPC)
& ([scriptblock]::Create((irm "https://github.com/Alishahryar1/free-claude-code/blob/main/scripts/install.ps1?raw=1"))) -VoiceNim

# Local Whisper (CPU or CUDA)
& ([scriptblock]::Create((irm "https://github.com/Alishahryar1/free-claude-code/blob/main/scripts/install.ps1?raw=1"))) -VoiceLocal

# Both backends
& ([scriptblock]::Create((irm "https://github.com/Alishahryar1/free-claude-code/blob/main/scripts/install.ps1?raw=1"))) -VoiceAll

# Local Whisper with CUDA
& ([scriptblock]::Create((irm "https://github.com/Alishahryar1/free-claude-code/blob/main/scripts/install.ps1?raw=1"))) -VoiceLocal -TorchBackend cu130

Restart fcc-server after reinstalling.

In the Admin UI, open Messaging and scroll to Voice. Turn on Voice Notes, choose Whisper Device (cpu, cuda, or nvidia_nim), set Whisper Model, and enter Hugging Face Token when your setup needs it. For nvidia_nim transcription, install the voice extra and set NVIDIA NIM API Key on the Providers view. The screenshot above shows the Voice block in the same view.

How It Works

Free Claude Code request flow architecture

Diagram source: assets/how-it-works.mmd.

Important pieces:

  • FastAPI exposes Anthropic-compatible routes such as /v1/messages, /v1/messages/count_tokens, and /v1/models.
  • Model routing resolves the Claude model name to MODEL_OPUS, MODEL_SONNET, MODEL_HAIKU, or MODEL.
  • NIM, OpenCode Zen, and OpenCode Go use OpenAI chat streaming translated into Anthropic SSE.
  • Wafer, OpenRouter, DeepSeek, Kimi, Fireworks AI, Z.ai, LM Studio, llama.cpp, and Ollama use Anthropic Messages style transports where applicable (with provider-specific quirks and model-list URLs).
  • The proxy normalizes thinking blocks, tool calls, token usage metadata, and provider errors into the shape Claude Code expects.
  • Request optimizations answer trivial Claude Code probes locally to save latency and quota.

Development

1. Project Structure

free-claude-code/
├── server.py              # ASGI entry point
├── api/                   # FastAPI routes, service layer, routing, optimizations
├── core/                  # Shared Anthropic protocol helpers and SSE utilities
├── providers/             # Provider transports, registry, rate limiting
├── messaging/             # Discord/Telegram adapters, sessions, voice
├── cli/                   # Package entry points and Claude process management
├── config/                # Settings, provider catalog, logging
└── tests/                 # Unit and contract tests

2. Run From Source

Use this path if you are developing or want to run directly from a checkout:

git clone https://github.com/Alishahryar1/free-claude-code.git
cd free-claude-code
uv run uvicorn server:app --host 0.0.0.0 --port 8082

3. Commands

uv run ruff format
uv run ruff check
uv run ty check
uv run pytest

Run them in that order before pushing. CI enforces the same checks.

4. Package Scripts

pyproject.toml installs:

  • fcc-server: starts the proxy with configured host and port.
  • fcc-init: optional advanced scaffold for ~/.fcc/.env; prefer the Admin UI for normal configuration.
  • fcc-claude: launches Claude Code with the configured local proxy URL, auth token, model discovery flag, and a 190k CLAUDE_CODE_AUTO_COMPACT_WINDOW for auto-compaction.
  • free-claude-code: compatibility alias for fcc-server.

5. Extending

  • Add OpenAI-compatible providers by extending OpenAIChatTransport.
  • Add Anthropic Messages providers by extending AnthropicMessagesTransport.
  • Register provider metadata in config.provider_catalog and factory wiring in providers.registry.
  • Add messaging platforms by implementing the MessagingPlatform interface in messaging/.

Contributing

  • .env.example lists env key names as a read-only reference for contributors; use the Admin UI to change managed proxy settings.
  • Report bugs and feature requests in Issues.
  • Keep changes small and covered by focused tests.
  • Do not open Docker integration PRs.
  • Do not open README change PRs just open an issue for it.
  • Run the full check sequence before opening a pull request.
  • The syntax except X, Y is brought back in python 3.14 final version (not in 3.14 alpha). Keep in mind before opening PRs.

License

MIT License. See LICENSE for details.

S
Description
Use claude-code for free in the terminal, VSCode extension or via discord like openclaw
Readme MIT 15 MiB
Languages
Python 97.7%
JavaScript 0.8%
PowerShell 0.5%
Shell 0.4%
CSS 0.4%
Other 0.2%