chore(i18n): refresh pt-BR translations
This commit is contained in:
parent
c3143e7df0
commit
81a4b42d69
@ -5,32 +5,32 @@ read_when:
|
||||
summary: Status do suporte ao Matrix, configuração inicial e exemplos de configuração
|
||||
title: Matrix
|
||||
x-i18n:
|
||||
generated_at: "2026-04-15T05:33:50Z"
|
||||
generated_at: "2026-04-15T19:41:33Z"
|
||||
model: gpt-5.4
|
||||
provider: openai
|
||||
source_hash: 631f6fdcfebc23136c1a66b04851a25c047535d13cceba5650b8b421bc3afcf8
|
||||
source_hash: bd730bb9d0c8a548ee48b20931b3222e9aa1e6e95f1390b0c236645e03f3576d
|
||||
source_path: channels/matrix.md
|
||||
workflow: 15
|
||||
---
|
||||
|
||||
# Matrix
|
||||
|
||||
Matrix é um Plugin de canal incluído no OpenClaw.
|
||||
Matrix é um Plugin de canal empacotado para o OpenClaw.
|
||||
Ele usa o `matrix-js-sdk` oficial e oferece suporte a DMs, salas, threads, mídia, reações, enquetes, localização e E2EE.
|
||||
|
||||
## Plugin incluído
|
||||
## Plugin empacotado
|
||||
|
||||
O Matrix é distribuído como um Plugin incluído nas versões atuais do OpenClaw, então compilações empacotadas normais não precisam de uma instalação separada.
|
||||
O Matrix é distribuído como um Plugin empacotado nas versões atuais do OpenClaw, então compilações empacotadas normais não precisam de uma instalação separada.
|
||||
|
||||
Se você estiver em uma compilação mais antiga ou em uma instalação personalizada que exclua o Matrix, instale-o manualmente:
|
||||
Se você estiver em uma compilação mais antiga ou em uma instalação personalizada que exclui o Matrix, instale-o manualmente:
|
||||
|
||||
Instale pelo npm:
|
||||
Instalar a partir do npm:
|
||||
|
||||
```bash
|
||||
openclaw plugins install @openclaw/matrix
|
||||
```
|
||||
|
||||
Instale a partir de um checkout local:
|
||||
Instalar a partir de um checkout local:
|
||||
|
||||
```bash
|
||||
openclaw plugins install ./path/to/local/matrix-plugin
|
||||
@ -40,7 +40,7 @@ Consulte [Plugins](/pt-BR/tools/plugin) para ver o comportamento dos plugins e a
|
||||
|
||||
## Configuração inicial
|
||||
|
||||
1. Verifique se o Plugin Matrix está disponível.
|
||||
1. Certifique-se de que o Plugin Matrix esteja disponível.
|
||||
- As versões empacotadas atuais do OpenClaw já o incluem.
|
||||
- Instalações antigas/personalizadas podem adicioná-lo manualmente com os comandos acima.
|
||||
2. Crie uma conta Matrix no seu homeserver.
|
||||
@ -63,30 +63,30 @@ O assistente do Matrix solicita:
|
||||
- URL do homeserver
|
||||
- método de autenticação: token de acesso ou senha
|
||||
- ID do usuário (somente autenticação por senha)
|
||||
- nome do dispositivo opcional
|
||||
- nome opcional do dispositivo
|
||||
- se deve ativar E2EE
|
||||
- se deve configurar acesso a salas e entrada automática por convite
|
||||
- se deve configurar acesso à sala e entrada automática em convites
|
||||
|
||||
Comportamentos principais do assistente:
|
||||
Principais comportamentos do assistente:
|
||||
|
||||
- Se as variáveis de ambiente de autenticação do Matrix já existirem e essa conta ainda não tiver autenticação salva na configuração, o assistente oferece um atalho de ambiente para manter a autenticação em variáveis de ambiente.
|
||||
- Se as variáveis de ambiente de autenticação do Matrix já existirem e essa conta ainda não tiver autenticação salva na configuração, o assistente oferece um atalho de env para manter a autenticação nas variáveis de ambiente.
|
||||
- Os nomes das contas são normalizados para o ID da conta. Por exemplo, `Ops Bot` se torna `ops-bot`.
|
||||
- Entradas de lista de permissões de DM aceitam `@user:server` diretamente; nomes de exibição só funcionam quando a busca em diretório ao vivo encontra uma correspondência exata.
|
||||
- Entradas de lista de permissões de sala aceitam IDs de sala e aliases diretamente. Prefira `!room:server` ou `#alias:server`; nomes não resolvidos são ignorados em tempo de execução pela resolução da lista de permissões.
|
||||
- No modo de lista de permissões para entrada automática por convite, use apenas destinos de convite estáveis: `!roomId:server`, `#alias:server` ou `*`. Nomes simples de salas são rejeitados.
|
||||
- Para resolver nomes de salas antes de salvar, use `openclaw channels resolve --channel matrix "Project Room"`.
|
||||
- Entradas da allowlist de DM aceitam `@user:server` diretamente; nomes de exibição só funcionam quando a busca ao vivo no diretório encontra uma correspondência exata.
|
||||
- Entradas da allowlist de sala aceitam IDs e aliases de sala diretamente. Prefira `!room:server` ou `#alias:server`; nomes não resolvidos são ignorados em tempo de execução pela resolução da allowlist.
|
||||
- No modo de allowlist para entrada automática em convites, use apenas destinos de convite estáveis: `!roomId:server`, `#alias:server` ou `*`. Nomes simples de sala são rejeitados.
|
||||
- Para resolver nomes de sala antes de salvar, use `openclaw channels resolve --channel matrix "Project Room"`.
|
||||
|
||||
<Warning>
|
||||
`channels.matrix.autoJoin` tem o padrão `off`.
|
||||
`channels.matrix.autoJoin` tem como padrão `off`.
|
||||
|
||||
Se você deixá-lo sem definir, o bot não entrará em salas convidadas nem em convites novos no estilo DM, então ele não aparecerá em novos grupos nem em DMs por convite, a menos que você entre manualmente primeiro.
|
||||
Se você deixá-lo sem definir, o bot não entrará em salas convidadas nem em convites novos no estilo DM, então ele não aparecerá em novos grupos ou DMs convidadas, a menos que você entre manualmente primeiro.
|
||||
|
||||
Defina `autoJoin: "allowlist"` junto com `autoJoinAllowlist` para restringir quais convites ele aceita, ou defina `autoJoin: "always"` se quiser que ele entre em todos os convites.
|
||||
|
||||
No modo `allowlist`, `autoJoinAllowlist` aceita apenas `!roomId:server`, `#alias:server` ou `*`.
|
||||
</Warning>
|
||||
|
||||
Exemplo de lista de permissões:
|
||||
Exemplo de allowlist:
|
||||
|
||||
```json5
|
||||
{
|
||||
@ -149,7 +149,7 @@ Configuração baseada em senha (o token é armazenado em cache após o login):
|
||||
|
||||
O Matrix armazena credenciais em cache em `~/.openclaw/credentials/matrix/`.
|
||||
A conta padrão usa `credentials.json`; contas nomeadas usam `credentials-<account>.json`.
|
||||
Quando existem credenciais em cache nesse local, o OpenClaw trata o Matrix como configurado para configuração inicial, doctor e detecção de status do canal, mesmo que a autenticação atual não esteja definida diretamente na configuração.
|
||||
Quando existem credenciais em cache ali, o OpenClaw trata o Matrix como configurado para configuração inicial, doctor e descoberta de status do canal, mesmo que a autenticação atual não esteja definida diretamente na configuração.
|
||||
|
||||
Equivalentes em variáveis de ambiente (usados quando a chave de configuração não está definida):
|
||||
|
||||
@ -160,7 +160,7 @@ Equivalentes em variáveis de ambiente (usados quando a chave de configuração
|
||||
- `MATRIX_DEVICE_ID`
|
||||
- `MATRIX_DEVICE_NAME`
|
||||
|
||||
Para contas não padrão, use variáveis de ambiente com escopo por conta:
|
||||
Para contas não padrão, use variáveis de ambiente com escopo de conta:
|
||||
|
||||
- `MATRIX_<ACCOUNT_ID>_HOMESERVER`
|
||||
- `MATRIX_<ACCOUNT_ID>_ACCESS_TOKEN`
|
||||
@ -179,14 +179,14 @@ Para o ID de conta normalizado `ops-bot`, use:
|
||||
- `MATRIX_OPS_X2D_BOT_HOMESERVER`
|
||||
- `MATRIX_OPS_X2D_BOT_ACCESS_TOKEN`
|
||||
|
||||
O Matrix escapa a pontuação nos IDs de conta para manter as variáveis de ambiente com escopo livres de colisão.
|
||||
Por exemplo, `-` se torna `_X2D_`, então `ops-prod` é mapeado para `MATRIX_OPS_X2D_PROD_*`.
|
||||
O Matrix escapa a pontuação nos IDs de conta para manter variáveis de ambiente com escopo sem colisões.
|
||||
Por exemplo, `-` se torna `_X2D_`, então `ops-prod` mapeia para `MATRIX_OPS_X2D_PROD_*`.
|
||||
|
||||
O assistente interativo só oferece o atalho de variável de ambiente quando essas variáveis de autenticação já estão presentes e a conta selecionada ainda não tem autenticação do Matrix salva na configuração.
|
||||
|
||||
## Exemplo de configuração
|
||||
|
||||
Esta é uma configuração base prática com pareamento de DM, lista de permissões de sala e E2EE ativado:
|
||||
Esta é uma configuração base prática com emparelhamento de DM, allowlist de sala e E2EE ativado:
|
||||
|
||||
```json5
|
||||
{
|
||||
@ -225,9 +225,9 @@ Esta é uma configuração base prática com pareamento de DM, lista de permiss
|
||||
|
||||
## Prévias de streaming
|
||||
|
||||
O streaming de respostas do Matrix é opcional.
|
||||
O streaming de respostas do Matrix é opt-in.
|
||||
|
||||
Defina `channels.matrix.streaming` como `"partial"` quando quiser que o OpenClaw envie uma única resposta de prévia ao vivo, edite essa prévia no mesmo lugar enquanto o modelo gera texto e depois a finalize quando a resposta terminar:
|
||||
Defina `channels.matrix.streaming` como `"partial"` quando quiser que o OpenClaw envie uma única resposta de prévia ao vivo, edite essa prévia no mesmo lugar enquanto o modelo gera texto e depois a finalize quando a resposta estiver pronta:
|
||||
|
||||
```json5
|
||||
{
|
||||
@ -240,34 +240,34 @@ Defina `channels.matrix.streaming` como `"partial"` quando quiser que o OpenClaw
|
||||
```
|
||||
|
||||
- `streaming: "off"` é o padrão. O OpenClaw espera a resposta final e a envia uma única vez.
|
||||
- `streaming: "partial"` cria uma mensagem de prévia editável para o bloco atual do assistente usando mensagens de texto normais do Matrix. Isso preserva o comportamento legado de notificação baseado na primeira prévia do Matrix, então clientes padrão podem notificar com o primeiro texto transmitido em streaming em vez do bloco concluído.
|
||||
- `streaming: "quiet"` cria uma prévia silenciosa editável para o bloco atual do assistente. Use isso apenas quando você também configurar regras de push do destinatário para edições de prévia finalizadas.
|
||||
- `blockStreaming: true` ativa mensagens de progresso separadas do Matrix. Com o streaming de prévia ativado, o Matrix mantém o rascunho ao vivo do bloco atual e preserva os blocos concluídos como mensagens separadas.
|
||||
- `streaming: "partial"` cria uma mensagem de prévia editável para o bloco atual do assistente usando mensagens de texto normais do Matrix. Isso preserva o comportamento legado do Matrix de notificação na primeira prévia, então clientes padrão podem notificar com base no primeiro texto transmitido em streaming em vez do bloco concluído.
|
||||
- `streaming: "quiet"` cria uma prévia editável silenciosa para o bloco atual do assistente. Use isso apenas quando você também configurar regras de push do destinatário para edições de prévia finalizadas.
|
||||
- `blockStreaming: true` ativa mensagens separadas de progresso do Matrix. Com o streaming de prévia ativado, o Matrix mantém o rascunho ao vivo para o bloco atual e preserva blocos concluídos como mensagens separadas.
|
||||
- Quando o streaming de prévia está ativado e `blockStreaming` está desativado, o Matrix edita o rascunho ao vivo no mesmo lugar e finaliza esse mesmo evento quando o bloco ou o turno termina.
|
||||
- Se a prévia não couber mais em um único evento do Matrix, o OpenClaw interrompe o streaming de prévia e volta à entrega final normal.
|
||||
- Respostas com mídia ainda enviam anexos normalmente. Se uma prévia antiga não puder mais ser reutilizada com segurança, o OpenClaw a remove antes de enviar a resposta final com mídia.
|
||||
- Se a prévia não couber mais em um único evento do Matrix, o OpenClaw interrompe o streaming de prévia e volta para a entrega final normal.
|
||||
- Respostas com mídia ainda enviam anexos normalmente. Se uma prévia antiga não puder mais ser reutilizada com segurança, o OpenClaw a redige antes de enviar a resposta final com mídia.
|
||||
- Edições de prévia geram chamadas extras à API do Matrix. Deixe o streaming desativado se quiser o comportamento mais conservador em relação a limite de taxa.
|
||||
|
||||
`blockStreaming` não ativa prévias em rascunho por si só.
|
||||
Use `streaming: "partial"` ou `streaming: "quiet"` para edições de prévia; depois adicione `blockStreaming: true` somente se você também quiser que os blocos concluídos do assistente permaneçam visíveis como mensagens de progresso separadas.
|
||||
Use `streaming: "partial"` ou `streaming: "quiet"` para edições de prévia; depois adicione `blockStreaming: true` apenas se também quiser que os blocos concluídos do assistente permaneçam visíveis como mensagens de progresso separadas.
|
||||
|
||||
Se você precisar de notificações padrão do Matrix sem regras de push personalizadas, use `streaming: "partial"` para o comportamento baseado na primeira prévia ou deixe `streaming` desativado para entrega somente final. Com `streaming: "off"`:
|
||||
Se você precisar de notificações padrão do Matrix sem regras de push personalizadas, use `streaming: "partial"` para o comportamento de prévia primeiro ou deixe `streaming` desativado para entrega somente final. Com `streaming: "off"`:
|
||||
|
||||
- `blockStreaming: true` envia cada bloco concluído como uma mensagem normal notificável do Matrix.
|
||||
- `blockStreaming: false` envia apenas a resposta final concluída como uma mensagem normal notificável do Matrix.
|
||||
- `blockStreaming: true` envia cada bloco concluído como uma mensagem normal do Matrix com notificação.
|
||||
- `blockStreaming: false` envia apenas a resposta final concluída como uma mensagem normal do Matrix com notificação.
|
||||
|
||||
### Regras de push auto-hospedadas para prévias silenciosas finalizadas
|
||||
|
||||
Se você executa sua própria infraestrutura Matrix e quer que prévias silenciosas notifiquem apenas quando um bloco ou resposta final for concluído, defina `streaming: "quiet"` e adicione uma regra de push por usuário para edições de prévia finalizadas.
|
||||
Se você executa sua própria infraestrutura Matrix e quer que prévias silenciosas notifiquem apenas quando um bloco ou a resposta final estiver concluída, defina `streaming: "quiet"` e adicione uma regra de push por usuário para edições de prévia finalizadas.
|
||||
|
||||
Normalmente isso é uma configuração do usuário destinatário, não uma alteração de configuração global do homeserver:
|
||||
Normalmente isso é uma configuração do usuário destinatário, não uma alteração global de configuração do homeserver:
|
||||
|
||||
Mapa rápido antes de começar:
|
||||
|
||||
- usuário destinatário = a pessoa que deve receber a notificação
|
||||
- usuário bot = a conta Matrix do OpenClaw que envia a resposta
|
||||
- use o token de acesso do usuário destinatário nas chamadas de API abaixo
|
||||
- faça a correspondência de `sender` na regra de push com o MXID completo do usuário bot
|
||||
- usuário do bot = a conta Matrix do OpenClaw que envia a resposta
|
||||
- use o token de acesso do usuário destinatário para as chamadas de API abaixo
|
||||
- faça `sender` na regra de push corresponder ao MXID completo do usuário do bot
|
||||
|
||||
1. Configure o OpenClaw para usar prévias silenciosas:
|
||||
|
||||
@ -281,12 +281,12 @@ Mapa rápido antes de começar:
|
||||
}
|
||||
```
|
||||
|
||||
2. Certifique-se de que a conta destinatária já recebe notificações push normais do Matrix. As regras de prévia silenciosa só funcionam se esse usuário já tiver pushers/dispositivos funcionando.
|
||||
2. Certifique-se de que a conta destinatária já receba notificações push normais do Matrix. Regras de prévia silenciosa só funcionam se esse usuário já tiver pushers/dispositivos funcionando.
|
||||
|
||||
3. Obtenha o token de acesso do usuário destinatário.
|
||||
- Use o token do usuário que recebe, não o token do bot.
|
||||
- Reutilizar um token de sessão de cliente existente geralmente é a opção mais fácil.
|
||||
- Se você precisar gerar um token novo, pode fazer login pela API Client-Server padrão do Matrix:
|
||||
- Reutilizar um token de sessão de cliente existente geralmente é o mais fácil.
|
||||
- Se precisar gerar um token novo, você pode fazer login pela API Client-Server padrão do Matrix:
|
||||
|
||||
```bash
|
||||
curl -sS -X POST \
|
||||
@ -310,7 +310,7 @@ curl -sS \
|
||||
"https://matrix.example.org/_matrix/client/v3/pushers"
|
||||
```
|
||||
|
||||
Se isso retornar zero pushers/dispositivos ativos, corrija primeiro as notificações normais do Matrix antes de adicionar a regra do OpenClaw abaixo.
|
||||
Se isso retornar sem pushers/dispositivos ativos, corrija primeiro as notificações normais do Matrix antes de adicionar a regra do OpenClaw abaixo.
|
||||
|
||||
O OpenClaw marca edições finalizadas de prévia somente de texto com:
|
||||
|
||||
@ -352,21 +352,21 @@ curl -sS -X PUT \
|
||||
|
||||
Substitua estes valores antes de executar o comando:
|
||||
|
||||
- `https://matrix.example.org`: a URL base do seu homeserver
|
||||
- `$USER_ACCESS_TOKEN`: o token de acesso do usuário que recebe
|
||||
- `openclaw-finalized-preview-botname`: um ID de regra único para este bot para este usuário que recebe
|
||||
- `https://matrix.example.org`: URL base do seu homeserver
|
||||
- `$USER_ACCESS_TOKEN`: token de acesso do usuário que recebe
|
||||
- `openclaw-finalized-preview-botname`: um ID de regra exclusivo para este bot para este usuário que recebe
|
||||
- `@bot:example.org`: o MXID do seu bot Matrix do OpenClaw, não o MXID do usuário que recebe
|
||||
|
||||
Importante para configurações com vários bots:
|
||||
|
||||
- As regras de push são indexadas por `ruleId`. Executar `PUT` novamente no mesmo ID de regra atualiza essa única regra.
|
||||
- Se um mesmo usuário destinatário deve receber notificações de várias contas de bot Matrix do OpenClaw, crie uma regra por bot com um ID de regra único para cada correspondência de remetente.
|
||||
- Se um usuário destinatário precisar notificar para várias contas de bot Matrix do OpenClaw, crie uma regra por bot com um ID de regra exclusivo para cada correspondência de remetente.
|
||||
- Um padrão simples é `openclaw-finalized-preview-<botname>`, como `openclaw-finalized-preview-ops` ou `openclaw-finalized-preview-support`.
|
||||
|
||||
A regra é avaliada com base no remetente do evento:
|
||||
A regra é avaliada em relação ao remetente do evento:
|
||||
|
||||
- autentique com o token do usuário destinatário
|
||||
- faça a correspondência de `sender` com o MXID do bot OpenClaw
|
||||
- faça `sender` corresponder ao MXID do bot OpenClaw
|
||||
|
||||
6. Verifique se a regra existe:
|
||||
|
||||
@ -376,7 +376,7 @@ curl -sS \
|
||||
"https://matrix.example.org/_matrix/client/v3/pushrules/global/override/openclaw-finalized-preview-botname"
|
||||
```
|
||||
|
||||
7. Teste uma resposta em streaming. No modo silencioso, a sala deve mostrar uma prévia de rascunho silenciosa, e a edição final no mesmo lugar deve enviar uma notificação quando o bloco ou turno terminar.
|
||||
7. Teste uma resposta em streaming. No modo silencioso, a sala deve mostrar uma prévia de rascunho silenciosa e a edição final no mesmo lugar deve notificar quando o bloco ou turno terminar.
|
||||
|
||||
Se você precisar remover a regra depois, exclua esse mesmo ID de regra com o token do usuário destinatário:
|
||||
|
||||
@ -389,8 +389,8 @@ curl -sS -X DELETE \
|
||||
Observações:
|
||||
|
||||
- Crie a regra com o token de acesso do usuário destinatário, não com o token do bot.
|
||||
- Novas regras `override` definidas pelo usuário são inseridas antes das regras padrão de supressão, então nenhum parâmetro extra de ordenação é necessário.
|
||||
- Isso afeta apenas edições de prévia somente de texto que o OpenClaw pode finalizar com segurança no mesmo lugar. Fallbacks de mídia e fallbacks de prévia obsoleta ainda usam a entrega normal do Matrix.
|
||||
- Novas regras `override` definidas pelo usuário são inseridas antes das regras de supressão padrão, então nenhum parâmetro extra de ordenação é necessário.
|
||||
- Isso afeta apenas edições de prévia somente de texto que o OpenClaw consegue finalizar com segurança no mesmo lugar. Fallbacks de mídia e fallbacks de prévia antiga ainda usam a entrega normal do Matrix.
|
||||
- Se `GET /_matrix/client/v3/pushers` não mostrar pushers, o usuário ainda não tem entrega de push do Matrix funcionando para essa conta/dispositivo.
|
||||
|
||||
#### Synapse
|
||||
@ -399,22 +399,22 @@ Para o Synapse, a configuração acima normalmente já é suficiente por si só:
|
||||
|
||||
- Nenhuma alteração especial em `homeserver.yaml` é necessária para notificações de prévia finalizada do OpenClaw.
|
||||
- Se sua implantação do Synapse já envia notificações push normais do Matrix, o token do usuário + a chamada `pushrules` acima são a principal etapa de configuração.
|
||||
- Se você executa o Synapse atrás de um proxy reverso ou workers, verifique se `/_matrix/client/.../pushrules/` chega corretamente ao Synapse.
|
||||
- Se você executa workers do Synapse, verifique se os pushers estão saudáveis. A entrega de push é tratada pelo processo principal ou por `synapse.app.pusher` / workers de pusher configurados.
|
||||
- Se você executa o Synapse atrás de um proxy reverso ou workers, certifique-se de que `/_matrix/client/.../pushrules/` chegue corretamente ao Synapse.
|
||||
- Se você executa workers do Synapse, certifique-se de que os pushers estejam íntegros. A entrega de push é tratada pelo processo principal ou por `synapse.app.pusher` / workers de pusher configurados.
|
||||
|
||||
#### Tuwunel
|
||||
|
||||
Para o Tuwunel, use o mesmo fluxo de configuração e a chamada de API `pushrules` mostrados acima:
|
||||
Para o Tuwunel, use o mesmo fluxo de configuração e a mesma chamada de API `pushrules` mostrados acima:
|
||||
|
||||
- Nenhuma configuração específica do Tuwunel é necessária para o próprio marcador de prévia finalizada.
|
||||
- Se as notificações normais do Matrix já funcionam para esse usuário, o token do usuário + a chamada `pushrules` acima são a principal etapa de configuração.
|
||||
- Se as notificações parecerem desaparecer enquanto o usuário está ativo em outro dispositivo, verifique se `suppress_push_when_active` está ativado. O Tuwunel adicionou essa opção no Tuwunel 1.4.2 em 12 de setembro de 2025, e ela pode suprimir intencionalmente pushes para outros dispositivos enquanto um dispositivo está ativo.
|
||||
- Se as notificações parecerem desaparecer enquanto o usuário estiver ativo em outro dispositivo, verifique se `suppress_push_when_active` está ativado. O Tuwunel adicionou essa opção no Tuwunel 1.4.2 em 12 de setembro de 2025, e ela pode suprimir intencionalmente pushes para outros dispositivos enquanto um dispositivo estiver ativo.
|
||||
|
||||
## Salas bot para bot
|
||||
|
||||
Por padrão, mensagens do Matrix vindas de outras contas Matrix do OpenClaw configuradas são ignoradas.
|
||||
Por padrão, mensagens Matrix de outras contas Matrix configuradas do OpenClaw são ignoradas.
|
||||
|
||||
Use `allowBots` quando você quiser intencionalmente tráfego Matrix entre agentes:
|
||||
Use `allowBots` quando você intencionalmente quiser tráfego Matrix entre agentes:
|
||||
|
||||
```json5
|
||||
{
|
||||
@ -432,18 +432,18 @@ Use `allowBots` quando você quiser intencionalmente tráfego Matrix entre agent
|
||||
```
|
||||
|
||||
- `allowBots: true` aceita mensagens de outras contas de bot Matrix configuradas em salas e DMs permitidas.
|
||||
- `allowBots: "mentions"` aceita essas mensagens apenas quando elas mencionam visivelmente este bot nas salas. DMs continuam permitidas.
|
||||
- `allowBots: "mentions"` aceita essas mensagens apenas quando elas mencionam visivelmente este bot nas salas. DMs ainda são permitidas.
|
||||
- `groups.<room>.allowBots` substitui a configuração no nível da conta para uma sala.
|
||||
- O OpenClaw ainda ignora mensagens do mesmo ID de usuário Matrix para evitar loops de autorresposta.
|
||||
- O OpenClaw ainda ignora mensagens do mesmo ID de usuário Matrix para evitar loops de resposta a si mesmo.
|
||||
- O Matrix não expõe aqui um sinalizador nativo de bot; o OpenClaw trata "de autoria de bot" como "enviado por outra conta Matrix configurada neste Gateway OpenClaw".
|
||||
|
||||
Use listas de permissões de sala estritas e exigências de menção ao ativar tráfego bot para bot em salas compartilhadas.
|
||||
Use allowlists rigorosas de sala e exigências de menção ao ativar tráfego bot para bot em salas compartilhadas.
|
||||
|
||||
## Criptografia e verificação
|
||||
|
||||
Em salas criptografadas (E2EE), eventos de imagem de saída usam `thumbnail_file` para que as prévias de imagem sejam criptografadas junto com o anexo completo. Salas não criptografadas continuam usando `thumbnail_url` simples. Nenhuma configuração é necessária — o Plugin detecta automaticamente o estado de E2EE.
|
||||
Em salas criptografadas (E2EE), eventos de imagem de saída usam `thumbnail_file`, para que as prévias de imagem sejam criptografadas junto com o anexo completo. Salas não criptografadas ainda usam `thumbnail_url` simples. Nenhuma configuração é necessária — o Plugin detecta automaticamente o estado de E2EE.
|
||||
|
||||
Ativar criptografia:
|
||||
Ative a criptografia:
|
||||
|
||||
```json5
|
||||
{
|
||||
@ -459,43 +459,43 @@ Ativar criptografia:
|
||||
}
|
||||
```
|
||||
|
||||
Verificar o status da verificação:
|
||||
Verifique o status da verificação:
|
||||
|
||||
```bash
|
||||
openclaw matrix verify status
|
||||
```
|
||||
|
||||
Status detalhado (diagnósticos completos):
|
||||
Status detalhado (diagnóstico completo):
|
||||
|
||||
```bash
|
||||
openclaw matrix verify status --verbose
|
||||
```
|
||||
|
||||
Incluir a chave de recuperação armazenada na saída legível por máquina:
|
||||
Inclua a chave de recuperação armazenada na saída legível por máquina:
|
||||
|
||||
```bash
|
||||
openclaw matrix verify status --include-recovery-key --json
|
||||
```
|
||||
|
||||
Inicializar o estado de cross-signing e verificação:
|
||||
Inicialize o estado de assinatura cruzada e verificação:
|
||||
|
||||
```bash
|
||||
openclaw matrix verify bootstrap
|
||||
```
|
||||
|
||||
Diagnósticos detalhados de bootstrap:
|
||||
Diagnóstico detalhado da inicialização:
|
||||
|
||||
```bash
|
||||
openclaw matrix verify bootstrap --verbose
|
||||
```
|
||||
|
||||
Forçar uma redefinição nova da identidade de cross-signing antes do bootstrap:
|
||||
Force uma redefinição nova da identidade de assinatura cruzada antes da inicialização:
|
||||
|
||||
```bash
|
||||
openclaw matrix verify bootstrap --force-reset-cross-signing
|
||||
```
|
||||
|
||||
Verificar este dispositivo com uma chave de recuperação:
|
||||
Verifique este dispositivo com uma chave de recuperação:
|
||||
|
||||
```bash
|
||||
openclaw matrix verify device "<your-recovery-key>"
|
||||
@ -507,41 +507,41 @@ Detalhes detalhados da verificação do dispositivo:
|
||||
openclaw matrix verify device "<your-recovery-key>" --verbose
|
||||
```
|
||||
|
||||
Verificar a integridade do backup de chaves de sala:
|
||||
Verifique a integridade do backup de chaves de sala:
|
||||
|
||||
```bash
|
||||
openclaw matrix verify backup status
|
||||
```
|
||||
|
||||
Diagnósticos detalhados da integridade do backup:
|
||||
Diagnóstico detalhado da integridade do backup:
|
||||
|
||||
```bash
|
||||
openclaw matrix verify backup status --verbose
|
||||
```
|
||||
|
||||
Restaurar chaves de sala do backup no servidor:
|
||||
Restaure chaves de sala do backup do servidor:
|
||||
|
||||
```bash
|
||||
openclaw matrix verify backup restore
|
||||
```
|
||||
|
||||
Diagnósticos detalhados da restauração:
|
||||
Diagnóstico detalhado da restauração:
|
||||
|
||||
```bash
|
||||
openclaw matrix verify backup restore --verbose
|
||||
```
|
||||
|
||||
Excluir o backup atual do servidor e criar uma nova base de backup. Se a chave de backup armazenada não puder ser carregada corretamente, essa redefinição também poderá recriar o armazenamento de segredos para que futuras inicializações a frio consigam carregar a nova chave de backup:
|
||||
Exclua o backup atual do servidor e crie uma nova base de backup. Se a chave de backup armazenada não puder ser carregada corretamente, essa redefinição também pode recriar o armazenamento secreto para que futuras inicializações a frio consigam carregar a nova chave de backup:
|
||||
|
||||
```bash
|
||||
openclaw matrix verify backup reset --yes
|
||||
```
|
||||
|
||||
Todos os comandos `verify` são concisos por padrão (incluindo logs internos silenciosos do SDK) e só mostram diagnósticos detalhados com `--verbose`.
|
||||
Todos os comandos `verify` são concisos por padrão (incluindo logging interno silencioso do SDK) e mostram diagnósticos detalhados apenas com `--verbose`.
|
||||
Use `--json` para saída completa legível por máquina ao criar scripts.
|
||||
|
||||
Em configurações com várias contas, os comandos CLI do Matrix usam a conta padrão implícita do Matrix, a menos que você passe `--account <id>`.
|
||||
Se você configurar várias contas nomeadas, defina primeiro `channels.matrix.defaultAccount`, ou essas operações implícitas da CLI vão parar e pedir que você escolha uma conta explicitamente.
|
||||
Em configurações com várias contas, os comandos Matrix da CLI usam a conta padrão implícita do Matrix, a menos que você passe `--account <id>`.
|
||||
Se você configurar várias contas nomeadas, defina primeiro `channels.matrix.defaultAccount` ou essas operações implícitas da CLI irão parar e pedir que você escolha uma conta explicitamente.
|
||||
Use `--account` sempre que quiser que operações de verificação ou de dispositivo tenham como alvo explicitamente uma conta nomeada:
|
||||
|
||||
```bash
|
||||
@ -550,40 +550,40 @@ openclaw matrix verify backup restore --account assistant
|
||||
openclaw matrix devices list --account assistant
|
||||
```
|
||||
|
||||
Quando a criptografia está desativada ou indisponível para uma conta nomeada, avisos do Matrix e erros de verificação apontam para a chave de configuração dessa conta, por exemplo `channels.matrix.accounts.assistant.encryption`.
|
||||
Quando a criptografia estiver desativada ou indisponível para uma conta nomeada, avisos do Matrix e erros de verificação apontam para a chave de configuração dessa conta, por exemplo `channels.matrix.accounts.assistant.encryption`.
|
||||
|
||||
### O que "verificado" significa
|
||||
|
||||
O OpenClaw trata este dispositivo Matrix como verificado apenas quando ele é verificado pela sua própria identidade de cross-signing.
|
||||
O OpenClaw trata este dispositivo Matrix como verificado somente quando ele é verificado pela sua própria identidade de assinatura cruzada.
|
||||
Na prática, `openclaw matrix verify status --verbose` expõe três sinais de confiança:
|
||||
|
||||
- `Locally trusted`: este dispositivo é confiável apenas pelo cliente atual
|
||||
- `Cross-signing verified`: o SDK informa que o dispositivo está verificado por cross-signing
|
||||
- `Signed by owner`: o dispositivo é assinado pela sua própria chave de self-signing
|
||||
- `Cross-signing verified`: o SDK informa o dispositivo como verificado por assinatura cruzada
|
||||
- `Signed by owner`: o dispositivo é assinado pela sua própria chave de autoassinatura
|
||||
|
||||
`Verified by owner` só se torna `yes` quando há verificação por cross-signing ou assinatura pelo proprietário.
|
||||
A confiança local, por si só, não é suficiente para o OpenClaw tratar o dispositivo como totalmente verificado.
|
||||
`Verified by owner` passa a ser `yes` somente quando há verificação por assinatura cruzada ou assinatura do proprietário.
|
||||
A confiança local por si só não basta para que o OpenClaw trate o dispositivo como totalmente verificado.
|
||||
|
||||
### O que o bootstrap faz
|
||||
### O que a inicialização faz
|
||||
|
||||
`openclaw matrix verify bootstrap` é o comando de reparo e configuração para contas Matrix criptografadas.
|
||||
Ele faz tudo o seguinte, nesta ordem:
|
||||
Ele faz tudo o que segue, nesta ordem:
|
||||
|
||||
- inicializa o armazenamento de segredos, reutilizando uma chave de recuperação existente quando possível
|
||||
- inicializa o cross-signing e envia as chaves públicas de cross-signing ausentes
|
||||
- tenta marcar e assinar por cross-signing o dispositivo atual
|
||||
- cria um novo backup de chaves de sala no lado do servidor, se ainda não existir um
|
||||
- inicializa o armazenamento secreto, reutilizando uma chave de recuperação existente quando possível
|
||||
- inicializa a assinatura cruzada e envia chaves públicas de assinatura cruzada ausentes
|
||||
- tenta marcar e assinar de forma cruzada o dispositivo atual
|
||||
- cria um novo backup de chaves de sala no servidor se ainda não existir um
|
||||
|
||||
Se o homeserver exigir autenticação interativa para enviar chaves de cross-signing, o OpenClaw tenta o envio primeiro sem autenticação, depois com `m.login.dummy`, e depois com `m.login.password` quando `channels.matrix.password` está configurado.
|
||||
Se o homeserver exigir autenticação interativa para enviar chaves de assinatura cruzada, o OpenClaw tenta o envio primeiro sem autenticação, depois com `m.login.dummy` e depois com `m.login.password` quando `channels.matrix.password` está configurado.
|
||||
|
||||
Use `--force-reset-cross-signing` apenas quando você quiser intencionalmente descartar a identidade atual de cross-signing e criar uma nova.
|
||||
Use `--force-reset-cross-signing` somente quando você intencionalmente quiser descartar a identidade atual de assinatura cruzada e criar uma nova.
|
||||
|
||||
Se você quiser intencionalmente descartar o backup atual de chaves de sala e iniciar uma nova base de backup para mensagens futuras, use `openclaw matrix verify backup reset --yes`.
|
||||
Faça isso apenas se aceitar que o histórico criptografado antigo irrecuperável continuará indisponível e que o OpenClaw pode recriar o armazenamento de segredos se o segredo atual de backup não puder ser carregado com segurança.
|
||||
Se você intencionalmente quiser descartar o backup atual de chaves de sala e iniciar uma nova base de backup para mensagens futuras, use `openclaw matrix verify backup reset --yes`.
|
||||
Faça isso apenas se aceitar que o histórico criptografado antigo irrecuperável continuará indisponível e que o OpenClaw pode recriar o armazenamento secreto se o segredo de backup atual não puder ser carregado com segurança.
|
||||
|
||||
### Nova base de backup
|
||||
|
||||
Se você quiser manter o funcionamento das futuras mensagens criptografadas e aceitar perder o histórico antigo irrecuperável, execute estes comandos em ordem:
|
||||
Se você quiser manter o funcionamento de futuras mensagens criptografadas e aceitar perder histórico antigo irrecuperável, execute estes comandos na ordem:
|
||||
|
||||
```bash
|
||||
openclaw matrix verify backup reset --yes
|
||||
@ -591,20 +591,21 @@ openclaw matrix verify backup status --verbose
|
||||
openclaw matrix verify status
|
||||
```
|
||||
|
||||
Adicione `--account <id>` a cada comando quando quiser direcionar explicitamente uma conta Matrix nomeada.
|
||||
Adicione `--account <id>` a cada comando quando quiser ter como alvo explicitamente uma conta Matrix nomeada.
|
||||
|
||||
### Comportamento na inicialização
|
||||
|
||||
Quando `encryption: true`, o Matrix define `startupVerification` como `"if-unverified"` por padrão.
|
||||
Na inicialização, se este dispositivo ainda não estiver verificado, o Matrix solicitará autoverificação em outro cliente Matrix, ignorará solicitações duplicadas enquanto uma já estiver pendente e aplicará um cooldown local antes de tentar novamente após reinicializações.
|
||||
Tentativas de solicitação com falha tentam novamente mais cedo do que a criação bem-sucedida da solicitação por padrão.
|
||||
Defina `startupVerification: "off"` para desativar solicitações automáticas na inicialização, ou ajuste `startupVerificationCooldownHours` se quiser uma janela de nova tentativa mais curta ou mais longa.
|
||||
Tentativas de solicitação com falha são repetidas mais cedo do que a criação bem-sucedida de solicitações por padrão.
|
||||
Defina `startupVerification: "off"` para desativar solicitações automáticas na inicialização ou ajuste `startupVerificationCooldownHours` se quiser uma janela de nova tentativa menor ou maior.
|
||||
|
||||
A inicialização também executa automaticamente uma passagem conservadora de bootstrap de criptografia.
|
||||
Essa passagem tenta reutilizar primeiro o armazenamento de segredos e a identidade de cross-signing atuais, e evita redefinir o cross-signing, a menos que você execute um fluxo explícito de reparo de bootstrap.
|
||||
Essa passagem tenta reutilizar primeiro o armazenamento secreto atual e a identidade atual de assinatura cruzada, e evita redefinir a assinatura cruzada a menos que você execute um fluxo explícito de reparo de bootstrap.
|
||||
|
||||
Se a inicialização encontrar um estado de bootstrap quebrado e `channels.matrix.password` estiver configurado, o OpenClaw poderá tentar um caminho de reparo mais rigoroso.
|
||||
Se o dispositivo atual já estiver assinado pelo proprietário, o OpenClaw preservará essa identidade em vez de redefini-la automaticamente.
|
||||
Se a inicialização ainda encontrar um estado de bootstrap corrompido, o OpenClaw poderá tentar um caminho de reparo protegido mesmo quando `channels.matrix.password` não estiver configurado.
|
||||
Se o homeserver exigir UIA baseada em senha para esse reparo, o OpenClaw registra um aviso e mantém a inicialização não fatal em vez de abortar o bot.
|
||||
Se o dispositivo atual já estiver assinado pelo proprietário, o OpenClaw preserva essa identidade em vez de redefini-la automaticamente.
|
||||
|
||||
Consulte [migração do Matrix](/pt-BR/install/migrating-matrix) para ver o fluxo completo de upgrade, limites, comandos de recuperação e mensagens comuns de migração.
|
||||
|
||||
@ -614,18 +615,18 @@ O Matrix publica avisos do ciclo de vida da verificação diretamente na DM estr
|
||||
Isso inclui:
|
||||
|
||||
- avisos de solicitação de verificação
|
||||
- avisos de verificação pronta (com orientação explícita "Verifique por emoji")
|
||||
- avisos de verificação pronta (com orientação explícita "Verificar por emoji")
|
||||
- avisos de início e conclusão da verificação
|
||||
- detalhes SAS (emoji e decimal), quando disponíveis
|
||||
- detalhes de SAS (emoji e decimal) quando disponíveis
|
||||
|
||||
Solicitações de verificação recebidas de outro cliente Matrix são rastreadas e aceitas automaticamente pelo OpenClaw.
|
||||
Para fluxos de autoverificação, o OpenClaw também inicia automaticamente o fluxo SAS quando a verificação por emoji fica disponível e confirma o próprio lado.
|
||||
Para fluxos de autoverificação, o OpenClaw também inicia automaticamente o fluxo SAS quando a verificação por emoji se torna disponível e confirma seu próprio lado.
|
||||
Para solicitações de verificação de outro usuário/dispositivo Matrix, o OpenClaw aceita automaticamente a solicitação e então espera que o fluxo SAS prossiga normalmente.
|
||||
Ainda assim, você precisa comparar o SAS em emoji ou decimal no seu cliente Matrix e confirmar "They match" lá para concluir a verificação.
|
||||
Você ainda precisa comparar o SAS em emoji ou decimal no seu cliente Matrix e confirmar "They match" lá para concluir a verificação.
|
||||
|
||||
O OpenClaw não aceita automaticamente de forma cega fluxos duplicados iniciados por ele mesmo. Na inicialização, ele não cria uma nova solicitação quando uma solicitação de autoverificação já está pendente.
|
||||
O OpenClaw não aceita automaticamente fluxos duplicados iniciados por ele mesmo às cegas. A inicialização ignora a criação de uma nova solicitação quando uma solicitação de autoverificação já está pendente.
|
||||
|
||||
Avisos de protocolo/sistema de verificação não são encaminhados para o pipeline de chat do agente, então eles não produzem `NO_REPLY`.
|
||||
Avisos de verificação de protocolo/sistema não são encaminhados para o pipeline de chat do agente, então eles não produzem `NO_REPLY`.
|
||||
|
||||
### Higiene de dispositivos
|
||||
|
||||
@ -642,18 +643,18 @@ Remova dispositivos antigos gerenciados pelo OpenClaw com:
|
||||
openclaw matrix devices prune-stale
|
||||
```
|
||||
|
||||
### Armazenamento criptográfico
|
||||
### Armazenamento de criptografia
|
||||
|
||||
O E2EE do Matrix usa o caminho de criptografia Rust oficial do `matrix-js-sdk` no Node, com `fake-indexeddb` como shim do IndexedDB. O estado criptográfico é persistido em um arquivo de snapshot (`crypto-idb-snapshot.json`) e restaurado na inicialização. O arquivo de snapshot é um estado de execução sensível armazenado com permissões restritivas de arquivo.
|
||||
A E2EE do Matrix usa o caminho de criptografia Rust oficial do `matrix-js-sdk` no Node, com `fake-indexeddb` como shim de IndexedDB. O estado criptográfico é persistido em um arquivo de snapshot (`crypto-idb-snapshot.json`) e restaurado na inicialização. O arquivo de snapshot é um estado de runtime sensível armazenado com permissões restritivas de arquivo.
|
||||
|
||||
O estado criptografado em execução fica em raízes por conta, por usuário e por hash de token em
|
||||
O estado criptografado de runtime fica em raízes por conta, por usuário e por hash de token em
|
||||
`~/.openclaw/matrix/accounts/<account>/<homeserver>__<user>/<token-hash>/`.
|
||||
Esse diretório contém o armazenamento de sincronização (`bot-storage.json`), armazenamento criptográfico (`crypto/`),
|
||||
Esse diretório contém o armazenamento de sincronização (`bot-storage.json`), armazenamento de criptografia (`crypto/`),
|
||||
arquivo de chave de recuperação (`recovery-key.json`), snapshot do IndexedDB (`crypto-idb-snapshot.json`),
|
||||
vínculos de thread (`thread-bindings.json`) e estado de verificação na inicialização (`startup-verification.json`).
|
||||
bindings de thread (`thread-bindings.json`) e estado de verificação na inicialização (`startup-verification.json`).
|
||||
Quando o token muda, mas a identidade da conta permanece a mesma, o OpenClaw reutiliza a melhor raiz existente
|
||||
para essa tupla conta/homeserver/usuário para que o estado anterior de sincronização, estado criptográfico, vínculos de thread
|
||||
e estado de verificação na inicialização continuem visíveis.
|
||||
para essa tupla de conta/homeserver/usuário, para que o estado anterior de sincronização, o estado criptográfico, os bindings de thread
|
||||
e o estado de verificação na inicialização permaneçam visíveis.
|
||||
|
||||
## Gerenciamento de perfil
|
||||
|
||||
@ -664,47 +665,47 @@ openclaw matrix profile set --name "OpenClaw Assistant"
|
||||
openclaw matrix profile set --avatar-url https://cdn.example.org/avatar.png
|
||||
```
|
||||
|
||||
Adicione `--account <id>` quando quiser direcionar explicitamente uma conta Matrix nomeada.
|
||||
Adicione `--account <id>` quando quiser ter como alvo explicitamente uma conta Matrix nomeada.
|
||||
|
||||
O Matrix aceita URLs de avatar `mxc://` diretamente. Quando você passa uma URL de avatar `http://` ou `https://`, o OpenClaw primeiro a envia para o Matrix e armazena a URL `mxc://` resolvida de volta em `channels.matrix.avatarUrl` (ou na substituição da conta selecionada).
|
||||
O Matrix aceita URLs de avatar `mxc://` diretamente. Quando você passa uma URL de avatar `http://` ou `https://`, o OpenClaw primeiro faz upload dela para o Matrix e armazena a URL `mxc://` resolvida de volta em `channels.matrix.avatarUrl` (ou na substituição da conta selecionada).
|
||||
|
||||
## Threads
|
||||
|
||||
O Matrix oferece suporte a threads nativas do Matrix tanto para respostas automáticas quanto para envios da ferramenta de mensagem.
|
||||
O Matrix oferece suporte a threads nativas do Matrix tanto para respostas automáticas quanto para envios da ferramenta de mensagens.
|
||||
|
||||
- `dm.sessionScope: "per-user"` (padrão) mantém o roteamento de DM do Matrix com escopo por remetente, para que várias salas de DM possam compartilhar uma sessão quando forem resolvidas para o mesmo par.
|
||||
- `dm.sessionScope: "per-room"` isola cada sala de DM do Matrix em sua própria chave de sessão, ainda usando autenticação e verificações de lista de permissões normais de DM.
|
||||
- Vínculos explícitos de conversa do Matrix ainda têm precedência sobre `dm.sessionScope`, então salas e threads vinculadas mantêm a sessão de destino escolhida.
|
||||
- `threadReplies: "off"` mantém as respostas no nível superior e mantém as mensagens encadeadas de entrada na sessão pai.
|
||||
- `dm.sessionScope: "per-user"` (padrão) mantém o roteamento de DM do Matrix com escopo por remetente, então várias salas de DM podem compartilhar uma sessão quando são resolvidas para o mesmo par.
|
||||
- `dm.sessionScope: "per-room"` isola cada sala de DM do Matrix em sua própria chave de sessão enquanto ainda usa verificações normais de autenticação e allowlist de DM.
|
||||
- Bindings explícitos de conversa do Matrix ainda têm prioridade sobre `dm.sessionScope`, então salas e threads vinculadas mantêm a sessão de destino escolhida.
|
||||
- `threadReplies: "off"` mantém respostas no nível superior e mantém mensagens de thread recebidas na sessão pai.
|
||||
- `threadReplies: "inbound"` responde dentro de uma thread apenas quando a mensagem recebida já estava nessa thread.
|
||||
- `threadReplies: "always"` mantém respostas de sala em uma thread enraizada na mensagem que acionou a resposta e roteia essa conversa pela sessão com escopo de thread correspondente a partir da primeira mensagem acionadora.
|
||||
- `dm.threadReplies` substitui a configuração de nível superior apenas para DMs. Por exemplo, você pode manter threads de sala isoladas enquanto mantém DMs sem threads.
|
||||
- Mensagens encadeadas recebidas incluem a mensagem raiz da thread como contexto extra do agente.
|
||||
- Envios da ferramenta de mensagem herdam automaticamente a thread atual do Matrix quando o destino é a mesma sala, ou o mesmo destino de usuário em DM, a menos que um `threadId` explícito seja fornecido.
|
||||
- A reutilização do mesmo destino de usuário em DM na mesma sessão só entra em ação quando os metadados da sessão atual comprovam o mesmo par de DM na mesma conta Matrix; caso contrário, o OpenClaw recorre ao roteamento normal com escopo por usuário.
|
||||
- Quando o OpenClaw detecta que uma sala de DM do Matrix colide com outra sala de DM na mesma sessão compartilhada de DM do Matrix, ele publica um único `m.notice` nessa sala com a rota de escape `/focus` quando os vínculos de thread estão ativados e a dica `dm.sessionScope`.
|
||||
- Vínculos de thread em execução são suportados para o Matrix. `/focus`, `/unfocus`, `/agents`, `/session idle`, `/session max-age` e `/acp spawn` vinculado a thread funcionam em salas e DMs do Matrix.
|
||||
- `/focus` no nível superior de sala/DM do Matrix cria uma nova thread do Matrix e a vincula à sessão de destino quando `threadBindings.spawnSubagentSessions=true`.
|
||||
- Executar `/focus` ou `/acp spawn --thread here` dentro de uma thread existente do Matrix vincula essa thread atual no lugar.
|
||||
- `threadReplies: "always"` mantém respostas de sala em uma thread enraizada na mensagem que disparou e roteia essa conversa pela sessão com escopo de thread correspondente desde a primeira mensagem disparadora.
|
||||
- `dm.threadReplies` substitui a configuração de nível superior apenas para DMs. Por exemplo, você pode manter threads de sala isoladas enquanto mantém DMs sem thread.
|
||||
- Mensagens de thread recebidas incluem a mensagem raiz da thread como contexto adicional do agente.
|
||||
- Envios da ferramenta de mensagens herdam automaticamente a thread atual do Matrix quando o destino é a mesma sala ou o mesmo destino de usuário de DM, a menos que um `threadId` explícito seja fornecido.
|
||||
- A reutilização do destino de usuário de DM da mesma sessão só entra em ação quando os metadados da sessão atual comprovam o mesmo par de DM na mesma conta Matrix; caso contrário, o OpenClaw volta ao roteamento normal com escopo por usuário.
|
||||
- Quando o OpenClaw detecta que uma sala de DM do Matrix colide com outra sala de DM na mesma sessão compartilhada de DM do Matrix, ele publica um `m.notice` único nessa sala com a rota de escape `/focus` quando bindings de thread estão ativados e com a dica `dm.sessionScope`.
|
||||
- Bindings de thread em runtime são compatíveis com Matrix. `/focus`, `/unfocus`, `/agents`, `/session idle`, `/session max-age` e `/acp spawn` vinculado a thread funcionam em salas e DMs do Matrix.
|
||||
- `/focus` de sala/DM do Matrix no nível superior cria uma nova thread do Matrix e a vincula à sessão de destino quando `threadBindings.spawnSubagentSessions=true`.
|
||||
- Executar `/focus` ou `/acp spawn --thread here` dentro de uma thread existente do Matrix vincula essa thread atual em vez disso.
|
||||
|
||||
## Vínculos de conversa ACP
|
||||
## Bindings de conversa ACP
|
||||
|
||||
Salas, DMs e threads existentes do Matrix podem ser transformadas em espaços de trabalho ACP duráveis sem mudar a superfície do chat.
|
||||
Salas, DMs e threads Matrix existentes podem ser transformadas em workspaces ACP duráveis sem mudar a superfície de chat.
|
||||
|
||||
Fluxo rápido para operador:
|
||||
Fluxo rápido do operador:
|
||||
|
||||
- Execute `/acp spawn codex --bind here` dentro da DM, sala ou thread existente do Matrix que você quer continuar usando.
|
||||
- Em uma DM ou sala Matrix de nível superior, a DM/sala atual continua sendo a superfície do chat e as mensagens futuras são roteadas para a sessão ACP criada.
|
||||
- Dentro de uma thread existente do Matrix, `--bind here` vincula essa thread atual no lugar.
|
||||
- `/new` e `/reset` redefinem a mesma sessão ACP vinculada no lugar.
|
||||
- `/acp close` fecha a sessão ACP e remove o vínculo.
|
||||
- Em uma DM ou sala Matrix de nível superior, a DM/sala atual continua sendo a superfície de chat e mensagens futuras são roteadas para a sessão ACP criada.
|
||||
- Dentro de uma thread Matrix existente, `--bind here` vincula essa thread atual no mesmo lugar.
|
||||
- `/new` e `/reset` redefinem a mesma sessão ACP vinculada no mesmo lugar.
|
||||
- `/acp close` fecha a sessão ACP e remove o binding.
|
||||
|
||||
Observações:
|
||||
|
||||
- `--bind here` não cria uma thread filha do Matrix.
|
||||
- `threadBindings.spawnAcpSessions` só é necessário para `/acp spawn --thread auto|here`, quando o OpenClaw precisa criar ou vincular uma thread filha do Matrix.
|
||||
|
||||
### Configuração de vínculo de thread
|
||||
### Configuração de binding de thread
|
||||
|
||||
O Matrix herda padrões globais de `session.threadBindings` e também oferece suporte a substituições por canal:
|
||||
|
||||
@ -714,29 +715,29 @@ O Matrix herda padrões globais de `session.threadBindings` e também oferece su
|
||||
- `threadBindings.spawnSubagentSessions`
|
||||
- `threadBindings.spawnAcpSessions`
|
||||
|
||||
Os sinalizadores de criação vinculada a thread do Matrix são opt-in:
|
||||
Sinalizadores de criação vinculada a thread do Matrix são opt-in:
|
||||
|
||||
- Defina `threadBindings.spawnSubagentSessions: true` para permitir que `/focus` no nível superior crie e vincule novas threads do Matrix.
|
||||
- Defina `threadBindings.spawnSubagentSessions: true` para permitir que `/focus` de nível superior crie e vincule novas threads do Matrix.
|
||||
- Defina `threadBindings.spawnAcpSessions: true` para permitir que `/acp spawn --thread auto|here` vincule sessões ACP a threads do Matrix.
|
||||
|
||||
## Reações
|
||||
|
||||
O Matrix oferece suporte a ações de reação de saída, notificações de reação de entrada e reações de confirmação de entrada.
|
||||
|
||||
- A ferramenta de reação de saída é controlada por `channels["matrix"].actions.reactions`.
|
||||
- O ferramental de reação de saída é controlado por `channels["matrix"].actions.reactions`.
|
||||
- `react` adiciona uma reação a um evento específico do Matrix.
|
||||
- `reactions` lista o resumo atual de reações de um evento específico do Matrix.
|
||||
- `reactions` lista o resumo atual de reações para um evento específico do Matrix.
|
||||
- `emoji=""` remove as próprias reações da conta do bot nesse evento.
|
||||
- `remove: true` remove apenas a reação de emoji especificada da conta do bot.
|
||||
|
||||
O escopo das reações de confirmação é resolvido nesta ordem:
|
||||
O escopo de reação de confirmação é resolvido nesta ordem padrão do OpenClaw:
|
||||
|
||||
- `channels["matrix"].accounts.<accountId>.ackReaction`
|
||||
- `channels["matrix"].ackReaction`
|
||||
- `messages.ackReaction`
|
||||
- fallback para o emoji de identidade do agente
|
||||
- fallback para emoji da identidade do agente
|
||||
|
||||
O escopo da reação de confirmação é resolvido nesta ordem:
|
||||
O escopo de reação de confirmação é resolvido nesta ordem:
|
||||
|
||||
- `channels["matrix"].accounts.<accountId>.ackReactionScope`
|
||||
- `channels["matrix"].ackReactionScope`
|
||||
@ -752,25 +753,25 @@ Comportamento:
|
||||
|
||||
- `reactionNotifications: "own"` encaminha eventos `m.reaction` adicionados quando eles têm como alvo mensagens Matrix de autoria do bot.
|
||||
- `reactionNotifications: "off"` desativa eventos de sistema de reação.
|
||||
- Remoções de reação não são sintetizadas em eventos de sistema porque o Matrix as expõe como redações, não como remoções autônomas de `m.reaction`.
|
||||
- Remoções de reação não são sintetizadas em eventos de sistema porque o Matrix as expõe como redações, não como remoções independentes de `m.reaction`.
|
||||
|
||||
## Contexto de histórico
|
||||
## Contexto do histórico
|
||||
|
||||
- `channels.matrix.historyLimit` controla quantas mensagens recentes da sala são incluídas como `InboundHistory` quando uma mensagem de sala do Matrix aciona o agente. Usa como fallback `messages.groupChat.historyLimit`; se ambos não estiverem definidos, o padrão efetivo é `0`. Defina `0` para desativar.
|
||||
- `channels.matrix.historyLimit` controla quantas mensagens recentes da sala são incluídas como `InboundHistory` quando uma mensagem de sala do Matrix dispara o agente. Usa fallback para `messages.groupChat.historyLimit`; se ambos não estiverem definidos, o padrão efetivo é `0`. Defina `0` para desativar.
|
||||
- O histórico de sala do Matrix é somente da sala. DMs continuam usando o histórico normal da sessão.
|
||||
- O histórico de sala do Matrix é apenas pendente: o OpenClaw armazena em buffer mensagens da sala que ainda não acionaram uma resposta e então captura esse intervalo quando uma menção ou outro gatilho chega.
|
||||
- A mensagem gatilho atual não é incluída em `InboundHistory`; ela permanece no corpo principal de entrada daquele turno.
|
||||
- Novas tentativas do mesmo evento do Matrix reutilizam o snapshot original do histórico em vez de avançar para mensagens mais recentes da sala.
|
||||
- O histórico de sala do Matrix é somente pendente: o OpenClaw faz buffer de mensagens da sala que ainda não dispararam uma resposta e depois captura esse intervalo quando uma menção ou outro gatilho chega.
|
||||
- A mensagem de gatilho atual não é incluída em `InboundHistory`; ela permanece no corpo principal de entrada para esse turno.
|
||||
- Novas tentativas do mesmo evento Matrix reutilizam o snapshot do histórico original em vez de avançar para mensagens mais novas da sala.
|
||||
|
||||
## Visibilidade de contexto
|
||||
|
||||
O Matrix oferece suporte ao controle compartilhado `contextVisibility` para contexto suplementar de sala, como texto de resposta buscado, raízes de thread e histórico pendente.
|
||||
O Matrix oferece suporte ao controle compartilhado `contextVisibility` para contexto complementar da sala, como texto de resposta buscado, raízes de thread e histórico pendente.
|
||||
|
||||
- `contextVisibility: "all"` é o padrão. O contexto suplementar é mantido como recebido.
|
||||
- `contextVisibility: "allowlist"` filtra o contexto suplementar para remetentes permitidos pelas verificações ativas de lista de permissões de sala/usuário.
|
||||
- `contextVisibility: "all"` é o padrão. O contexto complementar é mantido como recebido.
|
||||
- `contextVisibility: "allowlist"` filtra o contexto complementar para remetentes permitidos pelas verificações ativas de allowlist de sala/usuário.
|
||||
- `contextVisibility: "allowlist_quote"` se comporta como `allowlist`, mas ainda mantém uma resposta citada explícita.
|
||||
|
||||
Essa configuração afeta a visibilidade do contexto suplementar, não se a própria mensagem de entrada pode acionar uma resposta.
|
||||
Essa configuração afeta a visibilidade do contexto complementar, não se a própria mensagem de entrada pode disparar uma resposta.
|
||||
A autorização do gatilho ainda vem de `groupPolicy`, `groups`, `groupAllowFrom` e das configurações de política de DM.
|
||||
|
||||
## Política de DM e sala
|
||||
@ -796,28 +797,28 @@ A autorização do gatilho ainda vem de `groupPolicy`, `groups`, `groupAllowFrom
|
||||
}
|
||||
```
|
||||
|
||||
Consulte [Groups](/pt-BR/channels/groups) para ver o comportamento de exigência de menção e lista de permissões.
|
||||
Consulte [Groups](/pt-BR/channels/groups) para ver o comportamento de bloqueio por menção e allowlist.
|
||||
|
||||
Exemplo de pareamento para DMs do Matrix:
|
||||
Exemplo de emparelhamento para DMs do Matrix:
|
||||
|
||||
```bash
|
||||
openclaw pairing list matrix
|
||||
openclaw pairing approve matrix <CODE>
|
||||
```
|
||||
|
||||
Se um usuário Matrix não aprovado continuar enviando mensagens antes da aprovação, o OpenClaw reutiliza o mesmo código de pareamento pendente e pode enviar uma resposta de lembrete novamente após um curto cooldown em vez de gerar um novo código.
|
||||
Se um usuário Matrix não aprovado continuar enviando mensagens antes da aprovação, o OpenClaw reutiliza o mesmo código de emparelhamento pendente e pode enviar uma resposta de lembrete novamente após um curto cooldown em vez de gerar um novo código.
|
||||
|
||||
Consulte [Pairing](/pt-BR/channels/pairing) para ver o fluxo compartilhado de pareamento de DM e o layout de armazenamento.
|
||||
Consulte [Pairing](/pt-BR/channels/pairing) para ver o fluxo compartilhado de emparelhamento de DM e o layout de armazenamento.
|
||||
|
||||
## Reparo direto de sala
|
||||
|
||||
Se o estado de mensagem direta sair de sincronia, o OpenClaw pode acabar com mapeamentos `m.direct` obsoletos que apontam para salas individuais antigas em vez da DM ativa. Inspecione o mapeamento atual de um par com:
|
||||
Se o estado de mensagem direta ficar dessincronizado, o OpenClaw pode acabar com mapeamentos `m.direct` antigos que apontam para salas individuais antigas em vez da DM ativa. Inspecione o mapeamento atual para um par com:
|
||||
|
||||
```bash
|
||||
openclaw matrix direct inspect --user-id @alice:example.org
|
||||
```
|
||||
|
||||
Repare-o com:
|
||||
Repare com:
|
||||
|
||||
```bash
|
||||
openclaw matrix direct repair --user-id @alice:example.org
|
||||
@ -826,52 +827,52 @@ openclaw matrix direct repair --user-id @alice:example.org
|
||||
O fluxo de reparo:
|
||||
|
||||
- prefere uma DM estrita 1:1 que já esteja mapeada em `m.direct`
|
||||
- recorre a qualquer DM estrita 1:1 atualmente ingressada com esse usuário
|
||||
- cria uma nova sala direta e reescreve `m.direct` se não existir uma DM saudável
|
||||
- usa fallback para qualquer DM estrita 1:1 atualmente ingressada com esse usuário
|
||||
- cria uma nova sala direta e reescreve `m.direct` se não existir uma DM íntegra
|
||||
|
||||
O fluxo de reparo não exclui automaticamente salas antigas. Ele apenas escolhe a DM saudável e atualiza o mapeamento para que novos envios do Matrix, avisos de verificação e outros fluxos de mensagem direta voltem a apontar para a sala correta.
|
||||
O fluxo de reparo não exclui salas antigas automaticamente. Ele apenas escolhe a DM íntegra e atualiza o mapeamento para que novos envios Matrix, avisos de verificação e outros fluxos de mensagem direta voltem a ter como alvo a sala correta.
|
||||
|
||||
## Aprovações de execução
|
||||
## Aprovações de exec
|
||||
|
||||
O Matrix pode atuar como um cliente nativo de aprovação para uma conta Matrix. Os controles nativos
|
||||
de roteamento de DM/canal ainda ficam sob a configuração de aprovação de execução:
|
||||
de roteamento de DM/canal ainda ficam na configuração de aprovação de exec:
|
||||
|
||||
- `channels.matrix.execApprovals.enabled`
|
||||
- `channels.matrix.execApprovals.approvers` (opcional; usa como fallback `channels.matrix.dm.allowFrom`)
|
||||
- `channels.matrix.execApprovals.approvers` (opcional; usa fallback para `channels.matrix.dm.allowFrom`)
|
||||
- `channels.matrix.execApprovals.target` (`dm` | `channel` | `both`, padrão: `dm`)
|
||||
- `channels.matrix.execApprovals.agentFilter`
|
||||
- `channels.matrix.execApprovals.sessionFilter`
|
||||
|
||||
Os aprovadores devem ser IDs de usuário Matrix, como `@owner:example.org`. O Matrix ativa automaticamente aprovações nativas quando `enabled` não está definido ou é `"auto"` e pelo menos um aprovador pode ser resolvido. Aprovações de execução usam primeiro `execApprovals.approvers` e podem usar como fallback `channels.matrix.dm.allowFrom`. Aprovações de Plugin autorizam por meio de `channels.matrix.dm.allowFrom`. Defina `enabled: false` para desativar explicitamente o Matrix como cliente nativo de aprovação. Caso contrário, solicitações de aprovação recorrem a outras rotas de aprovação configuradas ou à política de fallback de aprovação.
|
||||
Os aprovadores devem ser IDs de usuário Matrix como `@owner:example.org`. O Matrix ativa automaticamente aprovações nativas quando `enabled` não está definido ou é `"auto"` e pelo menos um aprovador pode ser resolvido. Aprovações de exec usam primeiro `execApprovals.approvers` e podem usar fallback para `channels.matrix.dm.allowFrom`. Aprovações de Plugin autorizam por meio de `channels.matrix.dm.allowFrom`. Defina `enabled: false` para desativar explicitamente o Matrix como cliente nativo de aprovação. Caso contrário, solicitações de aprovação usam fallback para outras rotas de aprovação configuradas ou para a política de fallback de aprovação.
|
||||
|
||||
O roteamento nativo do Matrix oferece suporte a ambos os tipos de aprovação:
|
||||
|
||||
- `channels.matrix.execApprovals.*` controla o modo nativo de fanout por DM/canal para prompts de aprovação do Matrix.
|
||||
- Aprovações de execução usam o conjunto de aprovadores de execução de `execApprovals.approvers` ou `channels.matrix.dm.allowFrom`.
|
||||
- Aprovações de Plugin usam a lista de permissões de DM do Matrix em `channels.matrix.dm.allowFrom`.
|
||||
- Atalhos de reação e atualizações de mensagem do Matrix se aplicam tanto a aprovações de execução quanto a aprovações de Plugin.
|
||||
- `channels.matrix.execApprovals.*` controla o modo nativo de fanout em DM/canal para prompts de aprovação do Matrix.
|
||||
- Aprovações de exec usam o conjunto de aprovadores de exec de `execApprovals.approvers` ou `channels.matrix.dm.allowFrom`.
|
||||
- Aprovações de Plugin usam a allowlist de DM do Matrix de `channels.matrix.dm.allowFrom`.
|
||||
- Atalhos de reação do Matrix e atualizações de mensagem se aplicam tanto a aprovações de exec quanto de Plugin.
|
||||
|
||||
Regras de entrega:
|
||||
|
||||
- `target: "dm"` envia prompts de aprovação para as DMs dos aprovadores
|
||||
- `target: "dm"` envia prompts de aprovação para DMs dos aprovadores
|
||||
- `target: "channel"` envia o prompt de volta para a sala ou DM Matrix de origem
|
||||
- `target: "both"` envia para as DMs dos aprovadores e para a sala ou DM Matrix de origem
|
||||
- `target: "both"` envia para DMs dos aprovadores e para a sala ou DM Matrix de origem
|
||||
|
||||
Os prompts de aprovação do Matrix semeiam atalhos de reação na mensagem principal de aprovação:
|
||||
Prompts de aprovação do Matrix semeiam atalhos de reação na mensagem principal de aprovação:
|
||||
|
||||
- `✅` = permitir uma vez
|
||||
- `❌` = negar
|
||||
- `♾️` = permitir sempre quando essa decisão for permitida pela política efetiva de execução
|
||||
- `♾️` = permitir sempre quando essa decisão for permitida pela política de exec efetiva
|
||||
|
||||
Os aprovadores podem reagir nessa mensagem ou usar os comandos slash de fallback: `/approve <id> allow-once`, `/approve <id> allow-always` ou `/approve <id> deny`.
|
||||
|
||||
Somente aprovadores resolvidos podem aprovar ou negar. Para aprovações de execução, a entrega por canal inclui o texto do comando, então só ative `channel` ou `both` em salas confiáveis.
|
||||
Somente aprovadores resolvidos podem aprovar ou negar. Para aprovações de exec, a entrega por canal inclui o texto do comando, então ative `channel` ou `both` apenas em salas confiáveis.
|
||||
|
||||
Substituição por conta:
|
||||
|
||||
- `channels.matrix.accounts.<account>.execApprovals`
|
||||
|
||||
Documentação relacionada: [Aprovações de execução](/pt-BR/tools/exec-approvals)
|
||||
Documentação relacionada: [Aprovações de exec](/pt-BR/tools/exec-approvals)
|
||||
|
||||
## Várias contas
|
||||
|
||||
@ -904,13 +905,13 @@ Documentação relacionada: [Aprovações de execução](/pt-BR/tools/exec-appro
|
||||
```
|
||||
|
||||
Os valores de nível superior em `channels.matrix` atuam como padrões para contas nomeadas, a menos que uma conta os substitua.
|
||||
Você pode restringir entradas de sala herdadas a uma conta Matrix com `groups.<room>.account`.
|
||||
Entradas sem `account` permanecem compartilhadas entre todas as contas Matrix, e entradas com `account: "default"` continuam funcionando quando a conta padrão é configurada diretamente no nível superior em `channels.matrix.*`.
|
||||
Padrões parciais compartilhados de autenticação não criam, por si só, uma conta padrão implícita separada. O OpenClaw só sintetiza a conta `default` de nível superior quando esse padrão tem autenticação nova (`homeserver` mais `accessToken`, ou `homeserver` mais `userId` e `password`); contas nomeadas ainda podem continuar detectáveis a partir de `homeserver` mais `userId` quando credenciais em cache satisfazem a autenticação mais tarde.
|
||||
Se o Matrix já tiver exatamente uma conta nomeada, ou `defaultAccount` apontar para uma chave existente de conta nomeada, a promoção de reparo/configuração de conta única para várias contas preserva essa conta em vez de criar uma nova entrada `accounts.default`. Somente chaves de autenticação/bootstrap do Matrix são movidas para essa conta promovida; chaves compartilhadas de política de entrega permanecem no nível superior.
|
||||
Defina `defaultAccount` quando quiser que o OpenClaw prefira uma conta Matrix nomeada para roteamento implícito, sondagem e operações da CLI.
|
||||
Você pode limitar entradas de sala herdadas a uma conta Matrix com `groups.<room>.account`.
|
||||
Entradas sem `account` permanecem compartilhadas entre todas as contas Matrix, e entradas com `account: "default"` ainda funcionam quando a conta padrão é configurada diretamente no nível superior em `channels.matrix.*`.
|
||||
Padrões parciais compartilhados de autenticação não criam por si só uma conta padrão implícita separada. O OpenClaw só sintetiza a conta `default` de nível superior quando esse padrão tem autenticação nova (`homeserver` mais `accessToken`, ou `homeserver` mais `userId` e `password`); contas nomeadas ainda podem continuar detectáveis a partir de `homeserver` mais `userId` quando credenciais em cache satisfizerem a autenticação depois.
|
||||
Se o Matrix já tiver exatamente uma conta nomeada, ou `defaultAccount` apontar para uma chave de conta nomeada existente, a promoção de reparo/configuração de conta única para várias contas preserva essa conta em vez de criar uma nova entrada `accounts.default`. Apenas chaves de autenticação/bootstrap do Matrix são movidas para essa conta promovida; chaves compartilhadas de política de entrega permanecem no nível superior.
|
||||
Defina `defaultAccount` quando quiser que o OpenClaw prefira uma conta Matrix nomeada para roteamento implícito, sondagem e operações de CLI.
|
||||
Se várias contas Matrix estiverem configuradas e um ID de conta for `default`, o OpenClaw usa essa conta implicitamente mesmo quando `defaultAccount` não está definido.
|
||||
Se você configurar várias contas nomeadas, defina `defaultAccount` ou passe `--account <id>` para comandos da CLI que dependem de seleção implícita de conta.
|
||||
Se você configurar várias contas nomeadas, defina `defaultAccount` ou passe `--account <id>` para comandos de CLI que dependem da seleção implícita de conta.
|
||||
Passe `--account <id>` para `openclaw matrix verify ...` e `openclaw matrix devices ...` quando quiser substituir essa seleção implícita para um comando.
|
||||
|
||||
Consulte [Referência de configuração](/pt-BR/gateway/configuration-reference#multi-account-all-channels) para ver o padrão compartilhado de várias contas.
|
||||
@ -918,9 +919,9 @@ Consulte [Referência de configuração](/pt-BR/gateway/configuration-reference#
|
||||
## Homeservers privados/LAN
|
||||
|
||||
Por padrão, o OpenClaw bloqueia homeservers Matrix privados/internos para proteção contra SSRF, a menos que você
|
||||
ative explicitamente essa permissão por conta.
|
||||
ative isso explicitamente por conta.
|
||||
|
||||
Se seu homeserver estiver em localhost, em um IP de LAN/Tailscale ou em um nome de host interno, ative
|
||||
Se seu homeserver roda em localhost, em um IP de LAN/Tailscale ou em um hostname interno, ative
|
||||
`network.dangerouslyAllowPrivateNetwork` para essa conta Matrix:
|
||||
|
||||
```json5
|
||||
@ -947,8 +948,8 @@ openclaw matrix account add \
|
||||
--access-token syt_ops_xxx
|
||||
```
|
||||
|
||||
Essa permissão explícita permite apenas destinos privados/internos confiáveis. Homeservers públicos em texto simples, como
|
||||
`http://matrix.example.org:8008`, continuam bloqueados. Prefira `https://` sempre que possível.
|
||||
Esse opt-in permite apenas destinos privados/internos confiáveis. Homeservers públicos em texto simples como
|
||||
`http://matrix.example.org:8008` continuam bloqueados. Prefira `https://` sempre que possível.
|
||||
|
||||
## Uso de proxy para tráfego Matrix
|
||||
|
||||
@ -967,85 +968,85 @@ Se sua implantação Matrix precisar de um proxy HTTP(S) de saída explícito, d
|
||||
```
|
||||
|
||||
Contas nomeadas podem substituir o padrão de nível superior com `channels.matrix.accounts.<id>.proxy`.
|
||||
O OpenClaw usa a mesma configuração de proxy para tráfego Matrix em execução e para sondas de status da conta.
|
||||
O OpenClaw usa a mesma configuração de proxy para tráfego Matrix em runtime e para sondagens de status da conta.
|
||||
|
||||
## Resolução de destino
|
||||
|
||||
O Matrix aceita estes formatos de destino em qualquer lugar onde o OpenClaw pedir um destino de sala ou usuário:
|
||||
O Matrix aceita estes formatos de destino em qualquer lugar onde o OpenClaw pedir um alvo de sala ou usuário:
|
||||
|
||||
- Usuários: `@user:server`, `user:@user:server` ou `matrix:user:@user:server`
|
||||
- Salas: `!room:server`, `room:!room:server` ou `matrix:room:!room:server`
|
||||
- Aliases: `#alias:server`, `channel:#alias:server` ou `matrix:channel:#alias:server`
|
||||
|
||||
A busca ao vivo em diretório usa a conta Matrix autenticada:
|
||||
A busca ao vivo no diretório usa a conta Matrix autenticada:
|
||||
|
||||
- Buscas de usuário consultam o diretório de usuários Matrix nesse homeserver.
|
||||
- Buscas de sala aceitam diretamente IDs e aliases explícitos de sala e depois recorrem à busca por nomes de salas ingressadas para essa conta.
|
||||
- A busca por nome de sala ingressada é feita em regime de melhor esforço. Se o nome de uma sala não puder ser resolvido para um ID ou alias, ele será ignorado pela resolução da lista de permissões em tempo de execução.
|
||||
- Buscas de usuário consultam o diretório de usuários do Matrix nesse homeserver.
|
||||
- Buscas de sala aceitam diretamente IDs e aliases explícitos de sala e depois usam fallback para pesquisar nomes de salas ingressadas para essa conta.
|
||||
- A busca por nome de sala ingressada é best-effort. Se um nome de sala não puder ser resolvido para um ID ou alias, ele será ignorado pela resolução da allowlist em runtime.
|
||||
|
||||
## Referência de configuração
|
||||
|
||||
- `enabled`: ativa ou desativa o canal.
|
||||
- `name`: rótulo opcional para a conta.
|
||||
- `defaultAccount`: ID de conta preferido quando várias contas Matrix estiverem configuradas.
|
||||
- `defaultAccount`: ID de conta preferido quando várias contas Matrix estão configuradas.
|
||||
- `homeserver`: URL do homeserver, por exemplo `https://matrix.example.org`.
|
||||
- `network.dangerouslyAllowPrivateNetwork`: permite que esta conta Matrix se conecte a homeservers privados/internos. Ative isso quando o homeserver for resolvido para `localhost`, um IP de LAN/Tailscale ou um host interno como `matrix-synapse`.
|
||||
- `proxy`: URL opcional de proxy HTTP(S) para tráfego Matrix. Contas nomeadas podem substituir o padrão de nível superior com seu próprio `proxy`.
|
||||
- `userId`: ID completo do usuário Matrix, por exemplo `@bot:example.org`.
|
||||
- `accessToken`: token de acesso para autenticação baseada em token. Valores em texto simples e valores SecretRef são compatíveis com `channels.matrix.accessToken` e `channels.matrix.accounts.<id>.accessToken` nos provedores env/file/exec. Consulte [Gerenciamento de segredos](/pt-BR/gateway/secrets).
|
||||
- `accessToken`: token de acesso para autenticação baseada em token. Valores em texto simples e valores SecretRef são compatíveis com `channels.matrix.accessToken` e `channels.matrix.accounts.<id>.accessToken` em provedores env/file/exec. Consulte [Gerenciamento de segredos](/pt-BR/gateway/secrets).
|
||||
- `password`: senha para login baseado em senha. Valores em texto simples e valores SecretRef são compatíveis.
|
||||
- `deviceId`: ID explícito do dispositivo Matrix.
|
||||
- `deviceName`: nome de exibição do dispositivo para login por senha.
|
||||
- `avatarUrl`: URL armazenada do próprio avatar para sincronização de perfil e atualizações de `profile set`.
|
||||
- `avatarUrl`: URL do próprio avatar armazenada para sincronização de perfil e atualizações de `profile set`.
|
||||
- `initialSyncLimit`: número máximo de eventos buscados durante a sincronização de inicialização.
|
||||
- `encryption`: ativa E2EE.
|
||||
- `allowlistOnly`: quando `true`, atualiza a política de sala `open` para `allowlist` e força todas as políticas ativas de DM, exceto `disabled` (incluindo `pairing` e `open`), para `allowlist`. Não afeta políticas `disabled`.
|
||||
- `allowBots`: permite mensagens de outras contas Matrix do OpenClaw configuradas (`true` ou `"mentions"`).
|
||||
- `allowlistOnly`: quando `true`, faz upgrade da política de sala `open` para `allowlist` e força todas as políticas ativas de DM, exceto `disabled` (incluindo `pairing` e `open`), para `allowlist`. Não afeta políticas `disabled`.
|
||||
- `allowBots`: permite mensagens de outras contas Matrix configuradas do OpenClaw (`true` ou `"mentions"`).
|
||||
- `groupPolicy`: `open`, `allowlist` ou `disabled`.
|
||||
- `contextVisibility`: modo de visibilidade de contexto suplementar de sala (`all`, `allowlist`, `allowlist_quote`).
|
||||
- `groupAllowFrom`: lista de permissões de IDs de usuário para tráfego de sala. As entradas devem ser IDs completos de usuário Matrix; nomes não resolvidos são ignorados em tempo de execução.
|
||||
- `historyLimit`: número máximo de mensagens da sala a incluir como contexto de histórico de grupo. Usa como fallback `messages.groupChat.historyLimit`; se ambos não estiverem definidos, o padrão efetivo é `0`. Defina `0` para desativar.
|
||||
- `contextVisibility`: modo de visibilidade de contexto complementar da sala (`all`, `allowlist`, `allowlist_quote`).
|
||||
- `groupAllowFrom`: allowlist de IDs de usuário para tráfego de sala. As entradas devem ser IDs completos de usuário Matrix; nomes não resolvidos são ignorados em runtime.
|
||||
- `historyLimit`: máximo de mensagens de sala a incluir como contexto de histórico de grupo. Usa fallback para `messages.groupChat.historyLimit`; se ambos não estiverem definidos, o padrão efetivo é `0`. Defina `0` para desativar.
|
||||
- `replyToMode`: `off`, `first`, `all` ou `batched`.
|
||||
- `markdown`: configuração opcional de renderização de Markdown para texto Matrix de saída.
|
||||
- `markdown`: configuração opcional de renderização Markdown para texto Matrix de saída.
|
||||
- `streaming`: `off` (padrão), `"partial"`, `"quiet"`, `true` ou `false`. `"partial"` e `true` ativam atualizações de rascunho com prévia primeiro usando mensagens de texto normais do Matrix. `"quiet"` usa avisos de prévia sem notificação para configurações auto-hospedadas com regras de push. `false` é equivalente a `"off"`.
|
||||
- `blockStreaming`: `true` ativa mensagens de progresso separadas para blocos concluídos do assistente enquanto o streaming de prévia em rascunho está ativo.
|
||||
- `blockStreaming`: `true` ativa mensagens de progresso separadas para blocos concluídos do assistente enquanto o streaming de prévia de rascunho está ativo.
|
||||
- `threadReplies`: `off`, `inbound` ou `always`.
|
||||
- `threadBindings`: substituições por canal para roteamento e ciclo de vida de sessão vinculados a thread.
|
||||
- `threadBindings`: substituições por canal para roteamento e ciclo de vida de sessão vinculada a thread.
|
||||
- `startupVerification`: modo automático de solicitação de autoverificação na inicialização (`if-unverified`, `off`).
|
||||
- `startupVerificationCooldownHours`: cooldown antes de tentar novamente solicitações automáticas de verificação na inicialização.
|
||||
- `textChunkLimit`: tamanho de fragmento da mensagem de saída em caracteres (aplica-se quando `chunkMode` é `length`).
|
||||
- `textChunkLimit`: tamanho do bloco de mensagem de saída em caracteres (aplica-se quando `chunkMode` é `length`).
|
||||
- `chunkMode`: `length` divide mensagens por contagem de caracteres; `newline` divide em limites de linha.
|
||||
- `responsePrefix`: string opcional adicionada ao início de todas as respostas de saída deste canal.
|
||||
- `ackReaction`: substituição opcional da reação de confirmação para este canal/conta.
|
||||
- `ackReactionScope`: substituição opcional do escopo da reação de confirmação (`group-mentions`, `group-all`, `direct`, `all`, `none`, `off`).
|
||||
- `responsePrefix`: string opcional adicionada no início de todas as respostas de saída deste canal.
|
||||
- `ackReaction`: substituição opcional de reação de confirmação para este canal/conta.
|
||||
- `ackReactionScope`: substituição opcional do escopo de reação de confirmação (`group-mentions`, `group-all`, `direct`, `all`, `none`, `off`).
|
||||
- `reactionNotifications`: modo de notificação de reação de entrada (`own`, `off`).
|
||||
- `mediaMaxMb`: limite de tamanho de mídia em MB para envios de saída e processamento de mídia de entrada.
|
||||
- `autoJoin`: política de entrada automática por convite (`always`, `allowlist`, `off`). Padrão: `off`. Aplica-se a todos os convites do Matrix, incluindo convites no estilo DM.
|
||||
- `autoJoin`: política de entrada automática por convite (`always`, `allowlist`, `off`). Padrão: `off`. Aplica-se a todos os convites Matrix, incluindo convites no estilo DM.
|
||||
- `autoJoinAllowlist`: salas/aliases permitidos quando `autoJoin` é `allowlist`. Entradas de alias são resolvidas para IDs de sala durante o tratamento do convite; o OpenClaw não confia no estado de alias declarado pela sala convidada.
|
||||
- `dm`: bloco de política de DM (`enabled`, `policy`, `allowFrom`, `sessionScope`, `threadReplies`).
|
||||
- `dm.policy`: controla o acesso à DM depois que o OpenClaw entra na sala e a classifica como DM. Isso não altera se um convite é aceito automaticamente.
|
||||
- `dm.allowFrom`: as entradas devem ser IDs completos de usuário Matrix, a menos que você já as tenha resolvido por meio de busca ao vivo em diretório.
|
||||
- `dm.policy`: controla o acesso à DM depois que o OpenClaw entra na sala e a classifica como uma DM. Isso não altera se um convite é aceito automaticamente.
|
||||
- `dm.allowFrom`: as entradas devem ser IDs completos de usuário Matrix, a menos que você já os tenha resolvido por meio da busca ao vivo no diretório.
|
||||
- `dm.sessionScope`: `per-user` (padrão) ou `per-room`. Use `per-room` quando quiser que cada sala de DM do Matrix mantenha contexto separado mesmo que o par seja o mesmo.
|
||||
- `dm.threadReplies`: substituição da política de thread apenas para DM (`off`, `inbound`, `always`). Ela substitui a configuração de nível superior `threadReplies` tanto para o posicionamento da resposta quanto para o isolamento de sessão em DMs.
|
||||
- `execApprovals`: entrega nativa de aprovações de execução do Matrix (`enabled`, `approvers`, `target`, `agentFilter`, `sessionFilter`).
|
||||
- `execApprovals.approvers`: IDs de usuário Matrix autorizados a aprovar solicitações de execução. Opcional quando `dm.allowFrom` já identifica os aprovadores.
|
||||
- `dm.threadReplies`: substituição de política de thread somente para DM (`off`, `inbound`, `always`). Ela substitui a configuração `threadReplies` de nível superior tanto para posicionamento de resposta quanto para isolamento de sessão em DMs.
|
||||
- `execApprovals`: entrega nativa de aprovação de exec do Matrix (`enabled`, `approvers`, `target`, `agentFilter`, `sessionFilter`).
|
||||
- `execApprovals.approvers`: IDs de usuário Matrix autorizados a aprovar solicitações de exec. Opcional quando `dm.allowFrom` já identifica os aprovadores.
|
||||
- `execApprovals.target`: `dm | channel | both` (padrão: `dm`).
|
||||
- `accounts`: substituições nomeadas por conta. Os valores de nível superior de `channels.matrix` atuam como padrões para essas entradas.
|
||||
- `groups`: mapa de políticas por sala. Prefira IDs ou aliases de sala; nomes de sala não resolvidos são ignorados em tempo de execução. A identidade da sessão/do grupo usa o ID estável da sala após a resolução.
|
||||
- `groups`: mapa de política por sala. Prefira IDs de sala ou aliases; nomes de sala não resolvidos são ignorados em runtime. A identidade de sessão/grupo usa o ID estável da sala após a resolução.
|
||||
- `groups.<room>.account`: restringe uma entrada de sala herdada a uma conta Matrix específica em configurações com várias contas.
|
||||
- `groups.<room>.allowBots`: substituição no nível da sala para remetentes de bots configurados (`true` ou `"mentions"`).
|
||||
- `groups.<room>.users`: lista de permissões de remetentes por sala.
|
||||
- `groups.<room>.users`: allowlist de remetentes por sala.
|
||||
- `groups.<room>.tools`: substituições por sala para permitir/negar ferramentas.
|
||||
- `groups.<room>.autoReply`: substituição no nível da sala para exigência de menção. `true` desativa a exigência de menção para essa sala; `false` a força de volta.
|
||||
- `groups.<room>.skills`: filtro opcional de Skills por sala.
|
||||
- `groups.<room>.systemPrompt`: trecho opcional de prompt de sistema por sala.
|
||||
- `groups.<room>.autoReply`: substituição no nível da sala para bloqueio por menção. `true` desativa exigências de menção para essa sala; `false` volta a forçá-las.
|
||||
- `groups.<room>.skills`: filtro opcional de Skills no nível da sala.
|
||||
- `groups.<room>.systemPrompt`: trecho opcional de system prompt no nível da sala.
|
||||
- `rooms`: alias legado para `groups`.
|
||||
- `actions`: controle por ação de ferramentas (`messages`, `reactions`, `pins`, `profile`, `memberInfo`, `channelInfo`, `verification`).
|
||||
|
||||
## Relacionado
|
||||
## Relacionados
|
||||
|
||||
- [Visão geral dos canais](/pt-BR/channels) — todos os canais compatíveis
|
||||
- [Pairing](/pt-BR/channels/pairing) — autenticação de DM e fluxo de pareamento
|
||||
- [Groups](/pt-BR/channels/groups) — comportamento de chat em grupo e exigência de menção
|
||||
- [Roteamento de canais](/pt-BR/channels/channel-routing) — roteamento de sessão para mensagens
|
||||
- [Segurança](/pt-BR/gateway/security) — modelo de acesso e reforço de segurança
|
||||
- [Pairing](/pt-BR/channels/pairing) — autenticação de DM e fluxo de emparelhamento
|
||||
- [Groups](/pt-BR/channels/groups) — comportamento de chat em grupo e bloqueio por menção
|
||||
- [Roteamento de canal](/pt-BR/channels/channel-routing) — roteamento de sessão para mensagens
|
||||
- [Segurança](/pt-BR/gateway/security) — modelo de acesso e proteção
|
||||
|
||||
@ -1,98 +1,98 @@
|
||||
---
|
||||
read_when:
|
||||
- Editar o texto do prompt do sistema, a lista de ferramentas ou as seções de hora/heartbeat
|
||||
- Alterar o comportamento de bootstrap do workspace ou da injeção de Skills
|
||||
summary: O que o prompt do sistema do OpenClaw contém e como ele é montado
|
||||
title: Prompt do sistema
|
||||
- Editando o texto do prompt de sistema, a lista de ferramentas ou as seções de hora/Heartbeat
|
||||
- Alterando o bootstrap do workspace ou o comportamento de injeção de Skills
|
||||
summary: O que o prompt de sistema do OpenClaw contém e como ele é montado
|
||||
title: Prompt de sistema
|
||||
x-i18n:
|
||||
generated_at: "2026-04-12T05:33:09Z"
|
||||
generated_at: "2026-04-15T19:41:35Z"
|
||||
model: gpt-5.4
|
||||
provider: openai
|
||||
source_hash: 057f01aac51f7737b5223f61f5d55e552d9011232aebb130426e269d8f6c257f
|
||||
source_hash: c740e4646bc4980567338237bfb55126af0df72499ca00a48e4848d9a3608ab4
|
||||
source_path: concepts/system-prompt.md
|
||||
workflow: 15
|
||||
---
|
||||
|
||||
# Prompt do sistema
|
||||
# Prompt de sistema
|
||||
|
||||
O OpenClaw cria um prompt do sistema personalizado para cada execução de agente. O prompt é **de propriedade do OpenClaw** e não usa o prompt padrão do pi-coding-agent.
|
||||
O OpenClaw monta um prompt de sistema personalizado para cada execução de agente. O prompt é **de propriedade do OpenClaw** e não usa o prompt padrão do pi-coding-agent.
|
||||
|
||||
O prompt é montado pelo OpenClaw e injetado em cada execução de agente.
|
||||
|
||||
Plugins de provedor podem contribuir com orientações de prompt compatíveis com cache sem substituir o prompt completo de propriedade do OpenClaw. O runtime do provedor pode:
|
||||
Plugins de provedor podem contribuir com orientações de prompt com reconhecimento de cache sem substituir todo o prompt de propriedade do OpenClaw. O runtime do provedor pode:
|
||||
|
||||
- substituir um pequeno conjunto de seções centrais nomeadas (`interaction_style`,
|
||||
`tool_call_style`, `execution_bias`)
|
||||
- injetar um **prefixo estável** acima do limite de cache do prompt
|
||||
- injetar um **sufixo dinâmico** abaixo do limite de cache do prompt
|
||||
|
||||
Use contribuições de propriedade do provedor para ajustes específicos de famílias de modelos. Mantenha a mutação legada de prompt `before_prompt_build` para compatibilidade ou para mudanças de prompt realmente globais, não para o comportamento normal do provedor.
|
||||
Use contribuições de propriedade do provedor para ajustes específicos de famílias de modelos. Mantenha a mutação legada de prompt `before_prompt_build` para compatibilidade ou mudanças de prompt realmente globais, não para o comportamento normal do provedor.
|
||||
|
||||
## Estrutura
|
||||
|
||||
O prompt é intencionalmente compacto e usa seções fixas:
|
||||
|
||||
- **Ferramentas**: lembrete da fonte da verdade de ferramentas estruturadas mais orientações de runtime para uso de ferramentas.
|
||||
- **Segurança**: lembrete curto de proteção para evitar comportamento de busca por poder ou de contorno de supervisão.
|
||||
- **Ferramentas**: lembrete da fonte da verdade de ferramentas estruturadas, além de orientações de uso de ferramentas em runtime.
|
||||
- **Segurança**: lembrete curto de proteção para evitar comportamento de busca de poder ou desvio de supervisão.
|
||||
- **Skills** (quando disponíveis): informa ao modelo como carregar instruções de skill sob demanda.
|
||||
- **Autoatualização do OpenClaw**: como inspecionar a configuração com segurança usando
|
||||
`config.schema.lookup`, aplicar patch na configuração com `config.patch`, substituir a configuração completa com `config.apply` e executar `update.run` apenas mediante solicitação explícita do usuário. A ferramenta `gateway`, exclusiva do proprietário, também se recusa a reescrever
|
||||
`config.schema.lookup`, aplicar patch na configuração com `config.patch`, substituir toda a
|
||||
configuração com `config.apply` e executar `update.run` somente mediante solicitação explícita do usuário. A ferramenta `gateway`, restrita ao proprietário, também se recusa a reescrever
|
||||
`tools.exec.ask` / `tools.exec.security`, incluindo aliases legados `tools.bash.*`
|
||||
que são normalizados para esses caminhos de exec protegidos.
|
||||
que são normalizados para esses caminhos protegidos de exec.
|
||||
- **Workspace**: diretório de trabalho (`agents.defaults.workspace`).
|
||||
- **Documentação**: caminho local para a documentação do OpenClaw (repositório ou pacote npm) e quando lê-la.
|
||||
- **Arquivos do workspace (injetados)**: indica que os arquivos de bootstrap estão incluídos abaixo.
|
||||
- **Sandbox** (quando habilitado): indica runtime em sandbox, caminhos do sandbox e se exec com privilégios elevados está disponível.
|
||||
- **Arquivos do Workspace (injetados)**: indica que os arquivos de bootstrap estão incluídos abaixo.
|
||||
- **Sandbox** (quando habilitado): indica runtime em sandbox, caminhos do sandbox e se exec elevado está disponível.
|
||||
- **Data e hora atuais**: hora local do usuário, fuso horário e formato de hora.
|
||||
- **Tags de resposta**: sintaxe opcional de tags de resposta para provedores compatíveis.
|
||||
- **Heartbeats**: prompt de heartbeat e comportamento de confirmação, quando heartbeats estão habilitados para o agente padrão.
|
||||
- **Runtime**: host, SO, node, raiz do repositório (quando detectada), nível de raciocínio (uma linha).
|
||||
- **Raciocínio**: nível atual de visibilidade + dica do toggle `/reasoning`.
|
||||
- **Raciocínio**: nível atual de visibilidade + dica de alternância com /reasoning.
|
||||
|
||||
A seção Ferramentas também inclui orientações de runtime para trabalhos de longa duração:
|
||||
|
||||
- use cron para acompanhamento futuro (`check back later`, lembretes, trabalho recorrente)
|
||||
em vez de loops de sleep com `exec`, truques de atraso com `yieldMs` ou polling repetido de `process`
|
||||
- use `exec` / `process` apenas para comandos que começam agora e continuam em execução
|
||||
- use Cron para acompanhamento futuro (`check back later`, lembretes, trabalho recorrente)
|
||||
em vez de loops de `exec` com sleep, truques de atraso com `yieldMs` ou polling repetido de `process`
|
||||
- use `exec` / `process` apenas para comandos que começam agora e continuam rodando
|
||||
em segundo plano
|
||||
- quando o wake automático por conclusão estiver habilitado, inicie o comando uma vez e confie
|
||||
no caminho de wake baseado em push quando ele emitir saída ou falhar
|
||||
- quando o despertar automático na conclusão estiver habilitado, inicie o comando uma vez e confie no caminho de despertar baseado em push quando ele emitir saída ou falhar
|
||||
- use `process` para logs, status, entrada ou intervenção quando precisar
|
||||
inspecionar um comando em execução
|
||||
- se a tarefa for maior, prefira `sessions_spawn`; a conclusão de subagentes é
|
||||
baseada em push e é anunciada automaticamente de volta ao solicitante
|
||||
- não faça polling de `subagents list` / `sessions_list` em loop apenas para aguardar
|
||||
baseada em push e anunciada automaticamente de volta ao solicitante
|
||||
- não faça polling de `subagents list` / `sessions_list` em loop apenas para esperar
|
||||
a conclusão
|
||||
|
||||
Quando a ferramenta experimental `update_plan` está habilitada, Ferramentas também informa ao
|
||||
modelo para usá-la apenas em trabalhos não triviais com múltiplas etapas, manter exatamente uma
|
||||
modelo para usá-la apenas em trabalhos não triviais de várias etapas, manter exatamente uma
|
||||
etapa `in_progress` e evitar repetir o plano inteiro após cada atualização.
|
||||
|
||||
As proteções de segurança no prompt do sistema são consultivas. Elas orientam o comportamento do modelo, mas não impõem política. Use política de ferramentas, aprovações de exec, sandboxing e listas de permissões de canais para imposição rígida; operadores podem desativá-las por design.
|
||||
As proteções de segurança no prompt de sistema são orientativas. Elas orientam o comportamento do modelo, mas não impõem política. Use política de ferramentas, aprovações de exec, sandboxing e allowlists de canais para imposição rígida; operadores podem desabilitar isso por design.
|
||||
|
||||
Em canais com cartões/botões de aprovação nativos, o prompt de runtime agora informa ao
|
||||
agente para depender primeiro dessa UI de aprovação nativa. Ele só deve incluir um comando manual
|
||||
`/approve` quando o resultado da ferramenta disser que aprovações no chat não estão disponíveis ou
|
||||
que a aprovação manual é o único caminho.
|
||||
Em canais com cartões/botões de aprovação nativos, o prompt de runtime agora instrui o
|
||||
agente a confiar primeiro nessa interface nativa de aprovação. Ele só deve incluir um comando manual
|
||||
`/approve` quando o resultado da ferramenta informar que aprovações no chat não estão disponíveis ou
|
||||
que aprovação manual é o único caminho.
|
||||
|
||||
## Modos de prompt
|
||||
|
||||
O OpenClaw pode renderizar prompts do sistema menores para subagentes. O runtime define um
|
||||
O OpenClaw pode renderizar prompts de sistema menores para subagentes. O runtime define um
|
||||
`promptMode` para cada execução (não é uma configuração voltada ao usuário):
|
||||
|
||||
- `full` (padrão): inclui todas as seções acima.
|
||||
- `minimal`: usado para subagentes; omite **Skills**, **Recuperação de memória**, **Autoatualização do OpenClaw**, **Aliases de modelo**, **Identidade do usuário**, **Tags de resposta**,
|
||||
**Mensagens**, **Respostas silenciosas** e **Heartbeats**. Ferramentas, **Segurança**,
|
||||
- `minimal`: usado para subagentes; omite **Skills**, **Recordação de Memória**, **Autoatualização do OpenClaw**, **Aliases de modelos**, **Identidade do usuário**, **Tags de resposta**,
|
||||
**Mensageria**, **Respostas silenciosas** e **Heartbeats**. Ferramentas, **Segurança**,
|
||||
Workspace, Sandbox, Data e hora atuais (quando conhecidas), Runtime e contexto
|
||||
injetado continuam disponíveis.
|
||||
- `none`: retorna apenas a linha de identidade base.
|
||||
- `none`: retorna apenas a linha base de identidade.
|
||||
|
||||
Quando `promptMode=minimal`, prompts extras injetados são rotulados como **Contexto do subagente**
|
||||
em vez de **Contexto do chat em grupo**.
|
||||
em vez de **Contexto de chat em grupo**.
|
||||
|
||||
## Injeção de bootstrap do workspace
|
||||
|
||||
Os arquivos de bootstrap são aparados e anexados em **Contexto do projeto** para que o modelo veja o contexto de identidade e perfil sem precisar fazer leituras explícitas:
|
||||
Os arquivos de bootstrap são recortados e anexados em **Contexto do projeto** para que o modelo veja o contexto de identidade e perfil sem precisar de leituras explícitas:
|
||||
|
||||
- `AGENTS.md`
|
||||
- `SOUL.md`
|
||||
@ -100,49 +100,49 @@ Os arquivos de bootstrap são aparados e anexados em **Contexto do projeto** par
|
||||
- `IDENTITY.md`
|
||||
- `USER.md`
|
||||
- `HEARTBEAT.md`
|
||||
- `BOOTSTRAP.md` (apenas em workspaces totalmente novos)
|
||||
- `BOOTSTRAP.md` (somente em workspaces totalmente novos)
|
||||
- `MEMORY.md` quando presente, caso contrário `memory.md` como fallback em minúsculas
|
||||
|
||||
Todos esses arquivos são **injetados na janela de contexto** em cada turno, a menos que
|
||||
se aplique um gate específico do arquivo. `HEARTBEAT.md` é omitido em execuções normais quando
|
||||
heartbeats estão desabilitados para o agente padrão ou quando
|
||||
`agents.defaults.heartbeat.includeSystemPromptSection` é false. Mantenha os arquivos injetados concisos — especialmente `MEMORY.md`, que pode crescer com o tempo e levar a uso de contexto inesperadamente alto e compactação mais frequente.
|
||||
Todos esses arquivos são **injetados na janela de contexto** em toda rodada, a menos que
|
||||
se aplique um bloqueio específico do arquivo. `HEARTBEAT.md` é omitido em execuções normais quando
|
||||
heartbeats estão desabilitados para o agente padrão ou
|
||||
`agents.defaults.heartbeat.includeSystemPromptSection` é false. Mantenha os arquivos injetados concisos — especialmente `MEMORY.md`, que pode crescer com o tempo e levar a uso de contexto inesperadamente alto e compaction mais frequente.
|
||||
|
||||
> **Observação:** arquivos diários `memory/*.md` **não** fazem parte do bootstrap normal de
|
||||
> Contexto do projeto. Em turnos comuns, eles são acessados sob demanda por meio das
|
||||
> ferramentas `memory_search` e `memory_get`, portanto não contam contra a janela de
|
||||
> contexto, a menos que o modelo os leia explicitamente. Turnos simples de `/new` e
|
||||
> `/reset` são a exceção: o runtime pode prependar memória diária recente
|
||||
> como um bloco único de contexto de inicialização para esse primeiro turno.
|
||||
> **Observação:** arquivos diários `memory/*.md` **não** fazem parte do Contexto do projeto
|
||||
> normal do bootstrap. Em rodadas comuns, eles são acessados sob demanda por meio das
|
||||
> ferramentas `memory_search` e `memory_get`, portanto não contam contra a
|
||||
> janela de contexto, a menos que o modelo os leia explicitamente. Rodadas simples de `/new` e
|
||||
> `/reset` são a exceção: o runtime pode antepor memória diária recente
|
||||
> como um bloco único de contexto inicial para essa primeira rodada.
|
||||
|
||||
Arquivos grandes são truncados com um marcador. O tamanho máximo por arquivo é controlado por
|
||||
`agents.defaults.bootstrapMaxChars` (padrão: 20000). O conteúdo total de bootstrap injetado
|
||||
entre os arquivos é limitado por `agents.defaults.bootstrapTotalMaxChars`
|
||||
entre arquivos é limitado por `agents.defaults.bootstrapTotalMaxChars`
|
||||
(padrão: 150000). Arquivos ausentes injetam um marcador curto de arquivo ausente. Quando ocorre truncamento,
|
||||
o OpenClaw pode injetar um bloco de aviso em Contexto do projeto; controle isso com
|
||||
`agents.defaults.bootstrapPromptTruncationWarning` (`off`, `once`, `always`;
|
||||
padrão: `once`).
|
||||
|
||||
Sessões de subagente injetam apenas `AGENTS.md` e `TOOLS.md` (os outros arquivos de bootstrap
|
||||
Sessões de subagentes injetam apenas `AGENTS.md` e `TOOLS.md` (outros arquivos de bootstrap
|
||||
são filtrados para manter pequeno o contexto do subagente).
|
||||
|
||||
Hooks internos podem interceptar esta etapa via `agent:bootstrap` para modificar ou substituir
|
||||
Hooks internos podem interceptar esta etapa por meio de `agent:bootstrap` para mutar ou substituir
|
||||
os arquivos de bootstrap injetados (por exemplo, trocando `SOUL.md` por uma persona alternativa).
|
||||
|
||||
Se você quiser fazer o agente soar menos genérico, comece com
|
||||
[Guia de personalidade do SOUL.md](/pt-BR/concepts/soul).
|
||||
|
||||
Para inspecionar quanto cada arquivo injetado contribui (bruto vs. injetado, truncamento, além da sobrecarga do schema de ferramentas), use `/context list` ou `/context detail`. Veja [Contexto](/pt-BR/concepts/context).
|
||||
Para inspecionar quanto cada arquivo injetado contribui (bruto vs injetado, truncamento, além da sobrecarga do schema da ferramenta), use `/context list` ou `/context detail`. Veja [Contexto](/pt-BR/concepts/context).
|
||||
|
||||
## Tratamento de tempo
|
||||
## Tratamento de hora
|
||||
|
||||
O prompt do sistema inclui uma seção dedicada **Data e hora atuais** quando o
|
||||
fuso horário do usuário é conhecido. Para manter o cache do prompt estável, agora ele inclui apenas o
|
||||
O prompt de sistema inclui uma seção dedicada **Data e hora atuais** quando o
|
||||
fuso horário do usuário é conhecido. Para manter o cache do prompt estável, agora ela inclui apenas o
|
||||
**fuso horário** (sem relógio dinâmico nem formato de hora).
|
||||
|
||||
Use `session_status` quando o agente precisar da hora atual; o cartão de status
|
||||
inclui uma linha de timestamp. A mesma ferramenta também pode opcionalmente definir uma substituição
|
||||
de modelo por sessão (`model=default` a limpa).
|
||||
de modelo por sessão (`model=default` a remove).
|
||||
|
||||
Configure com:
|
||||
|
||||
@ -156,10 +156,10 @@ Veja [Data e hora](/pt-BR/date-time) para detalhes completos do comportamento.
|
||||
Quando existem skills elegíveis, o OpenClaw injeta uma **lista compacta de skills disponíveis**
|
||||
(`formatSkillsForPrompt`) que inclui o **caminho do arquivo** de cada skill. O
|
||||
prompt instrui o modelo a usar `read` para carregar o SKILL.md no local listado
|
||||
(workspace, gerenciado ou empacotado). Se não houver skills elegíveis, a seção
|
||||
Skills é omitida.
|
||||
(workspace, gerenciado ou empacotado). Se não houver skills elegíveis, a
|
||||
seção Skills é omitida.
|
||||
|
||||
A elegibilidade inclui gates de metadados da skill, verificações de ambiente/configuração de runtime
|
||||
A elegibilidade inclui bloqueios de metadados da skill, verificações de ambiente/configuração de runtime
|
||||
e a allowlist efetiva de skills do agente quando `agents.defaults.skills` ou
|
||||
`agents.list[].skills` está configurado.
|
||||
|
||||
@ -173,13 +173,26 @@ e a allowlist efetiva de skills do agente quando `agents.defaults.skills` ou
|
||||
</available_skills>
|
||||
```
|
||||
|
||||
Isso mantém o prompt base pequeno, ao mesmo tempo que ainda permite uso direcionado de skills.
|
||||
Isso mantém o prompt base pequeno enquanto ainda permite uso direcionado de skills.
|
||||
|
||||
O orçamento da lista de skills pertence ao subsistema de skills:
|
||||
|
||||
- Padrão global: `skills.limits.maxSkillsPromptChars`
|
||||
- Sobrescrita por agente: `agents.list[].skillsLimits.maxSkillsPromptChars`
|
||||
|
||||
Trechos genéricos limitados de runtime usam uma superfície diferente:
|
||||
|
||||
- `agents.defaults.contextLimits.*`
|
||||
- `agents.list[].contextLimits.*`
|
||||
|
||||
Essa separação mantém o dimensionamento de skills separado do dimensionamento de leitura/injeção de runtime, como
|
||||
`memory_get`, resultados de ferramentas ao vivo e atualizações de `AGENTS.md` após compaction.
|
||||
|
||||
## Documentação
|
||||
|
||||
Quando disponível, o prompt do sistema inclui uma seção **Documentação** que aponta para o
|
||||
Quando disponível, o prompt de sistema inclui uma seção **Documentação** que aponta para o
|
||||
diretório local da documentação do OpenClaw (seja `docs/` no workspace do repositório ou a documentação do
|
||||
pacote npm empacotado) e também menciona o espelho público, o repositório de origem, o Discord da comunidade e o
|
||||
ClawHub ([https://clawhub.ai](https://clawhub.ai)) para descoberta de skills. O prompt instrui o modelo a consultar primeiro a documentação local
|
||||
para comportamento, comandos, configuração ou arquitetura do OpenClaw e a executar
|
||||
para comportamento, comandos, configuração ou arquitetura do OpenClaw, e a executar
|
||||
`openclaw status` por conta própria quando possível (pedindo ao usuário apenas quando não tiver acesso).
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@ -7,19 +7,19 @@ sidebarTitle: Channel Plugins
|
||||
summary: Guia passo a passo para criar um Plugin de canal de mensagens para OpenClaw
|
||||
title: Criando Plugins de canal
|
||||
x-i18n:
|
||||
generated_at: "2026-04-15T05:33:50Z"
|
||||
generated_at: "2026-04-15T19:41:41Z"
|
||||
model: gpt-5.4
|
||||
provider: openai
|
||||
source_hash: a7f4c746fe3163a8880e14c433f4db4a1475535d91716a53fb879551d8d62f65
|
||||
source_hash: 80e47e61d1e47738361692522b79aff276544446c58a7b41afe5296635dfad4b
|
||||
source_path: plugins/sdk-channel-plugins.md
|
||||
workflow: 15
|
||||
---
|
||||
|
||||
# Criando Plugins de canal
|
||||
|
||||
Este guia apresenta a criação de um Plugin de canal que conecta o OpenClaw a uma
|
||||
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 em DM,
|
||||
pareamento, encadeamento de respostas e mensagens de saída.
|
||||
emparelhamento, encadeamento de respostas e mensagens de saída.
|
||||
|
||||
<Info>
|
||||
Se você ainda não criou nenhum Plugin do OpenClaw antes, leia
|
||||
@ -29,86 +29,86 @@ pareamento, encadeamento de respostas e mensagens de saída.
|
||||
|
||||
## Como os Plugins de canal funcionam
|
||||
|
||||
Plugins de canal não precisam de suas próprias ferramentas de enviar/editar/reagir. O OpenClaw mantém uma
|
||||
Os Plugins de canal não precisam de suas próprias ferramentas de enviar/editar/reagir. O OpenClaw mantém uma
|
||||
ferramenta `message` compartilhada 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 listas de permissão
|
||||
- **Pareamento** — fluxo de aprovação de DM
|
||||
- **Gramática de sessão** — como IDs de conversa específicos do provedor são mapeados para chats base, IDs de thread e fallbacks de pai
|
||||
- **Emparelhamento** — fluxo de aprovação de DM
|
||||
- **Gramática de sessão** — como ids de conversa específicos do provedor são mapeados 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
|
||||
|
||||
O core é responsável pela ferramenta `message` compartilhada, pelo encadeamento de prompts, pelo formato externo da chave de sessão,
|
||||
pela contabilidade genérica de `:thread:` e pelo dispatch.
|
||||
O core é responsável pela ferramenta de mensagem compartilhada, pela integração com o prompt, pelo formato externo da chave de sessão,
|
||||
pela lógica genérica de `:thread:`, e pelo despacho.
|
||||
|
||||
Se o seu canal adicionar parâmetros à ferramenta de mensagem que transportam origens de mídia, exponha esses
|
||||
nomes de parâmetros por meio de `describeMessageTool(...).mediaSourceParams`. O core usa
|
||||
essa lista explícita para normalização de caminho no sandbox e política de acesso a mídia de saída,
|
||||
então Plugins não precisam de casos especiais no core compartilhado para parâmetros específicos do provedor
|
||||
Se o seu canal adicionar parâmetros da ferramenta de mensagem que carregam fontes de mídia, exponha esses
|
||||
nomes de parâmetro por meio de `describeMessageTool(...).mediaSourceParams`. O core usa
|
||||
essa lista explícita para normalização de caminho em sandbox e política de acesso
|
||||
a mídia de saída, para que os Plugins não precisem de casos especiais no core compartilhado para parâmetros específicos do provedor,
|
||||
como avatar, anexo ou imagem de capa.
|
||||
Prefira retornar um mapa indexado por ação, como
|
||||
`{ "set-profile": ["avatarUrl", "avatarPath"] }`, para que ações não relacionadas não
|
||||
herdem os argumentos de mídia de outra ação. Um array simples ainda funciona para parâmetros que
|
||||
são intencionalmente compartilhados entre todas as ações expostas.
|
||||
|
||||
Se a sua plataforma armazena escopo extra dentro de 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, ID opcional de thread,
|
||||
Se a sua plataforma armazenar escopo extra dentro dos ids de conversa, mantenha essa lógica de parsing
|
||||
no Plugin com `messaging.resolveSessionConversation(...)`. Esse é o hook canônico para mapear
|
||||
`rawId` para o id da conversa base, id opcional de thread,
|
||||
`baseConversationId` explícito e quaisquer `parentConversationCandidates`.
|
||||
Ao retornar `parentConversationCandidates`, mantenha-os ordenados do
|
||||
pai mais específico para a conversa pai mais ampla/base.
|
||||
Quando você retornar `parentConversationCandidates`, mantenha-os ordenados do
|
||||
pai mais específico para a conversa base/mais ampla.
|
||||
|
||||
Plugins empacotados que precisam da mesma análise antes que o registro de canal seja inicializado
|
||||
também podem expor um arquivo `session-key-api.ts` de nível superior com uma exportação
|
||||
correspondente `resolveSessionConversation(...)`. O core usa essa superfície segura para bootstrap
|
||||
Plugins empacotados que precisam do mesmo parsing antes de o registro de canais ser inicializado
|
||||
também podem expor um arquivo de nível superior `session-key-api.ts` com uma exportação
|
||||
`resolveSessionConversation(...)` correspondente. O core usa essa superfície segura para bootstrap
|
||||
apenas quando o registro de Plugins em runtime ainda não está disponível.
|
||||
|
||||
`messaging.resolveParentConversationCandidates(...)` continua disponível como um
|
||||
fallback legado de compatibilidade quando um Plugin só precisa de fallbacks de pai além
|
||||
do ID genérico/bruto. Se ambos os hooks existirem, o core usa primeiro
|
||||
`resolveSessionConversation(...).parentConversationCandidates` e só então
|
||||
`messaging.resolveParentConversationCandidates(...)` continua disponível como
|
||||
fallback legado de compatibilidade quando um Plugin só precisa de fallbacks de pai
|
||||
sobre o id genérico/raw. Se ambos os hooks existirem, o core usa
|
||||
`resolveSessionConversation(...).parentConversationCandidates` primeiro e só
|
||||
recorre a `resolveParentConversationCandidates(...)` quando o hook canônico
|
||||
não os inclui.
|
||||
os omite.
|
||||
|
||||
## Aprovações e capacidades do canal
|
||||
|
||||
A maioria dos Plugins de canal não precisa de código específico para aprovação.
|
||||
A maioria dos Plugins de canal não precisa de código específico para aprovações.
|
||||
|
||||
- O core é responsável por `/approve` no mesmo chat, payloads compartilhados de botão de aprovação e entrega genérica de fallback.
|
||||
- Prefira um único objeto `approvalCapability` no Plugin de canal quando o canal precisar de comportamento específico de aprovação.
|
||||
- `ChannelPlugin.approvals` foi removido. Coloque fatos de entrega/renderização/autenticação/aprovação nativa em `approvalCapability`.
|
||||
- `plugin.auth` é apenas para login/logout; o core não lê mais hooks de autenticação de aprovação desse objeto.
|
||||
- `approvalCapability.authorizeActorAction` e `approvalCapability.getActionAvailabilityState` são a interface canônica de autenticação de aprovação.
|
||||
- Use `approvalCapability.getActionAvailabilityState` para disponibilidade de autenticação de aprovação no mesmo chat.
|
||||
- Se o seu canal expõe aprovações nativas de execução, use `approvalCapability.getExecInitiatingSurfaceState` para o estado da superfície iniciadora/cliente nativo quando ele diferir da autenticação de aprovação no mesmo chat. O core usa esse hook específico de execução para distinguir `enabled` de `disabled`, decidir se o canal iniciador oferece suporte a aprovações nativas de execução e incluir o canal nas orientações de fallback de cliente nativo. `createApproverRestrictedNativeApprovalCapability(...)` preenche isso para o caso comum.
|
||||
- Use `outbound.shouldSuppressLocalPayloadPrompt` ou `outbound.beforeDeliverPayload` para 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.delivery` apenas para roteamento de aprovação nativa ou supressão de fallback.
|
||||
- Use `approvalCapability.nativeRuntime` para fatos de aprovação nativa pertencentes ao canal. Mantenha isso lazy em entrypoints quentes do canal com `createLazyChannelApprovalNativeRuntimeAdapter(...)`, que pode importar seu módulo de runtime sob demanda enquanto ainda permite que o core monte o ciclo de vida de aprovação.
|
||||
- Prefira um único objeto `approvalCapability` no Plugin de canal quando o canal precisar de comportamento específico para aprovações.
|
||||
- `ChannelPlugin.approvals` foi removido. Coloque fatos de entrega/renderização/autorização nativa de aprovação em `approvalCapability`.
|
||||
- `plugin.auth` é apenas para login/logout; o core não lê mais hooks de autorização de aprovação desse objeto.
|
||||
- `approvalCapability.authorizeActorAction` e `approvalCapability.getActionAvailabilityState` são a superfície canônica para autorização de aprovação.
|
||||
- Use `approvalCapability.getActionAvailabilityState` para disponibilidade de autorização de aprovação no mesmo chat.
|
||||
- Se o seu canal expuser aprovações nativas de execução, use `approvalCapability.getExecInitiatingSurfaceState` para o estado da superfície iniciadora/cliente nativo quando ele diferir da autorização de aprovação no mesmo chat. O core usa esse hook específico de execução para distinguir `enabled` de `disabled`, decidir se o canal iniciador oferece suporte a aprovações nativas de execução e incluir o canal na orientação de fallback do cliente nativo. `createApproverRestrictedNativeApprovalCapability(...)` preenche isso para o caso comum.
|
||||
- Use `outbound.shouldSuppressLocalPayloadPrompt` ou `outbound.beforeDeliverPayload` para comportamento específico do canal no ciclo de vida do payload, como ocultar prompts locais duplicados de aprovação ou enviar indicadores de digitação antes da entrega.
|
||||
- Use `approvalCapability.delivery` apenas para roteamento nativo de aprovação ou supressão de fallback.
|
||||
- Use `approvalCapability.nativeRuntime` para fatos de aprovação nativa controlados pelo canal. Mantenha-o lazy em pontos de entrada críticos do canal com `createLazyChannelApprovalNativeRuntimeAdapter(...)`, que pode importar seu módulo de runtime sob demanda e ainda permitir que o core monte o ciclo de vida da aprovação.
|
||||
- Use `approvalCapability.render` apenas quando um canal realmente precisar de payloads de aprovação personalizados em vez do renderizador compartilhado.
|
||||
- Use `approvalCapability.describeExecApprovalSetup` quando o canal quiser que a resposta do caminho desabilitado explique exatamente quais controles de configuração são necessários para habilitar aprovações nativas de execução. O hook recebe `{ channel, channelLabel, accountId }`; canais com contas nomeadas devem renderizar caminhos com escopo por conta, como `channels.<channel>.accounts.<id>.execApprovals.*`, em vez de padrões no nível superior.
|
||||
- Se um canal puder inferir identidades estáveis de DM semelhantes a proprietário a partir da configuração existente, use `createResolvedApproverActionAuthAdapter` de `openclaw/plugin-sdk/approval-runtime` para restringir `/approve` no mesmo chat sem adicionar lógica específica de aprovação ao core.
|
||||
- Se um canal precisar de entrega de aprovação nativa, mantenha o código do canal focado em normalização de destino e fatos de transporte/apresentação. Use `createChannelExecApprovalProfile`, `createChannelNativeOriginTargetResolver`, `createChannelApproverDmTargetResolver` e `createApproverRestrictedNativeApprovalCapability` de `openclaw/plugin-sdk/approval-runtime`. Coloque os fatos específicos do canal atrás de `approvalCapability.nativeRuntime`, idealmente por meio de `createChannelApprovalNativeRuntimeAdapter(...)` ou `createLazyChannelApprovalNativeRuntimeAdapter(...)`, para que o core possa montar o handler e controlar filtragem de requisições, roteamento, deduplicação, expiração, assinatura do Gateway e avisos de redirecionamento. `nativeRuntime` é dividido em algumas interfaces menores:
|
||||
- `availability` — se a conta está configurada e se uma requisição deve ser tratada
|
||||
- `presentation` — mapeia o modelo de visualização de aprovação compartilhado para payloads nativos pendentes/resolvidos/expirados ou ações finais
|
||||
- `transport` — prepara destinos e envia/atualiza/remove mensagens nativas de aprovação
|
||||
- `interactions` — hooks opcionais de bind/unbind/clear-action para botões ou reações nativas
|
||||
- Use `approvalCapability.describeExecApprovalSetup` quando o canal quiser que a resposta do caminho desabilitado explique exatamente quais opções de configuração são necessárias para habilitar aprovações nativas de execução. O hook recebe `{ channel, channelLabel, accountId }`; canais com contas nomeadas devem renderizar caminhos com escopo de conta, como `channels.<channel>.accounts.<id>.execApprovals.*`, em vez de padrões de nível superior.
|
||||
- Se um canal puder inferir identidades estáveis semelhantes a proprietário em DM a partir da configuração existente, use `createResolvedApproverActionAuthAdapter` de `openclaw/plugin-sdk/approval-runtime` para restringir `/approve` no mesmo chat sem adicionar lógica específica de aprovação ao core.
|
||||
- Se um canal precisar de entrega nativa de aprovação, mantenha o código do canal focado em normalização de alvo mais fatos de transporte/apresentação. Use `createChannelExecApprovalProfile`, `createChannelNativeOriginTargetResolver`, `createChannelApproverDmTargetResolver` e `createApproverRestrictedNativeApprovalCapability` de `openclaw/plugin-sdk/approval-runtime`. Coloque os fatos específicos do canal atrás de `approvalCapability.nativeRuntime`, idealmente por meio de `createChannelApprovalNativeRuntimeAdapter(...)` ou `createLazyChannelApprovalNativeRuntimeAdapter(...)`, para que o core possa montar o handler e controlar filtragem de solicitações, roteamento, eliminação de duplicatas, expiração, assinatura do Gateway e avisos de roteamento para outro local. `nativeRuntime` é dividido em algumas superfícies menores:
|
||||
- `availability` — se a conta está configurada e se uma solicitação deve ser tratada
|
||||
- `presentation` — mapeia o modelo de visualização compartilhado de aprovação em payloads nativos pendentes/resolvidos/expirados ou ações finais
|
||||
- `transport` — prepara alvos e envia/atualiza/remove mensagens nativas de aprovação
|
||||
- `interactions` — hooks opcionais de bind/unbind/clear-action para botões nativos ou reações
|
||||
- `observe` — hooks opcionais de diagnóstico de entrega
|
||||
- Se o canal precisar de objetos pertencentes ao runtime, como cliente, token, app Bolt ou receptor de Webhook, registre-os por meio de `openclaw/plugin-sdk/channel-runtime-context`. O registro genérico de contexto de runtime permite que o core inicialize handlers orientados por capacidade a partir do estado de inicialização do canal sem adicionar cola específica de aprovação.
|
||||
- Recorra a `createChannelApprovalHandler` ou `createChannelNativeApprovalRuntime` de nível mais baixo apenas quando a interface orientada por capacidade ainda não for expressiva o suficiente.
|
||||
- Canais de aprovação nativa devem rotear tanto `accountId` quanto `approvalKind` por meio desses helpers. `accountId` mantém a política de aprovação multiconta limitada à conta de bot correta, e `approvalKind` mantém o comportamento de aprovação de execução vs Plugin disponível para o canal sem ramificações codificadas no core.
|
||||
- O core agora também é responsável pelos avisos de redirecionamento de aprovação. Plugins de canal não devem enviar suas próprias mensagens de acompanhamento do tipo "a aprovação foi para DMs / outro canal" a partir de `createChannelNativeApprovalRuntime`; em vez disso, exponha roteamento preciso de origem + DM do aprovador por meio dos helpers compartilhados de capacidade de aprovação e deixe o core agregar as entregas reais antes de publicar qualquer aviso de volta no chat iniciador.
|
||||
- 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 de execução vs Plugin com base no estado local do canal.
|
||||
- Se o canal precisar de objetos controlados pelo runtime, como um cliente, token, app Bolt ou receptor de Webhook, registre-os por meio de `openclaw/plugin-sdk/channel-runtime-context`. O registro genérico de contexto de runtime permite que o core inicialize handlers orientados por capacidade a partir do estado de inicialização do canal sem adicionar glue de wrapper específico para aprovação.
|
||||
- Recorra a `createChannelApprovalHandler` ou `createChannelNativeApprovalRuntime` de nível mais baixo apenas quando a superfície orientada por capacidade ainda não for expressiva o suficiente.
|
||||
- Canais com aprovação nativa devem rotear `accountId` e `approvalKind` por esses helpers. `accountId` mantém a política de aprovação multiconta restrita à conta de bot correta, e `approvalKind` mantém o comportamento de aprovação de execução vs Plugin disponível para o canal sem ramificações codificadas no core.
|
||||
- O core agora também é responsável por avisos de redirecionamento de aprovação. Plugins de canal não devem enviar suas próprias mensagens de acompanhamento do tipo "a aprovação foi para DMs / outro canal" a partir de `createChannelNativeApprovalRuntime`; em vez disso, exponha roteamento preciso de origem + DM do aprovador por meio dos helpers compartilhados de capacidade de aprovação e deixe o core agregar as entregas reais antes de publicar qualquer aviso de volta no chat iniciador.
|
||||
- Preserve a categoria do id de aprovação entregue de ponta a ponta. Clientes nativos não devem
|
||||
inferir nem reescrever o roteamento de aprovação de execução vs Plugin com base no estado local do canal.
|
||||
- Diferentes tipos de aprovação podem expor intencionalmente diferentes superfícies nativas.
|
||||
Exemplos empacotados atuais:
|
||||
- O Slack mantém o roteamento nativo de aprovação disponível tanto para IDs de execução quanto de Plugin.
|
||||
- O Matrix mantém o mesmo roteamento nativo de DM/canal e a mesma UX de reação para aprovações de execução
|
||||
e de Plugin, ao mesmo tempo que ainda permite que a autenticação varie por tipo de aprovação.
|
||||
- `createApproverRestrictedNativeApprovalAdapter` ainda existe como wrapper de compatibilidade, mas novos códigos devem preferir o builder de capacidade e expor `approvalCapability` no Plugin.
|
||||
Exemplos atuais empacotados:
|
||||
- O Slack mantém o roteamento nativo de aprovação disponível tanto para ids de execução quanto de Plugin.
|
||||
- O Matrix mantém o mesmo roteamento nativo por DM/canal e a mesma UX de reação para aprovações de execução
|
||||
e de Plugin, ao mesmo tempo em que ainda permite que a autorização difira por tipo de aprovação.
|
||||
- `createApproverRestrictedNativeApprovalAdapter` ainda existe como wrapper de compatibilidade, mas código novo deve preferir o builder de capacidade e expor `approvalCapability` no Plugin.
|
||||
|
||||
Para entrypoints quentes do canal, prefira os subcaminhos de runtime mais específicos quando você
|
||||
precisar de apenas uma parte dessa família:
|
||||
Para pontos de entrada críticos do canal, prefira os subcaminhos de runtime mais específicos quando você só
|
||||
precisar de uma parte dessa família:
|
||||
|
||||
- `openclaw/plugin-sdk/approval-auth-runtime`
|
||||
- `openclaw/plugin-sdk/approval-client-runtime`
|
||||
@ -136,29 +136,31 @@ Especificamente para setup:
|
||||
`createSetupInputPresenceValidator`), saída de nota de consulta,
|
||||
`promptResolvedAllowFrom`, `splitSetupEntries` e os builders
|
||||
delegados de proxy de setup
|
||||
- `openclaw/plugin-sdk/setup-adapter-runtime` é a interface estreita sensível a ambiente
|
||||
- `openclaw/plugin-sdk/setup-adapter-runtime` é a superfície estreita de adaptador com reconhecimento de env
|
||||
para `createEnvPatchedAccountSetupAdapter`
|
||||
- `openclaw/plugin-sdk/channel-setup` cobre os builders de setup de instalação opcional
|
||||
além de alguns primitivos seguros para setup:
|
||||
- `openclaw/plugin-sdk/channel-setup` cobre os builders de setup com instalação opcional
|
||||
além de algumas primitivas seguras para setup:
|
||||
`createOptionalChannelSetupSurface`, `createOptionalChannelSetupAdapter`,
|
||||
|
||||
Se o seu canal oferece suporte a setup ou autenticação orientados por variáveis de ambiente e fluxos genéricos de inicialização/configuração
|
||||
devem conhecer esses nomes de variáveis antes do carregamento em runtime, declare-os no
|
||||
manifesto do Plugin com `channelEnvVars`. Mantenha `envVars` do runtime do canal ou constantes locais apenas para cópia voltada ao operador.
|
||||
Se o seu canal oferecer suporte a setup ou auth orientados por env e os fluxos genéricos de inicialização/configuração
|
||||
precisarem conhecer esses nomes de env antes de o runtime ser carregado, declare-os no
|
||||
manifesto do Plugin com `channelEnvVars`. Mantenha `envVars` do runtime do canal ou constantes locais apenas
|
||||
para cópia voltada ao operador.
|
||||
`createOptionalChannelSetupWizard`, `DEFAULT_ACCOUNT_ID`,
|
||||
`createTopLevelChannelDmPolicy`, `setSetupChannelEnabled` e
|
||||
`splitSetupEntries`
|
||||
|
||||
- use a interface mais ampla `openclaw/plugin-sdk/setup` apenas quando também precisar dos
|
||||
- use a superfície mais ampla `openclaw/plugin-sdk/setup` apenas quando você também precisar dos
|
||||
helpers compartilhados mais pesados de setup/configuração, como
|
||||
`moveSingleAccountChannelSectionToDefaultAccount(...)`
|
||||
|
||||
Se o seu canal só quiser anunciar "instale este Plugin primeiro" em superfícies
|
||||
de setup, prefira `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 da documentação.
|
||||
adaptador/assistente gerado falha em modo fechado 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 cópia
|
||||
de link da documentação.
|
||||
|
||||
Para outros caminhos quentes do canal, prefira os helpers estreitos em vez de superfícies
|
||||
Para outros caminhos críticos do canal, prefira os helpers específicos em vez de superfícies
|
||||
legadas mais amplas:
|
||||
|
||||
- `openclaw/plugin-sdk/account-core`,
|
||||
@ -167,38 +169,38 @@ legadas mais amplas:
|
||||
`openclaw/plugin-sdk/account-helpers` para configuração multiconta e
|
||||
fallback de conta padrão
|
||||
- `openclaw/plugin-sdk/inbound-envelope` e
|
||||
`openclaw/plugin-sdk/inbound-reply-dispatch` para encadeamento de rota/envelope de entrada e
|
||||
record-and-dispatch
|
||||
- `openclaw/plugin-sdk/messaging-targets` para análise e correspondência de destino
|
||||
`openclaw/plugin-sdk/inbound-reply-dispatch` para rota/envelope de entrada e
|
||||
integração de registro e despacho
|
||||
- `openclaw/plugin-sdk/messaging-targets` para parsing/correspondência de alvos
|
||||
- `openclaw/plugin-sdk/outbound-media` e
|
||||
`openclaw/plugin-sdk/outbound-runtime` para carregamento de mídia e delegates de
|
||||
identidade/envio de saída
|
||||
- `openclaw/plugin-sdk/thread-bindings-runtime` para ciclo de vida de vínculo de thread
|
||||
e registro de adaptador
|
||||
- `openclaw/plugin-sdk/agent-media-payload` apenas quando um layout legado de campo
|
||||
de payload de agente/mídia ainda for necessário
|
||||
- `openclaw/plugin-sdk/telegram-command-config` para normalização de comandos personalizados do Telegram, validação de duplicidade/conflito e um contrato de configuração de comando estável para fallback
|
||||
`openclaw/plugin-sdk/outbound-runtime` para carregamento de mídia mais delegados
|
||||
de identidade/envio de saída
|
||||
- `openclaw/plugin-sdk/thread-bindings-runtime` para ciclo de vida de vinculação de thread
|
||||
e registro de adaptadores
|
||||
- `openclaw/plugin-sdk/agent-media-payload` apenas quando um layout de campo legado de payload de agente/mídia
|
||||
ainda for necessário
|
||||
- `openclaw/plugin-sdk/telegram-command-config` para normalização de comandos personalizados do Telegram, validação de duplicatas/conflitos e um contrato de configuração de comando estável em fallback
|
||||
|
||||
Canais somente com autenticação geralmente podem parar no caminho padrão: o core lida com aprovações e o Plugin apenas expõe capacidades de saída/autenticação. Canais de aprovação nativa, como Matrix, Slack, Telegram e transportes de chat personalizados, devem usar os helpers nativos compartilhados em vez de implementar seu próprio ciclo de vida de aprovação.
|
||||
Canais somente com auth normalmente podem ficar no caminho padrão: o core trata as aprovações e o Plugin apenas expõe capacidades de saída/auth. Canais com aprovação nativa, como Matrix, Slack, Telegram e transportes de chat personalizados, devem usar os helpers nativos compartilhados em vez de implementar seu próprio ciclo de vida de aprovação.
|
||||
|
||||
## Política de menção de entrada
|
||||
|
||||
Mantenha o tratamento de menções de entrada dividido em duas camadas:
|
||||
|
||||
- coleta de evidências pertencente ao Plugin
|
||||
- coleta de evidências controlada pelo Plugin
|
||||
- avaliação de política compartilhada
|
||||
|
||||
Use `openclaw/plugin-sdk/channel-inbound` para a camada compartilhada.
|
||||
|
||||
Bom ajuste para lógica local do Plugin:
|
||||
Bom encaixe para lógica local do Plugin:
|
||||
|
||||
- detecção de resposta ao bot
|
||||
- detecção de citação do bot
|
||||
- verificações de participação na thread
|
||||
- verificações de participação em thread
|
||||
- exclusões de mensagens de serviço/sistema
|
||||
- caches nativos da plataforma necessários para comprovar a participação do bot
|
||||
|
||||
Bom ajuste para o helper compartilhado:
|
||||
Bom encaixe para o helper compartilhado:
|
||||
|
||||
- `requireMention`
|
||||
- resultado explícito de menção
|
||||
@ -259,8 +261,8 @@ Plugins de canal empacotados que já dependem de injeção em runtime:
|
||||
- `resolveInboundMentionDecision`
|
||||
|
||||
Os helpers mais antigos `resolveMentionGating*` permanecem em
|
||||
`openclaw/plugin-sdk/channel-inbound` apenas como exportações de compatibilidade. Novos códigos
|
||||
devem usar `resolveInboundMentionDecision({ facts, policy })`.
|
||||
`openclaw/plugin-sdk/channel-inbound` apenas como exports de compatibilidade. Código novo
|
||||
deve usar `resolveInboundMentionDecision({ facts, policy })`.
|
||||
|
||||
## Passo a passo
|
||||
|
||||
@ -269,7 +271,7 @@ devem usar `resolveInboundMentionDecision({ facts, policy })`.
|
||||
<Step title="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,
|
||||
consulte [Configuração e Setup de Plugin](/pt-BR/plugins/sdk-setup#openclaw-channel):
|
||||
veja [Setup e Configuração do Plugin](/pt-BR/plugins/sdk-setup#openclaw-channel):
|
||||
|
||||
<CodeGroup>
|
||||
```json package.json
|
||||
@ -283,7 +285,7 @@ devem usar `resolveInboundMentionDecision({ facts, policy })`.
|
||||
"channel": {
|
||||
"id": "acme-chat",
|
||||
"label": "Acme Chat",
|
||||
"blurb": "Connect OpenClaw to Acme Chat."
|
||||
"blurb": "Conecte o OpenClaw ao Acme Chat."
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -295,7 +297,7 @@ devem usar `resolveInboundMentionDecision({ facts, policy })`.
|
||||
"kind": "channel",
|
||||
"channels": ["acme-chat"],
|
||||
"name": "Acme Chat",
|
||||
"description": "Acme Chat channel plugin",
|
||||
"description": "Plugin de canal do Acme Chat",
|
||||
"configSchema": {
|
||||
"type": "object",
|
||||
"additionalProperties": false,
|
||||
@ -319,7 +321,7 @@ devem usar `resolveInboundMentionDecision({ facts, policy })`.
|
||||
</Step>
|
||||
|
||||
<Step title="Crie o objeto do Plugin de canal">
|
||||
A interface `ChannelPlugin` tem muitas superfícies opcionais de adaptador. Comece com
|
||||
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`:
|
||||
@ -416,17 +418,17 @@ devem usar `resolveInboundMentionDecision({ facts, policy })`.
|
||||
```
|
||||
|
||||
<Accordion title="O que `createChatChannelPlugin` faz por você">
|
||||
Em vez de implementar interfaces de adaptador de baixo nível manualmente, você passa
|
||||
Em vez de implementar manualmente interfaces de adaptador de baixo nível, você passa
|
||||
opções declarativas e o builder as compõe:
|
||||
|
||||
| Opção | O que ela conecta |
|
||||
| --- | --- |
|
||||
| `security.dm` | Resolver de segurança de DM com escopo a partir de campos de configuração |
|
||||
| `pairing.text` | Fluxo de pareamento de DM baseado em texto com troca de código |
|
||||
| `threading` | Resolver de modo reply-to (fixo, com escopo por conta ou personalizado) |
|
||||
| `outbound.attachedResults` | Funções de envio que retornam metadados de resultado (IDs de mensagem) |
|
||||
| `security.dm` | Resolvedor de segurança de DM com escopo a partir dos campos de configuração |
|
||||
| `pairing.text` | Fluxo de emparelhamento por DM baseado em texto com troca de código |
|
||||
| `threading` | Resolvedor de modo reply-to (fixo, com escopo de conta ou personalizado) |
|
||||
| `outbound.attachedResults` | Funções de envio que retornam metadados do resultado (ids de mensagem) |
|
||||
|
||||
Você também pode passar objetos brutos de adaptador em vez de opções declarativas
|
||||
Você também pode passar objetos de adaptador brutos em vez das opções declarativas
|
||||
se precisar de controle total.
|
||||
</Accordion>
|
||||
|
||||
@ -468,15 +470,15 @@ devem usar `resolveInboundMentionDecision({ facts, policy })`.
|
||||
});
|
||||
```
|
||||
|
||||
Coloque descritores de CLI pertencentes ao canal em `registerCliMetadata(...)` para que o OpenClaw
|
||||
Coloque descritores de CLI controlados pelo canal em `registerCliMetadata(...)` para que o OpenClaw
|
||||
possa mostrá-los na ajuda raiz sem ativar o runtime completo do canal,
|
||||
enquanto carregamentos completos normais ainda capturam os mesmos descritores para o registro
|
||||
real dos comandos. Mantenha `registerFull(...)` para trabalho exclusivo de runtime.
|
||||
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 de modo de registro. Consulte
|
||||
`defineChannelPluginEntry` trata automaticamente a divisão de modo de registro. Veja
|
||||
[Pontos de entrada](/pt-BR/plugins/sdk-entrypoints#definechannelpluginentry) para todas as
|
||||
opções.
|
||||
|
||||
@ -494,13 +496,18 @@ devem usar `resolveInboundMentionDecision({ facts, policy })`.
|
||||
|
||||
O OpenClaw carrega isso em vez da entrada completa quando o canal está desabilitado
|
||||
ou não configurado. Isso evita puxar código pesado de runtime durante fluxos de setup.
|
||||
Consulte [Setup e Configuração](/pt-BR/plugins/sdk-setup#setup-entry) para detalhes.
|
||||
Veja [Setup e Configuração](/pt-BR/plugins/sdk-setup#setup-entry) para detalhes.
|
||||
|
||||
Canais empacotados do workspace que dividem exports seguras para setup em módulos
|
||||
auxiliares podem usar `defineBundledChannelSetupEntry(...)` de
|
||||
`openclaw/plugin-sdk/channel-entry-contract` quando também precisarem de um
|
||||
setter explícito de runtime em tempo de setup.
|
||||
|
||||
</Step>
|
||||
|
||||
<Step title="Trate mensagens de entrada">
|
||||
Seu Plugin precisa receber mensagens da plataforma e encaminhá-las ao
|
||||
OpenClaw. O padrão típico é um Webhook que verifica a requisição e
|
||||
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:
|
||||
|
||||
```typescript
|
||||
@ -534,7 +541,7 @@ devem usar `resolveInboundMentionDecision({ facts, policy })`.
|
||||
|
||||
<a id="step-6-test"></a>
|
||||
<Step title="Teste">
|
||||
Escreva testes colocados ao lado do código em `src/channel.test.ts`:
|
||||
Escreva testes colocados lado a lado em `src/channel.test.ts`:
|
||||
|
||||
```typescript src/channel.test.ts
|
||||
import { describe, it, expect } from "vitest";
|
||||
@ -572,7 +579,7 @@ Escreva testes colocados ao lado do código em `src/channel.test.ts`:
|
||||
pnpm test -- <bundled-plugin-root>/acme-chat/
|
||||
```
|
||||
|
||||
Para helpers de teste compartilhados, consulte [Testes](/pt-BR/plugins/sdk-testing).
|
||||
Para helpers de teste compartilhados, veja [Testes](/pt-BR/plugins/sdk-testing).
|
||||
|
||||
</Step>
|
||||
</Steps>
|
||||
@ -581,12 +588,12 @@ Escreva testes colocados ao lado do código em `src/channel.test.ts`:
|
||||
|
||||
```
|
||||
<bundled-plugin-root>/acme-chat/
|
||||
├── package.json # metadados de openclaw.channel
|
||||
├── package.json # metadados openclaw.channel
|
||||
├── openclaw.plugin.json # Manifesto com schema de configuração
|
||||
├── index.ts # defineChannelPluginEntry
|
||||
├── setup-entry.ts # defineSetupPluginEntry
|
||||
├── api.ts # Exportações públicas (opcional)
|
||||
├── runtime-api.ts # Exportações internas de runtime (opcional)
|
||||
├── api.ts # Exports públicos (opcional)
|
||||
├── runtime-api.ts # Exports internos de runtime (opcional)
|
||||
└── src/
|
||||
├── channel.ts # ChannelPlugin via createChatChannelPlugin
|
||||
├── channel.test.ts # Testes
|
||||
@ -598,12 +605,12 @@ Escreva testes colocados ao lado do código em `src/channel.test.ts`:
|
||||
|
||||
<CardGroup cols={2}>
|
||||
<Card title="Opções de encadeamento" icon="git-branch" href="/pt-BR/plugins/sdk-entrypoints#registration-mode">
|
||||
Modos de resposta fixos, com escopo por conta ou personalizados
|
||||
Modos de resposta fixos, com escopo de conta ou personalizados
|
||||
</Card>
|
||||
<Card title="Integração com a ferramenta de mensagem" icon="puzzle" href="/pt-BR/plugins/architecture#channel-plugins-and-the-shared-message-tool">
|
||||
describeMessageTool e descoberta de ações
|
||||
</Card>
|
||||
<Card title="Resolução de destino" icon="crosshair" href="/pt-BR/plugins/architecture#channel-target-resolution">
|
||||
<Card title="Resolução de alvo" icon="crosshair" href="/pt-BR/plugins/architecture#channel-target-resolution">
|
||||
inferTargetChatType, looksLikeId, resolveTarget
|
||||
</Card>
|
||||
<Card title="Helpers de runtime" icon="settings" href="/pt-BR/plugins/sdk-runtime">
|
||||
@ -612,15 +619,15 @@ Escreva testes colocados ao lado do código em `src/channel.test.ts`:
|
||||
</CardGroup>
|
||||
|
||||
<Note>
|
||||
Algumas interfaces auxiliares empacotadas ainda existem para manutenção e
|
||||
compatibilidade de Plugins empacotados. Elas não são o padrão recomendado para novos Plugins de canal;
|
||||
prefira os subcaminhos genéricos de canal/setup/resposta/runtime da superfície
|
||||
comum do SDK, a menos que você esteja mantendo diretamente essa família de Plugins empacotados.
|
||||
Algumas superfícies auxiliares de Plugins empacotados ainda existem para manutenção de Plugins empacotados e
|
||||
compatibilidade. Elas não são o padrão recomendado para novos Plugins de canal;
|
||||
prefira os subcaminhos genéricos de canal/setup/resposta/runtime da superfície comum do SDK,
|
||||
a menos que você esteja mantendo diretamente essa família de Plugins empacotados.
|
||||
</Note>
|
||||
|
||||
## Próximos passos
|
||||
|
||||
- [Plugins de provedor](/pt-BR/plugins/sdk-provider-plugins) — se o seu Plugin também fornece modelos
|
||||
- [Visão geral do SDK](/pt-BR/plugins/sdk-overview) — referência completa de importação de subcaminhos
|
||||
- [Visão geral do SDK](/pt-BR/plugins/sdk-overview) — referência completa de imports por subcaminho
|
||||
- [Testes do SDK](/pt-BR/plugins/sdk-testing) — utilitários de teste e testes de contrato
|
||||
- [Manifesto de Plugin](/pt-BR/plugins/manifest) — schema completo do manifesto
|
||||
- [Manifesto do Plugin](/pt-BR/plugins/manifest) — schema completo do manifesto
|
||||
|
||||
@ -1,36 +1,36 @@
|
||||
---
|
||||
read_when:
|
||||
- Você precisa da assinatura de tipo exata de definePluginEntry ou defineChannelPluginEntry
|
||||
- Você quer entender o modo de registro (completo vs setup vs metadados de CLI)
|
||||
- Você está consultando as opções de ponto de entrada
|
||||
- Você precisa da assinatura de tipo exata de `definePluginEntry` ou `defineChannelPluginEntry`
|
||||
- Você quer entender o modo de registro (completo vs configuração vs metadados da CLI)
|
||||
- Você está procurando opções de ponto de entrada
|
||||
sidebarTitle: Entry Points
|
||||
summary: Referência para definePluginEntry, defineChannelPluginEntry e defineSetupPluginEntry
|
||||
title: Pontos de entrada de plugin
|
||||
summary: Referência para `definePluginEntry`, `defineChannelPluginEntry` e `defineSetupPluginEntry`
|
||||
title: Pontos de entrada do Plugin
|
||||
x-i18n:
|
||||
generated_at: "2026-04-05T12:49:09Z"
|
||||
generated_at: "2026-04-15T19:41:37Z"
|
||||
model: gpt-5.4
|
||||
provider: openai
|
||||
source_hash: 799dbfe71e681dd8ba929a7a631dfe745c3c5c69530126fea2f9c137b120f51f
|
||||
source_hash: aabca25bc9b8ff1b5bb4852bafe83640ffeba006ea6b6a8eff4e2c37a10f1fe4
|
||||
source_path: plugins/sdk-entrypoints.md
|
||||
workflow: 15
|
||||
---
|
||||
|
||||
# Pontos de entrada de plugin
|
||||
# Pontos de entrada do Plugin
|
||||
|
||||
Todo plugin exporta um objeto de entrada padrão. O SDK fornece três helpers para
|
||||
Todo Plugin exporta um objeto de entrada padrão. O SDK fornece três helpers para
|
||||
criá-los.
|
||||
|
||||
<Tip>
|
||||
**Procurando um passo a passo?** Consulte [Plugins de canal](/plugins/sdk-channel-plugins)
|
||||
ou [Plugins de provedor](/plugins/sdk-provider-plugins) para guias passo a passo.
|
||||
**Procurando um passo a passo?** Veja [Plugins de canal](/pt-BR/plugins/sdk-channel-plugins)
|
||||
ou [Plugins de provedor](/pt-BR/plugins/sdk-provider-plugins) para guias passo a passo.
|
||||
</Tip>
|
||||
|
||||
## `definePluginEntry`
|
||||
|
||||
**Importação:** `openclaw/plugin-sdk/plugin-entry`
|
||||
|
||||
Para plugins de provedor, plugins de ferramenta, plugins de hook e tudo o que **não**
|
||||
for um canal de mensagens.
|
||||
Para plugins de provedor, plugins de ferramenta, plugins de hook e qualquer coisa que **não**
|
||||
seja um canal de mensagens.
|
||||
|
||||
```typescript
|
||||
import { definePluginEntry } from "openclaw/plugin-sdk/plugin-entry";
|
||||
@ -56,22 +56,22 @@ export default definePluginEntry({
|
||||
| `name` | `string` | Sim | — |
|
||||
| `description` | `string` | Sim | — |
|
||||
| `kind` | `string` | Não | — |
|
||||
| `configSchema` | `OpenClawPluginConfigSchema \| () => OpenClawPluginConfigSchema` | Não | Schema de objeto vazio |
|
||||
| `configSchema` | `OpenClawPluginConfigSchema \| () => OpenClawPluginConfigSchema` | Não | Esquema de objeto vazio |
|
||||
| `register` | `(api: OpenClawPluginApi) => void` | Sim | — |
|
||||
|
||||
- `id` deve corresponder ao seu manifesto `openclaw.plugin.json`.
|
||||
- `kind` é para slots exclusivos: `"memory"` ou `"context-engine"`.
|
||||
- `configSchema` pode ser uma função para avaliação preguiçosa.
|
||||
- O OpenClaw resolve e memoiza esse schema no primeiro acesso, portanto builders de schema
|
||||
caros são executados apenas uma vez.
|
||||
- O OpenClaw resolve e memoriza esse esquema no primeiro acesso, então builders de esquema
|
||||
custosos são executados apenas uma vez.
|
||||
|
||||
## `defineChannelPluginEntry`
|
||||
|
||||
**Importação:** `openclaw/plugin-sdk/channel-core`
|
||||
|
||||
Encapsula `definePluginEntry` com a infraestrutura específica de canal. Chama automaticamente
|
||||
`api.registerChannel({ plugin })`, expõe uma seam opcional de metadados de CLI para ajuda na raiz
|
||||
e controla `registerFull` de acordo com o modo de registro.
|
||||
Encapsula `definePluginEntry` com a integração específica de canal. Chama
|
||||
automaticamente `api.registerChannel({ plugin })`, expõe uma costura opcional de metadados
|
||||
da CLI de ajuda raiz e controla `registerFull` com base no modo de registro.
|
||||
|
||||
```typescript
|
||||
import { defineChannelPluginEntry } from "openclaw/plugin-sdk/channel-core";
|
||||
@ -97,29 +97,29 @@ export default defineChannelPluginEntry({
|
||||
| `name` | `string` | Sim | — |
|
||||
| `description` | `string` | Sim | — |
|
||||
| `plugin` | `ChannelPlugin` | Sim | — |
|
||||
| `configSchema` | `OpenClawPluginConfigSchema \| () => OpenClawPluginConfigSchema` | Não | Schema de objeto vazio |
|
||||
| `configSchema` | `OpenClawPluginConfigSchema \| () => OpenClawPluginConfigSchema` | Não | Esquema de objeto vazio |
|
||||
| `setRuntime` | `(runtime: PluginRuntime) => void` | Não | — |
|
||||
| `registerCliMetadata` | `(api: OpenClawPluginApi) => void` | Não | — |
|
||||
| `registerFull` | `(api: OpenClawPluginApi) => void` | Não | — |
|
||||
|
||||
- `setRuntime` é chamado durante o registro para que você possa armazenar a referência de runtime
|
||||
(normalmente por meio de `createPluginRuntimeStore`). Ele é ignorado durante a captura
|
||||
de metadados de CLI.
|
||||
(normalmente via `createPluginRuntimeStore`). Ele é ignorado durante a captura
|
||||
de metadados da CLI.
|
||||
- `registerCliMetadata` é executado tanto durante `api.registrationMode === "cli-metadata"`
|
||||
quanto durante `api.registrationMode === "full"`.
|
||||
Use-o como o local canônico para descritores de CLI pertencentes ao canal, para que a ajuda
|
||||
na raiz permaneça sem ativação, enquanto o registro normal de comandos da CLI continua compatível
|
||||
com carregamentos completos de plugin.
|
||||
- `registerFull` é executado apenas quando `api.registrationMode === "full"`. Ele é ignorado
|
||||
durante o carregamento somente de setup.
|
||||
- Assim como `definePluginEntry`, `configSchema` pode ser uma factory preguiçosa e o OpenClaw
|
||||
memoiza o schema resolvido no primeiro acesso.
|
||||
- Para comandos de CLI na raiz pertencentes ao plugin, prefira `api.registerCli(..., { descriptors: [...] })`
|
||||
quando quiser que o comando permaneça com lazy-loading sem desaparecer da árvore de parsing
|
||||
da CLI na raiz. Para plugins de canal, prefira registrar esses descritores
|
||||
em `registerCliMetadata(...)` e manter `registerFull(...)` focado em trabalho somente de runtime.
|
||||
- Se `registerFull(...)` também registrar métodos RPC de gateway, mantenha-os em um
|
||||
prefixo específico do plugin. Namespaces administrativos principais reservados (`config.*`,
|
||||
Use-o como o lugar canônico para descritores de CLI pertencentes ao canal, para que a ajuda
|
||||
raiz não ative o carregamento enquanto o registro normal de comandos da CLI continua compatível
|
||||
com carregamentos completos do Plugin.
|
||||
- `registerFull` só é executado quando `api.registrationMode === "full"`. Ele é ignorado
|
||||
durante o carregamento somente de configuração.
|
||||
- Assim como `definePluginEntry`, `configSchema` pode ser uma fábrica preguiçosa e o OpenClaw
|
||||
memoriza o esquema resolvido no primeiro acesso.
|
||||
- Para comandos raiz da CLI pertencentes ao Plugin, prefira `api.registerCli(..., { descriptors: [...] })`
|
||||
quando você quiser que o comando permaneça com carregamento preguiçoso sem desaparecer da
|
||||
árvore de parsing da CLI raiz. Para plugins de canal, prefira registrar esses descritores
|
||||
em `registerCliMetadata(...)` e mantenha `registerFull(...)` focado em trabalho somente de runtime.
|
||||
- Se `registerFull(...)` também registrar métodos RPC do Gateway, mantenha-os em um
|
||||
prefixo específico do Plugin. Namespaces administrativos centrais reservados (`config.*`,
|
||||
`exec.approvals.*`, `wizard.*`, `update.*`) são sempre forçados para
|
||||
`operator.admin`.
|
||||
|
||||
@ -128,7 +128,7 @@ export default defineChannelPluginEntry({
|
||||
**Importação:** `openclaw/plugin-sdk/channel-core`
|
||||
|
||||
Para o arquivo leve `setup-entry.ts`. Retorna apenas `{ plugin }`, sem
|
||||
infraestrutura de runtime ou de CLI.
|
||||
integração de runtime nem de CLI.
|
||||
|
||||
```typescript
|
||||
import { defineSetupPluginEntry } from "openclaw/plugin-sdk/channel-core";
|
||||
@ -136,33 +136,58 @@ import { defineSetupPluginEntry } from "openclaw/plugin-sdk/channel-core";
|
||||
export default defineSetupPluginEntry(myChannelPlugin);
|
||||
```
|
||||
|
||||
O OpenClaw carrega isso em vez da entrada completa quando um canal está desativado,
|
||||
não configurado ou quando o carregamento adiado está ativado. Consulte
|
||||
[Setup e config](/plugins/sdk-setup#setup-entry) para saber quando isso importa.
|
||||
O OpenClaw carrega isso em vez da entrada completa quando um canal está desabilitado,
|
||||
não configurado ou quando o carregamento adiado está ativado. Veja
|
||||
[Configuração e setup](/pt-BR/plugins/sdk-setup#setup-entry) para saber quando isso importa.
|
||||
|
||||
Na prática, combine `defineSetupPluginEntry(...)` com as famílias restritas de helpers de setup:
|
||||
Na prática, combine `defineSetupPluginEntry(...)` com as famílias estreitas de helpers de setup:
|
||||
|
||||
- `openclaw/plugin-sdk/setup-runtime` para helpers de setup seguros para runtime, como
|
||||
adaptadores de patch de setup seguros para importação, saída de nota de consulta,
|
||||
`promptResolvedAllowFrom`, `splitSetupEntries` e proxies de setup delegados
|
||||
- `openclaw/plugin-sdk/channel-setup` para superfícies de setup de instalação opcional
|
||||
- `openclaw/plugin-sdk/setup-tools` para helpers de CLI/arquivo/docs de setup/instalação
|
||||
- `openclaw/plugin-sdk/setup-tools` para helpers de setup/instalação de CLI/arquivo/docs
|
||||
|
||||
Mantenha SDKs pesados, registro de CLI e serviços de runtime de longa duração na
|
||||
entrada completa.
|
||||
|
||||
Canais empacotados do workspace que dividem superfícies de setup e runtime podem usar
|
||||
`defineBundledChannelSetupEntry(...)` de
|
||||
`openclaw/plugin-sdk/channel-entry-contract` em vez disso. Esse contrato permite que a
|
||||
entrada de setup mantenha exportações de plugin/secrets seguras para setup enquanto ainda expõe
|
||||
um setter de runtime:
|
||||
|
||||
```typescript
|
||||
import { defineBundledChannelSetupEntry } from "openclaw/plugin-sdk/channel-entry-contract";
|
||||
|
||||
export default defineBundledChannelSetupEntry({
|
||||
importMetaUrl: import.meta.url,
|
||||
plugin: {
|
||||
specifier: "./channel-plugin-api.js",
|
||||
exportName: "myChannelPlugin",
|
||||
},
|
||||
runtime: {
|
||||
specifier: "./runtime-api.js",
|
||||
exportName: "setMyChannelRuntime",
|
||||
},
|
||||
});
|
||||
```
|
||||
|
||||
Use esse contrato empacotado apenas quando os fluxos de setup realmente precisarem de um setter
|
||||
de runtime leve antes que a entrada completa do canal seja carregada.
|
||||
|
||||
## Modo de registro
|
||||
|
||||
`api.registrationMode` informa ao seu plugin como ele foi carregado:
|
||||
`api.registrationMode` informa ao seu Plugin como ele foi carregado:
|
||||
|
||||
| Modo | Quando | O que registrar |
|
||||
| ----------------- | -------------------------------- | ---------------------------------------------------------------------------------------- |
|
||||
| `"full"` | Inicialização normal do gateway | Tudo |
|
||||
| `"setup-only"` | Canal desativado/não configurado | Apenas registro de canal |
|
||||
| `"setup-runtime"` | Fluxo de setup com runtime disponível | Registro de canal mais apenas o runtime leve necessário antes de a entrada completa carregar |
|
||||
| `"cli-metadata"` | Ajuda na raiz / captura de metadados de CLI | Apenas descritores de CLI |
|
||||
| Modo | Quando | O que registrar |
|
||||
| ----------------- | --------------------------------- | --------------------------------------------------------------------------------------- |
|
||||
| `"full"` | Inicialização normal do Gateway | Tudo |
|
||||
| `"setup-only"` | Canal desabilitado/não configurado | Apenas registro de canal |
|
||||
| `"setup-runtime"` | Fluxo de setup com runtime disponível | Registro de canal mais apenas o runtime leve necessário antes do carregamento da entrada completa |
|
||||
| `"cli-metadata"` | Ajuda raiz / captura de metadados da CLI | Apenas descritores de CLI |
|
||||
|
||||
`defineChannelPluginEntry` lida automaticamente com essa divisão. Se você usar
|
||||
`defineChannelPluginEntry` lida com essa divisão automaticamente. Se você usar
|
||||
`definePluginEntry` diretamente para um canal, verifique o modo por conta própria:
|
||||
|
||||
```typescript
|
||||
@ -181,36 +206,36 @@ register(api) {
|
||||
```
|
||||
|
||||
Trate `"setup-runtime"` como a janela em que superfícies de inicialização somente de setup devem
|
||||
existir sem reentrar no runtime completo do canal empacotado. Bons encaixes são
|
||||
registro de canal, rotas HTTP seguras para setup, métodos de gateway seguros para setup e
|
||||
existir sem reentrar no runtime completo do canal empacotado. Bons usos incluem
|
||||
registro de canal, rotas HTTP seguras para setup, métodos do Gateway seguros para setup e
|
||||
helpers de setup delegados. Serviços pesados em segundo plano, registradores de CLI e
|
||||
bootstraps de SDK de provedor/cliente ainda pertencem a `"full"`.
|
||||
bootstraps de SDKs de provedor/cliente ainda pertencem a `"full"`.
|
||||
|
||||
Especificamente para registradores de CLI:
|
||||
|
||||
- use `descriptors` quando o registrador possuir um ou mais comandos na raiz e você
|
||||
quiser que o OpenClaw faça lazy-load do módulo real da CLI na primeira invocação
|
||||
- garanta que esses descritores cubram todos os comandos de nível superior expostos pelo
|
||||
- use `descriptors` quando o registrador possuir um ou mais comandos raiz e você
|
||||
quiser que o OpenClaw carregue o módulo real da CLI de forma preguiçosa na primeira invocação
|
||||
- certifique-se de que esses descritores cubram todos os comandos raiz de nível superior expostos pelo
|
||||
registrador
|
||||
- use apenas `commands` para caminhos de compatibilidade eager
|
||||
- use apenas `commands` somente para caminhos de compatibilidade ansiosos
|
||||
|
||||
## Formatos de plugin
|
||||
## Formatos de Plugin
|
||||
|
||||
O OpenClaw classifica plugins carregados de acordo com seu comportamento de registro:
|
||||
O OpenClaw classifica Plugins carregados pelo comportamento de registro deles:
|
||||
|
||||
| Formato | Descrição |
|
||||
| --------------------- | ------------------------------------------------- |
|
||||
| **plain-capability** | Um tipo de capacidade (por exemplo, apenas provedor) |
|
||||
| Formato | Descrição |
|
||||
| -------------------- | ------------------------------------------------- |
|
||||
| **plain-capability** | Um tipo de capacidade (por exemplo, somente provedor) |
|
||||
| **hybrid-capability** | Vários tipos de capacidade (por exemplo, provedor + fala) |
|
||||
| **hook-only** | Apenas hooks, sem capacidades |
|
||||
| **hook-only** | Apenas hooks, sem capacidades |
|
||||
| **non-capability** | Ferramentas/comandos/serviços, mas sem capacidades |
|
||||
|
||||
Use `openclaw plugins inspect <id>` para ver o formato de um plugin.
|
||||
Use `openclaw plugins inspect <id>` para ver o formato de um Plugin.
|
||||
|
||||
## Relacionado
|
||||
|
||||
- [Visão geral do SDK](/plugins/sdk-overview) — API de registro e referência de subcaminhos
|
||||
- [Helpers de runtime](/plugins/sdk-runtime) — `api.runtime` e `createPluginRuntimeStore`
|
||||
- [Setup e config](/plugins/sdk-setup) — manifesto, entrada de setup, carregamento adiado
|
||||
- [Plugins de canal](/plugins/sdk-channel-plugins) — como criar o objeto `ChannelPlugin`
|
||||
- [Plugins de provedor](/plugins/sdk-provider-plugins) — registro de provedor e hooks
|
||||
- [Visão geral do SDK](/pt-BR/plugins/sdk-overview) — API de registro e referência de subpaths
|
||||
- [Helpers de runtime](/pt-BR/plugins/sdk-runtime) — `api.runtime` e `createPluginRuntimeStore`
|
||||
- [Setup e configuração](/pt-BR/plugins/sdk-setup) — manifesto, entrada de setup, carregamento adiado
|
||||
- [Plugins de canal](/pt-BR/plugins/sdk-channel-plugins) — criando o objeto `ChannelPlugin`
|
||||
- [Plugins de provedor](/pt-BR/plugins/sdk-provider-plugins) — registro de provedor e hooks
|
||||
|
||||
@ -1,28 +1,28 @@
|
||||
---
|
||||
read_when:
|
||||
- Você precisa chamar auxiliares do núcleo a partir de um plugin (TTS, STT, geração de imagem, busca na web, subagent)
|
||||
- Você precisa chamar auxiliares do núcleo a partir de um plugin (TTS, STT, geração de imagem, busca na web, subagente)
|
||||
- Você quer entender o que `api.runtime` expõe
|
||||
- Você está acessando auxiliares de configuração, agente ou mídia a partir do código do plugin
|
||||
- Você está acessando auxiliares de config, agente ou mídia a partir do código do plugin
|
||||
sidebarTitle: Runtime Helpers
|
||||
summary: api.runtime -- os auxiliares de runtime injetados disponíveis para plugins
|
||||
title: Auxiliares de runtime de plugin
|
||||
summary: api.runtime -- os auxiliares de tempo de execução injetados disponíveis para plugins
|
||||
title: Auxiliares de tempo de execução do Plugin
|
||||
x-i18n:
|
||||
generated_at: "2026-04-11T02:46:37Z"
|
||||
generated_at: "2026-04-15T19:41:36Z"
|
||||
model: gpt-5.4
|
||||
provider: openai
|
||||
source_hash: fbf8a6ecd970300f784b8aca20eed40ba12c83107abd27385bfdc3347d2544be
|
||||
source_hash: c77a6e9cd48c84affa17dce684bbd0e072c8b63485e4a5d569f3793a4ea4f9c8
|
||||
source_path: plugins/sdk-runtime.md
|
||||
workflow: 15
|
||||
---
|
||||
|
||||
# Auxiliares de runtime de plugin
|
||||
# Auxiliares de tempo de execução do Plugin
|
||||
|
||||
Referência para o objeto `api.runtime` injetado em todo plugin durante o
|
||||
registro. Use estes auxiliares em vez de importar diretamente internos do host.
|
||||
registro. Use esses auxiliares em vez de importar diretamente internos do host.
|
||||
|
||||
<Tip>
|
||||
**Está procurando um guia passo a passo?** Consulte [Channel Plugins](/pt-BR/plugins/sdk-channel-plugins)
|
||||
ou [Provider Plugins](/pt-BR/plugins/sdk-provider-plugins) para guias passo a passo
|
||||
**Está procurando um passo a passo?** Consulte [Plugins de canal](/pt-BR/plugins/sdk-channel-plugins)
|
||||
ou [Plugins de provedor](/pt-BR/plugins/sdk-provider-plugins) para guias passo a passo
|
||||
que mostram esses auxiliares em contexto.
|
||||
</Tip>
|
||||
|
||||
@ -32,50 +32,51 @@ register(api) {
|
||||
}
|
||||
```
|
||||
|
||||
## Namespaces de runtime
|
||||
## Namespaces de tempo de execução
|
||||
|
||||
### `api.runtime.agent`
|
||||
|
||||
Identidade do agente, diretórios e gerenciamento de sessão.
|
||||
|
||||
```typescript
|
||||
// Resolver o diretório de trabalho do agente
|
||||
// Resolve the agent's working directory
|
||||
const agentDir = api.runtime.agent.resolveAgentDir(cfg);
|
||||
|
||||
// Resolver o workspace do agente
|
||||
// Resolve agent workspace
|
||||
const workspaceDir = api.runtime.agent.resolveAgentWorkspaceDir(cfg);
|
||||
|
||||
// Obter a identidade do agente
|
||||
// Get agent identity
|
||||
const identity = api.runtime.agent.resolveAgentIdentity(cfg);
|
||||
|
||||
// Obter o nível de thinking padrão
|
||||
// Get default thinking level
|
||||
const thinking = api.runtime.agent.resolveThinkingDefault(cfg, provider, model);
|
||||
|
||||
// Obter o tempo limite do agente
|
||||
// Get agent timeout
|
||||
const timeoutMs = api.runtime.agent.resolveAgentTimeoutMs(cfg);
|
||||
|
||||
// Garantir que o workspace exista
|
||||
// Ensure workspace exists
|
||||
await api.runtime.agent.ensureAgentWorkspace(cfg);
|
||||
|
||||
// Executar um turno de agente embutido
|
||||
// Run an embedded agent turn
|
||||
const agentDir = api.runtime.agent.resolveAgentDir(cfg);
|
||||
const result = await api.runtime.agent.runEmbeddedAgent({
|
||||
sessionId: "my-plugin:task-1",
|
||||
runId: crypto.randomUUID(),
|
||||
sessionFile: path.join(agentDir, "sessions", "my-plugin-task-1.jsonl"),
|
||||
workspaceDir: api.runtime.agent.resolveAgentWorkspaceDir(cfg),
|
||||
prompt: "Resuma as alterações mais recentes",
|
||||
prompt: "Summarize the latest changes",
|
||||
timeoutMs: api.runtime.agent.resolveAgentTimeoutMs(cfg),
|
||||
});
|
||||
```
|
||||
|
||||
`runEmbeddedAgent(...)` é o auxiliar neutro para iniciar um turno normal de
|
||||
agente OpenClaw a partir do código do plugin. Ele usa a mesma resolução de
|
||||
provedor/modelo e a mesma seleção de harness de agente que respostas acionadas por canal.
|
||||
agente do OpenClaw a partir do código do plugin. Ele usa a mesma resolução de
|
||||
provedor/modelo e a mesma seleção de harness de agente que as respostas
|
||||
acionadas por canais.
|
||||
|
||||
`runEmbeddedPiAgent(...)` continua disponível como alias de compatibilidade.
|
||||
`runEmbeddedPiAgent(...)` permanece como um alias de compatibilidade.
|
||||
|
||||
**Os auxiliares do armazenamento de sessão** ficam em `api.runtime.agent.session`:
|
||||
**Os auxiliares de armazenamento de sessão** ficam em `api.runtime.agent.session`:
|
||||
|
||||
```typescript
|
||||
const storePath = api.runtime.agent.session.resolveStorePath(cfg);
|
||||
@ -89,63 +90,65 @@ const filePath = api.runtime.agent.session.resolveSessionFilePath(cfg, sessionId
|
||||
Constantes padrão de modelo e provedor:
|
||||
|
||||
```typescript
|
||||
const model = api.runtime.agent.defaults.model; // por exemplo "anthropic/claude-sonnet-4-6"
|
||||
const provider = api.runtime.agent.defaults.provider; // por exemplo "anthropic"
|
||||
const model = api.runtime.agent.defaults.model; // e.g. "anthropic/claude-sonnet-4-6"
|
||||
const provider = api.runtime.agent.defaults.provider; // e.g. "anthropic"
|
||||
```
|
||||
|
||||
### `api.runtime.subagent`
|
||||
|
||||
Inicie e gerencie execuções de subagent em segundo plano.
|
||||
Inicie e gerencie execuções de subagente em segundo plano.
|
||||
|
||||
```typescript
|
||||
// Iniciar uma execução de subagent
|
||||
// Start a subagent run
|
||||
const { runId } = await api.runtime.subagent.run({
|
||||
sessionKey: "agent:main:subagent:search-helper",
|
||||
message: "Expanda esta consulta em buscas de acompanhamento mais focadas.",
|
||||
provider: "openai", // substituição opcional
|
||||
model: "gpt-4.1-mini", // substituição opcional
|
||||
message: "Expand this query into focused follow-up searches.",
|
||||
provider: "openai", // optional override
|
||||
model: "gpt-4.1-mini", // optional override
|
||||
deliver: false,
|
||||
});
|
||||
|
||||
// Aguardar a conclusão
|
||||
// Wait for completion
|
||||
const result = await api.runtime.subagent.waitForRun({ runId, timeoutMs: 30000 });
|
||||
|
||||
// Ler mensagens da sessão
|
||||
// Read session messages
|
||||
const { messages } = await api.runtime.subagent.getSessionMessages({
|
||||
sessionKey: "agent:main:subagent:search-helper",
|
||||
limit: 10,
|
||||
});
|
||||
|
||||
// Excluir uma sessão
|
||||
// Delete a session
|
||||
await api.runtime.subagent.deleteSession({
|
||||
sessionKey: "agent:main:subagent:search-helper",
|
||||
});
|
||||
```
|
||||
|
||||
<Warning>
|
||||
Substituições de modelo (`provider`/`model`) exigem ativação pelo operador via
|
||||
`plugins.entries.<id>.subagent.allowModelOverride: true` na configuração.
|
||||
Plugins não confiáveis ainda podem executar subagentes, mas solicitações de substituição são rejeitadas.
|
||||
Substituições de modelo (`provider`/`model`) exigem opt-in do operador via
|
||||
`plugins.entries.<id>.subagent.allowModelOverride: true` na config.
|
||||
Plugins não confiáveis ainda podem executar subagentes, mas solicitações de
|
||||
substituição são rejeitadas.
|
||||
</Warning>
|
||||
|
||||
### `api.runtime.taskFlow`
|
||||
|
||||
Vincule um runtime de Task Flow a uma chave de sessão OpenClaw existente ou a um
|
||||
contexto de ferramenta confiável e, em seguida, crie e gerencie Task Flows sem passar um proprietário em cada chamada.
|
||||
Vincule um tempo de execução do TaskFlow a uma chave de sessão OpenClaw existente ou a um
|
||||
contexto de ferramenta confiável, e então crie e gerencie TaskFlows sem passar um owner em
|
||||
cada chamada.
|
||||
|
||||
```typescript
|
||||
const taskFlow = api.runtime.taskFlow.fromToolContext(ctx);
|
||||
|
||||
const created = taskFlow.createManaged({
|
||||
controllerId: "my-plugin/review-batch",
|
||||
goal: "Revisar novos pull requests",
|
||||
goal: "Review new pull requests",
|
||||
});
|
||||
|
||||
const child = taskFlow.runTask({
|
||||
flowId: created.flowId,
|
||||
runtime: "acp",
|
||||
childSessionKey: "agent:main:subagent:reviewer",
|
||||
task: "Revisar PR #123",
|
||||
task: "Review PR #123",
|
||||
status: "running",
|
||||
startedAt: Date.now(),
|
||||
});
|
||||
@ -159,27 +162,27 @@ const waiting = taskFlow.setWaiting({
|
||||
```
|
||||
|
||||
Use `bindSession({ sessionKey, requesterOrigin })` quando você já tiver uma
|
||||
chave de sessão OpenClaw confiável da sua própria camada de vínculo. Não vincule a partir de entrada bruta do
|
||||
usuário.
|
||||
chave de sessão OpenClaw confiável da sua própria camada de vinculação. Não faça vinculação a partir de
|
||||
entrada bruta do usuário.
|
||||
|
||||
### `api.runtime.tts`
|
||||
|
||||
Síntese de texto para fala.
|
||||
|
||||
```typescript
|
||||
// TTS padrão
|
||||
// Standard TTS
|
||||
const clip = await api.runtime.tts.textToSpeech({
|
||||
text: "Olá do OpenClaw",
|
||||
text: "Hello from OpenClaw",
|
||||
cfg: api.config,
|
||||
});
|
||||
|
||||
// TTS otimizado para telefonia
|
||||
// Telephony-optimized TTS
|
||||
const telephonyClip = await api.runtime.tts.textToSpeechTelephony({
|
||||
text: "Olá do OpenClaw",
|
||||
text: "Hello from OpenClaw",
|
||||
cfg: api.config,
|
||||
});
|
||||
|
||||
// Listar vozes disponíveis
|
||||
// List available voices
|
||||
const voices = await api.runtime.tts.listVoices({
|
||||
provider: "elevenlabs",
|
||||
cfg: api.config,
|
||||
@ -194,27 +197,27 @@ de áudio PCM + taxa de amostragem.
|
||||
Análise de imagem, áudio e vídeo.
|
||||
|
||||
```typescript
|
||||
// Descrever uma imagem
|
||||
// Describe an image
|
||||
const image = await api.runtime.mediaUnderstanding.describeImageFile({
|
||||
filePath: "/tmp/inbound-photo.jpg",
|
||||
cfg: api.config,
|
||||
agentDir: "/tmp/agent",
|
||||
});
|
||||
|
||||
// Transcrever áudio
|
||||
// Transcribe audio
|
||||
const { text } = await api.runtime.mediaUnderstanding.transcribeAudioFile({
|
||||
filePath: "/tmp/inbound-audio.ogg",
|
||||
cfg: api.config,
|
||||
mime: "audio/ogg", // opcional, para quando o MIME não puder ser inferido
|
||||
mime: "audio/ogg", // optional, for when MIME cannot be inferred
|
||||
});
|
||||
|
||||
// Descrever um vídeo
|
||||
// Describe a video
|
||||
const video = await api.runtime.mediaUnderstanding.describeVideoFile({
|
||||
filePath: "/tmp/inbound-video.mp4",
|
||||
cfg: api.config,
|
||||
});
|
||||
|
||||
// Análise genérica de arquivo
|
||||
// Generic file analysis
|
||||
const result = await api.runtime.mediaUnderstanding.runFile({
|
||||
filePath: "/tmp/inbound-file.pdf",
|
||||
cfg: api.config,
|
||||
@ -224,7 +227,7 @@ const result = await api.runtime.mediaUnderstanding.runFile({
|
||||
Retorna `{ text: undefined }` quando nenhuma saída é produzida (por exemplo, entrada ignorada).
|
||||
|
||||
<Info>
|
||||
`api.runtime.stt.transcribeAudioFile(...)` continua disponível como alias de compatibilidade
|
||||
`api.runtime.stt.transcribeAudioFile(...)` permanece como um alias de compatibilidade
|
||||
para `api.runtime.mediaUnderstanding.transcribeAudioFile(...)`.
|
||||
</Info>
|
||||
|
||||
@ -234,7 +237,7 @@ Geração de imagem.
|
||||
|
||||
```typescript
|
||||
const result = await api.runtime.imageGeneration.generate({
|
||||
prompt: "Um robô pintando um pôr do sol",
|
||||
prompt: "A robot painting a sunset",
|
||||
cfg: api.config,
|
||||
});
|
||||
|
||||
@ -250,7 +253,7 @@ const providers = api.runtime.webSearch.listProviders({ config: api.config });
|
||||
|
||||
const result = await api.runtime.webSearch.search({
|
||||
config: api.config,
|
||||
args: { query: "SDK de plugins do OpenClaw", count: 5 },
|
||||
args: { query: "OpenClaw plugin SDK", count: 5 },
|
||||
});
|
||||
```
|
||||
|
||||
@ -269,7 +272,7 @@ const resized = await api.runtime.media.resizeToJpeg(buffer, { maxWidth: 800 });
|
||||
|
||||
### `api.runtime.config`
|
||||
|
||||
Carregamento e gravação de configuração.
|
||||
Carregamento e escrita de config.
|
||||
|
||||
```typescript
|
||||
const cfg = await api.runtime.config.loadConfig();
|
||||
@ -278,7 +281,7 @@ await api.runtime.config.writeConfigFile(cfg);
|
||||
|
||||
### `api.runtime.system`
|
||||
|
||||
Utilitários em nível de sistema.
|
||||
Utilitários de nível de sistema.
|
||||
|
||||
```typescript
|
||||
await api.runtime.system.enqueueSystemEvent(event);
|
||||
@ -302,7 +305,7 @@ api.runtime.events.onSessionTranscriptUpdate((update) => {
|
||||
|
||||
### `api.runtime.logging`
|
||||
|
||||
Logs.
|
||||
Logging.
|
||||
|
||||
```typescript
|
||||
const verbose = api.runtime.logging.shouldLogVerbose();
|
||||
@ -331,7 +334,7 @@ const stateDir = api.runtime.state.resolveStateDir();
|
||||
|
||||
### `api.runtime.tools`
|
||||
|
||||
Fábricas de ferramentas de memória e CLI.
|
||||
Factories de ferramenta de memória e CLI.
|
||||
|
||||
```typescript
|
||||
const getTool = api.runtime.tools.createMemoryGetTool(/* ... */);
|
||||
@ -341,10 +344,10 @@ api.runtime.tools.registerMemoryCli(/* ... */);
|
||||
|
||||
### `api.runtime.channel`
|
||||
|
||||
Auxiliares de runtime específicos de canal (disponíveis quando um plugin de canal é carregado).
|
||||
Auxiliares de tempo de execução específicos do canal (disponíveis quando um Plugin de canal é carregado).
|
||||
|
||||
`api.runtime.channel.mentions` é a superfície compartilhada de política de menções de entrada para
|
||||
plugins de canal incluídos que usam injeção de runtime:
|
||||
`api.runtime.channel.mentions` é a superfície compartilhada de política de menção de entrada para
|
||||
Plugins de canal empacotados que usam injeção de tempo de execução:
|
||||
|
||||
```typescript
|
||||
const mentionMatch = api.runtime.channel.mentions.matchesMentionWithExplicit(text, {
|
||||
@ -379,56 +382,62 @@ Auxiliares de menção disponíveis:
|
||||
- `implicitMentionKindWhen`
|
||||
- `resolveInboundMentionDecision`
|
||||
|
||||
`api.runtime.channel.mentions` intencionalmente não expõe os auxiliares legados de compatibilidade
|
||||
`resolveMentionGating*`. Prefira o caminho normalizado
|
||||
`api.runtime.channel.mentions` intencionalmente não expõe os auxiliares de compatibilidade
|
||||
antigos `resolveMentionGating*`. Prefira o caminho normalizado
|
||||
`{ facts, policy }`.
|
||||
|
||||
## Armazenando referências de runtime
|
||||
## Armazenando referências de tempo de execução
|
||||
|
||||
Use `createPluginRuntimeStore` para armazenar a referência de runtime para uso fora
|
||||
Use `createPluginRuntimeStore` para armazenar a referência de tempo de execução para uso fora
|
||||
do callback `register`:
|
||||
|
||||
```typescript
|
||||
import { createPluginRuntimeStore } from "openclaw/plugin-sdk/runtime-store";
|
||||
import type { PluginRuntime } from "openclaw/plugin-sdk/runtime-store";
|
||||
|
||||
const store = createPluginRuntimeStore<PluginRuntime>("runtime de my-plugin não inicializado");
|
||||
const store = createPluginRuntimeStore<PluginRuntime>({
|
||||
pluginId: "my-plugin",
|
||||
errorMessage: "my-plugin runtime not initialized",
|
||||
});
|
||||
|
||||
// No seu ponto de entrada
|
||||
// In your entry point
|
||||
export default defineChannelPluginEntry({
|
||||
id: "my-plugin",
|
||||
name: "My Plugin",
|
||||
description: "Exemplo",
|
||||
description: "Example",
|
||||
plugin: myPlugin,
|
||||
setRuntime: store.setRuntime,
|
||||
});
|
||||
|
||||
// Em outros arquivos
|
||||
// In other files
|
||||
export function getRuntime() {
|
||||
return store.getRuntime(); // lança erro se não estiver inicializado
|
||||
return store.getRuntime(); // throws if not initialized
|
||||
}
|
||||
|
||||
export function tryGetRuntime() {
|
||||
return store.tryGetRuntime(); // retorna null se não estiver inicializado
|
||||
return store.tryGetRuntime(); // returns null if not initialized
|
||||
}
|
||||
```
|
||||
|
||||
Prefira `pluginId` para a identidade do runtime-store. A forma de nível mais baixo `key` é
|
||||
para casos incomuns em que um plugin intencionalmente precisa de mais de um slot de tempo de execução.
|
||||
|
||||
## Outros campos de nível superior de `api`
|
||||
|
||||
Além de `api.runtime`, o objeto API também fornece:
|
||||
|
||||
| Campo | Tipo | Descrição |
|
||||
| ------------------------ | ------------------------- | ------------------------------------------------------------------------------------------- |
|
||||
| `api.id` | `string` | ID do plugin |
|
||||
| `api.name` | `string` | Nome de exibição do plugin |
|
||||
| `api.config` | `OpenClawConfig` | Snapshot atual da configuração (snapshot ativo em memória do runtime quando disponível) |
|
||||
| `api.pluginConfig` | `Record<string, unknown>` | Configuração específica do plugin em `plugins.entries.<id>.config` |
|
||||
| `api.id` | `string` | ID do Plugin |
|
||||
| `api.name` | `string` | Nome de exibição do Plugin |
|
||||
| `api.config` | `OpenClawConfig` | Snapshot atual da config (snapshot ativo em memória do tempo de execução quando disponível) |
|
||||
| `api.pluginConfig` | `Record<string, unknown>` | Config específica do Plugin em `plugins.entries.<id>.config` |
|
||||
| `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 um caminho relativo à raiz do plugin |
|
||||
| `api.resolvePath(input)` | `(string) => string` | Resolve um caminho relativo à raiz do Plugin |
|
||||
|
||||
## Relacionado
|
||||
|
||||
- [SDK Overview](/pt-BR/plugins/sdk-overview) -- referência de subcaminhos
|
||||
- [SDK Entry Points](/pt-BR/plugins/sdk-entrypoints) -- opções de `definePluginEntry`
|
||||
- [Plugin Internals](/pt-BR/plugins/architecture) -- modelo de capacidades e registro
|
||||
- [Visão geral do SDK](/pt-BR/plugins/sdk-overview) -- referência de subpath
|
||||
- [Pontos de entrada do SDK](/pt-BR/plugins/sdk-entrypoints) -- opções de `definePluginEntry`
|
||||
- [Internos do Plugin](/pt-BR/plugins/architecture) -- modelo de capacidades e registro
|
||||
|
||||
@ -1,35 +1,35 @@
|
||||
---
|
||||
read_when:
|
||||
- Você está adicionando um assistente de setup a um plugin
|
||||
- Você precisa entender setup-entry.ts versus index.ts
|
||||
- Você está definindo schemas de configuração de plugin ou metadados openclaw no package.json
|
||||
- Você está adicionando um assistente de configuração a um Plugin
|
||||
- Você precisa entender `setup-entry.ts` versus `index.ts`
|
||||
- Você está definindo esquemas de config do Plugin ou metadados `openclaw` no `package.json`
|
||||
sidebarTitle: Setup and Config
|
||||
summary: Assistentes de setup, setup-entry.ts, schemas de configuração e metadados do package.json
|
||||
title: Setup e configuração de plugins
|
||||
summary: Assistentes de configuração, setup-entry.ts, esquemas de configuração e metadados do package.json
|
||||
title: Configuração e Config do Plugin
|
||||
x-i18n:
|
||||
generated_at: "2026-04-06T03:10:35Z"
|
||||
generated_at: "2026-04-15T19:41:37Z"
|
||||
model: gpt-5.4
|
||||
provider: openai
|
||||
source_hash: eac2586516d27bcd94cc4c259fe6274c792b3f9938c7ddd6dbf04a6dbb988dc9
|
||||
source_hash: ddf28e25e381a4a38ac478e531586f59612e1a278732597375f87c2eeefc521b
|
||||
source_path: plugins/sdk-setup.md
|
||||
workflow: 15
|
||||
---
|
||||
|
||||
# Setup e configuração de plugins
|
||||
# Configuração e Config do Plugin
|
||||
|
||||
Referência para empacotamento de plugin (metadados de `package.json`), manifestos
|
||||
(`openclaw.plugin.json`), entradas de setup e schemas de configuração.
|
||||
Referência para empacotamento de Plugin (metadados do `package.json`), manifestos
|
||||
(`openclaw.plugin.json`), entradas de configuração e esquemas de config.
|
||||
|
||||
<Tip>
|
||||
**Está procurando um passo a passo?** Os guias práticos cobrem o empacotamento em contexto:
|
||||
[Channel Plugins](/pt-BR/plugins/sdk-channel-plugins#step-1-package-and-manifest) e
|
||||
[Provider Plugins](/pt-BR/plugins/sdk-provider-plugins#step-1-package-and-manifest).
|
||||
[Plugins de Canal](/pt-BR/plugins/sdk-channel-plugins#step-1-package-and-manifest) e
|
||||
[Plugins de Provedor](/pt-BR/plugins/sdk-provider-plugins#step-1-package-and-manifest).
|
||||
</Tip>
|
||||
|
||||
## Metadados do pacote
|
||||
|
||||
Seu `package.json` precisa de um campo `openclaw` que informe ao sistema de plugins o que
|
||||
seu plugin fornece:
|
||||
seu Plugin fornece:
|
||||
|
||||
**Plugin de canal:**
|
||||
|
||||
@ -50,7 +50,7 @@ seu plugin fornece:
|
||||
}
|
||||
```
|
||||
|
||||
**Plugin de provedor / baseline de publicação no ClawHub:**
|
||||
**Plugin de provedor / linha de base de publicação do ClawHub:**
|
||||
|
||||
```json openclaw-clawhub-package.json
|
||||
{
|
||||
@ -71,47 +71,47 @@ seu plugin fornece:
|
||||
}
|
||||
```
|
||||
|
||||
Se você publicar o plugin externamente no ClawHub, esses campos `compat` e `build`
|
||||
Se você publicar o Plugin externamente no ClawHub, esses campos `compat` e `build`
|
||||
serão obrigatórios. Os snippets canônicos de publicação ficam em
|
||||
`docs/snippets/plugin-publish/`.
|
||||
|
||||
### Campos `openclaw`
|
||||
|
||||
| Campo | Tipo | Descrição |
|
||||
| ------------ | ---------- | --------------------------------------------------------------------------------------------------------- |
|
||||
| `extensions` | `string[]` | Arquivos de ponto de entrada (relativos à raiz do pacote) |
|
||||
| `setupEntry` | `string` | Entrada leve apenas para setup (opcional) |
|
||||
| `channel` | `object` | Metadados do catálogo de canais para superfícies de setup, seletor, quickstart e status |
|
||||
| `providers` | `string[]` | IDs de provedor registrados por este plugin |
|
||||
| Campo | Tipo | Descrição |
|
||||
| ------------ | ---------- | ----------------------------------------------------------------------------------------------------- |
|
||||
| `extensions` | `string[]` | Arquivos de ponto de entrada (relativos à raiz do pacote) |
|
||||
| `setupEntry` | `string` | Entrada leve apenas para configuração (opcional) |
|
||||
| `channel` | `object` | Metadados do catálogo de canais para configuração, seletor, início rápido e superfícies de status |
|
||||
| `providers` | `string[]` | IDs de provedores registrados por este Plugin |
|
||||
| `install` | `object` | Dicas de instalação: `npmSpec`, `localPath`, `defaultChoice`, `minHostVersion`, `allowInvalidConfigRecovery` |
|
||||
| `startup` | `object` | Flags de comportamento de inicialização |
|
||||
| `startup` | `object` | Flags de comportamento de inicialização |
|
||||
|
||||
### `openclaw.channel`
|
||||
|
||||
`openclaw.channel` são metadados leves de pacote para descoberta de canal e superfícies de setup
|
||||
antes do carregamento do runtime.
|
||||
`openclaw.channel` é um metadado barato de pacote para descoberta de canais e
|
||||
superfícies de configuração antes que o runtime seja carregado.
|
||||
|
||||
| Campo | Tipo | O que significa |
|
||||
| -------------------------------------- | ---------- | ------------------------------------------------------------------------------ |
|
||||
| `id` | `string` | ID canônico do canal. |
|
||||
| `label` | `string` | Rótulo principal do canal. |
|
||||
| `selectionLabel` | `string` | Rótulo de seletor/setup quando deve diferir de `label`. |
|
||||
| `detailLabel` | `string` | Rótulo de detalhe secundário para catálogos de canal e superfícies de status mais ricos. |
|
||||
| `docsPath` | `string` | Caminho da documentação para links de setup e seleção. |
|
||||
| `docsLabel` | `string` | Rótulo substituto usado para links de documentação quando deve diferir do id do canal. |
|
||||
| `blurb` | `string` | Descrição curta de onboarding/catálogo. |
|
||||
| `order` | `number` | Ordem de classificação em catálogos de canal. |
|
||||
| `aliases` | `string[]` | Aliases extras de lookup para seleção de canal. |
|
||||
| `preferOver` | `string[]` | IDs de plugin/canal de prioridade mais baixa sobre os quais este canal deve prevalecer. |
|
||||
| `systemImage` | `string` | Nome opcional de ícone/system-image para catálogos de UI de canal. |
|
||||
| `selectionDocsPrefix` | `string` | Texto de prefixo antes dos links de documentação em superfícies de seleção. |
|
||||
| `selectionDocsOmitLabel` | `boolean` | Mostra o caminho da documentação diretamente em vez de um link rotulado nas cópias de seleção. |
|
||||
| `selectionExtras` | `string[]` | Strings curtas extras anexadas na cópia de seleção. |
|
||||
| Campo | Tipo | O que significa |
|
||||
| -------------------------------------- | ---------- | ----------------------------------------------------------------------------- |
|
||||
| `id` | `string` | ID canônico do canal. |
|
||||
| `label` | `string` | Rótulo principal do canal. |
|
||||
| `selectionLabel` | `string` | Rótulo do seletor/configuração quando deve ser diferente de `label`. |
|
||||
| `detailLabel` | `string` | Rótulo de detalhe secundário para catálogos de canais e superfícies de status mais ricos. |
|
||||
| `docsPath` | `string` | Caminho da documentação para links de configuração e seleção. |
|
||||
| `docsLabel` | `string` | Rótulo substituto usado para links de documentação quando deve ser diferente do ID do canal. |
|
||||
| `blurb` | `string` | Descrição curta para onboarding/catálogo. |
|
||||
| `order` | `number` | Ordem de classificação em catálogos de canais. |
|
||||
| `aliases` | `string[]` | Aliases extras de busca para seleção de canal. |
|
||||
| `preferOver` | `string[]` | IDs de Plugin/canal de prioridade inferior que este canal deve superar. |
|
||||
| `systemImage` | `string` | Nome opcional de ícone/imagem do sistema para catálogos de UI de canais. |
|
||||
| `selectionDocsPrefix` | `string` | Texto de prefixo antes dos links de documentação nas superfícies de seleção. |
|
||||
| `selectionDocsOmitLabel` | `boolean` | Mostra o caminho da documentação diretamente em vez de um link rotulado na cópia de seleção. |
|
||||
| `selectionExtras` | `string[]` | Strings curtas extras anexadas na cópia de seleção. |
|
||||
| `markdownCapable` | `boolean` | Marca o canal como compatível com Markdown para decisões de formatação de saída. |
|
||||
| `exposure` | `object` | Controles de visibilidade do canal para superfícies de setup, listas configuradas e documentação. |
|
||||
| `quickstartAllowFrom` | `boolean` | Inclui este canal no fluxo padrão de setup `allowFrom` do quickstart. |
|
||||
| `forceAccountBinding` | `boolean` | Exige vinculação explícita de conta mesmo quando existe apenas uma conta. |
|
||||
| `preferSessionLookupForAnnounceTarget` | `boolean` | Prefere lookup de sessão ao resolver destinos de anúncio para este canal. |
|
||||
| `exposure` | `object` | Controles de visibilidade do canal para configuração, listas configuradas e superfícies de documentação. |
|
||||
| `quickstartAllowFrom` | `boolean` | Inclui este canal no fluxo padrão de configuração `allowFrom` de início rápido. |
|
||||
| `forceAccountBinding` | `boolean` | Exige vínculo explícito de conta mesmo quando existe apenas uma conta. |
|
||||
| `preferSessionLookupForAnnounceTarget` | `boolean` | Prefere busca de sessão ao resolver destinos de anúncio para este canal. |
|
||||
|
||||
Exemplo:
|
||||
|
||||
@ -145,35 +145,35 @@ Exemplo:
|
||||
|
||||
`exposure` oferece suporte a:
|
||||
|
||||
- `configured`: inclui o canal em superfícies de listagem configurada/estilo status
|
||||
- `setup`: inclui o canal em seletores interativos de setup/configuração
|
||||
- `docs`: marca o canal como público em superfícies de documentação/navegação
|
||||
- `configured`: incluir o canal em superfícies de listagem no estilo configurado/status
|
||||
- `setup`: incluir o canal em seletores interativos de configuração/configurar
|
||||
- `docs`: marcar o canal como voltado ao público em superfícies de documentação/navegação
|
||||
|
||||
`showConfigured` e `showInSetup` continuam aceitos como aliases legados. Prefira
|
||||
`showConfigured` e `showInSetup` continuam com suporte como aliases legados. Prefira
|
||||
`exposure`.
|
||||
|
||||
### `openclaw.install`
|
||||
|
||||
`openclaw.install` é metadado de pacote, não metadado de manifesto.
|
||||
`openclaw.install` é um metadado de pacote, não um metadado de manifesto.
|
||||
|
||||
| Campo | Tipo | O que significa |
|
||||
| ---------------------------- | -------------------- | --------------------------------------------------------------------------------- |
|
||||
| ---------------------------- | -------------------- | -------------------------------------------------------------------------------- |
|
||||
| `npmSpec` | `string` | Especificação npm canônica para fluxos de instalação/atualização. |
|
||||
| `localPath` | `string` | Caminho de instalação local de desenvolvimento ou empacotada. |
|
||||
| `defaultChoice` | `"npm"` \| `"local"` | Origem de instalação preferida quando ambas estão disponíveis. |
|
||||
| `minHostVersion` | `string` | Versão mínima compatível do OpenClaw no formato `>=x.y.z`. |
|
||||
| `allowInvalidConfigRecovery` | `boolean` | Permite que fluxos de reinstalação de plugin empacotado recuperem falhas específicas de configuração obsoleta. |
|
||||
| `localPath` | `string` | Caminho local de desenvolvimento ou instalação empacotada. |
|
||||
| `defaultChoice` | `"npm"` \| `"local"` | Fonte de instalação preferida quando ambas estiverem disponíveis. |
|
||||
| `minHostVersion` | `string` | Versão mínima suportada do OpenClaw no formato `>=x.y.z`. |
|
||||
| `allowInvalidConfigRecovery` | `boolean` | Permite que fluxos de reinstalação de Plugin empacotado recuperem falhas específicas de config obsoleta. |
|
||||
|
||||
Se `minHostVersion` estiver definido, tanto a instalação quanto o carregamento do registro de manifestos
|
||||
o aplicarão. Hosts mais antigos ignoram o plugin; strings de versão inválidas são rejeitadas.
|
||||
Se `minHostVersion` estiver definido, tanto a instalação quanto o carregamento do registro de manifesto o aplicarão.
|
||||
Hosts mais antigos ignoram o Plugin; strings de versão inválidas são rejeitadas.
|
||||
|
||||
`allowInvalidConfigRecovery` não é um bypass geral para configurações quebradas. Ele existe
|
||||
apenas para recuperação restrita de plugins empacotados, para que reinstalação/setup possa reparar sobras
|
||||
conhecidas de upgrades, como um caminho ausente de plugin empacotado ou uma entrada obsoleta `channels.<id>`
|
||||
para esse mesmo plugin. Se a configuração estiver quebrada por motivos não relacionados, a instalação
|
||||
ainda falha de forma fechada e orienta o operador a executar `openclaw doctor --fix`.
|
||||
`allowInvalidConfigRecovery` não é um bypass geral para configs quebradas. É
|
||||
para recuperação restrita apenas de Plugin empacotado, de modo que reinstalação/configuração possa reparar sobras conhecidas
|
||||
de upgrade, como um caminho ausente de Plugin empacotado ou uma entrada obsoleta `channels.<id>`
|
||||
desse mesmo Plugin. Se a config estiver quebrada por motivos não relacionados, a instalação
|
||||
ainda falhará de forma fechada e informará ao operador para executar `openclaw doctor --fix`.
|
||||
|
||||
### Carregamento completo adiado
|
||||
### Adiamento do carregamento completo
|
||||
|
||||
Plugins de canal podem optar por carregamento adiado com:
|
||||
|
||||
@ -189,26 +189,26 @@ Plugins de canal podem optar por carregamento adiado com:
|
||||
}
|
||||
```
|
||||
|
||||
Quando ativado, o OpenClaw carrega apenas `setupEntry` durante a fase de inicialização
|
||||
pré-listen, mesmo para canais já configurados. A entrada completa carrega depois que o
|
||||
gateway começa a escutar.
|
||||
Quando ativado, o OpenClaw carrega apenas `setupEntry` durante a fase de
|
||||
inicialização anterior ao listen, mesmo para canais já configurados. A entrada completa é carregada após o
|
||||
gateway começar a escutar.
|
||||
|
||||
<Warning>
|
||||
Ative o carregamento adiado apenas quando seu `setupEntry` registrar tudo de que o
|
||||
Ative o carregamento adiado apenas quando seu `setupEntry` registrar tudo o que o
|
||||
gateway precisa antes de começar a escutar (registro de canal, rotas HTTP,
|
||||
métodos do gateway). Se a entrada completa controlar capacidades obrigatórias de inicialização, mantenha
|
||||
métodos do gateway). Se a entrada completa possuir recursos de inicialização obrigatórios, mantenha
|
||||
o comportamento padrão.
|
||||
</Warning>
|
||||
|
||||
Se sua entrada de setup/completa registrar métodos RPC do gateway, mantenha-os em um
|
||||
prefixo específico do plugin. Os namespaces administrativos reservados do core (`config.*`,
|
||||
`exec.approvals.*`, `wizard.*`, `update.*`) continuam pertencendo ao core e sempre são resolvidos
|
||||
Se sua entrada de configuração/completa registrar métodos RPC do gateway, mantenha-os em um
|
||||
prefixo específico do Plugin. Namespaces administrativos reservados do core (`config.*`,
|
||||
`exec.approvals.*`, `wizard.*`, `update.*`) continuam pertencendo ao core e sempre serão resolvidos
|
||||
para `operator.admin`.
|
||||
|
||||
## Manifesto do plugin
|
||||
## Manifesto do Plugin
|
||||
|
||||
Todo plugin nativo deve incluir um `openclaw.plugin.json` na raiz do pacote.
|
||||
O OpenClaw usa isso para validar a configuração sem executar o código do plugin.
|
||||
Todo Plugin nativo deve incluir um `openclaw.plugin.json` na raiz do pacote.
|
||||
O OpenClaw usa isso para validar a config sem executar código do Plugin.
|
||||
|
||||
```json
|
||||
{
|
||||
@ -228,7 +228,7 @@ O OpenClaw usa isso para validar a configuração sem executar o código do plug
|
||||
}
|
||||
```
|
||||
|
||||
Para plugins de canal, adicione `kind` e `channels`:
|
||||
Para Plugins de canal, adicione `kind` e `channels`:
|
||||
|
||||
```json
|
||||
{
|
||||
@ -243,7 +243,7 @@ Para plugins de canal, adicione `kind` e `channels`:
|
||||
}
|
||||
```
|
||||
|
||||
Mesmo plugins sem configuração devem incluir um schema. Um schema vazio é válido:
|
||||
Mesmo Plugins sem config devem incluir um esquema. Um esquema vazio é válido:
|
||||
|
||||
```json
|
||||
{
|
||||
@ -255,25 +255,25 @@ Mesmo plugins sem configuração devem incluir um schema. Um schema vazio é vá
|
||||
}
|
||||
```
|
||||
|
||||
Consulte [Plugin Manifest](/pt-BR/plugins/manifest) para a referência completa do schema.
|
||||
Consulte [Manifesto do Plugin](/pt-BR/plugins/manifest) para a referência completa do esquema.
|
||||
|
||||
## Publicação no ClawHub
|
||||
|
||||
Para pacotes de plugin, use o comando do ClawHub específico para pacote:
|
||||
Para pacotes de Plugin, use o comando do ClawHub específico para pacotes:
|
||||
|
||||
```bash
|
||||
clawhub package publish your-org/your-plugin --dry-run
|
||||
clawhub package publish your-org/your-plugin
|
||||
```
|
||||
|
||||
O alias legado de publicação apenas para skill é para Skills. Pacotes de plugin devem
|
||||
O alias legado de publicação apenas para Skills é para Skills. Pacotes de Plugin devem
|
||||
sempre usar `clawhub package publish`.
|
||||
|
||||
## Entrada de setup
|
||||
## Entrada de configuração
|
||||
|
||||
O arquivo `setup-entry.ts` é uma alternativa leve ao `index.ts` que o
|
||||
OpenClaw carrega quando precisa apenas das superfícies de setup (onboarding, reparo de configuração,
|
||||
inspeção de canal desativado).
|
||||
O arquivo `setup-entry.ts` é uma alternativa leve a `index.ts` que
|
||||
o OpenClaw carrega quando precisa apenas das superfícies de configuração (onboarding, reparo
|
||||
de config, inspeção de canal desativado).
|
||||
|
||||
```typescript
|
||||
// setup-entry.ts
|
||||
@ -283,20 +283,26 @@ import { myChannelPlugin } from "./src/channel.js";
|
||||
export default defineSetupPluginEntry(myChannelPlugin);
|
||||
```
|
||||
|
||||
Isso evita carregar código pesado de runtime (bibliotecas de criptografia, registros de CLI,
|
||||
serviços em segundo plano) durante os fluxos de setup.
|
||||
Isso evita carregar código pesado de runtime (bibliotecas de criptografia, registros
|
||||
de CLI, serviços em segundo plano) durante fluxos de configuração.
|
||||
|
||||
Canais empacotados do workspace que mantêm exportações seguras para configuração em módulos sidecar podem
|
||||
usar `defineBundledChannelSetupEntry(...)` de
|
||||
`openclaw/plugin-sdk/channel-entry-contract` em vez de
|
||||
`defineSetupPluginEntry(...)`. Esse contrato empacotado também oferece suporte a uma exportação opcional
|
||||
`runtime`, para que o wiring de runtime em tempo de configuração permaneça leve e explícito.
|
||||
|
||||
**Quando o OpenClaw usa `setupEntry` em vez da entrada completa:**
|
||||
|
||||
- O canal está desativado, mas precisa de superfícies de setup/onboarding
|
||||
- O canal está desativado, mas precisa de superfícies de configuração/onboarding
|
||||
- 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 (via `defineSetupPluginEntry`)
|
||||
- Quaisquer rotas HTTP necessárias antes do gateway escutar
|
||||
- Quaisquer métodos de gateway necessários durante a inicialização
|
||||
- O objeto do Plugin de canal (via `defineSetupPluginEntry`)
|
||||
- Quaisquer rotas HTTP necessárias antes de o gateway entrar em listen
|
||||
- Quaisquer métodos do gateway necessários durante a inicialização
|
||||
|
||||
Esses métodos de gateway de inicialização ainda devem evitar namespaces administrativos reservados do core
|
||||
como `config.*` ou `update.*`.
|
||||
@ -306,53 +312,53 @@ como `config.*` ou `update.*`.
|
||||
- Registros de CLI
|
||||
- Serviços em segundo plano
|
||||
- Imports pesados de runtime (crypto, SDKs)
|
||||
- Métodos de gateway necessários apenas após a inicialização
|
||||
- Métodos do gateway necessários apenas após a inicialização
|
||||
|
||||
### Imports restritos de helpers de setup
|
||||
### Imports restritos de helpers de configuração
|
||||
|
||||
Para caminhos quentes apenas de setup, prefira as interfaces restritas de helper de setup em vez da
|
||||
interface guarda-chuva mais ampla `plugin-sdk/setup` quando precisar apenas de parte da superfície de setup:
|
||||
Para caminhos quentes apenas de configuração, prefira os seams restritos de helper de configuração em vez do umbrella mais amplo
|
||||
`plugin-sdk/setup` quando você precisar apenas de parte da superfície de configuração:
|
||||
|
||||
| Caminho de importação | Use para | Exportações principais |
|
||||
| ------------------------------------ | --------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
||||
| `plugin-sdk/setup-runtime` | helpers de runtime em tempo de setup que permanecem disponíveis em `setupEntry` / inicialização adiada de canal | `createPatchedAccountSetupAdapter`, `createEnvPatchedAccountSetupAdapter`, `createSetupInputPresenceValidator`, `noteChannelLookupFailure`, `noteChannelLookupSummary`, `promptResolvedAllowFrom`, `splitSetupEntries`, `createAllowlistSetupWizardProxy`, `createDelegatedSetupWizardProxy` |
|
||||
| `plugin-sdk/setup-adapter-runtime` | adaptadores de setup de conta com reconhecimento de ambiente | `createEnvPatchedAccountSetupAdapter` |
|
||||
| `plugin-sdk/setup-tools` | helpers de CLI/arquivo/documentação de setup/instalação | `formatCliCommand`, `detectBinary`, `extractArchive`, `resolveBrewExecutable`, `formatDocsLink`, `CONFIG_DIR` |
|
||||
| Caminho de importação | Use para | Exportações principais |
|
||||
| ----------------------------------- | ----------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
||||
| `plugin-sdk/setup-runtime` | helpers de runtime em tempo de configuração que permanecem disponíveis em `setupEntry` / inicialização adiada de canal | `createPatchedAccountSetupAdapter`, `createEnvPatchedAccountSetupAdapter`, `createSetupInputPresenceValidator`, `noteChannelLookupFailure`, `noteChannelLookupSummary`, `promptResolvedAllowFrom`, `splitSetupEntries`, `createAllowlistSetupWizardProxy`, `createDelegatedSetupWizardProxy` |
|
||||
| `plugin-sdk/setup-adapter-runtime` | adaptadores de configuração de conta com reconhecimento de ambiente | `createEnvPatchedAccountSetupAdapter` |
|
||||
| `plugin-sdk/setup-tools` | helpers de CLI/arquivo/documentação para configuração/instalação | `formatCliCommand`, `detectBinary`, `extractArchive`, `resolveBrewExecutable`, `formatDocsLink`, `CONFIG_DIR` |
|
||||
|
||||
Use a interface mais ampla `plugin-sdk/setup` quando quiser a caixa de ferramentas completa e compartilhada de setup,
|
||||
incluindo helpers de patch de configuração, como
|
||||
Use o seam mais amplo `plugin-sdk/setup` quando quiser a caixa de ferramentas completa e compartilhada de configuração,
|
||||
incluindo helpers de patch de config como
|
||||
`moveSingleAccountChannelSectionToDefaultAccount(...)`.
|
||||
|
||||
Os adaptadores de patch de setup continuam seguros para importação em caminhos quentes. O lookup preguiçoso
|
||||
da superfície de contrato empacotada para promoção de conta única significa que importar
|
||||
Os adaptadores de patch de configuração continuam seguros para importação em caminhos quentes. A busca da superfície de contrato empacotada
|
||||
para promoção de conta única é lazy, portanto importar
|
||||
`plugin-sdk/setup-runtime` não carrega antecipadamente a descoberta da superfície de contrato empacotada
|
||||
antes de o adaptador ser realmente usado.
|
||||
antes de o adaptador realmente ser usado.
|
||||
|
||||
### Promoção de conta única controlada pelo canal
|
||||
|
||||
Quando um canal é atualizado de uma configuração de nível superior de conta única para
|
||||
`channels.<id>.accounts.*`, o comportamento compartilhado padrão é mover valores promovidos
|
||||
com escopo de conta para `accounts.default`.
|
||||
Quando um canal é atualizado de uma config de nível superior de conta única para
|
||||
`channels.<id>.accounts.*`, o comportamento compartilhado padrão é mover valores
|
||||
promovidos com escopo de conta para `accounts.default`.
|
||||
|
||||
Canais empacotados podem restringir ou substituir essa promoção por meio da sua
|
||||
superfície de contrato de setup:
|
||||
Canais empacotados podem restringir ou substituir essa promoção por meio de sua
|
||||
superfície de contrato de configuração:
|
||||
|
||||
- `singleAccountKeysToMove`: chaves extras de nível superior que devem ser movidas para a
|
||||
conta promovida
|
||||
- `namedAccountPromotionKeys`: quando contas nomeadas já existem, apenas essas
|
||||
chaves são movidas para a conta promovida; chaves compartilhadas de política/entrega permanecem na
|
||||
raiz do canal
|
||||
- `namedAccountPromotionKeys`: quando contas nomeadas já existem, apenas estas
|
||||
chaves são movidas para a conta promovida; chaves compartilhadas de política/entrega permanecem na raiz
|
||||
do canal
|
||||
- `resolveSingleAccountPromotionTarget(...)`: escolhe qual conta existente
|
||||
recebe os valores promovidos
|
||||
|
||||
Matrix é o exemplo empacotado atual. Se já existir exatamente uma conta Matrix nomeada,
|
||||
ou se `defaultAccount` apontar para uma chave não canônica existente, como `Ops`,
|
||||
a promoção preservará essa conta em vez de criar uma nova entrada
|
||||
`accounts.default`.
|
||||
Matrix é o exemplo empacotado atual. Se exatamente uma conta Matrix nomeada
|
||||
já existir, ou se `defaultAccount` apontar para uma chave não canônica existente
|
||||
como `Ops`, a promoção preserva essa conta em vez de criar uma nova
|
||||
entrada `accounts.default`.
|
||||
|
||||
## Schema de configuração
|
||||
## Esquema de config
|
||||
|
||||
A configuração do plugin é validada em relação ao JSON Schema no seu manifesto. Usuários
|
||||
A config do Plugin é validada em relação ao JSON Schema no seu manifesto. Os usuários
|
||||
configuram plugins por meio de:
|
||||
|
||||
```json5
|
||||
@ -369,9 +375,9 @@ configuram plugins por meio de:
|
||||
}
|
||||
```
|
||||
|
||||
Seu plugin recebe essa configuração como `api.pluginConfig` durante o registro.
|
||||
Seu Plugin recebe essa config como `api.pluginConfig` durante o registro.
|
||||
|
||||
Para configuração específica de canal, use a seção de configuração do canal:
|
||||
Para config específica de canal, use a seção de config do canal:
|
||||
|
||||
```json5
|
||||
{
|
||||
@ -384,10 +390,10 @@ Para configuração específica de canal, use a seção de configuração do can
|
||||
}
|
||||
```
|
||||
|
||||
### Criando schemas de configuração de canal
|
||||
### Criando esquemas de config de canal
|
||||
|
||||
Use `buildChannelConfigSchema` de `openclaw/plugin-sdk/core` para converter um
|
||||
schema Zod no wrapper `ChannelConfigSchema` que o OpenClaw valida:
|
||||
esquema Zod no wrapper `ChannelConfigSchema` que o OpenClaw valida:
|
||||
|
||||
```typescript
|
||||
import { z } from "zod";
|
||||
@ -403,9 +409,9 @@ const accountSchema = z.object({
|
||||
const configSchema = buildChannelConfigSchema(accountSchema);
|
||||
```
|
||||
|
||||
## Assistentes de setup
|
||||
## Assistentes de configuração
|
||||
|
||||
Plugins de canal podem fornecer assistentes interativos de setup para `openclaw onboard`.
|
||||
Plugins de canal podem fornecer assistentes interativos de configuração para `openclaw onboard`.
|
||||
O assistente é um objeto `ChannelSetupWizard` no `ChannelPlugin`:
|
||||
|
||||
```typescript
|
||||
@ -441,21 +447,21 @@ const setupWizard: ChannelSetupWizard = {
|
||||
|
||||
O tipo `ChannelSetupWizard` oferece suporte a `credentials`, `textInputs`,
|
||||
`dmPolicy`, `allowFrom`, `groupAccess`, `prepare`, `finalize` e mais.
|
||||
Consulte pacotes de plugins empacotados (por exemplo o plugin Discord em `src/channel.setup.ts`) para
|
||||
Consulte os pacotes de Plugin empacotados (por exemplo, o Plugin do Discord em `src/channel.setup.ts`) para
|
||||
exemplos completos.
|
||||
|
||||
Para prompts de allowlist de DM que precisam apenas do fluxo padrão
|
||||
`note -> prompt -> parse -> merge -> patch`, prefira os helpers compartilhados de setup
|
||||
`note -> prompt -> parse -> merge -> patch`, prefira os helpers compartilhados de configuração
|
||||
de `openclaw/plugin-sdk/setup`: `createPromptParsedAllowFromForAccount(...)`,
|
||||
`createTopLevelChannelParsedAllowFromPrompt(...)` e
|
||||
`createNestedChannelParsedAllowFromPrompt(...)`.
|
||||
|
||||
Para blocos de status de setup de canal que variam apenas em rótulos, pontuações e linhas extras opcionais,
|
||||
Para blocos de status de configuração de canal que variam apenas por rótulos, pontuações e linhas extras opcionais,
|
||||
prefira `createStandardChannelSetupStatus(...)` de
|
||||
`openclaw/plugin-sdk/setup` em vez de criar manualmente o mesmo objeto `status` em
|
||||
cada plugin.
|
||||
`openclaw/plugin-sdk/setup` em vez de montar manualmente o mesmo objeto `status` em
|
||||
cada Plugin.
|
||||
|
||||
Para superfícies de setup opcionais que devem aparecer apenas em certos contextos, use
|
||||
Para superfícies opcionais de configuração que devem aparecer apenas em certos contextos, use
|
||||
`createOptionalChannelSetupSurface` de `openclaw/plugin-sdk/channel-setup`:
|
||||
|
||||
```typescript
|
||||
@ -470,17 +476,17 @@ const setupSurface = createOptionalChannelSetupSurface({
|
||||
// Returns { setupAdapter, setupWizard }
|
||||
```
|
||||
|
||||
`plugin-sdk/channel-setup` também expõe os builders de nível inferior
|
||||
`plugin-sdk/channel-setup` também expõe os builders de nível mais baixo
|
||||
`createOptionalChannelSetupAdapter(...)` e
|
||||
`createOptionalChannelSetupWizard(...)` quando você precisar apenas de metade
|
||||
`createOptionalChannelSetupWizard(...)` quando você precisa apenas de uma metade
|
||||
dessa superfície de instalação opcional.
|
||||
|
||||
O adaptador/assistente opcional gerado falha de forma fechada em gravações reais de configuração. Eles
|
||||
O adaptador/assistente opcional gerado falha de forma fechada em gravações reais de config. Eles
|
||||
reutilizam uma única mensagem de instalação obrigatória em `validateInput`,
|
||||
`applyAccountConfig` e `finalize`, e acrescentam um link de documentação quando `docsPath` estiver
|
||||
`applyAccountConfig` e `finalize`, e acrescentam um link de documentação quando `docsPath` está
|
||||
definido.
|
||||
|
||||
Para UIs de setup baseadas em binário, prefira os helpers delegados compartilhados em vez de
|
||||
Para UIs de configuração baseadas em binário, prefira os helpers delegados compartilhados em vez de
|
||||
copiar a mesma cola de binário/status em cada canal:
|
||||
|
||||
- `createDetectedBinaryStatus(...)` para blocos de status que variam apenas por rótulos,
|
||||
@ -488,35 +494,35 @@ copiar a mesma cola de binário/status em cada canal:
|
||||
- `createCliPathTextInput(...)` para entradas de texto baseadas em caminho
|
||||
- `createDelegatedSetupWizardStatusResolvers(...)`,
|
||||
`createDelegatedPrepare(...)`, `createDelegatedFinalize(...)` e
|
||||
`createDelegatedResolveConfigured(...)` quando `setupEntry` precisar encaminhar preguiçosamente para
|
||||
um assistente completo mais pesado
|
||||
- `createDelegatedTextInputShouldPrompt(...)` quando `setupEntry` só precisar
|
||||
delegar uma decisão de `textInputs[*].shouldPrompt`
|
||||
`createDelegatedResolveConfigured(...)` quando `setupEntry` precisa encaminhar para
|
||||
um assistente completo mais pesado de forma lazy
|
||||
- `createDelegatedTextInputShouldPrompt(...)` quando `setupEntry` precisa apenas
|
||||
delegar uma decisão `textInputs[*].shouldPrompt`
|
||||
|
||||
## Publicação e instalação
|
||||
|
||||
**Plugins externos:** publique no [ClawHub](/pt-BR/tools/clawhub) ou npm e depois instale:
|
||||
**Plugins externos:** publique no [ClawHub](/pt-BR/tools/clawhub) ou no npm e depois instale:
|
||||
|
||||
```bash
|
||||
openclaw plugins install @myorg/openclaw-my-plugin
|
||||
```
|
||||
|
||||
O OpenClaw tenta primeiro o ClawHub e recorre automaticamente ao npm. Você também pode
|
||||
forçar o ClawHub explicitamente:
|
||||
forçar explicitamente o ClawHub:
|
||||
|
||||
```bash
|
||||
openclaw plugins install clawhub:@myorg/openclaw-my-plugin # somente ClawHub
|
||||
```
|
||||
|
||||
Não existe um override correspondente `npm:`. Use a especificação normal de pacote npm quando
|
||||
Não existe uma substituição correspondente `npm:`. Use a especificação normal de pacote npm quando
|
||||
quiser o caminho npm após o fallback do ClawHub:
|
||||
|
||||
```bash
|
||||
openclaw plugins install @myorg/openclaw-my-plugin
|
||||
```
|
||||
|
||||
**Plugins no repositório:** coloque-os sob a árvore de workspace de plugins empacotados e eles serão
|
||||
descobertos automaticamente durante a build.
|
||||
**Plugins no repositório:** coloque-os na árvore de workspace de plugins empacotados e eles serão automaticamente
|
||||
descobertos durante o build.
|
||||
|
||||
**Os usuários podem instalar:**
|
||||
|
||||
@ -525,13 +531,13 @@ openclaw plugins install <package-name>
|
||||
```
|
||||
|
||||
<Info>
|
||||
Para instalações obtidas do npm, `openclaw plugins install` executa
|
||||
`npm install --ignore-scripts` (sem scripts de ciclo de vida). Mantenha as árvores de dependência
|
||||
de plugin em JS/TS puro e evite pacotes que exijam builds em `postinstall`.
|
||||
Para instalações vindas do npm, `openclaw plugins install` executa
|
||||
`npm install --ignore-scripts` (sem scripts de ciclo de vida). Mantenha as árvores
|
||||
de dependências do Plugin em JS/TS puro e evite pacotes que exijam builds em `postinstall`.
|
||||
</Info>
|
||||
|
||||
## Relacionado
|
||||
|
||||
- [SDK Entry Points](/pt-BR/plugins/sdk-entrypoints) -- `definePluginEntry` e `defineChannelPluginEntry`
|
||||
- [Plugin Manifest](/pt-BR/plugins/manifest) -- referência completa do schema de manifesto
|
||||
- [Building Plugins](/pt-BR/plugins/building-plugins) -- guia passo a passo de primeiros passos
|
||||
- [Pontos de entrada do SDK](/pt-BR/plugins/sdk-entrypoints) -- `definePluginEntry` e `defineChannelPluginEntry`
|
||||
- [Manifesto do Plugin](/pt-BR/plugins/manifest) -- referência completa do esquema do manifesto
|
||||
- [Criando Plugins](/pt-BR/plugins/building-plugins) -- guia passo a passo para começar
|
||||
|
||||
@ -1,29 +1,28 @@
|
||||
---
|
||||
read_when:
|
||||
- Você está escrevendo testes para um plugin
|
||||
- Você precisa de utilitários de teste do SDK de plugin
|
||||
- Você quer entender testes de contrato para plugins empacotados
|
||||
- Você está escrevendo testes para um Plugin
|
||||
- Você precisa de utilitários de teste do SDK de Plugin
|
||||
- Você quer entender os testes de contrato para plugins empacotados
|
||||
sidebarTitle: Testing
|
||||
summary: Utilitários e padrões de teste para plugins do OpenClaw
|
||||
title: Testes de Plugin
|
||||
title: Teste de Plugin
|
||||
x-i18n:
|
||||
generated_at: "2026-04-05T12:49:56Z"
|
||||
generated_at: "2026-04-15T19:41:42Z"
|
||||
model: gpt-5.4
|
||||
provider: openai
|
||||
source_hash: 2e95ed58ed180feadad17bb5138bd09e3b45f1f3ecdff4e2fba4874bb80099fe
|
||||
source_hash: 2f75bd3f3b5ba34b05786e0dd96d493c36db73a1d258998bf589e27e45c0bd09
|
||||
source_path: plugins/sdk-testing.md
|
||||
workflow: 15
|
||||
---
|
||||
|
||||
# Testes de Plugin
|
||||
# Teste de Plugin
|
||||
|
||||
Referência para utilitários de teste, padrões e aplicação de lint para
|
||||
plugins do OpenClaw.
|
||||
Referência para utilitários de teste, padrões e aplicação de lint para plugins do OpenClaw.
|
||||
|
||||
<Tip>
|
||||
**Procurando exemplos de teste?** Os guias práticos incluem exemplos de teste completos:
|
||||
[Testes de plugin de canal](/plugins/sdk-channel-plugins#step-6-test) e
|
||||
[Testes de plugin de provedor](/plugins/sdk-provider-plugins#step-6-test).
|
||||
[Testes de Plugin de canal](/pt-BR/plugins/sdk-channel-plugins#step-6-test) e
|
||||
[Testes de Plugin de provedor](/pt-BR/plugins/sdk-provider-plugins#step-6-test).
|
||||
</Tip>
|
||||
|
||||
## Utilitários de teste
|
||||
@ -42,11 +41,11 @@ import {
|
||||
|
||||
### Exportações disponíveis
|
||||
|
||||
| Exportação | Finalidade |
|
||||
| ------------------------------------- | ------------------------------------------------------ |
|
||||
| `installCommonResolveTargetErrorCases` | Casos de teste compartilhados para tratamento de erros de resolução de destino |
|
||||
| `shouldAckReaction` | Verifica se um canal deve adicionar uma reação de ack |
|
||||
| `removeAckReactionAfterReply` | Remove a reação de ack após a entrega da resposta |
|
||||
| Export | Propósito |
|
||||
| -------------------------------------- | -------------------------------------------------------- |
|
||||
| `installCommonResolveTargetErrorCases` | Casos de teste compartilhados para tratamento de erros de resolução de alvo |
|
||||
| `shouldAckReaction` | Verifica se um canal deve adicionar uma reação de confirmação |
|
||||
| `removeAckReactionAfterReply` | Remove a reação de confirmação após a entrega da resposta |
|
||||
|
||||
### Tipos
|
||||
|
||||
@ -63,10 +62,9 @@ import type {
|
||||
} from "openclaw/plugin-sdk/testing";
|
||||
```
|
||||
|
||||
## Testando a resolução de destino
|
||||
## Testando a resolução de alvo
|
||||
|
||||
Use `installCommonResolveTargetErrorCases` para adicionar casos de erro padrão para
|
||||
resolução de destino de canal:
|
||||
Use `installCommonResolveTargetErrorCases` para adicionar casos de erro padrão para resolução de alvo do canal:
|
||||
|
||||
```typescript
|
||||
import { describe } from "vitest";
|
||||
@ -90,7 +88,7 @@ describe("my-channel target resolution", () => {
|
||||
|
||||
## Padrões de teste
|
||||
|
||||
### Testando unitariamente um plugin de canal
|
||||
### Teste unitário de um Plugin de canal
|
||||
|
||||
```typescript
|
||||
import { describe, it, expect, vi } from "vitest";
|
||||
@ -126,7 +124,7 @@ describe("my-channel plugin", () => {
|
||||
});
|
||||
```
|
||||
|
||||
### Testando unitariamente um plugin de provedor
|
||||
### Teste unitário de um Plugin de provedor
|
||||
|
||||
```typescript
|
||||
import { describe, it, expect } from "vitest";
|
||||
@ -154,15 +152,18 @@ describe("my-provider plugin", () => {
|
||||
});
|
||||
```
|
||||
|
||||
### Simulando o runtime do plugin
|
||||
### Mockando o runtime do Plugin
|
||||
|
||||
Para código que usa `createPluginRuntimeStore`, simule o runtime nos testes:
|
||||
Para código que usa `createPluginRuntimeStore`, faça mock do runtime nos testes:
|
||||
|
||||
```typescript
|
||||
import { createPluginRuntimeStore } from "openclaw/plugin-sdk/runtime-store";
|
||||
import type { PluginRuntime } from "openclaw/plugin-sdk/runtime-store";
|
||||
|
||||
const store = createPluginRuntimeStore<PluginRuntime>("test runtime not set");
|
||||
const store = createPluginRuntimeStore<PluginRuntime>({
|
||||
pluginId: "test-plugin",
|
||||
errorMessage: "test runtime not set",
|
||||
});
|
||||
|
||||
// In test setup
|
||||
const mockRuntime = {
|
||||
@ -198,7 +199,7 @@ client.sendMessage = vi.fn().mockResolvedValue({ id: "msg-1" });
|
||||
|
||||
## Testes de contrato (plugins no repositório)
|
||||
|
||||
Plugins empacotados têm testes de contrato que verificam a propriedade de registro:
|
||||
Plugins empacotados têm testes de contrato que verificam a propriedade do registro:
|
||||
|
||||
```bash
|
||||
pnpm test -- src/plugins/contracts/
|
||||
@ -213,13 +214,13 @@ Esses testes verificam:
|
||||
|
||||
### Executando testes com escopo
|
||||
|
||||
Para um plugin específico:
|
||||
Para um Plugin específico:
|
||||
|
||||
```bash
|
||||
pnpm test -- <bundled-plugin-root>/my-channel/
|
||||
```
|
||||
|
||||
Apenas para testes de contrato:
|
||||
Somente para testes de contrato:
|
||||
|
||||
```bash
|
||||
pnpm test -- src/plugins/contracts/shape.contract.test.ts
|
||||
@ -235,12 +236,11 @@ Três regras são aplicadas por `pnpm check` para plugins no repositório:
|
||||
2. **Sem importações diretas de `src/`** -- plugins não podem importar `../../src/` diretamente
|
||||
3. **Sem autoimportações** -- plugins não podem importar seu próprio subcaminho `plugin-sdk/<name>`
|
||||
|
||||
Plugins externos não estão sujeitos a essas regras de lint, mas seguir os mesmos
|
||||
padrões é recomendado.
|
||||
Plugins externos não estão sujeitos a essas regras de lint, mas seguir os mesmos padrões é recomendado.
|
||||
|
||||
## Configuração de teste
|
||||
|
||||
O OpenClaw usa Vitest com limites de cobertura V8. Para testes de plugin:
|
||||
O OpenClaw usa Vitest com limites de cobertura do V8. Para testes de Plugin:
|
||||
|
||||
```bash
|
||||
# Run all tests
|
||||
@ -262,9 +262,9 @@ Se as execuções locais causarem pressão de memória:
|
||||
OPENCLAW_VITEST_MAX_WORKERS=1 pnpm test
|
||||
```
|
||||
|
||||
## Relacionado
|
||||
## Relacionados
|
||||
|
||||
- [Visão geral do SDK](/plugins/sdk-overview) -- convenções de importação
|
||||
- [SDK Channel Plugins](/plugins/sdk-channel-plugins) -- interface de plugin de canal
|
||||
- [SDK Provider Plugins](/plugins/sdk-provider-plugins) -- hooks de plugin de provedor
|
||||
- [Criando Plugins](/plugins/building-plugins) -- guia de introdução
|
||||
- [Visão geral do SDK](/pt-BR/plugins/sdk-overview) -- convenções de importação
|
||||
- [SDK de Plugins de canal](/pt-BR/plugins/sdk-channel-plugins) -- interface de Plugin de canal
|
||||
- [SDK de Plugins de provedor](/pt-BR/plugins/sdk-provider-plugins) -- hooks de Plugin de provedor
|
||||
- [Criando Plugins](/pt-BR/plugins/building-plugins) -- guia de introdução
|
||||
|
||||
@ -1,53 +1,67 @@
|
||||
---
|
||||
read_when:
|
||||
- Explicando o uso de tokens, custos ou janelas de contexto
|
||||
- Depurando o crescimento do contexto ou o comportamento de compactação
|
||||
summary: Como o OpenClaw monta o contexto do prompt e informa o uso de tokens + custos
|
||||
title: Uso de tokens e custos
|
||||
- Depurando o crescimento do contexto ou o comportamento de Compaction
|
||||
summary: Como o OpenClaw constrói o contexto do prompt e informa o uso de tokens + custos
|
||||
title: Uso de Tokens e Custos
|
||||
x-i18n:
|
||||
generated_at: "2026-04-12T05:33:21Z"
|
||||
generated_at: "2026-04-15T19:42:06Z"
|
||||
model: gpt-5.4
|
||||
provider: openai
|
||||
source_hash: f8c856549cd28b8364a640e6fa9ec26aa736895c7a993e96cbe85838e7df2dfb
|
||||
source_hash: 9a706d3df8b2ea1136b3535d216c6b358e43aee2a31a4759824385e1345e6fe5
|
||||
source_path: reference/token-use.md
|
||||
workflow: 15
|
||||
---
|
||||
|
||||
# Uso de tokens e custos
|
||||
|
||||
O OpenClaw rastreia **tokens**, não caracteres. Os tokens são específicos de cada modelo, mas a maioria dos
|
||||
modelos no estilo OpenAI tem uma média de ~4 caracteres por token em texto em inglês.
|
||||
O OpenClaw rastreia **tokens**, não caracteres. Os tokens são específicos de cada modelo, mas a maioria dos modelos no estilo OpenAI tem média de ~4 caracteres por token para texto em inglês.
|
||||
|
||||
## Como o prompt do sistema é montado
|
||||
## Como o prompt do sistema é construído
|
||||
|
||||
O OpenClaw monta seu próprio prompt do sistema em cada execução. Ele inclui:
|
||||
|
||||
- Lista de ferramentas + descrições curtas
|
||||
- Lista de Skills (somente metadados; as instruções são carregadas sob demanda com `read`)
|
||||
- Lista de Skills (somente metadados; as instruções são carregadas sob demanda com `read`).
|
||||
O bloco compacto de Skills é limitado por `skills.limits.maxSkillsPromptChars`,
|
||||
com substituição opcional por agente em
|
||||
`agents.list[].skillsLimits.maxSkillsPromptChars`.
|
||||
- Instruções de autoatualização
|
||||
- Arquivos de workspace + bootstrap (`AGENTS.md`, `SOUL.md`, `TOOLS.md`, `IDENTITY.md`, `USER.md`, `HEARTBEAT.md`, `BOOTSTRAP.md` quando novo, além de `MEMORY.md` quando presente ou `memory.md` como fallback em minúsculas). Arquivos grandes são truncados por `agents.defaults.bootstrapMaxChars` (padrão: 20000), e a injeção total de bootstrap é limitada por `agents.defaults.bootstrapTotalMaxChars` (padrão: 150000). Arquivos diários `memory/*.md` não fazem parte do prompt bootstrap normal; eles permanecem sob demanda por meio de ferramentas de memória em turnos comuns, mas `/new` e `/reset` sem nenhum argumento podem prefixar um bloco único de contexto de inicialização com memória diária recente para esse primeiro turno. Esse prelúdio de inicialização é controlado por `agents.defaults.startupContext`.
|
||||
- Arquivos do workspace + bootstrap (`AGENTS.md`, `SOUL.md`, `TOOLS.md`, `IDENTITY.md`, `USER.md`, `HEARTBEAT.md`, `BOOTSTRAP.md` quando novo, além de `MEMORY.md` quando presente ou `memory.md` como alternativa em minúsculas). Arquivos grandes são truncados por `agents.defaults.bootstrapMaxChars` (padrão: 12000), e a injeção total de bootstrap é limitada por `agents.defaults.bootstrapTotalMaxChars` (padrão: 60000). Arquivos diários `memory/*.md` não fazem parte do prompt de bootstrap normal; eles permanecem sob demanda via ferramentas de memória em turnos comuns, mas `/new` e `/reset` sem argumentos podem prefixar um bloco único de contexto de inicialização com memória diária recente para esse primeiro turno. Esse prelúdio de inicialização é controlado por `agents.defaults.startupContext`.
|
||||
- Hora (UTC + fuso horário do usuário)
|
||||
- Tags de resposta + comportamento de heartbeat
|
||||
- Tags de resposta + comportamento de Heartbeat
|
||||
- Metadados de runtime (host/OS/model/thinking)
|
||||
|
||||
Veja o detalhamento completo em [Prompt do sistema](/pt-BR/concepts/system-prompt).
|
||||
Veja a análise completa em [Prompt do sistema](/pt-BR/concepts/system-prompt).
|
||||
|
||||
## O que conta na janela de contexto
|
||||
|
||||
Tudo o que o modelo recebe conta para o limite de contexto:
|
||||
|
||||
- Prompt do sistema (todas as seções listadas acima)
|
||||
- Histórico da conversa (mensagens do usuário + assistente)
|
||||
- Chamadas de ferramentas e resultados de ferramentas
|
||||
- Histórico da conversa (mensagens do usuário + do assistente)
|
||||
- Chamadas de ferramenta e resultados de ferramenta
|
||||
- Anexos/transcrições (imagens, áudio, arquivos)
|
||||
- Resumos de compactação e artefatos de poda
|
||||
- Resumos de Compaction e artefatos de poda
|
||||
- Wrappers do provedor ou cabeçalhos de segurança (não visíveis, mas ainda contabilizados)
|
||||
|
||||
Para imagens, o OpenClaw reduz a escala das cargas de imagens de transcrição/ferramentas antes das chamadas ao provedor.
|
||||
Algumas superfícies pesadas de runtime têm seus próprios limites explícitos:
|
||||
|
||||
- `agents.defaults.contextLimits.memoryGetMaxChars`
|
||||
- `agents.defaults.contextLimits.memoryGetDefaultLines`
|
||||
- `agents.defaults.contextLimits.toolResultMaxChars`
|
||||
- `agents.defaults.contextLimits.postCompactionMaxChars`
|
||||
|
||||
As substituições por agente ficam em `agents.list[].contextLimits`. Esses ajustes são
|
||||
para trechos limitados de runtime e blocos injetados de propriedade do runtime. Eles são
|
||||
separados dos limites de bootstrap, dos limites de contexto de inicialização e dos
|
||||
limites do prompt de Skills.
|
||||
|
||||
Para imagens, o OpenClaw reduz a escala de cargas de imagem de transcrição/ferramenta antes das chamadas ao provedor.
|
||||
Use `agents.defaults.imageMaxDimensionPx` (padrão: `1200`) para ajustar isso:
|
||||
|
||||
- Valores menores geralmente reduzem o uso de vision tokens e o tamanho da carga.
|
||||
- Valores maiores preservam mais detalhes visuais para OCR/capturas de tela com muita interface.
|
||||
- Valores menores normalmente reduzem o uso de vision tokens e o tamanho da carga.
|
||||
- Valores maiores preservam mais detalhes visuais para capturas de tela com muito OCR/UI.
|
||||
|
||||
Para uma análise prática (por arquivo injetado, ferramentas, Skills e tamanho do prompt do sistema), use `/context list` ou `/context detail`. Veja [Contexto](/pt-BR/concepts/context).
|
||||
|
||||
@ -55,9 +69,9 @@ Para uma análise prática (por arquivo injetado, ferramentas, Skills e tamanho
|
||||
|
||||
Use estes comandos no chat:
|
||||
|
||||
- `/status` → **cartão de status rico em emojis** com o modelo da sessão, uso de contexto,
|
||||
- `/status` → **cartão de status rico em emoji** com o modelo da sessão, uso de contexto,
|
||||
tokens de entrada/saída da última resposta e **custo estimado** (somente chave de API).
|
||||
- `/usage off|tokens|full` → adiciona um **rodapé de uso por resposta** a cada resposta.
|
||||
- `/usage off|tokens|full` → acrescenta um **rodapé de uso por resposta** a cada resposta.
|
||||
- Persiste por sessão (armazenado como `responseUsage`).
|
||||
- Autenticação OAuth **oculta o custo** (somente tokens).
|
||||
- `/usage cost` → mostra um resumo local de custos a partir dos logs de sessão do OpenClaw.
|
||||
@ -66,67 +80,64 @@ Outras superfícies:
|
||||
|
||||
- **TUI/Web TUI:** `/status` + `/usage` são compatíveis.
|
||||
- **CLI:** `openclaw status --usage` e `openclaw channels list` mostram
|
||||
janelas de cota normalizadas do provedor (`X% restantes`, não custos por resposta).
|
||||
janelas de cota normalizadas do provedor (`X% restante`, não custos por resposta).
|
||||
Provedores atuais com janela de uso: Anthropic, GitHub Copilot, Gemini CLI,
|
||||
OpenAI Codex, MiniMax, Xiaomi e z.ai.
|
||||
|
||||
As superfícies de uso normalizam aliases comuns de campos nativos do provedor antes da exibição.
|
||||
Para tráfego OpenAI-family Responses, isso inclui tanto `input_tokens` /
|
||||
`output_tokens` quanto `prompt_tokens` / `completion_tokens`, para que nomes de campos
|
||||
específicos do transporte não alterem `/status`, `/usage` ou resumos de sessão.
|
||||
O uso de JSON do Gemini CLI também é normalizado: o texto da resposta vem de `response`, e
|
||||
As superfícies de uso normalizam aliases comuns de campos nativos de provedores antes da exibição.
|
||||
Para tráfego Responses da família OpenAI, isso inclui tanto `input_tokens` /
|
||||
`output_tokens` quanto `prompt_tokens` / `completion_tokens`, de forma que nomes de campos específicos do transporte
|
||||
não alterem `/status`, `/usage` ou os resumos da sessão.
|
||||
O uso JSON do Gemini CLI também é normalizado: o texto da resposta vem de `response`, e
|
||||
`stats.cached` é mapeado para `cacheRead`, com `stats.input_tokens - stats.cached`
|
||||
usado quando a CLI omite um campo explícito `stats.input`.
|
||||
Para tráfego nativo OpenAI-family Responses, aliases de uso em WebSocket/SSE são
|
||||
normalizados da mesma forma, e os totais usam como fallback entrada + saída normalizadas quando
|
||||
usado quando a CLI omite um campo `stats.input` explícito.
|
||||
Para tráfego Responses nativo da família OpenAI, aliases de uso de WebSocket/SSE são
|
||||
normalizados da mesma forma, e os totais recorrem a entrada + saída normalizadas quando
|
||||
`total_tokens` está ausente ou é `0`.
|
||||
Quando o snapshot da sessão atual é esparso, `/status` e `session_status` também podem
|
||||
recuperar contadores de tokens/cache e o rótulo do modelo de runtime ativo do log de uso
|
||||
da transcrição mais recente. Valores ativos não zero existentes ainda têm precedência sobre
|
||||
valores de fallback da transcrição, e totais maiores da transcrição orientados a prompt
|
||||
recuperar contadores de tokens/cache e o rótulo do modelo de runtime ativo do log de uso da transcrição mais recente. Valores ativos diferentes de zero ainda têm precedência sobre valores de fallback da transcrição, e totais de transcrição maiores orientados a prompt
|
||||
podem prevalecer quando os totais armazenados estão ausentes ou são menores.
|
||||
A autenticação de uso para janelas de cota do provedor vem de hooks específicos do provedor quando
|
||||
disponíveis; caso contrário, o OpenClaw usa como fallback a correspondência de credenciais OAuth/chave de API
|
||||
disponíveis; caso contrário, o OpenClaw recorre à correspondência de credenciais OAuth/chave de API
|
||||
de perfis de autenticação, env ou config.
|
||||
|
||||
## Estimativa de custo (quando exibida)
|
||||
|
||||
Os custos são estimados a partir da configuração de preços do seu modelo:
|
||||
Os custos são estimados com base na sua configuração de preços do modelo:
|
||||
|
||||
```
|
||||
models.providers.<provider>.models[].cost
|
||||
```
|
||||
|
||||
Esses valores são **USD por 1M de tokens** para `input`, `output`, `cacheRead` e
|
||||
`cacheWrite`. Se o preço estiver ausente, o OpenClaw mostrará apenas os tokens. Tokens OAuth
|
||||
nunca mostram custo em dólar.
|
||||
`cacheWrite`. Se o preço estiver ausente, o OpenClaw mostrará apenas tokens. Tokens OAuth
|
||||
nunca mostram custo em dólares.
|
||||
|
||||
## Impacto de TTL de cache e poda
|
||||
## Impacto do TTL de cache e da poda
|
||||
|
||||
O cache de prompt do provedor só se aplica dentro da janela de TTL do cache. O OpenClaw pode
|
||||
executar opcionalmente a **poda por cache-ttl**: ele poda a sessão assim que o TTL do cache
|
||||
expira e, em seguida, redefine a janela de cache para que solicitações subsequentes possam reutilizar o
|
||||
contexto recém-cacheado em vez de colocar todo o histórico em cache novamente. Isso mantém os custos
|
||||
de escrita em cache mais baixos quando uma sessão fica ociosa além do TTL.
|
||||
executar opcionalmente **cache-ttl pruning**: ele faz a poda da sessão quando o TTL do cache
|
||||
expira e então redefine a janela de cache para que solicitações subsequentes possam reutilizar
|
||||
o contexto recém-cacheado em vez de recachear o histórico completo. Isso mantém os custos de
|
||||
gravação em cache mais baixos quando uma sessão fica ociosa além do TTL.
|
||||
|
||||
Configure isso em [Configuração do Gateway](/pt-BR/gateway/configuration) e veja os
|
||||
detalhes do comportamento em [Poda de sessão](/pt-BR/concepts/session-pruning).
|
||||
|
||||
Heartbeat pode manter o cache **aquecido** durante intervalos de inatividade. Se o TTL do cache
|
||||
do seu modelo for `1h`, definir o intervalo de heartbeat logo abaixo disso (por exemplo, `55m`) pode evitar
|
||||
recolocar todo o prompt em cache, reduzindo os custos de escrita em cache.
|
||||
O Heartbeat pode manter o cache **aquecido** durante períodos de inatividade. Se o TTL de cache
|
||||
do seu modelo for `1h`, definir o intervalo de Heartbeat um pouco abaixo disso (por exemplo, `55m`) pode evitar
|
||||
o recacheamento do prompt completo, reduzindo os custos de gravação em cache.
|
||||
|
||||
Em configurações multiagente, você pode manter uma configuração de modelo compartilhada e ajustar o comportamento
|
||||
de cache por agente com `agents.list[].params.cacheRetention`.
|
||||
Em configurações com vários agentes, você pode manter uma configuração de modelo compartilhada e ajustar o comportamento do cache
|
||||
por agente com `agents.list[].params.cacheRetention`.
|
||||
|
||||
Para um guia completo de cada ajuste, veja [Prompt Caching](/pt-BR/reference/prompt-caching).
|
||||
Para um guia completo parâmetro por parâmetro, veja [Prompt Caching](/pt-BR/reference/prompt-caching).
|
||||
|
||||
Para preços da API Anthropic, leituras de cache são significativamente mais baratas do que
|
||||
tokens de entrada, enquanto gravações em cache são cobradas com um multiplicador maior. Veja os preços
|
||||
de prompt caching da Anthropic para as taxas e multiplicadores de TTL mais recentes:
|
||||
Para preços da API Anthropic, leituras de cache são significativamente mais baratas que
|
||||
tokens de entrada, enquanto gravações em cache são cobradas com um multiplicador maior. Veja os preços de prompt caching da Anthropic para as tarifas e multiplicadores de TTL mais recentes:
|
||||
[https://docs.anthropic.com/docs/build-with-claude/prompt-caching](https://docs.anthropic.com/docs/build-with-claude/prompt-caching)
|
||||
|
||||
### Exemplo: manter cache de 1h aquecido com heartbeat
|
||||
### Exemplo: manter o cache de 1h aquecido com Heartbeat
|
||||
|
||||
```yaml
|
||||
agents:
|
||||
@ -151,7 +162,7 @@ agents:
|
||||
models:
|
||||
"anthropic/claude-opus-4-6":
|
||||
params:
|
||||
cacheRetention: "long" # linha de base padrão para a maioria dos agentes
|
||||
cacheRetention: "long" # baseline padrão para a maioria dos agentes
|
||||
list:
|
||||
- id: "research"
|
||||
default: true
|
||||
@ -162,13 +173,13 @@ agents:
|
||||
cacheRetention: "none" # evita gravações em cache para notificações intermitentes
|
||||
```
|
||||
|
||||
`agents.list[].params` é mesclado sobre `params` do modelo selecionado, então você pode
|
||||
`agents.list[].params` é mesclado sobre os `params` do modelo selecionado, então você pode
|
||||
substituir apenas `cacheRetention` e herdar os outros padrões do modelo sem alterações.
|
||||
|
||||
### Exemplo: habilitar o cabeçalho beta de contexto 1M da Anthropic
|
||||
### Exemplo: ativar o cabeçalho beta de contexto 1M da Anthropic
|
||||
|
||||
A janela de contexto de 1M da Anthropic atualmente é controlada por beta. O OpenClaw pode injetar o
|
||||
valor `anthropic-beta` necessário quando você habilita `context1m` em modelos Opus
|
||||
valor `anthropic-beta` necessário quando você ativa `context1m` em modelos Opus
|
||||
ou Sonnet compatíveis.
|
||||
|
||||
```yaml
|
||||
@ -182,7 +193,7 @@ agents:
|
||||
|
||||
Isso é mapeado para o cabeçalho beta `context-1m-2025-08-07` da Anthropic.
|
||||
|
||||
Isso só se aplica quando `context1m: true` está definido nessa entrada de modelo.
|
||||
Isso só se aplica quando `context1m: true` está definido nessa entrada do modelo.
|
||||
|
||||
Requisito: a credencial deve ser elegível para uso de contexto longo. Caso contrário,
|
||||
a Anthropic responde com um erro de limite de taxa do lado do provedor para essa solicitação.
|
||||
@ -194,9 +205,9 @@ rejeita essa combinação com HTTP 401.
|
||||
## Dicas para reduzir a pressão de tokens
|
||||
|
||||
- Use `/compact` para resumir sessões longas.
|
||||
- Corte saídas grandes de ferramentas nos seus fluxos de trabalho.
|
||||
- Reduza `agents.defaults.imageMaxDimensionPx` para sessões com muitas capturas de tela.
|
||||
- Reduza grandes saídas de ferramentas nos seus fluxos de trabalho.
|
||||
- Diminua `agents.defaults.imageMaxDimensionPx` para sessões com muitas capturas de tela.
|
||||
- Mantenha descrições de Skills curtas (a lista de Skills é injetada no prompt).
|
||||
- Prefira modelos menores para trabalho exploratório e verboso.
|
||||
|
||||
Veja [Skills](/pt-BR/tools/skills) para a fórmula exata de overhead da lista de Skills.
|
||||
Veja [Skills](/pt-BR/tools/skills) para a fórmula exata de sobrecarga da lista de Skills.
|
||||
|
||||
Loading…
Reference in New Issue
Block a user