Цикл агента (OpenClaw)
Агентский цикл — это полный "настоящий" запуск агента: прием → сборка контекста → вывод модели → выполнение инструментов → потоковые ответы → сохранение. Это авторитетный путь, который превращает сообщение в действия и финальный ответ, сохраняя консистентность состояния сессии.
В OpenClaw цикл — это один сериализованный запуск на сессию, который генерирует события жизненного цикла и потоков, пока модель думает, вызывает инструменты и выводит результат. Этот документ объясняет, как этот аутентичный цикл связан от начала до конца.
Точки входа
- Gateway RPC: agent и agent.wait.
- CLI: команда agent.
Как это работает (высокоуровнево)
- RPC agent валидирует параметры, определяет сессию (sessionKey/sessionId), сохраняет метаданные сессии, немедленно возвращает { runId, acceptedAt }.
- agentCommand запускает агента:
- определяет модель + значения thinking/verbose по умолчанию
- загружает снапшот навыков
- вызывает runEmbeddedPiAgent (среда выполнения pi-agent-core)
- генерирует lifecycle end/error, если встроенный цикл не сгенерировал его
- runEmbeddedPiAgent:
- сериализует запуски через очереди на уровне сессии и глобальные очереди
- определяет модель + профиль аутентификации и строит pi-сессию
- подписывается на pi-события и передает дельты assistant/tool
- применяет таймаут -> прерывает запуск при превышении
- возвращает пейлоады + метаданные использования
- subscribeEmbeddedPiSession связывает события pi-agent-core с потоком OpenClaw agent:
- события инструментов => stream: "tool"
- дельты assistant => stream: "assistant"
- события жизненного цикла => stream: "lifecycle" (phase: "start" | "end" | "error")
- agent.wait использует waitForAgentJob:
- ожидает lifecycle end/error для runId
- возвращает { status: ok|error|timeout, startedAt, endedAt, error? }
Очереди + конкуренция
- Запуски сериализуются по ключу сессии (линия сессии) и опционально через глобальную линию.
- Это предотвращает гонки инструментов/сессий и сохраняет консистентность истории сессии.
- Каналы сообщений могут выбирать режимы очереди (collect/steer/followup), которые питают эту систему линий. См. Очередь команд.
Подготовка сессии + рабочего пространства
- Рабочее пространство определяется и создается; песочные запуски могут перенаправляться в корень рабочего пространства песочницы.
- Навыки загружаются (или используются из снапшота) и внедряются в env и промпт.
- Файлы bootstrap/context определяются и внедряются в отчет системного промпта.
- Получается блокировка записи сессии; SessionManager открывается и подготавливается перед потоковой передачей.
Сборка промпта + системный промпт
- Системный промпт строится из базового промпта OpenClaw, промпта навыков, контекста bootstrap и переопределений для конкретного запуска.
- Применяются лимиты для конкретной модели и резервные токены для компактификации.
- См. Системный промпт для того, что видит модель.
Точки перехвата (где можно перехватить)
OpenClaw имеет две системы хуков:
- Внутренние хуки (Gateway hooks): скрипты, управляемые событиями для команд и событий жизненного цикла.
- Хуки плагинов: точки расширения внутри жизненного цикла агента/инструментов и конвейера gateway.
Внутренние хуки (Gateway hooks)
- agent:bootstrap: выполняется при создании файлов bootstrap перед финализацией системного промпта. Используйте это для добавления/удаления файлов контекста bootstrap.
- Хуки команд: /new, /reset, /stop и другие события команд (см. документацию Hooks).
См. Hooks для настройки и примеров.
Хуки плагинов (жизненный цикл агента + gateway)
Они выполняются внутри цикла агента или конвейера gateway:
- before_agent_start: внедрение контекста или переопределение системного промпта перед началом запуска.
- agent_end: проверка финального списка сообщений и метаданных запуска после завершения.
- before_compaction / after_compaction: наблюдение или аннотирование циклов компактификации.
- before_tool_call / after_tool_call: перехват параметров/результатов инструментов.
- tool_result_persist: синхронное преобразование результатов инструментов перед записью в транскрипт сессии.
- message_received / message_sending / message_sent: хуки входящих + исходящих сообщений.
- session_start / session_end: границы жизненного цикла сессии.
- gateway_start / gateway_stop: события жизненного цикла gateway.
См. Плагины для API хуков и деталей регистрации.
Потоковая передача + частичные ответы
- Дельты assistant передаются из pi-agent-core и генерируются как события assistant.
- Потоковая передача блоков может генерировать частичные ответы либо на text_end, либо на message_end.
- Потоковая передача reasoning может быть отправлена как отдельный поток или как блочные ответы.
- См. Потоковая передача для поведения чанкинга и блочных ответов.
Выполнение инструментов + инструменты сообщений
- События начала/обновления/завершения инструментов генерируются в потоке tool.
- Результаты инструментов санитизируются по размеру и пейлоадам изображений перед логированием/генерацией.
- Отправки инструментов сообщений отслеживаются для подавления дубликатов подтверждений assistant.
Формирование ответа + подавление
- Финальные пейлоады собираются из:
- текста assistant (и опциональных рассуждений)
- встроенных сводок инструментов (когда verbose + разрешено)
- текста ошибки assistant при ошибке модели
- NO_REPLY обрабатывается как тихий токен и фильтруется из исходящих пейлоадов.
- Дубликаты инструментов сообщений удаляются из финального списка пейлоадов.
- Если не осталось рендерируемых пейлоадов и инструмент выдал ошибку, генерируется резервный ответ об ошибке инструмента (если только инструмент сообщений уже не отправил видимый пользователю ответ).
Компактификация + повторы
- Автокомпактификация генерирует события потока compaction и может вызвать повтор.
- При повторе буферы в памяти и сводки инструментов сбрасываются, чтобы избежать дублирования вывода.
- См. Компактификация для конвейера компактификации.
Потоки событий (на сегодня)
- lifecycle: генерируется subscribeEmbeddedPiSession (и как резерв agentCommand)
- assistant: потоковые дельты из pi-agent-core
- tool: потоковые события инструментов из pi-agent-core
Обработка чат-канала
- Дельты assistant буферизуются в чат-сообщения delta.
- Чат-сообщение final генерируется на lifecycle end/error.
Таймауты
- agent.wait по умолчанию: 30с (только ожидание). Параметр timeoutMs переопределяет.
- Среда выполнения агента: agents.defaults.timeoutSeconds по умолчанию 600с; применяется в таймере прерывания runEmbeddedPiAgent.
Где может завершиться рано
- Таймаут агента (прерывание)
- AbortSignal (отмена)
- Отключение Gateway или таймаут RPC
- Таймаут agent.wait (только ожидание, не останавливает агента)