Saltar al contenido principal

Creación de plugins

Los plugins amplían OpenClaw con nuevas capacidades: canales, proveedores de modelos, voz, transcripción en tiempo real, voz en tiempo real, comprensión de medios, generación de imágenes, generación de video, obtención web, búsqueda web, herramientas del agente o cualquier combinación. No necesitas añadir tu plugin al repositorio de OpenClaw. Publícalo en ClawHub o npm y los usuarios lo instalan con openclaw plugins install <package-name>. OpenClaw intenta primero con ClawHub y recurre automáticamente a npm.

Requisitos previos

  • Node >= 22 y un gestor de paquetes (npm o pnpm)
  • Familiaridad con TypeScript (ESM)
  • Para plugins dentro del repositorio: repositorio clonado y pnpm install ejecutado

¿Qué tipo de plugin?

Plugin de canal

Conecta OpenClaw a una plataforma de mensajería (Discord, IRC, etc.)

Plugin de proveedor

Añade un proveedor de modelos (LLM, proxy o endpoint personalizado)

Plugin de herramienta / hook

Registra herramientas de agente, hooks de eventos o servicios — continúa abajo
Si un plugin de canal es opcional y puede no estar instalado cuando se ejecuta onboarding/configuración, usa createOptionalChannelSetupSurface(...) de openclaw/plugin-sdk/channel-setup. Produce un adaptador de configuración + par de asistente que anuncia el requisito de instalación y falla de forma cerrada en escrituras de configuración reales hasta que el plugin esté instalado.

Inicio rápido: plugin de herramienta

Este recorrido crea un plugin mínimo que registra una herramienta de agente. Los plugins de canal y proveedor tienen guías específicas enlazadas arriba.
1

Crear el paquete y el manifiesto

{
  "name": "@myorg/openclaw-my-plugin",
  "version": "1.0.0",
  "type": "module",
  "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"
    }
  }
}
Todo plugin necesita un manifiesto, incluso sin configuración. Consulta Manifest para ver el esquema completo. Los fragmentos canónicos de publicación en ClawHub se encuentran en docs/snippets/plugin-publish/.
2

Escribir el punto de entrada

// index.ts
import { definePluginEntry } from "openclaw/plugin-sdk/plugin-entry";
import { Type } from "@sinclair/typebox";

export default definePluginEntry({
  id: "my-plugin",
  name: "My Plugin",
  description: "Adds a custom tool to OpenClaw",
  register(api) {
    api.registerTool({
      name: "my_tool",
      description: "Do a thing",
      parameters: Type.Object({ input: Type.String() }),
      async execute(_id, params) {
        return { content: [{ type: "text", text: `Got: ${params.input}` }] };
      },
    });
  },
});
definePluginEntry es para plugins que no son de canal. Para canales, usa defineChannelPluginEntry; consulta Plugins de canal. Para ver todas las opciones de puntos de entrada, consulta Puntos de entrada.
3

Probar y publicar

Plugins externos: valida y publica con ClawHub, luego instala:
clawhub package publish your-org/your-plugin --dry-run
clawhub package publish your-org/your-plugin
openclaw plugins install clawhub:@myorg/openclaw-my-plugin
OpenClaw también comprueba ClawHub antes que npm para especificaciones de paquete simples como @myorg/openclaw-my-plugin.Plugins dentro del repositorio: colócalos dentro del árbol de workspace de plugins integrados; se detectan automáticamente.
pnpm test -- <bundled-plugin-root>/my-plugin/

Capacidades del plugin

Un único plugin puede registrar cualquier número de capacidades mediante el objeto api:
CapacidadMétodo de registroGuía detallada
Inferencia de texto (LLM)api.registerProvider(...)Plugins de proveedor
Backend de inferencia de CLIapi.registerCliBackend(...)Backends de CLI
Canal / mensajeríaapi.registerChannel(...)Plugins de canal
Voz (TTS/STT)api.registerSpeechProvider(...)Plugins de proveedor
Transcripción en tiempo realapi.registerRealtimeTranscriptionProvider(...)Plugins de proveedor
Voz en tiempo realapi.registerRealtimeVoiceProvider(...)Plugins de proveedor
Comprensión de mediosapi.registerMediaUnderstandingProvider(...)Plugins de proveedor
Generación de imágenesapi.registerImageGenerationProvider(...)Plugins de proveedor
Generación de videoapi.registerVideoGenerationProvider(...)Plugins de proveedor
Obtención webapi.registerWebFetchProvider(...)Plugins de proveedor
Búsqueda webapi.registerWebSearchProvider(...)Plugins de proveedor
Herramientas del agenteapi.registerTool(...)Abajo
Comandos personalizadosapi.registerCommand(...)Puntos de entrada
Hooks de eventosapi.registerHook(...)Puntos de entrada
Rutas HTTPapi.registerHttpRoute(...)Internals
Subcomandos de CLIapi.registerCli(...)Puntos de entrada
Para ver la API completa de registro, consulta Resumen del SDK. Si tu plugin registra métodos RPC personalizados del gateway, mantenlos bajo un prefijo específico del plugin. Los espacios de nombres administrativos del núcleo (config.*, exec.approvals.*, wizard.*, update.*) siguen estando reservados y siempre se resuelven a operator.admin, incluso si un plugin solicita un ámbito más restringido. Semántica de guardas de hooks que debes tener en cuenta:
  • before_tool_call: { block: true } es terminal y detiene los controladores de menor prioridad.
  • before_tool_call: { block: false } se trata como si no hubiera decisión.
  • before_tool_call: { requireApproval: true } pausa la ejecución del agente y solicita aprobación al usuario mediante la superposición de aprobación de exec, botones de Telegram, interacciones de Discord o el comando /approve en cualquier canal.
  • before_install: { block: true } es terminal y detiene los controladores de menor prioridad.
  • before_install: { block: false } se trata como si no hubiera decisión.
  • message_sending: { cancel: true } es terminal y detiene los controladores de menor prioridad.
  • message_sending: { cancel: false } se trata como si no hubiera decisión.
El comando /approve gestiona tanto aprobaciones de exec como de plugins con un respaldo acotado: cuando no se encuentra un ID de aprobación de exec, OpenClaw vuelve a intentar el mismo ID mediante aprobaciones de plugins. El reenvío de aprobaciones de plugins puede configurarse de forma independiente mediante approvals.plugin en la configuración. Si la infraestructura personalizada de aprobaciones necesita detectar ese mismo caso de respaldo acotado, prefiere isApprovalNotFoundError de openclaw/plugin-sdk/error-runtime en lugar de buscar manualmente cadenas de vencimiento de aprobación. Consulta Semántica de decisiones de hooks del resumen del SDK para más detalles.

Registrar herramientas de agente

Las herramientas son funciones tipadas que el LLM puede invocar. Pueden ser obligatorias (siempre disponibles) u opcionales (adhesión del usuario):
register(api) {
  // Herramienta obligatoria: siempre disponible
  api.registerTool({
    name: "my_tool",
    description: "Do a thing",
    parameters: Type.Object({ input: Type.String() }),
    async execute(_id, params) {
      return { content: [{ type: "text", text: params.input }] };
    },
  });

  // Herramienta opcional: el usuario debe añadirla a la lista de permitidos
  api.registerTool(
    {
      name: "workflow_tool",
      description: "Run a workflow",
      parameters: Type.Object({ pipeline: Type.String() }),
      async execute(_id, params) {
        return { content: [{ type: "text", text: params.pipeline }] };
      },
    },
    { optional: true },
  );
}
Los usuarios habilitan herramientas opcionales en la configuración:
{
  tools: { allow: ["workflow_tool"] },
}
  • Los nombres de herramientas no deben entrar en conflicto con las herramientas del núcleo (los conflictos se omiten)
  • Usa optional: true para herramientas con efectos secundarios o requisitos binarios adicionales
  • Los usuarios pueden habilitar todas las herramientas de un plugin añadiendo el ID del plugin a tools.allow

Convenciones de importación

Importa siempre desde rutas específicas openclaw/plugin-sdk/<subpath>:
import { definePluginEntry } from "openclaw/plugin-sdk/plugin-entry";
import { createPluginRuntimeStore } from "openclaw/plugin-sdk/runtime-store";

// Incorrecto: raíz monolítica (obsoleta, se eliminará)
import { ... } from "openclaw/plugin-sdk";
Para ver la referencia completa de subrutas, consulta Resumen del SDK. Dentro de tu plugin, usa archivos barrel locales (api.ts, runtime-api.ts) para importaciones internas; nunca importes tu propio plugin mediante su ruta del SDK. Para plugins de proveedor, mantén los auxiliares específicos del proveedor en esos barrel de la raíz del paquete, a menos que la interfaz sea realmente genérica. Ejemplos actuales integrados:
  • Anthropic: envoltorios de flujo de Claude y auxiliares service_tier / beta
  • OpenAI: constructores de proveedor, auxiliares de modelo predeterminado, proveedores en tiempo real
  • OpenRouter: constructor de proveedor más auxiliares de onboarding/configuración
Si un auxiliar solo es útil dentro de un paquete de proveedor integrado, mantenlo en esa interfaz de raíz del paquete en lugar de promoverlo a openclaw/plugin-sdk/*. Todavía existen algunas interfaces auxiliares generadas openclaw/plugin-sdk/<bundled-id> para mantenimiento y compatibilidad de plugins integrados, por ejemplo plugin-sdk/feishu-setup o plugin-sdk/zalo-setup. Trátalas como superficies reservadas, no como el patrón predeterminado para nuevos plugins de terceros.

Lista de comprobación previa al envío

package.json tiene los metadatos openclaw correctos
El manifiesto openclaw.plugin.json está presente y es válido
El punto de entrada usa defineChannelPluginEntry o definePluginEntry
Todas las importaciones usan rutas específicas plugin-sdk/<subpath>
Las importaciones internas usan módulos locales, no autoimportaciones del SDK
Las pruebas pasan (pnpm test -- <bundled-plugin-root>/my-plugin/)
pnpm check pasa (plugins dentro del repositorio)

Pruebas de versiones beta

  1. Vigila las etiquetas de versiones de GitHub en openclaw/openclaw y suscríbete mediante Watch > Releases. Las etiquetas beta tienen un aspecto como v2026.3.N-beta.1. También puedes activar notificaciones para la cuenta oficial de OpenClaw en X @openclaw para anuncios de versiones.
  2. Prueba tu plugin con la etiqueta beta en cuanto aparezca. El margen antes de la versión estable suele ser de solo unas horas.
  3. Publica en el hilo de tu plugin en el canal plugin-forum de Discord después de probarlo con all good o con lo que se haya roto. Si todavía no tienes un hilo, crea uno.
  4. Si algo se rompe, abre o actualiza una incidencia titulada Beta blocker: <plugin-name> - <summary> y aplica la etiqueta beta-blocker. Pon el enlace de la incidencia en tu hilo.
  5. Abre un PR a main titulado fix(<plugin-id>): beta blocker - <summary> y enlaza la incidencia tanto en el PR como en tu hilo de Discord. Los colaboradores no pueden etiquetar PR, así que el título es la señal del lado del PR para mantenedores y automatización. Los bloqueos con PR se fusionan; los bloqueos sin PR podrían publicarse igualmente. Los mantenedores vigilan estos hilos durante las pruebas beta.
  6. El silencio significa verde. Si pierdes la ventana, es probable que tu corrección llegue en el siguiente ciclo.

Siguientes pasos

Plugins de canal

Crea un plugin de canal de mensajería

Plugins de proveedor

Crea un plugin de proveedor de modelos

Resumen del SDK

Mapa de importaciones y referencia de la API de registro

Auxiliares de runtime

TTS, búsqueda, subagente mediante api.runtime

Pruebas

Utilidades y patrones de prueba

Manifiesto del plugin

Referencia completa del esquema del manifiesto

Relacionado