Plugins
Visão geral do SDK de Plugin
O SDK de plugin é o contrato tipado entre plugins e o core. Esta página é a referência para o que importar e o que você pode registrar.
Convenção de importação
Sempre importe de um subcaminho específico:
Cada subcaminho é um módulo pequeno e autocontido. Isso mantém a inicialização rápida e
evita problemas de dependência circular. Para helpers de entrada/build específicos de canal,
prefira openclaw/plugin-sdk/channel-core; mantenha openclaw/plugin-sdk/core para
a superfície guarda-chuva mais ampla e helpers compartilhados como
buildChannelConfigSchema.
Para configuração de canal, publique o JSON Schema pertencente ao canal por meio de
openclaw.plugin.json#channelConfigs. O subcaminho plugin-sdk/channel-config-schema
é para primitivas de esquema compartilhadas e o builder genérico. Os plugins
incluídos do OpenClaw usam plugin-sdk/bundled-channel-config-schema para esquemas
de canais incluídos preservados. Exportações de compatibilidade obsoletas permanecem em
plugin-sdk/channel-config-schema-legacy; nenhum subcaminho de esquema incluído é um
padrão para novos plugins.
Referência de subcaminhos
O SDK de plugin é exposto como um conjunto de subcaminhos estreitos agrupados por área (entrada de plugin, canal, provedor, auth, runtime, capability, memória e helpers reservados de plugins incluídos). Para o catálogo completo — agrupado e com links — consulte Subcaminhos do SDK de Plugin.
A lista gerada de mais de 200 subcaminhos fica em scripts/lib/plugin-sdk-entrypoints.json.
API de registro
O callback register(api) recebe um objeto OpenClawPluginApi com estes
métodos:
Registro de capability
| Método | O que ele registra |
|---|---|
api.registerProvider(...) |
Inferência de texto (LLM) |
api.registerAgentHarness(...) |
Executor experimental de agente de baixo nível |
api.registerCliBackend(...) |
Backend de inferência de CLI local |
api.registerChannel(...) |
Canal de mensagens |
api.registerSpeechProvider(...) |
Texto para fala / síntese STT |
api.registerRealtimeTranscriptionProvider(...) |
Transcrição em tempo real por streaming |
api.registerRealtimeVoiceProvider(...) |
Sessões de voz duplex em tempo real |
api.registerMediaUnderstandingProvider(...) |
Análise de imagem/áudio/vídeo |
api.registerImageGenerationProvider(...) |
Geração de imagens |
api.registerMusicGenerationProvider(...) |
Geração de música |
api.registerVideoGenerationProvider(...) |
Geração de vídeo |
api.registerWebFetchProvider(...) |
Provedor de busca / scrape na web |
api.registerWebSearchProvider(...) |
Pesquisa na web |
Ferramentas e comandos
| Método | O que ele registra |
|---|---|
api.registerTool(tool, opts?) |
Ferramenta de agente (obrigatória ou { optional: true }) |
api.registerCommand(def) |
Comando personalizado (ignora o LLM) |
Comandos de plugin podem definir agentPromptGuidance quando o agente precisa de uma dica curta de roteamento pertencente ao comando. Mantenha esse texto sobre o próprio comando; não adicione
política específica de provedor ou plugin aos builders de prompt do core.
Infraestrutura
| Método | O que ele registra |
|---|---|
api.registerHook(events, handler, opts?) |
Hook de evento |
api.registerHttpRoute(params) |
Endpoint HTTP do Gateway |
api.registerGatewayMethod(name, handler) |
Método RPC do Gateway |
api.registerGatewayDiscoveryService(service) |
Anunciante de descoberta do Gateway local |
api.registerCli(registrar, opts?) |
Subcomando da CLI |
api.registerNodeCliFeature(registrar, opts?) |
CLI de recurso Node em openclaw nodes |
api.registerService(service) |
Serviço em segundo plano |
api.registerInteractiveHandler(registration) |
Handler interativo |
api.registerAgentToolResultMiddleware(...) |
Middleware de resultado de ferramenta em runtime |
api.registerMemoryPromptSupplement(builder) |
Seção aditiva de prompt adjacente à memória |
api.registerMemoryCorpusSupplement(adapter) |
Corpus aditivo de pesquisa/leitura de memória |
Hooks do host para plugins de fluxo de trabalho
Hooks do host são as interfaces do SDK para plugins que precisam participar do ciclo de vida do host em vez de apenas adicionar um provedor, canal ou ferramenta. Eles são contratos genéricos; o Modo Plano pode usá-los, mas fluxos de trabalho de aprovação, barreiras de política de workspace, monitores em segundo plano, assistentes de configuração e plugins complementares de UI também podem.
| Método | Contrato que ele possui |
|---|---|
api.registerSessionExtension(...) |
Estado de sessão pertencente ao plugin, compatível com JSON, projetado por meio das sessões do Gateway |
api.enqueueNextTurnInjection(...) |
Contexto durável exatamente uma vez injetado no próximo turno do agente para uma sessão |
api.registerTrustedToolPolicy(...) |
Política de ferramenta de pré-plugin incluída/confiável que pode bloquear ou reescrever parâmetros de ferramenta |
api.registerToolMetadata(...) |
Metadados de exibição do catálogo de ferramentas sem alterar a implementação da ferramenta |
api.registerCommand(...) |
Comandos de plugin com escopo; resultados de comando podem definir continueAgent: true; comandos nativos do Discord aceitam descriptionLocalizations |
api.registerControlUiDescriptor(...) |
Descritores de contribuição da UI de Controle para superfícies de sessão, ferramenta, execução ou configurações |
api.registerRuntimeLifecycle(...) |
Callbacks de limpeza para recursos de runtime pertencentes ao plugin em caminhos de reset/delete/reload |
api.registerAgentEventSubscription(...) |
Assinaturas de eventos sanitizados para estado de fluxo de trabalho e monitores |
api.setRunContext(...) / getRunContext(...) / clearRunContext(...) |
Estado temporário por execução do plugin limpo no ciclo de vida terminal da execução |
api.registerSessionSchedulerJob(...) |
Registros de trabalho do agendador de sessão pertencentes ao plugin com limpeza determinística |
Os contratos dividem autoridade intencionalmente:
- Plugins externos podem possuir extensões de sessão, descritores de UI, comandos, metadados de ferramenta, injeções no próximo turno e hooks normais.
- Políticas de ferramenta confiáveis executam antes de hooks
before_tool_callcomuns e são apenas para plugins incluídos porque participam da política de segurança do host. - A propriedade de comandos reservados é apenas para plugins incluídos. Plugins externos devem usar seus próprios nomes de comando ou aliases.
allowPromptInjection=falsedesabilita hooks que alteram prompt, incluindoagent_turn_prepare,before_prompt_build,heartbeat_prompt_contribution, campos de prompt dobefore_agent_startlegado eenqueueNextTurnInjection.
Exemplos de consumidores que não são Plano:
| Arquétipo de plugin | Hooks usados |
|---|---|
| Fluxo de trabalho de aprovação | Extensão de sessão, continuação de comando, injeção no próximo turno, descritor de UI |
| Barreira de política de orçamento/workspace | Política de ferramenta confiável, metadados de ferramenta, projeção de sessão |
| Monitor de ciclo de vida em segundo plano | Limpeza de ciclo de vida de runtime, assinatura de eventos do agente, propriedade/limpeza do agendador de sessão, contribuição de prompt de Heartbeat, descritor de UI |
| Assistente de configuração ou onboarding | Extensão de sessão, comandos com escopo, descritor da UI de Controle |
Quando usar middleware de resultado de ferramenta
Plugins incluídos podem usar api.registerAgentToolResultMiddleware(...) quando
precisam reescrever o resultado de uma ferramenta após a execução e antes que o runtime
forneça esse resultado de volta ao modelo. Esta é a interface confiável e neutra em relação ao runtime
para redutores de saída assíncronos, como tokenjuice.
Plugins integrados devem declarar contracts.agentToolResultMiddleware para cada
runtime alvo, por exemplo ["pi", "codex"]. Plugins externos
não podem registrar esse middleware; mantenha os hooks normais de Plugin do OpenClaw para trabalhos
que não precisam de temporização de resultado de ferramenta antes do modelo. O caminho antigo de
registro de fábrica de extensão incorporada somente do Pi foi removido.
Registro de descoberta do Gateway
api.registerGatewayDiscoveryService(...) permite que um Plugin anuncie o Gateway
ativo em um transporte de descoberta local, como mDNS/Bonjour. O OpenClaw chama o
serviço durante a inicialização do Gateway quando a descoberta local está habilitada, passa as
portas atuais do Gateway e dados de dica TXT não secretos, e chama o manipulador
stop retornado durante o desligamento do 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() };
},
});
Plugins de descoberta do Gateway não devem tratar valores TXT anunciados como segredos ou autenticação. A descoberta é uma dica de roteamento; a autenticação do Gateway e a fixação de TLS ainda controlam a confiança.
Metadados de registro da CLI
api.registerCli(registrar, opts?) aceita dois tipos de metadados de comando:
commands: nomes de comando explícitos pertencentes ao registradordescriptors: descritores de comando em tempo de análise usados para ajuda da CLI, roteamento e registro preguiçoso da CLI do PluginparentPath: caminho opcional do comando pai para grupos de comandos aninhados, como["nodes"]
Para recursos de nós pareados, prefira
api.registerNodeCliFeature(registrar, opts?). Ele é um pequeno wrapper em torno de
api.registerCli(..., { parentPath: ["nodes"] }) e torna comandos como
openclaw nodes canvas recursos de nó explicitamente pertencentes ao Plugin.
Se você quiser que um comando de Plugin continue sendo carregado preguiçosamente no caminho normal da CLI raiz,
forneça descriptors que cubram todas as raízes de comando de nível superior expostas por esse
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,
},
],
},
);
Comandos aninhados recebem o comando pai resolvido como program:
api.registerCli(
async ({ program }) => {
const { registerNodesCanvasCommands } = await import("./src/cli.js");
registerNodesCanvasCommands(program);
},
{
parentPath: ["nodes"],
descriptors: [
{
name: "canvas",
description: "Capture or render canvas content from a paired node",
hasSubcommands: true,
},
],
},
);
Use commands sozinho somente quando você não precisar de registro preguiçoso da CLI raiz.
Esse caminho de compatibilidade ansioso continua sendo compatível, mas ele não instala
placeholders baseados em descritores para carregamento preguiçoso em tempo de análise.
Registro de backend da CLI
api.registerCliBackend(...) permite que um Plugin controle a configuração padrão de um
backend de CLI de IA local, como codex-cli.
- O
iddo backend se torna o prefixo de provedor em refs de modelo comocodex-cli/gpt-5. - A
configdo backend usa o mesmo formato deagents.defaults.cliBackends.<id>. - A configuração do usuário ainda prevalece. O OpenClaw mescla
agents.defaults.cliBackends.<id>sobre a configuração padrão do Plugin antes de executar a CLI. - Use
normalizeConfigquando um backend precisar de reescritas de compatibilidade após a mesclagem (por exemplo, normalizar formatos antigos de flags). - Use
resolveExecutionArgspara reescritas de argv com escopo de solicitação que pertencem ao dialeto da CLI, como mapear níveis de pensamento do OpenClaw para uma flag de esforço nativa.
Para um guia de autoria de ponta a ponta, consulte Plugins de backend da CLI.
Slots exclusivos
| Método | O que ele registra |
|---|---|
api.registerContextEngine(id, factory) |
Mecanismo de contexto (um ativo por vez). O callback assemble() recebe availableTools e citationsMode para que o mecanismo possa adaptar adições ao prompt. |
api.registerMemoryCapability(capability) |
Recurso de memória unificado |
api.registerMemoryPromptSection(builder) |
Construtor de seção de prompt de memória |
api.registerMemoryFlushPlan(resolver) |
Resolvedor de plano de flush de memória |
api.registerMemoryRuntime(runtime) |
Adaptador de runtime de memória |
Adaptadores de embedding de memória
| Método | O que ele registra |
|---|---|
api.registerMemoryEmbeddingProvider(adapter) |
Adaptador de embedding de memória para o Plugin ativo |
registerMemoryCapabilityé a API exclusiva preferida para Plugin de memória.registerMemoryCapabilitytambém pode exporpublicArtifacts.listArtifacts(...)para que Plugins complementares consumam artefatos de memória exportados por meio deopenclaw/plugin-sdk/memory-host-core, em vez de acessar o layout privado de um Plugin de memória específico.registerMemoryPromptSection,registerMemoryFlushPlaneregisterMemoryRuntimesão APIs exclusivas de Plugin de memória compatíveis com legado.MemoryFlushPlan.modelpode fixar o turno de flush a uma referência exata deprovider/model, comoollama/qwen3:8b, sem herdar a cadeia de fallback ativa.registerMemoryEmbeddingProviderpermite que o Plugin de memória ativo registre um ou mais ids de adaptador de embedding (por exemplo,openai,geminiou um id personalizado definido pelo Plugin).- Configurações do usuário como
agents.defaults.memorySearch.providereagents.defaults.memorySearch.fallbacksão resolvidas em relação a esses ids de adaptador registrados.
Eventos e ciclo de vida
| Método | O que ele faz |
|---|---|
api.on(hookName, handler, opts?) |
Hook de ciclo de vida tipado |
api.onConversationBindingResolved(handler) |
Callback de vinculação de conversa |
Consulte Hooks de Plugin para exemplos, nomes comuns de hooks e semântica de guardas.
Semântica de decisão de hooks
before_tool_call: retornar{ block: true }é terminal. Assim que qualquer manipulador o define, manipuladores de prioridade mais baixa são ignorados.before_tool_call: retornar{ block: false }é tratado como ausência de decisão (o mesmo que omitirblock), não como uma substituição.before_install: retornar{ block: true }é terminal. Assim que qualquer manipulador o define, manipuladores de prioridade mais baixa são ignorados.before_install: retornar{ block: false }é tratado como ausência de decisão (o mesmo que omitirblock), não como uma substituição.reply_dispatch: retornar{ handled: true, ... }é terminal. Assim que qualquer manipulador reivindica o envio, manipuladores de prioridade mais baixa e o caminho padrão de envio do modelo são ignorados.message_sending: retornar{ cancel: true }é terminal. Assim que qualquer manipulador o define, manipuladores de prioridade mais baixa são ignorados.message_sending: retornar{ cancel: false }é tratado como ausência de decisão (o mesmo que omitircancel), não como uma substituição.message_received: use o campo tipadothreadIdquando precisar de roteamento de thread/tópico de entrada. Mantenhametadatapara extras específicos do canal.message_sending: use os campos de roteamento tipadosreplyToId/threadIdantes de recorrer ametadataespecífico do canal.gateway_start: usectx.config,ctx.workspaceDirectx.getCron?.()para estado de inicialização pertencente ao Gateway, em vez de depender de hooks internosgateway:startup.cron_changed: observe mudanças no ciclo de vida do Cron pertencentes ao Gateway. Useevent.job?.state?.nextRunAtMsectx.getCron?.()ao sincronizar agendadores externos de despertar, e mantenha o OpenClaw como a fonte da verdade para verificações de vencimento e execução.
Campos do objeto da API
| Campo | Tipo | Descrição |
|---|---|---|
api.id |
string |
Id do Plugin |
api.name |
string |
Nome de exibição |
api.version |
string? |
Versão do Plugin (opcional) |
api.description |
string? |
Descrição do Plugin (opcional) |
api.source |
string |
Caminho de origem do Plugin |
api.rootDir |
string? |
Diretório raiz do Plugin (opcional) |
api.config |
OpenClawConfig |
Snapshot de configuração atual (snapshot de runtime ativo em memória quando disponível) |
api.pluginConfig |
Record<string, unknown> |
Configuração específica do Plugin de plugins.entries.<id>.config |
api.runtime |
PluginRuntime |
Auxiliares de runtime |
api.logger |
PluginLogger |
Logger com escopo (debug, info, warn, error) |
api.registrationMode |
PluginRegistrationMode |
Modo de carregamento atual; "setup-runtime" é a janela leve de inicialização/configuração antes da entrada completa |
api.resolvePath(input) |
(string) => string |
Resolve caminho relativo à raiz do Plugin |
Convenção de módulo interno
Dentro do seu Plugin, use arquivos barrel locais para imports internos:
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)
Superfícies públicas de Plugin integrado carregadas por fachada (api.ts, runtime-api.ts,
index.ts, setup-entry.ts e arquivos de entrada públicos semelhantes) preferem o
snapshot de configuração de runtime ativo quando o OpenClaw já está em execução. Se ainda não houver
snapshot de runtime, elas recorrem ao arquivo de configuração resolvido no disco.
Fachadas de Plugins integrados empacotados devem ser carregadas por meio dos carregadores de fachada
de Plugin do OpenClaw; imports diretos de dist/extensions/... ignoram as verificações de manifesto
e sidecar de runtime que instalações empacotadas usam para código pertencente ao Plugin.
Plugins de provedor podem expor um barrel de contrato estreito local ao Plugin quando um auxiliar é intencionalmente específico do provedor e ainda não pertence a um subcaminho genérico do SDK. Exemplos incluídos:
- Anthropic: seam pública
api.ts/contract-api.tspara auxiliares de fluxo do Claude beta-header eservice_tier. @openclaw/openai-provider:api.tsexporta builders de provedor, auxiliares de modelo padrão e builders de provedor em tempo real.@openclaw/openrouter-provider:api.tsexporta o builder de provedor mais auxiliares de onboarding/configuração.
Relacionados
Opções de definePluginEntry e defineChannelPluginEntry.
Referência completa do namespace api.runtime.
Empacotamento, manifestos e esquemas de configuração.
Utilitários de teste e regras de lint.
Migração a partir de superfícies obsoletas.
Arquitetura profunda e modelo de capacidades.