Plugin SDK reference
Descripción general del SDK de plugins
El SDK de plugins es el contrato tipado entre los plugins y el núcleo. Esta página es la referencia sobre qué importar y qué puede registrar.
Convención de importación
Importe siempre desde una subruta específica:
Cada subruta es un módulo pequeño y autónomo. Esto mantiene rápido el inicio y
evita problemas de dependencias circulares. Para los auxiliares de entrada y compilación específicos de canales,
prefiera openclaw/plugin-sdk/channel-core; reserve openclaw/plugin-sdk/core para
la superficie general más amplia y los auxiliares compartidos, como
buildChannelConfigSchema.
Para la configuración de canales, publique el JSON Schema propiedad del canal mediante
openclaw.plugin.json#channelConfigs. La subruta plugin-sdk/channel-config-schema
es para las primitivas compartidas del esquema y el constructor genérico. Los plugins
incluidos con OpenClaw usan plugin-sdk/bundled-channel-config-schema para los esquemas
conservados de canales incluidos. Las exportaciones de compatibilidad obsoletas permanecen en
plugin-sdk/channel-config-schema-legacy; ninguna de las subrutas de esquemas incluidos es un
patrón para plugins nuevos.
Referencia de subrutas
El SDK de plugins se expone como un conjunto de subrutas específicas agrupadas por área (entrada del plugin, canal, proveedor, autenticación, tiempo de ejecución, capacidad, memoria y auxiliares reservados para plugins incluidos). Para consultar el catálogo completo, agrupado y con enlaces, consulte Subrutas del SDK de plugins.
El inventario de puntos de entrada del compilador se encuentra en
scripts/lib/plugin-sdk-entrypoints.json; las exportaciones de paquetes se generan a partir
del subconjunto público después de restar las subrutas internas o de prueba locales del repositorio indicadas en
scripts/lib/plugin-sdk-private-local-only-subpaths.json. Ejecute
pnpm plugin-sdk:surface para auditar la cantidad de exportaciones públicas. Las
subrutas públicas obsoletas que tienen suficiente antigüedad y no se usan en el código de producción de las extensiones incluidas se
registran en scripts/lib/plugin-sdk-deprecated-public-subpaths.json; los módulos de exportación amplios
y obsoletos de reexportación se registran en
scripts/lib/plugin-sdk-deprecated-barrel-subpaths.json.
API de registro
La función de retorno register(api) recibe un objeto OpenClawPluginApi con estos
métodos:
Registro de capacidades
| Método | Qué registra |
|---|---|
api.registerProvider(...) |
Inferencia de texto (LLM) |
api.registerWorkerProvider(...) |
Arrendamientos del ciclo de vida de trabajadores en la nube |
api.registerModelCatalogProvider(...) |
Filas del catálogo de modelos para la generación de texto y contenido multimedia |
api.registerAgentHarness(...) |
Ejecutor nativo de agentes experimental (Codex, Copilot) |
api.registerCliBackend(...) |
Backend local de inferencia mediante CLI |
api.registerChannel(...) |
Canal de mensajería |
api.registerEmbeddingProvider(...) |
Proveedor reutilizable de incrustaciones vectoriales |
api.registerSpeechProvider(...) |
Síntesis de texto a voz / STT |
api.registerRealtimeTranscriptionProvider(...) |
Transcripción en tiempo real mediante transmisión continua |
api.registerRealtimeVoiceProvider(...) |
Sesiones de voz dúplex en tiempo real |
api.registerMediaUnderstandingProvider(...) |
Análisis de imágenes, audio y vídeo |
api.registerTranscriptSourceProvider(...) |
Fuente de transcripciones de reuniones en directo o importadas |
api.registerImageGenerationProvider(...) |
Generación de imágenes |
api.registerMusicGenerationProvider(...) |
Generación de música |
api.registerVideoGenerationProvider(...) |
Generación de vídeo |
api.registerWebFetchProvider(...) |
Proveedor de obtención y extracción de contenido web |
api.registerWebSearchProvider(...) |
Búsqueda web |
api.registerCompactionProvider(...) |
Backend conectable de Compaction de transcripciones |
Los proveedores de trabajadores también deben declarar su identificador en contracts.workerProviders.
El núcleo conserva la intención duradera antes de provision(profile, operationId). Los proveedores validan la configuración antes de la asignación externa y lanzan WorkerProviderError cuando un perfil se rechaza de forma permanente. provision debe adoptar el mismo arrendamiento cuando se repita el identificador de operación.
El núcleo conserva con el arrendamiento la configuración validada del perfil y proporciona esa instantánea a destroy({ leaseId, profile }), que debe ser idempotente, y a inspect({ leaseId, profile }), que devuelve active, destroyed o unknown. Esto permite que los proveedores enruten las llamadas del ciclo de vida después de reiniciar el Gateway o eliminar un perfil con nombre. Los puntos de conexión SSH usan un SecretRef para keyRef, nunca material de clave insertado directamente, e incluyen un hostKey procedente de resultados de aprovisionamiento de confianza con el formato exacto algorithm base64, sin nombre de host ni comentario. El núcleo fija hostKey y nunca confía en una clave obtenida de la primera conexión. Un proveedor que genere un keyRef dinámico puede implementar resolveSshIdentity({ leaseId, profile, keyRef }); cuando está presente, ese resolvedor es la autoridad, mientras que los proveedores que no lo tengan usan el resolvedor genérico de secretos configurado.
Los proveedores con arrendamientos renovables también pueden implementar renew(leaseId).
inspect debe lanzar un error ante fallos transitorios o indeterminados; solo debe devolver unknown cuando la ausencia sea definitiva. El núcleo marca como huérfano un registro local activo o considera la ausencia como la finalización del desmontaje después de una solicitud de destrucción conservada.
Los proveedores de incrustaciones registrados con api.registerEmbeddingProvider(...) también deben
figurar en contracts.embeddingProviders en el manifiesto del plugin. Esta
es la superficie genérica de incrustaciones para la generación reutilizable de vectores. La búsqueda en memoria
puede utilizar esta superficie genérica de proveedores. La interfaz anterior
api.registerMemoryEmbeddingProvider(...) y
contracts.memoryEmbeddingProviders es una compatibilidad obsoleta mientras
migran los proveedores existentes específicos de memoria.
Los proveedores específicos de memoria que todavía exponen un batchEmbed(...) en tiempo de ejecución mantienen
el contrato existente de procesamiento por lotes por archivo, a menos que su tiempo de ejecución establezca explícitamente
sourceWideBatchEmbed: true. Esta habilitación permite que el host de memoria envíe fragmentos de
varios archivos de memoria modificados y fuentes habilitadas en una sola llamada a batchEmbed(...),
hasta los límites de lote del host. Los adaptadores de lotes que cargan archivos de solicitudes JSONL deben
dividir los trabajos del proveedor antes de alcanzar tanto el límite de tamaño de carga como
el límite de cantidad de solicitudes. El proveedor debe devolver una incrustación por cada fragmento de entrada en el mismo orden que
batch.chunks; omita la opción cuando el proveedor espere lotes locales por archivo o
no pueda conservar el orden de entrada en un trabajo más amplio que abarque toda la fuente.
Herramientas y comandos
Use defineToolPlugin para plugins sencillos que solo proporcionan herramientas
con nombres de herramientas fijos. Use api.registerTool(...) directamente para plugins mixtos
o para el registro completamente dinámico de herramientas.
| Método | Qué registra |
|---|---|
api.registerTool(tool, opts?) |
Herramienta del agente (obligatoria o { optional: true }) |
api.registerCommand(def) |
Comando personalizado (omite el LLM) |
api.registerNodeHostCommand(command) |
Comando gestionado por openclaw node run; los metadatos opcionales agentTool pueden exponerlo como una herramienta visible para el agente mientras el Node está conectado |
Los comandos de los plugins pueden establecer agentPromptGuidance cuando el agente necesite una breve
indicación de enrutamiento propiedad del comando. Mantenga ese texto centrado en el propio comando; no añada
políticas específicas de proveedores o plugins a los constructores de prompts del núcleo.
Las entradas de orientación pueden ser cadenas heredadas, que se aplican a todas las superficies de prompts, o entradas estructuradas:
agentPromptGuidance: [ "Indicación global del comando.", { text: "Mostrar esto solo en el prompt principal de OpenClaw.", surfaces: ["openclaw_main"] },];Los valores estructurados de surfaces pueden incluir openclaw_main, codex_app_server,
cli_backend, acp_backend o subagent. pi_main sigue siendo un alias obsoleto
de openclaw_main. Omita surfaces para aplicar intencionadamente la orientación a todas las superficies. No
pase un arreglo surfaces vacío; se rechaza para evitar que una pérdida accidental del ámbito
convierta el texto en contenido global del prompt.
Las instrucciones para desarrolladores del servidor de aplicaciones nativo de Codex son más estrictas que las de otras superficies de
prompts: solo la orientación cuyo ámbito incluya explícitamente codex_app_server se promueve a
ese canal de mayor prioridad. La orientación mediante cadenas heredadas y la orientación estructurada sin ámbito
siguen estando disponibles para superficies de prompts que no sean de Codex por motivos de compatibilidad.
Los comandos del host Node se ejecutan en el host Node conectado, no dentro del
proceso del Gateway. Si agentTool está presente, el Node publica un descriptor
después de conectarse correctamente al Gateway; el Gateway lo expone a las
ejecuciones del agente solo mientras ese Node esté conectado y únicamente si el
command del descriptor forma parte de la superficie de comandos aprobados del
Node. Configure agentTool.defaultPlatforms para incluir un comando no peligroso
en la lista de permitidos predeterminada de comandos del Node; de lo contrario,
se requiere una configuración explícita de gateway.nodes.allowCommands o una
política de invocación de Node. agentTool.name debe ser seguro para el
proveedor: debe comenzar con una letra, usar únicamente letras, dígitos, guiones
bajos o guiones, y no superar los 64 caracteres. Las herramientas del Node
respaldadas por MCP pueden establecer metadatos agentTool.mcp para que las
superficies de catálogo y búsqueda de herramientas puedan mostrar la identidad
del servidor o la herramienta MCP remotos, pero la ejecución sigue realizándose
mediante el comando del Node anunciado.
Infraestructura
| Método | Qué registra |
|---|---|
api.registerHook(events, handler, opts?) |
Hook de eventos |
api.registerHttpRoute(params) |
Endpoint HTTP del Gateway |
api.registerGatewayMethod(name, handler) |
Método RPC del Gateway |
api.registerGatewayDiscoveryService(service) |
Anunciante de descubrimiento del Gateway local |
api.registerCli(registrar, opts?) |
Subcomando de la CLI |
api.registerNodeCliFeature(registrar, opts?) |
Funcionalidad de la CLI del Node bajo openclaw nodes |
api.registerService(service) |
Servicio en segundo plano |
api.registerInteractiveHandler(registration) |
Controlador interactivo |
api.registerAgentToolResultMiddleware(...) |
Middleware de resultados de herramientas en tiempo de ejecución |
api.registerMemoryPromptSupplement(builder) |
Sección adicional del prompt relacionada con la memoria |
api.registerMemoryCorpusSupplement(adapter) |
Corpus adicional de búsqueda y lectura de memoria |
api.registerHostedMediaResolver(resolver) |
Resolutor de URL de contenido multimedia alojado al estilo de un navegador |
api.registerTextTransforms(transforms) |
Reescrituras de texto para compatibilidad de prompts y mensajes del Plugin |
api.registerConfigMigration(migrate) |
Migración ligera de configuración ejecutada antes de cargar el runtime del Plugin |
api.registerMigrationProvider(provider) |
Importador para openclaw migrate |
api.registerAutoEnableProbe(probe) |
Sondeo de configuración que puede habilitar automáticamente este Plugin |
api.registerReload(registration) |
Política de prefijos de configuración de reinicio, recarga en caliente o sin operación para gestionar recargas |
api.registerNodeHostCommand(command) |
Controlador de comandos expuesto a los Nodes emparejados |
api.registerNodeInvokePolicy(policy) |
Política de lista de permitidos o aprobación para comandos invocados por Nodes |
api.registerSecurityAuditCollector(collector) |
Recopilador de hallazgos para openclaw security audit |
Los constructores de suplementos del prompt de memoria reciben el contexto
opcional agentId, agentSessionKey y sandboxed. Las llamadas search y
get de suplementos del corpus de memoria reciben el contexto opcional
agentId y sandboxed. Los Plugins con almacenamiento propiedad del agente
deben resolver dicho almacenamiento en cada llamada, en lugar de capturar una
única ruta global durante el registro. Si se requiere un identificador de agente
pero falta en una operación multiagente, se debe denegar la operación de forma
segura en lugar de elegir un agente arbitrario.
Los controladores interactivos de Telegram pueden devolver { submitText }
para dirigir el texto por la ruta normal de entrada del agente de Telegram
después de que el controlador finalice correctamente. OpenClaw conserva el botón
de devolución de llamada cuando la política de entrada omite el texto o falla el
procesamiento, para que el usuario pueda volver a intentarlo cuando cambie la
condición de bloqueo. Este campo de resultado es específico de Telegram; los
demás canales conservan sus propios contratos de resultados interactivos.
Hooks del host para Plugins de flujo de trabajo
Los hooks del host son los puntos de integración del SDK para los Plugins que necesitan participar en el ciclo de vida del host, en lugar de limitarse a añadir un proveedor, canal o herramienta. Son contratos genéricos; el modo de planificación puede utilizarlos, al igual que los flujos de aprobación, las puertas de políticas del espacio de trabajo, los monitores en segundo plano, los asistentes de configuración y los Plugins complementarios de la interfaz de usuario.
| Método | Contrato que controla |
|---|---|
api.session.state.registerSessionExtension(...) |
Estado de sesión propiedad del Plugin, compatible con JSON y proyectado mediante las sesiones del Gateway |
api.session.workflow.enqueueNextTurnInjection(...) |
Contexto persistente y de ejecución exactamente una vez que se inyecta en el siguiente turno del agente para una sesión |
api.registerTrustedToolPolicy(...) |
Política de herramientas de confianza, condicionada por el manifiesto y anterior a los Plugins, que puede bloquear o reescribir parámetros de herramientas |
api.registerToolMetadata(...) |
Metadatos de visualización del catálogo de herramientas sin modificar la implementación de la herramienta |
api.registerCommand(...) |
Comandos del Plugin con ámbito definido; los resultados de los comandos pueden establecer continueAgent: true o suppressReply: true; los comandos nativos de Discord admiten descriptionLocalizations |
api.session.controls.registerControlUiDescriptor(...) |
Descriptores de contribuciones a la interfaz de control para superficies de sesión, herramienta, ejecución, ajustes o pestañas |
api.lifecycle.registerRuntimeLifecycle(...) |
Funciones de limpieza para recursos del runtime propiedad del Plugin en rutas de restablecimiento, eliminación o recarga |
api.agent.events.registerAgentEventSubscription(...) |
Suscripciones a eventos saneados para el estado y los monitores de los flujos de trabajo |
api.runContext.setRunContext(...) / getRunContext(...) / clearRunContext(...) |
Estado temporal del Plugin por ejecución que se elimina al finalizar el ciclo de vida de la ejecución |
api.session.workflow.registerSessionSchedulerJob(...) |
Metadatos de limpieza para tareas del programador propiedad del Plugin; no programa trabajo ni crea registros de tareas |
api.session.workflow.sendSessionAttachment(...) |
Entrega de archivos adjuntos mediada por el host y exclusiva de Plugins incluidos, a la ruta activa de salida directa de la sesión |
api.session.workflow.scheduleSessionTurn(...) / unscheduleSessionTurnsByTag(...) |
Turnos de sesión programados, respaldados por Cron y exclusivos de Plugins incluidos, además de limpieza basada en etiquetas |
api.session.controls.registerSessionAction(...) |
Acciones de sesión tipadas que los clientes pueden enviar mediante el Gateway |
Un descriptor surface: "tab" añade una pestaña a la barra lateral de la
interfaz de control. Los descriptores de pestañas de los Plugins activos se
anuncian a los clientes del panel en el saludo del Gateway (controlUiTabs), por
lo que la pestaña solo aparece mientras el Plugin está habilitado. Los Plugins
incluidos pueden proporcionar una vista de panel de primera clase para su
pestaña; otros Plugins pueden establecer path en una ruta HTTP del Plugin
(consulte api.registerHttpRoute(...)) que el panel representa en un marco
aislado. icon es una sugerencia de nombre de icono del panel, group selecciona
la sección de la barra lateral (control o agent), order determina el orden
entre las pestañas de los Plugins y requiredScopes oculta la pestaña en las
conexiones que carecen de esos ámbitos de operador:
api.session.controls.registerControlUiDescriptor({ surface: "tab", id: "logbook", label: "Logbook", description: "Your day as a timeline, built from screen snapshots.", icon: "sun", group: "control", requiredScopes: ["operator.write"],});Utilice los espacios de nombres agrupados para el código nuevo de Plugins:
api.session.state.registerSessionExtension(...)api.session.workflow.enqueueNextTurnInjection(...)api.session.workflow.registerSessionSchedulerJob(...)api.session.workflow.sendSessionAttachment(...)api.session.workflow.scheduleSessionTurn(...)api.session.workflow.unscheduleSessionTurnsByTag(...)api.session.controls.registerSessionAction(...)api.session.controls.registerControlUiDescriptor(...)api.agent.events.registerAgentEventSubscription(...)api.agent.events.emitAgentEvent(...)api.runContext.setRunContext(...)/getRunContext(...)/clearRunContext(...)api.lifecycle.registerRuntimeLifecycle(...)
Los métodos planos equivalentes siguen disponibles como alias de compatibilidad
obsoletos para los Plugins existentes. No añada código nuevo de Plugins que
llame directamente a api.registerSessionExtension,
api.enqueueNextTurnInjection, api.registerControlUiDescriptor,
api.registerRuntimeLifecycle, api.registerAgentEventSubscription,
api.emitAgentEvent, api.setRunContext, api.getRunContext,
api.clearRunContext, api.registerSessionSchedulerJob,
api.registerSessionAction, api.sendSessionAttachment,
api.scheduleSessionTurn o api.unscheduleSessionTurnsByTag.
scheduleSessionTurn(...) es una función práctica con ámbito de sesión basada
en el programador Cron del Gateway. Cron controla la temporización y crea el
registro de la tarea en segundo plano cuando se ejecuta el turno; el SDK del
Plugin solo limita la sesión de destino, la nomenclatura propiedad del Plugin y
la limpieza. Utilice api.runtime.tasks.managedFlows dentro del turno programado
cuando el trabajo en sí necesite un estado persistente de flujo de tareas de
varios pasos.
Los contratos separan la autoridad de forma intencionada:
- Los Plugins externos pueden controlar las extensiones de sesión, los descriptores de la interfaz de usuario, los comandos, los metadatos de las herramientas, las inyecciones del turno siguiente y los hooks normales.
- Las políticas de herramientas de confianza se ejecutan antes que los hooks
before_tool_callnormales y son de confianza para el host. Las políticas incluidas se ejecutan primero; las políticas de Plugins instalados requieren una habilitación explícita y sus identificadores locales encontracts.trustedToolPolicies, y se ejecutan a continuación según el orden de carga de los Plugins. Los identificadores de políticas están circunscritos al Plugin que los registra. - La propiedad de los comandos reservados es exclusiva de los componentes incluidos. Los Plugins externos deben utilizar sus propios nombres de comandos o alias.
allowPromptInjection=falsedeshabilita los hooks que modifican el prompt, incluidosagent_turn_prepare,before_prompt_build,heartbeat_prompt_contribution, los campos de prompt delbefore_agent_startheredado yenqueueNextTurnInjection.
Ejemplos de consumidores ajenos al modo de planificación:
| Arquetipo de plugin | Hooks utilizados |
|---|---|
| Flujo de trabajo de aprobación | Extensión de sesión, continuación de comandos, inyección en el siguiente turno, descriptor de interfaz de usuario |
| Control de política de presupuesto/espacio de trabajo | Política de herramientas de confianza, metadatos de herramientas, proyección de sesión |
| Monitor del ciclo de vida en segundo plano | Limpieza del ciclo de vida del entorno de ejecución, suscripción a eventos del agente, propiedad/limpieza del planificador de sesiones, contribución al prompt de Heartbeat, descriptor de interfaz de usuario |
| Asistente de configuración o incorporación | Extensión de sesión, comandos con ámbito, descriptor de la interfaz de usuario de control |
Cuándo usar middleware de resultados de herramientas
Los plugins incluidos y los plugins instalados habilitados explícitamente cuyos
contratos de manifiesto coincidan pueden usar api.registerAgentToolResultMiddleware(...) cuando
necesiten reescribir el resultado de una herramienta después de su ejecución y antes de que el entorno de ejecución
devuelva ese resultado al modelo. Este es el punto de integración de confianza e independiente del entorno de ejecución
para reductores de salida asíncronos como tokenjuice.
Los plugins deben declarar contracts.agentToolResultMiddleware para cada entorno de ejecución de destino,
por ejemplo ["openclaw", "codex"]. Los plugins instalados sin ese
contrato, o sin habilitación explícita, no pueden registrar este middleware; conserva
los hooks normales de los plugins de OpenClaw para tareas que no necesiten procesar el resultado
de una herramienta antes de enviarlo al modelo. Se ha eliminado la antigua
ruta de registro de fábricas de extensiones exclusiva del ejecutor integrado.
Registro de descubrimiento del Gateway
api.registerGatewayDiscoveryService(...) permite que un plugin anuncie el
Gateway activo mediante un transporte de descubrimiento local, como mDNS/Bonjour. OpenClaw llama al
servicio durante el inicio del Gateway cuando el descubrimiento local está habilitado, proporciona los
puertos actuales del Gateway y los datos de indicación TXT no secretos, y llama al controlador
stop devuelto durante el cierre 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 como autenticación. El descubrimiento es una indicación 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 comandos:
commands: nombres de comandos explícitos propiedad del registradordescriptors: descriptores de comandos usados durante el análisis para la ayuda de la CLI, el enrutamiento y el registro diferido de la CLI del pluginparentPath: ruta opcional del comando principal para grupos de comandos anidados, como["nodes"]
Para funciones de nodos emparejados, se prefiere
api.registerNodeCliFeature(registrar, opts?). Es un pequeño contenedor de
api.registerCli(..., { parentPath: ["nodes"] }) y explicita que comandos como
openclaw nodes canvas son funciones de nodo propiedad del plugin.
Si quieres que un comando de plugin mantenga la carga diferida en la ruta raíz normal de la CLI,
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: "Administrar cuentas, verificación, dispositivos y estado del perfil de Matrix", hasSubcommands: true, }, ], },);Los comandos anidados reciben el comando principal resuelto como program:
api.registerCli( async ({ program }) => { const { registerNodesCanvasCommands } = await import("./src/cli.js"); registerNodesCanvasCommands(program); }, { parentPath: ["nodes"], descriptors: [ { name: "canvas", description: "Capturar o renderizar contenido del lienzo desde un nodo emparejado", hasSubcommands: true, }, ], },);Usa commands por sí solo únicamente cuando no necesites el registro diferido de la CLI raíz.
Esa ruta de compatibilidad con carga inmediata sigue siendo compatible, pero no instala
marcadores de posición respaldados por descriptores para la carga diferida durante el análisis.
Registro de backends de la CLI
api.registerCliBackend(...) permite que un plugin controle la configuración predeterminada de un
backend local de CLI de IA, como claude-cli o my-cli.
- El
iddel backend se convierte en el prefijo del proveedor en referencias de modelos comomy-cli/gpt-5. - La
configdel backend usa la misma estructura queagents.defaults.cliBackends.<id>. - La configuración del usuario sigue teniendo prioridad. OpenClaw combina
agents.defaults.cliBackends.<id>sobre la configuración predeterminada del plugin antes de ejecutar la CLI. - Usa
normalizeConfigcuando un backend necesite reescrituras de compatibilidad después de la combinación (por ejemplo, para normalizar formatos antiguos de indicadores). - Usa
resolveExecutionArgspara reescrituras de argv con ámbito de solicitud que pertenezcan al dialecto de la CLI, como asignar los niveles de razonamiento de OpenClaw a un indicador de esfuerzo nativo. El hook recibectx.executionMode; usa"side-question"para añadir indicadores de aislamiento nativos del backend en llamadas efímeras de/btw. Si esos indicadores deshabilitan de forma fiable las herramientas nativas para una CLI que, de otro modo, siempre las tendría activadas, declara tambiénsideQuestionToolMode: "disabled". - Los backends que puedan deshabilitar todas las herramientas nativas para una ejecución específica pueden declarar
nativeToolMode: "selectable". Las llamadas restringidas pasan una tuplactx.toolAvailability.nativevacía junto con una lista exacta de permitidos de MCP aislada del host;resolveExecutionArgsdebe aplicar ambas en el argv final de una ejecución nueva o reanudada. OpenClaw produce un fallo seguro si el backend no puede hacerlo.
Para consultar una guía de creación integral, consulta plugins de backend de la CLI.
Espacios exclusivos
| Método | Qué registra |
|---|---|
api.registerContextEngine(id, factory) |
Motor de contexto (uno activo a la vez). Las devoluciones de llamada del ciclo de vida reciben runtimeSettings cuando el host puede proporcionar diagnósticos de modelo/proveedor/modo; los motores estrictos antiguos se reintentan sin esa clave. |
api.registerMemoryCapability(capability) |
Capacidad de memoria unificada |
api.registerMemoryPromptSection(builder) |
Constructor de la sección de memoria del prompt |
api.registerMemoryFlushPlan(resolver) |
Resolutor del plan de volcado de memoria |
api.registerMemoryRuntime(runtime) |
Adaptador del entorno de ejecución de memoria |
Adaptadores obsoletos 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 a la estructura privada de un plugin de memoria específico.registerMemoryPromptSection,registerMemoryFlushPlanyregisterMemoryRuntimeson API exclusivas para plugins de memoria compatibles con sistemas heredados.MemoryFlushPlan.modelpuede fijar el turno de volcado a una referencia exacta deprovider/model, comoollama/qwen3:8b, sin heredar la cadena de alternativas activa.registerMemoryEmbeddingProviderestá obsoleto. Los nuevos proveedores de embeddings deben usarapi.registerEmbeddingProvider(...)ycontracts.embeddingProviders.- Los proveedores existentes específicos de memoria siguen funcionando durante el período de migración, pero la inspección de plugins lo notifica como deuda de compatibilidad para los plugins no incluidos.
Eventos y ciclo de vida
| Método | Qué hace |
|---|---|
api.on(hookName, handler, opts?) |
Hook de ciclo de vida con tipos |
api.onConversationBindingResolved(handler) |
Devolución de llamada de vinculación de conversación |
Consulta Hooks de plugins para ver ejemplos, nombres habituales de hooks y la semántica de las protecciones.
Semántica de decisión de los hooks
before_install es un hook del ciclo de vida del entorno de ejecución del plugin, no la
superficie de políticas de instalación del operador. Usa security.installPolicy cuando una decisión de
permitir/bloquear deba abarcar las rutas de instalación o actualización de la CLI y las respaldadas por el Gateway.
before_tool_call: devolver{ block: true }es terminal. Una vez que cualquier controlador lo establece, se omiten los controladores de menor prioridad.before_tool_call: devolver{ block: false }se considera que no hay decisión (igual que omitirblock), no una sobrescritura.before_install: devolver{ block: true }es terminal. Una vez que cualquier controlador lo establece, se omiten los controladores de menor prioridad.before_install: devolver{ block: false }se considera que no hay decisión (igual que omitirblock), no una sobrescritura.reply_dispatch: devolver{ handled: true, ... }es terminal. Una vez que cualquier controlador asume el despacho, se omiten los controladores de menor prioridad y la ruta predeterminada de despacho al modelo.message_sending: devolver{ cancel: true }es terminal. Una vez que cualquier controlador lo establece, se omiten los controladores de menor prioridad.message_sending: devolver{ cancel: false }se considera que no hay decisión (igual que omitircancel), no una sobrescritura.message_received: usa el campo tipadothreadIdcuando necesites enrutar hilos o temas entrantes. Reservametadatapara datos adicionales específicos del canal.message_sending: usa los campos de enrutamiento tipadosreplyToId/threadIdantes de recurrir ametadataespecífica del canal.gateway_start: usactx.config,ctx.workspaceDiryctx.getCron?.()para el estado de inicio que pertenece al Gateway, en lugar de depender de hooks internosgateway:startup. Cron podría seguir cargándose en este punto.cron_reconciled: reconstruye una proyección externa completa de Cron después del inicio o de una recarga del planificador. Incluyereasony el estado efectivoenabled, inclusoenabled: false, mientras quectx.getCron?.()devuelve el planificador reconciliado exacto. Pasactx.abortSignalal trabajo de proyección persistente; se cancela cuando esa instantánea del planificador se sustituye o se cierra el Gateway.cron_changed: observa los cambios del ciclo de vida de Cron que pertenece al Gateway. Los eventosscheduledyremovedson indicios de reconciliación posteriores a la confirmación, no un registro ordenado de diferencias. El campoevent.nextRunAtMsde un evento programado no está presente cuando la tarea no tiene una próxima activación; un evento eliminado sigue incluyendo la instantánea de la tarea eliminada.
Los planificadores de activación externos deben aplicar antirrebote o agrupar los eventos cron_changed
y después volver a leer la vista persistente completa desde el último planificador capturado por
cron_reconciled. No adoptes el planificador de un contexto cron_changed: un
indicio desacoplado de un planificador anterior puede solaparse con una recarga posterior.
Usa cron_reconciled como desencadenante de instantánea completa para el estado persistente cargado al
iniciar el Gateway o sustituir el planificador. No se reproduce durante una recarga en caliente
exclusiva de un Plugin. Los controladores de observación se ejecutan en paralelo y los
despachos sin espera pueden solaparse, por lo que los consumidores no deben depender del orden de finalización de los eventos.
Mantén OpenClaw como fuente de verdad para las comprobaciones de vencimiento y la ejecución.
Para consultar un adaptador de ejecución única con sustitución persistente, reintentos/espera incremental y cierre ordenado, consulta Proyección externa segura de Cron.
Campos del objeto de la API
| Campo | Tipo | Descripción |
|---|---|---|
api.id |
string |
Identificador del Plugin |
api.name |
string |
Nombre para mostrar |
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 |
Instantánea de la configuración actual (instantánea activa del entorno de ejecución en memoria, cuando está disponible) |
api.pluginConfig |
Record<string, unknown> |
Configuración específica del Plugin procedente de plugins.entries.<id>.config |
api.runtime |
PluginRuntime |
Utilidades del entorno de ejecución |
api.logger |
PluginLogger |
Registrador con ámbito (debug, info, warn, error) |
api.registrationMode |
PluginRegistrationMode |
Modo de carga actual; "setup-runtime" es la ventana ligera de inicio/configuración previa a la carga completa de la entrada |
api.resolvePath(input) |
(string) => string |
Resuelve una ruta relativa a la raíz del Plugin |
Convención de módulos internos
Dentro de tu Plugin, usa archivos de exportación agrupada locales para las importaciones internas:
my-plugin/ api.ts # Exportaciones públicas para consumidores externos runtime-api.ts # Exportaciones del entorno de ejecución solo para uso interno index.ts # Punto de entrada del Plugin setup-entry.ts # Entrada ligera solo para configuración (opcional)Las superficies públicas de los Plugins incluidos cargados mediante fachada (api.ts, runtime-api.ts,
index.ts, setup-entry.ts y archivos de entrada públicos similares) usan preferentemente la
instantánea de configuración activa del entorno de ejecución cuando OpenClaw ya está en ejecución. Si todavía no existe una
instantánea del entorno de ejecución, recurren al archivo de configuración resuelto en disco.
Las fachadas empaquetadas de Plugins incluidos deben cargarse mediante los cargadores de fachadas de
Plugins de OpenClaw; las importaciones directas desde dist/extensions/... omiten las comprobaciones del manifiesto
y del archivo auxiliar del entorno de ejecución que las instalaciones empaquetadas usan para el código que pertenece al Plugin.
Los Plugins de proveedor pueden exponer un archivo restringido de contrato local del Plugin cuando una utilidad es deliberadamente específica del proveedor y todavía no corresponde a una subruta genérica del SDK. Ejemplos incluidos:
- Anthropic: interfaz pública
api.ts/contract-api.tspara las utilidades de encabezados beta de Claude y del flujoservice_tier. @openclaw/openai-provider:api.tsexporta constructores de proveedores, utilidades del modelo predeterminado y constructores de proveedores en tiempo real.@openclaw/openrouter-provider:api.tsexporta el constructor del proveedor, además de utilidades de incorporación/configuración.
Contenido 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.