Gateway

Восстановление после перезапуска

Перезапуск Gateway не приводит к потере состояния агента. Диалоги, расшифровки, запланированные задания, записи фоновых задач и исходящие сообщения в очереди хранятся на диске, а работа, прерванная во время хода, обнаруживается и автоматически возобновляется после запуска Gateway. Ручное вмешательство не требуется, и настраивать ничего не нужно: восстановление включено всегда.

На этой странице описано, что сохраняется после перезапуска, как обнаруживается прерванная работа и как происходит автоматическое возобновление.

Что сохраняется после перезапуска

Состояние Хранилище Поведение при перезапуске
История диалога База данных SQLite отдельного агента Не изменяется; сеансы продолжаются на основе сохранённой расшифровки
Прерванный ход основного сеанса Строка сеанса и расшифровка в базе данных SQLite отдельного агента Автоматически возобновляется через несколько секунд после запуска
Запуски субагентов SQLite (общая база данных состояния) Реестр восстанавливается при загрузке; прерванные запуски возобновляются
Фоновые задачи SQLite (общая база данных состояния) Сверяются при загрузке; потерявшие владельца запуски восстанавливаются или помечаются как потерянные
Исходящие доставки в очереди Очередь доставки SQLite Обрабатываются после перезапуска; недоставленные ответы отправляются повторно
Запланированные задания (cron) Хранилище cron в SQLite Расписания сохраняются; планировщик повторно активируется при загрузке
Продолжение после перезапуска Маркер перезапуска в SQLite Однократное продолжение отправляется в сеанс, запросивший перезапуск

Перед корректным перезапуском сначала завершается текущая работа

Запрошенный перезапуск (openclaw gateway restart, изменение конфигурации, требующее перезапуска, или обновление Gateway) не прерывает выполняемую работу немедленно. Gateway прекращает принимать новую работу, а затем ожидает завершения активных ходов агентов и фоновых задач в пределах периода ожидания завершения (по умолчанию 5 минут). Поэтому в большинстве случаев перезапуск вообще ничего не прерывает.

Прерывается только работа, которую невозможно завершить в пределах периода ожидания (либо любой запуск, прерванный принудительным перезапуском или сбоем), — и перед этим каждый затронутый сеанс помечается для восстановления.

Как обнаруживается прерванная работа

Сеансы с незавершённым ходом помечаются тремя взаимодополняющими механизмами:

  • При приёме запроса в Control UI: для обычного текстового хода в существующем основном сеансе Gateway добавляет сообщение пользователя, помечает сеанс как выполняющийся и записывает его заявку на доставку только расшифровки в одной транзакции SQLite, прежде чем вернуть подтверждение started. Команды, вложения, переопределения для отдельных ходов, ожидающие доставки, предыдущие признаки прерывания, сеансы, принадлежащие плагинам, и ходы с хуками выполнения сохраняют свои специализированные пути приёма.
  • При завершении работы: во время ожидания завершения перед перезапуском каждый сеанс с активным запуском получает в хранилище сеансов маркер восстановления, прежде чем запуск будет прерван.
  • При запуске: Gateway сканирует хранилища сеансов на наличие сеансов, которые по-прежнему считаются выполняющимися, но не имеют активного владельца в новом процессе. Это позволяет обнаруживать аварийные завершения и принудительные остановки, при которых код завершения работы не выполнялся. Одновременно удаляются устаревшие файлы блокировки расшифровок.

Автоматическое возобновление

Через несколько секунд после запуска Gateway повторно отправляет каждый помеченный сеанс с синтетическим системным сообщением, которое уведомляет агента о том, что его предыдущий ход был прерван перезапуском, и предписывает продолжить работу на основе существующей расшифровки. Если итоговый ответ уже был сформирован, но не доставлен, его текст включается в сообщение, чтобы агент мог доставить его вместо повторного выполнения работы. Восстановление повторяется до 3 раз с экспоненциальной задержкой. При каждой попытке используется один и тот же постоянный идентификатор отправки, поэтому неоднозначный сбой подключения не может запустить одно и то же восстановление дважды. Для завершённых и невозобновляемых ходов Control UI также сохраняются ограниченные по сроку постоянные маркеры идемпотентности, позволяющие переподключившейся очереди исходящих сообщений снять их с обработки без повторного выполнения запроса.

Перед возобновлением Gateway проверяет, можно ли безопасно продолжить с конца расшифровки. Если нельзя (например, ход завершился на устаревшем ожидающем подтверждении), сеанс не запускается повторно вслепую; вместо этого агент публикует короткое уведомление с просьбой повторно отправить последний запрос. Для WebChat это уведомление записывается непосредственно в историю сеанса, чтобы оно оставалось видимым после переподключения.

OpenClaw также может восстанавливать прерванную работу Code Mode только для чтения. Code Mode помечает такие запуски как безопасные при перезапуске и отклоняет инструменты каталога или пространства имён плагинов с побочными эффектами до их выполнения. Если перезапуск происходит на элементе управления wait, новый Gateway восстанавливает ход по его расшифровке и принудительно сохраняет безопасность восстановленного выполнения при перезапуске, даже если модель пропускает или сбрасывает этот флаг. Хост ограничивает весь восстановленный ход проверенными основными инструментами только для чтения и явно безопасными для повторного выполнения инструментами плагинов, в том числе если Code Mode отключён после перезапуска. Работа с побочными эффектами остаётся защищённой уведомлением о повторной отправке, чтобы исключить риск дублирующей записи.

Субагенты

Запуски субагентов сохраняются в общей базе данных состояния SQLite, поэтому реестр субагентов переживает перезапуск процесса. При загрузке реестр восстанавливается, а прерванные сеансы субагентов возобновляются с исходным контекстом задачи. Применяются два защитных механизма:

  • Запуски, прерванные более 2 часов назад, завершаются вместо возобновления, чтобы Gateway, не работавший всю ночь, не возобновлял устаревшую работу.
  • Сеанс, который неоднократно не удаётся восстановить, помечается постоянным маркером как зависший, чтобы восстановление не зацикливалось навсегда.

Фоновые задачи

Реестр фоновых задач использует SQLite и сверяется при загрузке, а также через заданные интервалы: постоянные результаты, записанные завершёнными запусками, восстанавливаются, а запуски, процесс-владелец которых исчез, после льготного периода помечаются как потерянные, а не остаются зависшими навсегда.

Перезапуски по запросу агента

Когда агент сам инициирует перезапуск (применяя изменение конфигурации, обновляя Gateway или явно запрашивая перезапуск), перед завершением процесса в SQLite записывается маркер перезапуска. После загрузки Gateway публикует результат в исходном чате и отправляет однократный ход продолжения, чтобы агент возобновил работу ровно с того места, где остановился, в том же канале и ветке.

Защитные механизмы и наблюдаемость

  • Предохранитель от циклических сбоев: 3 некорректных загрузки в течение 5 минут активируют предохранитель, который при следующей загрузке подавляет автоматический запуск вспомогательных служб, чтобы сбойный Gateway не усугублял проблему. Нормальная работа восстанавливается после истечения окна некорректных загрузок.
  • Метрики: сведения об активности восстановления экспортируются через Prometheus как openclaw_session_recovery_total и openclaw_session_recovery_age_seconds.
  • Журналы: решения о восстановлении записываются в журналы подсистем main-session-restart-recovery и subagent-interrupted-resume.

Что не возобновляется

  • Сеансы, исключённые из восстановления основных сеансов, поскольку ими уже управляет другой владелец: сеансы субагентов (восстановление субагентов), сеансы cron (планировщик повторно запускает их по расписанию) и сеансы под управлением ACP (за возобновление отвечает подключённая IDE или клиент).
  • Сеансы, которые нельзя безопасно продолжить с конца расшифровки; вместо скрытого повторного запуска они получают описанное выше уведомление о повторной отправке.
  • Работа, которая не была принята: сообщения, поступившие в период ожидания завершения, отклоняются с явной ошибкой перезапуска, а не молча добавляются в очередь завершающегося процесса.
Was this useful?
On this page

On this page