Créer des plugins de canal
Ce guide vous accompagne dans la création d’un plugin de canal qui connecte OpenClaw à une plateforme de messagerie. À la fin, vous disposerez d’un canal fonctionnel avec sécurité DM, pairing, fils de réponse et messagerie sortante.Si vous n’avez encore jamais créé de plugin OpenClaw, lisez d’abord
Getting Started pour la structure de paquet
de base et la configuration du manifeste.
Comment fonctionnent les plugins de canal
Les plugins de canal n’ont pas besoin de leurs propres outils send/edit/react. OpenClaw conserve un outilmessage partagé unique dans le cœur. Votre plugin gère :
- Config — résolution de compte et assistant de configuration
- Sécurité — politique DM et listes d’autorisation
- Pairing — flux d’approbation DM
- Grammaire de session — manière dont les identifiants de conversation spécifiques au provider sont mappés vers les chats de base, les identifiants de fil et les replis parents
- Sortant — envoi de texte, de médias et de sondages vers la plateforme
- Fils — manière dont les réponses sont regroupées en fil
:thread:, et la répartition.
Si votre plateforme stocke une portée supplémentaire à l’intérieur des identifiants de conversation, conservez cette analyse
dans le plugin avec messaging.resolveSessionConversation(...). Il s’agit du
hook canonique pour mapper rawId vers l’identifiant de conversation de base, un identifiant de fil
facultatif, un baseConversationId explicite, et d’éventuels parentConversationCandidates.
Lorsque vous renvoyez parentConversationCandidates, gardez-les ordonnés du
parent le plus étroit au plus large / à la conversation de base.
Les plugins intégrés qui ont besoin de la même analyse avant le démarrage
du registre de canaux peuvent également exposer un fichier session-key-api.ts de niveau supérieur avec un export
resolveSessionConversation(...) correspondant. Le cœur utilise cette surface sûre pour le bootstrap
uniquement lorsque le registre de plugins à l’exécution n’est pas encore disponible.
messaging.resolveParentConversationCandidates(...) reste disponible comme solution de repli
historique de compatibilité lorsqu’un plugin n’a besoin que de replis parents en plus
de l’identifiant générique/brut. Si les deux hooks existent, le cœur utilise
d’abord resolveSessionConversation(...).parentConversationCandidates et ne
revient à resolveParentConversationCandidates(...) que lorsque le hook canonique
les omet.
Approbations et capacités de canal
La plupart des plugins de canal n’ont pas besoin de code spécifique aux approbations.- Le cœur gère
/approvedans le même chat, les charges utiles de boutons d’approbation partagées, et la livraison de repli générique. - Préférez un unique objet
approvalCapabilitysur le plugin de canal lorsque le canal a besoin d’un comportement spécifique aux approbations. approvalCapability.authorizeActorActionetapprovalCapability.getActionAvailabilityStateconstituent le point d’entrée canonique pour l’authentification des approbations.- Utilisez
outbound.shouldSuppressLocalPayloadPromptououtbound.beforeDeliverPayloadpour le comportement spécifique au canal du cycle de vie des charges utiles, comme masquer les invites locales d’approbation en double ou envoyer des indicateurs de saisie avant la livraison. - Utilisez
approvalCapability.deliveryuniquement pour le routage natif des approbations ou la suppression du repli. - Utilisez
approvalCapability.renderuniquement lorsqu’un canal a réellement besoin de charges utiles d’approbation personnalisées au lieu du moteur de rendu partagé. - Si un canal peut déduire des identités DM stables de type propriétaire à partir de la configuration existante, utilisez
createResolvedApproverActionAuthAdapterdepuisopenclaw/plugin-sdk/approval-runtimepour restreindre/approvedans le même chat sans ajouter de logique centrale spécifique aux approbations. - Si un canal a besoin d’une livraison d’approbation native, gardez le code du canal centré sur la normalisation des cibles et les hooks de transport. Utilisez
createChannelExecApprovalProfile,createChannelNativeOriginTargetResolver,createChannelApproverDmTargetResolver,createApproverRestrictedNativeApprovalCapability, etcreateChannelNativeApprovalRuntimedepuisopenclaw/plugin-sdk/approval-runtimeafin que le cœur gère le filtrage des requêtes, le routage, la déduplication, l’expiration et l’abonnement gateway. - Les canaux d’approbation native doivent faire transiter
accountIdetapprovalKindvia ces assistants.accountIdpermet de limiter la politique d’approbation multi-compte au bon compte bot, etapprovalKindpermet au canal de disposer du comportement d’approbation exec vs plugin sans branches codées en dur dans le cœur. - Préservez de bout en bout le type d’identifiant d’approbation livré. Les clients natifs ne doivent pas deviner ni réécrire le routage d’approbation exec vs plugin à partir d’un état local au canal.
- Différents types d’approbation peuvent intentionnellement exposer différentes surfaces natives.
Exemples intégrés actuels :
- Slack conserve le routage d’approbation natif disponible pour les identifiants exec et plugin.
- Matrix conserve le routage DM/canal natif uniquement pour les approbations exec et laisse
les approbations plugin sur le chemin
/approvepartagé dans le même chat.
createApproverRestrictedNativeApprovalAdapterexiste encore comme wrapper de compatibilité, mais le nouveau code devrait préférer le constructeur de capacité et exposerapprovalCapabilitysur le 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, et
openclaw/plugin-sdk/reply-chunking lorsque vous n’avez pas besoin de la surface
plus large.
Pour la configuration en particulier :
openclaw/plugin-sdk/setup-runtimecouvre les assistants de configuration sûrs à l’exécution : adaptateurs de patch de configuration sûrs à l’import (createPatchedAccountSetupAdapter,createEnvPatchedAccountSetupAdapter,createSetupInputPresenceValidator), sortie de note de recherche,promptResolvedAllowFrom,splitSetupEntries, et les constructeurs de proxy de configuration déléguéeopenclaw/plugin-sdk/setup-adapter-runtimeest la jonction étroite orientée environnement pourcreateEnvPatchedAccountSetupAdapteropenclaw/plugin-sdk/channel-setupcouvre les constructeurs de configuration à installation facultative ainsi que quelques primitives sûres pour la configuration :createOptionalChannelSetupSurface,createOptionalChannelSetupAdapter,createOptionalChannelSetupWizard,DEFAULT_ACCOUNT_ID,createTopLevelChannelDmPolicy,setSetupChannelEnabled, etsplitSetupEntries- utilisez la surface plus large
openclaw/plugin-sdk/setupuniquement lorsque vous avez aussi besoin des assistants partagés plus lourds de configuration/setup commemoveSingleAccountChannelSectionToDefaultAccount(...)
createOptionalChannelSetupSurface(...). L’adaptateur/l’assistant généré échoue en mode fermé sur les écritures de configuration et la finalisation, et ils réutilisent le même message d’installation requise dans la validation, la finalisation et le texte du lien vers la documentation.
Pour les autres chemins de canal à chaud, préférez les assistants étroits aux anciennes surfaces plus larges :
openclaw/plugin-sdk/account-core,openclaw/plugin-sdk/account-id,openclaw/plugin-sdk/account-resolution, etopenclaw/plugin-sdk/account-helperspour la configuration multi-compte et le repli du compte par défautopenclaw/plugin-sdk/inbound-envelopeetopenclaw/plugin-sdk/inbound-reply-dispatchpour le câblage du routage/de l’enveloppe entrants et de l’enregistrement/répartitionopenclaw/plugin-sdk/messaging-targetspour l’analyse/la correspondance des ciblesopenclaw/plugin-sdk/outbound-mediaetopenclaw/plugin-sdk/outbound-runtimepour le chargement des médias ainsi que les délégués d’identité/envoi sortantsopenclaw/plugin-sdk/thread-bindings-runtimepour le cycle de vie des liaisons de fil et l’enregistrement d’adaptateuropenclaw/plugin-sdk/agent-media-payloaduniquement lorsqu’une ancienne disposition de champ de charge utile agent/média est encore nécessaireopenclaw/plugin-sdk/telegram-command-configpour la normalisation des commandes personnalisées Telegram, la validation des doublons/conflits, et un contrat de configuration de commande stable en cas de repli
Procédure pas à pas
Paquet et manifeste
Créez les fichiers standards du plugin. Le champ
channel dans package.json est
ce qui fait de ce plugin un plugin de canal. Pour la surface complète des métadonnées de paquet,
voir Plugin Setup and Config :Créer l’objet plugin de canal
L’interface
ChannelPlugin comporte de nombreuses surfaces d’adaptateur facultatives. Commencez par
le minimum — id et setup — puis ajoutez des adaptateurs selon vos besoins.Créez src/channel.ts :src/channel.ts
Ce que createChatChannelPlugin fait pour vous
Ce que createChatChannelPlugin fait pour vous
Au lieu d’implémenter manuellement des interfaces d’adaptateur de bas niveau, vous passez
des options déclaratives et le constructeur les compose :
Vous pouvez aussi transmettre des objets d’adaptateur bruts au lieu des options déclaratives
si vous avez besoin d’un contrôle total.
| Option | Ce qu’elle câble |
|---|---|
security.dm | Résolveur de sécurité DM à portée limitée à partir des champs de configuration |
pairing.text | Flux de pairing DM basé sur du texte avec échange de code |
threading | Résolveur de mode reply-to (fixe, à portée compte ou personnalisé) |
outbound.attachedResults | Fonctions d’envoi qui renvoient des métadonnées de résultat (ID de message) |
Câbler le point d’entrée
Créez Placez les descripteurs CLI propres au canal dans
index.ts :index.ts
registerCliMetadata(...) afin qu’OpenClaw
puisse les afficher dans l’aide racine sans activer le runtime complet du canal,
tandis que les chargements complets normaux récupèrent toujours les mêmes descripteurs pour l’enregistrement réel des commandes.
Gardez registerFull(...) pour le travail réservé à l’exécution.
Si registerFull(...) enregistre des méthodes RPC gateway, utilisez un
préfixe spécifique au plugin. Les espaces de noms d’administration du cœur (config.*,
exec.approvals.*, wizard.*, update.*) restent réservés et se
résolvent toujours vers operator.admin.
defineChannelPluginEntry gère automatiquement la séparation des modes d’enregistrement. Voir
Entry Points pour toutes
les options.Ajouter une entrée de configuration
Créez OpenClaw charge cela au lieu du point d’entrée complet lorsque le canal est désactivé
ou non configuré. Cela évite de charger un code d’exécution lourd pendant les flux de configuration.
Voir Setup and Config pour les détails.
setup-entry.ts pour un chargement léger pendant l’onboarding :setup-entry.ts
Gérer les messages entrants
Votre plugin doit recevoir les messages de la plateforme et les transmettre à
OpenClaw. Le modèle habituel est un webhook qui vérifie la requête puis
la répartit via le gestionnaire entrant de votre canal :
La gestion des messages entrants est spécifique au canal. Chaque plugin de canal gère
son propre pipeline entrant. Consultez les plugins de canal intégrés
(par exemple le paquet plugin Microsoft Teams ou Google Chat) pour voir de vrais modèles.
Tester
Écrivez des tests colocalisés dans Pour les assistants de test partagés, voir Testing.
src/channel.test.ts :src/channel.test.ts
Structure des fichiers
Sujets avancés
Options de fil
Modes de réponse fixes, à portée compte ou personnalisés
Intégration de l’outil message
describeMessageTool et découverte d’actions
Résolution de cible
inferTargetChatType, looksLikeId, resolveTarget
Assistants d’exécution
TTS, STT, médias, subagent via api.runtime
Certaines jonctions d’assistants intégrés existent encore pour la maintenance et
la compatibilité des plugins intégrés. Ce n’est pas le modèle recommandé pour les nouveaux plugins de canal ;
préférez les sous-chemins génériques channel/setup/reply/runtime de la surface SDK commune
sauf si vous maintenez directement cette famille de plugins intégrés.
Étapes suivantes
- Provider Plugins — si votre plugin fournit aussi des modèles
- SDK Overview — référence complète des imports par sous-chemin
- SDK Testing — utilitaires de test et tests de contrat
- Plugin Manifest — schéma complet du manifeste