Даст ваш ИИ-агент полезный ответ или уверенно выдумает что-нибудь — зависит в первую очередь от управления контекстом: как история диалога, результаты работы инструментов и внешние знания упаковываются в конечное контекстное окно модели. До OpenClaw 2026.3.7 эта логика была захардкожена. Теперь это плагин.
Проблема
OpenClaw использовал компактизацию скользящим окном: разговор становился слишком длинным, старые сообщения сжимались в саммари, новые получали место. Работало. Но были компромиссы, и устраивали они далеко не всех:
- •Суммаризация теряет детали. Агенту-кодеру нужно сослаться на функцию из 50 ходов назад? Уже нет её.
- •Никакой памяти между сессиями. Закрыл сессию — потерял контекст. Каждый разговор начинается с нуля.
- •Одна стратегия — бери или уходи. Хочешь сборку на основе RAG? Ветвление диалогов? Кастомные бюджеты токенов? Чистого способа нет.
Люди выкручивались — monkey-patching внутренностей, форки ядра, внешняя оркестрация поверх. Ничего из этого не было жизнеспособным.
ContextEngine: Слот плагина для управления контекстом
Версия 2026.3.7 берёт весь жизненный цикл контекста, выносит его в чётко определённый интерфейс и открывает как plugin slot. Пишешь плагин, реализуешь интерфейс — и управление контекстом в твоих руках.
Как подключается
Зарегистрируй свою engine через plugin API:
// In your plugin's bootstrap
export default function myContextPlugin(api: PluginAPI) {
api.registerContextEngine('my-engine', (config) => {
return new MyCustomContextEngine(config);
});
}
Выбери в конфиге:
plugins:
slots:
contextEngine: my-engine
Плагин не настроен? OpenClaw оборачивает старое поведение в LegacyContextEngine. Для существующих пользователей ничего не меняется.
Семь хуков жизненного цикла
Интерфейс даёт семь хуков — по одному на каждый этап, который имеет значение в ходе диалога:
1. `bootstrap()`
Engine запускается. Подключайся к векторной БД, строй граф, загружай сохранённое состояние.
async bootstrap(): Promise<void> {
this.vectorStore = await connectToVectorDB(this.config.dbUrl);
this.sessionGraph = new DAG();
}
2. `ingest(message: Message)`
Пришло новое сообщение — ввод пользователя, ответ ассистента, вывод инструмента. Ты решаешь, как его хранить и индексировать.
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 — кардинально разные стратегии:
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`
Агент порождает субагента. Сколько контекста дать дочернему? Всё — взорвёт бюджет токенов. Ничего — оставит его слепым. Этот хук позволяет действовать точечно.
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.Разработчики плагинов наконец могут конкурировать в самой сложной задаче UX агентов: качество контекста.
- 2.Корпоративные пользователи получают контроль за соответствием требованиям — редактирование до того, как модель увидит данные, политики хранения, аудит каждого промпта.
- 3.Исследователи могут тестировать новые стратегии контекста, не поддерживая собственный форк.
- 4.Провайдеры моделей могут выпускать плагины, заточенные под свои архитектуры. Модели с длинным и коротким контекстом не должны использовать одну и ту же стратегию.
Вот что на самом деле значит, когда фреймворк становится платформой. Не ребрендинг. Не блог-пост с анонсом «видения». Конкретное архитектурное изменение, которое делает экосистему самоусиливающейся. Больше плагинов → больше пользователей → больше разработчиков → больше плагинов. Когда этот цикл запускается, остановить его сложно.
У лобстера только что выросла новая клешня.