Plugin SDK reference
Configuração e ajustes do Plugin
Referência para empacotamento de plugins (metadados de package.json), manifestos (openclaw.plugin.json), entradas de configuração e esquemas de configuração.
Metadados do pacote
Seu package.json precisa de um campo openclaw que informe ao sistema de plugins o que seu plugin fornece:
Plugin de canal
{ "name": "@myorg/openclaw-my-channel", "version": "1.0.0", "type": "module", "openclaw": { "extensions": ["./index.ts"], "setupEntry": "./setup-entry.ts", "channel": { "id": "my-channel", "label": "My Channel", "blurb": "Short description of the channel." } }}Plugin de provedor / linha de base do ClawHub
{ "name": "@myorg/openclaw-my-plugin", "version": "1.0.0", "type": "module", "dependencies": { "typebox": "1.1.39" }, "peerDependencies": { "openclaw": ">=2026.3.24-beta.2" }, "openclaw": { "extensions": ["./index.ts"], "compat": { "pluginApi": ">=2026.3.24-beta.2", "minGatewayVersion": "2026.3.24-beta.2" }, "build": { "openclawVersion": "2026.3.24-beta.2", "pluginSdkVersion": "2026.3.24-beta.2" } }}Campos de openclaw
extensionsstring[]Arquivos de ponto de entrada (relativos à raiz do pacote). Entradas de código-fonte válidas para desenvolvimento no workspace e em checkouts do git.
runtimeExtensionsstring[]Arquivos JavaScript compilados correspondentes a extensions, preferidos quando o OpenClaw carrega um pacote npm instalado. Consulte Pontos de entrada do SDK para ver a ordem de resolução entre código-fonte e código compilado.
setupEntrystringEntrada leve usada apenas para configuração (opcional).
runtimeSetupEntrystringArquivo JavaScript compilado correspondente a setupEntry. Exige que setupEntry também esteja definido.
pluginobjectIdentidade alternativa do plugin no formato { id, label }, usada quando um plugin não tem metadados de canal/provedor dos quais derivar um id ou rótulo.
channelobjectMetadados do catálogo de canais para superfícies de configuração, seleção, início rápido e status.
installobjectIndicações de instalação: npmSpec, localPath, defaultChoice, minHostVersion, expectedIntegrity, allowInvalidConfigRecovery, requiredPlatformPackages.
startupobjectSinalizadores de comportamento de inicialização.
compatobjectIntervalo de versões de pluginApi compatível com este plugin. Obrigatório para publicações externas no ClawHub.
openclaw.channel
openclaw.channel contém metadados leves do pacote para descoberta de canais e superfícies de configuração antes do carregamento do runtime.
| Campo | Tipo | Significado |
|---|---|---|
id |
string |
Id canônico do canal. |
label |
string |
Rótulo principal do canal. |
selectionLabel |
string |
Rótulo de seleção/configuração quando precisar ser diferente de label. |
detailLabel |
string |
Rótulo de detalhes secundário para catálogos de canais e superfícies de status mais completos. |
docsPath |
string |
Caminho da documentação para links de configuração e seleção. |
docsLabel |
string |
Rótulo alternativo usado em links da documentação quando precisar ser diferente do id do canal. |
blurb |
string |
Descrição curta de integração inicial/catálogo. |
order |
number |
Ordem de classificação nos catálogos de canais. |
aliases |
string[] |
Aliases adicionais de pesquisa para seleção de canais. |
preferOver |
string[] |
Ids de plugins/canais de menor prioridade que este canal deve superar. |
systemImage |
string |
Nome opcional de ícone/imagem do sistema para catálogos da interface do canal. |
selectionDocsPrefix |
string |
Texto de prefixo antes dos links da documentação nas superfícies de seleção. |
selectionDocsOmitLabel |
boolean |
Exibe diretamente o caminho da documentação em vez de um link rotulado na descrição de seleção. |
selectionExtras |
string[] |
Strings curtas adicionais acrescentadas à descrição de seleção. |
markdownCapable |
boolean |
Indica que o canal é compatível com Markdown para decisões de formatação de saída. |
exposure |
object |
Controles de visibilidade do canal para configuração, listas configuradas e superfícies da documentação. |
quickstartAllowFrom |
boolean |
Inclui este canal no fluxo padrão de configuração allowFrom do início rápido. |
forceAccountBinding |
boolean |
Exige vinculação explícita da conta mesmo quando existe apenas uma conta. |
preferSessionLookupForAnnounceTarget |
boolean |
Prefere a pesquisa de sessão ao resolver destinos de anúncio para este canal. |
Exemplo:
{ "openclaw": { "channel": { "id": "my-channel", "label": "My Channel", "selectionLabel": "My Channel (self-hosted)", "detailLabel": "My Channel Bot", "docsPath": "/channels/my-channel", "docsLabel": "my-channel", "blurb": "Webhook-based self-hosted chat integration.", "order": 80, "aliases": ["mc"], "preferOver": ["my-channel-legacy"], "selectionDocsPrefix": "Guide:", "selectionExtras": ["Markdown"], "markdownCapable": true, "exposure": { "configured": true, "setup": true, "docs": true }, "quickstartAllowFrom": true } }}exposure aceita:
configured: inclui o canal em superfícies de listagem de canais configurados/statussetup: inclui o canal nos seletores interativos de configuraçãodocs: marca o canal como público nas superfícies de documentação/navegação
openclaw.install
openclaw.install contém metadados do pacote, não metadados do manifesto.
| Campo | Tipo | Significado |
|---|---|---|
clawhubSpec |
string |
Especificação canônica do ClawHub para fluxos de instalação/atualização e instalação sob demanda durante a integração inicial. |
npmSpec |
string |
Especificação canônica do npm para fluxos alternativos de instalação/atualização. |
localPath |
string |
Caminho de desenvolvimento local ou de instalação incluída. |
defaultChoice |
"clawhub" | "npm" | "local" |
Fonte de instalação preferida quando várias fontes estão disponíveis. |
minHostVersion |
string |
Versão mínima compatível do OpenClaw, >=x.y.z ou >=x.y.z-prerelease. |
expectedIntegrity |
string |
String de integridade esperada da distribuição npm, geralmente sha512-..., para instalações fixadas. |
allowInvalidConfigRecovery |
boolean |
Permite que fluxos de reinstalação de plugins incluídos se recuperem de falhas específicas causadas por configurações obsoletas. |
requiredPlatformPackages |
string[] |
Aliases npm obrigatórios e específicos da plataforma, verificados durante a instalação via npm. |
Comportamento da integração inicial
A integração inicial interativa usa openclaw.install para superfícies de instalação sob demanda: se seu plugin expõe opções de autenticação de provedor ou metadados de configuração/catálogo de canais antes do carregamento do runtime, a integração inicial pode solicitar uma instalação pelo ClawHub, npm ou local, instalar ou habilitar o plugin e então continuar o fluxo selecionado. As opções do ClawHub usam clawhubSpec e são preferidas quando presentes; as opções do npm exigem metadados confiáveis de catálogo com um npmSpec do registro (versões exatas e expectedIntegrity são fixações opcionais, aplicadas na instalação/atualização quando definidas). Mantenha "o que exibir" em openclaw.plugin.json e "como instalar" em package.json.
Aplicação de minHostVersion
Se minHostVersion estiver definido, tanto a instalação quanto o carregamento pelo registro de manifestos não incluídos o aplicarão. Hosts mais antigos ignoram plugins externos; strings de versão inválidas são rejeitadas. Presume-se que plugins de código-fonte incluídos tenham a mesma versão do checkout do host.
Instalações npm fixadas
Para instalações npm fixadas, mantenha a versão exata em npmSpec e adicione a integridade esperada do artefato:
{ "openclaw": { "install": { "npmSpec": "@wecom/wecom-openclaw-plugin@1.2.3", "expectedIntegrity": "sha512-REPLACE_WITH_NPM_DIST_INTEGRITY", "defaultChoice": "npm" } }}Escopo de allowInvalidConfigRecovery
allowInvalidConfigRecovery não é um mecanismo geral para ignorar configurações inválidas. Ele se destina apenas à recuperação restrita de plugins incluídos, permitindo que a reinstalação/configuração corrija resíduos conhecidos de atualizações, como a ausência do caminho de um plugin incluído ou uma entrada channels.<id> obsoleta desse mesmo plugin. Se a configuração estiver inválida por motivos não relacionados, a instalação ainda falhará de forma segura e instruirá o operador a executar openclaw doctor --fix.
Carregamento completo adiado
Plugins de canal podem optar pelo carregamento adiado com:
{ "openclaw": { "extensions": ["./index.ts"], "setupEntry": "./setup-entry.ts", "startup": { "deferConfiguredChannelFullLoadUntilAfterListen": true } }}Quando habilitado, o OpenClaw carrega apenas setupEntry durante a fase de inicialização anterior à escuta, mesmo para canais já configurados. A entrada completa é carregada depois que o Gateway começa a escutar.
Se sua entrada de configuração/completa registrar métodos RPC do Gateway, mantenha-os sob um prefixo específico do plugin. Os namespaces administrativos reservados do núcleo (config.*, exec.approvals.*, wizard.*, update.*) permanecem sob responsabilidade do núcleo e sempre são normalizados para operator.admin.
Manifesto do plugin
Todo plugin nativo deve incluir um openclaw.plugin.json na raiz do pacote. O OpenClaw usa esse arquivo para validar a configuração sem executar o código do plugin.
{ "id": "my-plugin", "name": "My Plugin", "description": "Adds My Plugin capabilities to OpenClaw", "configSchema": { "type": "object", "additionalProperties": false, "properties": { "webhookSecret": { "type": "string", "description": "Webhook verification secret" } } }}Para plugins de canal, adicione channels (e, para plugins de provedor, adicione providers):
{ "id": "my-channel", "channels": ["my-channel"], "configSchema": { "type": "object", "additionalProperties": false, "properties": {} }}Mesmo plugins sem configuração devem incluir um esquema. Um esquema vazio é válido:
{ "id": "my-plugin", "configSchema": { "type": "object", "additionalProperties": false }}Consulte Manifesto do plugin para ver a referência completa do esquema.
Publicação no ClawHub
Skills e pacotes de plugins usam comandos de publicação distintos no ClawHub. Para pacotes de plugins, use o comando específico para pacotes:
clawhub package publish your-org/your-plugin --dry-runclawhub package publish your-org/your-pluginEntrada de configuração
setup-entry.ts é uma alternativa leve ao index.ts, carregada pelo OpenClaw quando ele precisa apenas das superfícies de configuração inicial (integração inicial, reparo de configuração e inspeção de canais desativados):
// setup-entry.ts export default defineSetupPluginEntry(myChannelPlugin);Isso evita carregar código pesado de execução (bibliotecas criptográficas, registros da CLI e serviços em segundo plano) durante os fluxos de configuração inicial.
Canais incluídos no espaço de trabalho que mantêm exportações seguras para configuração inicial em módulos auxiliares podem usar defineBundledChannelSetupEntry(...) de openclaw/plugin-sdk/channel-entry-contract em vez de defineSetupPluginEntry(...). Esse contrato incluído também aceita uma exportação opcional runtime, permitindo que a vinculação da execução durante a configuração permaneça leve e explícita.
Quando o OpenClaw usa setupEntry em vez da entrada completa
- O canal está desativado, mas precisa de superfícies de configuração inicial ou integração inicial.
- O canal está ativado, mas não configurado.
- O carregamento adiado está ativado (
deferConfiguredChannelFullLoadUntilAfterListen).
O que setupEntry deve registrar
- O objeto do plugin de canal (por meio de
defineSetupPluginEntry). - Todas as rotas HTTP necessárias antes de o Gateway começar a escutar.
- Todos os métodos do Gateway necessários durante a inicialização.
Esses métodos de inicialização do Gateway ainda devem evitar namespaces administrativos reservados do núcleo, como config.* ou update.*.
O que setupEntry NÃO deve incluir
- Registros da CLI.
- Serviços em segundo plano.
- Importações pesadas de execução (criptografia, SDKs).
- Métodos do Gateway necessários somente após a inicialização.
Importações específicas de auxiliares de configuração
Para caminhos críticos usados apenas na configuração inicial, prefira as interfaces específicas de auxiliares de configuração em vez da interface abrangente plugin-sdk/setup quando precisar somente de parte da superfície de configuração:
| Caminho de importação | Use para | Principais exportações |
|---|---|---|
plugin-sdk/setup-runtime |
auxiliares de execução da configuração que permanecem disponíveis em setupEntry ou na inicialização adiada do canal |
createSetupTranslator, createPatchedAccountSetupAdapter, createEnvPatchedAccountSetupAdapter, createSetupInputPresenceValidator, noteChannelLookupFailure, noteChannelLookupSummary, promptResolvedAllowFrom, splitSetupEntries, createAllowlistSetupWizardProxy, createDelegatedSetupWizardProxy |
plugin-sdk/setup-adapter-runtime |
alias de compatibilidade obsoleto; use plugin-sdk/setup-runtime |
createEnvPatchedAccountSetupAdapter |
plugin-sdk/setup-tools |
auxiliares de CLI, instalação, arquivos compactados e documentação para configuração | formatCliCommand, detectBinary, extractArchive, resolveBrewExecutable, formatDocsLink, CONFIG_DIR |
Use a interface mais abrangente plugin-sdk/setup quando quiser o conjunto completo de ferramentas compartilhadas de configuração, incluindo auxiliares de alteração da configuração, como moveSingleAccountChannelSectionToDefaultAccount(...).
Use createSetupTranslator(...) para textos fixos do assistente de configuração. Ele segue a localidade do assistente da CLI (OPENCLAW_LOCALE e, em seguida, as variáveis de localidade do sistema) e usa o inglês como alternativa. Mantenha o texto de configuração específico do plugin no código pertencente ao plugin e use chaves compartilhadas do catálogo somente para rótulos comuns de configuração, textos de status e textos de configuração dos plugins oficiais incluídos.
Os adaptadores de alteração da configuração continuam seguros para importação em caminhos críticos. A consulta à superfície do contrato incluído de promoção de conta única é preguiçosa; portanto, importar plugin-sdk/setup-runtime não carrega antecipadamente a descoberta das superfícies de contrato incluídas antes de o adaptador ser efetivamente usado.
Promoção de conta única pertencente ao canal
Quando um canal migra de uma configuração de nível superior com uma única conta para channels.<id>.accounts.*, o comportamento compartilhado padrão move os valores promovidos com escopo de conta para accounts.default.
Canais incluídos podem restringir ou substituir essa promoção por meio de sua superfície de contrato de configuração:
singleAccountKeysToMove: chaves adicionais de nível superior que devem ser movidas para a conta promovidanamedAccountPromotionKeys: quando já existem contas nomeadas, somente essas chaves são movidas para a conta promovida; as chaves compartilhadas de política e entrega permanecem na raiz do canalresolveSingleAccountPromotionTarget(...): escolhe qual conta existente recebe os valores promovidos
Esquema de configuração
A configuração do plugin é validada em relação ao JSON Schema do manifesto. Os usuários configuram plugins por meio de:
{ plugins: { entries: { "my-plugin": { config: { webhookSecret: "abc123", }, }, }, },}Seu plugin recebe essa configuração como api.pluginConfig durante o registro.
Para configurações específicas do canal, use a seção de configuração do canal:
{ channels: { "my-channel": { token: "bot-token", allowFrom: ["user1", "user2"], }, },}Criação de esquemas de configuração de canais
Use buildChannelConfigSchema para converter um esquema Zod no invólucro ChannelConfigSchema usado pelos artefatos de configuração pertencentes ao plugin:
const accountSchema = z.object({ token: z.string().optional(), allowFrom: z.array(z.string()).optional(), accounts: z.object({}).catchall(z.any()).optional(), defaultAccount: z.string().optional(),}); const configSchema = buildChannelConfigSchema(accountSchema);Se você já define o contrato como JSON Schema ou TypeBox, use o auxiliar direto para que o OpenClaw possa ignorar a conversão de Zod para JSON Schema nos caminhos de metadados:
const configSchema = buildJsonChannelConfigSchema( Type.Object({ token: Type.Optional(Type.String()), allowFrom: Type.Optional(Type.Array(Type.String())), }),);Para plugins de terceiros, o contrato do caminho não crítico ainda é o manifesto do plugin: replique o JSON Schema gerado em openclaw.plugin.json#channelConfigs para que as superfícies de esquema de configuração, configuração inicial e interface possam inspecionar channels.<id> sem carregar o código de execução.
Assistentes de configuração
Plugins de canal podem fornecer assistentes interativos de configuração para openclaw onboard. O assistente é um objeto ChannelSetupWizard no ChannelPlugin:
const setupWizard: ChannelSetupWizard = { channel: "my-channel", status: { configuredLabel: "Connected", unconfiguredLabel: "Not configured", resolveConfigured: ({ cfg }) => Boolean((cfg.channels as any)?.["my-channel"]?.token), }, credentials: [ { inputKey: "token", providerHint: "my-channel", credentialLabel: "Bot token", preferredEnvVar: "MY_CHANNEL_BOT_TOKEN", envPrompt: "Use MY_CHANNEL_BOT_TOKEN from environment?", keepPrompt: "Keep current token?", inputPrompt: "Enter your bot token:", inspect: ({ cfg, accountId }) => { const token = (cfg.channels as any)?.["my-channel"]?.token; return { accountConfigured: Boolean(token), hasConfiguredValue: Boolean(token), }; }, }, ],};ChannelSetupWizard também aceita textInputs, dmPolicy, allowFrom, groupAccess, prepare, finalize e outros recursos. Consulte src/setup-core.ts do plugin do Discord para ver um exemplo completo incluído.
Solicitações compartilhadas de allowFrom
Para solicitações de lista de permissões de mensagens diretas que precisam apenas do fluxo padrão note -> prompt -> parse -> merge -> patch, prefira os auxiliares compartilhados de configuração de openclaw/plugin-sdk/setup: createPromptParsedAllowFromForAccount(...), createTopLevelChannelParsedAllowFromPrompt(...) e createNestedChannelParsedAllowFromPrompt(...).
Status padrão da configuração do canal
Para blocos de status da configuração do canal que variam somente em rótulos, pontuações e linhas adicionais opcionais, prefira createStandardChannelSetupStatus(...) de openclaw/plugin-sdk/setup em vez de criar manualmente o mesmo objeto status em cada plugin.
Superfície opcional de configuração do canal
Para superfícies opcionais de configuração que devem aparecer somente em determinados contextos, use createOptionalChannelSetupSurface de openclaw/plugin-sdk/channel-setup:
import { createOptionalChannelSetupSurface } from "openclaw/plugin-sdk/channel-setup"; const setupSurface = createOptionalChannelSetupSurface({ channel: "my-channel", label: "My Channel", npmSpec: "@myorg/openclaw-my-channel", docsPath: "/channels/my-channel",});// Returns { setupAdapter, setupWizard }plugin-sdk/channel-setup também expõe os construtores de nível mais baixo createOptionalChannelSetupAdapter(...) e createOptionalChannelSetupWizard(...) quando você precisa apenas de uma das partes dessa superfície de instalação opcional.
O adaptador/assistente opcional gerado falha de forma segura em gravações reais de configuração. Eles reutilizam uma única mensagem de instalação obrigatória em validateInput, applyAccountConfig e finalize, e acrescentam um link para a documentação quando docsPath está definido.
Auxiliares de configuração baseados em binários
Para interfaces de configuração baseadas em binários, prefira os auxiliares compartilhados de delegação em vez de copiar a mesma lógica de integração de binário/status para cada canal:
createDetectedBinaryStatus(...)para blocos de status que variam apenas por rótulos, dicas, pontuações e detecção de bináriocreateCliPathTextInput(...)para entradas de texto baseadas em caminhoscreateDelegatedSetupWizardStatusResolvers(...),createDelegatedPrepare(...),createDelegatedFinalize(...)ecreateDelegatedResolveConfigured(...)quandosetupEntryprecisar encaminhar de forma adiada para um assistente completo mais robustocreateDelegatedTextInputShouldPrompt(...)quandosetupEntryprecisar apenas delegar uma decisão detextInputs[*].shouldPrompt
Publicação e instalação
Plugins externos: publique no ClawHub e depois instale:
npm
openclaw plugins install @myorg/openclaw-my-pluginEspecificações simples de pacotes são instaladas pelo npm durante a transição de inicialização, a menos que o nome corresponda ao ID de um plugin incluído ou oficial; nesse caso, o OpenClaw usa a respectiva cópia local/oficial. Use clawhub:, npm:, git: ou npm-pack: para selecionar a origem de forma determinística — consulte Gerenciar plugins.
Somente ClawHub
openclaw plugins install clawhub:@myorg/openclaw-my-pluginEspecificação de pacote npm
Use o npm quando um pacote ainda não tiver migrado para o ClawHub ou quando você precisar de um caminho de instalação direta pelo npm durante a migração:
openclaw plugins install npm:@myorg/openclaw-my-pluginPlugins no repositório: coloque-os na árvore do espaço de trabalho de plugins incluídos; eles são descobertos automaticamente durante a compilação.
Os metadados dos pacotes incluídos são explícitos, não inferidos do JavaScript compilado durante a inicialização do Gateway. As dependências de tempo de execução devem estar no pacote do plugin que as possui; a inicialização do OpenClaw empacotado nunca repara nem espelha dependências de plugins.
Relacionado
- Criação de plugins — guia de introdução passo a passo
- Manifesto de plugin — referência completa do esquema do manifesto
- Pontos de entrada do SDK —
definePluginEntryedefineChannelPluginEntry