Суть
State определяет схему всех данных, которые ходят между узлами. На вход граф получает один объект state; при переходе от узла к узлу передаётся этот же единственный объект, а каждый узел его «модифицирует» — но не напрямую, а возвращая поля для обновления. Само обновление применяет движок LangGraph во время исполнения.
Зачем это нужно
- Единый источник данных. Вся информация диалога/процесса лежит в одном типизированном объекте, а не размазана по переменным — это и есть «состояние» агента.
- Неизменяемость → наблюдаемость и прерываемость. Раз состояние не мутируется на месте, на каждом шаге можно снять его снимок: отследить, что менялось (LangGraph Time Travel), сохранить (LangGraph Checkpointers) и прервать исполнение (LangGraph HITL).
Как работает
- Схема задаётся типом. Узел типизируется как
state -> dict(частичное обновление) или полный state. - Возвращать нужно обновление, а не пытаться менять сам объект state.
- Как именно поле обновляется (перезапись или накопление) — задаётся reducer'ом: см. LangGraph Reducers. По умолчанию поле перезаписывается.
Пример
from typing import TypedDict, Annotated
from operator import add
class State(TypedDict):
simple_value: str # перезаписывается (поведение по умолчанию)
numbers: Annotated[list, add] # новое значение мержится со старым (reducer)
def node(state: State) -> dict:
# ❌ нельзя: state["simple_value"] = ...
# ✅ возвращаем частичное обновление — движок применит его сам
return {"simple_value": "updated"}
Связано с
- LangGraph — State = один из трёх примитивов State Machine
- LangGraph Reducers — правила слияния значений при обновлении state
- LangGraph Nodes and Edges — узлы читают/обновляют state, рёбра задают порядок
- Context Window — история сообщений в state ↔ управление контекстом
Открытые вопросы
-
TypedDictvs PydanticBaseModelдля State — когда нужна валидация полей и какой оверхед