Агентный цикл (OpenClaw)
Агентный цикл — это полный «реальный» прогон агента: приём входных данных → сбор контекста → инференс модели → выполнение инструментов → потоковая передача ответов → сохранение состояния. Это авторитетный путь, который преобразует сообщение в действия и финальный ответ, одновременно поддерживая согласованность состояния сеанса. В OpenClaw цикл — это один сериализованный прогон на сеанс, который испускает события жизненного цикла и потока по мере того, как модель «думает», вызывает инструменты и стримит вывод. В этом документе объясняется, как этот аутентичный цикл связан сквозным образом от начала до конца.Точки входа
- RPC шлюза Gateway:
agentиagent.wait. - CLI: команда
agent.
Как это работает (в общих чертах)
- RPC
agentпроверяет параметры, разрешает сеанс (sessionKey/sessionId), сохраняет метаданные сеанса и немедленно возвращает{ runId, acceptedAt }. agentCommandзапускает агента:- разрешает модель и значения по умолчанию для thinking/verbose
- загружает снимок Skills
- вызывает
runEmbeddedPiAgent(рантайм pi-agent-core) - испускает lifecycle end/error, если встроенный цикл сам его не испустил
runEmbeddedPiAgent:- сериализует прогоны через очереди на уровне сеанса и глобальную очередь
- разрешает модель и профиль аутентификации и строит сеанс pi
- подписывается на события pi и стримит дельты ассистента/инструментов
- применяет тайм-аут → прерывает прогон при превышении
- возвращает полезные данные и метаданные использования
subscribeEmbeddedPiSessionсвязывает события pi-agent-core с потоком OpenClawagent:- события инструментов =>
stream: "tool" - дельты ассистента =>
stream: "assistant" - события жизненного цикла =>
stream: "lifecycle"(phase: "start" | "end" | "error")
- события инструментов =>
agent.waitиспользуетwaitForAgentJob:- ожидает lifecycle end/error для
runId - возвращает
{ status: ok|error|timeout, startedAt, endedAt, error? }
- ожидает lifecycle end/error для
Очередь + одновременная
- Прогоны сериализуются по ключу сеанса (полоса сеанса) и при необходимости через глобальную полосу.
- Это предотвращает гонки инструментов/сеансов и сохраняет согласованность истории сеанса.
- Каналы сообщений могут выбирать режимы очереди (collect/steer/followup), которые подпитывают эту систему полос. См. Command Queue.
Подготовка сеанса и рабочего пространства
- Рабочее пространство разрешается и создаётся; изолированные (sandboxed) прогоны могут перенаправляться в корень рабочего пространства sandbox.
- Skills загружаются (или переиспользуются из снимка) и внедряются в env и prompt.
- Bootstrap/контекстные файлы разрешаются и внедряются в отчёт системного prompt.
- Захватывается блокировка записи сеанса;
SessionManagerоткрывается и подготавливается до начала стриминга.
Сборка prompt и системный prompt
- Системный prompt строится из базового prompt OpenClaw, prompt Skills, bootstrap-контекста и переопределений на прогон.
- Применяются специфичные для модели лимиты и резерв токенов для уплотнения.
- См. System prompt, чтобы узнать, что видит модель.
Точки перехвата (где можно вмешаться)
В OpenClaw есть две системы хуков:- Внутренние хуки (хуки Gateway): сценарии, управляемые событиями, для команд и событий жизненного цикла.
- Хуки плагинов: точки расширения внутри жизненного цикла агента/инструментов и конвейера шлюза.
Внутренние хуки (хуки Gateway)
agent:bootstrap: выполняется во время сборки bootstrap-файлов до финализации системного prompt. Используйте это, чтобы добавлять/удалять bootstrap-контекстные файлы.- Хуки команд:
/new,/reset,/stopи другие события команд (см. документ Hooks).
Хуки плагинов (жизненный цикл агента + шлюза)
Они выполняются внутри агентного цикла или конвейера шлюза:before_agent_start: внедряет контекст или переопределяет системный prompt до начала прогона.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: события жизненного цикла шлюза.
Потоковое и частичные ответы
- Дельты ассистента стримятся из pi-agent-core и испускаются как события
assistant. - Потоковая передача блоками может испускать частичные ответы либо на
text_end, либо наmessage_end. - Стриминг рассуждений может испускаться как отдельный поток или как ответы блоками.
- См. Streaming для поведения чанков и блоковых ответов.
Выполнение инструментов и инструменты сообщений
- События старта/обновления/завершения инструментов испускаются в потоке
tool. - Результаты инструментов очищаются по размеру и полезным нагрузкам изображений перед логированием/эмиссией.
- Отправки инструментов сообщений отслеживаются для подавления дублирующих подтверждений ассистента.
Формирование ответа и подавление
- Окончательные нагрузки собраны из:
- текста ассистента (и необязательных рассуждений)
- встроенных сводок инструментов (когда verbose включён и разрешён)
- текста ошибки ассистента при ошибке модели
NO_REPLYрассматривается как «тихий» токен и фильтруется из исходящих полезных данных.- Дубликаты инструментов сообщений удаляются из финального списка полезных данных.
- Если не остаётся отображаемых полезных данных и инструмент завершился с ошибкой, испускается запасной ответ об ошибке инструмента (если только инструмент сообщений уже не отправил видимый пользователю ответ).
Компакт + повторы
- Автоуплотнение испускает события потока
compactionи может инициировать повтор. - При повторе буферы в памяти и сводки инструментов сбрасываются, чтобы избежать дублирования вывода.
- Compaction для конвейера уплотнения.
Потоки событий (на сегодня)
lifecycle: испускаетсяsubscribeEmbeddedPiSession(и как запасной вариант —agentCommand)assistant: стриминг дельт из pi-agent-coretool: стриминг событий инструментов из pi-agent-core
Обработка чат-каналов
- Дельты ассистента буферизуются в чат-сообщения
delta. - Чат-сообщение
finalиспускается при lifecycle end/error.
Тайм-ауты
- Значение по умолчанию
agent.wait: 30 с (только ожидание). Переопределяется параметромtimeoutMs. - Рантайм агента: значение по умолчанию
agents.defaults.timeoutSeconds— 600 с; обеспечивается таймером прерыванияrunEmbeddedPiAgent.
Где выполнение может завершиться раньше
- Тайм-аут агента (прерывание)
- AbortSignal (отмена)
- Отключение шлюза Gateway или тайм-аут RPC
- Тайм-аут
agent.wait(только ожидание, агент не останавливается)