Plugins
Descripción general del SDK de Plugin
El SDK de Plugin es el contrato tipado entre plugins y el núcleo. Esta página es la referencia de qué importar y qué puedes registrar.
Convención de importación
Importa siempre desde una subruta específica:
Cada subruta es un módulo pequeño y autónomo. Esto mantiene el arranque rápido y
evita problemas de dependencias circulares. Para helpers de entrada/compilación específicos de canal,
prefiere openclaw/plugin-sdk/channel-core; reserva openclaw/plugin-sdk/core para
la superficie general más amplia y helpers compartidos como
buildChannelConfigSchema.
Para la configuración de canal, publica el JSON Schema propiedad del canal mediante
openclaw.plugin.json#channelConfigs. La subruta plugin-sdk/channel-config-schema
es para primitivas de esquema compartidas y el constructor genérico. Los plugins
incluidos de OpenClaw usan plugin-sdk/bundled-channel-config-schema para esquemas
retenidos de canales incluidos. Las exportaciones de compatibilidad obsoletas permanecen en
plugin-sdk/channel-config-schema-legacy; ninguna subruta de esquema incluido es un
patrón para plugins nuevos.
Referencia de subrutas
El SDK de Plugin se expone como un conjunto de subrutas estrechas agrupadas por área (entrada de Plugin, canal, proveedor, autenticación, runtime, capacidad, memoria y helpers reservados para plugins incluidos). Para el catálogo completo, agrupado y enlazado, consulta Subrutas del SDK de Plugin.
La lista generada de más de 200 subrutas vive en scripts/lib/plugin-sdk-entrypoints.json.
API de registro
El callback register(api) recibe un objeto OpenClawPluginApi con estos
métodos:
Registro de capacidades
| Método | Qué registra |
|---|---|
api.registerProvider(...) |
Inferencia de texto (LLM) |
api.registerAgentHarness(...) |
Ejecutor de agente experimental de bajo nivel |
api.registerCliBackend(...) |
Backend local de inferencia de CLI |
api.registerChannel(...) |
Canal de mensajería |
api.registerSpeechProvider(...) |
Síntesis de texto a voz / STT |
api.registerRealtimeTranscriptionProvider(...) |
Transcripción en tiempo real por streaming |
api.registerRealtimeVoiceProvider(...) |
Sesiones de voz dúplex en tiempo real |
api.registerMediaUnderstandingProvider(...) |
Análisis de imagen/audio/video |
api.registerImageGenerationProvider(...) |
Generación de imágenes |
api.registerMusicGenerationProvider(...) |
Generación de música |
api.registerVideoGenerationProvider(...) |
Generación de video |
api.registerWebFetchProvider(...) |
Proveedor de obtención / scraping web |
api.registerWebSearchProvider(...) |
Búsqueda web |
Herramientas y comandos
| Método | Qué registra |
|---|---|
api.registerTool(tool, opts?) |
Herramienta de agente (requerida o { optional: true }) |
api.registerCommand(def) |
Comando personalizado (omite el LLM) |
Los comandos de Plugin pueden establecer agentPromptGuidance cuando el agente necesita una
pista breve de enrutamiento propiedad del comando. Mantén ese texto centrado en el propio comando; no añadas
política específica de proveedor o Plugin a los constructores de prompts del núcleo.
Infraestructura
| Método | Qué registra |
|---|---|
api.registerHook(events, handler, opts?) |
Hook de evento |
api.registerHttpRoute(params) |
Endpoint HTTP del Gateway |
api.registerGatewayMethod(name, handler) |
Método RPC del Gateway |
api.registerGatewayDiscoveryService(service) |
Anunciador local de descubrimiento del Gateway |
api.registerCli(registrar, opts?) |
Subcomando de CLI |
api.registerService(service) |
Servicio en segundo plano |
api.registerInteractiveHandler(registration) |
Manejador interactivo |
api.registerAgentToolResultMiddleware(...) |
Middleware de runtime para resultados de herramientas |
api.registerMemoryPromptSupplement(builder) |
Sección aditiva de prompt adyacente a memoria |
api.registerMemoryCorpusSupplement(adapter) |
Corpus aditivo de búsqueda/lectura de memoria |
Hooks de host para plugins de flujo de trabajo
Los hooks de host son las costuras del SDK para plugins que necesitan participar en el ciclo de vida del host en lugar de solo añadir un proveedor, canal o herramienta. Son contratos genéricos; Plan Mode puede usarlos, pero también pueden hacerlo flujos de aprobación, compuertas de política de workspace, monitores en segundo plano, asistentes de configuración y plugins complementarios de UI.
| Método | Contrato que posee |
|---|---|
api.registerSessionExtension(...) |
Estado de sesión propiedad del Plugin, compatible con JSON, proyectado mediante sesiones del Gateway |
api.enqueueNextTurnInjection(...) |
Contexto duradero exactamente una vez inyectado en el siguiente turno del agente para una sesión |
api.registerTrustedToolPolicy(...) |
Política de herramientas pre-Plugin incluida/de confianza que puede bloquear o reescribir parámetros de herramientas |
api.registerToolMetadata(...) |
Metadatos de visualización del catálogo de herramientas sin cambiar la implementación de la herramienta |
api.registerCommand(...) |
Comandos de Plugin con ámbito; los resultados de comandos pueden establecer continueAgent: true; los comandos nativos de Discord admiten descriptionLocalizations |
api.registerControlUiDescriptor(...) |
Descriptores de contribución de Control UI para superficies de sesión, herramienta, ejecución o ajustes |
api.registerRuntimeLifecycle(...) |
Callbacks de limpieza para recursos de runtime propiedad del Plugin en rutas de restablecimiento/eliminación/recarga |
api.registerAgentEventSubscription(...) |
Suscripciones saneadas a eventos para estado de flujo de trabajo y monitores |
api.setRunContext(...) / getRunContext(...) / clearRunContext(...) |
Estado temporal de Plugin por ejecución que se limpia en el ciclo de vida terminal de la ejecución |
api.registerSessionSchedulerJob(...) |
Registros de trabajos del programador de sesiones propiedad del Plugin con limpieza determinista |
Los contratos dividen la autoridad intencionalmente:
- Los plugins externos pueden poseer extensiones de sesión, descriptores de UI, comandos, metadatos de herramientas, inyecciones de siguiente turno y hooks normales.
- Las políticas de herramientas de confianza se ejecutan antes de los hooks ordinarios
before_tool_cally son solo para incluidos porque participan en la política de seguridad del host. - La propiedad de comandos reservados es solo para incluidos. Los plugins externos deberían usar sus propios nombres de comando o alias.
allowPromptInjection=falsedesactiva hooks que mutan prompts, incluidosagent_turn_prepare,before_prompt_build,heartbeat_prompt_contribution, campos de prompt debefore_agent_startheredado yenqueueNextTurnInjection.
Ejemplos de consumidores que no son de Plan:
| Arquetipo de Plugin | Hooks usados |
|---|---|
| Flujo de aprobación | Extensión de sesión, continuación de comando, inyección de siguiente turno, descriptor de UI |
| Compuerta de política de presupuesto/workspace | Política de herramienta de confianza, metadatos de herramienta, proyección de sesión |
| Monitor de ciclo de vida en segundo plano | Limpieza de ciclo de vida de runtime, suscripción a eventos de agente, propiedad/limpieza del programador de sesiones, contribución al prompt de heartbeat, descriptor de UI |
| Asistente de configuración u onboarding | Extensión de sesión, comandos con ámbito, descriptor de Control UI |
Cuándo usar middleware de resultados de herramientas
Los plugins incluidos pueden usar api.registerAgentToolResultMiddleware(...) cuando
necesitan reescribir un resultado de herramienta después de la ejecución y antes de que el runtime
devuelva ese resultado al modelo. Esta es la costura de confianza y neutral respecto al runtime
para reductores de salida asíncronos como tokenjuice.
Los plugins incluidos deben declarar contracts.agentToolResultMiddleware para cada
runtime objetivo, por ejemplo ["pi", "codex"]. Los plugins externos
no pueden registrar este middleware; conserva los hooks normales de OpenClaw Plugin para trabajo
que no necesite temporización de resultado de herramienta previa al modelo. La antigua ruta de registro de fábrica de
extensión integrada solo de Pi se ha eliminado.
Registro de descubrimiento del Gateway
api.registerGatewayDiscoveryService(...) permite que un plugin anuncie el Gateway activo
en un transporte de descubrimiento local como mDNS/Bonjour. OpenClaw llama al
servicio durante el arranque del Gateway cuando el descubrimiento local está habilitado, pasa los
puertos actuales del Gateway y datos de sugerencia TXT no secretos, y llama al manejador
stop devuelto durante el apagado del Gateway.
api.registerGatewayDiscoveryService({
id: "my-discovery",
async advertise(ctx) {
const handle = await startMyAdvertiser({
gatewayPort: ctx.gatewayPort,
tls: ctx.gatewayTlsEnabled,
displayName: ctx.machineDisplayName,
});
return { stop: () => handle.stop() };
},
});
Los plugins de descubrimiento del Gateway no deben tratar los valores TXT anunciados como secretos ni autenticación. El descubrimiento es una sugerencia de enrutamiento; la autenticación del Gateway y la fijación de TLS siguen siendo responsables de la confianza.
Metadatos de registro de la CLI
api.registerCli(registrar, opts?) acepta dos tipos de metadatos de nivel superior:
commands: raíces de comandos explícitas propiedad del registradordescriptors: descriptores de comandos en tiempo de análisis usados para la ayuda de la CLI raíz, el enrutamiento y el registro diferido de la CLI del plugin
Si quieres que un comando de plugin permanezca cargado de forma diferida en la ruta normal de la CLI raíz,
proporciona descriptors que cubran cada raíz de comando de nivel superior expuesta por ese
registrador.
api.registerCli(
async ({ program }) => {
const { registerMatrixCli } = await import("./src/cli.js");
registerMatrixCli({ program });
},
{
descriptors: [
{
name: "matrix",
description: "Manage Matrix accounts, verification, devices, and profile state",
hasSubcommands: true,
},
],
},
);
Usa commands por sí solo únicamente cuando no necesites el registro diferido de la CLI raíz.
Esa ruta de compatibilidad inmediata sigue siendo compatible, pero no instala
marcadores de posición respaldados por descriptores para la carga diferida en tiempo de análisis.
Registro de backend de la CLI
api.registerCliBackend(...) permite que un plugin sea propietario de la configuración predeterminada de un backend local
de CLI de IA como codex-cli.
- El
iddel backend se convierte en el prefijo de proveedor en referencias de modelo comocodex-cli/gpt-5. - La
configdel backend usa la misma forma queagents.defaults.cliBackends.<id>. - La configuración de usuario sigue teniendo prioridad. OpenClaw fusiona
agents.defaults.cliBackends.<id>sobre el valor predeterminado del plugin antes de ejecutar la CLI. - Usa
normalizeConfigcuando un backend necesite reescrituras de compatibilidad después de la fusión (por ejemplo, normalizar formas antiguas de flags). - Usa
resolveExecutionArgspara reescrituras de argv con alcance de solicitud que pertenezcan al dialecto de la CLI, como asignar los niveles de pensamiento de OpenClaw a un flag nativo de esfuerzo.
Slots exclusivos
| Método | Qué registra |
|---|---|
api.registerContextEngine(id, factory) |
Motor de contexto (uno activo a la vez). El callback assemble() recibe availableTools y citationsMode para que el motor pueda adaptar las adiciones al prompt. |
api.registerMemoryCapability(capability) |
Capacidad de memoria unificada |
api.registerMemoryPromptSection(builder) |
Constructor de sección de prompt de memoria |
api.registerMemoryFlushPlan(resolver) |
Resolvedor de plan de vaciado de memoria |
api.registerMemoryRuntime(runtime) |
Adaptador de runtime de memoria |
Adaptadores de embeddings de memoria
| Método | Qué registra |
|---|---|
api.registerMemoryEmbeddingProvider(adapter) |
Adaptador de embeddings de memoria para el plugin activo |
registerMemoryCapabilityes la API exclusiva preferida para plugins de memoria.registerMemoryCapabilitytambién puede exponerpublicArtifacts.listArtifacts(...)para que los plugins complementarios puedan consumir artefactos de memoria exportados medianteopenclaw/plugin-sdk/memory-host-coreen lugar de acceder al diseño privado de un plugin de memoria específico.registerMemoryPromptSection,registerMemoryFlushPlanyregisterMemoryRuntimeson API exclusivas de plugins de memoria compatibles con legado.MemoryFlushPlan.modelpuede fijar el turno de vaciado a una referencia exacta deprovider/modelcomoollama/qwen3:8b, sin heredar la cadena de fallback activa.registerMemoryEmbeddingProviderpermite que el plugin de memoria activo registre uno o más ids de adaptador de embeddings (por ejemploopenai,geminio un id personalizado definido por el plugin).- La configuración de usuario como
agents.defaults.memorySearch.provideryagents.defaults.memorySearch.fallbackse resuelve contra esos ids de adaptador registrados.
Eventos y ciclo de vida
| Método | Qué hace |
|---|---|
api.on(hookName, handler, opts?) |
Hook de ciclo de vida tipado |
api.onConversationBindingResolved(handler) |
Callback de enlace de conversación |
Consulta Hooks de Plugin para ver ejemplos, nombres de hooks comunes y semánticas de protección.
Semántica de decisiones de hooks
before_tool_call: devolver{ block: true }es terminal. Una vez que cualquier manejador lo establece, los manejadores de menor prioridad se omiten.before_tool_call: devolver{ block: false }se trata como ausencia de decisión (igual que omitirblock), no como una anulación.before_install: devolver{ block: true }es terminal. Una vez que cualquier manejador lo establece, los manejadores de menor prioridad se omiten.before_install: devolver{ block: false }se trata como ausencia de decisión (igual que omitirblock), no como una anulación.reply_dispatch: devolver{ handled: true, ... }es terminal. Una vez que cualquier manejador reclama el despacho, los manejadores de menor prioridad y la ruta predeterminada de despacho del modelo se omiten.message_sending: devolver{ cancel: true }es terminal. Una vez que cualquier manejador lo establece, los manejadores de menor prioridad se omiten.message_sending: devolver{ cancel: false }se trata como ausencia de decisión (igual que omitircancel), no como una anulación.message_received: usa el campo tipadothreadIdcuando necesites enrutamiento entrante por hilo/tema. Manténmetadatapara extras específicos del canal.message_sending: usa los campos tipados de enrutamientoreplyToId/threadIdantes de recurrir ametadataespecífico del canal.gateway_start: usactx.config,ctx.workspaceDiryctx.getCron?.()para el estado de arranque propiedad del gateway en lugar de depender de hooks internosgateway:startup.cron_changed: observa los cambios de ciclo de vida de Cron propiedad del gateway. Usaevent.job?.state?.nextRunAtMsyctx.getCron?.()al sincronizar programadores de activación externos, y mantén OpenClaw como la fuente de verdad para las comprobaciones de vencimiento y la ejecución.
Campos del objeto API
| Campo | Tipo | Descripción |
|---|---|---|
api.id |
string |
Id del plugin |
api.name |
string |
Nombre visible |
api.version |
string? |
Versión del plugin (opcional) |
api.description |
string? |
Descripción del plugin (opcional) |
api.source |
string |
Ruta de origen del plugin |
api.rootDir |
string? |
Directorio raíz del plugin (opcional) |
api.config |
OpenClawConfig |
Snapshot de configuración actual (snapshot de runtime en memoria activo cuando esté disponible) |
api.pluginConfig |
Record<string, unknown> |
Configuración específica del plugin desde plugins.entries.<id>.config |
api.runtime |
PluginRuntime |
Helpers de runtime |
api.logger |
PluginLogger |
Logger con alcance (debug, info, warn, error) |
api.registrationMode |
PluginRegistrationMode |
Modo de carga actual; "setup-runtime" es la ventana ligera de arranque/configuración previa a la entrada completa |
api.resolvePath(input) |
(string) => string |
Resuelve la ruta relativa a la raíz del plugin |
Convención de módulos internos
Dentro de tu plugin, usa archivos barrel locales para las importaciones internas:
my-plugin/
api.ts # Public exports for external consumers
runtime-api.ts # Internal-only runtime exports
index.ts # Plugin entry point
setup-entry.ts # Lightweight setup-only entry (optional)
Las superficies públicas de plugins incluidos cargadas por fachada (api.ts, runtime-api.ts,
index.ts, setup-entry.ts y archivos de entrada públicos similares) prefieren el
snapshot de configuración de runtime activo cuando OpenClaw ya se está ejecutando. Si todavía no existe ningún snapshot
de runtime, recurren al archivo de configuración resuelto en disco.
Las fachadas de plugins incluidos empaquetados deben cargarse mediante los cargadores de fachadas de plugins de
OpenClaw; las importaciones directas desde dist/extensions/... omiten el manifiesto
y las comprobaciones de sidecar de runtime que las instalaciones empaquetadas usan para código propiedad del plugin.
Los plugins de proveedor pueden exponer un barrel de contrato estrecho y local al plugin cuando un helper es intencionalmente específico del proveedor y aún no pertenece a una subruta genérica del SDK. Ejemplos incluidos:
- Anthropic: superficie pública
api.ts/contract-api.tspara helpers de streaming de beta-header de Claude yservice_tier. @openclaw/openai-provider:api.tsexporta constructores de proveedor, helpers de modelo predeterminado y constructores de proveedor en tiempo real.@openclaw/openrouter-provider:api.tsexporta el constructor de proveedor junto con helpers de onboarding/configuración.
Relacionado
Opciones de definePluginEntry y defineChannelPluginEntry.
Referencia completa del espacio de nombres api.runtime.
Empaquetado, manifiestos y esquemas de configuración.
Utilidades de prueba y reglas de lint.
Migración desde superficies obsoletas.
Arquitectura detallada y modelo de capacidades.