Creación de plugins de canal
Esta guía explica cómo crear un plugin de canal que conecte OpenClaw a una plataforma de mensajería. Al final tendrás un canal funcional con seguridad en DM, emparejamiento, encadenamiento de respuestas y mensajería saliente.Si aún no has creado ningún plugin de OpenClaw, lee primero
Getting Started para conocer la estructura básica
del paquete y la configuración del manifiesto.
Cómo funcionan los plugins de canal
Los plugins de canal no necesitan sus propias herramientas send/edit/react. OpenClaw mantiene una única herramientamessage compartida en el núcleo. Tu plugin es propietario de:
- Configuración — resolución de cuentas y asistente de configuración
- Seguridad — política de DM y listas de permitidos
- Emparejamiento — flujo de aprobación de DM
- Gramática de sesión — cómo los IDs de conversación específicos del proveedor se asignan a chats base, IDs de hilo y fallbacks del padre
- Salida — envío de texto, medios y encuestas a la plataforma
- Encadenamiento — cómo se encadenan las respuestas
message compartida, del cableado del prompt, de la forma externa de la clave de sesión,
de la gestión genérica de :thread: y del dispatch.
Si tu plataforma almacena alcance adicional dentro de los IDs de conversación, mantén ese análisis
en el plugin con messaging.resolveSessionConversation(...). Ese es el hook canónico
para mapear rawId al id base de conversación, un id de hilo opcional, baseConversationId
explícito y cualquier parentConversationCandidates.
Cuando devuelvas parentConversationCandidates, mantenlos ordenados desde el
padre más específico hasta la conversación base/más amplia.
Los plugins integrados que necesitan el mismo análisis antes de que se inicie el registro de canales
también pueden exponer un archivo session-key-api.ts de nivel superior con un export
resolveSessionConversation(...) equivalente. El núcleo usa esa superficie segura para bootstrap
solo cuando el registro de plugins del runtime aún no está disponible.
messaging.resolveParentConversationCandidates(...) sigue disponible como fallback heredado de compatibilidad cuando un plugin solo necesita fallbacks del padre sobre el id genérico/raw. Si existen ambos hooks, el núcleo usa primero
resolveSessionConversation(...).parentConversationCandidates y solo
recurre a resolveParentConversationCandidates(...) cuando el hook canónico
los omite.
Aprobaciones y capacidades del canal
La mayoría de los plugins de canal no necesitan código específico de aprobaciones.- El núcleo es propietario de
/approveen el mismo chat, de las cargas de botones de aprobación compartidas y de la entrega genérica de fallback. - Prefiere un único objeto
approvalCapabilityen el plugin de canal cuando el canal necesita comportamiento específico de aprobación. approvalCapability.authorizeActorActionyapprovalCapability.getActionAvailabilityStateson la unión canónica para autenticación de aprobación.- Usa
outbound.shouldSuppressLocalPayloadPromptooutbound.beforeDeliverPayloadpara comportamiento específico del canal en el ciclo de vida de la carga, como ocultar solicitudes de aprobación locales duplicadas o enviar indicadores de escritura antes de la entrega. - Usa
approvalCapability.deliverysolo para enrutamiento nativo de aprobación o supresión de fallback. - Usa
approvalCapability.rendersolo cuando un canal realmente necesita cargas de aprobación personalizadas en lugar del renderizador compartido. - Si un canal puede inferir identidades DM estables de tipo propietario a partir de la configuración existente, usa
createResolvedApproverActionAuthAdapterdeopenclaw/plugin-sdk/approval-runtimepara restringir/approveen el mismo chat sin añadir lógica específica de aprobación al núcleo. - Si un canal necesita entrega nativa de aprobación, mantén el código del canal centrado en la normalización de destinos y hooks de transporte. Usa
createChannelExecApprovalProfile,createChannelNativeOriginTargetResolver,createChannelApproverDmTargetResolver,createApproverRestrictedNativeApprovalCapabilityycreateChannelNativeApprovalRuntimedeopenclaw/plugin-sdk/approval-runtimepara que el núcleo gestione el filtrado de solicitudes, el enrutamiento, la eliminación de duplicados, la caducidad y la suscripción a la gateway. - Los canales de aprobación nativa deben enrutar tanto
accountIdcomoapprovalKinda través de esos helpers.accountIdmantiene la política de aprobación de varias cuentas delimitada a la cuenta correcta del bot, yapprovalKindmantiene disponible para el canal el comportamiento de aprobación exec frente a plugin sin ramas codificadas en el núcleo. - Conserva el tipo de id de aprobación entregado de extremo a extremo. Los clientes nativos no deben adivinar ni reescribir el enrutamiento de aprobación exec frente a plugin a partir del estado local del canal.
- Distintos tipos de aprobación pueden exponer intencionadamente superficies nativas diferentes.
Ejemplos integrados actuales:
- Slack mantiene disponible el enrutamiento nativo de aprobaciones tanto para IDs exec como plugin.
- Matrix mantiene el enrutamiento nativo DM/canal solo para aprobaciones exec y deja
las aprobaciones de plugin en la ruta compartida
/approvedel mismo chat.
createApproverRestrictedNativeApprovalAdaptersigue existiendo como wrapper de compatibilidad, pero el código nuevo debería preferir el constructor de capacidades y exponerapprovalCapabilityen el 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 y
openclaw/plugin-sdk/reply-chunking cuando no necesites la superficie paraguas más amplia.
En concreto para setup:
openclaw/plugin-sdk/setup-runtimecubre los helpers de setup seguros para runtime: adaptadores de parcheo de setup seguros para importación (createPatchedAccountSetupAdapter,createEnvPatchedAccountSetupAdapter,createSetupInputPresenceValidator), salida de notas de lookup,promptResolvedAllowFrom,splitSetupEntriesy los constructores de setup-proxy delegadoopenclaw/plugin-sdk/setup-adapter-runtimees la unión estrecha con reconocimiento de entorno paracreateEnvPatchedAccountSetupAdapteropenclaw/plugin-sdk/channel-setupcubre los constructores de setup con instalación opcional más algunas primitivas seguras para setup:createOptionalChannelSetupSurface,createOptionalChannelSetupAdapter,createOptionalChannelSetupWizard,DEFAULT_ACCOUNT_ID,createTopLevelChannelDmPolicy,setSetupChannelEnabledysplitSetupEntries- usa la unión más amplia
openclaw/plugin-sdk/setupsolo cuando también necesites los helpers compartidos más pesados de setup/config comomoveSingleAccountChannelSectionToDefaultAccount(...)
createOptionalChannelSetupSurface(...). El
adaptador/asistente generado falla de forma cerrada en escrituras de configuración y finalización, y reutiliza el mismo mensaje de instalación requerida en la validación, finalización y texto con enlace a la documentación.
Para otras rutas activas del canal, prefiere los helpers estrechos en lugar de superficies heredadas más amplias:
openclaw/plugin-sdk/account-core,openclaw/plugin-sdk/account-id,openclaw/plugin-sdk/account-resolutionyopenclaw/plugin-sdk/account-helperspara configuración de varias cuentas y fallback de cuenta predeterminadaopenclaw/plugin-sdk/inbound-envelopeyopenclaw/plugin-sdk/inbound-reply-dispatchpara cableado de ruta/sobre entrante y record-and-dispatchopenclaw/plugin-sdk/messaging-targetspara análisis/coincidencia de destinosopenclaw/plugin-sdk/outbound-mediayopenclaw/plugin-sdk/outbound-runtimepara carga de medios más delegados de identidad/envío salienteopenclaw/plugin-sdk/thread-bindings-runtimepara el ciclo de vida de thread-binding y registro del adaptadoropenclaw/plugin-sdk/agent-media-payloadsolo cuando todavía se requiera un diseño heredado de campos de carga de agente/mediosopenclaw/plugin-sdk/telegram-command-configpara normalización de comandos personalizados de Telegram, validación de duplicados/conflictos y un contrato de configuración de comandos estable ante fallback
Recorrido guiado
Paquete y manifiesto
Crea los archivos estándar del plugin. El campo
channel en package.json es
lo que convierte esto en un plugin de canal. Para ver la superficie completa de metadatos del paquete,
consulta Plugin Setup and Config:Construir el objeto del plugin de canal
La interfaz
ChannelPlugin tiene muchas superficies de adaptador opcionales. Empieza con
lo mínimo — id y setup — y añade adaptadores según los necesites.Crea src/channel.ts:src/channel.ts
Qué hace createChatChannelPlugin por ti
Qué hace createChatChannelPlugin por ti
En lugar de implementar manualmente interfaces de adaptador de bajo nivel, pasas
opciones declarativas y el constructor las compone:
También puedes pasar objetos de adaptador sin procesar en lugar de las opciones declarativas
si necesitas control total.
| Opción | Qué conecta |
|---|---|
security.dm | Resolutor de seguridad DM delimitado a partir de campos de configuración |
pairing.text | Flujo de emparejamiento DM basado en texto con intercambio de código |
threading | Resolutor de modo reply-to (fijo, delimitado por cuenta o personalizado) |
outbound.attachedResults | Funciones de envío que devuelven metadatos de resultado (IDs de mensaje) |
Conectar el entrypoint
Crea Coloca los descriptores CLI propiedad del canal en
index.ts:index.ts
registerCliMetadata(...) para que OpenClaw
pueda mostrarlos en la ayuda raíz sin activar el runtime completo del canal,
mientras que las cargas completas normales seguirán recogiendo los mismos descriptores para el registro real de comandos. Mantén registerFull(...) para trabajo exclusivo de runtime.
Si registerFull(...) registra métodos RPC de gateway, usa un
prefijo específico del plugin. Los espacios de nombres reservados del núcleo para administración (config.*,
exec.approvals.*, wizard.*, update.*) siguen reservados y siempre
se resuelven a operator.admin.
defineChannelPluginEntry gestiona automáticamente la división entre modos de registro. Consulta
Entry Points para ver todas las
opciones.Añadir una entrada de setup
Crea OpenClaw carga esto en lugar de la entrada completa cuando el canal está deshabilitado
o no configurado. Evita arrastrar código pesado de runtime durante los flujos de setup.
Consulta Setup and Config para más detalles.
setup-entry.ts para una carga ligera durante el onboarding:setup-entry.ts
Gestionar mensajes entrantes
Tu plugin necesita recibir mensajes desde la plataforma y reenviarlos a
OpenClaw. El patrón típico es un webhook que verifica la solicitud y
la despacha a través del controlador entrante de tu canal:
El manejo de mensajes entrantes es específico de cada canal. Cada plugin de canal es propietario
de su propio pipeline de entrada. Mira los plugins de canal integrados
(por ejemplo el paquete de plugin de Microsoft Teams o Google Chat) para ver patrones reales.
Probar
Escribe pruebas colocadas junto al código en Para helpers de prueba compartidos, consulta Testing.
src/channel.test.ts:src/channel.test.ts
Estructura de archivos
Temas avanzados
Opciones de threading
Modos de respuesta fijos, delimitados por cuenta o personalizados
Integración de la herramienta message
describeMessageTool y descubrimiento de acciones
Resolución de destinos
inferTargetChatType, looksLikeId, resolveTarget
Helpers de runtime
TTS, STT, medios, subagente mediante api.runtime
Algunas uniones helper integradas siguen existiendo para mantenimiento y
compatibilidad de plugins integrados. No son el patrón recomendado para plugins de canal nuevos;
prefiere las subrutas genéricas de channel/setup/reply/runtime de la superficie común del SDK
salvo que estés manteniendo directamente esa familia de plugins integrados.
Siguientes pasos
- Provider Plugins — si tu plugin también proporciona modelos
- SDK Overview — referencia completa de importaciones por subruta
- SDK Testing — utilidades de prueba y pruebas de contrato
- Plugin Manifest — esquema completo del manifiesto