Перейти к основному контенту
Tech Path Finder
КурсыИнтервьюКод-ревьюБлог
Tech Path Finder

Персонализированный путеводитель в IT. Квизы, мок-интервью, код ревью и аналитика прогресса.

@potapov_me

Платформа

  • Курсы
  • Прогресс
  • Мок-интервью
  • Код ревью
  • Живое ревью с ИИ
  • Тренажёр переговоров
  • Закладки

Контент

  • Блог
  • Главная
  • Обратная связь

Компания

  • О проекте
  • Тарифы
  • Условия использования
  • Конфиденциальность
  • Согласие на обработку данных
  • Cookie
  • Реквизиты

Аккаунт

  • Войти
  • Зарегистрироваться
  • Профиль

© 2026 Tech Path Finder. Все права защищены.

·ИП Потапов К.С.·Политика конфиденциальности·
Сделано с ❤️ в России
  1. Человек в цикле
human_in_the_loop

Человек в цикле

Прерывания (interrupts), паттерны одобрения и редактирования, валидация ввода, правила прерываний.

Человек в цикле

Прерывания позволяют приостановить выполнение графа в любой точке и дождаться внешнего ввода — это основа паттерна «человек в цикле».

#Как работают прерывания

При вызове interrupt() внутри узла выполнение приостанавливается, состояние сохраняется через чекпоинтер. Граф ждёт неограниченное время до возобновления. Значение Command(resume=...) становится возвращаемым значением interrupt().

from langgraph.types import interrupt def approval_node(state: State): approved = interrupt("Вы одобряете это действие?") return {"approved": approved}

Для работы прерываний нужны: чекпоинтер для сохранения состояния, thread_id для идентификации потока и JSON-сериализуемое значение в interrupt().

#Паттерн: одобрение или отклонение

Самый частый случай — пауза перед критическим действием. Узел вызывает interrupt с данными для отображения, а при возобновлении получает решение пользователя:

from langgraph.types import interrupt, Command def approval_node(state: State) -> Command[Literal["proceed", "cancel"]]: decision = interrupt({ "question": "Вы хотите продолжить?", "details": state["action_details"], }) return Command(goto="proceed" if decision else "cancel")

Возобновление: graph.stream_events(Command(resume=True), config=config, version="v3") — для одобрения, Command(resume=False) — для отклонения.

#Паттерн: редактирование состояния

Иногда нужно не просто одобрить, а отредактировать данные. Узел показывает текущее содержимое, а при возобновлении получает отредактированную версию.

#Паттерн: прерывание в инструментах

Прерывания можно размещать внутри инструментов — инструмент приостанавливается перед выполнением. Это позволяет одобрять, редактировать или отменять вызовы инструментов.

#Паттерн: несколько прерываний параллельно

Когда несколько параллельных веток вызывают interrupt, нужно возобновить все сразу через словарь {id_прерывания: значение}.

#Валидация ввода

Для проверки ввода пользователя вызывайте interrupt() один раз за вызов узла. При некорректном вводе возвращайте обновлённое состояние с сообщением об ошибке и используйте условное ребро для повторного запроса. Не используйте while True с interrupt() — при каждом возобновлении узел выполняется заново, и цикл воспроизводит все предыдущие итерации.

def get_age_node(state: FormState): question = state.get("pending_question") or "Какой вам возраст?" answer = interrupt(question) # один раз за вызов if isinstance(answer, int) and answer > 0: return {"age": answer, "pending_question": None} return {"pending_question": f"'{answer}' — некорректный возраст."}

#Правила прерываний

Не оборачивайте interrupt в try/except — он работает через специальное исключение. Не меняйте порядок вызовов interrupt между выполнениями — сопоставление строго индексное. Не пропускайте вызовы условно. Используйте идемпотентные операции до interrupt — узел выполняется заново при возобновлении.

#Статические прерывания (для отладки)

Для пошаговой отладки графа можно задать interrupt_before и interrupt_after при компиляции — выполнение приостановится перед или после указанного узла.

Далее: Функциональный API