Criando plugins de canal
Este guia mostra como criar um plugin de canal que conecta o OpenClaw a uma plataforma de mensagens. Ao final, você terá um canal funcional com segurança de DM, emparelhamento, encadeamento de respostas e envio de mensagens.Se você ainda não criou nenhum plugin do OpenClaw, leia
Primeiros passos primeiro para entender a estrutura
básica do pacote e a configuração do manifesto.
Como os plugins de canal funcionam
Os plugins de canal não precisam de suas próprias ferramentas de enviar/editar/reagir. O OpenClaw mantém uma ferramenta compartilhadamessage no core. Seu plugin é responsável por:
- Configuração — resolução de conta e assistente de configuração
- Segurança — política de DM e allowlists
- Emparelhamento — fluxo de aprovação de DM
- Gramática de sessão — como ids de conversa específicos do provedor se mapeiam para chats base, ids de thread e fallbacks de pai
- Saída — envio de texto, mídia e enquetes para a plataforma
- Encadeamento — como as respostas são encadeadas
:thread: e pelo despacho.
Se a sua plataforma armazenar escopo extra dentro dos ids de conversa, mantenha essa análise
no plugin com messaging.resolveSessionConversation(...). Esse é o hook
canônico para mapear rawId para o id base da conversa, um id de thread
opcional, baseConversationId explícito e quaisquer
parentConversationCandidates.
Ao retornar parentConversationCandidates, mantenha-os ordenados do pai
mais específico para a conversa pai/base mais ampla.
Plugins integrados que precisem da mesma análise antes de o registro de canais ser inicializado
também podem expor um arquivo session-key-api.ts de nível superior com uma exportação
resolveSessionConversation(...) correspondente. O core usa essa superfície segura para bootstrap
somente quando o registro de plugins em runtime ainda não está disponível.
messaging.resolveParentConversationCandidates(...) continua disponível como fallback legado
de compatibilidade quando um plugin só precisa de fallbacks de pai além do
id bruto/genérico. Se ambos os hooks existirem, o core usará primeiro
resolveSessionConversation(...).parentConversationCandidates e só fará fallback para
resolveParentConversationCandidates(...) quando o hook canônico
não os incluir.
Aprovações e capacidades de canal
A maioria dos plugins de canal não precisa de código específico de aprovação.- O core é responsável por
/approveno mesmo chat, payloads compartilhados de botão de aprovação e entrega genérica de fallback. - Prefira um único objeto
approvalCapabilityno plugin do canal quando o canal precisar de comportamento específico de aprovação. approvalCapability.authorizeActorActioneapprovalCapability.getActionAvailabilityStatesão a superfície canônica de autenticação de aprovação.- Use
outbound.shouldSuppressLocalPayloadPromptououtbound.beforeDeliverPayloadpara comportamento específico do canal no ciclo de vida do payload, como ocultar prompts locais de aprovação duplicados ou enviar indicadores de digitação antes da entrega. - Use
approvalCapability.deliveryapenas para roteamento nativo de aprovação ou supressão de fallback. - Use
approvalCapability.renderapenas quando um canal realmente precisar de payloads de aprovação personalizados em vez do renderizador compartilhado. - Se um canal puder inferir identidades de DM estáveis semelhantes a proprietário a partir da configuração existente, use
createResolvedApproverActionAuthAdapterdeopenclaw/plugin-sdk/approval-runtimepara restringir/approveno mesmo chat sem adicionar lógica específica de aprovação no core. - Se um canal precisar de entrega nativa de aprovação, mantenha o código do canal focado em normalização de destino e hooks de transporte. Use
createChannelExecApprovalProfile,createChannelNativeOriginTargetResolver,createChannelApproverDmTargetResolver,createApproverRestrictedNativeApprovalCapabilityecreateChannelNativeApprovalRuntimedeopenclaw/plugin-sdk/approval-runtimepara que o core seja responsável por filtragem de solicitações, roteamento, deduplicação, expiração e assinatura no gateway. - Canais com aprovação nativa devem encaminhar tanto
accountIdquantoapprovalKindpor esses helpers.accountIdmantém a política de aprovação multi-conta limitada à conta correta do bot, eapprovalKindmantém o comportamento de aprovação de exec vs plugin disponível para o canal sem branches codificados no core. - Preserve o tipo do id de aprovação entregue de ponta a ponta. Clientes nativos não devem adivinhar nem reescrever o roteamento de aprovação exec vs plugin com base em estado local do canal.
- Diferentes tipos de aprovação podem intencionalmente expor diferentes superfícies nativas.
Exemplos integrados atuais:
- O Slack mantém o roteamento nativo de aprovação disponível tanto para ids de exec quanto de plugin.
- O Matrix mantém o roteamento nativo de DM/canal apenas para aprovações de exec e deixa
aprovações de plugin no caminho compartilhado
/approveno mesmo chat.
createApproverRestrictedNativeApprovalAdapterainda existe como wrapper de compatibilidade, mas o código novo deve preferir o construtor de capability e exporapprovalCapabilityno plugin.
openclaw/plugin-sdk/approval-auth-runtimeopenclaw/plugin-sdk/approval-client-runtimeopenclaw/plugin-sdk/approval-delivery-runtimeopenclaw/plugin-sdk/approval-native-runtimeopenclaw/plugin-sdk/approval-reply-runtime
openclaw/plugin-sdk/setup-runtime,
openclaw/plugin-sdk/setup-adapter-runtime,
openclaw/plugin-sdk/reply-runtime,
openclaw/plugin-sdk/reply-dispatch-runtime,
openclaw/plugin-sdk/reply-reference e
openclaw/plugin-sdk/reply-chunking quando você não precisar da
superfície guarda-chuva mais ampla.
Especificamente para setup:
openclaw/plugin-sdk/setup-runtimecobre os helpers de setup seguros para runtime: adaptadores de patch de setup seguros para importação (createPatchedAccountSetupAdapter,createEnvPatchedAccountSetupAdapter,createSetupInputPresenceValidator), saída de nota de lookup,promptResolvedAllowFrom,splitSetupEntriese os construtores de proxy de setup delegadoopenclaw/plugin-sdk/setup-adapter-runtimeé a superfície estreita de adaptador compatível com env paracreateEnvPatchedAccountSetupAdapteropenclaw/plugin-sdk/channel-setupcobre os construtores de setup de instalação opcional, além de alguns primitivos seguros para setup:createOptionalChannelSetupSurface,createOptionalChannelSetupAdapter,createOptionalChannelSetupWizard,DEFAULT_ACCOUNT_ID,createTopLevelChannelDmPolicy,setSetupChannelEnabledesplitSetupEntries- use a superfície mais ampla
openclaw/plugin-sdk/setupsomente quando também precisar dos helpers compartilhados mais pesados de setup/configuração, comomoveSingleAccountChannelSectionToDefaultAccount(...)
createOptionalChannelSetupSurface(...). O adaptador/assistente gerado falha de forma fechada em gravações de configuração e finalização, e reutiliza
a mesma mensagem de instalação obrigatória em validação, finalização e texto de link para a documentação.
Para outros caminhos de canal sensíveis a desempenho, prefira os helpers estreitos em vez de
superfícies legadas mais amplas:
openclaw/plugin-sdk/account-core,openclaw/plugin-sdk/account-id,openclaw/plugin-sdk/account-resolutioneopenclaw/plugin-sdk/account-helperspara configuração multi-conta e fallback da conta padrãoopenclaw/plugin-sdk/inbound-envelopeeopenclaw/plugin-sdk/inbound-reply-dispatchpara rota/envelope de entrada e integração de registrar e despacharopenclaw/plugin-sdk/messaging-targetspara análise/correspondência de destinoopenclaw/plugin-sdk/outbound-mediaeopenclaw/plugin-sdk/outbound-runtimepara carregamento de mídia mais delegados de identidade/envio de saídaopenclaw/plugin-sdk/thread-bindings-runtimepara ciclo de vida do vínculo de thread e registro de adaptadoropenclaw/plugin-sdk/agent-media-payloadsomente quando um layout de campo de payload legado de agente/mídia ainda for necessárioopenclaw/plugin-sdk/telegram-command-configpara normalização de comandos personalizados do Telegram, validação de duplicatas/conflitos e contrato de configuração de comando estável para fallback
Passo a passo
Pacote e manifesto
Crie os arquivos padrão do plugin. O campo
channel em package.json é
o que torna este um plugin de canal. Para a superfície completa de metadados do pacote,
veja Setup e configuração do plugin:Criar o objeto do plugin de canal
A interface
ChannelPlugin tem muitas superfícies de adaptador opcionais. Comece com
o mínimo — id e setup — e adicione adaptadores conforme necessário.Crie src/channel.ts:src/channel.ts
O que `createChatChannelPlugin` faz por você
O que `createChatChannelPlugin` faz por você
Em vez de implementar manualmente interfaces de adaptador de baixo nível, você fornece
opções declarativas e o construtor as compõe:
Você também pode passar objetos de adaptador brutos em vez das opções declarativas
se precisar de controle total.
| Opção | O que ela conecta |
|---|---|
security.dm | Resolvedor de segurança de DM com escopo a partir de campos de configuração |
pairing.text | Fluxo de emparelhamento de DM baseado em texto com troca de código |
threading | Resolvedor de modo de resposta (fixo, com escopo por conta ou personalizado) |
outbound.attachedResults | Funções de envio que retornam metadados do resultado (ids de mensagem) |
Conectar o entry point
Crie Coloque descritores de CLI pertencentes ao canal em
index.ts:index.ts
registerCliMetadata(...) para que o OpenClaw
possa mostrá-los na ajuda raiz sem ativar o runtime completo do canal,
enquanto carregamentos completos normais ainda incorporam os mesmos descritores para o registro real de comandos.
Mantenha registerFull(...) para trabalho somente de runtime.
Se registerFull(...) registrar métodos RPC do gateway, use um
prefixo específico do plugin. Namespaces administrativos do core (config.*,
exec.approvals.*, wizard.*, update.*) permanecem reservados e sempre
resolvem para operator.admin.
defineChannelPluginEntry lida automaticamente com a divisão por modo de registro. Veja
Entry points para todas as
opções.Adicionar um entry de setup
Crie O OpenClaw carrega isso em vez do entry completo quando o canal está desativado
ou não configurado. Isso evita puxar código pesado de runtime durante os fluxos de setup.
Veja Setup e configuração para detalhes.
setup-entry.ts para carregamento leve durante o onboarding:setup-entry.ts
Lidar com mensagens de entrada
Seu plugin precisa receber mensagens da plataforma e encaminhá-las para o
OpenClaw. O padrão típico é um webhook que verifica a solicitação e a
despacha por meio do handler de entrada do seu canal:
O tratamento de mensagens de entrada é específico de cada canal. Cada plugin de canal
é responsável pelo seu próprio pipeline de entrada. Veja plugins de canal integrados
(por exemplo, o pacote de plugin Microsoft Teams ou Google Chat) para padrões reais.
Testar
Escreva testes colocados ao lado do código em Para helpers de teste compartilhados, veja Testes.
src/channel.test.ts:src/channel.test.ts
Estrutura de arquivos
Tópicos avançados
Opções de encadeamento
Modos de resposta fixos, com escopo por conta ou personalizados
Integração com a ferramenta de mensagem
describeMessageTool e descoberta de ações
Resolução de destino
inferTargetChatType, looksLikeId, resolveTarget
Helpers de runtime
TTS, STT, mídia, subagente via api.runtime
Algumas superfícies de helper integradas ainda existem para manutenção e
compatibilidade de plugins integrados. Elas não são o padrão recomendado para novos plugins de canal;
prefira os subpaths genéricos de channel/setup/reply/runtime da superfície comum do SDK,
a menos que você esteja mantendo diretamente essa família de plugins integrados.
Próximos passos
- Plugins de provedor — se o seu plugin também fornecer modelos
- Visão geral do SDK — referência completa de importação de subpaths
- Testes do SDK — utilitários de teste e testes de contrato
- Manifesto do plugin — schema completo do manifesto