Fundamentals

Механізм контексту

Рушій контексту керує тим, як OpenClaw формує контекст моделі для кожного запуску: які повідомлення включати, як узагальнювати давнішу історію та як керувати контекстом на межах субагентів.

OpenClaw постачається з вбудованим рушієм legacy і використовує його за замовчуванням. Установлюйте й вибирайте рушій-плагін, лише якщо потрібна інша поведінка формування, ущільнення або відновлення даних між сеансами.

Швидкий початок

  • Перевірте, який рушій активний

    bash
    openclaw doctor# або перевірте конфігурацію безпосередньо:cat ~/.openclaw/openclaw.json | jq '.plugins.slots.contextEngine'
  • Установіть рушій-плагін

    Плагіни рушіїв контексту встановлюються так само, як і будь-які інші плагіни OpenClaw.

    З npm

    bash
    openclaw plugins install @martian-engineering/lossless-claw

    З локального шляху

    bash
    openclaw plugins install -l ./my-context-engine
  • Увімкніть і виберіть рушій

    json5
    // openclaw.json{  plugins: {    slots: {      contextEngine: "lossless-claw", // має відповідати ідентифікатору рушія, зареєстрованому плагіном    },    entries: {      "lossless-claw": {        enabled: true,        // Тут указується конфігурація плагіна (див. документацію плагіна)      },    },  },}

    Після встановлення та налаштування перезапустіть Gateway.

  • Поверніться до застарілого рушія (необов’язково)

    Установіть для contextEngine значення "legacy" (або повністю видаліть ключ — "legacy" є значенням за замовчуванням).

  • Як це працює

    Щоразу, коли OpenClaw запускає запит до моделі, рушій контексту залучається на чотирьох етапах життєвого циклу:

    1. Приймання

    Викликається, коли до сеансу додається нове повідомлення. Рушій може зберегти або проіндексувати повідомлення у власному сховищі даних.

    2. Формування

    Викликається перед кожним запуском моделі. Рушій повертає впорядкований набір повідомлень (і необов’язковий systemPromptAddition), які вкладаються в бюджет токенів.

    3. Ущільнення

    Викликається, коли контекстне вікно заповнене або коли користувач запускає /compact. Рушій узагальнює давнішу історію, щоб звільнити місце.

    4. Після ходу

    Викликається після завершення запуску. Рушій може зберегти стан, запустити фонове ущільнення або оновити індекси.

    Рушії також можуть реалізовувати необов’язковий метод maintain() для обслуговування транскрипту (безпечного перезаписування через runtimeContext.rewriteTranscriptEntries()) після початкового завантаження, успішного ходу або ущільнення. Установіть info.turnMaintenanceMode: "background", щоб виконувати його як відкладену роботу, а не блокувати відповідь.

    Для вбудованого засобу виконання Codex без ACP OpenClaw застосовує той самий життєвий цикл, проєктуючи сформований контекст в інструкції розробника Codex і запит поточного ходу. Codex і надалі керує власною історією потоків і власним засобом ущільнення.

    Життєвий цикл субагента (необов’язково)

    OpenClaw викликає два необов’язкові перехоплювачі життєвого циклу субагента:

    prepareSubagentSpawnmethod

    Підготуйте спільний стан контексту перед початком дочірнього запуску. Перехоплювач отримує ключі батьківського й дочірнього сеансів, contextMode (isolated або fork), доступні ідентифікатори чи файли транскриптів і необов’язковий TTL. Якщо він повертає дескриптор відкочування, OpenClaw викликає його, коли створення завершується невдало після успішної підготовки. Власні механізми створення субагентів, які запитують lightContext і визначаються як contextMode="isolated", навмисно пропускають цей перехоплювач, щоб дочірній процес починав роботу з полегшеного початкового контексту без стану перед створенням, яким керує рушій контексту.

    onSubagentEndedmethod

    Виконайте очищення після завершення або прибирання сеансу субагента.

    Доповнення системного запиту

    Метод assemble може повертати рядок systemPromptAddition. OpenClaw додає його на початок системного запиту для запуску. Це дає рушіям змогу вставляти динамічні вказівки щодо відновлення даних, інструкції з пошуку або підказки з урахуванням контексту без потреби у статичних файлах робочого простору.

    Застарілий рушій

    Вбудований рушій legacy зберігає початкову поведінку OpenClaw:

    • Приймання: не виконує жодних дій (диспетчер сеансів безпосередньо керує збереженням повідомлень).
    • Формування: передає дані без змін (формуванням контексту керує наявний у середовищі виконання конвеєр очищення → перевірки → обмеження).
    • Ущільнення: делегує роботу вбудованому ущільненню шляхом узагальнення, яке створює єдине резюме давніших повідомлень і залишає останні повідомлення без змін.
    • Після ходу: не виконує жодних дій.

    Застарілий рушій не реєструє інструменти й не надає systemPromptAddition.

    Якщо plugins.slots.contextEngine не задано (або для нього встановлено "legacy"), цей рушій використовується автоматично.

    Рушії-плагіни

    Плагін може зареєструвати рушій контексту за допомогою API плагінів:

    ts
      export default function register(api) {  api.registerContextEngine("my-engine", (ctx) => ({    info: {      id: "my-engine",      name: "My Context Engine",      ownsCompaction: true,    },     async ingest({ sessionId, message, isHeartbeat }) {      // Збережіть повідомлення у своєму сховищі даних      return { ingested: true };    },     async assemble({      sessionId,      sessionKey,      messages,      tokenBudget,      availableTools,      citationsMode,    }) {      // Поверніть повідомлення, які вкладаються в бюджет      return {        messages: buildContext(messages, tokenBudget),        estimatedTokens: countTokens(messages),        systemPromptAddition: buildMemorySystemPromptAddition({          availableTools: availableTools ?? new Set(),          citationsMode,          agentId: resolveSessionAgentId({ config: ctx.config, sessionKey }),          agentSessionKey: sessionKey,        }),      };    },     async compact({ sessionId, force }) {      // Узагальніть давніший контекст      return { ok: true, compacted: true };    },  }));}

    Фабрика ctx містить необов’язкові значення config, agentDir і workspaceDir, щоб плагіни могли ініціалізувати стан окремого агента або робочого простору до виконання першого перехоплювача життєвого циклу.

    Потім увімкніть його в конфігурації:

    json5
    {  plugins: {    slots: {      contextEngine: "my-engine",    },    entries: {      "my-engine": {        enabled: true,      },    },  },}

    Інтерфейс ContextEngine

    Обов’язкові члени:

    Член Вид Призначення
    info Властивість Ідентифікатор, назва й версія рушія, а також ознака того, чи керує він ущільненням
    ingest(params) Метод Зберегти одне повідомлення
    assemble(params) Метод Сформувати контекст для запуску моделі (повертає AssembleResult)
    compact(params) Метод Узагальнити або скоротити контекст

    assemble повертає AssembleResult з такими полями:

    messagesMessage[]required

    Упорядковані повідомлення, які потрібно надіслати моделі.

    estimatedTokensnumberrequired

    Оцінка рушієм загальної кількості токенів у сформованому контексті. OpenClaw використовує її для ухвалення рішень щодо порога ущільнення та діагностичних звітів.

    systemPromptAdditionstring

    Додається на початок системного запиту.

    promptAuthority"assembled" | "preassembly_may_overflow"

    Визначає, яку оцінку кількості токенів засіб запуску використовує для попередніх перевірок на випередження переповнення. Значення за замовчуванням — "assembled", тобто для рушіїв, які не керують ущільненням, перевіряється лише оцінка сформованого запиту. Рушії, які задають ownsCompaction: true, самостійно керують допуском запитів, тому OpenClaw за замовчуванням пропускає загальну попередню перевірку перед запитом. Установлюйте "preassembly_may_overflow", лише якщо сформоване представлення може приховати ризик переповнення в базовому транскрипті; тоді засіб запуску залишає загальну попередню перевірку активною та бере максимальне значення з оцінки сформованого контексту й оцінки історії сеансу до формування (без застосування вікна), вирішуючи, чи потрібно заздалегідь виконати ущільнення. У будь-якому разі модель і надалі отримує саме повернені повідомлення — promptAuthority впливає лише на попередню перевірку.

    contextProjectionContextEngineProjection

    Необов’язковий життєвий цикл проєкції для хостів із постійними серверними потоками (наприклад, app-server Codex). mode: "thread_bootstrap" зі стабільним epoch указує хосту вставити сформований контекст один раз за епоху й повторно використовувати серверний потік, доки епоха не зміниться, замість повторного проєктування на кожному ході. Для звичайного проєктування на кожному ході не вказуйте це поле.

    compact повертає CompactResult. Коли ущільнення змінює ідентичність активного сеансу, result.sessionTarget (типізований ContextEngineSessionTarget, що містить ідентичність сеансу й область сховища) визначає наступний сеанс, який має використовувати наступна повторна спроба або хід; result.sessionId дублює ідентифікатор наступного сеансу.

    Необов’язкові члени:

    Член Вид Призначення
    bootstrap(params) Метод Ініціалізувати стан рушія для сеансу. Викликається один раз, коли рушій уперше бачить сеанс (наприклад, під час імпорту історії).
    maintain(params) Метод Обслуговування транскрипту після початкового завантаження, успішного ходу або ущільнення. Використовуйте runtimeContext.rewriteTranscriptEntries() для безпечного перезаписування.
    ingestBatch(params) Метод Прийняти завершений хід як пакет. Викликається після завершення запуску з усіма повідомленнями цього ходу одночасно.
    afterTurn(params) Метод Робота життєвого циклу після запуску (збереження стану, запуск фонового ущільнення).
    prepareSubagentSpawn(params) Метод Налаштувати спільний стан для дочірнього сеансу до його початку.
    onSubagentEnded(params) Метод Виконати очищення після завершення роботи субагента.
    dispose() Метод Звільнити ресурси. Викликається під час завершення роботи Gateway або перезавантаження плагіна, а не для кожного сеансу.

    Налаштування середовища виконання

    Перехоплювачі життєвого циклу, які виконуються всередині OpenClaw, отримують необов’язковий об’єкт runtimeSettings. Це версіонована внутрішня поверхня API «виробник — споживач» лише для читання: OpenClaw створює її для вибраного рушія контексту, а рушій контексту використовує її в перехоплювачах життєвого циклу. Вона не відображається безпосередньо користувачам і не створює окремої поверхні звітності.

    • schemaVersion: наразі 1
    • runtime: хост OpenClaw, режим середовища виконання (normal, fallback або degraded) та необов’язкові ідентифікатори тестового каркаса/середовища виконання
    • contextEngineSelection: ідентифікатор вибраного рушія контексту та джерело вибору
    • executionHost: ідентифікатор і мітка хоста для поверхні, що викликає хук
    • model: запитана модель, визначена модель, провайдер і необов’язкове сімейство моделей
    • limits: бюджет токенів запиту та максимальна кількість вихідних токенів, якщо відомо
    • diagnostics: коди причин закритого резервного переходу та роботи в погіршеному режимі, якщо відомо

    Поля, значення яких може бути невідомим, подаються як null; поля-дискримінатори, як-от режим середовища виконання та джерело вибору, не допускають значення null. Старіші рушії залишаються сумісними: якщо строгий застарілий рушій відхиляє runtimeSettings як невідому властивість, OpenClaw повторює виклик життєвого циклу без неї замість поміщення рушія в карантин.

    Вимоги до хоста

    Рушії контексту можуть оголошувати вимоги до можливостей хоста в info.hostRequirements. OpenClaw перевіряє ці вимоги перед початком операції та безпечно припиняє роботу з описовою помилкою, якщо вибране середовище виконання не може їх задовольнити.

    Для запусків агента оголосіть assemble-before-prompt, якщо рушій має керувати фактичним запитом моделі через assemble():

    ts
    info: {  id: "my-context-engine",  name: "My Context Engine",  hostRequirements: {    "agent-run": {      requiredCapabilities: ["assemble-before-prompt"],      unsupportedMessage:        "Використовуйте вбудоване середовище виконання Codex або OpenClaw чи виберіть застарілий рушій контексту.",    },  },}

    Нативні запуски агента Codex і запуски у вбудованому середовищі OpenClaw задовольняють assemble-before-prompt. Універсальні серверні компоненти CLI — ні, тому рушії, які вимагають цю можливість, відхиляються до запуску процесу CLI.

    Ізоляція збоїв

    OpenClaw ізолює вибраний рушій плагіна від основного шляху відповіді. Якщо незастарілий рушій відсутній, не проходить перевірку контракту, генерує виняток під час створення фабрики або в методі життєвого циклу, OpenClaw поміщає цей рушій у карантин для поточного процесу Gateway і переводить роботу з рушієм контексту на вбудований рушій legacy. Помилка реєструється разом із невдалою операцією, щоб оператор міг виправити, оновити або вимкнути плагін, а агент не припиняв відповідати.

    Збої вимог до хоста обробляються інакше: коли рушій оголошує, що середовище виконання не має необхідної можливості, OpenClaw безпечно припиняє роботу до початку запуску. Це захищає рушії, які пошкодили б стан у разі запуску на непідтримуваному хості.

    ownsCompaction

    ownsCompaction визначає, чи залишається ввімкненим для запуску вбудоване автоматичне ущільнення середовища виконання OpenClaw у межах спроби:

    ownsCompaction: true

    Рушій керує поведінкою ущільнення. OpenClaw вимикає для цього запуску вбудоване автоматичне ущільнення середовища виконання OpenClaw і загальну попередню перевірку переповнення перед запитом, а реалізація compact() рушія відповідає за /compact, ущільнення для відновлення після переповнення провайдера та будь-яке випереджальне ущільнення, яке потрібно виконати в afterTurn(). OpenClaw усе одно запускає запобіжник переповнення перед запитом, коли рушій повертає promptAuthority: "preassembly_may_overflow" з assemble().

    ownsCompaction: false or unset

    Вбудоване автоматичне ущільнення середовища виконання OpenClaw усе ще може виконуватися під час обробки запиту, але метод compact() активного рушія все одно викликається для /compact і відновлення після переповнення.

    Отже, існує два коректні шаблони плагінів:

    Режим керування

    Реалізуйте власний алгоритм ущільнення та встановіть ownsCompaction: true.

    Режим делегування

    Установіть ownsCompaction: false і налаштуйте compact() на виклик delegateCompactionToRuntime(...) з openclaw/plugin-sdk/core, щоб використовувати вбудовану поведінку ущільнення OpenClaw.

    Порожня реалізація compact() небезпечна для активного рушія, який не керує ущільненням, оскільки вона вимикає звичайний шлях ущільнення /compact і відновлення після переповнення для цього слота рушія.

    Довідник із конфігурації

    json5
    {  plugins: {    slots: {      // Виберіть активний рушій контексту. Типове значення: "legacy".      // Установіть ідентифікатор плагіна, щоб використовувати рушій плагіна.      contextEngine: "legacy",    },  },}

    Зв’язок з ущільненням і пам’яттю

    Compaction

    Compaction — один з обов’язків рушія контексту. Застарілий рушій делегує роботу вбудованому механізму підсумовування OpenClaw. Рушії плагінів можуть реалізовувати будь-яку стратегію ущільнення (підсумки DAG, векторний пошук тощо).

    Плагіни пам’яті

    Плагіни пам’яті (plugins.slots.memory) відокремлені від рушіїв контексту. Плагіни пам’яті забезпечують пошук/отримання даних; рушії контексту керують тим, що бачить модель. Вони можуть працювати разом — рушій контексту може використовувати дані плагіна пам’яті під час складання. Рушіям плагінів, яким потрібен активний шлях запиту пам’яті, варто надавати перевагу buildMemorySystemPromptAddition(...) з openclaw/plugin-sdk/core, що перетворює активні розділи запиту пам’яті на готовий до додавання на початок systemPromptAddition. Якщо рушію потрібен низькорівневий контроль, він усе ще може отримувати необроблені рядки з openclaw/plugin-sdk/memory-host-core через buildActiveMemoryPromptSection(...).

    Обрізання сеансу

    Обрізання старих результатів інструментів у пам’яті виконується незалежно від того, який рушій контексту активний.

    Поради

    • Використовуйте openclaw doctor, щоб переконатися, що ваш рушій завантажується правильно.
    • Після перемикання рушіїв наявні сеанси продовжують працювати зі своєю поточною історією. Новий рушій застосовується до майбутніх запусків.
    • Помилки рушія реєструються, а вибраний рушій плагіна поміщається в карантин для поточного процесу Gateway. OpenClaw переходить на legacy для звернень користувача, щоб відповіді могли надходити й надалі, але несправний плагін усе одно потрібно виправити, оновити, вимкнути або видалити.
    • Для розробки використовуйте openclaw plugins install -l ./my-engine, щоб під’єднати локальний каталог плагіна без копіювання.

    Пов’язані матеріали

    Was this useful?
    On this page

    On this page