LangGraph Nodes and Edges

Узлы и рёбра — два из трёх примитивов графа (третий — LangGraph State). Узел = функция-шаг, читающая state и возвращающая его обновление. Ребро = переход между узлами: обычное (жёсткая последовательность) или условное (функция-маршрутизатор выбирает следующий узел). Граф собирается StateGraph builder'ом и фиксируется .compile().

Суть

  • Node — Python-функция state -> dict|State: вся бизнес-логика живёт здесь (вызов LLM, обращение к БД, инструмент). Возвращает частичное обновление, движок его применяет.
  • Edge — задаёт порядок исполнения:
    • обычное (add_edge("A","B")) — факт «B после A»;
    • условное (add_conditional_edges) — функция-маршрутизатор возвращает имя следующего узла (str) на основе state; условием может быть что угодно, вплоть до решения LLM.

Зачем это нужно

Разделение «логика в узлах / поток в рёбрах» делает архитектуру явной и управляемой: маршрут не зашит в код функций, а описан декларативно — его можно ветвить, замыкать в цикл и визуализировать.

Как работает

  1. builder = StateGraph(State) — создаём нескомпилированный граф.
  2. builder.add_node("name", fn) — регистрируем узлы.
  3. Рёбра: add_edge(START, "A"), add_edge("A","B"), add_edge("B", END); ветвление — add_conditional_edges("from", router_fn, {"key": "node"}).
  4. graph = builder.compile() — переводим описание в исполняемый объект (на этом же этапе подключают checkpointer — см. LangGraph Checkpointers).
  5. START / END — предопределённые точки входа/выхода.

Пример

from langgraph.graph import StateGraph, START, END

def route_by_number(state: State) -> str:        # функция-маршрутизатор
    return "positive" if state["number"] > 0 else "negative"

builder = StateGraph(State)
builder.add_node("check", check_number)
builder.add_node("positive", handle_positive)
builder.add_node("negative", handle_negative)
builder.add_edge(START, "check")
builder.add_conditional_edges("check", route_by_number,
                              {"positive": "positive", "negative": "negative"})
builder.add_edge("positive", END); builder.add_edge("negative", END)
graph = builder.compile()

Связано с

  • LangGraph State — узлы читают/обновляют state, рёбра задают порядок
  • Agent Routing — условные рёбра = реализация роутинга в графе
  • LangGraph ReAct Loop — минимальный граф из узлов и условного ребра
  • LangGraph — узлы+рёбра+state = три примитива State Machine

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

  • StateGraph vs готовые обёртки (MessageGraph и т.п.) — когда что