Створення плагінів каналів
Цей посібник допоможе вам створити плагін каналу, який підключає OpenClaw до платформи обміну повідомленнями. Наприкінці у вас буде робочий канал із безпекою DM, сполученням, потоками відповідей і вихідними повідомленнями.Якщо ви раніше не створювали жодного плагіна OpenClaw, спочатку прочитайте
Початок роботи про базову структуру пакета
та налаштування маніфесту.
Як працюють плагіни каналів
Плагінам каналів не потрібні власні інструменти send/edit/react. OpenClaw зберігає один спільний інструментmessage у ядрі. Вашому плагіну належать:
- Конфігурація — визначення облікового запису та майстер налаштування
- Безпека — політика DM і списки дозволених
- Сполучення — потік підтвердження DM
- Граматика сесії — як ідентифікатори розмов, специфічні для провайдера, зіставляються з базовими чатами, ідентифікаторами потоків і резервними батьківськими елементами
- Вихідні повідомлення — надсилання тексту, медіа й опитувань на платформу
- Потоки — як групуються відповіді
:thread: і диспетчеризація.
Якщо ваша платформа зберігає додаткову область дії в ідентифікаторах розмов,
залишайте цей розбір у плагіні за допомогою
messaging.resolveSessionConversation(...). Це канонічний хук для
зіставлення rawId з базовим ідентифікатором розмови, необов’язковим
ідентифікатором потоку, явним baseConversationId і будь-якими
parentConversationCandidates.
Коли ви повертаєте parentConversationCandidates, зберігайте їхній порядок від
найвужчого батьківського елемента до найширшої/базової розмови.
Вбудовані плагіни, яким потрібен той самий розбір до запуску реєстру каналів,
також можуть експортувати файл верхнього рівня session-key-api.ts із
відповідним експортом resolveSessionConversation(...). Ядро використовує цю
безпечну для завантаження поверхню лише тоді, коли реєстр плагінів під час
виконання ще недоступний.
messaging.resolveParentConversationCandidates(...) залишається доступним як
застарілий резервний варіант сумісності, коли плагіну потрібні лише резервні
батьківські елементи поверх загального/raw id. Якщо наявні обидва хуки, ядро
спочатку використовує
resolveSessionConversation(...).parentConversationCandidates і лише потім
повертається до resolveParentConversationCandidates(...), якщо канонічний хук
їх не містить.
Підтвердження та можливості каналів
Більшості плагінів каналів не потрібен код, специфічний для підтверджень.- Ядру належать
/approveу тому самому чаті, спільні payload кнопок підтвердження та загальна резервна доставка. - Надавайте перевагу одному об’єкту
approvalCapabilityу плагіні каналу, коли каналу потрібна поведінка, специфічна для підтверджень. ChannelPlugin.approvalsвидалено. Розміщуйте факти доставки/нативного відтворення/автентифікації підтверджень уapprovalCapability.plugin.auth— лише login/logout; ядро більше не читає з цього об’єкта хуки автентифікації підтверджень.approvalCapability.authorizeActorActionіapprovalCapability.getActionAvailabilityState— канонічний шов автентифікації підтверджень.- Використовуйте
approvalCapability.getActionAvailabilityStateдля доступності автентифікації підтверджень у тому самому чаті. - Якщо ваш канал надає нативні підтвердження exec, використовуйте
approvalCapability.getExecInitiatingSurfaceStateдля стану поверхні ініціювання/нативного клієнта, коли він відрізняється від автентифікації підтверджень у тому самому чаті. Ядро використовує цей хук, специфічний для exec, щоб розрізнятиenabledіdisabled, вирішувати, чи підтримує канал ініціювання нативні підтвердження exec, і включати канал до підказок щодо резервного варіанту для нативного клієнта.createApproverRestrictedNativeApprovalCapability(...)заповнює це для типового випадку. - Використовуйте
outbound.shouldSuppressLocalPayloadPromptабоoutbound.beforeDeliverPayloadдля специфічної для каналу поведінки життєвого циклу payload, наприклад приховування дубльованих локальних підказок підтвердження або надсилання індикаторів набору перед доставкою. - Використовуйте
approvalCapability.deliveryлише для маршрутизації нативних підтверджень або придушення резервної доставки. - Використовуйте
approvalCapability.nativeRuntimeдля фактів нативних підтверджень, що належать каналу. Зберігайте його лінивим у гарячих точках входу каналу за допомогоюcreateLazyChannelApprovalNativeRuntimeAdapter(...), який може імпортувати ваш runtime-модуль на вимогу, водночас дозволяючи ядру збирати життєвий цикл підтверджень. - Використовуйте
approvalCapability.renderлише тоді, коли каналу справді потрібні власні payload підтверджень замість спільного рендерера. - Використовуйте
approvalCapability.describeExecApprovalSetup, коли канал хоче, щоб відповідь для вимкненого шляху пояснювала точні параметри конфігурації, потрібні для ввімкнення нативних підтверджень exec. Хук отримує{ channel, channelLabel, accountId }; канали з іменованими обліковими записами повинні відтворювати шляхи з областю облікового запису, як-отchannels.<channel>.accounts.<id>.execApprovals.*, а не значення верхнього рівня за замовчуванням. - Якщо канал може виводити стабільні DM-ідентичності, схожі на власника, з наявної конфігурації, використовуйте
createResolvedApproverActionAuthAdapterзopenclaw/plugin-sdk/approval-runtime, щоб обмежити/approveу тому самому чаті без додавання специфічної для підтверджень логіки ядра. - Якщо каналу потрібна доставка нативних підтверджень, зосередьте код каналу на нормалізації цілі та фактах транспорту/подання. Використовуйте
createChannelExecApprovalProfile,createChannelNativeOriginTargetResolver,createChannelApproverDmTargetResolverіcreateApproverRestrictedNativeApprovalCapabilityзopenclaw/plugin-sdk/approval-runtime. Розміщуйте специфічні для каналу факти заapprovalCapability.nativeRuntime, ідеально черезcreateChannelApprovalNativeRuntimeAdapter(...)абоcreateLazyChannelApprovalNativeRuntimeAdapter(...), щоб ядро могло збирати обробник і володіти фільтрацією запитів, маршрутизацією, дедуплікацією, строком дії, підпискою gateway і сповіщеннями про маршрутизацію в інше місце.nativeRuntimeподілено на кілька менших швів: availability— чи налаштований обліковий запис і чи слід обробляти запитpresentation— зіставлення спільної view model підтвердження з нативними payload у станах pending/resolved/expired або фінальними діямиtransport— підготовка цілей і надсилання/оновлення/видалення нативних повідомлень підтвердженняinteractions— необов’язкові хуки bind/unbind/clear-action для нативних кнопок або реакційobserve— необов’язкові хуки діагностики доставки- Якщо каналу потрібні об’єкти, що належать runtime, наприклад клієнт, токен, застосунок Bolt або отримувач webhook, реєструйте їх через
openclaw/plugin-sdk/channel-runtime-context. Загальний реєстр runtime-контексту дозволяє ядру завантажувати обробники, керовані можливостями, зі стану запуску каналу без додавання обгорткового glue-коду, специфічного для підтверджень. - Звертайтеся до нижчорівневих
createChannelApprovalHandlerабоcreateChannelNativeApprovalRuntimeлише тоді, коли шов, керований можливостями, ще недостатньо виразний. - Канали з нативними підтвердженнями повинні маршрутизувати через ці helper-и і
accountId, іapprovalKind.accountIdзберігає політику підтверджень для кількох облікових записів у правильній області бот-облікового запису, аapprovalKindзберігає для каналу доступну поведінку підтверджень exec або плагіна без жорстко закодованих гілок у ядрі. - Тепер ядру також належать сповіщення про перемаршрутизацію підтверджень. Плагіни каналів не повинні надсилати власні додаткові повідомлення на кшталт “підтвердження перейшло в DM / інший канал” із
createChannelNativeApprovalRuntime; натомість надавайте точну маршрутизацію origin + approver-DM через спільні helper-и можливостей підтверджень і дозвольте ядру агрегувати фактичні доставки перед публікацією будь-якого сповіщення назад у чат ініціювання. - Зберігайте наскрізно тип delivered approval id. Нативні клієнти не повинні вгадувати або переписувати маршрутизацію підтверджень exec чи plugin зі стану, локального для каналу.
- Різні типи підтверджень можуть навмисно відкривати різні нативні поверхні.
Поточні вбудовані приклади:
- Slack зберігає доступною нативну маршрутизацію підтверджень як для exec, так і для plugin id.
- Matrix зберігає ту саму нативну маршрутизацію DM/каналу та UX реакцій для підтверджень exec і plugin, водночас дозволяючи автентифікації відрізнятися за типом підтвердження.
createApproverRestrictedNativeApprovalAdapterусе ще існує як обгортка сумісності, але новий код має надавати перевагу побудовнику можливостей і експортуватиapprovalCapabilityу плагіні.
openclaw/plugin-sdk/approval-auth-runtimeopenclaw/plugin-sdk/approval-client-runtimeopenclaw/plugin-sdk/approval-delivery-runtimeopenclaw/plugin-sdk/approval-gateway-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/setup-runtime,
openclaw/plugin-sdk/setup-adapter-runtime,
openclaw/plugin-sdk/reply-runtime,
openclaw/plugin-sdk/reply-dispatch-runtime,
openclaw/plugin-sdk/reply-reference і
openclaw/plugin-sdk/reply-chunking, коли вам не потрібна ширша
узагальнена поверхня.
Окремо для setup:
openclaw/plugin-sdk/setup-runtimeохоплює безпечні для runtime helper-и setup: безпечні для імпорту адаптери patch setup (createPatchedAccountSetupAdapter,createEnvPatchedAccountSetupAdapter,createSetupInputPresenceValidator), вивід нотаток пошуку,promptResolvedAllowFrom,splitSetupEntriesі делеговані побудовники setup-proxyopenclaw/plugin-sdk/setup-adapter-runtime— це вузький env-aware шов адаптера дляcreateEnvPatchedAccountSetupAdapteropenclaw/plugin-sdk/channel-setupохоплює побудовники setup з необов’язковим встановленням, а також кілька примітивів, безпечних для setup:createOptionalChannelSetupSurface,createOptionalChannelSetupAdapter,
channelEnvVars. Зберігайте runtime
envVars каналу або локальні константи лише для текстів, орієнтованих на операторів.
createOptionalChannelSetupWizard, DEFAULT_ACCOUNT_ID,
createTopLevelChannelDmPolicy, setSetupChannelEnabled і
splitSetupEntries
- використовуйте ширший шов
openclaw/plugin-sdk/setupлише тоді, коли вам також потрібні важчі спільні helper-и setup/config, наприкладmoveSingleAccountChannelSectionToDefaultAccount(...)
createOptionalChannelSetupSurface(...).
Згенеровані adapter/wizard працюють у безпечному зачиненому режимі щодо
записів конфігурації та фіналізації, а також повторно використовують те саме
повідомлення про необхідність встановлення у валідації, finalize і текстах
посилань на документацію.
Для інших гарячих шляхів каналів надавайте перевагу вузьким helper-ам замість
ширших застарілих поверхонь:
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/inbound-reply-dispatchдля маршруту/конверта вхідних повідомлень і зв’язування record-and-dispatchopenclaw/plugin-sdk/messaging-targetsдля розбору/зіставлення цілейopenclaw/plugin-sdk/outbound-mediaіopenclaw/plugin-sdk/outbound-runtimeдля завантаження медіа та делегатів identity/send для вихідних повідомленьopenclaw/plugin-sdk/thread-bindings-runtimeдля життєвого циклу прив’язок потоків і реєстрації адаптерівopenclaw/plugin-sdk/agent-media-payloadлише тоді, коли все ще потрібне застаріле компонування полів payload агента/медіаopenclaw/plugin-sdk/telegram-command-configдля нормалізації користувацьких команд Telegram, валідації дублікатів/конфліктів і стабільного для fallback контракту конфігурації команд
Політика вхідних згадок
Розділяйте обробку вхідних згадок на два шари:- збирання доказів, що належить плагіну
- спільна оцінка політики
openclaw/plugin-sdk/channel-inbound.
Добре підходить для локальної логіки плагіна:
- виявлення відповіді боту
- виявлення цитати бота
- перевірки участі в потоці
- виключення службових/системних повідомлень
- специфічні для платформи нативні кеші, потрібні для підтвердження участі бота
requireMention- явний результат згадки
- список дозволених неявних згадок
- обхід для команд
- фінальне рішення про пропуск
- Обчисліть локальні факти згадок.
- Передайте ці факти в
resolveInboundMentionDecision({ facts, policy }). - Використовуйте
decision.effectiveWasMentioned,decision.shouldBypassMentionіdecision.shouldSkipу своїй вхідній перевірці.
api.runtime.channel.mentions надає ті самі спільні helper-и згадок для
вбудованих плагінів каналів, які вже залежать від runtime injection:
buildMentionRegexesmatchesMentionPatternsmatchesMentionWithExplicitimplicitMentionKindWhenresolveInboundMentionDecision
resolveMentionGating* залишаються в
openclaw/plugin-sdk/channel-inbound лише як експорти сумісності. Новий код
повинен використовувати resolveInboundMentionDecision({ facts, policy }).
Покроковий розбір
Пакет і маніфест
Створіть стандартні файли плагіна. Поле
channel у package.json
робить цей пакет плагіном каналу. Повну поверхню метаданих пакета див. у
Налаштування плагіна та конфігурація:Створіть об’єкт плагіна каналу
Інтерфейс
ChannelPlugin має багато необов’язкових поверхонь адаптерів.
Почніть із мінімуму — id і setup — і додавайте адаптери за потреби.Створіть src/channel.ts:src/channel.ts
Що для вас робить createChatChannelPlugin
Що для вас робить createChatChannelPlugin
Замість ручної реалізації низькорівневих інтерфейсів адаптерів ви
передаєте декларативні параметри, а побудовник їх компонуватиме:
Ви також можете передавати сирі об’єкти адаптерів замість декларативних
параметрів, якщо вам потрібен повний контроль.
| Параметр | Що він підключає |
|---|---|
security.dm | Визначення політики DM з областю дії за полями конфігурації |
pairing.text | Потік текстового сполучення DM з обміном коду |
threading | Визначення режиму reply-to (фіксований, з областю облікового запису або користувацький) |
outbound.attachedResults | Функції надсилання, що повертають метадані результату (ідентифікатори повідомлень) |
Підключіть точку входу
Створіть Розміщуйте дескриптори CLI, що належать каналу, у
index.ts:index.ts
registerCliMetadata(...),
щоб OpenClaw міг показувати їх у кореневій довідці без активації повного
runtime каналу, тоді як звичайні повні завантаження все одно підхоплюють
ті самі дескриптори для реєстрації реальних команд. Зберігайте
registerFull(...) для роботи лише під час runtime.
Якщо registerFull(...) реєструє gateway RPC methods, використовуйте
префікс, специфічний для плагіна. Простори імен адміністратора ядра
(config.*, exec.approvals.*, wizard.*, update.*) залишаються
зарезервованими й завжди зіставляються з operator.admin.
defineChannelPluginEntry автоматично обробляє поділ за режимами реєстрації. Див.
Точки входу, щоб
переглянути всі параметри.Додайте запис setup
Створіть OpenClaw завантажує це замість повної точки входу, коли канал вимкнений
або не налаштований. Це дозволяє не підтягувати важкий runtime-код під час
потоків setup.
Докладніше див. у Setup і конфігурація.
setup-entry.ts для полегшеного завантаження під час onboarding:setup-entry.ts
Обробляйте вхідні повідомлення
Ваш плагін має отримувати повідомлення з платформи та пересилати їх у
OpenClaw. Типовий шаблон — це webhook, який перевіряє запит і
диспетчеризує його через обробник вхідних повідомлень вашого каналу:
Обробка вхідних повідомлень є специфічною для каналу. Кожен плагін каналу
володіє власним вхідним конвеєром. Дивіться на вбудовані плагіни каналів
(наприклад, пакет плагіна Microsoft Teams або Google Chat), щоб побачити реальні шаблони.
Тестування
Пишіть колоковані тести в Спільні helper-и для тестування див. у Тестування.
src/channel.test.ts:src/channel.test.ts
Структура файлів
Розширені теми
Параметри потоків
Фіксовані режими відповідей, режими з областю облікового запису або користувацькі
Інтеграція інструмента message
describeMessageTool і виявлення дій
Визначення цілі
inferTargetChatType, looksLikeId, resolveTarget
Runtime helper-и
TTS, STT, медіа, subagent через api.runtime
Деякі вбудовані helper seams усе ще існують для підтримки вбудованих плагінів і
сумісності. Вони не є рекомендованим шаблоном для нових плагінів каналів;
надавайте перевагу загальним підшляхам channel/setup/reply/runtime зі спільної
поверхні SDK, якщо тільки ви безпосередньо не підтримуєте цю родину
вбудованих плагінів.
Наступні кроки
- Плагіни провайдерів — якщо ваш плагін також надає моделі
- Огляд SDK — повний довідник з імпортів за підшляхами
- Тестування SDK — утиліти тестування та контрактні тести
- Маніфест плагіна — повна схема маніфесту