Esta página destina-se a autores de plugins que usam
openclaw/plugin-sdk/* no
OpenClaw. Para aplicativos externos, scripts, painéis, tarefas de CI e extensões de IDE
que desejam executar agentes por meio do Gateway, use
Integrações do Gateway para aplicativos externos.Convenção de importação
Sempre importe de um subcaminho específico:openclaw/plugin-sdk/channel-core; reserve openclaw/plugin-sdk/core para
a superfície abrangente mais ampla e auxiliares compartilhados, como
buildChannelConfigSchema.
Para a configuração de canais, publique o JSON Schema pertencente ao canal por meio de
openclaw.plugin.json#channelConfigs. O subcaminho plugin-sdk/channel-config-schema
destina-se a primitivas de esquema compartilhadas e ao construtor genérico. Os plugins
incluídos no OpenClaw usam plugin-sdk/bundled-channel-config-schema para esquemas
mantidos de canais incluídos. Exportações de compatibilidade obsoletas permanecem em
plugin-sdk/channel-config-schema-legacy; nenhum dos subcaminhos de esquemas incluídos é um
padrão para novos plugins.
Referência de subcaminhos
O SDK de plugins é exposto como um conjunto de subcaminhos restritos agrupados por área (entrada do plugin, canal, provedor, autenticação, runtime, capacidade, memória e auxiliares reservados para plugins incluídos). Para consultar o catálogo completo — agrupado e com links —, veja Subcaminhos do SDK de plugins. O inventário de pontos de entrada do compilador fica emscripts/lib/plugin-sdk-entrypoints.json; as exportações do pacote são geradas a partir
do subconjunto público após a exclusão dos subcaminhos internos/de teste locais do repositório listados em
scripts/lib/plugin-sdk-private-local-only-subpaths.json. Execute
pnpm plugin-sdk:surface para auditar a quantidade de exportações públicas. Subcaminhos públicos
obsoletos que são antigos o suficiente e não são usados pelo código de produção das extensões incluídas são
registrados em scripts/lib/plugin-sdk-deprecated-public-subpaths.json; módulos agregadores
amplos e obsoletos de reexportação são registrados em
scripts/lib/plugin-sdk-deprecated-barrel-subpaths.json.
API de registro
O callbackregister(api) recebe um objeto OpenClawPluginApi com estes
métodos:
Registro de capacidades
Os provedores de workers também devem declarar seu identificador em
contracts.workerProviders.
O núcleo persiste a intenção durável antes de provision(profile, operationId). Os provedores validam as configurações antes da alocação externa e lançam WorkerProviderError em caso de rejeição permanente do perfil. provision deve adotar a mesma concessão quando o identificador da operação se repetir.
O núcleo persiste com a concessão as configurações validadas do perfil e fornece esse instantâneo a destroy({ leaseId, profile }), que deve ser idempotente, e a inspect({ leaseId, profile }), que retorna active, destroyed ou unknown. Isso permite que os provedores encaminhem chamadas do ciclo de vida após a reinicialização de um Gateway ou a remoção de um perfil nomeado. Endpoints SSH usam uma SecretRef para keyRef, nunca material de chave embutido, e incluem uma hostKey proveniente de uma saída de provisionamento confiável exatamente no formato algorithm base64, sem nome de host nem comentário. O núcleo fixa a hostKey e nunca confia em uma chave obtida na primeira conexão. Um provedor que gere uma keyRef dinâmica pode implementar resolveSshIdentity({ leaseId, profile, keyRef }); quando presente, esse resolvedor é a autoridade, enquanto provedores sem ele usam o resolvedor genérico de segredos configurado.
Provedores com concessões renováveis também podem implementar renew(leaseId).
inspect deve lançar um erro em falhas transitórias ou indeterminadas; retorne unknown somente quando a ausência for confirmada de forma conclusiva. O núcleo marca um registro local ativo como órfão ou trata a ausência como conclusão da desmontagem após uma solicitação de destruição persistida.
Os provedores de embeddings registrados com api.registerEmbeddingProvider(...) também devem
ser listados em contracts.embeddingProviders no manifesto do plugin. Essa
é a superfície genérica de embeddings para geração reutilizável de vetores. A busca na memória
pode consumir essa superfície genérica de provedor. A interface mais antiga
api.registerMemoryEmbeddingProvider(...) e
contracts.memoryEmbeddingProviders é mantida como compatibilidade obsoleta enquanto
os provedores específicos de memória existentes são migrados.
Provedores específicos de memória que ainda expõem um batchEmbed(...) em runtime permanecem no
contrato existente de processamento em lotes por arquivo, a menos que seu runtime defina explicitamente
sourceWideBatchEmbed: true. Essa opção permite que o host da memória envie trechos de
vários arquivos de memória modificados e fontes habilitadas em uma única chamada a batchEmbed(...),
até os limites de lote do host. Adaptadores de lote que enviam arquivos de solicitação JSONL também devem
dividir as tarefas do provedor antes de atingir o limite de tamanho de upload e o limite da quantidade
de solicitações. O provedor deve retornar um embedding por trecho de entrada na mesma ordem de
batch.chunks; omita a opção quando o provedor esperar lotes locais de cada arquivo ou
não puder preservar a ordem das entradas em uma tarefa maior que abranja toda a fonte.
Ferramentas e comandos
UsedefineToolPlugin para plugins simples que contêm apenas ferramentas
com nomes fixos. Use api.registerTool(...) diretamente para plugins mistos
ou para o registro totalmente dinâmico de ferramentas.
Os comandos de plugins podem definir
agentPromptGuidance quando o agente precisa de uma dica curta
de roteamento pertencente ao comando. Mantenha esse texto relacionado ao próprio comando; não adicione
políticas específicas de provedores ou plugins aos construtores de prompts do núcleo.
As entradas de orientação podem ser strings legadas, que se aplicam a todas as superfícies de prompt, ou
entradas estruturadas:
surfaces estruturadas podem incluir openclaw_main, codex_app_server,
cli_backend, acp_backend ou subagent. pi_main permanece como um alias obsoleto
de openclaw_main. Omita surfaces para orientações intencionalmente aplicáveis a todas as superfícies. Não
forneça um array surfaces vazio; ele é rejeitado para que a perda acidental de escopo não
transforme o texto em um prompt global.
As instruções nativas de desenvolvedor do servidor de aplicativos Codex são mais rigorosas que as demais superfícies de
prompt: somente orientações cujo escopo inclua explicitamente codex_app_server são promovidas para
essa faixa de prioridade mais alta. Orientações em strings legadas e orientações estruturadas sem
escopo permanecem disponíveis para superfícies de prompt que não sejam do Codex por compatibilidade.
Os comandos do host Node são executados no host Node conectado, não dentro do
processo do Gateway. Se agentTool estiver presente, o Node publicará um descritor após uma
conexão bem-sucedida ao Gateway; o Gateway o disponibilizará às execuções do agente somente enquanto esse
Node estiver conectado e apenas se o command do descritor estiver na superfície de comandos
aprovada do Node. Defina agentTool.defaultPlatforms para incluir um
comando não perigoso na lista de permissões padrão de comandos do Node; caso contrário, exija
uma configuração explícita de gateway.nodes.allowCommands ou uma política de invocação pelo Node. agentTool.name
deve ser seguro para o provedor: começar com uma letra, usar apenas letras, dígitos,
sublinhados ou hifens e ter no máximo 64 caracteres. As ferramentas do Node baseadas em MCP
podem definir metadados agentTool.mcp para que as superfícies de catálogo e busca de ferramentas exibam
a identidade do servidor/ferramenta MCP remota, mas a execução ainda ocorre por meio do
comando anunciado pelo Node.
Infraestrutura
Os construtores de suplementos de prompt de memória recebem o contexto opcional
agentId,
agentSessionKey e sandboxed. As chamadas search
e get do suplemento de corpus de memória recebem o contexto opcional agentId e sandboxed. Plugins com
armazenamento pertencente ao agente devem resolver esse armazenamento em cada chamada, em vez de
capturar um único caminho global durante o registro. Se um ID de agente for obrigatório, mas
estiver ausente em uma operação multiagente, encerre de forma segura em vez de escolher um
agente arbitrário.
Os manipuladores interativos do Telegram podem retornar { submitText } para encaminhar o texto pelo
fluxo normal de entrada do agente do Telegram após o sucesso do manipulador. O OpenClaw mantém
o botão de callback quando a política de entrada ignora o texto ou o processamento falha, para que
o usuário possa tentar novamente após a mudança da condição de bloqueio. Este campo de resultado é
específico do Telegram; outros canais mantêm seus próprios contratos de resultado interativo.
Hooks do host para Plugins de fluxo de trabalho
Os 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 de Planejamento pode usá-los, assim como fluxos de trabalho de aprovação, controles de política do espaço de trabalho, monitores em segundo plano, assistentes de configuração e Plugins complementares de interface.
Um descritor
surface: "tab" adiciona uma aba da barra lateral à Interface de Controle. Os descritores
de aba dos Plugins ativos são anunciados aos clientes do painel na mensagem hello do Gateway
(controlUiTabs), portanto a aba aparece apenas enquanto o Plugin está habilitado.
Plugins integrados podem fornecer uma visualização de painel própria para sua aba; outros
Plugins podem definir path como uma rota HTTP do Plugin (consulte
api.registerHttpRoute(...)) que o painel renderiza em um quadro isolado.
icon é uma sugestão de nome de ícone do painel, group seleciona a seção da barra lateral
(control ou agent), order ordena as abas dos Plugins e requiredScopes
oculta a aba de conexões que não possuem esses escopos de operador:
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(...)
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 ou
api.unscheduleSessionTurnsByTag diretamente.
scheduleSessionTurn(...) é uma conveniência com escopo de sessão sobre o agendador
Cron do Gateway. O Cron controla o tempo e cria o registro da tarefa em segundo plano quando o
turno é executado; o SDK de Plugin apenas restringe a sessão de destino, a
nomenclatura pertencente ao Plugin e a limpeza. Use api.runtime.tasks.managedFlows dentro do turno
agendado quando o trabalho em si precisar de um estado durável de fluxo de várias etapas do TaskFlow.
Os contratos separam intencionalmente a autoridade:
- Plugins externos podem controlar extensões de sessão, descritores de interface, comandos, metadados de ferramentas, injeções no próximo turno e hooks normais.
- As políticas confiáveis de ferramentas são executadas antes dos hooks comuns
before_tool_calle são confiadas pelo host. As políticas integradas são executadas primeiro; as políticas de Plugins instalados exigem habilitação explícita, além de seus IDs locais emcontracts.trustedToolPolicies, e são executadas em seguida, na ordem de carregamento dos Plugins. Os IDs das políticas têm escopo restrito ao Plugin que as registra. - A propriedade de comandos reservados é exclusiva de Plugins integrados. Plugins externos devem usar seus próprios nomes de comandos ou aliases.
allowPromptInjection=falsedesabilita hooks que alteram o prompt, incluindoagent_turn_prepare,before_prompt_build,heartbeat_prompt_contribution, campos de prompt dobefore_agent_startlegado eenqueueNextTurnInjection.
Os namespaces administrativos reservados do núcleo (
config.*, exec.approvals.*, wizard.*,
update.*) sempre permanecem como operator.admin, mesmo que um plugin tente atribuir um
escopo mais restrito de método do gateway. Prefira prefixos específicos do plugin para
métodos pertencentes ao plugin.Quando usar middleware de resultado de ferramenta
Quando usar middleware de resultado de ferramenta
Plugins integrados e plugins instalados explicitamente habilitados com contratos
de manifesto correspondentes 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 novamente ao modelo. Essa é a interface confiável e neutra em relação ao
runtime para redutores de saída assíncronos, como tokenjuice.Os plugins devem declarar contracts.agentToolResultMiddleware para cada runtime
de destino, por exemplo, ["openclaw", "codex"]. Plugins instalados sem esse
contrato, ou sem habilitação explícita, não podem registrar esse middleware; mantenha
os hooks normais de plugin do OpenClaw para trabalhos que não precisam da temporização
do resultado da ferramenta antes do modelo. O antigo caminho de registro da fábrica de
extensões exclusivo do executor incorporado 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, transmite as
portas atuais do Gateway e dados de dica TXT não secretos, e chama o manipulador
stop retornado durante o encerramento do Gateway.
Metadados de registro da CLI
api.registerCli(registrar, opts?) aceita dois tipos de metadados de comando:
commands: nomes explícitos de comandos pertencentes ao registradordescriptors: descritores de comandos 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"]
api.registerNodeCliFeature(registrar, opts?). Ele é um pequeno wrapper em torno de
api.registerCli(..., { parentPath: ["nodes"] }) e torna comandos como
openclaw nodes canvas recursos de Node explicitamente pertencentes ao plugin.
Se quiser que um comando de plugin permaneça com carregamento preguiçoso no caminho normal da CLI raiz,
forneça descriptors que cubram cada raiz de comando de nível superior exposta por esse
registrador.
program:
commands somente quando não precisar do registro preguiçoso da CLI raiz.
Esse caminho de compatibilidade com carregamento imediato continua sendo compatível, mas não instala
espaços reservados 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 local de CLI de IA, como claude-cli ou my-cli.
- O
iddo backend se torna o prefixo do provedor em referências de modelo comomy-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 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 pertençam ao dialeto da CLI, como mapear níveis de raciocínio do OpenClaw para uma flag nativa de esforço. O hook recebectx.executionMode; use"side-question"para adicionar flags de isolamento nativas do backend para chamadas efêmeras de/btw. Se essas flags desabilitarem de forma confiável as ferramentas nativas de uma CLI que, de outra forma, as manteria sempre ativas, declare tambémsideQuestionToolMode: "disabled". - Backends que podem desabilitar todas as ferramentas nativas para uma execução específica podem declarar
nativeToolMode: "selectable". Chamadas restritas transmitem uma tuplactx.toolAvailability.nativevazia, além de uma lista de permissões MCP exata e isolada do host;resolveExecutionArgsdeve impor ambas no argv final, seja em uma execução nova ou retomada. O OpenClaw falha de forma fechada se o backend não puder fazer isso.
Slots exclusivos
Adaptadores obsoletos de embedding de memória
registerMemoryCapabilityé a API exclusiva preferencial para plugins de memória.registerMemoryCapabilitytambém pode exporpublicArtifacts.listArtifacts(...)para que plugins complementares possam consumir 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 versões legadas.MemoryFlushPlan.modelpode fixar o turno de liberação em uma referência exata deprovider/model, comoollama/qwen3:8b, sem herdar a cadeia de fallback ativa.registerMemoryEmbeddingProviderestá obsoleto. Novos provedores de embedding devem usarapi.registerEmbeddingProvider(...)econtracts.embeddingProviders.- Provedores existentes específicos de memória continuam funcionando durante a janela de migração, mas a inspeção de plugins relata isso como dívida de compatibilidade para plugins não integrados.
Eventos e ciclo de vida
Consulte Hooks de Plugin para ver exemplos, nomes comuns de hooks e semântica
de proteções.
Semântica de decisão dos hooks
before_install é um hook de ciclo de vida do runtime do plugin, não a superfície de política
de instalação do operador. Use security.installPolicy quando uma decisão de permitir/bloquear precisar
abranger caminhos de instalação ou atualização baseados na CLI e no Gateway.
before_tool_call: retornar{ block: true }é terminal. Assim que qualquer manipulador o definir, os manipuladores de prioridade inferior serão ignorados.before_tool_call: retornar{ block: false }é tratado como nenhuma decisão (o mesmo que omitirblock), não como uma substituição.before_install: retornar{ block: true }é terminal. Assim que qualquer manipulador o definir, os manipuladores de prioridade inferior serão ignorados.before_install: retornar{ block: false }é tratado como nenhuma decisão (o mesmo que omitirblock), não como uma substituição.reply_dispatch: retornar{ handled: true, ... }é terminal. Assim que qualquer manipulador assumir o despacho, os manipuladores de prioridade inferior e o caminho padrão de despacho do modelo serão ignorados.message_sending: retornar{ cancel: true }é terminal. Assim que qualquer manipulador o definir, os manipuladores de prioridade inferior serão ignorados.message_sending: retornar{ cancel: false }é tratado como nenhuma decisão (o mesmo que omitircancel), não como uma substituição.message_received: use o campo tipadothreadIdquando precisar rotear threads/tópicos de entrada. Reservemetadatapara dados adicionais 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 o estado de inicialização pertencente ao Gateway, em vez de depender dos hooks internosgateway:startup. O Cron ainda pode estar sendo carregado nesse momento.cron_reconciled: reconstrua uma projeção externa completa do Cron após a inicialização ou o recarregamento do agendador. Ela incluireasone o estado efetivo deenabled, inclusiveenabled: false, enquantoctx.getCron?.()retorna o agendador reconciliado exato. Passectx.abortSignalao trabalho de projeção durável; ele é abortado quando esse instantâneo do agendador é substituído ou o Gateway é fechado.cron_changed: observe as alterações no ciclo de vida do Cron pertencente ao Gateway. Os eventosschedulederemovedsão indicações de reconciliação pós-confirmação, não um registro ordenado de alterações. Oevent.nextRunAtMsde um evento agendado fica ausente quando a tarefa não tem uma próxima ativação; um evento removido ainda contém o instantâneo da tarefa excluída.
cron_changed
e, em seguida, reler a visão durável completa a partir do último agendador capturado por
cron_reconciled. Não adote o agendador de um contexto cron_changed: uma
indicação desacoplada de um agendador mais antigo pode se sobrepor a um recarregamento posterior.
Use cron_reconciled como gatilho de instantâneo completo para o estado durável carregado na
inicialização do Gateway ou na substituição do agendador. Ele não é reproduzido em um
recarregamento dinâmico apenas do Plugin. Os manipuladores de observação são executados em paralelo,
e despachos sem espera podem se sobrepor, portanto os consumidores não devem depender da ordem
de conclusão dos eventos. Mantenha o OpenClaw como fonte da verdade para verificações de vencimento e execução.
Para um adaptador de execução única com substituição durável, novas tentativas/recuo e
encerramento limpo, consulte Projeção externa segura do Cron.
Campos do objeto da API
Convenção de módulos internos
Dentro do seu Plugin, use arquivos barrel locais para importações internas:api.ts, runtime-api.ts,
index.ts, setup-entry.ts e arquivos públicos de entrada semelhantes) dão preferência ao
instantâneo ativo da configuração do ambiente de execução quando o OpenClaw já está em execução.
Se ainda não existir um instantâneo do ambiente de execução, elas recorrem ao arquivo de configuração
resolvido no disco. As fachadas empacotadas de Plugins integrados devem ser carregadas pelos
carregadores de fachada de Plugins do OpenClaw; importações diretas de dist/extensions/...
ignoram as verificações de manifesto e de sidecar do ambiente de execução usadas pelas instalações
empacotadas para código pertencente ao Plugin.
Plugins de provedor podem expor um barrel de contrato restrito e local ao Plugin quando um
auxiliar é intencionalmente específico do provedor e ainda não pertence a um subcaminho genérico
do SDK. Exemplos integrados:
- Anthropic: interface pública
api.ts/contract-api.tspara auxiliares de cabeçalho beta e de fluxoservice_tierdo Claude. @openclaw/openai-provider:api.tsexporta construtores de provedor, auxiliares de modelo padrão e construtores de provedor em tempo real.@openclaw/openrouter-provider:api.tsexporta o construtor de provedor e auxiliares de integração/configuração.
Relacionados
Pontos de entrada
Opções de
definePluginEntry e defineChannelPluginEntry.Auxiliares do ambiente de execução
Referência completa do namespace
api.runtime.Configuração inicial e configuração
Empacotamento, manifestos e esquemas de configuração.
Testes
Utilitários de teste e regras de lint.
Migração do SDK
Migração de superfícies obsoletas.
Detalhes internos do Plugin
Arquitetura detalhada e modelo de recursos.