Framework to build resilient language agents as graphs. https://docs.langchain.com/oss/javascript/langgraph/
  • TypeScript 98.4%
  • Svelte 1%
  • JavaScript 0.4%
  • Python 0.1%
Find a file
Repository files (latest commit first)
Filename Latest commit message Latest commit date
github-actions[bot] 4030632d3d
chore: version packages (#3238)
This PR was opened by the [Changesets
release](https://github.com/changesets/action) GitHub action. When
you're ready to do a release, you can merge this and the packages will
be published to npm automatically. If you're not ready to do a release
yet, that's fine, whenever you add more changesets to main, this PR will
be updated.


# Releases
## @langchain/langgraph-api@1.7.0

### Minor Changes

- [#3229](https://github.com/langchain-ai/langgraphjs/pull/3229)
[`6fb340e`](6fb340e306)
Thanks [@eliornl](https://github.com/eliornl)! - feat(langgraph-api): a
run that answers interrupts by id tells the thread's other protocol
clients which ones, with an `input.answered` event on the `input`
channel; run streams don't carry it

- [#3225](https://github.com/langchain-ai/langgraphjs/pull/3225)
[`bdec328`](bdec328a80)
Thanks [@eliornl](https://github.com/eliornl)! - feat(langgraph-api):
refuse a stale interrupt answer only when the run asks for it with
`strict_resume`
  
Strict resume, which 1.6.0 turned on for every run, is now opt-in. A run
created with `strict_resume: true` (the same field on the protocol's
`run.start` and `input.respond`) runs the graph in strict resume mode: a
`Command({ resume })` that names an interrupt that isn't pending, is an
empty map, or is one value while several interrupts are pending ends the
run with `UnknownInterruptError`, and the thread keeps its status,
values and interrupts. The error event carries `reason`, `interrupt_ids`
and `pending_ids`. A retried run, and an `interrupt` or `rollback` run
that cancelled one in flight, resume as before. Runs that don't set it
resume as they did before 1.6.0: one value answers every pending
interrupt, and an answer sent twice is a no-op.

### Patch Changes

- [#3227](https://github.com/langchain-ai/langgraphjs/pull/3227)
[`badfe38`](badfe38413)
Thanks [@eliornl](https://github.com/eliornl)! - fix(langgraph-api): the
protocol's `failed` lifecycle event carries the run error's message
instead of the whole error as JSON, and a refused strict resume's
`reason`, `interrupt_ids` and `pending_ids`

- [#3239](https://github.com/langchain-ai/langgraphjs/pull/3239)
[`397e93e`](397e93e0d2)
Thanks [@eliornl](https://github.com/eliornl)! - After a run that forks
from a checkpoint, later runs on the thread continue from its latest
state again. The dev server saved the fork's `checkpoint_id` (and
`checkpoint_ns`, `checkpoint_map` and `run_id`) on the thread config, so
every later run on the thread forked from the same checkpoint and
dropped the new branch.

- [#3190](https://github.com/langchain-ai/langgraphjs/pull/3190)
[`ffe9e60`](ffe9e60a5d)
Thanks [@eliornl](https://github.com/eliornl)! - `GET
/threads/:thread_id/runs/:run_id/join` and `GET
/threads/:thread_id/runs/:run_id/stream` now return HTTP 404 when the
run doesn't exist, is on another thread, or is hidden by the
`threads:read` handler, as `GET /threads/:thread_id/runs/:run_id` does.
`client.runs.join()` and `client.runs.joinStream()` then throw `HTTP
404` instead of returning `{ __error__ }` or yielding an error event,
with or without `lastEventId`.

- [#3231](https://github.com/langchain-ai/langgraphjs/pull/3231)
[`184ce74`](184ce74a7a)
Thanks [@eliornl](https://github.com/eliornl)! - Run streams on the dev
server take the `lifecycle` stream mode: an event named
`lifecycle|<namespace>` when each subgraph starts and when it ends
(`completed`, `failed` or `interrupted`), with the id of the tool call
that started it. `/info` reports `stream_lifecycle`.

- [#3246](https://github.com/langchain-ai/langgraphjs/pull/3246)
[`5d1ceb0`](5d1ceb0016)
Thanks [@eliornl](https://github.com/eliornl)! - fix(langgraph-api): the
protocol's `run.start` reads the multitask strategy from
`multitask_strategy`, falling back to `multitaskStrategy`, on the dev
server and the embed server.

- [#3247](https://github.com/langchain-ai/langgraphjs/pull/3247)
[`95ce066`](95ce066af5)
Thanks [@eliornl](https://github.com/eliornl)! - chore: depend on
@langchain/protocol 0.0.21, which types `input.answered`, and map
`input.answered` to the `input` channel in `inferChannel`. `input`
subscribers now get `input.answered` as well as `input.requested`, so
code that reads `data.interrupt_id` should check `event.method` first.
- Updated dependencies []:
  - @langchain/langgraph-ui@1.7.0
## @langchain/langgraph-sdk@1.14.0

### Minor Changes

- [#3230](https://github.com/langchain-ai/langgraphjs/pull/3230)
[`fe93dbe`](fe93dbed0e)
Thanks [@eliornl](https://github.com/eliornl)! - feat(sdk): hide the
interrupts another client answered when the server sends
`input.answered`, and route that event to the `input` channel

- [#3230](https://github.com/langchain-ai/langgraphjs/pull/3230)
[`fe93dbe`](fe93dbed0e)
Thanks [@eliornl](https://github.com/eliornl)! - feat(sdk): add
`strictResume`, so a server with strict resume refuses an answer to an
interrupt that is no longer waiting. `client.runs.create()`, `stream()`
and `wait()` send it as `strict_resume`, and `useStream`'s `submit()`
passes it on. With `respond()` and `respondAll()`, the refusal is an
`UnknownInterruptError` on `error` with `reason`, `interruptIds` and
`pendingIds`, which `isUnknownInterruptError(error)` recognizes, and the
interrupts still waiting show again.

### Patch Changes

- [#3243](https://github.com/langchain-ai/langgraphjs/pull/3243)
[`c7861c1`](c7861c127a)
Thanks [@eliornl](https://github.com/eliornl)! - `useStream` ignores a
`tools` event of a kind it doesn't know, such as langgraph's own
`tool-started` payload, instead of throwing `Unexpected tool event`
inside a state update, which crashed the app's render.

- [#3247](https://github.com/langchain-ai/langgraphjs/pull/3247)
[`95ce066`](95ce066af5)
Thanks [@eliornl](https://github.com/eliornl)! - chore: depend on
@langchain/protocol 0.0.21, which types `input.answered`, and map
`input.answered` to the `input` channel in `inferChannel`. `input`
subscribers now get `input.answered` as well as `input.requested`, so
code that reads `data.interrupt_id` should check `event.method` first.

- [#3228](https://github.com/langchain-ai/langgraphjs/pull/3228)
[`ebf99fe`](ebf99fe6a4)
Thanks [@eliornl](https://github.com/eliornl)! - Run streams take the
`lifecycle` stream mode, typed as `LifecycleStreamEvent`: an event when
each subgraph starts and ends, with the id of the tool call that started
it.

- [#3246](https://github.com/langchain-ai/langgraphjs/pull/3246)
[`5d1ceb0`](5d1ceb0016)
Thanks [@eliornl](https://github.com/eliornl)! - fix(sdk): `run.start`
sends the multitask strategy as `multitask_strategy`, like the
protocol's other fields, as well as `multitaskStrategy`, which older
servers read.
## @langchain/langgraph-cli@1.7.0

### Patch Changes

- Updated dependencies
[[`badfe38`](badfe38413),
[`397e93e`](397e93e0d2),
[`6fb340e`](6fb340e306),
[`ffe9e60`](ffe9e60a5d),
[`184ce74`](184ce74a7a),
[`5d1ceb0`](5d1ceb0016),
[`bdec328`](bdec328a80),
[`95ce066`](95ce066af5)]:
  - @langchain/langgraph-api@1.7.0
## @langchain/langgraph@1.7.1

### Patch Changes

- [#3241](https://github.com/langchain-ai/langgraphjs/pull/3241)
[`49f86a7`](49f86a7a3b)
Thanks [@eliornl](https://github.com/eliornl)! - feat(langgraph): add
`isUnknownInterruptError`, which matches the error by name like
`isGraphInterrupt`, so it also recognizes an `UnknownInterruptError`
thrown by another copy of `@langchain/langgraph`

- [#3247](https://github.com/langchain-ai/langgraphjs/pull/3247)
[`95ce066`](95ce066af5)
Thanks [@eliornl](https://github.com/eliornl)! - chore: depend on
@langchain/protocol 0.0.21, which types `input.answered`, and map
`input.answered` to the `input` channel in `inferChannel`. `input`
subscribers now get `input.answered` as well as `input.requested`, so
code that reads `data.interrupt_id` should check `event.method` first.

- [#3218](https://github.com/langchain-ai/langgraphjs/pull/3218)
[`ad73c37`](ad73c37142)
Thanks [@eliornl](https://github.com/eliornl)! - Task results in the
`tasks` and `debug` stream modes carry the task's `error` (`null` when
it succeeded), as they do in Python, so a failed task no longer looks
completed.

- [#3226](https://github.com/langchain-ai/langgraphjs/pull/3226)
[`429accb`](429accb738)
Thanks [@eliornl](https://github.com/eliornl)! - docs(langgraph):
`UnknownInterruptError` says each `interrupt()` call in a task has its
own id
- Updated dependencies
[[`c7861c1`](c7861c127a),
[`95ce066`](95ce066af5),
[`fe93dbe`](fe93dbed0e),
[`ebf99fe`](ebf99fe6a4),
[`5d1ceb0`](5d1ceb0016),
[`fe93dbe`](fe93dbed0e)]:
  - @langchain/langgraph-sdk@1.14.0
## @langchain/angular@1.2.12

### Patch Changes

- Updated dependencies
[[`c7861c1`](c7861c127a),
[`95ce066`](95ce066af5),
[`fe93dbe`](fe93dbed0e),
[`ebf99fe`](ebf99fe6a4),
[`5d1ceb0`](5d1ceb0016),
[`fe93dbe`](fe93dbed0e)]:
  - @langchain/langgraph-sdk@1.14.0
## @langchain/react@1.2.12

### Patch Changes

- Updated dependencies
[[`c7861c1`](c7861c127a),
[`95ce066`](95ce066af5),
[`fe93dbe`](fe93dbed0e),
[`ebf99fe`](ebf99fe6a4),
[`5d1ceb0`](5d1ceb0016),
[`fe93dbe`](fe93dbed0e)]:
  - @langchain/langgraph-sdk@1.14.0
## @langchain/svelte@1.2.12

### Patch Changes

- Updated dependencies
[[`c7861c1`](c7861c127a),
[`95ce066`](95ce066af5),
[`fe93dbe`](fe93dbed0e),
[`ebf99fe`](ebf99fe6a4),
[`5d1ceb0`](5d1ceb0016),
[`fe93dbe`](fe93dbed0e)]:
  - @langchain/langgraph-sdk@1.14.0
## @langchain/vue@1.2.12

### Patch Changes

- [#3247](https://github.com/langchain-ai/langgraphjs/pull/3247)
[`95ce066`](95ce066af5)
Thanks [@eliornl](https://github.com/eliornl)! - chore: depend on
@langchain/protocol 0.0.21, which types `input.answered`, and map
`input.answered` to the `input` channel in `inferChannel`. `input`
subscribers now get `input.answered` as well as `input.requested`, so
code that reads `data.interrupt_id` should check `event.method` first.
- Updated dependencies
[[`c7861c1`](c7861c127a),
[`95ce066`](95ce066af5),
[`fe93dbe`](fe93dbed0e),
[`ebf99fe`](ebf99fe6a4),
[`5d1ceb0`](5d1ceb0016),
[`fe93dbe`](fe93dbed0e)]:
  - @langchain/langgraph-sdk@1.14.0
## @langchain/langgraph-ui@1.7.0

No changes in this release.

Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2026-11-05 22:07:42 -05:00
.changeset chore: version packages (#3238) 2026-11-05 22:07:42 -05:00
.devcontainer chore(infra): update Node.js pins for October 2026 security release (#3079) 2026-10-21 15:27:27 -07:00
.github chore(deps): bump the minor-and-patch group with 4 updates (#3178) 2026-11-01 16:05:53 -08:00
.vscode feat(core): event based streaming (#2314) 2026-05-05 00:13:12 -07:00
.yarn/patches chore: replace yarn with pnpm (#1862) 2026-01-09 19:52:29 +01:00
docs fix(langgraph-checkpoint-postgres): anchor namespace matching to segments (#2825) 2026-10-05 15:10:04 -07:00
examples chore(deps): bump the langchain group across 1 directory with 6 updates (#3179) 2026-11-03 20:55:20 +00:00
internal chore(deps): bump the langchain group across 1 directory with 6 updates (#3179) 2026-11-03 20:55:20 +00:00
libs chore: version packages (#3238) 2026-11-05 22:07:42 -05:00
scripts chore: add changesets CLI (#1347) 2025-07-07 11:40:56 +00:00
.gitignore fix(langgraph-checkpoint-validation): align node engine with vitest (#2503) 2026-06-08 13:52:39 -07:00
.oxfmtrc.jsonc chore(repo): migrate linting and formatting from ESLint/Prettier to oxlint/oxfmt (#2256) 2026-03-30 18:08:00 -07:00
.oxlintrc.jsonc chore(repo): migrate linting and formatting from ESLint/Prettier to oxlint/oxfmt (#2256) 2026-03-30 18:08:00 -07:00
AGENTS.md docs: add "Direction: LangGraph is a runtime" section to AGENTS.md (#3116) 2026-10-26 15:57:04 +02:00
CONTRIBUTING.md docs: fix contributor setup and test commands (#2717) 2026-08-20 14:49:43 -07:00
deno.json Add streaming from final node notebook (#372) 2024-08-25 00:39:49 +00:00
int-test-deps-docker-compose.yml feat(checkpoint-postgres): Add PostgresStore for LangGraph.js (#1457) 2025-07-30 14:08:37 +00:00
LICENSE Split checkpointers into libraries (#341) 2024-08-22 09:43:15 -07:00
package.json chore(deps): bump follow-redirects and undici security fixes (#3236) 2026-11-05 09:36:03 -05:00
pnpm-lock.yaml chore(deps): use @langchain/protocol 0.0.21 for input.answered (#3247) 2026-11-06 01:55:23 +00:00
pnpm-workspace.yaml chore(repo): migrate linting and formatting from ESLint/Prettier to oxlint/oxfmt (#2256) 2026-03-30 18:08:00 -07:00
README.md chore: symlink READMEs to langgraph-core and remove sync check (#2020) 2026-03-02 13:12:38 -08:00
socket.yml build: add Socket optimized pnpm overrides (#2600) 2026-07-14 07:48:37 +00:00
tsconfig.json fix(sdk): update deps (#2162) 2026-03-10 14:31:03 -07:00
turbo.json chore(repo): migrate linting and formatting from ESLint/Prettier to oxlint/oxfmt (#2256) 2026-03-30 18:08:00 -07:00

Low-level orchestration framework for building stateful agents.

Docs Version npm - Downloads Open Issues

LangGraph — used by Replit, Uber, LinkedIn, GitLab and more — is a low-level orchestration framework for building controllable agents. While langchain provides integrations and composable components to streamline LLM application development, the LangGraph library enables agent orchestration — offering customizable architectures, long-term memory, and human-in-the-loop to reliably handle complex tasks.

npm install @langchain/langgraph @langchain/core

Tip

If you're looking to quickly build agents, check out Deep Agents — a higher-level package built on LangGraph for agents that can plan, use subagents, and leverage file systems for complex tasks.

For an equivalent Python library, check out LangGraph and the Python docs.

Why use LangGraph?

LangGraph provides low-level supporting infrastructure for any long-running, stateful workflow or agent:

  • Durable execution — Build agents that persist through failures and can run for extended periods, automatically resuming from exactly where they left off.
  • Human-in-the-loop — Seamlessly incorporate human oversight by inspecting and modifying agent state at any point during execution.
  • Comprehensive memory — Create truly stateful agents with both short-term working memory for ongoing reasoning and long-term persistent memory across sessions.
  • Debugging with LangSmith — Gain deep visibility into complex agent behavior with visualization tools that trace execution paths, capture state transitions, and provide detailed runtime metrics.
  • Production-ready deployment — Deploy sophisticated agent systems confidently with scalable infrastructure designed to handle the unique challenges of stateful, long-running workflows.

Tip

For developing, debugging, and deploying AI agents and LLM applications, see LangSmith.

LangGraph’s ecosystem

While LangGraph can be used standalone, it also integrates seamlessly with any LangChain product, giving developers a full suite of tools for building agents. To improve your LLM application development, pair LangGraph with:

  • Deep Agents (JS) — Build agents that can plan, use subagents, and leverage file systems for complex tasks. A higher-level package built on top of LangGraph.
  • LangChain – Provides integrations and composable components to streamline LLM application development.
  • LangSmith — Helpful for agent evals and observability. Debug poor-performing LLM app runs, evaluate agent trajectories, gain visibility in production, and improve performance over time.

Additional resources

  • LangChain Forum: Connect with the community and share all of your technical questions, ideas, and feedback.
  • LangChain Academy: Learn the basics of LangGraph in our free, structured course.
  • Streaming Cookbook: Documentation and examples around LangGraphs's streaming capabilities.
  • API Reference: Detailed reference on core classes, methods, how to use the graph and checkpointing APIs, and higher-level prebuilt components.
  • Built with LangGraph: Hear how industry leaders use LangGraph to ship powerful, production-ready AI applications.

Acknowledgements

LangGraph is inspired by Pregel and Apache Beam. The public interface draws inspiration from NetworkX. LangGraph is built by LangChain Inc, the creators of LangChain, but can be used without LangChain.