Что изменилось
Раньше две чрезмерно широкие поверхности импорта позволяли плагинам получать доступ почти к чему угодно через единую точку входа: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.
Политика совместимости
Работа по обеспечению совместимости внешних плагинов выполняется в следующем порядке:- Добавить новый контракт.
- Сохранить прежнее поведение через адаптер совместимости.
- Вывести диагностику или предупреждение с указанием старого пути и его замены.
- Охватить оба пути тестами.
- Документировать устаревание и путь миграции.
- Удалить только после завершения объявленного периода миграции, обычно в основном выпуске.
pnpm plugins:boundary-report:
pnpm plugins:boundary-report:ci запускается со всеми тремя флагами ошибок. Каждая
запись совместимости содержит явную дату removeAfter (а не расплывчатое указание «следующий
основной выпуск») — отчёт группирует устаревшие записи по этой дате, подсчитывает
локальные ссылки в коде и документации, выявляет импорты зарезервированного SDK между владельцами и
суммирует сведения о закрытом мосте SDK хоста памяти. Зарезервированные подпути SDK должны иметь
отслеживаемое использование владельцем; неиспользуемые зарезервированные экспорты следует удалить из публичного
SDK.
Как выполнить миграцию
Перенесите вспомогательные средства загрузки и записи конфигурации среды выполнения
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.
Используйте узкий подпуть, соответствующий задаче:Перенесите расширения результатов инструментов встроенного механизма запуска в промежуточное ПО
api.registerEmbeddedExtensionFactory(...), предназначенные только для встроенного механизма запуска,
нейтральным к среде выполнения промежуточным ПО:contracts.agentToolResultMiddleware. Регистрации промежуточного ПО установленных плагинов
без такого объявления отклоняются.Перенесите собственные обработчики подтверждений на сведения о возможностях
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— частичные заглушки отклоняются.
Проверьте резервное поведение оболочки Windows
openclaw/plugin-sdk/windows-spawn, неразрешённые оболочки Windows
.cmd/.bat теперь по умолчанию завершаются ошибкой, если явно не передан
allowShellFallback: true:allowShellFallback, а вместо этого обработайте выброшенную ошибку.Найдите устаревшие импорты
Замените их специализированными импортами
Замените общие импорты infra-runtime
openclaw/plugin-sdk/infra-runtime по-прежнему существует для внешней
совместимости, но новый код должен импортировать конкретную поверхность,
которая ему действительно нужна:infra-runtime, поэтому код
репозитория не может вернуться к общему модулю экспорта.Перенесите вспомогательные функции маршрутов каналов
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(...) для нативной
для провайдера идентификации сеансов и веток.Выполните сборку и тестирование
Справочник путей импорта
Common import path table
Common import path table
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.Вспомогательные средства справки command-auth -> command-status
Вспомогательные средства справки command-auth -> command-status
openclaw/plugin-sdk/command-auth): buildCommandsMessage,
buildCommandsMessagePaginated, buildHelpMessage.Новое (openclaw/plugin-sdk/command-status): те же сигнатуры и
экспорты — меняется только импорт на более узкий подпуть. command-auth
повторно экспортирует их как заглушки совместимости.Средства ограничения по упоминаниям -> resolveInboundMentionDecision
Средства ограничения по упоминаниям -> resolveInboundMentionDecision
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() провайдера веб-поиска -> createTool() в плагине
Средство tool() провайдера веб-поиска -> createTool() в плагине
tool() из openclaw/plugin-sdk/provider-web-search.Новое: реализуйте createTool(...) непосредственно в плагине
провайдера. OpenClaw больше не требуется вспомогательное средство SDK для
регистрации обёртки инструмента.Текстовые конверты каналов -> BodyForAgent
Текстовые конверты каналов -> BodyForAgent
api.runtime.channel.reply.formatInboundEnvelope(...) (и поле
channelEnvelope во входящих объектах сообщений) для создания плоского
текстового конверта промпта из входящих сообщений канала.Новое: BodyForAgent вместе со структурированными блоками
пользовательского контекста. Плагины каналов прикрепляют метаданные
маршрутизации (ветку, тему, ответ на сообщение, реакции) как типизированные
поля, а не объединяют их в строку промпта. Вспомогательное средство
formatAgentEnvelope(...) по-прежнему поддерживается для синтезированных
конвертов, предназначенных для ассистента, но входящие текстовые конверты
постепенно выводятся из использования.Затронутые области: inbound_claim, message_received и любой
пользовательский плагин канала, который выполнял постобработку старого
текста конверта.Хук deactivate -> gateway_stop
Хук deactivate -> gateway_stop
api.on("deactivate", handler).Новое: api.on("gateway_stop", handler). Тот же контракт очистки
при завершении работы; меняется только имя хука.deactivate остаётся подключённым как устаревший псевдоним
совместимости до его удаления после 2026-08-16.Хук subagent_spawning -> привязка ветки в ядре
Хук subagent_spawning -> привязка ветки в ядре
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.Хуки политики рассуждений -> resolveThinkingProfile
Хуки политики рассуждений -> resolveThinkingProfile
ProviderThinkingPolicy):
isBinaryThinking(ctx), supportsXHighThinking(ctx) и
resolveDefaultThinkingLevel(ctx).Новое: единый resolveThinkingProfile(ctx), возвращающий
ProviderThinkingProfile с каноническим id, необязательным
label и ранжированным списком уровней. OpenClaw автоматически
понижает устаревшие сохранённые значения в соответствии с рангом профиля.Контекст включает provider, modelId, необязательный
объединённый reasoning и необязательные объединённые сведения о
модели compat. Плагины провайдеров могут использовать эти
сведения каталога, чтобы предоставлять профиль для конкретной модели,
только если настроенный контракт запроса его поддерживает.Реализуйте один хук вместо трёх. Устаревшие хуки продолжают работать в
течение периода устаревания, но не объединяются с результатом профиля.Внешние провайдеры аутентификации -> contracts.externalAuthProviders
Внешние провайдеры аутентификации -> contracts.externalAuthProviders
contracts.externalAuthProviders в манифесте плагина
и реализуйте resolveExternalAuthProfiles(...).Поиск переменных окружения провайдера -> setup.providers[].envVars
Поиск переменных окружения провайдера -> setup.providers[].envVars
providerAuthEnvVars: { anthropic: ["ANTHROPIC_API_KEY"] }.Новое: продублируйте тот же поиск переменных окружения в
setup.providers[].envVars манифеста. Это объединяет метаданные окружения для
настройки и состояния в одном месте и позволяет не запускать среду
выполнения плагина только ради поиска переменных окружения.providerAuthEnvVars продолжает поддерживаться через адаптер совместимости
до окончания периода устаревания.Регистрация плагина памяти -> registerMemoryCapability
Регистрация плагина памяти -> registerMemoryCapability
api.registerMemoryPromptSection(...),
api.registerMemoryFlushPlan(...), api.registerMemoryRuntime(...).Новое: один вызов API состояния памяти —
registerMemoryCapability(pluginId, { promptBuilder, flushPlanResolver, runtime }).Те же слоты, один вызов регистрации. Дополнительные вспомогательные
средства промптов и корпуса (registerMemoryPromptSupplement, registerMemoryCorpusSupplement)
не затрагиваются.API провайдера векторных представлений памяти
API провайдера векторных представлений памяти
api.registerMemoryEmbeddingProvider(...) вместе с
contracts.memoryEmbeddingProviders.Новое: api.registerEmbeddingProvider(...) вместе с
contracts.embeddingProviders.Универсальный контракт провайдера векторных представлений можно повторно
использовать вне памяти; это поддерживаемый путь для новых провайдеров.
API регистрации для памяти остаётся подключённым как устаревший интерфейс
совместимости на время миграции существующих провайдеров. При проверке
плагинов использование этого API невстроенными плагинами отмечается как
долг совместимости.Необработанные результаты отправки канала -> OutboundDeliveryResult
Необработанные результаты отправки канала -> OutboundDeliveryResult
{ ok, messageId, error } через
ChannelSendRawResult и нормализуйте его с помощью
createRawChannelSendResultAdapter(...).Новое: возвращайте поля OutboundDeliveryResult и прикрепляйте канал с
помощью createAttachedChannelResultAdapter(...). При неудачной отправке следует выбрасывать
исключение вместо возврата строки ошибки. Тип необработанного результата
останется доступным до следующего мажорного выпуска SDK плагинов.Переименование типов сообщений сеансов субагентов
Переименование типов сообщений сеансов субагентов
src/plugins/runtime/types.ts:readSession объявлен устаревшим в пользу
getSessionMessages. Сигнатура та же; старый метод вызывает новый.Удалённые API файлов сеансов и расшифровок
Удалённые API файлов сеансов и расшифровок
sessions.json, пути к расшифровкам JSONL или списки файлов сеансов.
Плагины среды выполнения должны использовать идентификаторы сеансов и
вспомогательные средства среды выполнения SDK вместо разрешения или
изменения активных файлов.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
runtime.tasks.flow -> runtime.tasks.managedFlows
runtime.tasks.flow (единственное число) возвращал активный
интерфейс доступа к потоку задач.Теперь: runtime.tasks.managedFlows сохраняет среду выполнения управляемых изменений TaskFlow
для плагинов, которые создают, обновляют, отменяют или запускают дочерние задачи из
потока. Используйте runtime.tasks.flows, когда плагину нужны только
операции чтения на основе DTO.Встроенные фабрики расширений -> промежуточное ПО результатов инструментов агента
Встроенные фабрики расширений -> промежуточное ПО результатов инструментов агента
api.registerEmbeddedExtensionFactory(...),
предназначенный только для встроенного исполнителя, заменён на
api.registerAgentToolResultMiddleware(...) с явным списком сред выполнения
в contracts.agentToolResultMiddleware.Псевдоним OpenClawSchemaType -> OpenClawConfig
Псевдоним OpenClawSchemaType -> OpenClawConfig
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:
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.* (все удалены):
График удаления
pnpm plugins:boundary-report, чтобы узнать, для каких
записей совместимости используемых вашим плагином поверхностей API срок наступит раньше всего.
Временное отключение предупреждений
См. также
- Начало работы — создайте свой первый плагин
- Обзор SDK — полный справочник по импорту из подпутей
- Плагины каналов — создание плагинов каналов
- Плагины провайдеров — создание плагинов провайдеров
- Внутреннее устройство плагинов — подробный обзор архитектуры
- Манифест плагина — справочник по схеме манифеста