Creación de plugins de canal
Esta guía explica cómo crear un plugin de canal que conecte OpenClaw con una plataforma de mensajería. Al final tendrás un canal funcional con seguridad de mensajes directos, emparejamiento, encadenamiento de respuestas y mensajería saliente.Si todavía 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 de enviar/editar/reaccionar. OpenClaw mantiene una herramienta compartidamessage en el núcleo. Tu plugin se encarga de:
- Configuración — resolución de cuentas y asistente de configuración
- Seguridad — política de mensajes directos y listas permitidas
- Emparejamiento — flujo de aprobación de mensajes directos
- Gramática de sesión — cómo los identificadores de conversación específicos del proveedor se asignan a chats base, identificadores de hilo y alternativas de padre
- Salida — envío de texto, medios y encuestas a la plataforma
- Encadenamiento — cómo se encadenan las respuestas
:thread: y el despacho.
Si tu plataforma almacena alcance adicional dentro de los identificadores de conversación, mantén ese análisis
en el plugin con messaging.resolveSessionConversation(...). Ese es el hook
canónico para asignar rawId al identificador de conversación base, un identificador 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 arranque
el registro de canales también pueden exponer un archivo de nivel superior session-key-api.ts con una exportación
resolveSessionConversation(...) equivalente. El núcleo usa esa superficie segura para el arranque
solo cuando el registro de plugins en tiempo de ejecución todavía no está disponible.
messaging.resolveParentConversationCandidates(...) sigue disponible como una
alternativa de compatibilidad heredada cuando un plugin solo necesita padres alternativos sobre
el identificador genérico/sin procesar. 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 para aprobaciones.- El núcleo se encarga de
/approveen el mismo chat, las cargas útiles compartidas de botones de aprobación y 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. ChannelPlugin.approvalsse eliminó. Coloca los datos de entrega/aprobación nativa/renderizado/autenticación enapprovalCapability.plugin.authes solo para login/logout; el núcleo ya no lee hooks de autenticación de aprobación desde ese objeto.approvalCapability.authorizeActorActionyapprovalCapability.getActionAvailabilityStateson la separación canónica para la autenticación de aprobación.- Usa
approvalCapability.getActionAvailabilityStatepara la disponibilidad de autenticación de aprobación en el mismo chat. - Si tu canal expone aprobaciones nativas de ejecución, usa
approvalCapability.getExecInitiatingSurfaceStatepara el estado de la superficie iniciadora/cliente nativo cuando difiera de la autenticación de aprobación en el mismo chat. El núcleo usa ese hook específico de ejecución para distinguirenabledfrente adisabled, decidir si el canal iniciador admite aprobaciones nativas de ejecución e incluir el canal en la orientación de fallback del cliente nativo.createApproverRestrictedNativeApprovalCapability(...)completa esto en el caso común. - Usa
outbound.shouldSuppressLocalPayloadPromptooutbound.beforeDeliverPayloadpara comportamiento específico del canal en el ciclo de vida de la carga útil, como ocultar prompts locales duplicados de aprobación o enviar indicadores de escritura antes de la entrega. - Usa
approvalCapability.deliverysolo para el enrutamiento de aprobación nativa o la supresión de fallback. - Usa
approvalCapability.nativeRuntimepara los datos nativos de aprobación controlados por el canal. Mantenlo diferido en puntos de entrada de canal críticos concreateLazyChannelApprovalNativeRuntimeAdapter(...), que puede importar tu módulo de tiempo de ejecución bajo demanda mientras sigue permitiendo que el núcleo ensamble el ciclo de vida de aprobación. - Usa
approvalCapability.rendersolo cuando un canal realmente necesite cargas útiles de aprobación personalizadas en lugar del renderizador compartido. - Usa
approvalCapability.describeExecApprovalSetupcuando el canal quiera que la respuesta de la ruta deshabilitada explique las opciones exactas de configuración necesarias para habilitar aprobaciones nativas de ejecución. El hook recibe{ channel, channelLabel, accountId }; los canales con cuentas con nombre deben renderizar rutas con alcance por cuenta comochannels.<channel>.accounts.<id>.execApprovals.*en lugar de valores predeterminados de nivel superior. - Si un canal puede inferir identidades estables de tipo propietario en mensajes directos a partir de 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 de aprobación nativa, mantén el código del canal centrado en la normalización del destino más los datos de transporte/presentación. Usa
createChannelExecApprovalProfile,createChannelNativeOriginTargetResolver,createChannelApproverDmTargetResolverycreateApproverRestrictedNativeApprovalCapabilitydeopenclaw/plugin-sdk/approval-runtime. Coloca los datos específicos del canal detrás deapprovalCapability.nativeRuntime, idealmente mediantecreateChannelApprovalNativeRuntimeAdapter(...)ocreateLazyChannelApprovalNativeRuntimeAdapter(...), para que el núcleo pueda ensamblar el controlador y encargarse del filtrado de solicitudes, enrutamiento, eliminación de duplicados, expiración, suscripción a la gateway y avisos de “enrutado a otro lugar”.nativeRuntimese divide en unas pocas separaciones más pequeñas: availability— si la cuenta está configurada y si una solicitud debe gestionarsepresentation— asignar el modelo de vista compartido de aprobación a cargas útiles nativas pendientes/resueltas/expiradas o acciones finalestransport— preparar destinos más enviar/actualizar/eliminar mensajes de aprobación nativainteractions— hooks opcionales para enlazar/desenlazar/borrar acciones en botones o reacciones nativasobserve— hooks opcionales para diagnósticos de entrega- Si el canal necesita objetos controlados por el tiempo de ejecución como un cliente, token, app Bolt o receptor de webhook, regístralos mediante
openclaw/plugin-sdk/channel-runtime-context. El registro genérico de contexto de tiempo de ejecución permite al núcleo iniciar controladores orientados por capacidades a partir del estado de inicio del canal sin añadir código de unión específico de aprobación. - Recurre a
createChannelApprovalHandlerocreateChannelNativeApprovalRuntimede nivel inferior solo cuando la separación orientada por capacidades todavía no sea lo suficientemente expresiva. - Los canales de aprobación nativa deben enrutar tanto
accountIdcomoapprovalKinda través de esos helpers.accountIdmantiene la política de aprobación multi-cuenta limitada a la cuenta correcta del bot, yapprovalKindmantiene disponible para el canal el comportamiento de aprobación de ejecución frente al de plugin sin ramas codificadas en el núcleo. - El núcleo ahora también se encarga de los avisos de redirección de aprobación. Los plugins de canal no deben enviar sus propios mensajes de seguimiento de “la aprobación fue a mensajes directos / a otro canal” desde
createChannelNativeApprovalRuntime; en su lugar, expón el enrutamiento preciso de origen + mensaje directo del aprobador mediante los helpers compartidos de capacidad de aprobación y deja que el núcleo agregue las entregas reales antes de publicar cualquier aviso de vuelta en el chat iniciador. - Conserva el tipo de identificador de aprobación entregado de extremo a extremo. Los clientes nativos no deben adivinar ni reescribir el enrutamiento de aprobación de ejecución frente a plugin a partir del estado local del canal.
- Distintos tipos de aprobación pueden exponer intencionalmente distintas superficies nativas.
Ejemplos integrados actuales:
- Slack mantiene disponible el enrutamiento de aprobación nativa tanto para identificadores de ejecución como de plugin.
- Matrix mantiene el mismo enrutamiento nativo de mensajes directos/canal y la misma UX basada en reacciones para aprobaciones de ejecución y de plugin, aunque sigue permitiendo que la autenticación difiera según el tipo de aprobación.
createApproverRestrictedNativeApprovalAdaptersigue existiendo como envoltorio de compatibilidad, pero el código nuevo debe 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-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 y
openclaw/plugin-sdk/reply-chunking cuando no necesites la superficie paraguas
más amplia.
Para la configuración en concreto:
openclaw/plugin-sdk/setup-runtimecubre los helpers de configuración seguros para tiempo de ejecución: adaptadores de parcheo de configuración seguros para importación (createPatchedAccountSetupAdapter,createEnvPatchedAccountSetupAdapter,createSetupInputPresenceValidator), salida de notas de búsqueda,promptResolvedAllowFrom,splitSetupEntriesy los constructores de proxy de configuración delegadaopenclaw/plugin-sdk/setup-adapter-runtimees la separación reducida de adaptador con reconocimiento del entorno paracreateEnvPatchedAccountSetupAdapteropenclaw/plugin-sdk/channel-setupcubre los constructores de configuración de instalación opcional más algunas primitivas seguras para configuración:createOptionalChannelSetupSurface,createOptionalChannelSetupAdapter,
channelEnvVars. Mantén envVars del tiempo de ejecución del canal o las constantes locales solo para el texto orientado a operadores.
createOptionalChannelSetupWizard, DEFAULT_ACCOUNT_ID,
createTopLevelChannelDmPolicy, setSetupChannelEnabled y
splitSetupEntries
- usa la separación más amplia
openclaw/plugin-sdk/setupsolo cuando también necesites los helpers compartidos más pesados de configuración/configuración, 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 de enlace a documentación.
Para otras rutas críticas del canal, prefiere los helpers reducidos frente a 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 multi-cuenta y fallback de cuenta predeterminadaopenclaw/plugin-sdk/inbound-envelopeyopenclaw/plugin-sdk/inbound-reply-dispatchpara el cableado de rutas/sobres de entrada y registro y despachoopenclaw/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 salientesopenclaw/plugin-sdk/thread-bindings-runtimepara el ciclo de vida de enlace de hilos y registro de adaptadoresopenclaw/plugin-sdk/agent-media-payloadsolo cuando todavía se requiera una disposición heredada de campos de carga útil de agente/mediosopenclaw/plugin-sdk/telegram-command-configpara normalización de comandos personalizados de Telegram, validación de duplicados/conflictos y un contrato estable de configuración de comandos para fallback
Política de menciones entrantes
Mantén el manejo de menciones entrantes dividido en dos capas:- recopilación de evidencia controlada por el plugin
- evaluación de políticas compartida
openclaw/plugin-sdk/channel-inbound para la capa compartida.
Buena opción para la lógica local del plugin:
- detección de respuesta al bot
- detección de cita del bot
- comprobaciones de participación en el hilo
- exclusiones de mensajes de servicio/sistema
- cachés nativas de la plataforma necesarias para demostrar la participación del bot
requireMention- resultado explícito de mención
- lista permitida de mención implícita
- bypass de comandos
- decisión final de omitir
- Calcula los datos locales de mención.
- Pasa esos datos a
resolveInboundMentionDecision({ facts, policy }). - Usa
decision.effectiveWasMentioned,decision.shouldBypassMentionydecision.shouldSkipen tu puerta de entrada.
api.runtime.channel.mentions expone los mismos helpers compartidos de menciones para
plugins de canal integrados que ya dependen de la inyección en tiempo de ejecución:
buildMentionRegexesmatchesMentionPatternsmatchesMentionWithExplicitimplicitMentionKindWhenresolveInboundMentionDecision
resolveMentionGating* siguen en
openclaw/plugin-sdk/channel-inbound solo como exportaciones de compatibilidad. El código nuevo
debe usar resolveInboundMentionDecision({ facts, policy }).
Recorrido
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 la superficie completa de metadatos del paquete,
consulta Plugin Setup and Config:Construye 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 por ti createChatChannelPlugin
Qué hace por ti createChatChannelPlugin
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 opciones declarativas
si necesitas control total.
| Opción | Lo que conecta |
|---|---|
security.dm | Resolución de seguridad de mensajes directos con alcance desde los campos de configuración |
pairing.text | Flujo de emparejamiento por mensaje directo basado en texto con intercambio de código |
threading | Resolución del modo reply-to (fijo, con alcance por cuenta o personalizado) |
outbound.attachedResults | Funciones de envío que devuelven metadatos de resultado (identificadores de mensaje) |
Conecta el punto de entrada
Crea Coloca los descriptores de CLI controlados por el canal en
index.ts:index.ts
registerCliMetadata(...) para que OpenClaw
pueda mostrarlos en la ayuda raíz sin activar el tiempo de ejecución completo del canal,
mientras que las cargas completas normales sigan recogiendo esos mismos descriptores para el registro real de comandos.
Mantén registerFull(...) para trabajo solo de tiempo de ejecución.
Si registerFull(...) registra métodos RPC de gateway, usa un prefijo
específico del plugin. Los espacios de nombres administrativos del núcleo (config.*,
exec.approvals.*, wizard.*, update.*) permanecen reservados y siempre
se resuelven en operator.admin.
defineChannelPluginEntry gestiona automáticamente la división por modo de registro. Consulta
Entry Points para ver todas las
opciones.Añade una entrada de configuración
Crea OpenClaw carga esto en lugar de la entrada completa cuando el canal está deshabilitado
o no configurado. Evita cargar código pesado de tiempo de ejecución durante los flujos de configuración.
Consulta Setup and Config para más detalles.
setup-entry.ts para carga ligera durante la incorporación:setup-entry.ts
Gestiona los mensajes entrantes
Tu plugin necesita recibir mensajes de la plataforma y reenviarlos a
OpenClaw. El patrón típico es un webhook que verifica la solicitud y
la despacha mediante el controlador de entrada de tu canal:
El manejo de mensajes entrantes es específico del canal. Cada plugin de canal se encarga de
su propia canalización de entrada. Mira los plugins de canal integrados
(por ejemplo, el paquete del plugin de Microsoft Teams o Google Chat) para ver patrones reales.
Prueba
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 encadenamiento
Modos de respuesta fijos, con alcance por cuenta o personalizados
Integración de la herramienta de mensajes
describeMessageTool y descubrimiento de acciones
Resolución de destino
inferTargetChatType, looksLikeId, resolveTarget
Helpers de tiempo de ejecución
TTS, STT, medios, subagente mediante api.runtime
Algunas separaciones auxiliares integradas siguen existiendo para mantenimiento de plugins integrados y
compatibilidad. 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
a menos 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 importación de subrutas
- SDK Testing — utilidades de prueba y pruebas de contrato
- Plugin Manifest — esquema completo del manifiesto