Bumps the major group in /libs/cli/js-examples with 1 update: [dotenv](https://github.com/motdotla/dotenv). Updates `dotenv` from 17.4.2 to 18.0.4 <details> <summary>Changelog</summary> <p><em>Sourced from <a href="https://github.com/motdotla/dotenv/blob/master/CHANGELOG.md">dotenv's changelog</a>.</em></p> <blockquote> <h2><a href="https://github.com/motdotla/dotenv/compare/v18.0.3...v18.0.4">18.0.4</a> (2026-09-25)</h2> <h3>Changed</h3> <ul> <li><code>import dotenv/config</code> should default quiet: true (<a href="https://redirect.github.com/motdotla/dotenv/pull/1063">#1063</a>)</li> </ul> <h2><a href="https://github.com/motdotla/dotenv/compare/v18.0.2...v18.0.3">18.0.3</a> (2026-09-22)</h2> <h3>Changed</h3> <ul> <li>Patch <code>DOTENV_QUIET</code> setting when inside .env file (<a href="https://redirect.github.com/motdotla/dotenv/pull/1059">#1059</a>)</li> </ul> <h2><a href="https://github.com/motdotla/dotenv/compare/v18.0.1...v18.0.2">18.0.2</a> (2026-09-21)</h2> <h3>Changed</h3> <ul> <li>Patch additional edge cases for the fast parser (<a href="https://redirect.github.com/motdotla/dotenv/pull/1056">#1056</a>)</li> </ul> <h2><a href="https://github.com/motdotla/dotenv/compare/v18.0.0...v18.0.1">18.0.1</a> (2026-09-18)</h2> <h3>Changed</h3> <ul> <li>Handle file urls in config logging (<a href="https://redirect.github.com/motdotla/dotenv/pull/1054">#1054</a>)</li> </ul> <h2><a href="https://github.com/motdotla/dotenv/compare/v17.4.2...v18.0.0">18.0.0</a> (2026-09-17)</h2> <h3>Added</h3> <ul> <li>NEW: Dotenv now has a CLI. (<a href="https://redirect.github.com/motdotla/dotenv/pull/1022">#1022</a>)</li> </ul> <pre lang="sh"><code>$ dotenv run -- node index.js ◇ injected env (2) from .env Hello Dotenv </code></pre> <ul> <li>NEW: Dotenv now has a fast parser thanks to <a href="https://github.com/homanp"><code>@homanp</code></a> of <a href="https://superagent.sh">superagent.sh</a>. Pass <code>config({ fast: true })</code>, flag <code>--fast</code>, or set <code>DOTENV_FAST=true</code> to opt-in to ~2x faster character-scanner parser. (<a href="https://redirect.github.com/motdotla/dotenv/pull/1010">#1010</a>)</li> </ul> <pre lang="sh"><code>$ dotenv run --fast -- node index.js ◇ injected env (2) from .env Hello Dotenv </code></pre> <p><a href="https://dotenvx.com/blog/2026/09/28/dotenv-fast.html">faster than Node native parseEnv!</a></p> <h3>Changed</h3> <ul> <li>Injecting message sent to stderr rather than stdout and tips removed (<a href="https://redirect.github.com/motdotla/dotenv/pull/1037">#1037</a>)</li> </ul> <!-- raw HTML omitted --> </blockquote> <p>... (truncated)</p> </details> <details> <summary>Commits</summary> <ul> <li><a href="https://github.com/motdotla/dotenv/commit/86804c0507aff98d3a82204759729af3bc2ce1a9"><code>86804c0</code></a> 18.0.4</li> <li><a href="https://github.com/motdotla/dotenv/commit/2403db57c3f8b01123d69a8b441a5f8b828fab3c"><code>2403db5</code></a> changelog</li> <li><a href="https://github.com/motdotla/dotenv/commit/75b775eda45af3085fb7a7de6ae2613eb646807e"><code>75b775e</code></a> npm audit</li> <li><a href="https://github.com/motdotla/dotenv/commit/7e1750ce8034b3c9485f1e1722587a40890449e1"><code>7e1750c</code></a> Merge pull request <a href="https://redirect.github.com/motdotla/dotenv/issues/1064">#1064</a> from motdotla/dependabot/npm_and_yarn/ip-address-10.7.2</li> <li><a href="https://github.com/motdotla/dotenv/commit/a6ade63b6fa94a78fdc68f815c4e88cfe8781774"><code>a6ade63</code></a> Merge pull request <a href="https://redirect.github.com/motdotla/dotenv/issues/1063">#1063</a> from motdotla/import</li> <li><a href="https://github.com/motdotla/dotenv/commit/288b0d7cd85d8deba3f91a995abd033786626a8d"><code>288b0d7</code></a> patch test</li> <li><a href="https://github.com/motdotla/dotenv/commit/00da9125dd7633a121d169a3a55b62a686b64ef8"><code>00da912</code></a> Bump ip-address from 10.2.0 to 10.7.2</li> <li><a href="https://github.com/motdotla/dotenv/commit/e6b58161d2f2b1448c735b1f6555bde7a20443b7"><code>e6b5816</code></a> import 'dotenv/config' should still be defaulting to quiet</li> <li><a href="https://github.com/motdotla/dotenv/commit/3646ac5e5d000f5f68fe83db52399010f9cb781f"><code>3646ac5</code></a> Merge pull request <a href="https://redirect.github.com/motdotla/dotenv/issues/1061">#1061</a> from motdotla/fast</li> <li><a href="https://github.com/motdotla/dotenv/commit/83fc961f92f6c330833da4a5f5dc7093d539501e"><code>83fc961</code></a> report dotenv vs native vs dotenv.fast</li> <li>Additional commits viewable in <a href="https://github.com/motdotla/dotenv/compare/v17.4.2...v18.0.4">compare view</a></li> </ul> </details> <br /> [](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) --- <details> <summary>Dependabot commands and options</summary> <br /> You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot show <dependency name> ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore <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> Co-authored-by: John Kennedy <jkennedyvz@users.noreply.github.com> Co-authored-by: open-swe[bot] <open-swe@users.noreply.github.com>
LangGraph Python SDK
To help you ship LangGraph apps to production faster, check out LangSmith. LangSmith is a unified developer platform for building, testing, and monitoring LLM applications.
Quick Install
uv add langgraph-sdk
🤔 What is this?
This library provides the Python SDK for interacting with the LangGraph API. Use it to connect to a running LangGraph API server, manage assistants and threads, and stream runs from Python applications.
You will need a running LangGraph API server. If you're running a server locally using langgraph-cli, the SDK will automatically point at http://localhost:8123; otherwise, specify the server URL when creating a client.
📖 Documentation
For full documentation, see the API reference. For conceptual guides and tutorials, see the LangGraph Docs.
Quick Start
from langgraph_sdk import get_client
# If you're using a remote server, initialize the client with `get_client(url=REMOTE_URL)`
client = get_client()
# List all assistants
assistants = await client.assistants.search()
# We auto-create an assistant for each graph you register in config.
agent = assistants[0]
# Start a new thread
thread = await client.threads.create()
# Start a streaming run
input = {"messages": [{"role": "human", "content": "what's the weather in la"}]}
async for chunk in client.runs.stream(
thread["thread_id"], agent["assistant_id"], input=input
):
print(chunk)
Known Limitations
- WebSocket transport requires
websockets>=14and is only available on the async client (AsyncThreadStream). The sync client (SyncThreadStream) uses SSE exclusively. thread.extensions[name]opens a new subscription each time the same name is accessed. Assign the projection to a variable and reuse it within a single session rather than re-indexing across multiple iterations.- Sync streaming drives the lifecycle watcher in a background thread. Long-lived sync sessions will hold that thread open until the context manager exits.
- Reconnect attempts are limited to 5 by default for both the shared SSE fan-out and the lifecycle watcher. Persistent network partitions will surface as
RuntimeErroron in-flight projections.
Thread-Centric Streaming (v3)
client.threads.stream() returns a context manager that owns the SSE session for one thread. Typed projections — values snapshots, message streams, tool calls, custom events — all share the same underlying connection.
from langgraph_sdk import get_client
import asyncio
client = get_client()
async with client.threads.stream(
thread_id="my-thread",
assistant_id="agent",
) as thread:
await thread.run.start(input={"messages": [{"role": "user", "content": "hi"}]})
# Start all consumers concurrently so they share one SSE connection.
async def get_messages():
return [s async for s in thread.messages]
async def get_tool_calls():
return [c async for c in thread.tool_calls]
messages, tool_calls = await asyncio.gather(get_messages(), get_tool_calls())
for stream in messages:
print(await stream.text) # accumulated text
final = await thread.output # terminal state values
📕 Releases & Versioning
See our Releases and Versioning policies.
💁 Contributing
As an open-source project in a rapidly developing field, we are extremely open to contributions, whether it be in the form of a new feature, improved infrastructure, or better documentation.
For detailed information on how to contribute, see the Contributing Guide.