Агентный цикл (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? }
Очередь + одновременная¶
- Прогоны сериализуются по ключу сеанса (полоса сеанса) и при необходимости через глобальную полосу.
- Это предотвращает гонки инструментов/сеансов и сохраняет согласованность истории сеанса.
- Каналы сообщений могут выбирать режимы очереди (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).
См. 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: события жизненного цикла шлюза.
См. Plugins для API хуков и деталей регистрации.
Потоковое и частичные ответы¶
- Дельты ассистента стримятся из 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(только ожидание, агент не останавливается)