Plugin SDK reference
Configuración del Plugin y ajustes
Referencia para el empaquetado de plugins (metadatos de package.json), manifiestos (openclaw.plugin.json), entradas de configuración y esquemas de configuración.
Metadatos del paquete
Su package.json necesita un campo openclaw que indique al sistema de plugins qué proporciona su plugin:
Plugin de canal
{ "name": "@myorg/openclaw-my-channel", "version": "1.0.0", "type": "module", "openclaw": { "extensions": ["./index.ts"], "setupEntry": "./setup-entry.ts", "channel": { "id": "my-channel", "label": "My Channel", "blurb": "Short description of the channel." } }}Plugin de proveedor / base de referencia de ClawHub
{ "name": "@myorg/openclaw-my-plugin", "version": "1.0.0", "type": "module", "dependencies": { "typebox": "1.1.39" }, "peerDependencies": { "openclaw": ">=2026.3.24-beta.2" }, "openclaw": { "extensions": ["./index.ts"], "compat": { "pluginApi": ">=2026.3.24-beta.2", "minGatewayVersion": "2026.3.24-beta.2" }, "build": { "openclawVersion": "2026.3.24-beta.2", "pluginSdkVersion": "2026.3.24-beta.2" } }}Campos de openclaw
extensionsstring[]Archivos de punto de entrada (relativos a la raíz del paquete). Entradas de código fuente válidas para el desarrollo en el espacio de trabajo y mediante un checkout de git.
runtimeExtensionsstring[]Archivos JavaScript compilados equivalentes a extensions, preferidos cuando OpenClaw carga un paquete npm instalado. Consulte Puntos de entrada del SDK para conocer el orden de resolución entre código fuente y código compilado.
setupEntrystringEntrada ligera exclusiva para la configuración (opcional).
runtimeSetupEntrystringArchivo JavaScript compilado equivalente a setupEntry. Requiere que también se defina setupEntry.
pluginobjectIdentidad alternativa del plugin { id, label }, utilizada cuando un plugin no tiene metadatos de canal o proveedor de los que derivar un identificador o una etiqueta.
channelobjectMetadatos del catálogo de canales para las interfaces de configuración, selección, inicio rápido y estado.
installobjectIndicaciones de instalación: npmSpec, localPath, defaultChoice, minHostVersion, expectedIntegrity, allowInvalidConfigRecovery, requiredPlatformPackages.
startupobjectIndicadores del comportamiento de inicio.
compatobjectIntervalo de versiones de pluginApi compatible con este plugin. Obligatorio para publicaciones externas en ClawHub.
openclaw.channel
openclaw.channel contiene metadatos ligeros del paquete para el descubrimiento de canales y las interfaces de configuración antes de cargar el entorno de ejecución.
| Campo | Tipo | Significado |
|---|---|---|
id |
string |
Identificador canónico del canal. |
label |
string |
Etiqueta principal del canal. |
selectionLabel |
string |
Etiqueta del selector o de configuración cuando deba diferir de label. |
detailLabel |
string |
Etiqueta secundaria detallada para catálogos de canales e interfaces de estado más completos. |
docsPath |
string |
Ruta de la documentación para los enlaces de configuración y selección. |
docsLabel |
string |
Etiqueta alternativa para los enlaces de documentación cuando deba diferir del identificador del canal. |
blurb |
string |
Descripción breve para la incorporación o el catálogo. |
order |
number |
Orden de clasificación en los catálogos de canales. |
aliases |
string[] |
Alias de búsqueda adicionales para seleccionar el canal. |
preferOver |
string[] |
Identificadores de plugins o canales de menor prioridad que este canal debe superar. |
systemImage |
string |
Nombre opcional del icono o imagen del sistema para los catálogos de canales de la interfaz. |
selectionDocsPrefix |
string |
Texto prefijado a los enlaces de documentación en las interfaces de selección. |
selectionDocsOmitLabel |
boolean |
Muestra directamente la ruta de la documentación en lugar de un enlace con etiqueta en el texto de selección. |
selectionExtras |
string[] |
Cadenas breves adicionales que se agregan al texto de selección. |
markdownCapable |
boolean |
Marca el canal como compatible con Markdown para decidir el formato de salida. |
exposure |
object |
Controles de visibilidad del canal para la configuración, las listas de canales configurados y las interfaces de documentación. |
quickstartAllowFrom |
boolean |
Incluye este canal en el flujo estándar de configuración rápida de allowFrom. |
forceAccountBinding |
boolean |
Exige la vinculación explícita de una cuenta incluso cuando solo existe una. |
preferSessionLookupForAnnounceTarget |
boolean |
Prioriza la búsqueda de sesiones al resolver los destinos de anuncios de este canal. |
Ejemplo:
{ "openclaw": { "channel": { "id": "my-channel", "label": "My Channel", "selectionLabel": "My Channel (self-hosted)", "detailLabel": "My Channel Bot", "docsPath": "/channels/my-channel", "docsLabel": "my-channel", "blurb": "Webhook-based self-hosted chat integration.", "order": 80, "aliases": ["mc"], "preferOver": ["my-channel-legacy"], "selectionDocsPrefix": "Guide:", "selectionExtras": ["Markdown"], "markdownCapable": true, "exposure": { "configured": true, "setup": true, "docs": true }, "quickstartAllowFrom": true } }}exposure admite:
configured: incluye el canal en interfaces de listado de canales configurados o de estadosetup: incluye el canal en los selectores interactivos de configuracióndocs: marca el canal como público en las interfaces de documentación y navegación
openclaw.install
openclaw.install contiene metadatos del paquete, no del manifiesto.
| Campo | Tipo | Significado |
|---|---|---|
clawhubSpec |
string |
Especificación canónica de ClawHub para los flujos de instalación, actualización e instalación bajo demanda durante la incorporación. |
npmSpec |
string |
Especificación canónica de npm para los flujos alternativos de instalación y actualización. |
localPath |
string |
Ruta de desarrollo local o de instalación incluida. |
defaultChoice |
"clawhub" | "npm" | "local" |
Fuente de instalación preferida cuando hay varias disponibles. |
minHostVersion |
string |
Versión mínima compatible de OpenClaw: >=x.y.z o >=x.y.z-prerelease. |
expectedIntegrity |
string |
Cadena de integridad esperada de la distribución npm, normalmente sha512-..., para instalaciones fijadas. |
allowInvalidConfigRecovery |
boolean |
Permite que los flujos de reinstalación de plugins incluidos se recuperen de errores específicos causados por configuraciones obsoletas. |
requiredPlatformPackages |
string[] |
Alias npm obligatorios específicos de la plataforma que se verifican durante la instalación con npm. |
Comportamiento de la incorporación
La incorporación interactiva utiliza openclaw.install para las interfaces de instalación bajo demanda: si su plugin expone opciones de autenticación de proveedores o metadatos de configuración o catálogo de canales antes de cargar el entorno de ejecución, la incorporación puede solicitar una instalación desde ClawHub, npm o una fuente local, instalar o habilitar el plugin y continuar después con el flujo seleccionado. Las opciones de ClawHub usan clawhubSpec y se prefieren cuando están presentes; las opciones de npm requieren metadatos de catálogo de confianza con un npmSpec del registro (las versiones exactas y expectedIntegrity son fijaciones opcionales que se aplican durante la instalación o actualización cuando están definidas). Mantenga «qué mostrar» en openclaw.plugin.json y «cómo instalarlo» en package.json.
Aplicación de minHostVersion
Si se define minHostVersion, se aplica tanto durante la instalación como al cargar registros de manifiestos no incluidos. Los hosts más antiguos omiten los plugins externos; se rechazan las cadenas de versión no válidas. Se presupone que los plugins de código fuente incluidos tienen la misma versión que el checkout del host.
Instalaciones de npm fijadas
Para las instalaciones de npm fijadas, mantenga la versión exacta en npmSpec y añada la integridad esperada del artefacto:
{ "openclaw": { "install": { "npmSpec": "@wecom/wecom-openclaw-plugin@1.2.3", "expectedIntegrity": "sha512-REPLACE_WITH_NPM_DIST_INTEGRITY", "defaultChoice": "npm" } }}Ámbito de allowInvalidConfigRecovery
allowInvalidConfigRecovery no es una forma general de eludir configuraciones dañadas. Solo permite la recuperación limitada de plugins incluidos, de modo que la reinstalación o configuración pueda reparar residuos conocidos de actualizaciones, como una ruta ausente de un plugin incluido o una entrada channels.<id> obsoleta correspondiente a ese mismo plugin. Si la configuración está dañada por motivos no relacionados, la instalación continúa fallando de forma segura e indica al operador que ejecute openclaw doctor --fix.
Carga completa diferida
Los plugins de canal pueden optar por la carga diferida mediante:
{ "openclaw": { "extensions": ["./index.ts"], "setupEntry": "./setup-entry.ts", "startup": { "deferConfiguredChannelFullLoadUntilAfterListen": true } }}Cuando está habilitada, OpenClaw carga únicamente setupEntry durante la fase de inicio previa a la escucha, incluso para los canales ya configurados. La entrada completa se carga después de que el Gateway comienza a escuchar.
Si la entrada de configuración o la entrada completa registra métodos RPC del Gateway, manténgalos bajo un prefijo específico del plugin. Los espacios de nombres administrativos reservados del núcleo (config.*, exec.approvals.*, wizard.*, update.*) siguen siendo propiedad del núcleo y siempre se normalizan como operator.admin.
Manifiesto del plugin
Todo plugin nativo debe incluir un archivo openclaw.plugin.json en la raíz del paquete. OpenClaw lo utiliza para validar la configuración sin ejecutar el código del plugin.
{ "id": "my-plugin", "name": "My Plugin", "description": "Adds My Plugin capabilities to OpenClaw", "configSchema": { "type": "object", "additionalProperties": false, "properties": { "webhookSecret": { "type": "string", "description": "Webhook verification secret" } } }}Para los plugins de canal, añade channels (y, para los plugins de proveedor, añade providers):
{ "id": "my-channel", "channels": ["my-channel"], "configSchema": { "type": "object", "additionalProperties": false, "properties": {} }}Incluso los plugins sin configuración deben incluir un esquema. Un esquema vacío es válido:
{ "id": "my-plugin", "configSchema": { "type": "object", "additionalProperties": false }}Consulta Manifiesto del plugin para obtener la referencia completa del esquema.
Publicación en ClawHub
Los paquetes de Skills y plugins utilizan comandos de publicación de ClawHub distintos. Para los paquetes de plugins, utiliza el comando específico para paquetes:
clawhub package publish your-org/your-plugin --dry-runclawhub package publish your-org/your-pluginEntrada de configuración
setup-entry.ts es una alternativa ligera a index.ts que OpenClaw carga cuando solo necesita las superficies de configuración inicial (incorporación, reparación de la configuración e inspección de canales deshabilitados):
// setup-entry.ts export default defineSetupPluginEntry(myChannelPlugin);Esto evita cargar código pesado en tiempo de ejecución (bibliotecas criptográficas, registros de la CLI y servicios en segundo plano) durante los flujos de configuración inicial.
Los canales incluidos en el espacio de trabajo que mantienen exportaciones seguras para la configuración inicial en módulos auxiliares pueden utilizar defineBundledChannelSetupEntry(...) de openclaw/plugin-sdk/channel-entry-contract en lugar de defineSetupPluginEntry(...). Ese contrato para componentes incluidos también admite una exportación opcional runtime, de modo que la conexión del entorno de ejecución durante la configuración inicial pueda mantenerse ligera y explícita.
Cuándo utiliza OpenClaw setupEntry en lugar de la entrada completa
- El canal está deshabilitado, pero necesita superficies de configuración inicial o incorporación.
- El canal está habilitado, pero no está configurado.
- La carga diferida está habilitada (
deferConfiguredChannelFullLoadUntilAfterListen).
Qué debe registrar setupEntry
- El objeto del plugin de canal (mediante
defineSetupPluginEntry). - Cualquier ruta HTTP necesaria antes de que el Gateway comience a escuchar.
- Cualquier método del Gateway necesario durante el inicio.
Esos métodos del Gateway utilizados durante el inicio deben seguir evitando los espacios de nombres administrativos reservados del núcleo, como config.* o update.*.
Qué NO debe incluir setupEntry
- Registros de la CLI.
- Servicios en segundo plano.
- Importaciones pesadas del entorno de ejecución (criptografía, SDK).
- Métodos del Gateway que solo se necesitan después del inicio.
Importaciones específicas de ayudantes de configuración inicial
Para las rutas críticas exclusivas de configuración inicial, cuando solo necesites una parte de la superficie de configuración, prefiere los puntos de acceso específicos a los ayudantes de configuración en lugar del módulo general plugin-sdk/setup:
| Ruta de importación | Utilízala para | Exportaciones principales |
|---|---|---|
plugin-sdk/setup-runtime |
ayudantes del entorno de ejecución durante la configuración disponibles en setupEntry o el inicio diferido del canal |
createSetupTranslator, createPatchedAccountSetupAdapter, createEnvPatchedAccountSetupAdapter, createSetupInputPresenceValidator, noteChannelLookupFailure, noteChannelLookupSummary, promptResolvedAllowFrom, splitSetupEntries, createAllowlistSetupWizardProxy, createDelegatedSetupWizardProxy |
plugin-sdk/setup-adapter-runtime |
alias de compatibilidad obsoleto; utiliza plugin-sdk/setup-runtime |
createEnvPatchedAccountSetupAdapter |
plugin-sdk/setup-tools |
ayudantes de configuración, instalación, CLI, archivos y documentación | formatCliCommand, detectBinary, extractArchive, resolveBrewExecutable, formatDocsLink, CONFIG_DIR |
Utiliza el punto de acceso general plugin-sdk/setup cuando quieras el conjunto completo de herramientas compartidas de configuración inicial, incluidos los ayudantes para modificar la configuración, como moveSingleAccountChannelSectionToDefaultAccount(...).
Utiliza createSetupTranslator(...) para el texto fijo del asistente de configuración. Sigue la configuración regional del asistente de la CLI (OPENCLAW_LOCALE y, después, las variables de configuración regional del sistema) y utiliza el inglés como alternativa. Mantén el texto de configuración específico del plugin en el código propiedad del plugin y utiliza las claves del catálogo compartido solo para las etiquetas comunes de configuración, el texto de estado y el texto de configuración de los plugins oficiales incluidos.
Los adaptadores de modificación de la configuración siguen siendo seguros para las rutas críticas al importarlos. La búsqueda de la superficie del contrato para la promoción de cuentas únicas incluidas es diferida, por lo que importar plugin-sdk/setup-runtime no carga anticipadamente el descubrimiento de superficies de contrato incluidas antes de que se utilice realmente el adaptador.
Promoción de cuentas únicas propiedad del canal
Cuando un canal migra de una configuración de cuenta única de nivel superior a channels.<id>.accounts.*, el comportamiento compartido predeterminado mueve los valores promocionados específicos de la cuenta a accounts.default.
Los canales incluidos pueden restringir o sustituir esa promoción mediante su superficie de contrato de configuración:
singleAccountKeysToMove: claves adicionales de nivel superior que deben trasladarse a la cuenta promocionadanamedAccountPromotionKeys: cuando ya existen cuentas con nombre, solo estas claves se trasladan a la cuenta promocionada; las claves compartidas de políticas y entrega permanecen en la raíz del canalresolveSingleAccountPromotionTarget(...): elige qué cuenta existente recibe los valores promocionados
Esquema de configuración
La configuración del plugin se valida con el esquema JSON del manifiesto. Los usuarios configuran los plugins mediante:
{ plugins: { entries: { "my-plugin": { config: { webhookSecret: "abc123", }, }, }, },}El plugin recibe esta configuración como api.pluginConfig durante el registro.
Para la configuración específica del canal, utiliza en su lugar la sección de configuración del canal:
{ channels: { "my-channel": { token: "bot-token", allowFrom: ["user1", "user2"], }, },}Creación de esquemas de configuración de canales
Utiliza buildChannelConfigSchema para convertir un esquema de Zod en el contenedor ChannelConfigSchema que emplean los artefactos de configuración propiedad del plugin:
const accountSchema = z.object({ token: z.string().optional(), allowFrom: z.array(z.string()).optional(), accounts: z.object({}).catchall(z.any()).optional(), defaultAccount: z.string().optional(),}); const configSchema = buildChannelConfigSchema(accountSchema);Si ya defines el contrato como esquema JSON o TypeBox, utiliza el ayudante directo para que OpenClaw pueda omitir la conversión de Zod a esquema JSON en las rutas de metadatos:
const configSchema = buildJsonChannelConfigSchema( Type.Object({ token: Type.Optional(Type.String()), allowFrom: Type.Optional(Type.Array(Type.String())), }),);Para los plugins de terceros, el contrato de la ruta no crítica sigue siendo el manifiesto del plugin: refleja el esquema JSON generado en openclaw.plugin.json#channelConfigs para que las superficies de esquema de configuración, configuración inicial e interfaz de usuario puedan inspeccionar channels.<id> sin cargar código del entorno de ejecución.
Asistentes de configuración
Los plugins de canal pueden proporcionar asistentes interactivos de configuración para openclaw onboard. El asistente es un objeto ChannelSetupWizard en ChannelPlugin:
const setupWizard: ChannelSetupWizard = { channel: "my-channel", status: { configuredLabel: "Connected", unconfiguredLabel: "Not configured", resolveConfigured: ({ cfg }) => Boolean((cfg.channels as any)?.["my-channel"]?.token), }, credentials: [ { inputKey: "token", providerHint: "my-channel", credentialLabel: "Bot token", preferredEnvVar: "MY_CHANNEL_BOT_TOKEN", envPrompt: "Use MY_CHANNEL_BOT_TOKEN from environment?", keepPrompt: "Keep current token?", inputPrompt: "Enter your bot token:", inspect: ({ cfg, accountId }) => { const token = (cfg.channels as any)?.["my-channel"]?.token; return { accountConfigured: Boolean(token), hasConfiguredValue: Boolean(token), }; }, }, ],};ChannelSetupWizard también admite textInputs, dmPolicy, allowFrom, groupAccess, prepare, finalize y más opciones. Consulta src/setup-core.ts del plugin de Discord para ver un ejemplo completo incluido.
Indicaciones compartidas de allowFrom
Para las indicaciones de listas de permitidos de mensajes directos que solo necesiten el flujo estándar nota -> indicación -> análisis -> combinación -> modificación, prefiere los ayudantes de configuración compartidos de openclaw/plugin-sdk/setup: createPromptParsedAllowFromForAccount(...), createTopLevelChannelParsedAllowFromPrompt(...) y createNestedChannelParsedAllowFromPrompt(...).
Estado estándar de configuración del canal
Para los bloques de estado de configuración del canal que solo varían en las etiquetas, las puntuaciones y las líneas adicionales opcionales, prefiere createStandardChannelSetupStatus(...) de openclaw/plugin-sdk/setup en lugar de crear manualmente el mismo objeto status en cada plugin.
Superficie opcional de configuración del canal
Para las superficies opcionales de configuración que solo deben aparecer en determinados contextos, utiliza createOptionalChannelSetupSurface de openclaw/plugin-sdk/channel-setup:
import { createOptionalChannelSetupSurface } from "openclaw/plugin-sdk/channel-setup"; const setupSurface = createOptionalChannelSetupSurface({ channel: "my-channel", label: "My Channel", npmSpec: "@myorg/openclaw-my-channel", docsPath: "/channels/my-channel",});// Returns { setupAdapter, setupWizard }plugin-sdk/channel-setup también expone los constructores de nivel inferior createOptionalChannelSetupAdapter(...) y createOptionalChannelSetupWizard(...) cuando solo necesitas una de las dos partes de esa superficie de instalación opcional.
El adaptador/asistente opcional generado falla de forma segura en escrituras reales de configuración. Reutiliza un único mensaje de instalación obligatoria en validateInput, applyAccountConfig y finalize, y añade un enlace a la documentación cuando se establece docsPath.
Ayudantes de configuración respaldados por binarios
Para las interfaces de configuración respaldadas por binarios, se recomienda usar los ayudantes delegados compartidos en lugar de copiar la misma lógica de integración de binarios y estados en cada canal:
createDetectedBinaryStatus(...)para bloques de estado que solo varían en etiquetas, indicaciones, puntuaciones y detección de binarioscreateCliPathTextInput(...)para entradas de texto basadas en rutascreateDelegatedSetupWizardStatusResolvers(...),createDelegatedPrepare(...),createDelegatedFinalize(...)ycreateDelegatedResolveConfigured(...)cuandosetupEntrynecesita remitir de forma diferida a un asistente completo más pesadocreateDelegatedTextInputShouldPrompt(...)cuandosetupEntrysolo necesita delegar una decisión detextInputs[*].shouldPrompt
Publicación e instalación
Plugins externos: publíquelos en ClawHub y, después, instálelos:
npm
openclaw plugins install @myorg/openclaw-my-pluginLas especificaciones de paquete simples se instalan desde npm durante la transición del lanzamiento, salvo que el nombre coincida con el identificador de un Plugin incluido u oficial, en cuyo caso OpenClaw utiliza esa copia local u oficial. Use clawhub:, npm:, git: o npm-pack: para seleccionar la fuente de forma determinista; consulte Gestionar Plugins.
Solo ClawHub
openclaw plugins install clawhub:@myorg/openclaw-my-pluginEspecificación de paquete npm
Use npm cuando un paquete aún no se haya trasladado a ClawHub o cuando necesite una ruta de instalación directa desde npm durante la migración:
openclaw plugins install npm:@myorg/openclaw-my-pluginPlugins del repositorio: colóquelos en el árbol del espacio de trabajo de Plugins incluidos; se detectan automáticamente durante la compilación.
Los metadatos de los paquetes incluidos son explícitos; no se infieren del JavaScript compilado durante el inicio del Gateway. Las dependencias de ejecución deben pertenecer al paquete del Plugin que las gestiona; el inicio de OpenClaw empaquetado nunca repara ni replica las dependencias de los Plugins.
Contenido relacionado
- Creación de Plugins — guía de introducción paso a paso
- Manifiesto de Plugin — referencia completa del esquema del manifiesto
- Puntos de entrada del SDK —
definePluginEntryydefineChannelPluginEntry