Skip to main content
OpenClaw заменил обширный слой обратной совместимости современной архитектурой плагинов, построенной на небольших специализированных импортах. Если ваш плагин появился до этого изменения, данное руководство поможет перевести его на текущие контракты.

Что изменилось

Раньше две чрезмерно широкие поверхности импорта позволяли плагинам получать доступ почти к чему угодно через единую точку входа:
  • openclaw/plugin-sdk/compat — повторно экспортировал десятки вспомогательных средств, чтобы старые плагины на основе перехватчиков продолжали работать во время создания новой архитектуры.
  • openclaw/plugin-sdk/infra-runtime — широкий сводный модуль, объединявший системные события, состояние Heartbeat, очереди доставки, вспомогательные средства получения данных и прокси, средства работы с файлами, типы подтверждений и не связанные между собой утилиты.
  • openclaw/plugin-sdk/config-runtime — широкий сводный модуль конфигурации, который в течение периода миграции всё ещё содержал устаревшие вспомогательные средства прямой загрузки и записи.
  • openclaw/extension-api — мост, предоставлявший плагинам прямой доступ к вспомогательным средствам хоста, таким как встроенный механизм запуска агента.
  • api.registerEmbeddedExtensionFactory(...) — удалённый перехватчик, предназначенный только для встроенного механизма запуска и отслеживавший его события, например tool_result. Вместо него используйте промежуточное ПО для результатов инструментов агента (см. Перенос расширений результатов инструментов встроенного механизма запуска в промежуточное ПО).
Эти поверхности устарели: они всё ещё работают, но новые плагины не должны их использовать, а существующие плагины следует перенести до следующего основного выпуска, в котором они будут удалены. registerEmbeddedExtensionFactory уже удалён; устаревшие регистрации больше не загружаются.
Слой обратной совместимости будет удалён в одном из будущих основных выпусков. После этого плагины, которые всё ещё импортируют из этих поверхностей, перестанут работать.
OpenClaw не удаляет и не переосмысливает документированное поведение плагинов в том же изменении, в котором вводится замена. Изменения контрактов, нарушающие совместимость, сначала проходят через адаптер совместимости, диагностику, документацию и период устаревания. Это относится к импортам SDK, полям манифеста, API настройки, перехватчикам и поведению регистрации во время выполнения.

Причины

  • Медленный запуск — импорт одного вспомогательного средства загружал десятки не связанных с ним модулей.
  • Циклические зависимости — широкие повторные экспорты упрощали создание циклов импорта.
  • Неясная поверхность API — невозможно было отличить стабильные экспорты от внутренних.
Теперь каждый openclaw/plugin-sdk/<subpath> представляет собой небольшой автономный модуль с документированным контрактом. Устаревшие вспомогательные интерфейсы провайдеров для встроенных каналов также удалены — вспомогательные сокращения с названиями каналов были внутренним удобством монорепозитория, а не стабильными контрактами плагинов. Вместо них используйте узкие универсальные подпути SDK. Внутри рабочего пространства встроенного плагина храните принадлежащие провайдеру вспомогательные средства в собственном api.ts или runtime-api.ts этого плагина:
  • Anthropic хранит специфичные для Claude вспомогательные средства потоковой передачи в собственном интерфейсе api.ts / contract-api.ts.
  • OpenAI хранит построители провайдера, вспомогательные средства модели по умолчанию и построители провайдера реального времени в собственном api.ts.
  • OpenRouter хранит построитель провайдера и вспомогательные средства первоначальной настройки и конфигурации в собственном api.ts.

Политика совместимости

Работа по обеспечению совместимости внешних плагинов выполняется в следующем порядке:
  1. Добавить новый контракт.
  2. Сохранить прежнее поведение через адаптер совместимости.
  3. Вывести диагностику или предупреждение с указанием старого пути и его замены.
  4. Охватить оба пути тестами.
  5. Документировать устаревание и путь миграции.
  6. Удалить только после завершения объявленного периода миграции, обычно в основном выпуске.
Если поле манифеста по-прежнему принимается, продолжайте использовать его, пока документация и диагностика не укажут обратное. Новый код должен предпочитать документированную замену; существующие плагины не должны переставать работать при обычных дополнительных выпусках. Проверьте текущую очередь миграции с помощью pnpm plugins:boundary-report: pnpm plugins:boundary-report:ci запускается со всеми тремя флагами ошибок. Каждая запись совместимости содержит явную дату removeAfter (а не расплывчатое указание «следующий основной выпуск») — отчёт группирует устаревшие записи по этой дате, подсчитывает локальные ссылки в коде и документации, выявляет импорты зарезервированного SDK между владельцами и суммирует сведения о закрытом мосте SDK хоста памяти. Зарезервированные подпути SDK должны иметь отслеживаемое использование владельцем; неиспользуемые зарезервированные экспорты следует удалить из публичного SDK.

Как выполнить миграцию

1

Перенесите вспомогательные средства загрузки и записи конфигурации среды выполнения

Встроенные плагины должны прекратить прямые вызовы api.runtime.config.loadConfig() и api.runtime.config.writeConfigFile(...). Предпочтительно использовать конфигурацию, уже переданную в активный путь вызова. Долгоживущие обработчики, которым нужен текущий снимок процесса, могут использовать api.runtime.config.current(). Долгоживущие инструменты агента должны читать ctx.getRuntimeConfig() внутри execute, чтобы инструмент, созданный до записи конфигурации, всё равно видел обновлённую конфигурацию.Запись конфигурации выполняется через транзакционное вспомогательное средство с явной политикой после записи:
Используйте afterWrite: { mode: "restart", reason: "..." }, когда изменение требует чистого перезапуска Gateway, и afterWrite: { mode: "none", reason: "..." } — только когда вызывающая сторона отвечает за последующие действия и намеренно отключает планировщик перезагрузки. Результаты изменения включают типизированную сводку followUp для тестов и журналирования; Gateway по-прежнему отвечает за применение или планирование перезапуска.loadConfig и writeConfigFile остаются устаревшими вспомогательными средствами совместимости для внешних плагинов и однократно выводят предупреждение с кодом совместимости runtime-config-load-write. Встроенные плагины и код среды выполнения репозитория защищены средствами pnpm check:deprecated-api-usage и pnpm check:no-runtime-action-load-config: новое использование в рабочем коде плагина немедленно завершается ошибкой, прямая запись конфигурации запрещена, методы сервера Gateway должны использовать снимок среды выполнения запроса, вспомогательные средства отправки, действий и клиентов каналов среды выполнения должны получать конфигурацию со своей границы, а в долгоживущих модулях среды выполнения не допускаются никакие фоновые вызовы loadConfig().В новом коде плагинов следует избегать широкого сводного модуля openclaw/plugin-sdk/config-runtime. Используйте узкий подпуть, соответствующий задаче:Встроенные плагины и их тесты защищены сканером от использования широкого сводного модуля, чтобы импорты и имитации оставались локальными для нужного поведения. Этот сводный модуль по-прежнему существует для совместимости с внешними плагинами, но новый код не должен от него зависеть.
2

Перенесите расширения результатов инструментов встроенного механизма запуска в промежуточное ПО

Встроенные плагины должны заменить обработчики результатов инструментов api.registerEmbeddedExtensionFactory(...), предназначенные только для встроенного механизма запуска, нейтральным к среде выполнения промежуточным ПО:
Одновременно обновите манифест плагина:
Установленные плагины также могут регистрировать промежуточное ПО результатов инструментов, если оно явно включено и каждая целевая среда выполнения объявлена в contracts.agentToolResultMiddleware. Регистрации промежуточного ПО установленных плагинов без такого объявления отклоняются.
3

Перенесите собственные обработчики подтверждений на сведения о возможностях

Плагины каналов с поддержкой подтверждений предоставляют собственное поведение подтверждений через approvalCapability.nativeRuntime и общий реестр контекста среды выполнения:
  • Замените approvalCapability.handler.loadRuntime(...) на approvalCapability.nativeRuntime.
  • Перенесите специфичные для подтверждений аутентификацию и доставку с устаревшей связки plugin.auth / plugin.approvals на approvalCapability.
  • ChannelPlugin.approvals удалён из публичного контракта плагина канала; перенесите поля доставки, собственного поведения и отображения в approvalCapability.
  • plugin.auth остаётся только для потоков входа и выхода из канала; ядро больше не читает там перехватчики аутентификации подтверждений.
  • Регистрируйте принадлежащие каналу объекты среды выполнения (клиенты, токены, приложения Bolt) через openclaw/plugin-sdk/channel-runtime-context.
  • Не отправляйте принадлежащие плагину уведомления о перенаправлении из собственных обработчиков подтверждений; ядро отвечает за уведомления о доставке в другое место на основе фактических результатов доставки.
  • При передаче channelRuntime в createChannelManager(...) предоставляйте полноценную поверхность createPluginRuntime().channel — частичные заглушки отклоняются.
Текущую структуру возможностей подтверждений см. в разделе Плагины каналов.
4

Проверьте резервное поведение оболочки Windows

Если ваш плагин использует openclaw/plugin-sdk/windows-spawn, неразрешённые оболочки Windows .cmd/.bat теперь по умолчанию завершаются ошибкой, если явно не передан allowShellFallback: true:
Если вызывающая сторона намеренно не зависит от резервного варианта через командную оболочку, не задавайте allowShellFallback, а вместо этого обработайте выброшенную ошибку.
5

Найдите устаревшие импорты

6

Замените их специализированными импортами

Каждый экспорт из старой поверхности соответствует определённому современному пути импорта:
Для вспомогательных средств на стороне хоста используйте внедрённую среду выполнения плагина вместо прямого импорта:
Тот же шаблон применяется к другим устаревшим вспомогательным функциям моста:
7

Замените общие импорты infra-runtime

openclaw/plugin-sdk/infra-runtime по-прежнему существует для внешней совместимости, но новый код должен импортировать конкретную поверхность, которая ему действительно нужна:Встроенные плагины защищены сканером от infra-runtime, поэтому код репозитория не может вернуться к общему модулю экспорта.
8

Перенесите вспомогательные функции маршрутов каналов

Новый код маршрутов каналов использует openclaw/plugin-sdk/channel-route. Прежние имена ключей маршрутов и сопоставимых целей сохраняются как псевдонимы совместимости:Современные вспомогательные функции маршрутов единообразно нормализуют { channel, to, accountId, threadId } для нативных подтверждений, подавления ответов, дедупликации входящих сообщений, доставки Cron и маршрутизации сеансов.Не добавляйте новые случаи использования ChannelMessagingAdapter.parseExplicitTarget, основанных на синтаксическом анализаторе вспомогательных функций загруженных маршрутов (parseExplicitTargetForLoadedChannel, resolveRouteTargetForLoadedChannel) или resolveChannelRouteTargetWithParser(...) из plugin-sdk/channel-route — они устарели и сохраняются только для старых плагинов. Новые плагины каналов должны использовать messaging.targetResolver.resolveTarget(...) для нормализации идентификаторов целей и резервного поведения при отсутствии записи в каталоге, messaging.inferTargetChatType(...), когда ядру требуется раннее определение типа однорангового узла, и messaging.resolveOutboundSessionRoute(...) для нативной для провайдера идентификации сеансов и веток.
9

Выполните сборку и тестирование

Справочник путей импорта

Эта таблица содержит общий поднабор для миграции, а не всю поверхность SDK. Список точек входа компилятора находится в scripts/lib/plugin-sdk-entrypoints.json; экспорты пакетов создаются из общедоступного поднабора. Зарезервированные вспомогательные интерфейсы встроенных плагинов удалены из карты экспорта общедоступного SDK, за исключением явно документированных фасадов совместимости, таких как устаревшая прослойка plugin-sdk/discord, сохранённая для внешних плагинов, которые по-прежнему напрямую импортируют опубликованный пакет @openclaw/discord. Вспомогательные средства конкретного владельца находятся в пакете соответствующего плагина; общее поведение хоста реализуется через универсальные контракты SDK, такие как plugin-sdk/gateway-runtime, plugin-sdk/security-runtime и plugin-sdk/plugin-config-runtime. Используйте наиболее узкий импорт, соответствующий задаче. Если вы не можете найти экспорт, проверьте исходный код в src/plugin-sdk/ или спросите сопровождающих, какому универсальному контракту он должен принадлежать.

Активные устаревания

Более узкие устаревания в SDK плагинов, контракте провайдера, поверхности среды выполнения и манифесте. Каждый из этих элементов по-прежнему работает, но будет удалён в одном из будущих мажорных выпусков. Для каждой записи указана каноническая замена старого API.
Старое (openclaw/plugin-sdk/command-auth): buildCommandsMessage, buildCommandsMessagePaginated, buildHelpMessage.Новое (openclaw/plugin-sdk/command-status): те же сигнатуры и экспорты — меняется только импорт на более узкий подпуть. command-auth повторно экспортирует их как заглушки совместимости.
Старое: resolveMentionGating(params) и resolveMentionGatingWithBypass(params) из openclaw/plugin-sdk/channel-inbound или openclaw/plugin-sdk/channel-mention-gating.Новое: resolveInboundMentionDecision({ facts, policy }) — один объект решения вместо двух раздельных форм вызова.Используется в Discord, iMessage, Matrix, MS Teams, QQBot, Signal, Telegram, WhatsApp и Zalo. Собственная модель событий app_mention в Slack не использует это вспомогательное средство.
openclaw/plugin-sdk/channel-runtime — это прослойка совместимости для старых плагинов каналов. Не импортируйте её в новом коде; используйте openclaw/plugin-sdk/channel-runtime-context для регистрации объектов среды выполнения.Вспомогательные средства channelActions* в openclaw/plugin-sdk/channel-actions объявлены устаревшими вместе с необработанными экспортами канальных «действий». Вместо этого предоставляйте возможности через семантическую поверхность presentation: плагины каналов объявляют, что именно они отображают (карточки, кнопки, списки выбора), а не какие необработанные имена действий они принимают.
Старое: фабрика tool() из openclaw/plugin-sdk/provider-web-search.Новое: реализуйте createTool(...) непосредственно в плагине провайдера. OpenClaw больше не требуется вспомогательное средство SDK для регистрации обёртки инструмента.
Старое: api.runtime.channel.reply.formatInboundEnvelope(...) (и поле channelEnvelope во входящих объектах сообщений) для создания плоского текстового конверта промпта из входящих сообщений канала.Новое: BodyForAgent вместе со структурированными блоками пользовательского контекста. Плагины каналов прикрепляют метаданные маршрутизации (ветку, тему, ответ на сообщение, реакции) как типизированные поля, а не объединяют их в строку промпта. Вспомогательное средство formatAgentEnvelope(...) по-прежнему поддерживается для синтезированных конвертов, предназначенных для ассистента, но входящие текстовые конверты постепенно выводятся из использования.Затронутые области: inbound_claim, message_received и любой пользовательский плагин канала, который выполнял постобработку старого текста конверта.
Старое: api.on("deactivate", handler).Новое: api.on("gateway_stop", handler). Тот же контракт очистки при завершении работы; меняется только имя хука.
deactivate остаётся подключённым как устаревший псевдоним совместимости до его удаления после 2026-08-16.
Старое: api.on("subagent_spawning", handler), возвращающий threadBindingReady или deliveryOrigin.Новое: позвольте ядру подготавливать привязки субагентов thread: true через адаптер привязки сеансов канала. Используйте api.on("subagent_spawned", handler) только для наблюдения после запуска.
subagent_spawning, PluginHookSubagentSpawningEvent, PluginHookSubagentSpawningResult и SubagentLifecycleHookRunner.runSubagentSpawning(...) остаются только как устаревшие поверхности совместимости на время миграции внешних плагинов и будут удалены после 2026-08-30.
Четыре псевдонима типов обнаружения теперь являются тонкими обёртками над типами эпохи каталога:Кроме того, вместо устаревшего статического контейнера ProviderCapabilities плагины провайдеров должны использовать явные хуки провайдера, такие как buildReplayPolicy, normalizeToolSchemas и wrapStreamFn.
Старое (три отдельных хука в ProviderThinkingPolicy): isBinaryThinking(ctx), supportsXHighThinking(ctx) и resolveDefaultThinkingLevel(ctx).Новое: единый resolveThinkingProfile(ctx), возвращающий ProviderThinkingProfile с каноническим id, необязательным label и ранжированным списком уровней. OpenClaw автоматически понижает устаревшие сохранённые значения в соответствии с рангом профиля.Контекст включает provider, modelId, необязательный объединённый reasoning и необязательные объединённые сведения о модели compat. Плагины провайдеров могут использовать эти сведения каталога, чтобы предоставлять профиль для конкретной модели, только если настроенный контракт запроса его поддерживает.Реализуйте один хук вместо трёх. Устаревшие хуки продолжают работать в течение периода устаревания, но не объединяются с результатом профиля.
Старое: реализация внешних хуков аутентификации без объявления провайдера в манифесте плагина.Новое: объявите contracts.externalAuthProviders в манифесте плагина и реализуйте resolveExternalAuthProfiles(...).
Старое поле манифеста: providerAuthEnvVars: { anthropic: ["ANTHROPIC_API_KEY"] }.Новое: продублируйте тот же поиск переменных окружения в setup.providers[].envVars манифеста. Это объединяет метаданные окружения для настройки и состояния в одном месте и позволяет не запускать среду выполнения плагина только ради поиска переменных окружения.providerAuthEnvVars продолжает поддерживаться через адаптер совместимости до окончания периода устаревания.
Старое: три отдельных вызова — api.registerMemoryPromptSection(...), api.registerMemoryFlushPlan(...), api.registerMemoryRuntime(...).Новое: один вызов API состояния памяти — registerMemoryCapability(pluginId, { promptBuilder, flushPlanResolver, runtime }).Те же слоты, один вызов регистрации. Дополнительные вспомогательные средства промптов и корпуса (registerMemoryPromptSupplement, registerMemoryCorpusSupplement) не затрагиваются.
Старое: api.registerMemoryEmbeddingProvider(...) вместе с contracts.memoryEmbeddingProviders.Новое: api.registerEmbeddingProvider(...) вместе с contracts.embeddingProviders.Универсальный контракт провайдера векторных представлений можно повторно использовать вне памяти; это поддерживаемый путь для новых провайдеров. API регистрации для памяти остаётся подключённым как устаревший интерфейс совместимости на время миграции существующих провайдеров. При проверке плагинов использование этого API невстроенными плагинами отмечается как долг совместимости.
Старое: возвращайте { ok, messageId, error } через ChannelSendRawResult и нормализуйте его с помощью createRawChannelSendResultAdapter(...).Новое: возвращайте поля OutboundDeliveryResult и прикрепляйте канал с помощью createAttachedChannelResultAdapter(...). При неудачной отправке следует выбрасывать исключение вместо возврата строки ошибки. Тип необработанного результата останется доступным до следующего мажорного выпуска SDK плагинов.
Два устаревших псевдонима типов по-прежнему экспортируются из src/plugins/runtime/types.ts:Метод среды выполнения readSession объявлен устаревшим в пользу getSessionMessages. Сигнатура та же; старый метод вызывает новый.
Переход сеансов и расшифровок на SQLite удаляет или объявляет устаревшими API для плагинов, которые предоставляли активные хранилища sessions.json, пути к расшифровкам JSONL или списки файлов сеансов. Плагины среды выполнения должны использовать идентификаторы сеансов и вспомогательные средства среды выполнения SDK вместо разрешения или изменения активных файлов.Устаревшие файлы расшифровок JSONL остаются допустимыми артефактами импорта, архивации, экспорта и поддержки. Они больше не являются контрактом штатной работы среды выполнения для активных сеансов.Официальные плагины, выпущенные с v2026.7.1-beta.5, импортировали четыре устаревших вспомогательных функции выше. openclaw/plugin-sdk/session-store-runtime сохраняет этот точный мост до 2026-10-12; новые плагины должны использовать замены. resolveStorePath(...) остаётся поддерживаемой вспомогательной функцией SDK и не входит в эту депрекацию.openclaw plugins inspect --all --runtime сообщает о невстроенных плагинах, в ошибках загрузки или диагностике которых всё ещё упоминаются эти удалённые файловые API. Рекомендательная проверка @openclaw/plugin-inspector должна использовать версию 0.3.17 или новее, чтобы сканирование внешних пакетов также выявляло вспомогательные функции сеансов для всего хранилища, вспомогательные функции путей к файлам сеансов, устаревшие целевые файлы транскриптов и низкоуровневые вспомогательные функции транскриптов до выпуска.
Ранее: runtime.tasks.flow (единственное число) возвращал активный интерфейс доступа к потоку задач.Теперь: runtime.tasks.managedFlows сохраняет среду выполнения управляемых изменений TaskFlow для плагинов, которые создают, обновляют, отменяют или запускают дочерние задачи из потока. Используйте runtime.tasks.flows, когда плагину нужны только операции чтения на основе DTO.
Удалено после 2026-07-26.
Описано выше в разделе Как выполнить миграцию. Для полноты здесь также указано: удалённый путь api.registerEmbeddedExtensionFactory(...), предназначенный только для встроенного исполнителя, заменён на api.registerAgentToolResultMiddleware(...) с явным списком сред выполнения в contracts.agentToolResultMiddleware.
OpenClawSchemaType, повторно экспортировавшийся из openclaw/plugin-sdk, теперь является однострочным псевдонимом для OpenClawConfig. Предпочитайте каноническое имя.
Депрекации на уровне расширений (во встроенных плагинах каналов и провайдеров в extensions/) отслеживаются в их собственных экспортирующих модулях api.ts и runtime-api.ts. Они не затрагивают контракты сторонних плагинов и здесь не перечислены. Если вы напрямую используете локальный экспортирующий модуль встроенного плагина, перед обновлением прочитайте комментарии о депрекации в этом модуле.

Миграция Talk и голосовой связи в реальном времени

Код голосовой связи в реальном времени, телефонии, совещаний и браузерного Talk использует общий контроллер сеансов Talk, экспортируемый из openclaw/plugin-sdk/realtime-voice. Контроллер управляет общей оболочкой событий Talk, состоянием активной реплики, состоянием захвата, состоянием вывода звука, историей недавних событий и отклонением устаревших реплик. Плагины провайдеров управляют специфичными для поставщиков сеансами реального времени; плагины интерфейсов управляют особенностями захвата, воспроизведения, телефонии и совещаний. Все встроенные интерфейсы работают на общем контроллере: браузерная ретрансляция, передача управления в управляемую комнату, голосовой вызов в реальном времени, потоковое STT голосового вызова, Google Meet в реальном времени и нативный режим «нажми и говори». Gateway объявляет один активный канал событий Talk в hello-ok.features.events: talk.event. Новый код не должен вызывать createTalkEventSequencer(...) напрямую, кроме случаев реализации низкоуровневого адаптера или тестовой фикстуры. Используйте общий контроллер, чтобы события, относящиеся к реплике, нельзя было отправлять без идентификатора реплики, устаревшие вызовы turnEnd / turnCancel не могли очистить более новую активную реплику, а события жизненного цикла выходного аудио оставались согласованными для телефонии, совещаний, браузерной ретрансляции, передачи управления в управляемую комнату и нативных клиентов Talk. Форма публичного API:
Сеансы WebRTC/веб-сокетов провайдера под управлением браузера используют talk.client.create, поскольку браузер управляет согласованием с провайдером и транспортом мультимедиа, а Gateway управляет учётными данными, инструкциями и политикой инструментов. talk.session.* — общий интерфейс под управлением Gateway для работы в реальном времени через gateway-relay, транскрибирования через gateway-relay и нативных сеансов STT/TTS в управляемых комнатах. Устаревшие конфигурации, в которых селекторы реального времени размещены рядом с talk.provider / talk.providers, следует исправить с помощью openclaw doctor --fix; среда выполнения Talk не интерпретирует конфигурацию провайдера речи/TTS как конфигурацию провайдера реального времени. Поддерживаемый набор сочетаний talk.session.create намеренно ограничен: Таблица соответствия методов для переходящих со старых семейств talk.realtime.* / talk.transcription.* / talk.handoff.* (все удалены): Унифицированный набор управляющих операций также намеренно ограничен: Не добавляйте в ядро особые случаи для провайдеров или платформ, чтобы обеспечить эту работу. Ядро управляет семантикой сеансов Talk. Плагины провайдеров управляют настройкой сеансов поставщиков. Voice-call и Google Meet управляют адаптерами телефонии и совещаний. Браузерные и нативные приложения управляют взаимодействием с пользователем при захвате и воспроизведении на устройстве.

График удаления

Все плагины ядра уже перенесены. Внешние плагины следует перенести до следующего основного выпуска. Запустите pnpm plugins:boundary-report, чтобы узнать, для каких записей совместимости используемых вашим плагином поверхностей API срок наступит раньше всего.

Временное отключение предупреждений

Это временный обходной путь, а не постоянное решение.

См. также