technical architecture plugins contextengine

ContextEngine подробно: как OpenClaw 2026.3.7 превратил управление контекстом в плагин

OpenClaws.io Team

OpenClaws.io Team

@openclaws

March 9, 2026

10 мин чтения

ContextEngine подробно: как OpenClaw 2026.3.7 превратил управление контекстом в плагин

Даст ваш ИИ-агент полезный ответ или уверенно выдумает что-нибудь — зависит в первую очередь от управления контекстом: как история диалога, результаты работы инструментов и внешние знания упаковываются в конечное контекстное окно модели. До OpenClaw 2026.3.7 эта логика была захардкожена. Теперь это плагин.

Проблема

OpenClaw использовал компактизацию скользящим окном: разговор становился слишком длинным, старые сообщения сжимались в саммари, новые получали место. Работало. Но были компромиссы, и устраивали они далеко не всех:

  • Суммаризация теряет детали. Агенту-кодеру нужно сослаться на функцию из 50 ходов назад? Уже нет её.
  • Никакой памяти между сессиями. Закрыл сессию — потерял контекст. Каждый разговор начинается с нуля.
  • Одна стратегия — бери или уходи. Хочешь сборку на основе RAG? Ветвление диалогов? Кастомные бюджеты токенов? Чистого способа нет.

Люди выкручивались — monkey-patching внутренностей, форки ядра, внешняя оркестрация поверх. Ничего из этого не было жизнеспособным.

ContextEngine: Слот плагина для управления контекстом

Версия 2026.3.7 берёт весь жизненный цикл контекста, выносит его в чётко определённый интерфейс и открывает как plugin slot. Пишешь плагин, реализуешь интерфейс — и управление контекстом в твоих руках.

Как подключается

Зарегистрируй свою engine через plugin API:

typescript
// In your plugin's bootstrap
export default function myContextPlugin(api: PluginAPI) {
  api.registerContextEngine('my-engine', (config) => {
    return new MyCustomContextEngine(config);
  });
}

Выбери в конфиге:

yaml
plugins:
  slots:
    contextEngine: my-engine

Плагин не настроен? OpenClaw оборачивает старое поведение в LegacyContextEngine. Для существующих пользователей ничего не меняется.

Семь хуков жизненного цикла

Интерфейс даёт семь хуков — по одному на каждый этап, который имеет значение в ходе диалога:

1. `bootstrap()`

Engine запускается. Подключайся к векторной БД, строй граф, загружай сохранённое состояние.

typescript
async bootstrap(): Promise<void> {
  this.vectorStore = await connectToVectorDB(this.config.dbUrl);
  this.sessionGraph = new DAG();
}

2. `ingest(message: Message)`

Пришло новое сообщение — ввод пользователя, ответ ассистента, вывод инструмента. Ты решаешь, как его хранить и индексировать.

typescript
async ingest(message: Message): Promise<void> {
  // Add to the DAG
  const node = this.sessionGraph.addNode(message);
  // Index for retrieval
  const embedding = await embed(message.content);
  await this.vectorStore.upsert(node.id, embedding, message);
}

3. `assemble(budget: TokenBudget): AssembledContext`

Главный хук. Перед каждым вызовом модели OpenClaw передаёт тебе бюджет токенов и говорит: собери мне контекст. Что вернёшь — ровно то модель и увидит.

Разные engine — кардинально разные стратегии:

typescript
async assemble(budget: TokenBudget): AssembledContext {
  const recentMessages = this.sessionGraph.getRecent(budget.soft * 0.6);
  const relevantHistory = await this.vectorStore.query(
    this.currentQuery,
    budget.soft * 0.3
  );
  const systemContext = this.buildSystemPrompt(budget.soft * 0.1);

  return {
    system: systemContext,
    messages: [...relevantHistory, ...recentMessages],
    tokenEstimate: this.estimateTokens([systemContext, ...relevantHistory, ...recentMessages]),
  };
}

4. `compact()`

Контекст пробил жёсткий лимит токенов. Пора ужиматься. Дефолтная engine суммаризирует старые сообщения. Твой плагин может обрезать узлы графа, выгрузить в векторное хранилище или вообще ничего не делать, если assemble() и так укладывается в бюджет.

5. `afterTurn(turn: Turn)`

Полный ход завершён — пользователь высказался, агент ответил. Подходящий момент сохранить состояние, обновить индексы или запустить фоновую работу.

6. `prepareSubagentSpawn(parentContext: Context): SubagentContext`

Агент порождает субагента. Сколько контекста дать дочернему? Всё — взорвёт бюджет токенов. Ничего — оставит его слепым. Этот хук позволяет действовать точечно.

typescript
prepareSubagentSpawn(parentContext: Context): SubagentContext {
  // Give the subagent a focused slice of context
  const relevantNodes = this.sessionGraph.getSubtree(parentContext.taskId);
  return {
    messages: relevantNodes.map(n => n.message),
    metadata: { parentSessionId: this.sessionId },
  };
}

7. `onSubagentEnded(result: SubagentResult)`

Субагент завершил работу. Его результаты нужно как-то вернуть в родительский контекст — слить всё, сделать саммари, отобрать вручную. Решать тебе.

Архитектура: Слоты vs. Хуки

ContextEngine — это slot, а не hook. Хуки аддитивны: десять плагинов могут одновременно слушать onMessage. Слоты эксклюзивны. Одна ContextEngine в каждый момент времени.

┌─────────────────────────────────────┐
│           Plugin Registry           │
│                                     │
│  Хуки (аддитивные):                │
│    onMessage  → [plugin1, plugin2]  │
│    onTool     → [plugin3]           │
│                                     │
│  Слоты (эксклюзивные):             │
│    contextEngine → my-engine        │
│    (по умолч.: LegacyContextEngine) │
└─────────────────────────────────────┘

При запуске OpenClaw читает plugins.slots.contextEngine, находит зарегистрированную фабрику и инстанцирует её. Если engine не существует — запуск падает громко. Никакого тихого фоллбэка — это осознанное решение. Ты должен знать, какая context engine у тебя работает.

Изоляция субагентов реализована через AsyncLocalStorage: каждый дочерний получает свой scoped runtime. Состояние плагинов не протекает через границы агентов.

Что Уже Строят

Lossless-Claw

GitHub · Martian Engineering

Первый серьёзный плагин для ContextEngine. Заменяет компактизацию скользящим окном на систему суммаризации на основе DAG, которая сохраняет каждое оригинальное сообщение, оставаясь в рамках лимита токенов.

  • Каждое сообщение становится узлом в направленном ациклическом графе
  • Узлы группируются в «эпизоды» по теме
  • Бюджет превышен? Старые эпизоды суммаризируются, но оригиналы остаются в графе
  • Если поздний ход ссылается на старый контент, engine достаёт оригинал — не саммари

Если у вас когда-нибудь агент-кодер забывал функцию, которую сам написал час назад, — вот решение.

MemOS Cloud Plugin

GitHub · MemTensor

Делает одну вещь: даёт вашему агенту память, которая переживает сессии.

  • В bootstrap(): подтягивает релевантные воспоминания из MemOS Cloud на основе первого сообщения
  • В afterTurn(): сохраняет новые ходы в облако
  • В assemble(): внедряет извлечённые воспоминания в системный контекст

Ваш агент помнит разговор прошлой недели, ваши предпочтения, ваши проекты. Хватит повторяться.

Что Дальше

Судя по issues на GitHub и Discord, сообщество работает над:

  • Нативная сборка через RAG: Без истории сообщений — контекст собирается из извлечённых фрагментов документов. OpenClaw как разговорный поисковик.
  • Общая память для нескольких агентов: Несколько агентов делят один knowledge graph. Совместные рабочие процессы без дублирования контекста.
  • Оптимизация бюджета токенов: Динамическая подстройка состава контекста под конкретную модель — её ценообразование, сильные стороны, длину контекста.
  • Ветвление диалогов: Контекст с древовидной структурой. Исследуй разные пути, возвращайся назад, сохраняй всё.

Почему Это Меняет Правила Игры

OpenClaw всегда умел добавлять каналы, модели и инструменты. Но контекст — то, как агент на самом деле думает — был заперт внутри ядра. Без форка к нему было не подступиться.

ContextEngine взламывает этот замок. А когда он открыт, эффекты начинают накапливаться:

  1. 1.Разработчики плагинов наконец могут конкурировать в самой сложной задаче UX агентов: качество контекста.
  2. 2.Корпоративные пользователи получают контроль за соответствием требованиям — редактирование до того, как модель увидит данные, политики хранения, аудит каждого промпта.
  3. 3.Исследователи могут тестировать новые стратегии контекста, не поддерживая собственный форк.
  4. 4.Провайдеры моделей могут выпускать плагины, заточенные под свои архитектуры. Модели с длинным и коротким контекстом не должны использовать одну и ту же стратегию.

Вот что на самом деле значит, когда фреймворк становится платформой. Не ребрендинг. Не блог-пост с анонсом «видения». Конкретное архитектурное изменение, которое делает экосистему самоусиливающейся. Больше плагинов → больше пользователей → больше разработчиков → больше плагинов. Когда этот цикл запускается, остановить его сложно.

У лобстера только что выросла новая клешня.

Поделиться в:
star Star on GitHub

Будь в курсе

Получай новости о функциях и интеграциях. Без спама, отписаться можно в любой момент.