Creazione di plugin di canale
Questa guida illustra come creare un plugin di canale che collega OpenClaw a una piattaforma di messaggistica. Alla fine avrai un canale funzionante con sicurezza DM, pairing, threading delle risposte e messaggistica in uscita.Se non hai mai creato prima un plugin OpenClaw, leggi prima
Per iniziare per la struttura di base del pacchetto
e la configurazione del manifest.
Come funzionano i plugin di canale
I plugin di canale non hanno bisogno di propri strumenti send/edit/react. OpenClaw mantiene un unico strumentomessage condiviso nel core. Il tuo plugin gestisce:
- Configurazione — risoluzione degli account e procedura guidata di configurazione
- Sicurezza — policy DM e allowlist
- Pairing — flusso di approvazione DM
- Grammatica della sessione — come gli id di conversazione specifici del provider si mappano su chat di base, id thread e fallback parent
- Uscita — invio di testo, media e sondaggi alla piattaforma
- Threading — come vengono organizzate le risposte in thread
:thread: e il dispatch.
Se la tua piattaforma memorizza ambiti aggiuntivi all’interno degli id di conversazione, mantieni quel parsing
nel plugin con messaging.resolveSessionConversation(...). Questo è l’hook canonico per mappare
rawId all’id di conversazione di base, all’id thread facoltativo, a baseConversationId esplicito
e a qualsiasi parentConversationCandidates.
Quando restituisci parentConversationCandidates, mantienili ordinati dal parent più ristretto alla conversazione di base/più ampia.
I plugin inclusi che necessitano dello stesso parsing prima dell’avvio del registro dei canali
possono anche esporre un file session-key-api.ts di primo livello con un export
resolveSessionConversation(...) corrispondente. Il core usa questa superficie sicura per il bootstrap
solo quando il registro dei plugin runtime non è ancora disponibile.
messaging.resolveParentConversationCandidates(...) resta disponibile come fallback di compatibilità legacy quando un plugin ha bisogno solo di fallback parent oltre all’id generico/raw. Se entrambi gli hook esistono, il core usa prima
resolveSessionConversation(...).parentConversationCandidates e ricorre a resolveParentConversationCandidates(...) solo quando l’hook canonico li omette.
Approvazioni e capacità del canale
La maggior parte dei plugin di canale non richiede codice specifico per le approvazioni.- Il core gestisce
/approvenella stessa chat, i payload condivisi dei pulsanti di approvazione e la consegna generica di fallback. - Preferisci un unico oggetto
approvalCapabilitynel plugin di canale quando il canale ha bisogno di comportamento specifico per le approvazioni. approvalCapability.authorizeActorActioneapprovalCapability.getActionAvailabilityStatesono il seam canonico per l’autorizzazione delle approvazioni.- Usa
outbound.shouldSuppressLocalPayloadPromptooutbound.beforeDeliverPayloadper comportamenti del ciclo di vita del payload specifici del canale, come nascondere prompt di approvazione locali duplicati o inviare indicatori di digitazione prima della consegna. - Usa
approvalCapability.deliverysolo per instradamento nativo delle approvazioni o soppressione del fallback. - Usa
approvalCapability.rendersolo quando un canale ha realmente bisogno di payload di approvazione personalizzati invece del renderer condiviso. - Se un canale può dedurre identità DM stabili simili al proprietario dalla configurazione esistente, usa
createResolvedApproverActionAuthAdapterdaopenclaw/plugin-sdk/approval-runtimeper limitare/approvenella stessa chat senza aggiungere logica core specifica per le approvazioni. - Se un canale ha bisogno della consegna nativa delle approvazioni, mantieni il codice del canale focalizzato sulla normalizzazione della destinazione e sugli hook di trasporto. Usa
createChannelExecApprovalProfile,createChannelNativeOriginTargetResolver,createChannelApproverDmTargetResolver,createApproverRestrictedNativeApprovalCapabilityecreateChannelNativeApprovalRuntimedaopenclaw/plugin-sdk/approval-runtimein modo che il core gestisca filtraggio delle richieste, instradamento, deduplica, scadenza e sottoscrizione al gateway. - I canali con approvazione nativa devono instradare sia
accountIdsiaapprovalKindattraverso quegli helper.accountIdmantiene l’ambito corretto della policy di approvazione multi-account per l’account bot giusto, eapprovalKindmantiene disponibile al canale il comportamento di approvazione exec rispetto a plugin senza rami hardcoded nel core. - Preserva end-to-end il tipo di id di approvazione consegnato. I client nativi non devono dedurre o riscrivere l’instradamento delle approvazioni exec rispetto a plugin dallo stato locale del canale.
- Tipi diversi di approvazione possono intenzionalmente esporre superfici native diverse.
Esempi attuali inclusi:
- Slack mantiene disponibile l’instradamento di approvazione nativa sia per id exec sia per id plugin.
- Matrix mantiene l’instradamento DM/canale nativo solo per le approvazioni exec e lascia
le approvazioni plugin sul percorso condiviso
/approvenella stessa chat.
createApproverRestrictedNativeApprovalAdapteresiste ancora come wrapper di compatibilità, ma il nuovo codice dovrebbe preferire il builder di capacità ed esporreapprovalCapabilitynel plugin.
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 e
openclaw/plugin-sdk/reply-chunking quando non hai bisogno della superficie ombrello più ampia.
Per la configurazione in particolare:
openclaw/plugin-sdk/setup-runtimecopre gli helper di configurazione sicuri per il runtime: adattatori di patch import-safe (createPatchedAccountSetupAdapter,createEnvPatchedAccountSetupAdapter,createSetupInputPresenceValidator), output delle note di lookup,promptResolvedAllowFrom,splitSetupEntriese i builder di setup-proxy delegatiopenclaw/plugin-sdk/setup-adapter-runtimeè il seam stretto con consapevolezza dell’env percreateEnvPatchedAccountSetupAdapteropenclaw/plugin-sdk/channel-setupcopre i builder di configurazione per installazione facoltativa più alcuni primitivi sicuri per la configurazione:createOptionalChannelSetupSurface,createOptionalChannelSetupAdapter,createOptionalChannelSetupWizard,DEFAULT_ACCOUNT_ID,createTopLevelChannelDmPolicy,setSetupChannelEnabledesplitSetupEntries- usa il seam più ampio
openclaw/plugin-sdk/setupsolo quando ti servono anche gli helper condivisi più pesanti per setup/configurazione comemoveSingleAccountChannelSectionToDefaultAccount(...)
createOptionalChannelSetupSurface(...). L’adattatore/la procedura guidata generati falliscono in modo chiuso sulle scritture di configurazione e sulla finalizzazione e riutilizzano lo stesso messaggio di installazione richiesta tra convalida, finalize e testo del link alla documentazione.
Per altri percorsi hot del canale, preferisci gli helper stretti rispetto alle superfici legacy più ampie:
openclaw/plugin-sdk/account-core,openclaw/plugin-sdk/account-id,openclaw/plugin-sdk/account-resolutioneopenclaw/plugin-sdk/account-helpersper configurazione multi-account e fallback dell’account predefinitoopenclaw/plugin-sdk/inbound-envelopeeopenclaw/plugin-sdk/inbound-reply-dispatchper route/envelope in ingresso e wiring di record-and-dispatchopenclaw/plugin-sdk/messaging-targetsper parsing/matching delle destinazioniopenclaw/plugin-sdk/outbound-mediaeopenclaw/plugin-sdk/outbound-runtimeper caricamento dei media più delegati di identità/invio in uscitaopenclaw/plugin-sdk/thread-bindings-runtimeper il ciclo di vita dei thread binding e la registrazione dell’adattatoreopenclaw/plugin-sdk/agent-media-payloadsolo quando è ancora richiesto un layout legacy dei campi del payload agent/mediaopenclaw/plugin-sdk/telegram-command-configper normalizzazione dei comandi personalizzati di Telegram, convalida di duplicati/conflitti e contratto di configurazione dei comandi stabile rispetto al fallback
Procedura guidata
Pacchetto e manifest
Crea i file standard del plugin. Il campo
channel in package.json è
ciò che rende questo un plugin di canale. Per la superficie completa dei metadati di pacchetto,
vedi Configurazione e setup del plugin:Crea l'oggetto plugin di canale
L’interfaccia
ChannelPlugin ha molte superfici adattatore facoltative. Inizia con
il minimo indispensabile — id e setup — e aggiungi adattatori secondo necessità.Crea src/channel.ts:src/channel.ts
Cosa fa per te createChatChannelPlugin
Cosa fa per te createChatChannelPlugin
Invece di implementare manualmente interfacce adattatore di basso livello, passi
opzioni dichiarative e il builder le compone:
Puoi anche passare oggetti adattatore grezzi invece delle opzioni dichiarative
se hai bisogno del pieno controllo.
| Opzione | Cosa collega |
|---|---|
security.dm | Resolver di sicurezza DM con ambito definito dai campi di configurazione |
pairing.text | Flusso di pairing DM basato su testo con scambio di codice |
threading | Resolver della modalità reply-to (fissa, con ambito account o personalizzata) |
outbound.attachedResults | Funzioni di invio che restituiscono metadati del risultato (id messaggio) |
Collega l'entry point
Crea Inserisci i descrittori CLI di proprietà del canale in
index.ts:index.ts
registerCliMetadata(...) così OpenClaw
può mostrarli nell’help root senza attivare il runtime completo del canale,
mentre i normali caricamenti completi continuano a rilevare gli stessi descrittori per la vera registrazione dei comandi. Mantieni registerFull(...) per il lavoro solo runtime.
Se registerFull(...) registra metodi RPC del gateway, usa un
prefisso specifico del plugin. I namespace admin core (config.*,
exec.approvals.*, wizard.*, update.*) restano riservati e vengono sempre
risolti in operator.admin.
defineChannelPluginEntry gestisce automaticamente la suddivisione per modalità di registrazione. Vedi
Entry point per tutte le
opzioni.Aggiungi un'entry di setup
Crea OpenClaw carica questo invece dell’entry completa quando il canale è disabilitato
o non configurato. Evita di caricare codice runtime pesante durante i flussi di configurazione.
Vedi Setup e configurazione per i dettagli.
setup-entry.ts per un caricamento leggero durante l’onboarding:setup-entry.ts
Gestisci i messaggi in ingresso
Il tuo plugin deve ricevere i messaggi dalla piattaforma e inoltrarli a
OpenClaw. Il modello tipico è un webhook che verifica la richiesta e
la inoltra tramite l’handler inbound del tuo canale:
La gestione dei messaggi in ingresso è specifica del canale. Ogni plugin di canale gestisce
la propria pipeline inbound. Guarda i plugin di canale inclusi
(ad esempio il pacchetto plugin Microsoft Teams o Google Chat) per pattern reali.
Test
Scrivi test colocati in Per gli helper di test condivisi, vedi Testing.
src/channel.test.ts:src/channel.test.ts
Struttura dei file
Argomenti avanzati
Opzioni di threading
Modalità di risposta fisse, con ambito account o personalizzate
Integrazione dello strumento message
describeMessageTool e discovery delle azioni
Risoluzione della destinazione
inferTargetChatType, looksLikeId, resolveTarget
Helper runtime
TTS, STT, media, sottoagente tramite api.runtime
Esistono ancora alcuni seam helper inclusi per la manutenzione dei plugin inclusi e per
compatibilità. Non sono il modello consigliato per i nuovi plugin di canale;
preferisci i sottopercorsi generici channel/setup/reply/runtime dalla superficie SDK
comune, a meno che tu non stia mantenendo direttamente quella famiglia di plugin inclusi.
Passaggi successivi
- Plugin provider — se il tuo plugin fornisce anche modelli
- Panoramica SDK — riferimento completo agli import dei sottopercorsi
- SDK Testing — utilità di test e test di contratto
- Manifest del plugin — schema completo del manifest