Фреймворк оркестрации, в котором поведение агента описано явно. Установка, первый граф, чекпойнты и откаты, остановка на человеке, локальный сервер, Studio и подключение MCP.
LangGraph — открытый фреймворк оркестрации ИИ-агентов на Python от команды LangChain: поведение агента описывается графом, где узлы выполняют работу, рёбра выбирают следующий шаг, а состояние сохраняется между вызовами. Ставится командой pip install -U langgraph, лицензия MIT. Разбираем первый граф, память и чекпойнты, остановку на человеке, локальный сервер со Studio и подключение MCP-серверов. Проверено по официальной документации 19 августа 2026 года.
Что узнаешь из гайда
Часть 1 · Знакомство
Главное
LangGraph отвечает только за оркестрацию: кто, когда и после кого работает. Модели и инструменты он не абстрагирует.
Документация называет LangGraph низкоуровневым фреймворком и рантаймом для долгоживущих агентов с состоянием. Ключевая мысль: в одном графе спокойно уживаются жёстко прописанные шаги и шаги, которые ведёт модель. Там, где нужна предсказуемость и аудит, стоит обычный код; там, где нужна гибкость, решает модель. Среди компаний, которые строят на нём агентов, документация называет Klarna, Uber и J.P. Morgan.
| Слой | За что отвечает |
|---|---|
| LangChain | Фреймворк агентов: модели, инструменты, готовые циклы вызова |
| LangGraph | Рантайм оркестрации: устойчивое выполнение, потоковая отдача, человек в цикле, состояние |
| Deep Agents | Обвязка поверх LangGraph: планирование, субагенты, файловые инструменты, работа с контекстом |
| LangSmith | Платформа наблюдения: трассировка, оценка, промпты, выкладка |
Кому он вообще нужен
Если задача — «агент отвечает и вызывает пару инструментов», графа не надо: хватит готового агента LangChain, а то и SDK от Anthropic. LangGraph окупается там, где процесс длинный, ветвится, требует согласования человеком и должен переживать перезапуск. Организационную сторону вопроса — какие роли вообще стоит отдавать агентам — разбирал отдельно в гайде про офис ИИ-агентов.
Часть 2 · Установка
Главное
Один пакет, четыре сущности — состояние, узлы, рёбра, компиляция.
pip install -U langgraph
# или через uv
uv add langgraph
# модели и инструменты обычно берут из LangChain (нужен Python 3.10+)
pip install -U langchainМинимальный пример из документации выглядит так: вместо модели подставлена заглушка, но структура уже полная — схема состояния, узел, рёбра от старта до конца и компиляция.
from langgraph.graph import StateGraph, MessagesState, START, END
def mock_llm(state: MessagesState):
return {"messages": [{"role": "ai", "content": "hello world"}]}
graph = StateGraph(MessagesState)
graph.add_node(mock_llm)
graph.add_edge(START, "mock_llm")
graph.add_edge("mock_llm", END)
graph = graph.compile()
graph.invoke({"messages": [{"role": "user", "content": "hi!"}]})Чем платить за модель
Сам фреймворк бесплатный и открытый, но агент ходит в модель, а токены платные. В примерах документации используется ключ Anthropic — как его получить и сколько стоит обращение, разобрано в гайде про API-ключ Claude. Из России зарубежная консоль пополняется либо иностранной картой, либо через посредника вроде «Оплати по миру». Альтернатива без валюты — подключить локальную модель.
Часть 3 · Как устроен граф
Главное
Узлы делают работу, рёбра говорят, куда идти дальше — эта формула из документации описывает почти всё.
Под капотом работает передача сообщений: узел завершил работу и отправил сообщения по рёбрам дальше, получатели выполнились и передали свои — и так шаг за шагом. Эти шаги в документации называют супер-шагами, а сама идея заимствована у системы Pregel от Google. Практический смысл терминологии простой: узлы, работающие параллельно, относятся к одному супер-шагу, а те, что идут друг за другом, — к разным. Выполнение заканчивается, когда все узлы неактивны и сообщений в пути не осталось.
Два API на выбор
Кроме графового есть функциональный API: тот же рантайм, но агент описывается одной функцией без явных узлов и рёбер. Графовый берут, когда важна видимая схема процесса; функциональный — когда логика естественно ложится в обычный код.
Часть 4 · Память
Главное
Две разные вещи: чекпойнтер помнит диалог, хранилище — факты.
| Механизм | Что хранит и зачем |
|---|---|
| Чекпойнтеры | Состояние потока в виде снимков: продолжение диалога, человек в цикле, откат во времени, восстановление после сбоя |
| Хранилища | Данные вне состояния графа и вне одного потока: предпочтения пользователя, факты, общие знания |
from langgraph.checkpoint.memory import InMemorySaver
from langgraph.store.memory import InMemoryStore
checkpointer = InMemorySaver()
store = InMemoryStore()
graph = builder.compile(checkpointer=checkpointer, store=store)
result = graph.invoke(
{"messages": [{"role": "user", "content": "Hi, my name is Bob."}]},
{"configurable": {"thread_id": "thread-1"}},
)Ключевая деталь — thread_id. Это указатель на сохранённое состояние: тот же идентификатор продолжает прежний разговор, новый начинает чистый. Классы из примера держат всё в оперативной памяти и годятся для разработки; для продакшена документация советует долговечный чекпойнтер. Отдельно оговорено, что при работе через серверный вариант запуска персистентность настраивать руками не нужно — сервер берёт её на себя.
Узел может выполниться дважды
Снимки состояния пишутся на границах супер-шагов, а не в середине функции узла. Поэтому после паузы или повтора затронутый узел запускается заново с начала — вместе с кодом и побочными эффектами, которые успели отработать до остановки. Документация прямо советует писать узлы идемпотентно: повторный запуск не должен портить данные.
Часть 5 · Согласование
Главное
Функция interrupt() ставит граф на паузу в любой точке узла и ждёт сколько угодно.
Это тот самый механизм, который отличает демонстрацию от рабочего процесса. Агент дошёл до места, где нужно подтверждение — отправка письма, списание денег, публикация — и остановился. Состояние сохранилось через слой персистентности, процесс можно погасить, а через час возобновить: продолжение запускается повторным вызовом графа с объектом Command, и переданное значение становится результатом interrupt() внутри узла.
Прерывания против точек останова
Статические точки останова срабатывают до или после конкретного узла. Прерывания динамические: их ставят где угодно внутри кода и делают условными — например, спрашивать человека только если сумма больше порога.
Часть 6 · Разработка
Главное
Команда langgraph dev поднимает агента локально, а визуальный интерфейс показывает каждый шаг.
pip install -U "langgraph-cli[inmem]"
langgraph new путь/к/проекту --template new-langgraph-project-python
cd путь/к/проекту
pip install -e .
# в .env положить ключ LangSmith
# LANGSMITH_API_KEY=lsv2...
langgraph devВизуальный интерфейс, который многие ищут как LangGraph Studio, в документации сейчас называется LangSmith Studio. Он бесплатный, подключается к локально запущенному агенту и показывает каждый шаг: какие промпты ушли в модель, какие инструменты вызывались и что они вернули, каким было промежуточное состояние. Отладка агента без него сводится к чтению логов.
Что уходит наружу
Для подключения нужны аккаунт LangSmith и ключ. Если данные не должны покидать машину, в .env ставится LANGSMITH_TRACING=false: документация прямо оговаривает, что с выключенной трассировкой из локального сервера ничего не отправляется.
Часть 7 · Инструменты
Главное
Отдельная библиотека превращает инструменты MCP в обычные инструменты агента.
MCP — открытый протокол, по которому приложения отдают моделям инструменты и контекст: файловые системы, базы, внешние сервисы. В экосистеме LangChain за это отвечает пакет langchain-mcp-adapters: клиент принимает описание сразу нескольких серверов и возвращает их инструменты одним списком.
pip install langchain-mcp-adapters
# ---
from langchain_mcp_adapters.client import MultiServerMCPClient
client = MultiServerMCPClient(
{
"math": {
"transport": "stdio", # локальный процесс
"command": "python",
"args": ["/path/to/math_server.py"],
},
"weather": {
"transport": "http", # удалённый сервер
"url": "http://localhost:8000/mcp",
},
}
)
tools = await client.get_tools()Важная деталь поведения: клиент по умолчанию не держит сессию. Каждый вызов инструмента поднимает свежую сессию MCP, выполняет вызов и закрывает её — для инструментов, которым нужно состояние между вызовами, в документации предусмотрен отдельный режим. Что вообще даёт протокол и какие серверы имеет смысл подключить первыми, разобрано в гайдах про MCP-серверы и подборку полезных серверов.
Коротко
pip install -U langgraph.thread_id.interrupt() останавливает граф в любой точке и ждёт человека; возобновление — вызовом с Command.langgraph dev, а визуальный интерфейс в документации называется LangSmith Studio.langchain-mcp-adapters через MultiServerMCPClient.Вопросы
LangGraph — низкоуровневый фреймворк оркестрации для ИИ-агентов на Python. Логика агента описывается графом: узлы делают работу, рёбра решают, куда идти дальше, а общее состояние передаётся между ними. Главная ценность в том, что детерминированные шаги и шаги, которые ведёт модель, живут в одном графе, поэтому поведение агента остаётся предсказуемым там, где это важно.
LangChain — фреймворк агентов: абстракции и интеграции для моделей, инструментов и готовых циклов работы. LangGraph — рантайм оркестрации под ними: устойчивое выполнение, потоковая отдача, человек в цикле и сохранение состояния. Использовать LangChain необязательно, но в документации модели и инструменты берут именно оттуда. Новичку советуют начинать с готовых агентов LangChain, а к графу переходить, когда нужен точный контроль.
Установка — команда pip install -U langgraph либо uv add langgraph. Минимальный граф собирается из четырёх сущностей: класс StateGraph описывает схему состояния, add_node добавляет функции-узлы, add_edge связывает их со стартом и концом, compile превращает всё в исполняемый объект. Дальше граф вызывается методом invoke со словарём сообщений.
Механизмов два, и они дополняют друг друга. Чекпойнтеры сохраняют состояние конкретного потока диалога — это короткая память, она же даёт продолжение разговора, откат во времени и устойчивость к сбоям. Хранилища держат данные вне состояния графа и живут между потоками — это долгая память для фактов о пользователе и общих знаний. Оба подключаются при компиляции графа, а поток выбирается параметром thread_id.
Для этого есть функция interrupt: её вызывают в любом месте узла, и выполнение останавливается, а состояние графа сохраняется через слой персистентности. Ждать можно сколько угодно — продолжение запускается повторным вызовом графа с объектом Command, и переданное значение становится результатом interrupt внутри узла. Нужны две вещи: подключённый чекпойнтер и thread_id в конфигурации.
Да, через библиотеку langchain-mcp-adapters. Клиент MultiServerMCPClient принимает описание сразу нескольких серверов: для локальных указывается транспорт stdio с командой запуска, для удалённых — транспорт http с адресом. Метод get_tools возвращает инструменты всех серверов сразу, и их можно отдать агенту как обычные функции. По умолчанию клиент работает без сохранения сессии: каждый вызов инструмента открывает новую и закрывает её.
Читать дальше
Платформа и сообщество, где я по шагам показываю, как поставить ИИ на рутину: контент, код, продажи, аналитика. Заходи и забирай рабочие связки, которыми пользуюсь сам.
Посмотреть, что внутриtelegram
Канал с полезными материалами про нейросети
Разборы, новые инструменты и приёмы по ИИ — то, чем пользуюсь сам, без воды. Подпишись, чтобы не потерять.