Суть
- Node — Python-функция
state -> dict|State: вся бизнес-логика живёт здесь (вызов LLM, обращение к БД, инструмент). Возвращает частичное обновление, движок его применяет. - Edge — задаёт порядок исполнения:
- обычное (
add_edge("A","B")) — факт «B после A»; - условное (
add_conditional_edges) — функция-маршрутизатор возвращает имя следующего узла (str) на основе state; условием может быть что угодно, вплоть до решения LLM.
- обычное (
Зачем это нужно
Разделение «логика в узлах / поток в рёбрах» делает архитектуру явной и управляемой: маршрут не зашит в код функций, а описан декларативно — его можно ветвить, замыкать в цикл и визуализировать.
Как работает
builder = StateGraph(State)— создаём нескомпилированный граф.builder.add_node("name", fn)— регистрируем узлы.- Рёбра:
add_edge(START, "A"),add_edge("A","B"),add_edge("B", END); ветвление —add_conditional_edges("from", router_fn, {"key": "node"}). graph = builder.compile()— переводим описание в исполняемый объект (на этом же этапе подключают checkpointer — см. LangGraph Checkpointers).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
Открытые вопросы
-
StateGraphvs готовые обёртки (MessageGraph и т.п.) — когда что