LangGraphMiddleSystem design
Как LangGraph Studio помогает при визуальной отладке агентских воркфлоу?
LangGraph Studio — локальная IDE для визуальной отладки агентских графов: показывает граф, состояние на каждом шаге, позволяет редактировать State вручную и перематывать выполнение назад через checkpoint-ы.
Что такое LangGraph Studio
LangGraph Studio — desktop-приложение (macOS) и облачный UI в LangSmith, которое подключается к локально запущенному LangGraph API-серверу. Оно визуализирует структуру графа, показывает пошаговое выполнение, текущий State и историю checkpoint-ов, позволяет вмешиваться в выполнение.
Как подключить Studio к проекту
Нужен конфигурационный файл langgraph.json в корне проекта и запущенный dev-сервер:
{
"dependencies": ["."],
"graphs": {
"agent": "./my_agent/graph.py:graph"
},
"env": ".env"
}
# Запуск dev-сервера (порт 8123)
langgraph dev --port 8123
# Studio подключается автоматически по localhost:8123
# или через облачный URL в LangSmith
Основные возможности отладки
- Graph View — интерактивная схема узлов и рёбер; активный узел подсвечивается в реальном времени.
- State Inspector — JSON-просмотр полного State после каждого узла; можно сравнить «до» и «после».
- Thread History — список всех checkpoint-ов по
thread_id; можно кликнуть на любой и посмотреть состояние в тот момент. - Time Travel — откат к произвольному checkpoint-у через
graph.update_stateи запуск с изменённым State. - Human-in-the-Loop — граф останавливается на
interrupt_beforeузлах; Studio показывает pending action и позволяет одобрить/отклонить.
Пример: добавить interrupt и отладить через Studio
from langgraph.graph import StateGraph, START, END
from langgraph.checkpoint.memory import MemorySaver
from typing_extensions import TypedDict
class State(TypedDict):
query: str
result: str
def search_node(state: State) -> dict:
# Studio остановится ПЕРЕД этим узлом для проверки
return {"result": f"found: {state['query']}"}
def format_node(state: State) -> dict:
return {"result": state["result"].upper()}
builder = StateGraph(State)
builder.add_node("search", search_node)
builder.add_node("format", format_node)
builder.add_edge(START, "search")
builder.add_edge("search", "format")
builder.add_edge("format", END)
# interrupt_before — граф паузируется перед search
graph = builder.compile(
checkpointer=MemorySaver(),
interrupt_before=["search"]
)
config = {"configurable": {"thread_id": "debug-session-1"}}
# Первый invoke: остановится на interrupt
graph.invoke({"query": "LangGraph Studio", "result": ""}, config=config)
# В Studio можно изменить state["query"] и продолжить:
graph.update_state(config, {"query": "MODIFIED QUERY"})
graph.invoke(None, config=config) # продолжение с изменённым state
Интеграция с LangSmith для трейсинга
# .env — переменные для автоматического трейсинга
LANGSMITH_API_KEY=lsv2_...
LANGSMITH_TRACING_V2=true
LANGSMITH_PROJECT=my-agent-debug
После этого каждый запуск отображается в LangSmith UI: дерево вызовов, latency каждого узла, токены LLM, tool call inputs/outputs и ошибки.
Подводные камни
- Studio работает только с компилированным графом, у которого есть
checkpointer; без него history и time travel недоступны. langgraph devподнимает сервер с hot-reload, но изменения схемы State требуют перезапуска — Studio не видит новые поля автоматически.- interrupt_before/interrupt_after работают только при передаче конфига с
thread_id; без него граф выполняется насквозь. - В Studio macOS-версии нельзя подключиться к удалённому серверу напрямую без туннеля (ngrok / cloudflare tunnel).
- MemorySaver теряет state при перезапуске сервера; для стабильной отладки между сессиями используйте SqliteSaver с файлом на диске.
- Большие State (тысячи сообщений) замедляют рендер JSON в Studio — обрезайте историю редьюсером или используйте
messages[-20:]. - LangGraph API-сервер слушает на 8123, но не защищён аутентификацией в dev-режиме — не запускайте с открытым портом на prod-машине.
- Версии langgraph и langgraph-cli должны совпадать; рассинхронизация даёт
422 Unprocessable Entityпри запуске графа из Studio.
Common mistakes
- Объяснять
langgraph studioтолько синтаксисом без shape, dtype, состояния или режима выполнения. - Игнорировать leakage, воспроизводимость, пустые входы и скрытые копии данных.
- Не проверять production-симптомы: latency, память, ретраи, дрейф качества и несовпадение версий.
What the interviewer is testing
- Может ли связать
langgraph studioс реальным контрактом входов и выходов. - Упоминает ли тесты, метрики, reproducibility и диагностику ошибок.
- Видит ли различие между demo-кодом в ноутбуке и production-пайплайном.