4 min read

LangGraph: Build Stateful, Long-Running AI Agents (GitHub, Scanned)

A low-level Python framework for stateful, durable AI agents with human approval built in.

LangGraph logo
✅
Scan: safe. Nothing to flag: no hits in the code, and the known advisories sit in example projects and development lockfiles. Scanned Oct 26, 2026; the full report is below.

LangGraph is a Python framework for building AI agents as graphs: each step is a node, edges decide what runs next, and a shared state object carries the work through. That structure gives you things simple agent loops lack: durable execution that resumes exactly where it stopped after a crash, checkpoints you can inspect and rewind, human approval at any point, and short-term and long-term memory.

It is from LangChain Inc. but works without LangChain, and it is the engine under many production agents; the README names Klarna, Replit and Elastic. Checkpoints can live in memory, SQLite or Postgres, a CLI runs a local development server, and LangSmith adds tracing and hosted deployment if you want them. For a higher-level starting point, the same team's Deep Agents package is built on LangGraph.

It is MIT-licensed, with about 43,900 stars and 292 contributors, at 1.2.17 when scanned. It is deliberately low level, so expect to write more code than with an all-in-one agent builder, and a JavaScript version lives in a separate repository.

Who it is for

Python developers building agents that must run for a long time, survive failures or wait for a person to approve a step, and teams moving an agent prototype into production.

Getting started

1. Install the library

pip install -U langgraph

2. Install the CLI for a local development server

pip install -U "langgraph-cli[inmem]"

3. Start the server in your project

langgraph dev

You also need a model provider package and key, for example langchain-openai or langchain-anthropic, or a local model. The quickstart at docs.langchain.com walks through a first agent.

Safety scan

We cloned langchain-ai/langgraph at commit a25bfaf on Oct 26, 2026 and ran the checks described on the GitHub Tools page: credential patterns, decode-and-execute code, install-time scripts, committed binaries, risky CI workflows, every host the code talks to, known vulnerabilities in pinned dependencies, and project hygiene. A person read every hit. This is what we found.

  • No secrets, no suspicious patterns, no install hooks and no committed binaries across 698 files and about 222,000 lines of Python.
  • 14 known advisories (7 high), none critical. Most are in the CLI's example projects (libs/cli/js-examples and uv-examples); the rest are development pins in uv.lock files, such as langsmith and picomatch. pip installs current releases, and LangSmith tracing is off unless you turn it on.
  • Two of 17 workflows use pull_request_target: one checks that a PR links an issue and one labels external PRs. Both only call the GitHub API, and require_issue_link.yml carries a comment forbidding checkout of PR code.
  • All 12 third-party actions are pinned to commits and Dependabot is on. No security policy file in this repository.

What the scanner counted

CheckResult
SecretsNone found.
Suspicious codeNone found.
Install-time codeNone: nothing runs at install beyond the package manager itself.
Committed binariesNone.
CI workflows17 workflows. 2 use pull_request_target, none check out the pull request head. 0 of 12 third-party actions pinned to a tag rather than a commit.
Network hosts40 distinct hosts referenced from source; most often docs.langchain.com, github.com, api.example.com, smith.langchain.com. No URLs to bare IP addresses.
Known vulnerabilities14 advisories across 997 pinned packages: 0 critical, 7 high, 4 moderate, 3 low. libs/checkpoint-conformance/uv.lock: 42 packages, 0 advisories; libs/checkpoint-postgres/uv.lock: 52 packages, 0 advisories; libs/checkpoint-sqlite/uv.lock: 50 packages, 0 advisories; libs/checkpoint/uv.lock: 61 packages, 0 advisories; libs/cli/js-examples/yarn.lock: 671 packages, 4 advisories; libs/cli/js-monorepo-example/yarn.lock: 283 packages, 2 advisories; libs/cli/uv-examples/monorepo/uv.lock: 40 packages, 2 advisories; libs/cli/uv-examples/simple/uv.lock: 34 packages, 1 advisories; libs/cli/uv.lock: 125 packages, 3 advisories; libs/langgraph/uv.lock: 185 packages, 2 advisories; libs/prebuilt/uv.lock: 56 packages, 0 advisories; libs/sdk-py/uv.lock: 50 packages, 0 advisories.
Project hygieneHas automated dependency updates, licence file. Missing security policy, CodeQL, contributing guide.
OpenSSF ScorecardNot scored: the project is not in Scorecard's weekly index.

The raw findings

Every hit the scanner wrote out, with a link to the exact line at the scanned commit. Secrets candidates are redacted.

Worst known vulnerabilities (14 of 14)
AdvisorySeverityPackageSummary
GHSA-c2c7-rcm5-vvqjhighpicomatch@2.3.1Picomatch has a ReDoS vulnerability via extglob quantifiers
GHSA-c2c7-rcm5-vvqjhighpicomatch@4.0.3Picomatch has a ReDoS vulnerability via extglob quantifiers
GHSA-mrhx-c7xc-m3w5highzod@4.3.6Zod can exhaust memory while validating oversized constrained collections
GHSA-f4xh-w4cj-qxq8highlangsmith@0.8.0LangSmith SDK TracingMiddleware: Arbitrary server-side file read
GHSA-f4xh-w4cj-qxq8highlangsmith@0.8.5LangSmith SDK TracingMiddleware: Arbitrary server-side file read
GHSA-v4x8-3wr5-3wq8highfilelock@3.28.0filelock ReadWriteLock: SQLite reopens the lock database by name, so a planted symlink or journal file makes the lock us…
GHSA-c3mw-737p-c7g2highjupyter-server@2.20.0Jupyter Server: 5xx request logging leaks token-bearing Referer header values
GHSA-3v7f-55p6-f55pmoderatepicomatch@2.3.1Picomatch: Method Injection in POSIX Character Classes causes incorrect Glob Matching
GHSA-3v7f-55p6-f55pmoderatepicomatch@4.0.3Picomatch: Method Injection in POSIX Character Classes causes incorrect Glob Matching
GHSA-p498-v437-472gmoderate@humanfs/node@0.16.7humanfs: Recursive copy follows symlinked files and copies data from outside the source tree
GHSA-65pc-fj4g-8rjxmoderateidna@3.11Internationalized Domain Names in Applications (IDNA): Specially crafted inputs to idna.encode() can bypass CVE-2024-365…
GHSA-567q-5qvw-pf92lowfilelock@3.28.0filelock: On Windows an oplock on a soft lock's marker holds SoftFileLock.acquire() past its timeout and blocks the stal…
GHSA-9vhv-jxww-xfm5lowfilelock@3.28.0filelock: ReadWriteLock on Windows acts on SQLite side files another local user places beside its database
GHSA-xmj3-9gf7-h52wlowsetuptools@83.0.0setuptools: Windows path escape via namespace_packages.txt during legacy wheel installation Description
Workflows worth a look

By the numbers

Stars43.9K
Forks7,547
Contributors292
Commits7,218
Open issues359
Open pull requests157
Releases585
Latest release1.2.17
LicenceMIT
Main languagePython
Project age3 years
Last pushOct 26, 2026
Tracked files698
Lines of code222K
Checkout size14 MB

Lines by language: Python 202.7K, Jupyter 9,057, JSON 3,542, YAML 3,160, Markdown 2,021, TOML 1,040.

Questions

Is LangGraph free?

Yes. LangGraph is MIT-licensed and free, and runs anywhere Python does. LangSmith, the company's tracing and deployment platform, is a separate product with free and paid plans, and LangGraph does not need it.

Do I need LangChain to use LangGraph?

No. LangGraph works on its own with any model client. LangChain's integrations make it quicker to plug in models and tools, but they are optional.

LangGraph or Deep Agents?

Start with Deep Agents if you want an agent that can plan, use sub-agents and work with files right away. Use LangGraph directly when you need full control over each step, state and approval point.


This post is part of GitHub Tools, where every repository is cloned and scanned before it is written up. The scan is a snapshot of one commit on one day; the repository has moved on since, so check it before you install.