Esta é a referência aprofundada de arquitetura do sistema de plugins do OpenClaw. Para guias práticos, comece com uma das páginas focadas abaixo.Documentation Index
Fetch the complete documentation index at: https://docs.openclaw.ai/llms.txt
Use this file to discover all available pages before exploring further.
Install and use plugins
Guia do usuário final para adicionar, habilitar e solucionar problemas de plugins.
Building plugins
Tutorial do primeiro Plugin com o menor manifesto funcional.
Channel plugins
Crie um Plugin de canal de mensagens.
Provider plugins
Crie um Plugin de provedor de modelo.
SDK overview
Mapa de importação e referência da API de registro.
Modelo público de recursos
Recursos são o modelo público de Plugin nativo dentro do OpenClaw. Todo Plugin nativo do OpenClaw se registra em um ou mais tipos de recurso:| Recurso | Método de registro | Plugins de exemplo |
|---|---|---|
| Inferência de texto | api.registerProvider(...) | openai, anthropic |
| Backend de inferência da CLI | api.registerCliBackend(...) | openai, anthropic |
| Fala | api.registerSpeechProvider(...) | elevenlabs, microsoft |
| Transcrição em tempo real | api.registerRealtimeTranscriptionProvider(...) | openai |
| Voz em tempo real | api.registerRealtimeVoiceProvider(...) | openai |
| Compreensão de mídia | api.registerMediaUnderstandingProvider(...) | openai, google |
| Geração de imagens | api.registerImageGenerationProvider(...) | openai, google, fal, minimax |
| Geração de música | api.registerMusicGenerationProvider(...) | google, minimax |
| Geração de vídeo | api.registerVideoGenerationProvider(...) | qwen |
| Busca Web | api.registerWebFetchProvider(...) | firecrawl |
| Pesquisa Web | api.registerWebSearchProvider(...) | google |
| Canal / mensagens | api.registerChannel(...) | msteams, matrix |
| Descoberta do Gateway | api.registerGatewayDiscoveryService(...) | bonjour |
Um Plugin que registra zero recursos, mas fornece hooks, ferramentas, serviços de descoberta ou serviços em segundo plano é um Plugin legado apenas de hooks. Esse padrão ainda tem suporte completo.
Postura de compatibilidade externa
O modelo de recursos já está incorporado ao núcleo e é usado hoje por plugins empacotados/nativos, mas a compatibilidade de plugins externos ainda precisa de um critério mais rigoroso do que “está exportado, portanto está congelado”.| Situação do Plugin | Orientação |
|---|---|
| Plugins externos existentes | Mantenha integrações baseadas em hooks funcionando; esta é a linha de base de compatibilidade. |
| Novos plugins empacotados/nativos | Prefira registro explícito de recursos em vez de acessos específicos de fornecedor ou novos designs apenas com hooks. |
| Plugins externos adotando registro de recursos | Permitido, mas trate superfícies auxiliares específicas de recursos como em evolução, a menos que a documentação as marque como estáveis. |
Formatos de Plugin
O OpenClaw classifica cada Plugin carregado em um formato com base em seu comportamento real de registro (não apenas em metadados estáticos):plain-capability
plain-capability
Registra exatamente um tipo de recurso (por exemplo, um Plugin apenas de provedor como
mistral).hybrid-capability
hybrid-capability
Registra múltiplos tipos de recurso (por exemplo,
openai possui inferência de texto, fala, compreensão de mídia e geração de imagens).hook-only
hook-only
Registra apenas hooks (tipados ou personalizados), sem recursos, ferramentas, comandos ou serviços.
non-capability
non-capability
Registra ferramentas, comandos, serviços ou rotas, mas nenhum recurso.
openclaw plugins inspect <id> para ver o formato e o detalhamento de recursos de um Plugin. Consulte a referência da CLI para obter detalhes.
Hooks legados
O hookbefore_agent_start continua tendo suporte como caminho de compatibilidade para plugins apenas de hooks. Plugins legados reais ainda dependem dele.
Direção:
- mantê-lo funcionando
- documentá-lo como legado
- preferir
before_model_resolvepara trabalho de substituição de modelo/provedor - preferir
before_prompt_buildpara trabalho de mutação de prompt - remover somente depois que o uso real diminuir e a cobertura de fixtures comprovar a segurança da migração
Sinais de compatibilidade
Ao executaropenclaw doctor ou openclaw plugins inspect <id>, você pode ver um destes rótulos:
| Sinal | Significado |
|---|---|
| configuração válida | A configuração é analisada corretamente e os plugins resolvem |
| aviso de compatibilidade | O Plugin usa um padrão com suporte, mas mais antigo (por exemplo, hook-only) |
| aviso legado | O Plugin usa before_agent_start, que está obsoleto |
| erro grave | A configuração é inválida ou o Plugin falhou ao carregar |
hook-only nem before_agent_start quebrarão seu Plugin hoje: hook-only é consultivo, e before_agent_start apenas dispara um aviso. Esses sinais também aparecem em openclaw status --all e openclaw plugins doctor.
Visão geral da arquitetura
O sistema de plugins do OpenClaw tem quatro camadas:Manifest + discovery
O OpenClaw encontra plugins candidatos a partir de caminhos configurados, raízes de workspace, raízes globais de plugins e plugins empacotados. A descoberta lê primeiro manifestos nativos
openclaw.plugin.json e manifestos de pacote com suporte.Enablement + validation
O núcleo decide se um Plugin descoberto está habilitado, desabilitado, bloqueado ou selecionado para um slot exclusivo, como memória.
Runtime loading
Plugins nativos do OpenClaw são carregados no processo e registram recursos em um registro central. JavaScript empacotado carrega por meio de
require nativo; TypeScript de origem local de terceiros é o fallback emergencial via Jiti. Pacotes compatíveis são normalizados em registros de registry sem importar código de runtime.- metadados de tempo de análise vêm de
registerCli(..., { descriptors: [...] }) - o módulo real da CLI do Plugin pode permanecer lazy e registrar na primeira invocação
- validação de manifesto/configuração deve funcionar a partir de metadados de manifesto/esquema sem executar código do Plugin
- a descoberta de recursos nativos pode carregar código de entrada de Plugin confiável para criar um snapshot de registry sem ativação
- o comportamento nativo de runtime vem do caminho
register(api)do módulo do Plugin comapi.registrationMode === "full"
Snapshot de metadados de Plugin e tabela de consulta
A inicialização do Gateway cria umPluginMetadataSnapshot para o snapshot de configuração atual. O snapshot contém apenas metadados: ele armazena o índice de plugins instalados, o registry de manifestos, diagnósticos de manifesto, mapas de proprietários, um normalizador de id de Plugin e registros de manifesto. Ele não mantém módulos de Plugin carregados, SDKs de provedores, conteúdo de pacotes ou exportações de runtime.
Validação de configuração ciente de plugins, habilitação automática na inicialização e bootstrap de plugins do Gateway consomem esse snapshot em vez de reconstruir metadados de manifesto/índice de forma independente. PluginLookUpTable é derivado do mesmo snapshot e adiciona o plano de plugins de inicialização para a configuração de runtime atual.
Depois da inicialização, o Gateway mantém o snapshot de metadados atual como um produto de runtime substituível. Descobertas repetidas de provedores em runtime podem emprestar esse snapshot em vez de reconstruir o índice instalado e o registry de manifestos para cada passagem pelo catálogo de provedores. O snapshot é limpo ou substituído no desligamento do Gateway, em mudanças de configuração/inventário de plugins e em gravações de índice instalado; chamadores voltam para o caminho frio de manifesto/índice quando não há snapshot atual compatível. Verificações de compatibilidade devem incluir raízes de descoberta de plugins, como plugins.load.paths e o workspace padrão do agente, porque plugins de workspace fazem parte do escopo de metadados.
O snapshot e a tabela de consulta mantêm decisões repetidas de inicialização no caminho rápido:
- propriedade de canal
- inicialização de canal adiada
- ids de plugins de inicialização
- propriedade de provedor e backend da CLI
- propriedade de provedor de configuração, alias de comando, provedor de catálogo de modelos e contrato de manifesto
- validação de esquema de configuração de Plugin e esquema de configuração de canal
- decisões de habilitação automática na inicialização
PluginLookUpTable do Gateway. Esse caminho agora reconstrói o registry sob demanda; prefira passar a tabela de consulta atual ou um registry de manifestos explícito pelos fluxos de runtime quando um chamador já tiver um.
Planejamento de ativação
O planejamento de ativação faz parte do plano de controle. Chamadores podem perguntar quais plugins são relevantes para um comando, provedor, canal, rota, harness de agente ou recurso concreto antes de carregar registries de runtime mais amplos. O planejador mantém compatível o comportamento atual de manifesto:- campos
activation.*são dicas explícitas do planejador providers,channels,commandAliases,setup.providers,contracts.toolse hooks continuam sendo fallback de propriedade de manifesto- a API do planejador apenas com ids permanece disponível para chamadores existentes
- a API de plano informa rótulos de motivo para que diagnósticos possam distinguir dicas explícitas de fallback de propriedade
Plugins de canal e a ferramenta de mensagem compartilhada
Plugins de canal não precisam registrar uma ferramenta separada de envio/edição/reação para ações normais de chat. OpenClaw mantém uma ferramentamessage compartilhada no núcleo, e os plugins de canal são responsáveis pela descoberta e execução específicas do canal por trás dela.
O limite atual é:
- o núcleo é responsável pelo host da ferramenta
messagecompartilhada, pela fiação de prompt, pela escrituração de sessão/thread e pelo despacho de execução - os plugins de canal são responsáveis pela descoberta de ações com escopo, pela descoberta de capacidades e por quaisquer fragmentos de schema específicos do canal
- os plugins de canal são responsáveis pela gramática de conversa de sessão específica do provedor, como a forma como ids de conversa codificam ids de thread ou herdam de conversas pai
- os plugins de canal executam a ação final por meio de seu adaptador de ação
ChannelMessageActionAdapter.describeMessageTool(...). Essa chamada de descoberta unificada permite que um plugin retorne suas ações visíveis, capacidades e contribuições de schema juntas, para que essas peças não se desviem umas das outras.
Quando um parâmetro de ferramenta de mensagem específico do canal carrega uma origem de mídia, como um caminho local ou uma URL de mídia remota, o plugin também deve retornar mediaSourceParams de describeMessageTool(...). O núcleo usa essa lista explícita para aplicar normalização de caminhos do sandbox e dicas de acesso a mídia de saída sem codificar nomes de parâmetros pertencentes ao plugin. Prefira mapas com escopo por ação ali, não uma lista plana para todo o canal, para que um parâmetro de mídia usado apenas em perfil não seja normalizado em ações não relacionadas como send.
O núcleo passa o escopo de runtime para essa etapa de descoberta. Campos importantes incluem:
accountIdcurrentChannelIdcurrentThreadTscurrentMessageIdsessionKeysessionIdagentIdrequesterSenderIdde entrada confiável
message do núcleo.
É por isso que alterações de roteamento do executor embutido continuam sendo trabalho de plugin: o executor é responsável por encaminhar a identidade atual de chat/sessão para o limite de descoberta do plugin, para que a ferramenta message compartilhada exponha a superfície correta, pertencente ao canal, para o turno atual.
Para auxiliares de execução pertencentes ao canal, plugins empacotados devem manter o runtime de execução dentro de seus próprios módulos de extensão. O núcleo não é mais responsável pelos runtimes de ação de mensagem do Discord, Slack, Telegram ou WhatsApp em src/agents/tools. Não publicamos subcaminhos plugin-sdk/*-action-runtime separados, e plugins empacotados devem importar seu próprio código de runtime local diretamente de seus módulos pertencentes à extensão.
O mesmo limite se aplica a seams do SDK nomeadas por provedor em geral: o núcleo não deve importar barrels de conveniência específicos de canal para Slack, Discord, Signal, WhatsApp ou extensões semelhantes. Se o núcleo precisar de um comportamento, deve consumir o barrel api.ts / runtime-api.ts do próprio plugin empacotado ou promover a necessidade para uma capacidade genérica estreita no SDK compartilhado.
Plugins empacotados seguem a mesma regra. O runtime-api.ts de um plugin empacotado não deve reexportar sua própria fachada marcada openclaw/plugin-sdk/<plugin-id>. Essas fachadas marcadas continuam sendo shims de compatibilidade para plugins externos e consumidores antigos, mas plugins empacotados devem usar exportações locais mais subcaminhos genéricos estreitos do SDK, como openclaw/plugin-sdk/channel-policy, openclaw/plugin-sdk/runtime-store ou openclaw/plugin-sdk/webhook-ingress. Código novo não deve adicionar fachadas do SDK específicas de ids de plugin, a menos que o limite de compatibilidade de um ecossistema externo existente exija isso.
Especificamente para enquetes, há dois caminhos de execução:
outbound.sendPollé a linha de base compartilhada para canais que se encaixam no modelo comum de enqueteactions.handleAction("poll")é o caminho preferencial para semântica de enquete específica do canal ou parâmetros extras de enquete
Modelo de propriedade de capacidade
OpenClaw trata um plugin nativo como o limite de propriedade de uma empresa ou de um recurso, não como um conjunto aleatório de integrações não relacionadas. Isso significa:- um plugin de empresa geralmente deve ser responsável por todas as superfícies dessa empresa voltadas ao OpenClaw
- um plugin de recurso geralmente deve ser responsável por toda a superfície do recurso que introduz
- canais devem consumir capacidades compartilhadas do núcleo em vez de reimplementar comportamento de provedor de forma ad hoc
Várias capacidades de fornecedor
Várias capacidades de fornecedor
openai é responsável por inferência de texto, fala, voz em tempo real, entendimento de mídia e geração de imagens. google é responsável por inferência de texto mais entendimento de mídia, geração de imagens e pesquisa na web. qwen é responsável por inferência de texto mais entendimento de mídia e geração de vídeo.Capacidade única de fornecedor
Capacidade única de fornecedor
elevenlabs e microsoft são responsáveis por fala; firecrawl é responsável por busca na web; minimax / mistral / moonshot / zai são responsáveis por backends de entendimento de mídia.Plugin de recurso
Plugin de recurso
voice-call é responsável por transporte de chamadas, ferramentas, CLI, rotas e ponte de media-stream do Twilio, mas consome capacidades compartilhadas de fala, transcrição em tempo real e voz em tempo real em vez de importar plugins de fornecedor diretamente.- OpenAI vive em um único plugin mesmo que abranja modelos de texto, fala, imagens e vídeo futuro
- outro fornecedor pode fazer o mesmo para sua própria área de superfície
- canais não se importam com qual plugin de fornecedor é responsável pelo provedor; eles consomem o contrato de capacidade compartilhada exposto pelo núcleo
- plugin = limite de propriedade
- capacidade = contrato do núcleo que vários plugins podem implementar ou consumir
Isso mantém a propriedade explícita enquanto evita comportamento no núcleo que depende de um único fornecedor ou de um caminho de código específico de plugin feito uma única vez.
Camadas de capacidade
Use este modelo mental ao decidir onde o código pertence:- Camada de capacidade do núcleo
- Camada de plugin de fornecedor
- Camada de plugin de canal/recurso
Orquestração compartilhada, política, fallback, regras de mesclagem de configuração, semântica de entrega e contratos tipados.
- o núcleo é responsável pela política de TTS em tempo de resposta, ordem de fallback, preferências e entrega ao canal
openai,elevenlabsemicrosoftsão responsáveis pelas implementações de síntesevoice-callconsome o auxiliar de runtime de TTS de telefonia
Exemplo de plugin de empresa com várias capacidades
Um plugin de empresa deve parecer coeso do lado de fora. Se OpenClaw tiver contratos compartilhados para modelos, fala, transcrição em tempo real, voz em tempo real, entendimento de mídia, geração de imagens, geração de vídeo, busca na web e pesquisa na web, um fornecedor pode ser responsável por todas as suas superfícies em um só lugar:- um plugin é responsável pela superfície do fornecedor
- o núcleo continua responsável pelos contratos de capacidade
- canais e plugins de recurso consomem auxiliares
api.runtime.*, não código de fornecedor - testes de contrato podem afirmar que o plugin registrou as capacidades que declara possuir
Exemplo de capacidade: entendimento de vídeo
OpenClaw já trata entendimento de imagem/áudio/vídeo como uma capacidade compartilhada. O mesmo modelo de propriedade se aplica ali:Plugins de fornecedor registram
Plugins de fornecedor registram
describeImage, transcribeAudio e describeVideo conforme aplicável.api.registerVideoGenerationProvider(...) nele.
Precisa de uma checklist concreta de rollout? Consulte Cookbook de capacidades.
Contratos e aplicação
A superfície da API de plugin é intencionalmente tipada e centralizada emOpenClawPluginApi. Esse contrato define os pontos de registro compatíveis e os auxiliares de runtime dos quais um plugin pode depender.
Por que isso importa:
- autores de plugins recebem um padrão interno estável
- o núcleo pode rejeitar propriedade duplicada, como dois plugins registrando o mesmo id de provedor
- a inicialização pode expor diagnósticos acionáveis para registros malformados
- testes de contrato podem impor a propriedade de plugins empacotados e impedir desvio silencioso
Aplicação do registro em tempo de execução
Aplicação do registro em tempo de execução
O registro de plugins valida os registros conforme os plugins são carregados. Exemplos: IDs de provedores duplicados, IDs de provedores de fala duplicados e registros malformados produzem diagnósticos de plugin em vez de comportamento indefinido.
Testes de contrato
Testes de contrato
Plugins incluídos são capturados em registros de contrato durante as execuções de teste para que o OpenClaw possa afirmar a propriedade explicitamente. Hoje, isso é usado para provedores de modelo, provedores de fala, provedores de pesquisa na web e propriedade de registro incluída.
O que pertence a um contrato
- Bons contratos
- Contratos ruins
- tipados
- pequenos
- específicos de capacidade
- pertencentes ao core
- reutilizáveis por vários plugins
- consumíveis por canais/recursos sem conhecimento do fornecedor
Modelo de execução
Plugins nativos do OpenClaw são executados no processo com o Gateway. Eles não são isolados em sandbox. Um plugin nativo carregado tem o mesmo limite de confiança no nível do processo que o código do core. Bundles compatíveis são mais seguros por padrão porque o OpenClaw atualmente os trata como pacotes de metadados/conteúdo. Nas versões atuais, isso significa principalmente Skills incluídas. Use listas de permissão e caminhos explícitos de instalação/carregamento para plugins não incluídos. Trate plugins de workspace como código de tempo de desenvolvimento, não como padrões de produção. Para nomes de pacotes de workspace incluídos, mantenha o ID do plugin ancorado no nome npm:@openclaw/<id> por padrão, ou um sufixo tipado aprovado, como -provider, -plugin, -speech, -sandbox ou -media-understanding, quando o pacote expõe intencionalmente uma função de plugin mais estreita.
Nota de confiança:
plugins.allow confia em IDs de plugin, não na proveniência da origem. Um plugin de workspace com o mesmo ID de um plugin incluído sombreia intencionalmente a cópia incluída quando esse plugin de workspace está habilitado/na lista de permissão. Isso é normal e útil para desenvolvimento local, teste de patches e hotfixes. A confiança em plugins incluídos é resolvida a partir do snapshot de origem — o manifesto e o código em disco no momento do carregamento — em vez de metadados de instalação. Um registro de instalação corrompido ou substituído não pode ampliar silenciosamente a superfície de confiança de um plugin incluído além do que a origem real declara.Limite de exportação
O OpenClaw exporta capacidades, não conveniências de implementação. Mantenha público o registro de capacidades. Remova exportações auxiliares que não fazem parte do contrato:- subcaminhos auxiliares específicos de plugins incluídos
- subcaminhos de encanamento de tempo de execução não destinados como API pública
- auxiliares de conveniência específicos de fornecedor
- auxiliares de configuração/onboarding que são detalhes de implementação
plugin-sdk/gateway-runtime, plugin-sdk/security-runtime e plugin-sdk/plugin-config-runtime.