Створення плагінів каналів
Цей посібник описує створення плагіна каналу, який підключає OpenClaw до платформи обміну повідомленнями. Наприкінці у вас буде робочий канал із захистом DM, паруванням, потоковістю відповідей і вихідними повідомленнями.Якщо ви раніше не створювали жодного плагіна OpenClaw, спочатку прочитайте
Getting Started про базову структуру пакета
та налаштування маніфесту.
Як працюють плагіни каналів
Плагінам каналів не потрібні власні інструменти send/edit/react. OpenClaw зберігає один спільний інструментmessage у core. Вашому плагіну належать:
- Конфігурація — визначення облікового запису та майстер налаштування
- Безпека — політика DM та allowlist-и
- Парування — процес підтвердження DM
- Граматика сесій — як conversation id, специфічні для провайдера, зіставляються з базовими чатами, id потоків і резервними батьківськими значеннями
- Вихідні повідомлення — надсилання тексту, медіа та опитувань на платформу
- Потоковість — як упорядковуються відповіді
:thread: та диспетчеризація.
Якщо ваша платформа зберігає додаткову область в межах conversation id,
залишайте цей розбір у плагіні через
messaging.resolveSessionConversation(...). Це канонічний хук для
зіставлення rawId з базовим conversation id, необов’язковим id потоку,
явним baseConversationId і будь-якими
parentConversationCandidates.
Коли ви повертаєте parentConversationCandidates, зберігайте їх порядок від
найвужчого батьківського значення до найширшої/базової розмови.
Вбудовані плагіни, яким потрібен той самий розбір до запуску реєстру каналів,
також можуть експортувати файл верхнього рівня session-key-api.ts із
відповідним експортом resolveSessionConversation(...). Core використовує цю
безпечну для bootstrap поверхню лише тоді, коли реєстр runtime-плагінів ще
недоступний.
messaging.resolveParentConversationCandidates(...) залишається доступним як
застарілий резервний механізм сумісності, коли плагіну потрібні лише резервні
батьківські значення поверх загального/сирого id. Якщо існують обидва хуки,
core спочатку використовує
resolveSessionConversation(...).parentConversationCandidates і повертається
до resolveParentConversationCandidates(...) лише тоді, коли канонічний хук
їх не надає.
Погодження та можливості каналів
Більшості плагінів каналів не потрібен код, специфічний для погоджень.- Core керує
/approveу тому самому чаті, спільними payload-ами кнопок погодження та загальною резервною доставкою. - Віддавайте перевагу одному об’єкту
approvalCapabilityу плагіні каналу, коли каналу потрібна поведінка, специфічна для погоджень. approvalCapability.authorizeActorActionіapprovalCapability.getActionAvailabilityState— це канонічний шар авторизації погоджень.- Якщо ваш канал надає нативні погодження exec, реалізуйте
approvalCapability.getActionAvailabilityStateнавіть якщо нативний транспорт повністю живе вapprovalCapability.native. Core використовує цей хук доступності, щоб розрізнятиenabledіdisabled, визначати, чи підтримує ініціюючий канал нативні погодження, і включати канал до підказок резервного сценарію для нативного клієнта. - Використовуйте
outbound.shouldSuppressLocalPayloadPromptабоoutbound.beforeDeliverPayloadдля поведінки життєвого циклу payload-ів, специфічної для каналу, наприклад приховування дубльованих локальних prompt-ів погодження або надсилання індикаторів набору тексту перед доставкою. - Використовуйте
approvalCapability.deliveryлише для нативної маршрутизації погоджень або придушення резервного сценарію. - Використовуйте
approvalCapability.renderлише тоді, коли каналу справді потрібні власні payload-и погодження замість спільного рендерера. - Використовуйте
approvalCapability.describeExecApprovalSetup, коли канал хоче, щоб відповідь у гілці disabled пояснювала точні параметри конфігурації, потрібні для ввімкнення нативних погоджень exec. Хук отримує{ channel, channelLabel, accountId }; канали з іменованими обліковими записами мають рендерити шляхи, прив’язані до облікового запису, наприкладchannels.<channel>.accounts.<id>.execApprovals.*, замість значень верхнього рівня за замовчуванням. - Якщо канал може вивести стабільні DM-ідентичності, подібні до власника, із наявної конфігурації, використовуйте
createResolvedApproverActionAuthAdapterзopenclaw/plugin-sdk/approval-runtime, щоб обмежити/approveу тому самому чаті без додавання логіки погоджень, специфічної для core. - Якщо каналу потрібна нативна доставка погоджень, тримайте код каналу зосередженим на нормалізації цілі та транспортних хуках. Використовуйте
createChannelExecApprovalProfile,createChannelNativeOriginTargetResolver,createChannelApproverDmTargetResolver,createApproverRestrictedNativeApprovalCapabilityіcreateChannelNativeApprovalRuntimeзopenclaw/plugin-sdk/approval-runtime, щоб core керував фільтрацією запитів, маршрутизацією, дедуплікацією, строком дії та підпискою gateway. - Канали з нативними погодженнями мають маршрутизувати і
accountId, іapprovalKindчерез ці хелпери.accountIdзберігає політику погоджень для кількох облікових записів у межах правильного облікового запису бота, аapprovalKindзберігає поведінку погоджень exec і плагінів доступною для каналу без жорстко закодованих гілок у core. - Зберігайте тип id доставленого погодження від початку до кінця. Нативні клієнти не повинні вгадувати або переписувати маршрутизацію погоджень exec чи плагінів на основі локального стану каналу.
- Різні типи погоджень можуть навмисно відкривати різні нативні поверхні.
Поточні приклади вбудованих плагінів:
- Slack зберігає доступність нативної маршрутизації погоджень як для id exec, так і для id плагінів.
- Matrix зберігає нативну маршрутизацію DM/каналів лише для погоджень exec і залишає
погодження плагінів на спільному шляху
/approveу тому самому чаті.
createApproverRestrictedNativeApprovalAdapterусе ще існує як обгортка сумісності, але новий код має віддавати перевагу побудовнику можливостей і надаватиapprovalCapabilityу плагіні.
openclaw/plugin-sdk/approval-auth-runtimeopenclaw/plugin-sdk/approval-client-runtimeopenclaw/plugin-sdk/approval-delivery-runtimeopenclaw/plugin-sdk/approval-native-runtimeopenclaw/plugin-sdk/approval-reply-runtime
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 хелпери setup: безпечні для import адаптери патчів setup (createPatchedAccountSetupAdapter,createEnvPatchedAccountSetupAdapter,createSetupInputPresenceValidator), вивід приміток пошуку,promptResolvedAllowFrom,splitSetupEntriesі делеговані побудовники proxy для setupopenclaw/plugin-sdk/setup-adapter-runtime— це вузький env-aware шар адаптера дляcreateEnvPatchedAccountSetupAdapteropenclaw/plugin-sdk/channel-setupохоплює побудовники setup для необов’язкового встановлення, а також кілька безпечних для setup примітивів:createOptionalChannelSetupSurface,createOptionalChannelSetupAdapter,createOptionalChannelSetupWizard,DEFAULT_ACCOUNT_ID,createTopLevelChannelDmPolicy,setSetupChannelEnabledіsplitSetupEntries- використовуйте ширший шар
openclaw/plugin-sdk/setupлише тоді, коли вам також потрібні важчі спільні хелпери setup/config, наприкладmoveSingleAccountChannelSectionToDefaultAccount(...)
createOptionalChannelSetupSurface(...).
Згенеровані adapter/wizard працюють у режимі fail closed для записів у конфігурацію
та фіналізації й повторно використовують те саме повідомлення про необхідність
встановлення у валідації, finalize та тексті з посиланням на документацію.
Для інших гарячих шляхів каналу віддавайте перевагу вузьким хелперам замість
ширших застарілих поверхонь:
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для завантаження медіа та делегатів ідентичності/надсилання вихідних повідомленьopenclaw/plugin-sdk/thread-bindings-runtimeдля життєвого циклу прив’язок потоків і реєстрації адаптерівopenclaw/plugin-sdk/agent-media-payloadлише тоді, коли все ще потрібна застаріла структура полів payload-ів agent/mediaopenclaw/plugin-sdk/telegram-command-configдля нормалізації користувацьких команд Telegram, валідації дублікатів/конфліктів і стабільного як резервний варіант контракту конфігурації команд
Покрокове проходження
Пакет і маніфест
Створіть стандартні файли плагіна. Поле
channel у package.json
визначає, що це плагін каналу. Повну поверхню метаданих пакета див. у
Plugin Setup and Config:Створіть об’єкт плагіна каналу
Інтерфейс
ChannelPlugin має багато необов’язкових поверхонь адаптерів. Почніть
з мінімуму — id і setup — і додавайте адаптери за потреби.Створіть src/channel.ts:src/channel.ts
Що для вас робить createChatChannelPlugin
Що для вас робить createChatChannelPlugin
Замість ручної реалізації низькорівневих інтерфейсів адаптерів, ви
передаєте декларативні параметри, а побудовник компонує їх:
Ви також можете передавати сирі об’єкти адаптерів замість декларативних параметрів,
якщо вам потрібен повний контроль.
| Option | Що він підключає |
|---|---|
security.dm | Scoped-резолвер безпеки DM із полів конфігурації |
pairing.text | Текстовий процес парування DM з обміном кодом |
threading | Резолвер режиму reply-to (фіксований, прив’язаний до облікового запису або користувацький) |
outbound.attachedResults | Функції надсилання, які повертають метадані результату (ID повідомлень) |
Підключіть entry point
Створіть Розміщуйте дескриптори CLI, що належать каналу, у
index.ts:index.ts
registerCliMetadata(...), щоб OpenClaw
міг показувати їх у кореневій довідці без активації повного runtime каналу,
тоді як звичайні повні завантаження все одно підхоплюватимуть ті самі дескриптори для реєстрації
реальних команд. Залишайте registerFull(...) для роботи, потрібної лише в runtime.
Якщо registerFull(...) реєструє gateway RPC-методи, використовуйте
префікс, специфічний для плагіна. Простори імен адмін-інтерфейсу core (config.*,
exec.approvals.*, wizard.*, update.*) залишаються зарезервованими і завжди
зіставляються з operator.admin.
defineChannelPluginEntry автоматично обробляє цей поділ режимів реєстрації. У
Entry Points див. усі
параметри.Додайте setup entry
Створіть OpenClaw завантажує це замість повного entry, коли канал вимкнений
або не налаштований. Це дає змогу не підтягувати важкий runtime-код під час процесів setup.
Докладніше див. у Setup and Config.
setup-entry.ts для легкого завантаження під час онбордингу:setup-entry.ts
Обробляйте вхідні повідомлення
Ваш плагін має отримувати повідомлення з платформи та переспрямовувати їх до
OpenClaw. Типовий шаблон — це webhook, який перевіряє запит і
диспетчеризує його через обробник вхідних повідомлень вашого каналу:
Обробка вхідних повідомлень є специфічною для каналу. Кожен плагін каналу
володіє власним конвеєром вхідних повідомлень. Перегляньте вбудовані плагіни каналів
(наприклад пакет плагіна Microsoft Teams або Google Chat), щоб побачити реальні шаблони.
Тестування
Пишіть колоковані тести у Спільні хелпери для тестування див. у Testing.
src/channel.test.ts:src/channel.test.ts
Структура файлів
Розширені теми
Параметри потоковості
Фіксовані, прив’язані до облікового запису або користувацькі режими reply
Інтеграція інструмента message
describeMessageTool і виявлення дій
Визначення цілі
inferTargetChatType, looksLikeId, resolveTarget
Runtime-хелпери
TTS, STT, media, subagent через api.runtime
Деякі вбудовані допоміжні шари все ще існують для супроводу вбудованих плагінів
та сумісності. Це не рекомендований шаблон для нових плагінів каналів;
віддавайте перевагу загальним підшляхам channel/setup/reply/runtime зі спільної
поверхні SDK, якщо тільки ви не супроводжуєте безпосередньо цю сім’ю вбудованих плагінів.
Наступні кроки
- Provider Plugins — якщо ваш плагін також надає моделі
- SDK Overview — повний довідник з імпортів підшляхів
- SDK Testing — тестові утиліти та контрактні тести
- Plugin Manifest — повна схема маніфесту