@langchain/langgraph-sdkThe JavaScript / TypeScript SDK for talking to a LangGraph API server. Use it to create and manage assistants, threads, runs, cron schedules, and the KV store — and, most importantly, to stream graph executions in real time.
pnpm add @langchain/langgraph-sdk
# or: npm install @langchain/langgraph-sdk
# or: yarn add @langchain/langgraph-sdk
import { Client } from "@langchain/langgraph-sdk";
const client = new Client({ apiUrl: "http://localhost:2024" });
// Open a thread-centric stream (the recommended way to stream).
const thread = client.threads.stream({ assistantId: "my-agent" });
await thread.run.start({
input: { messages: [{ role: "user", content: "hello" }] },
});
for await (const message of thread.messages) {
for await (const token of message.text) {
process.stdout.write(token);
}
}
console.log(await thread.output);
await thread.close();
With no apiUrl, the SDK points at http://localhost:2024 (the
default langgraph dev URL).
| Sub-client | Purpose | Docs |
|---|---|---|
client.threads |
Create threads, manage state, and stream runs. | Threads · Streaming |
client.assistants |
CRUD for assistants (schemas, graphs, versions). | Assistants |
client.runs |
Trigger / join / cancel runs without streaming. | Runs (legacy) |
client.crons |
Schedule recurring runs. | Crons |
client.store |
Namespaced KV + semantic store. | Store |
client.threads.stream(...) returns a ThreadStream
with typed, lazy projections for every aspect of a run:
thread.messages / thread.toolCalls — assembled chat output.thread.values / thread.output — graph state and final answer.thread.interrupts / thread.interrupted — human-in-the-loop.thread.subgraphs / thread.subagents — nested / deep-agent work.thread.extensions.<name> — typed custom server projections.thread.audio / thread.images / thread.video / thread.files
— media.Deprecated. The generator-based streaming APIs on
client.runs.*(stream,joinStream) andclient.threads.joinStreamare preserved for backwards compatibility only. New code should useclient.threads.stream(...). See Runs (legacy) for migration guidance.
Streaming defaults to Server-Sent Events (SSE) over HTTP. You can
switch to WebSocket per-call or globally, or plug in a custom
AgentServerAdapter:
const thread = client.threads.stream({
assistantId: "my-agent",
transport: "websocket",
});
See Transports for full details.
If you're building a UI, use the framework-specific packages that wrap this SDK:
@langchain/langgraph-sdk/react@langchain/langgraph-sdk/vue@langchain/langgraph-sdk/svelte@langchain/langgraph-sdk/angularUse the SDK directly when you need low-level control, run it from a non-browser environment (Node.js server, edge workers, scripts), or integrate into a framework that does not yet have a first-party adapter.
The client code is organized into sub-client modules under
src/client/:
| Path | Module |
|---|---|
client/assistants/ |
AssistantsClient |
client/threads/ |
ThreadsClient (includes the v2 stream(...) primitive) |
client/runs/ |
RunsClient (legacy streaming + CRUD) |
client/crons/ |
CronsClient |
client/store/ |
StoreClient |
client/stream/ |
ThreadStream, assemblers, transports |
client/base.ts |
BaseClient, shared config & helpers |
client/index.ts |
Main Client class & re-exports |
See CHANGELOG.md.
Public v1 name for TransportAdapter plus optional high-level
Typed error thrown through media.stream / rejected from
Incrementally assembles messages events into complete message objects.
Error wrapper for protocol-level error responses returned by the server.
Transport adapter that speaks the thread-centric protocol over HTTP
Transport adapter that speaks the thread-centric protocol over a
Async iterable handle for raw event subscriptions.
High-level wrapper around a protocol connection to a specific thread.
Public v1 name for TransportAdapter plus optional high-level
Typed error thrown through media.stream / rejected from
Incrementally assembles messages events into complete message objects.
Error wrapper for protocol-level error responses returned by the server.
Transport adapter that speaks the thread-centric protocol over HTTP
Transport adapter that speaks the thread-centric protocol over a
Async iterable handle for raw event subscriptions.
High-level wrapper around a protocol connection to a specific thread.
Transport used to stream the thread.
Manages subagent execution state.
Ref-counted, thread-aware projection registry.
Coordinates one thread's protocol-v2 stream and exposes stable
Typed error thrown through media.stream / rejected from
Framework-agnostic orchestrator for custom transport streams.
Transport used to stream the thread.
Tracks pending server-side runs created via multitaskStrategy: "enqueue".
Framework-agnostic orchestrator for LangGraph Platform streams.
Manages subagent execution state.
Check if the provided user was provided by LangGraph Studio.
Maps a protocol event method to its subscription channel.
Returns whether an event should be delivered for a subscription definition.
Get the API key from the environment.
Strip headless-tool interrupts from a user-facing interrupt list.
Execute and resume all newly seen headless-tool interrupts from a values
Get the API key from the environment.
Overrides the fetch implementation used for LangSmith calls.
Parses a headless-tool interrupt value from the graph. Accepts both
Retrieves the global logger instance for LangGraph Platform.
Calculates the depth of a subagent based on its namespace.
Extracts the parent tool call ID from a namespace.
Extracts the tool call ID from a namespace path.
Strip headless-tool interrupts from a user-facing interrupt list.
Execute and resume all newly seen headless-tool interrupts from a values
Checks if a namespace indicates a subagent/subgraph message.
Parses a headless-tool interrupt value from the graph. Accepts both
Helper to send and persist UI messages. Accepts a map of component names to React components
Convenience: given the raw assembled message + the role captured
Produce a BaseMessage class instance from an in-progress or
Calculates the depth of a subagent based on its namespace.
Converts plain message objects within each history state's values
Ensures all messages in an array are BaseMessage class instances.
Extracts the parent tool call ID from a namespace.
Extracts the tool call ID from a namespace path.
Checks if a namespace indicates a subagent/subgraph message.
If value looks like a HITL request object, expose both the new camelCase
Normalizes HITL interrupt payloads to expose camelCase fields plus deprecated
Applies normalizeInterruptForClient to each interrupt.
Returns true when onFinish declares at least one parameter and therefore
Identity converter that keeps @langchain/core class instances.