LangGraph State

State — единое строго типизированное хранилище данных графа (обычно TypedDict или Pydantic BaseModel), которое передаётся между всеми узлами. На уровне графа оно неизменяемо: узел получает текущее состояние и возвращает не мутацию, а описание обновления.

Суть

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 ↔ управление контекстом

Открытые вопросы

  • TypedDict vs Pydantic BaseModel для State — когда нужна валидация полей и какой оверхед