Впервые работаете с плагинами OpenClaw? Сначала прочитайте Начало работы,
чтобы узнать о структуре пакета и настройке манифеста.
За что отвечает ваш плагин
Плагины каналов не реализуют инструменты отправки, редактирования и реакций; ядро предоставляет один общий инструментmessage. Ваш плагин отвечает за следующее:
- Конфигурация — определение учётной записи и мастер настройки
- Безопасность — политика личных сообщений и списки разрешённых отправителей
- Сопряжение — процесс одобрения личных сообщений
- Грамматика сессий — сопоставление идентификаторов бесед, специфичных для провайдера, с базовыми чатами, идентификаторами веток и резервными родительскими контекстами
- Исходящие сообщения — отправка текста, медиафайлов и опросов на платформу
- Ветвление — распределение ответов по веткам
- Индикатор набора для Heartbeat — необязательные сигналы набора текста или занятости для целей доставки Heartbeat
:thread: и диспетчеризацию.
Адаптер сообщений
Предоставьте адаптерmessage с defineChannelMessageAdapter из
openclaw/plugin-sdk/channel-outbound. Объявляйте только устойчивые возможности окончательной отправки,
которые действительно поддерживает ваш нативный транспорт, и подкрепляйте их контрактным
тестом, подтверждающим нативный побочный эффект и возвращаемую квитанцию. Для отправки текста и медиафайлов
используйте те же транспортные функции, что и устаревший адаптер outbound. Полное описание
контракта API, матрицы возможностей, правил квитанций, завершения интерактивного предпросмотра,
политики подтверждения получения, тестов и таблицы миграции см. в разделе
API исходящих сообщений канала.
Если существующий адаптер outbound уже содержит нужные методы отправки и
метаданные возможностей, создайте адаптер message с помощью
createChannelMessageAdapterFromOutbound(...), а не пишите ещё один
мост вручную. Методы отправки адаптера возвращают значения MessageReceipt. Для устаревших идентификаторов создавайте
их с помощью listMessageReceiptPlatformIds(...) или
resolveMessageReceiptPrimaryId(...), а не сохраняйте параллельные поля messageIds.
Точно объявляйте возможности интерактивного режима и финализатора — ядро использует их, чтобы определить,
что может делать канал, а расхождение между объявленным и фактическим поведением приводит к ошибке
контрактного теста:
Каналам, которые на месте преобразуют черновик предпросмотра в окончательное сообщение, следует направлять логику среды выполнения
через
defineFinalizableLivePreviewAdapter(...) вместе с
deliverWithFinalizableLivePreviewAdapter(...) и подкреплять объявленные
возможности тестами verifyChannelMessageLiveCapabilityAdapterProofs(...)
и verifyChannelMessageLiveFinalizerProofs(...), чтобы нативное поведение предпросмотра,
хода выполнения, редактирования, резервного варианта или сохранения, очистки и квитанций не могло незаметно
измениться.
Обработчики входящих сообщений, которые откладывают подтверждения платформы, должны объявлять
message.receive.defaultAckPolicy и supportedAckPolicies, а не скрывать
время подтверждения в локальном состоянии монитора. Проверяйте каждую объявленную политику с помощью
verifyChannelMessageReceiveAckPolicyAdapterProofs(...).
Устаревшие вспомогательные функции ответов, такие как dispatchInboundReplyWithBase и
recordInboundSessionAndDispatchReply, остаются доступными для совместимых
диспетчеров. Не используйте их в новом коде канала; вместо этого начните с адаптера message,
квитанций и вспомогательных средств жизненного цикла получения и отправки в
openclaw/plugin-sdk/channel-outbound.
Приём входящих сообщений (экспериментальная возможность)
Каналы, переводящие авторизацию входящих сообщений на новую систему, могут использовать экспериментальный подпутьopenclaw/plugin-sdk/channel-ingress-runtime из путей получения среды выполнения.
Он принимает факты платформы, необработанные списки разрешений, дескрипторы маршрутов, сведения о командах
и конфигурацию групп доступа, а затем возвращает проекции отправителя, маршрута, команды и активации,
а также упорядоченный граф приёма, при этом поиск на платформе и побочные эффекты остаются в плагине.
Сохраняйте нормализацию идентичности плагина в дескрипторе, передаваемом распознавателю; не сериализуйте
необработанные значения совпадений из разрешённого состояния или решения. Описание структуры API,
границ ответственности и требований к тестам см. в разделе
API приёма сообщений канала.
Индикаторы набора текста
Если канал поддерживает индикаторы набора текста вне ответов на входящие сообщения, предоставьтеheartbeat.sendTyping(...) в плагине канала. Ядро вызывает его с
определённой целью доставки Heartbeat до запуска модели Heartbeat и
использует общий жизненный цикл поддержания и очистки индикатора набора текста. Добавьте
heartbeat.clearTyping(...), если платформе требуется явный сигнал остановки.
Параметры источников медиафайлов
Если канал добавляет параметры инструмента сообщений, содержащие источники медиафайлов, предоставьте имена этих параметров черезplugin.actions.describeMessageTool(...).mediaSourceParams.
Ядро использует этот явный список для нормализации путей песочницы и политики
доступа к исходящим медиафайлам, поэтому плагинам не нужны особые случаи в общем ядре для
специфичных для провайдера параметров аватаров, вложений или обложек.
Предпочтительно использовать карту с ключами действий, например { "set-profile": ["avatarUrl", "avatarPath"] },
чтобы несвязанные действия не наследовали аргументы медиафайлов другого действия. Плоский массив
по-прежнему подходит для параметров, намеренно общих для всех предоставляемых действий.
Каналы, которым необходимо предоставить временный общедоступный URL для получения медиафайла
на стороне платформы, могут использовать createHostedOutboundMediaStore(...) из
openclaw/plugin-sdk/outbound-media с хранилищами состояния плагина. Разбор
маршрута платформы и проверка токена должны оставаться в плагине канала; общий вспомогательный компонент
отвечает только за загрузку медиафайлов, метаданные срока действия, строки фрагментов и очистку.
Формирование нативной полезной нагрузки
Если каналу требуется специфичное для провайдера формированиеmessage(action="send"),
предпочтительно использовать actions.prepareSendPayload(...). Помещайте нативные карточки, блоки, встраиваемые элементы и
другие устойчивые данные в payload.channelData.<channel>, а отправку через
адаптер исходящих сообщений или сообщений оставьте ядру. Используйте actions.handleAction(...) для отправки
только как резервный вариант совместимости для полезных нагрузок, которые невозможно сериализовать и
отправить повторно.
Грамматика бесед сессии
Если платформа хранит дополнительную область действия внутри идентификаторов бесед, оставьте их разбор в плагине с помощьюmessaging.resolveSessionConversation(...). Это
каноническая точка расширения для сопоставления rawId с базовым идентификатором беседы, необязательным
идентификатором ветки, явным baseConversationId и любыми
parentConversationCandidates. При возврате parentConversationCandidates
располагайте их от наиболее узкого родительского контекста к наиболее широкому или базовому контексту беседы.
messaging.resolveParentConversationCandidates(...) — устаревший
резервный механизм совместимости для плагинов, которым нужны только родительские резервные контексты поверх
универсального или необработанного идентификатора. Если существуют обе точки расширения, ядро сначала использует
resolveSessionConversation(...).parentConversationCandidates и обращается к
resolveParentConversationCandidates(...), только если каноническая
точка расширения их не предоставляет.
Встроенные плагины, которым нужен тот же разбор до запуска реестра каналов,
могут предоставить файл верхнего уровня session-key-api.ts с соответствующим
экспортом resolveSessionConversation(...) (см. плагины Feishu и Telegram).
Ядро использует эту безопасную для начальной загрузки поверхность, только когда реестр плагинов среды выполнения
ещё недоступен.
Используйте openclaw/plugin-sdk/channel-route, когда коду плагина нужно нормализовать
поля, подобные маршрутам, сравнить дочернюю ветку с её родительским маршрутом или создать
стабильный ключ дедупликации из { channel, to, accountId, threadId }. Вспомогательная функция
нормализует числовые идентификаторы веток так же, как ядро, поэтому используйте её вместо ситуативных
сравнений String(threadId). Плагины со специфичной для провайдера грамматикой целей
должны предоставлять messaging.resolveOutboundSessionRoute(...), чтобы ядро получало
нативные для провайдера идентификаторы сессии и ветки без адаптеров разбора.
Поддержка привязки бесед в рамках учётной записи
УстановитеconversationBindings.supportsCurrentConversationBinding, если канал
поддерживает универсальные привязки текущих бесед. createChatChannelPlugin(...)
по умолчанию устанавливает эту статическую возможность в true.
Если поддержка зависит от настроенной учётной записи, также реализуйте
conversationBindings.isCurrentConversationBindingSupported({ accountId }).
Ядро вычисляет результат этой синхронной точки расширения только после включения статической возможности.
Возврат false делает универсальные операции проверки возможности текущей беседы,
привязки, поиска, перечисления, обновления времени обращения и отмены привязки недоступными для этой учётной записи.
Если точка расширения отсутствует, статическая возможность применяется ко всем учётным записям.
Определяйте ответ по уже загруженной конфигурации учётной записи или состоянию среды выполнения. Эта
точка расширения управляет только универсальными привязками текущих бесед; она не заменяет
настроенные правила привязки или принадлежащую плагину маршрутизацию сессий. Контрактные тесты
должны охватывать как минимум одну поддерживаемую и одну неподдерживаемую учётную запись с использованием
контракта ChannelPlugin["conversationBindings"], экспортируемого из
openclaw/plugin-sdk/channel-core.
Одобрения и возможности каналов
Большинству плагинов каналов не нужен специальный код для одобрений. Ядро отвечает за/approve в том же чате, общие полезные нагрузки кнопок одобрения и универсальную резервную доставку.
ChannelPlugin.approvals удалён; вместо него размещайте факты доставки, нативного поведения, отображения и авторизации
одобрений в одном объекте approvalCapability. plugin.auth предназначен только для входа и выхода —
ядро больше не считывает из этого объекта точки расширения авторизации одобрений.
Используйте approvalCapability.delivery только для нативной маршрутизации одобрений или подавления
резервного варианта, а approvalCapability.render — только когда каналу действительно нужны
собственные полезные нагрузки одобрений вместо общего средства отображения.
Авторизация одобрений
approvalCapability.authorizeActorActionиapprovalCapability.getActionAvailabilityStateявляются канонической точкой расширения для авторизации одобрений.- Используйте
getActionAvailabilityStateдля доступности авторизации одобрений в том же чате. Сохраняйте доступность настроенных одобряющих лиц для/approve, даже когда нативная доставка отключена; вместо этого используйте состояние нативной инициирующей поверхности для рекомендаций по доставке и настройке. - Если канал предоставляет нативные одобрения выполнения, используйте
approvalCapability.getExecInitiatingSurfaceStateдля состояния инициирующей поверхности или нативного клиента, если оно отличается от авторизации одобрений в том же чате. Ядро использует эту специфичную для выполнения точку расширения, чтобы различатьenabledиdisabled, определять, поддерживает ли инициирующий канал нативные одобрения выполнения, и включать канал в рекомендации по резервному использованию нативного клиента.createApproverRestrictedNativeApprovalCapability(...)заполняет это значение для типичного случая. - Если канал может вывести стабильные идентичности личных сообщений, подобные владельцам, из существующей конфигурации,
используйте
createResolvedApproverActionAuthAdapterизopenclaw/plugin-sdk/approval-runtime, чтобы ограничить/approveв том же чате, не добавляя в ядро специальную логику одобрений. - Если пользовательская авторизация одобрений намеренно разрешает только резервный вариант в том же чате, верните
markImplicitSameChatApprovalAuthorization({ authorized: true })изopenclaw/plugin-sdk/approval-auth-runtime; в противном случае ядро считает результат явной авторизацией одобряющего лица. - Если принадлежащий каналу нативный обратный вызов разрешает одобрения напрямую, используйте
isImplicitSameChatApprovalAuthorization(...)перед разрешением, чтобы неявный резервный вариант всё равно проходил через обычную авторизацию участников канала.
Жизненный цикл полезной нагрузки и рекомендации по настройке
- Используйте
outbound.shouldSuppressLocalPayloadPromptилиoutbound.beforeDeliverPayloadдля специфичного для канала поведения жизненного цикла полезной нагрузки, например скрытия дублирующихся локальных запросов одобрения или отправки индикаторов набора текста перед доставкой. - Используйте
approvalCapability.describeExecApprovalSetup, когда канал должен объяснить в ответе для отключённого пути, какие именно параметры конфигурации необходимы для включения нативных одобрений выполнения. Точка расширения получает{ channel, channelLabel, accountId }; каналы с именованными учётными записями должны отображать пути в рамках учётной записи, напримерchannels.<channel>.accounts.<id>.execApprovals.*, вместо значений верхнего уровня по умолчанию. - Используйте
approvalCapability.describePluginApprovalSetup, когда рекомендации при сбое одобрения плагина можно безопасно показывать при отсутствии маршрута и истечении времени ожидания одобрения плагина.createApproverRestrictedNativeApprovalCapability(...)не выводит это изdescribeExecApprovalSetup; передавайте тот же вспомогательный компонент явно, только если одобрения плагина и выполнения действительно используют одну и ту же нативную настройку.
Нативная доставка одобрений
Если каналу нужна нативная доставка одобрений, сосредоточьте код канала на нормализации целей и фактах транспорта или представления. ИспользуйтеcreateChannelExecApprovalProfile, createChannelNativeOriginTargetResolver,
createChannelApproverDmTargetResolver и
createApproverRestrictedNativeApprovalCapability из
openclaw/plugin-sdk/approval-runtime. Разместите специфичные для канала факты за
approvalCapability.nativeRuntime, предпочтительно через
createChannelApprovalNativeRuntimeAdapter(...) или
createLazyChannelApprovalNativeRuntimeAdapter(...), чтобы ядро могло собрать
обработчик и отвечать за фильтрацию запросов, маршрутизацию, дедупликацию, истечение срока действия, подписку
Gateway и уведомления о маршрутизации в другое место.
nativeRuntime разделён на несколько меньших точек расширения:
availability— настроена ли учётная запись и следует ли обрабатывать запросpresentation— преобразование общей модели представления подтверждения в ожидающие, разрешённые или просроченные нативные полезные нагрузки либо итоговые действияtransport— подготовка целей, а также отправка, обновление и удаление нативных сообщений подтвержденияinteractions— необязательные хуки привязки, отвязки и очистки действий для нативных кнопок или реакций, а также необязательный хукcancelDelivered. РеализуйтеcancelDelivered, когдаdeliverPendingрегистрирует внутрипроцессное или постоянное состояние (например, хранилище целей реакций), чтобы это состояние можно было освободить, если остановка обработчика отменяет доставку до выполненияbindPendingили еслиbindPendingне возвращает дескрипторobserve— необязательные хуки диагностики доставки
- Используйте
createNativeApprovalChannelRouteGatesизopenclaw/plugin-sdk/approval-native-runtime, когда канал поддерживает как нативную доставку из исходного сеанса, так и явные цели пересылки подтверждений. Это вспомогательное средство централизует выбор конфигурации подтверждений, обработкуmode, фильтры агентов и сеансов, привязку учётных записей, сопоставление целей сеанса и сопоставление списков целей, при этом вызывающий код по-прежнему отвечает за идентификатор канала, режим пересылки по умолчанию, поиск учётной записи, проверку включения транспорта, нормализацию целей и разрешение цели из источника хода. Не используйте его для создания принадлежащих ядру настроек политики канала по умолчанию; явно передавайте документированный режим канала по умолчанию. createChannelNativeOriginTargetResolverпо умолчанию использует общий механизм сопоставления маршрутов каналов для целей{ to, accountId, threadId }. ПередавайтеtargetsMatchтолько тогда, когда канал имеет специфичные для провайдера правила эквивалентности, например сопоставление префиксов временных меток Slack. ПередавайтеnormalizeTargetForMatch, когда каналу требуется привести идентификаторы провайдера к каноническому виду до запуска стандартного механизма сопоставления маршрутов или пользовательского обратного вызоваtargetsMatch, сохраняя при этом исходную цель для доставки. ИспользуйтеnormalizeTargetтолько тогда, когда к каноническому виду следует привести саму разрешённую цель доставки.- Если каналу нужны принадлежащие среде выполнения объекты, например клиент, токен, приложение Bolt
или приёмник Webhook, зарегистрируйте их через
openclaw/plugin-sdk/channel-runtime-context. Универсальный реестр контекста среды выполнения позволяет ядру запускать обработчики на основе возможностей из состояния запуска канала без добавления специализированных для подтверждений обёрток. - Используйте низкоуровневые
createChannelApprovalHandlerилиcreateChannelNativeApprovalRuntimeтолько тогда, когда интерфейс на основе возможностей пока недостаточно выразителен. - Каналы нативных подтверждений должны направлять и
accountId, иapprovalKindчерез эти вспомогательные средства.accountIdограничивает политику подтверждений для нескольких учётных записей нужной учётной записью бота, аapprovalKindделает поведение подтверждений выполнения и плагинов доступным каналу без жёстко заданных ветвей в ядре. - Уведомления о перенаправлении подтверждений также принадлежат ядру. Плагины каналов не должны отправлять
собственные последующие сообщения «подтверждение отправлено в личные сообщения / другой канал» из
createChannelNativeApprovalRuntime; вместо этого предоставляйте точную маршрутизацию от источника к личным сообщениям подтверждающего через общие вспомогательные средства возможностей подтверждения и позволяйте ядру агрегировать фактические доставки перед публикацией уведомления обратно в чат-инициатор. - Сохраняйте тип идентификатора доставленного подтверждения на всём пути. Нативные клиенты не должны угадывать или переписывать маршрутизацию подтверждений выполнения и плагинов на основе локального состояния канала.
- Передавайте этот явный
approvalKindвresolveApprovalOverGateway. При этом используется каноническая службаapproval.resolveи возвращается зарегистрированный победитель, если другая поверхность отвечает первой. Старый явный входresolveMethodсохраняется для элементов управления на основе команд; новые нативные действия не должны использовать его или выводить тип из идентификатора. - Разные типы подтверждений могут намеренно предоставлять разные нативные поверхности. Текущие встроенные примеры: Matrix сохраняет одинаковую нативную маршрутизацию в личные сообщения и каналы и интерфейс реакций для подтверждений выполнения и плагинов, при этом позволяя аутентификации различаться в зависимости от типа подтверждения; Slack сохраняет нативную маршрутизацию подтверждений доступной как для идентификаторов выполнения, так и для идентификаторов плагинов.
createApproverRestrictedNativeApprovalAdapterпо-прежнему существует как обёртка совместимости, но в новом коде следует предпочитать конструктор возможностей и предоставлятьapprovalCapabilityв плагине.
Более узкие подпути среды выполнения подтверждений
Для часто вызываемых точек входа каналов предпочитайте следующие более узкие подпути более широкому экспортуapproval-runtime, когда нужна только одна часть этого семейства:
openclaw/plugin-sdk/approval-auth-runtimeopenclaw/plugin-sdk/approval-client-runtimeopenclaw/plugin-sdk/approval-delivery-runtimeopenclaw/plugin-sdk/approval-gateway-runtimeopenclaw/plugin-sdk/approval-reference-runtimeopenclaw/plugin-sdk/approval-handler-adapter-runtimeopenclaw/plugin-sdk/approval-handler-runtimeopenclaw/plugin-sdk/approval-native-runtimeopenclaw/plugin-sdk/approval-reply-runtimeopenclaw/plugin-sdk/channel-runtime-context
openclaw/plugin-sdk/reply-runtime,
openclaw/plugin-sdk/reply-dispatch-runtime,
openclaw/plugin-sdk/reply-reference и
openclaw/plugin-sdk/reply-chunking более широким объединяющим поверхностям, когда
они не нужны все сразу.
Подпути настройки
openclaw/plugin-sdk/setup-runtimeохватывает безопасные для среды выполнения вспомогательные средства настройки:createSetupTranslator, безопасные для импорта адаптеры исправлений настройки (createPatchedAccountSetupAdapter,createEnvPatchedAccountSetupAdapter,createSetupInputPresenceValidator), вывод примечаний поиска,promptResolvedAllowFrom,splitSetupEntriesи делегированные конструкторы прокси настройки.openclaw/plugin-sdk/channel-setupохватывает конструкторы настройки необязательной установки и несколько безопасных для настройки примитивов:createOptionalChannelSetupSurface,createOptionalChannelSetupAdapter,createOptionalChannelSetupWizard,DEFAULT_ACCOUNT_ID,createTopLevelChannelDmPolicy,setSetupChannelEnabledиsplitSetupEntries.- Используйте более широкий интерфейс
openclaw/plugin-sdk/setupтолько тогда, когда вам также нужны более тяжёлые общие вспомогательные средства настройки и конфигурации, такие какmoveSingleAccountChannelSectionToDefaultAccount(...).
createOptionalChannelSetupSurface(...). Созданные
адаптер и мастер работают с отказом по умолчанию при записи конфигурации и завершении настройки и повторно используют
одно и то же сообщение о необходимости установки при проверке, завершении и копировании
ссылки на документацию.
Если ваш канал поддерживает настройку или аутентификацию через переменные среды и универсальные процессы запуска и конфигурации
должны знать имена этих переменных среды до загрузки среды выполнения, объявите их в
манифесте плагина с помощью channelEnvVars. Сохраняйте envVars среды выполнения канала или локальные
константы только для текста, предназначенного для операторов.
Если ваш канал может появляться в status, channels list, channels status или
проверках SecretRef до запуска среды выполнения плагина, добавьте openclaw.setupEntry в
package.json. Эту точку входа должно быть безопасно импортировать в доступных только для чтения путях
команд; она должна возвращать метаданные канала, безопасный для настройки адаптер конфигурации,
адаптер состояния и метаданные цели секретов канала, необходимые для этих
сводок. Не запускайте клиенты, прослушиватели или транспортные среды выполнения из
точки входа настройки.
Сохраняйте узким и путь импорта основной точки входа канала. Механизм обнаружения может вычислять
точку входа и модуль плагина канала для регистрации возможностей без
активации канала. Файлы наподобие channel-plugin-api.ts должны экспортировать
объект плагина канала, не импортируя мастеры настройки, транспортные
клиенты, прослушиватели сокетов, средства запуска подпроцессов или модули запуска служб.
Размещайте эти компоненты среды выполнения в модулях, загружаемых из registerFull(...), установщиках
среды выполнения или ленивых адаптерах возможностей.
Другие узкие подпути каналов
Для других часто вызываемых путей каналов предпочитайте узкие вспомогательные средства более широким устаревшим поверхностям:openclaw/plugin-sdk/account-core,openclaw/plugin-sdk/account-id,openclaw/plugin-sdk/account-resolutionиopenclaw/plugin-sdk/account-helpersдля конфигурации нескольких учётных записей и отката к учётной записи по умолчаниюopenclaw/plugin-sdk/inbound-envelopeиopenclaw/plugin-sdk/channel-inboundдля входящего маршрута и конверта, а также связывания регистрации и диспетчеризацииopenclaw/plugin-sdk/channel-targetsдля вспомогательных средств разбора целейopenclaw/plugin-sdk/outbound-mediaдля загрузки медиа иopenclaw/plugin-sdk/channel-outboundдля делегатов исходящей идентификации и отправки, а также планирования полезной нагрузкиbuildThreadAwareOutboundSessionRoute(...)изopenclaw/plugin-sdk/channel-core, когда исходящий маршрут должен сохранять явныйreplyToId/threadIdили восстанавливать текущий сеанс:thread:после того, как базовый ключ сеанса всё ещё совпал. Плагины провайдеров могут переопределять приоритет, поведение суффиксов и нормализацию идентификатора ветки, когда их платформа имеет нативную семантику доставки в ветки.openclaw/plugin-sdk/thread-bindings-runtimeдля жизненного цикла привязки веток и регистрации адаптеровopenclaw/plugin-sdk/agent-media-payloadтолько тогда, когда всё ещё требуется устаревшая структура полей полезной нагрузки агента или медиаopenclaw/plugin-sdk/telegram-command-config(устарело: ни один встроенный плагин не использует это в рабочей среде) для нормализации пользовательских команд Telegram, проверки дубликатов и конфликтов и контракта конфигурации команд со стабильным откатом; для нового кода плагинов предпочитайте локальную обработку конфигурации команд в плагине
Политика входящих упоминаний
Разделяйте обработку входящих упоминаний на два уровня:- сбор свидетельств, принадлежащий плагину
- оценка общей политики
openclaw/plugin-sdk/channel-mention-gating для принятия решений по политике упоминаний.
Используйте openclaw/plugin-sdk/channel-inbound только тогда, когда нужен более широкий
экспорт вспомогательных средств входящей обработки.
Для локальной логики плагина подходят:
- обнаружение ответа боту
- обнаружение цитирования бота
- проверки участия в ветке
- исключение служебных и системных сообщений
- нативные для платформы кэши, необходимые для подтверждения участия бота
requireMention- результат явного упоминания
- список разрешённых неявных упоминаний
- обход для команд
- итоговое решение о пропуске
- Вычислите локальные факты об упоминании.
- Передайте эти факты в
resolveInboundMentionDecision({ facts, policy }). - Используйте
decision.effectiveWasMentioned,decision.shouldBypassMentionиdecision.shouldSkipво входном фильтре.
matchesMentionWithExplicit(...) возвращает логическое значение. hasAnyMention,
isExplicitlyMentioned и canResolveExplicit поступают из собственных
нативных метаданных упоминаний канала (сущностей сообщения, признаков ответа боту и аналогичных данных);
передавайте значения false/undefined, когда ваша платформа не может их определить.
api.runtime.channel.mentions предоставляет те же общие вспомогательные средства упоминаний для
встроенных плагинов каналов, которые уже зависят от внедрения среды выполнения:
buildMentionRegexes, matchesMentionPatterns, matchesMentionWithExplicit,
implicitMentionKindWhen, resolveInboundMentionDecision.
Если нужны только implicitMentionKindWhen и resolveInboundMentionDecision,
импортируйте их из openclaw/plugin-sdk/channel-mention-gating, чтобы не загружать
несвязанные вспомогательные средства входящей среды выполнения.
Пошаговое руководство
1
Пакет и манифест
Создайте стандартные файлы плагина. Поле
channels в
openclaw.plugin.json (а не поле kind) указывает, что манифест
владеет каналом. Полное описание метаданных пакета см. в разделе
Настройка и конфигурация плагина:configSchema проверяет plugins.entries.acme-chat.config. Используйте его для
настроек, принадлежащих плагину и не относящихся к конфигурации учётной записи канала.
channelConfigs.acme-chat.schema проверяет channels.acme-chat и служит
источником холодного пути для схемы конфигурации, настройки и интерфейса до
загрузки среды выполнения плагина. Полный справочник полей верхнего уровня см. в разделе
Манифест плагина.2
Создание объекта плагина канала
Интерфейс Для каналов, которые принимают как канонические ключи личных сообщений верхнего уровня, так и устаревшие вложенные ключи, используйте вспомогательные функции из
ChannelPlugin содержит множество необязательных поверхностей адаптеров. Начните
с минимума — id, config и setup — и добавляйте адаптеры
по мере необходимости.Создайте src/channel.ts:src/channel.ts
plugin-sdk/channel-config-helpers: resolveChannelDmAccess, resolveChannelDmPolicy, resolveChannelDmAllowFrom и normalizeChannelDmPolicy обеспечивают приоритет локальных значений учётной записи над унаследованными корневыми значениями. Используйте тот же преобразователь вместе с исправлением через doctor посредством normalizeLegacyDmAliases, чтобы среда выполнения и миграция читали один и тот же контракт.Что createChatChannelPlugin делает за вас
Что createChatChannelPlugin делает за вас
Вместо ручной реализации низкоуровневых интерфейсов адаптеров вы передаёте
декларативные параметры, а конструктор объединяет их:
Если требуется полный контроль, вместо декларативных параметров также можно
передавать необработанные объекты адаптеров.Необработанные адаптеры исходящих сообщений могут определять функцию
chunker(text, limit, ctx).
Необязательный параметр ctx.formatting содержит решения по форматированию во время доставки,
например maxLinesPerMessage; применяйте его перед отправкой, чтобы ветвление ответов
и границы фрагментов однократно определялись общей системой доставки исходящих сообщений.
Контексты отправки также включают replyToIdSource (implicit или explicit),
когда определена нативная цель ответа, благодаря чему вспомогательные функции полезной нагрузки могут сохранять
явные теги ответа, не занимая неявный одноразовый слот ответа.3
Подключение точки входа
Создайте Размещайте принадлежащие каналу дескрипторы CLI в
index.ts:index.ts
registerCliMetadata(...), чтобы OpenClaw
мог отображать их в корневой справке без активации полной среды выполнения канала,
а при обычной полной загрузке те же дескрипторы использовались для фактической
регистрации команд. Оставьте registerFull(...) для задач, выполняемых только во время работы.
defineChannelPluginEntry автоматически обрабатывает разделение режимов регистрации.
Если registerFull(...) регистрирует RPC-методы Gateway, используйте
префикс, относящийся к плагину. Пространства имён администрирования ядра (config.*,
exec.approvals.*, wizard.*, update.*) остаются зарезервированными и всегда
разрешаются в operator.admin. Все параметры см. в разделе
Точки входа.4
Добавление точки входа настройки
Создайте OpenClaw загружает эту точку вместо полной, когда канал отключён
или не настроен. Это предотвращает загрузку тяжёлого кода среды выполнения во время настройки.
Подробности см. в разделе Настройка и конфигурация.Встроенные каналы рабочей области, которые выносят безопасные для настройки экспорты в дополнительные
модули, могут использовать
setup-entry.ts для облегчённой загрузки во время первоначальной настройки:setup-entry.ts
defineBundledChannelSetupEntry(...) из
openclaw/plugin-sdk/channel-entry-contract, если им также требуется
явный установщик среды выполнения на этапе настройки.5
Обработка входящих сообщений
Плагин должен получать сообщения с платформы и пересылать их в
OpenClaw. Обычно используется Webhook, который проверяет запрос и
передаёт его обработчику входящих сообщений канала:
Обработка входящих сообщений зависит от конкретного канала. Каждый плагин канала владеет
собственным конвейером входящих сообщений. Реальные шаблоны см. во встроенных плагинах каналов
(например, в пакете плагина Microsoft Teams или Google Chat).
6
Тестирование
Размещайте тесты рядом с кодом в Общие вспомогательные средства для тестирования описаны в разделе Тестирование.
src/channel.test.ts:src/channel.test.ts
Структура файлов
Расширенные темы
Варианты ветвления
Фиксированный, ограниченный учётной записью или пользовательский режим ответов
Интеграция инструмента сообщений
describeMessageTool и обнаружение действий
Определение цели
inferTargetChatType, looksLikeId, reservedLiterals, resolveTarget
Вспомогательные средства среды выполнения
TTS, STT, мультимедиа, подагент через api.runtime
API входящих событий канала
Общий жизненный цикл входящего события: приём, определение, запись, диспетчеризация, завершение
Некоторые встроенные вспомогательные точки интеграции всё ещё существуют для
сопровождения встроенных плагинов и обеспечения совместимости. Они не являются
рекомендуемым шаблоном для новых плагинов каналов; предпочитайте универсальные
подпути channel/setup/reply/runtime из общей поверхности SDK, если только вы
не сопровождаете непосредственно соответствующее семейство встроенных плагинов.
Дальнейшие шаги
- Плагины провайдеров — если ваш плагин также предоставляет модели
- Обзор SDK — полный справочник по импорту подпутей
- Тестирование SDK — утилиты тестирования и контрактные тесты
- Манифест плагина — полная схема манифеста