Tworzenie pluginów kanałów
Ten przewodnik przeprowadza przez tworzenie pluginu kanału, który łączy OpenClaw z platformą komunikacyjną. Na końcu będziesz mieć działający kanał z zabezpieczeniami DM, parowaniem, wątkowaniem odpowiedzi i wiadomościami wychodzącymi.Jeśli nie utworzono jeszcze żadnego pluginu OpenClaw,
najpierw przeczytaj
Pierwsze kroki, aby poznać podstawową
strukturę pakietu i konfigurację manifestu.
Jak działają pluginy kanałów
Pluginy kanałów nie potrzebują własnych narzędzi send/edit/react. OpenClaw utrzymuje jedno wspólne narzędziemessage w rdzeniu. Twój plugin odpowiada za:
- Konfigurację — rozstrzyganie kont i kreator konfiguracji
- Bezpieczeństwo — politykę DM i listy dozwolonych
- Parowanie — przepływ zatwierdzania DM
- Gramatykę sesji — sposób, w jaki identyfikatory konwersacji specyficzne dla dostawcy mapują się na czaty bazowe, identyfikatory wątków i zapasowe elementy nadrzędne
- Ruch wychodzący — 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 konwersacji, zachowaj to parsowanie
w pluginie za pomocą messaging.resolveSessionConversation(...). To jest
kanoniczny hook do mapowania rawId na bazowy identyfikator konwersacji, opcjonalny identyfikator wątku,
jawny baseConversationId i dowolne parentConversationCandidates.
Gdy zwracasz parentConversationCandidates, zachowaj ich kolejność od
najwęższego elementu nadrzędnego do najszerszej/bazowej konwersacji.
Bundlowane pluginy, które potrzebują tego samego parsowania przed uruchomieniem rejestru kanałów,
mogą też udostępniać plik najwyższego poziomu session-key-api.ts z pasującym
eksportem resolveSessionConversation(...). Rdzeń używa tej bezpiecznej dla bootstrapu powierzchni
tylko wtedy, gdy rejestr pluginów środowiska uruchomieniowego nie jest jeszcze dostępny.
messaging.resolveParentConversationCandidates(...) pozostaje dostępne jako
starszy awaryjny mechanizm zgodności, gdy plugin potrzebuje tylko zapasowych elementów nadrzędnych
na bazie ogólnego/surowego identyfikatora. Jeśli istnieją oba hooki, rdzeń używa najpierw
resolveSessionConversation(...).parentConversationCandidates, a do
resolveParentConversationCandidates(...) wraca tylko wtedy, gdy hook kanoniczny
ich nie zwraca.
Zatwierdzenia i możliwości kanału
Większość pluginów kanałów nie potrzebuje kodu specyficznego dla zatwierdzeń.- Rdzeń odpowiada za
/approvew tym samym czacie, wspólne ładunki przycisków zatwierdzania oraz ogólne dostarczanie awaryjne. - Gdy kanał potrzebuje zachowania specyficznego dla zatwierdzeń, preferuj pojedynczy obiekt
approvalCapabilityw pluginie kanału. ChannelPlugin.approvalszostało usunięte. Fakty dotyczące dostarczania/renderowania/natywności/uwierzytelniania zatwierdzeń umieszczaj wapprovalCapability.plugin.authsłuży tylko do login/logout; rdzeń nie odczytuje już hooków uwierzytelniania zatwierdzeń z tego obiektu.approvalCapability.authorizeActorActionorazapprovalCapability.getActionAvailabilityStateto kanoniczna powierzchnia dla uwierzytelniania zatwierdzeń.- Użyj
approvalCapability.getActionAvailabilityStatedla dostępności uwierzytelniania zatwierdzeń w tym samym czacie. - Jeśli kanał udostępnia natywne zatwierdzanie exec, użyj
approvalCapability.getExecInitiatingSurfaceStatedla stanu powierzchni inicjującej/klienta natywnego, gdy różni się od uwierzytelniania zatwierdzeń w tym samym czacie. Rdzeń używa tego hooka specyficznego dla exec, aby odróżnićenabledoddisabled, zdecydować, czy kanał inicjujący obsługuje natywne zatwierdzenia exec, i uwzględnić kanał w instrukcjach awaryjnych dla klienta natywnego.createApproverRestrictedNativeApprovalCapability(...)wypełnia to dla typowego przypadku. - Użyj
outbound.shouldSuppressLocalPayloadPromptluboutbound.beforeDeliverPayloaddla zachowań cyklu życia ładunku specyficznych dla kanału, takich jak ukrywanie zduplikowanych lokalnych monitów zatwierdzania lub wysyłanie wskaźników pisania przed dostarczeniem. - Używaj
approvalCapability.deliverytylko do natywnego routingu zatwierdzeń lub tłumienia dostarczania awaryjnego. - Używaj
approvalCapability.nativeRuntimedla natywnych faktów zatwierdzania należących do kanału. Utrzymuj je w trybie lazy na gorących entrypointach kanału za pomocącreateLazyChannelApprovalNativeRuntimeAdapter(...), które może importować moduł środowiska uruchomieniowego na żądanie, jednocześnie pozwalając rdzeniowi złożyć cykl życia zatwierdzania. - Używaj
approvalCapability.rendertylko wtedy, gdy kanał rzeczywiście potrzebuje własnych ładunków zatwierdzania zamiast wspólnego renderera. - Użyj
approvalCapability.describeExecApprovalSetup, gdy kanał chce, aby odpowiedź dla ścieżki wyłączonej wyjaśniała dokładnie, jakie przełączniki konfiguracji są potrzebne do włączenia natywnych zatwierdzeń exec. Hook otrzymuje{ channel, channelLabel, accountId }; kanały z nazwanymi kontami powinny renderować ścieżki ograniczone do konta, takie jakchannels.<channel>.accounts.<id>.execApprovals.*, zamiast domyślnych ścieżek najwyższego poziomu. - Jeśli kanał potrafi wywnioskować stabilne tożsamości DM podobne do właściciela z istniejącej konfiguracji, użyj
createResolvedApproverActionAuthAdapterzopenclaw/plugin-sdk/approval-runtime, aby ograniczyć/approvew tym samym czacie bez dodawania logiki specyficznej dla zatwierdzeń do rdzenia. - Jeśli kanał potrzebuje natywnego dostarczania zatwierdzeń, utrzymuj kod kanału skupiony na normalizacji celu oraz faktach dotyczących transportu/prezentacji. Użyj
createChannelExecApprovalProfile,createChannelNativeOriginTargetResolver,createChannelApproverDmTargetResolvericreateApproverRestrictedNativeApprovalCapabilityzopenclaw/plugin-sdk/approval-runtime. Fakty specyficzne dla kanału umieść zaapprovalCapability.nativeRuntime, najlepiej przezcreateChannelApprovalNativeRuntimeAdapter(...)lubcreateLazyChannelApprovalNativeRuntimeAdapter(...), aby rdzeń mógł złożyć obsługę i przejąć filtrowanie żądań, routing, deduplikację, wygasanie, subskrypcję bramy oraz komunikaty „przekierowano gdzie indziej”.nativeRuntimejest podzielone na kilka mniejszych powierzchni: availability— czy konto jest skonfigurowane i czy żądanie powinno zostać obsłużonepresentation— mapowanie wspólnego modelu widoku zatwierdzenia na oczekujące/rozstrzygnięte/wygasłe ładunki natywne lub działania końcowetransport— przygotowanie celów oraz wysyłanie/aktualizowanie/usuwanie natywnych wiadomości zatwierdzaniainteractions— opcjonalne hooki bind/unbind/clear-action dla natywnych przycisków lub reakcjiobserve— opcjonalne hooki diagnostyki dostarczania- Jeśli kanał potrzebuje obiektów należących do środowiska uruchomieniowego, takich jak klient, token, aplikacja Bolt lub odbiornik webhooka, zarejestruj je przez
openclaw/plugin-sdk/channel-runtime-context. Ogólny rejestr runtime-context pozwala rdzeniowi uruchamiać handlery oparte na możliwościach na podstawie stanu startowego kanału bez dodawania kodu klejącego specyficznego dla zatwierdzeń. - Sięgaj po niższopoziomowe
createChannelApprovalHandlerlubcreateChannelNativeApprovalRuntimetylko wtedy, gdy powierzchnia oparta na możliwościach nie jest jeszcze wystarczająco ekspresyjna. - Kanały z natywnymi zatwierdzeniami muszą przekazywać przez te helpery zarówno
accountId, jak iapprovalKind.accountIdutrzymuje politykę zatwierdzeń dla wielu kont w zakresie właściwego konta bota, aapprovalKindutrzymuje zachowanie zatwierdzeń exec vs plugin dostępne dla kanału bez zakodowanych na sztywno gałęzi w rdzeniu. - Rdzeń odpowiada teraz także za komunikaty o przekierowaniu zatwierdzeń. Pluginy kanałów nie powinny wysyłać własnych wiadomości uzupełniających typu „zatwierdzenie trafiło do DM / innego kanału” z
createChannelNativeApprovalRuntime; zamiast tego udostępnij poprawny routing pochodzenia + DM zatwierdzającego przez wspólne helpery możliwości zatwierdzania i pozwól rdzeniowi agregować rzeczywiste dostarczenia przed opublikowaniem ewentualnego komunikatu z powrotem do czatu inicjującego. - Zachowuj rodzaj dostarczonego identyfikatora zatwierdzenia od początku do końca. Klienci natywni nie powinni zgadywać ani przepisywać routingu zatwierdzeń exec vs plugin na podstawie lokalnego stanu kanału.
- Różne rodzaje zatwierdzeń mogą celowo udostępniać różne powierzchnie natywne.
Bieżące przykłady bundlowane:
- Slack zachowuje dostępny natywny routing zatwierdzeń zarówno dla identyfikatorów exec, jak i plugin.
- Matrix utrzymuje ten sam natywny routing DM/kanał i UX reakcji dla zatwierdzeń exec i plugin, jednocześnie pozwalając, by uwierzytelnianie różniło się zależnie od rodzaju zatwierdzenia.
createApproverRestrictedNativeApprovalAdapternadal istnieje jako opakowanie zgodności, ale nowy kod powinien preferować konstruktor możliwości i udostępniaćapprovalCapabilityw pluginie.
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 oraz
openclaw/plugin-sdk/reply-chunking, gdy nie potrzebujesz szerszej
powierzchni parasolowej.
Konkretnie dla konfiguracji:
openclaw/plugin-sdk/setup-runtimeobejmuje bezpieczne dla środowiska uruchomieniowego helpery konfiguracji: bezpieczne przy imporcie adaptery łatania konfiguracji (createPatchedAccountSetupAdapter,createEnvPatchedAccountSetupAdapter,createSetupInputPresenceValidator), dane wyjściowe notatek lookup,promptResolvedAllowFrom,splitSetupEntriesoraz delegowane konstruktory proxy konfiguracjiopenclaw/plugin-sdk/setup-adapter-runtimeto wąska, świadoma środowiska surface adaptera dlacreateEnvPatchedAccountSetupAdapteropenclaw/plugin-sdk/channel-setupobejmuje konstruktory konfiguracji z opcjonalną instalacją oraz kilka prymitywów bezpiecznych dla konfiguracji:createOptionalChannelSetupSurface,createOptionalChannelSetupAdapter,
channelEnvVars. Zachowaj runtime envVars kanału lub lokalne
stałe wyłącznie dla tekstów operatora.
createOptionalChannelSetupWizard, DEFAULT_ACCOUNT_ID,
createTopLevelChannelDmPolicy, setSetupChannelEnabled oraz
splitSetupEntries
- używaj szerszej powierzchni
openclaw/plugin-sdk/setuptylko wtedy, gdy potrzebujesz także cięższych wspólnych helperów konfiguracji/ustawień, takich jakmoveSingleAccountChannelSectionToDefaultAccount(...)
createOptionalChannelSetupSurface(...). Wygenerowany
adapter/kreator domyślnie blokuje zapis konfiguracji i finalizację, a także ponownie używa
tego samego komunikatu o wymaganej instalacji w walidacji, finalizacji i tekstach 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-resolutionorazopenclaw/plugin-sdk/account-helpersdla konfiguracji wielu kont i awaryjnego powrotu do konta domyślnegoopenclaw/plugin-sdk/inbound-envelopeorazopenclaw/plugin-sdk/inbound-reply-dispatchdla routingu/koperty wejściowej i łączenia zapisu z wysyłkąopenclaw/plugin-sdk/messaging-targetsdo parsowania/dopasowywania celówopenclaw/plugin-sdk/outbound-mediaorazopenclaw/plugin-sdk/outbound-runtimedo ładowania multimediów oraz delegatów tożsamości/wysyłania wychodzącegoopenclaw/plugin-sdk/thread-bindings-runtimedla cyklu życia powiązań wątków i rejestracji adapterówopenclaw/plugin-sdk/agent-media-payloadtylko wtedy, gdy nadal wymagany jest starszy układ pól ładunku agenta/multimediówopenclaw/plugin-sdk/telegram-command-configdo normalizacji niestandardowych poleceń Telegram, walidacji duplikatów/konfliktów oraz stabilnego awaryjnie kontraktu konfiguracji poleceń
Polityka wzmianek przychodzących
Obsługę wzmianek przychodzących utrzymuj rozdzieloną na dwie warstwy:- gromadzenie danych należące do pluginu
- współdzieloną ocenę polityki
openclaw/plugin-sdk/channel-inbound.
Dobre zastosowania dla logiki lokalnej pluginu:
- wykrywanie odpowiedzi do bota
- wykrywanie cytatu bota
- sprawdzanie uczestnictwa w wątku
- wykluczenia wiadomości usługowych/systemowych
- natywne dla platformy pamięci podręczne potrzebne do potwierdzenia uczestnictwa bota
requireMention- jawny wynik wzmianki
- lista dozwolonych wzmianek niejawnych
- obejście dla poleceń
- końcowa decyzja o pominięciu
- Oblicz lokalne fakty dotyczące wzmianki.
- Przekaż te fakty do
resolveInboundMentionDecision({ facts, policy }). - Użyj
decision.effectiveWasMentioned,decision.shouldBypassMentionidecision.shouldSkipw bramce wejściowej.
api.runtime.channel.mentions udostępnia te same wspólne helpery wzmiankowania dla
bundlowanych pluginów kanałów, które już zależą od wstrzykiwania środowiska uruchomieniowego:
buildMentionRegexesmatchesMentionPatternsmatchesMentionWithExplicitimplicitMentionKindWhenresolveInboundMentionDecision
resolveMentionGating* pozostają w
openclaw/plugin-sdk/channel-inbound wyłącznie jako eksporty zgodności. Nowy kod
powinien używać resolveInboundMentionDecision({ facts, policy }).
Instrukcja krok po kroku
Pakiet i manifest
Utwórz standardowe pliki pluginu. Pole
channel w package.json sprawia,
że jest to plugin kanału. Aby zobaczyć pełną powierzchnię metadanych pakietu,
zobacz Konfiguracja pluginu i ustawienia:Zbuduj obiekt pluginu kanału
Interfejs
ChannelPlugin ma wiele opcjonalnych powierzchni adapterów. Zacznij od
minimum — id i setup — a następnie dodawaj adaptery według potrzeb.Utwórz src/channel.ts:src/channel.ts
Co robi za Ciebie createChatChannelPlugin
Co robi za Ciebie createChatChannelPlugin
Zamiast ręcznie implementować niskopoziomowe interfejsy adapterów, przekazujesz
opcje deklaratywne, a konstruktor je składa:
Możesz także przekazać surowe obiekty adapterów zamiast opcji deklaratywnych,
jeśli potrzebujesz pełnej kontroli.
| Opcja | Co jest podłączane |
|---|---|
security.dm | Resolver bezpieczeństwa DM ograniczony do konfiguracji pól |
pairing.text | Tekstowy przepływ parowania DM z wymianą kodu |
threading | Resolver trybu reply-to (stały, ograniczony do konta lub niestandardowy) |
outbound.attachedResults | Funkcje wysyłania, które zwracają metadane wyniku (identyfikatory wiadomości) |
Podłącz entrypoint
Utwórz Umieść deskryptory CLI należące do kanału w
index.ts:index.ts
registerCliMetadata(...), aby OpenClaw
mógł pokazywać je w pomocy głównej bez aktywowania pełnego środowiska uruchomieniowego kanału,
podczas gdy zwykłe pełne ładowanie nadal pobiera te same deskryptory do rzeczywistej
rejestracji poleceń. Zachowaj registerFull(...) dla prac tylko środowiska uruchomieniowego.
Jeśli registerFull(...) rejestruje metody RPC bramy, użyj
prefiksu specyficznego dla pluginu. Przestrzenie nazw administracyjnych rdzenia (config.*,
exec.approvals.*, wizard.*, update.*) pozostają zarezerwowane i zawsze
są rozstrzygane do operator.admin.
defineChannelPluginEntry automatycznie obsługuje podział trybu rejestracji. Zobacz
Entry Points, aby poznać wszystkie
opcje.Dodaj entry konfiguracji
Utwórz OpenClaw ładuje to zamiast pełnego entry, gdy kanał jest wyłączony
lub nieskonfigurowany. Pozwala to uniknąć pobierania ciężkiego kodu środowiska uruchomieniowego 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
Twój plugin musi odbierać wiadomości z platformy i przekazywać je do
OpenClaw. Typowy wzorzec to webhook, który weryfikuje żądanie i
wysyła je przez handler wejściowy twojego kanału:
Obsługa wiadomości przychodzących jest specyficzna dla kanału. Każdy plugin kanału odpowiada
za własny potok wejściowy. Zobacz bundlowane pluginy kanałów
(na przykład pakiet pluginu Microsoft Teams lub Google Chat), aby poznać rzeczywiste wzorce.
Testy
Napisz testy współlokowane w Informacje o współdzielonych helperach testowych znajdziesz w Testowanie.
src/channel.test.ts:src/channel.test.ts
Struktura plików
Tematy zaawansowane
Opcje wątkowania
Stałe, ograniczone do konta lub niestandardowe tryby odpowiedzi
Integracja z narzędziem wiadomości
describeMessageTool i wykrywanie działań
Rozstrzyganie celu
inferTargetChatType, looksLikeId, resolveTarget
Helpery środowiska uruchomieniowego
TTS, STT, multimedia, podagent przez api.runtime
Niektóre bundlowane powierzchnie helperów nadal istnieją na potrzeby utrzymania bundlowanych pluginów i
zgodności. Nie są one zalecanym wzorcem dla nowych pluginów kanałów;
preferuj ogólne podścieżki channel/setup/reply/runtime ze wspólnej
powierzchni SDK, chyba że bezpośrednio utrzymujesz tę rodzinę bundlowanych pluginów.
Kolejne kroki
- Pluginy dostawców — jeśli twój plugin udostępnia także modele
- Przegląd SDK — pełna dokumentacja importów podścieżek
- Testowanie SDK — narzędzia testowe i testy kontraktowe
- Manifest pluginu — pełny schemat manifestu