Tworzenie wtyczek kanałów
Ten przewodnik omawia tworzenie wtyczki kanału, która łączy OpenClaw z platformą wiadomości. Po jego ukończeniu będziesz mieć działający kanał z zabezpieczeniami DM, parowaniem, wątkowaniem odpowiedzi i wysyłaniem wiadomości.Jeśli nie tworzono wcześniej żadnej wtyczki OpenClaw, najpierw przeczytaj
Pierwsze kroki, aby poznać podstawową strukturę
pakietu i konfigurację manifestu.
Jak działają wtyczki kanałów
Wtyczki kanałów nie potrzebują własnych narzędzi send/edit/react. OpenClaw utrzymuje jedno współdzielone narzędziemessage w rdzeniu. Twoja wtyczka
odpowiada za:
- Konfigurację — rozpoznawanie konta i kreator konfiguracji
- Bezpieczeństwo — politykę DM i listy dozwolonych nadawców
- Parowanie — przepływ zatwierdzania DM
- Gramatykę sesji — sposób, w jaki identyfikatory rozmów specyficzne dla dostawcy mapują się na czaty bazowe, identyfikatory wątków i alternatywne identyfikatory nadrzędne
- Wysyłanie — wysyłanie tekstu, multimediów i ankiet na platformę
- Wątkowanie — sposób wątkowania odpowiedzi
:thread: i wysyłkę.
Jeśli twoja platforma przechowuje dodatkowy zakres w identyfikatorach rozmów,
utrzymuj to parsowanie we wtyczce za pomocą messaging.resolveSessionConversation(...). To
kanoniczny hook mapowania rawId na bazowy identyfikator rozmowy, opcjonalny
identyfikator wątku, jawne baseConversationId oraz wszelkie
parentConversationCandidates.
Gdy zwracasz parentConversationCandidates, zachowaj ich kolejność od
najwęższego rodzica do najszerszej/bazowej rozmowy.
Wbudowane wtyczki, które potrzebują tego samego parsowania przed uruchomieniem
rejestru kanałów, mogą także udostępniać plik najwyższego poziomu
session-key-api.ts z pasującym eksportem resolveSessionConversation(...). Rdzeń
używa tej bezpiecznej przy rozruchu powierzchni tylko wtedy, gdy środowiskowy
rejestr wtyczek nie jest jeszcze dostępny.
messaging.resolveParentConversationCandidates(...) pozostaje dostępne jako
starszy zgodnościowy mechanizm zapasowy, gdy wtyczka potrzebuje tylko
alternatywnych identyfikatorów nadrzędnych ponad ogólnym/surowym identyfikatorem. Jeśli istnieją oba hooki, rdzeń najpierw używa
resolveSessionConversation(...).parentConversationCandidates, a do
resolveParentConversationCandidates(...) wraca tylko wtedy, gdy hook
kanoniczny ich nie zwraca.
Zatwierdzenia i możliwości kanału
Większość wtyczek kanałów nie potrzebuje kodu specyficznego dla zatwierdzeń.- Rdzeń odpowiada za
/approvew tym samym czacie, współdzielone ładunki przycisków zatwierdzania i ogólne dostarczanie zapasowe. - Gdy kanał wymaga zachowania specyficznego dla zatwierdzeń, preferuj jeden obiekt
approvalCapabilitywe wtyczce kanału. approvalCapability.authorizeActorActioniapprovalCapability.getActionAvailabilityStateto kanoniczna powierzchnia uwierzytelniania zatwierdzeń.- Użyj
outbound.shouldSuppressLocalPayloadPromptluboutbound.beforeDeliverPayloaddla zachowań cyklu życia ładunku specyficznych dla kanału, takich jak ukrywanie zduplikowanych lokalnych promptów zatwierdzania lub wysyłanie wskaźników pisania przed dostarczeniem. - Używaj
approvalCapability.deliverytylko do natywnego routingu zatwierdzeń lub wyłączania mechanizmu zapasowego. - Używaj
approvalCapability.rendertylko wtedy, gdy kanał naprawdę potrzebuje niestandardowych ładunków zatwierdzeń zamiast współdzielonego renderera. - Jeśli kanał potrafi wywnioskować stabilne tożsamości DM podobne do właściciela na podstawie istniejącej konfiguracji, użyj
createResolvedApproverActionAuthAdapterzopenclaw/plugin-sdk/approval-runtime, aby ograniczyć/approvew tym samym czacie bez dodawania logiki rdzenia specyficznej dla zatwierdzeń. - Jeśli kanał potrzebuje natywnego dostarczania zatwierdzeń, utrzymuj kod kanału skupiony na normalizacji celu i hookach transportowych. Użyj
createChannelExecApprovalProfile,createChannelNativeOriginTargetResolver,createChannelApproverDmTargetResolver,createApproverRestrictedNativeApprovalCapabilityicreateChannelNativeApprovalRuntimezopenclaw/plugin-sdk/approval-runtime, aby rdzeń odpowiadał za filtrowanie żądań, routing, deduplikację, wygaśnięcie i subskrypcję bramy. - Kanały z natywnymi zatwierdzeniami muszą przekazywać zarówno
accountId, jak iapprovalKindprzez te helpery.accountIdutrzymuje politykę zatwierdzeń wielokontowych w odpowiednim zakresie dla właściwego konta bota, aapprovalKindudostępnia kanałowi zachowanie zatwierdzeń exec i plugin bez zakodowanych na stałe rozgałęzień w rdzeniu. - Zachowuj rodzaj dostarczonego identyfikatora zatwierdzenia od początku do końca. Klienci natywni nie powinni zgadywać ani przepisywać routingu zatwierdzeń exec i plugin na podstawie lokalnego stanu kanału.
- Różne rodzaje zatwierdzeń mogą celowo udostępniać różne powierzchnie natywne.
Obecne przykłady wbudowane:
- Slack zachowuje natywny routing zatwierdzeń dostępny zarówno dla identyfikatorów exec, jak i plugin.
- Matrix zachowuje natywny routing DM/kanału tylko dla zatwierdzeń exec i pozostawia zatwierdzenia plugin na współdzielonej ścieżce
/approvew tym samym czacie.
createApproverRestrictedNativeApprovalAdapternadal istnieje jako zgodnościowy wrapper, ale nowy kod powinien preferować kreator możliwości i udostępniaćapprovalCapabilitywe wtyczce.
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 i
openclaw/plugin-sdk/reply-chunking, gdy nie potrzebujesz szerszej
powierzchni zbiorczej.
Konkretnie dla konfiguracji:
openclaw/plugin-sdk/setup-runtimeobejmuje bezpieczne runtime helpery konfiguracji: bezpieczne przy imporcie adaptery łatania konfiguracji (createPatchedAccountSetupAdapter,createEnvPatchedAccountSetupAdapter,createSetupInputPresenceValidator), wyjście lookup-note,promptResolvedAllowFrom,splitSetupEntriesi delegowane kreatory proxy konfiguracjiopenclaw/plugin-sdk/setup-adapter-runtimeto wąska, świadoma środowiska powierzchnia adaptera dlacreateEnvPatchedAccountSetupAdapteropenclaw/plugin-sdk/channel-setupobejmuje kreatory konfiguracji opcjonalnej instalacji plus kilka bezpiecznych dla konfiguracji prymitywów:createOptionalChannelSetupSurface,createOptionalChannelSetupAdapter,createOptionalChannelSetupWizard,DEFAULT_ACCOUNT_ID,createTopLevelChannelDmPolicy,setSetupChannelEnabledisplitSetupEntries- używaj szerszej powierzchni
openclaw/plugin-sdk/setuptylko wtedy, gdy potrzebujesz również cięższych współdzielonych helperów konfiguracji i ustawień, takich jakmoveSingleAccountChannelSectionToDefaultAccount(...)
createOptionalChannelSetupSurface(...). Wygenerowany
adapter/kreator domyślnie bezpiecznie blokuje zapisy konfiguracji i finalizację,
a także ponownie używa tego samego komunikatu o wymaganej instalacji w walidacji,
finalizacji i tekście z linkiem do dokumentacji.
Dla innych gorących ścieżek kanału preferuj wąskie helpery zamiast szerszych
starszych powierzchni:
openclaw/plugin-sdk/account-core,openclaw/plugin-sdk/account-id,openclaw/plugin-sdk/account-resolutioniopenclaw/plugin-sdk/account-helpersdla konfiguracji wielokontowej i mechanizmu zapasowego konta domyślnegoopenclaw/plugin-sdk/inbound-envelopeiopenclaw/plugin-sdk/inbound-reply-dispatchdla routingu/obwiedni przychodzących wiadomości oraz powiązania record-and-dispatchopenclaw/plugin-sdk/messaging-targetsdla parsowania/dopasowywania celówopenclaw/plugin-sdk/outbound-mediaiopenclaw/plugin-sdk/outbound-runtimedla ładowania multimediów oraz delegatów tożsamości/wysyłki wychodzącejopenclaw/plugin-sdk/thread-bindings-runtimedla cyklu życia powiązań wątków i rejestracji adapteraopenclaw/plugin-sdk/agent-media-payloadtylko wtedy, gdy nadal wymagany jest starszy układ pól ładunku agenta/multimediówopenclaw/plugin-sdk/telegram-command-configdla normalizacji niestandardowych poleceń Telegram, walidacji duplikatów/konfliktów oraz stabilnego kontraktu konfiguracji poleceń dla mechanizmu zapasowego
Przewodnik krok po kroku
Pakiet i manifest
Utwórz standardowe pliki wtyczki. Pole
channel w package.json
sprawia, że jest to wtyczka kanału. Pełną powierzchnię metadanych pakietu
znajdziesz w Konfiguracja i ustawienia wtyczki:Zbuduj obiekt wtyczki kanału
Interfejs
ChannelPlugin ma wiele opcjonalnych powierzchni adaptera. Zacznij od minimum — id i setup — a następnie dodawaj adaptery w miarę potrzeb.Utwórz src/channel.ts:src/channel.ts
Co zapewnia createChatChannelPlugin
Co zapewnia createChatChannelPlugin
Zamiast ręcznie implementować niskopoziomowe interfejsy adapterów,
przekazujesz deklaratywne opcje, a kreator składa je razem:
Możesz też przekazać surowe obiekty adapterów zamiast opcji deklaratywnych,
jeśli potrzebujesz pełnej kontroli.
| Opcja | Co jest podłączane |
|---|---|
security.dm | Zakresowy resolver bezpieczeństwa DM z pól konfiguracji |
pairing.text | Oparty na tekście przepływ parowania DM z wymianą kodu |
threading | Resolver trybu reply-to (stały, zakresowy dla konta lub niestandardowy) |
outbound.attachedResults | Funkcje wysyłania zwracające metadane wyniku (identyfikatory wiadomości) |
Podłącz punkt wejścia
Utwórz Umieść deskryptory CLI należące do kanału w
index.ts:index.ts
registerCliMetadata(...), aby OpenClaw
mógł je pokazywać w głównej pomocy bez aktywowania pełnego runtime kanału,
podczas gdy normalne pełne ładowania nadal przejmują te same deskryptory do
rzeczywistej rejestracji poleceń. Zachowaj registerFull(...) dla prac
wyłącznie runtime.
Jeśli registerFull(...) rejestruje metody Gateway RPC, użyj
prefiksu specyficznego dla wtyczki. Przestrzenie nazw administratora rdzenia (config.*,
exec.approvals.*, wizard.*, update.*) pozostają zarezerwowane i zawsze
są rozwiązywane do operator.admin.
defineChannelPluginEntry automatycznie obsługuje podział trybów rejestracji. Zobacz
Punkty wejścia, aby poznać wszystkie
opcje.Dodaj punkt wejścia konfiguracji
Utwórz OpenClaw ładuje to zamiast pełnego punktu wejścia, gdy kanał jest wyłączony
lub nieskonfigurowany. Pozwala to uniknąć dociągania ciężkiego kodu runtime
podczas przepływów konfiguracji.
Szczegóły znajdziesz w Konfiguracja i ustawienia.
setup-entry.ts do lekkiego ładowania podczas onboardingu:setup-entry.ts
Obsłuż wiadomości przychodzące
Twoja wtyczka musi odbierać wiadomości z platformy i przekazywać je do
OpenClaw. Typowym wzorcem jest webhook, który weryfikuje żądanie i
wysyła je przez handler przychodzący twojego kanału:
Obsługa wiadomości przychodzących jest specyficzna dla kanału. Każda
wtyczka kanału odpowiada za własny potok przychodzący. Zobacz wbudowane
wtyczki kanałów
(na przykład pakiet wtyczek Microsoft Teams lub Google Chat), aby zobaczyć rzeczywiste wzorce.
Testowanie
Napisz współlokowane testy w Współdzielone helpery testowe opisano w Testowanie.
src/channel.test.ts:src/channel.test.ts
Struktura plików
Tematy zaawansowane
Opcje wątkowania
Stałe, zakresowe dla konta lub niestandardowe tryby odpowiedzi
Integracja z narzędziem message
describeMessageTool i wykrywanie akcji
Rozpoznawanie celu
inferTargetChatType, looksLikeId, resolveTarget
Helpery runtime
TTS, STT, multimedia, subagent przez api.runtime
Niektóre wbudowane powierzchnie helperów nadal istnieją na potrzeby utrzymania
wbudowanych wtyczek i zgodności. Nie są one zalecanym wzorcem dla nowych
wtyczek kanałów; preferuj ogólne podścieżki channel/setup/reply/runtime ze
wspólnej powierzchni SDK, chyba że bezpośrednio utrzymujesz tę rodzinę
wbudowanych wtyczek.
Następne kroki
- Wtyczki dostawców — jeśli twoja wtyczka udostępnia także modele
- Przegląd SDK — pełne odniesienie do importów podścieżek
- Testowanie SDK — narzędzia testowe i testy kontraktowe
- Manifest wtyczki — pełny schemat manifestu