Fundamentals
Цикл агента
Цикл агента — це серіалізований запуск для кожного сеансу, який перетворює повідомлення на дії та відповідь: приймання, складання контексту, інференс моделі, виконання інструментів, потокове передавання, збереження.
Точки входу
- RPC Gateway:
agentіagent.wait. - CLI:
openclaw agent.
Послідовність запуску
agentRPC перевіряє параметри, визначає сеанс (sessionKey/sessionId), зберігає метадані сеансу та негайно повертає{ runId, acceptedAt }.agentCommandвиконує цикл обробки: визначає модель і типові значення мислення/докладності/трасування, завантажує знімок Skills, викликаєrunEmbeddedAgentі створює резервну подію завершення/помилки життєвого циклу, якщо вбудований цикл її ще не створив.runEmbeddedAgent: серіалізує запуски через черги для кожного сеансу та глобальні черги, визначає модель і профіль автентифікації, створює сеанс OpenClaw, підписується на події середовища виконання, потоково передає зміни асистента/інструментів, забезпечує дотримання тайм-ауту запуску (перериваючи його після завершення часу) та повертає корисні навантаження разом із метаданими використання. Для циклів обробки сервера застосунку Codex він також перериває прийнятий цикл, який припинив створювати події поступу сервера застосунку до настання термінальної події.subscribeEmbeddedAgentSessionпередає події середовища виконання в потікagent: події інструментів — уstream: "tool", зміни асистента — уstream: "assistant", події життєвого циклу — уstream: "lifecycle"(phase: "start" | "end" | "error").agent.wait(waitForAgentRun) очікує завершення/помилки життєвого циклу вrunIdі повертає{ status: ok|error|timeout, startedAt, endedAt, error? }.
Черги та паралельність
Запуски серіалізуються за ключем сеансу (лінія сеансу) і, за потреби, через глобальну лінію, що запобігає конфліктам інструментів/сеансів. Канали обміну повідомленнями вибирають режим черги (керування/продовження/збирання/переривання), який передає дані в цю систему ліній; див. Черга команд.
Запис транскрипту додатково захищено блокуванням запису сеансу для файла сеансу. Блокування враховує процеси й базується на файлах, тому виявляє записувачів, які оминають внутрішньопроцесну чергу або походять з іншого процесу. Записувачі очікують до session.writeLock.acquireTimeoutMs (типове значення — 60000 мс; перевизначення змінною середовища — OPENCLAW_SESSION_WRITE_LOCK_ACQUIRE_TIMEOUT_MS), перш ніж повідомити, що сеанс зайнятий.
За замовчуванням блокування запису сеансу не є повторно вхідними. Допоміжна функція, яка навмисно виконує вкладене отримання того самого блокування, зберігаючи одного логічного записувача, має явно дозволити це за допомогою allowReentrant: true.
Підготовка сеансу та робочої області
- Робочу область визначено та створено; ізольовані запуски можуть переспрямовуватися до кореня ізольованої робочої області.
- Skills завантажуються (або повторно використовуються зі знімка) та впроваджуються в середовище й запит.
- Файли початкового завантаження/контексту визначаються та впроваджуються в системний запит.
- Блокування запису сеансу отримується, а ціль транскрипту сеансу готується до початку потокового передавання. Будь-який подальший шлях перезапису, Compaction або скорочення транскрипту має отримати те саме блокування перед зміною рядків транскрипту SQLite.
Складання запиту
Системний запит створюється з базового запиту OpenClaw, запиту Skills, контексту початкового завантаження та перевизначень для окремого запуску. Застосовуються специфічні для моделі обмеження та резерв токенів Compaction. Відомості про те, що бачить модель, див. у розділі Системний запит.
Перехоплювачі
OpenClaw має дві системи перехоплювачів:
- Внутрішні перехоплювачі (перехоплювачі Gateway): сценарії, керовані подіями, для команд і подій життєвого циклу.
- Перехоплювачі Plugin: точки розширення в життєвому циклі агента/інструмента та конвеєрі Gateway.
Внутрішні перехоплювачі (перехоплювачі Gateway)
agent:bootstrap: виконується під час створення файлів початкового завантаження до завершення формування системного запиту. Використовуйте його, щоб додавати або вилучати файли контексту початкового завантаження.- Перехоплювачі команд:
/new,/reset,/stopта інші події команд (див. документацію про перехоплювачі).
Налаштування та приклади див. у розділі Перехоплювачі.
Перехоплювачі Plugin
Вони виконуються в циклі агента або конвеєрі Gateway:
| Перехоплювач | Виконання |
|---|---|
before_model_resolve |
До сеансу (без messages), щоб детерміновано перевизначити постачальника/модель до визначення. |
before_prompt_build |
Після завантаження сеансу (з messages), щоб впровадити prependContext, systemPrompt, prependSystemContext або appendSystemContext до надсилання. Використовуйте prependContext для динамічного тексту окремого циклу обробки, а поля системного контексту — для сталих настанов, яким належить бути в просторі системного запиту. |
before_agent_start |
Перехоплювач для сумісності із застарілими версіями, який може виконуватися на будь-якому етапі; віддавайте перевагу явним перехоплювачам вище. |
before_agent_reply |
Після вбудованих дій, перед викликом LLM. Дає змогу Plugin перебрати на себе цикл обробки та повернути синтетичну відповідь або повністю її придушити. |
agent_end |
Після завершення, з остаточним списком повідомлень і метаданими запуску. |
before_compaction / after_compaction |
Спостерігають за циклами Compaction або додають до них анотації. |
before_tool_call / after_tool_call |
Перехоплюють параметри/результати інструментів. |
before_install |
Після виконання політики встановлення оператора, для підготовлених матеріалів установлення Skills/Plugin, коли перехоплювачі Plugin завантажено в поточному процесі. |
tool_result_persist |
Синхронно перетворює результати інструментів перед їх записом до транскрипту сеансу, яким керує OpenClaw. |
message_received / message_sending / message_sent |
Перехоплювачі вхідних і вихідних повідомлень. |
session_start / session_end |
Межі життєвого циклу сеансу. |
gateway_start / gateway_stop |
Події життєвого циклу Gateway. |
Правила ухвалення рішень перехоплювачами для захисту вихідних даних/інструментів:
before_tool_call:{ block: true }є термінальним і зупиняє обробники з нижчим пріоритетом.{ block: false }не виконує жодних дій і не скасовує попереднє блокування.before_install: така сама термінальна семантика й семантика відсутності дії, як вище. Використовуйтеsecurity.installPolicy, а неbefore_install, для належних оператору рішень щодо дозволу/блокування встановлення, які мають охоплювати шляхи встановлення й оновлення через CLI.message_sending:{ cancel: true }є термінальним і зупиняє обробники з нижчим пріоритетом.{ cancel: false }не виконує жодних дій і не скасовує попереднє скасування.
API перехоплювачів і подробиці реєстрації див. у розділі Перехоплювачі Plugin.
Каркаси можуть адаптувати ці перехоплювачі. Каркас сервера застосунку Codex зберігає перехоплювачі Plugin OpenClaw як контракт сумісності для документованих віддзеркалених поверхонь; нативні перехоплювачі Codex є окремим механізмом Codex нижчого рівня.
Потокове передавання
- Зміни асистента потоково передаються із середовища виконання агента як події
assistant. - Блокове потокове передавання може створювати часткові відповіді в
text_endабоmessage_end. - Потокове передавання міркувань може бути окремим потоком або блоковими відповідями.
- Відомості про поділ на фрагменти та поведінку блокових відповідей див. у розділі Потокове передавання.
Виконання інструментів
- Події запуску/оновлення/завершення інструментів створюються в потоці
tool. - Результати інструментів очищуються з урахуванням розміру та корисних навантажень зображень до журналювання/створення подій.
- Надсилання інструментами обміну повідомленнями відстежуються, щоб запобігати дублюванню підтверджень асистента.
Формування відповіді
Остаточні корисні навантаження складаються з тексту асистента (разом із необов'язковими міркуваннями), вбудованих зведень інструментів (коли ввімкнено докладний режим і це дозволено) та тексту помилки асистента, якщо в моделі виникла помилка.
- Точний токен мовчання
NO_REPLYвідфільтровується з вихідних корисних навантажень. - Дублікати інструмента обміну повідомленнями вилучаються з остаточного списку корисних навантажень.
- Якщо не залишилося придатних до відтворення корисних навантажень і в інструменті виникла помилка, створюється резервна відповідь про помилку інструмента, якщо інструмент обміну повідомленнями ще не надіслав видиму користувачеві відповідь.
Compaction і повторні спроби
Автоматичний Compaction створює події потоку compaction і може ініціювати повторну спробу. Під час повторної спроби буфери в пам'яті та зведення інструментів скидаються, щоб уникнути дублювання виведення. Див. Compaction.
Потоки подій
lifecycle: створюєтьсяsubscribeEmbeddedAgentSession(і як резервний варіант —agentCommand).assistant: потокові зміни із середовища виконання агента.tool: потокові події інструментів із середовища виконання агента.
Gateway проєктує події життєвого циклу та запуску/термінального стану інструментів в обмежений журнал аудиту, що містить лише метадані. Ця проєкція записує походження та коди результатів, не копіюючи запити, повідомлення, аргументи інструментів, результати інструментів або необроблені помилки зі шляху транскрипту/середовища виконання.
Обробка каналу чату
Зміни асистента буферизуються в повідомленнях чату delta. Подія чату final створюється під час завершення/помилки життєвого циклу.
Тайм-аути
| Тайм-аут | Типове значення | Примітки |
|---|---|---|
agent.wait |
30s | Лише очікування; параметр timeoutMs перевизначає значення. Не зупиняє базовий запуск. |
Середовище виконання агента (agents.defaults.timeoutSeconds) |
172800s (48h) | Забезпечується таймером переривання runEmbeddedAgent. Установіть 0 для необмеженого бюджету запуску; сторожові таймери активності потоку моделі все одно застосовуються. |
| Ізольований хід агента Cron | належить Cron | Планувальник запускає власний таймер на початку виконання, перериває запуск у налаштований граничний термін, а потім виконує обмежене очищення перед реєстрацією тайм-ауту, щоб застарілий дочірній сеанс не міг залишити канал заблокованим. |
| Тайм-аут бездіяльності моделі | Хмара — 120s; власний сервер — 300s | OpenClaw перериває запит до моделі, якщо до завершення вікна бездіяльності не надходять фрагменти відповіді. models.providers.<id>.timeoutSeconds подовжує цей сторожовий таймер бездіяльності для повільних локальних провайдерів або провайдерів на власному сервері, але його й надалі обмежує будь-який менший скінченний тайм-аут agents.defaults.timeoutSeconds або тайм-аут конкретного запуску, оскільки вони керують усім запуском агента. Навіть за необмеженого бюджету запуску зберігається сторожовий таймер бездіяльності для відповідного класу провайдера. Запуски хмарної моделі, ініційовані Cron без явно заданого тайм-ауту моделі або агента, використовують те саме типове значення; якщо явно задано тайм-аут запуску Cron, зависання потоку хмарної моделі обмежуються 60s, щоб налаштовані резервні моделі все ще могли запуститися до настання зовнішнього граничного терміну Cron. Запуски, ініційовані Cron на справді локальних кінцевих точках (циклічна або приватна baseUrl), зберігають локальну можливість вимкнення тайм-ауту бездіяльності; для провайдерів на власному сервері з мережевими baseUrl неявно застосовується сторожовий таймер 300s. Якщо явно задано тайм-аут запуску Cron, зависання локальних провайдерів або провайдерів на власному сервері обмежуються цим тайм-аутом. Установіть models.providers.<id>.timeoutSeconds для повільних локальних провайдерів. |
| Тайм-аут HTTP-запиту провайдера | models.providers.<id>.timeoutSeconds |
Охоплює підключення, заголовки, тіло, тайм-аут запиту SDK, обробку переривання захищеного отримання та сторожовий таймер бездіяльності потоку моделі для цього провайдера. Використовуйте для повільних локальних провайдерів або провайдерів на власному сервері (наприклад, Ollama), перш ніж збільшувати тайм-аут усього середовища виконання агента; якщо запит до моделі має виконуватися довше, тайм-аут агента або середовища виконання має бути не меншим. |
Діагностика завислих сеансів
Коли діагностику ввімкнено, diagnostics.stuckSessionWarnMs (типово 120000 ms) класифікує тривалі сеанси processing, у яких не спостерігається відповіді, виклику інструмента, стану, блокування або поступу ACP:
- Активні вбудовані запуски, виклики моделі та виклики інструментів позначаються як
session.long_running. Керовані беззвучні виклики моделі залишаютьсяsession.long_runningдоdiagnostics.stuckSessionAbortMs, щоб повільні провайдери або провайдери без потокового передавання не позначалися як завислі надто рано. - Активна робота без нещодавнього поступу позначається як
session.stalled. Керовані виклики моделі переходять у станsession.stalledпісля досягнення порога переривання; застаріла активність моделі або інструмента без власника не приховується як довготривала. session.stuckпризначено для відновлюваних застарілих облікових даних сеансу, зокрема для неактивних сеансів у черзі із застарілою активністю моделі або інструмента без власника.
diagnostics.stuckSessionAbortMs типово становить щонайменше 5 хвилин і втричі перевищує поріг попередження. Застарілі облікові дані сеансу звільняють відповідний канал сеансу відразу після проходження перевірок відновлення; завислі вбудовані запуски перериваються з очікуванням завершення лише після досягнення порога переривання, тому робота в черзі відновлюється без припинення запусків, які лише виконуються повільно. Під час відновлення створюються структуровані результати запиту та завершення; діагностичний стан позначається як неактивний, лише якщо те саме покоління обробки все ще є поточним, а повторна діагностика session.stuck виконується дедалі рідше, доки сеанс залишається незмінним.
Де виконання може завершитися достроково
- Тайм-аут агента (переривання)
- AbortSignal (скасування)
- Відключення Gateway або тайм-аут RPC
- Тайм-аут
agent.wait(лише очікування, не зупиняє агента)
Пов’язані матеріали
- Інструменти — доступні інструменти агента
- Перехоплювачі — сценарії, керовані подіями та ініційовані подіями життєвого циклу агента
- Compaction — як підсумовуються довгі розмови
- Схвалення виконання — шлюзи схвалення для команд оболонки
- Міркування — налаштування рівня мислення та міркування