chore(i18n): refresh pt-BR translations

This commit is contained in:
openclaw-docs-i18n[bot] 2026-04-15 05:37:39 +00:00
parent bd206dea30
commit 9884ecee1e
11 changed files with 2190 additions and 2087 deletions

View File

@ -5,26 +5,24 @@ read_when:
summary: Status do suporte ao Matrix, configuração inicial e exemplos de configuração
title: Matrix
x-i18n:
generated_at: "2026-04-09T01:29:34Z"
generated_at: "2026-04-15T05:33:50Z"
model: gpt-5.4
provider: openai
source_hash: 28fc13c7620c1152200315ae69c94205da6de3180c53c814dd8ce03b5cb1758f
source_hash: 631f6fdcfebc23136c1a66b04851a25c047535d13cceba5650b8b421bc3afcf8
source_path: channels/matrix.md
workflow: 15
---
# Matrix
O Matrix é um plugin de canal incluído no OpenClaw.
Matrix é um Plugin de canal incluído no 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
O Matrix vem como um plugin incluído nas versões atuais do OpenClaw, então builds
empacotadas normais não precisam de uma instalação separada.
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.
Se você estiver em uma build mais antiga ou em uma instalação personalizada que exclui o Matrix, instale-o
manualmente:
Se você estiver em uma compilação mais antiga ou em uma instalação personalizada que exclua o Matrix, instale-o manualmente:
Instale pelo npm:
@ -38,18 +36,18 @@ Instale a partir de um checkout local:
openclaw plugins install ./path/to/local/matrix-plugin
```
Veja [Plugins](/pt-BR/tools/plugin) para comportamento de plugins e regras de instalação.
Consulte [Plugins](/pt-BR/tools/plugin) para ver o comportamento dos plugins e as regras de instalação.
## Configuração inicial
1. Verifique se o plugin Matrix está disponível.
1. Verifique se o Plugin Matrix está 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.
3. Configure `channels.matrix` com um destes formatos:
3. Configure `channels.matrix` com um destes conjuntos:
- `homeserver` + `accessToken`, ou
- `homeserver` + `userId` + `password`.
4. Reinicie o gateway.
4. Reinicie o Gateway.
5. Inicie uma DM com o bot ou convide-o para uma sala.
- Convites novos do Matrix só funcionam quando `channels.matrix.autoJoin` os permite.
@ -60,35 +58,35 @@ openclaw channels add
openclaw configure --section channels
```
O assistente do Matrix pergunta por:
O assistente do Matrix solicita:
- URL do homeserver
- método de autenticação: token de acesso ou senha
- ID do usuário (apenas autenticação por senha)
- ID do usuário (somente autenticação por senha)
- nome do dispositivo opcional
- se deve ativar E2EE
- se deve configurar acesso à sala e entrada automática por convite
- se deve configurar acesso a salas e entrada automática por convite
Comportamentos principais 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 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` vira `ops-bot`.
- Entradas de allowlist de DM aceitam `@user:server` diretamente; nomes de exibição só funcionam quando a busca ativa no diretório encontra uma correspondência exata.
- Entradas de 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 de entrada automática por convite, use apenas destinos de convite estáveis: `!roomId:server`, `#alias:server` ou `*`. Nomes simples de salas são rejeitados.
- 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.
- 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"`.
<Warning>
`channels.matrix.autoJoin` tem como padrão `off`.
`channels.matrix.autoJoin` tem o 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 ou 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 nem em DMs por convite, 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 todo convite.
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 allowlist:
Exemplo de lista de permissões:
```json5
{
@ -106,7 +104,7 @@ Exemplo de allowlist:
}
```
Entrar em todo convite:
Entrar em todos os convites:
```json5
{
@ -151,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 descoberta de status do canal, mesmo que a autenticação atual não esteja definida diretamente na configuração.
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.
Equivalentes em variáveis de ambiente (usados quando a chave de configuração não está definida):
@ -181,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 pontuação nos IDs de conta para manter variáveis de ambiente com escopo sem colisões.
Por exemplo, `-` vira `_X2D_`, então `ops-prod` mapeia para `MATRIX_OPS_X2D_PROD_*`.
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 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 por DM, allowlist de sala e E2EE ativado:
Esta é uma configuração base prática com pareamento de DM, lista de permissões de sala e E2EE ativado:
```json5
{
@ -223,17 +221,13 @@ Esta é uma configuração base prática com pareamento por DM, allowlist de sal
}
```
`autoJoin` se aplica a todos os convites do Matrix, incluindo convites no estilo DM. O OpenClaw não consegue
classificar com confiabilidade uma sala convidada como DM ou grupo no momento do convite, então todos os convites passam por `autoJoin`
primeiro. `dm.policy` se aplica depois que o bot entra e a sala é classificada como DM.
`autoJoin` se aplica a todos os convites do Matrix, incluindo convites no estilo DM. O OpenClaw não consegue classificar com confiabilidade uma sala convidada como DM ou grupo no momento do convite, então todos os convites passam primeiro por `autoJoin`. `dm.policy` se aplica depois que o bot entra e a sala é classificada como DM.
## Prévias por streaming
## Prévias de streaming
O streaming de respostas no Matrix é opt-in.
O streaming de respostas do Matrix é opcional.
Defina `channels.matrix.streaming` como `"partial"` quando quiser que o OpenClaw envie uma única prévia ao vivo
da resposta, edite essa prévia no 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 terminar:
```json5
{
@ -245,29 +239,28 @@ finalize quando a resposta terminar:
}
```
- `streaming: "off"` é o padrão. O OpenClaw espera a resposta final e a envia uma 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 do Matrix de notificar primeiro a prévia, então clientes padrão podem notificar com base no primeiro texto da prévia transmitida em vez do bloco finalizado.
- `streaming: "quiet"` cria uma prévia silenciosa e editável para o bloco atual do assistente. Use isso apenas quando também configurar regras de push do destinatário para edições finalizadas da prévia.
- `blockStreaming: true` ativa mensagens separadas de progresso no Matrix. Com 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.
- Quando a prévia por streaming está ativada e `blockStreaming` está desativado, o Matrix edita o rascunho ao vivo no lugar e finaliza esse mesmo evento quando o bloco ou turno termina.
- Se a prévia não couber mais em um único evento do Matrix, o OpenClaw interrompe a prévia por streaming e volta para a entrega final normal.
- Respostas com mídia continuam enviando 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.
- `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.
- 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.
- 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` apenas se também quiser que blocos concluídos do assistente continuem visíveis como mensagens separadas de progresso.
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.
Se você precisa 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 apenas 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 baseado na primeira prévia 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.
### 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
a resposta final terminarem, defina `streaming: "quiet"` e adicione uma regra de push por usuário para edições finalizadas da prévia.
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.
Normalmente isso é uma configuração do usuário destinatário, não uma alteração global de configuração do homeserver:
Normalmente isso é uma configuração do usuário destinatário, não uma alteração de configuração global do homeserver:
Mapa rápido antes de começar:
@ -288,13 +281,12 @@ Mapa rápido antes de começar:
}
```
2. Certifique-se de que a conta destinatária já receba notificações push normais do Matrix. Regras para prévias silenciosas
só funcionam se esse usuário já tiver pushers/dispositivos funcionando.
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.
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.
- Reaproveitar o token de uma sessão existente do cliente normalmente é o mais fácil.
- Se precisar gerar um token novo, você pode fazer login pela API Client-Server padrão do Matrix:
- 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:
```bash
curl -sS -X POST \
@ -318,8 +310,7 @@ curl -sS \
"https://matrix.example.org/_matrix/client/v3/pushers"
```
Se isso retornar sem pushers/dispositivos ativos, corrija primeiro as notificações normais do Matrix antes de adicionar a
regra do OpenClaw abaixo.
Se isso retornar zero 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:
@ -329,7 +320,7 @@ O OpenClaw marca edições finalizadas de prévia somente de texto com:
}
```
5. Crie uma regra de push de override para cada conta destinatária que deve receber essas notificações:
5. Crie uma regra de push de substituição para cada conta destinatária que deve receber essas notificações:
```bash
curl -sS -X PUT \
@ -361,21 +352,21 @@ curl -sS -X PUT \
Substitua estes valores antes de executar o comando:
- `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 único para este bot para este usuário destinatário
- `@bot:example.org`: o MXID do seu bot Matrix do OpenClaw, não o MXID do usuário destinatário
- `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
- `@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:
- Regras de push são indexadas por `ruleId`. Executar `PUT` novamente contra o mesmo ID de regra atualiza essa regra.
- Se um usuário destinatário deve receber notificações de várias contas Matrix bot do OpenClaw, crie uma regra por bot com um ID de regra único para cada correspondência de remetente.
- 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.
- Um padrão simples é `openclaw-finalized-preview-<botname>`, como `openclaw-finalized-preview-ops` ou `openclaw-finalized-preview-support`.
A regra é avaliada em relação ao remetente do evento:
A regra é avaliada com base no remetente do evento:
- autentique com o token do usuário destinatário
- faça a correspondência de `sender` com o MXID do bot do OpenClaw
- faça a correspondência de `sender` com o MXID do bot OpenClaw
6. Verifique se a regra existe:
@ -385,10 +376,9 @@ curl -sS \
"https://matrix.example.org/_matrix/client/v3/pushrules/global/override/openclaw-finalized-preview-botname"
```
7. Teste uma resposta por streaming. No modo silencioso, a sala deve mostrar uma prévia silenciosa em rascunho e a
edição final no lugar deve notificar quando o bloco ou o 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 enviar uma notificação quando o bloco ou turno terminar.
Se precisar remover a regra depois, exclua esse mesmo ID de regra com o token do usuário destinatário:
Se você precisar remover a regra depois, exclua esse mesmo ID de regra com o token do usuário destinatário:
```bash
curl -sS -X DELETE \
@ -400,29 +390,29 @@ 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 consegue finalizar com segurança no lugar. Fallbacks de mídia e fallbacks de prévia antiga continuam usando a entrega normal do Matrix.
- Se `GET /_matrix/client/v3/pushers` não mostrar pushers, o usuário ainda não tem entrega push do Matrix funcionando para essa conta/dispositivo.
- 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.
- 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
No Synapse, a configuração acima normalmente já é suficiente por si só:
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, certifique-se de que `/_matrix/client/.../pushrules/` chegue corretamente ao Synapse.
- Se você executa workers do Synapse, certifique-se de que os pushers estejam 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, 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.
#### Tuwunel
Para Tuwunel, use o mesmo fluxo de configuração e a mesma chamada de API `pushrules` mostrada acima:
Para o Tuwunel, use o mesmo fluxo de configuração e a chamada de API `pushrules` mostrados acima:
- Nenhuma configuração específica do Tuwunel é necessária para o marcador de prévia finalizada em si.
- 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 envios push para outros dispositivos enquanto um dispositivo está ativo.
- 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.
## Salas bot para bot
Por padrão, mensagens Matrix de outras contas Matrix do OpenClaw configuradas são ignoradas.
Por padrão, mensagens do Matrix vindas de outras contas Matrix do OpenClaw configuradas são ignoradas.
Use `allowBots` quando você quiser intencionalmente tráfego Matrix entre agentes:
@ -441,19 +431,19 @@ Use `allowBots` quando você quiser intencionalmente tráfego Matrix entre agent
}
```
- `allowBots: true` aceita mensagens de outras contas Matrix bot configuradas em salas e DMs permitidas.
- `allowBots: "mentions"` aceita essas mensagens apenas quando mencionam visivelmente este bot em salas. DMs continuam permitidas.
- `groups.<room>.allowBots` substitui a configuração em nível de conta para uma sala.
- `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.
- `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 Matrix não expõe aqui uma sinalização nativa de bot; o OpenClaw trata "de autoria de bot" como "enviado por outra conta Matrix configurada neste gateway OpenClaw".
- 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 allowlists estritas de sala e exigências de menção ao ativar tráfego bot para bot em salas compartilhadas.
Use listas de permissões de sala estritas 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 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 o estado de E2EE automaticamente.
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.
Ative a criptografia:
Ativar criptografia:
```json5
{
@ -469,91 +459,89 @@ Ative a criptografia:
}
```
Verifique o status de verificação:
Verificar o status da verificação:
```bash
openclaw matrix verify status
```
Status detalhado (diagnóstico completo):
Status detalhado (diagnósticos completos):
```bash
openclaw matrix verify status --verbose
```
Inclua a chave de recuperação armazenada na saída legível por máquina:
Incluir a chave de recuperação armazenada na saída legível por máquina:
```bash
openclaw matrix verify status --include-recovery-key --json
```
Inicialize o estado de cross-signing e verificação:
Inicializar o estado de cross-signing e verificação:
```bash
openclaw matrix verify bootstrap
```
Diagnóstico detalhado de bootstrap:
Diagnósticos detalhados de bootstrap:
```bash
openclaw matrix verify bootstrap --verbose
```
Force uma redefinição nova da identidade de cross-signing antes do bootstrap:
Forçar uma redefinição nova da identidade de cross-signing antes do bootstrap:
```bash
openclaw matrix verify bootstrap --force-reset-cross-signing
```
Verifique este dispositivo com uma chave de recuperação:
Verificar este dispositivo com uma chave de recuperação:
```bash
openclaw matrix verify device "<your-recovery-key>"
```
Detalhes de verificação do dispositivo em modo detalhado:
Detalhes detalhados da verificação do dispositivo:
```bash
openclaw matrix verify device "<your-recovery-key>" --verbose
```
Verifique a integridade do backup de chaves de sala:
Verificar a integridade do backup de chaves de sala:
```bash
openclaw matrix verify backup status
```
Diagnóstico detalhado da integridade do backup:
Diagnósticos detalhados da integridade do backup:
```bash
openclaw matrix verify backup status --verbose
```
Restaure chaves de sala a partir do backup do servidor:
Restaurar chaves de sala do backup no servidor:
```bash
openclaw matrix verify backup restore
```
Diagnóstico detalhado da restauração:
Diagnósticos detalhados da restauração:
```bash
openclaw matrix verify backup restore --verbose
```
Exclua o backup atual no 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
inicializações frias futuras consigam carregar a nova chave de backup:
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:
```bash
openclaw matrix verify backup reset --yes
```
Todos os comandos `verify` são concisos por padrão (incluindo logs internos silenciosos do SDK) e mostram diagnósticos detalhados apenas com `--verbose`.
Use `--json` para saída completa legível por máquina ao automatizar.
Todos os comandos `verify` são concisos por padrão (incluindo logs internos silenciosos do SDK) e mostram diagnósticos detalhados com `--verbose`.
Use `--json` para saída completa legível por máquina ao criar scripts.
Em configurações com múltiplas contas, comandos de 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 `channels.matrix.defaultAccount` primeiro ou essas operações implícitas de CLI vão parar e pedir que você escolha uma conta explicitamente.
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.
Use `--account` sempre que quiser que operações de verificação ou de dispositivo tenham como alvo explicitamente uma conta nomeada:
```bash
@ -564,41 +552,38 @@ 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`.
### O que "verified" significa
### O que "verificado" significa
O OpenClaw trata este dispositivo Matrix como verificado apenas quando ele é verificado pela sua própria identidade de cross-signing.
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 relata o dispositivo como verificado via cross-signing
- `Signed by owner`: o dispositivo é assinado pela sua própria chave self-signing
- `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
`Verified by owner`passa a ser `yes` quando há verificação por cross-signing ou assinatura do proprietário.
Confiabilidade local sozinha não é suficiente para que o OpenClaw trate o dispositivo como totalmente verificado.
`Verified by owner`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.
### O que o bootstrap faz
`openclaw matrix verify bootstrap` é o comando de reparo e configuração para contas Matrix criptografadas.
Ele faz tudo o que segue nesta ordem:
Ele faz tudo o seguinte, nesta ordem:
- inicializa o armazenamento secreto, reaproveitando uma chave de recuperação existente quando possível
- inicializa o cross-signing e faz upload das chaves públicas de cross-signing ausentes
- tenta marcar e assinar via cross-signing o dispositivo atual
- cria um novo backup de chaves de sala no servidor se ainda não existir
- 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
Se o homeserver exigir autenticação interativa para fazer upload das chaves de cross-signing, o OpenClaw tenta o upload 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 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.
Use `--force-reset-cross-signing` apenas quando quiser intencionalmente descartar a identidade de cross-signing atual e criar uma nova.
Use `--force-reset-cross-signing` apenas quando você quiser intencionalmente descartar a identidade atual de cross-signing 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 quando aceitar que o histórico criptografado antigo irrecuperável continuará
indisponível e que o OpenClaw pode recriar o armazenamento secreto se o segredo atual do backup
não puder ser carregado com segurança.
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.
### Nova base de backup
Se você quiser manter mensagens criptografadas futuras funcionando e aceitar perder histórico antigo irrecuperável, execute estes comandos nesta ordem:
Se você quiser manter o funcionamento das futuras mensagens criptografadas e aceitar perder o histórico antigo irrecuperável, execute estes comandos em ordem:
```bash
openclaw matrix verify backup reset --yes
@ -611,42 +596,40 @@ Adicione `--account <id>` a cada comando quando quiser direcionar explicitamente
### 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 já houver uma pendente e aplicará um cooldown local antes de tentar novamente após reinicializações.
Tentativas de solicitação com falha são repetidas antes 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 repetição mais curta ou mais longa.
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.
A inicialização também executa automaticamente uma etapa conservadora de bootstrap de criptografia.
Essa etapa tenta primeiro reutilizar o armazenamento secreto 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.
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.
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 preserva essa identidade em vez de redefini-la automaticamente.
Se o dispositivo atual já estiver assinado pelo proprietário, o OpenClaw preserva essa identidade em vez de redefini-la automaticamente.
Veja [Migração do Matrix](/pt-BR/install/migrating-matrix) para o fluxo completo de atualização, limites, comandos de recuperação e mensagens comuns de migração.
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.
### Avisos de verificação
O Matrix publica avisos do ciclo de vida de verificação diretamente na DM estrita de verificação como mensagens `m.notice`.
O Matrix publica avisos do ciclo de vida da verificação diretamente na DM estrita de verificação como mensagens `m.notice`.
Isso inclui:
- avisos de solicitação de verificação
- avisos de verificação pronta (com orientação explícita "Verifique por emoji")
- avisos de início e conclusão da verificação
- detalhes de SAS (emoji e decimal) quando disponíveis
- detalhes 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 seu próprio lado.
Para solicitações de verificação de outro usuário/dispositivo Matrix, o OpenClaw aceita automaticamente a solicitação e depois espera que o fluxo SAS prossiga normalmente.
Você ainda precisa comparar o SAS em emoji ou decimal no seu cliente Matrix e confirmar "They match" lá para concluir a verificação.
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 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.
O OpenClaw não aceita automaticamente fluxos duplicados iniciados por ele mesmo sem critério. Na inicialização, ele evita criar uma nova solicitação quando já existe uma solicitação pendente de autoverificaçã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.
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`.
### Higiene de dispositivos
Dispositivos Matrix antigos gerenciados pelo OpenClaw podem se acumular na conta e tornar mais difícil entender a confiança em salas criptografadas.
Dispositivos Matrix antigos gerenciados pelo OpenClaw podem se acumular na conta e tornar a confiança em salas criptografadas mais difícil de entender.
Liste-os com:
```bash
@ -659,22 +642,22 @@ Remova dispositivos antigos gerenciados pelo OpenClaw com:
openclaw matrix devices prune-stale
```
### Armazenamento de criptografia
### Armazenamento criptográfico
O E2EE do Matrix usa o caminho oficial de criptografia Rust do `matrix-js-sdk` em Node, com `fake-indexeddb` como shim de IndexedDB. O estado de criptografia é 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.
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.
O estado de execução criptografado fica em raízes por conta, por usuário e por hash de token em
O estado criptografado em execução 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 sync (`bot-storage.json`), armazenamento de criptografia (`crypto/`),
Esse diretório contém o armazenamento de sincronização (`bot-storage.json`), armazenamento criptográfico (`crypto/`),
arquivo de chave de recuperação (`recovery-key.json`), snapshot do IndexedDB (`crypto-idb-snapshot.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 de conta/homeserver/usuário para que o estado anterior de sync, estado de criptografia, bindings de thread
vínculos 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.
## Gerenciamento de perfil
Atualize o perfil próprio do Matrix para a conta selecionada com:
Atualize o próprio perfil Matrix da conta selecionada com:
```bash
openclaw matrix profile set --name "OpenClaw Assistant"
@ -687,41 +670,41 @@ O Matrix aceita URLs de avatar `mxc://` diretamente. Quando você passa uma URL
## Threads
O Matrix oferece suporte a threads nativas do Matrix tanto para respostas automáticas quanto para envios com ferramentas de mensagem.
O Matrix oferece suporte a threads nativas do Matrix tanto para respostas automáticas quanto para envios da ferramenta de mensagem.
- `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 normal de DM e verificações de allowlist.
- Bindings explícitos de conversa 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 respostas no nível superior e mantém mensagens recebidas em thread na sessão pai.
- `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.
- `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 encaminha 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 planas.
- Mensagens recebidas em thread incluem a mensagem raiz da thread como contexto extra para o agente.
- Envios com ferramentas de mensagem herdam automaticamente a thread atual do Matrix quando o destino é a mesma sala, ou o mesmo alvo de usuário em DM, a menos que um `threadId` explícito seja fornecido.
- O reaproveitamento do mesmo alvo de usuário de 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 volta para o 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 de DM compartilhada do Matrix, ele publica um `m.notice` único nessa sala com a rota de escape `/focus` quando bindings de thread estão ativados e a dica `dm.sessionScope`.
- Bindings de thread em tempo de execução são suportados para 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 Matrix no nível superior cria uma nova thread Matrix e a vincula à sessão de destino quando `threadBindings.spawnSubagentSessions=true`.
- Executar `/focus` ou `/acp spawn --thread here` dentro de uma thread Matrix existente vincula essa thread atual.
- `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.
## Bindings de conversa ACP
## Vínculos de conversa ACP
Salas, DMs e threads Matrix existentes podem ser transformadas em workspaces ACP duráveis sem mudar a superfície de chat.
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.
Fluxo rápido do operador:
Fluxo rápido para 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 no nível superior, a DM/sala atual permanece como 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 lugar.
- 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 binding.
- `/acp close` fecha a sessão ACP e remove o vínculo.
Observações:
- `--bind here` não cria uma thread Matrix filha.
- `threadBindings.spawnAcpSessions` só é necessário para `/acp spawn --thread auto|here`, quando o OpenClaw precisa criar ou vincular uma thread Matrix filha.
- `--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 binding de thread
### Configuração de vínculo de thread
O Matrix herda padrões globais de `session.threadBindings` e também oferece suporte a substituições por canal:
@ -731,22 +714,22 @@ O Matrix herda padrões globais de `session.threadBindings` e também oferece su
- `threadBindings.spawnSubagentSessions`
- `threadBindings.spawnAcpSessions`
As flags de criação vinculada a thread no Matrix são opt-in:
Os 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 Matrix.
- Defina `threadBindings.spawnAcpSessions: true` para permitir que `/acp spawn --thread auto|here` vincule sessões ACP a threads Matrix.
- Defina `threadBindings.spawnSubagentSessions: true` para permitir que `/focus` no 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 recebidas.
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.
- O uso de reações de saída é controlado por `channels["matrix"].actions.reactions`.
- `react` adiciona uma reação a um evento Matrix específico.
- `reactions` lista o resumo atual de reações para um evento Matrix específico.
- `emoji=""` remove as reações da própria conta do bot nesse evento.
- `remove: true` remove apenas a reação do emoji especificado da conta do bot.
- A ferramenta de reação de saída é controlada 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.
- `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 de resolução das reações de confirmação segue a ordem padrão do OpenClaw:
O escopo das reações de confirmação é resolvido nesta ordem:
- `channels["matrix"].accounts.<accountId>.ackReaction`
- `channels["matrix"].ackReaction`
@ -769,26 +752,26 @@ 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 independentes 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 autônomas de `m.reaction`.
## Contexto de histórico
- `channels.matrix.historyLimit` controla quantas mensagens recentes da sala são incluídas como `InboundHistory` quando uma mensagem de sala no Matrix aciona o agente. Usa `messages.groupChat.historyLimit` como fallback; se ambos não estiverem definidos, o padrão efetivo é `0`. Defina `0` para desativar.
- O histórico de sala do Matrix é apenas 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 resposta, depois tira um snapshot dessa janela quando chega uma menção ou outro gatilho.
- A mensagem atual que acionou a resposta 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 de histórico original em vez de avançar para mensagens mais novas da sala.
- `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.
- 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.
## Visibilidade de contexto
O Matrix oferece suporte ao controle compartilhado `contextVisibility` para contexto suplementar da sala, como texto de resposta buscado, raízes de thread e histórico pendente.
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.
- `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 allowlist de sala/usuário.
- `contextVisibility: "allowlist"` filtra o contexto suplementar para remetentes permitidos pelas verificações ativas de lista de permissões 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 recebida pode acionar uma resposta.
A autorização do gatilho continua vindo de `groupPolicy`, `groups`, `groupAllowFrom` e das configurações de política de DM.
Essa configuração afeta a visibilidade do contexto suplementar, não se a própria mensagem de entrada pode acionar 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
@ -813,7 +796,7 @@ A autorização do gatilho continua vindo de `groupPolicy`, `groups`, `groupAllo
}
```
Veja [Grupos](/pt-BR/channels/groups) para comportamento de exigência de menção e allowlist.
Consulte [Groups](/pt-BR/channels/groups) para ver o comportamento de exigência de menção e lista de permissões.
Exemplo de pareamento para DMs do Matrix:
@ -824,17 +807,17 @@ 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.
Veja [Pareamento](/pt-BR/channels/pairing) para o fluxo compartilhado de pareamento por DM e layout de armazenamento.
Consulte [Pairing](/pt-BR/channels/pairing) para ver o fluxo compartilhado de pareamento de DM e o layout de armazenamento.
## Reparo de sala direta
## Reparo direto de sala
Se o estado de mensagem direta ficar fora 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 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:
```bash
openclaw matrix direct inspect --user-id @alice:example.org
```
Repare com:
Repare-o com:
```bash
openclaw matrix direct repair --user-id @alice:example.org
@ -843,30 +826,30 @@ 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 conectada com esse usuário
- 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
O fluxo de reparo não exclui salas antigas automaticamente. 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 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.
## Aprovações de exec
## Aprovações de execução
O Matrix pode atuar como um cliente nativo de aprovação para uma conta Matrix. Os controles nativos
de roteamento de DM/canal continuam ficando na configuração de aprovação de exec:
de roteamento de DM/canal ainda ficam sob a configuração de aprovação de execução:
- `channels.matrix.execApprovals.enabled`
- `channels.matrix.execApprovals.approvers` (opcional; usa `channels.matrix.dm.allowFrom` como fallback)
- `channels.matrix.execApprovals.approvers` (opcional; usa como fallback `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 aprovações nativas automaticamente quando `enabled` está sem definir ou `"auto"` e pelo menos um aprovador pode ser resolvido. Aprovações de exec usam primeiro o conjunto de aprovadores de `execApprovals.approvers` e podem usar `channels.matrix.dm.allowFrom` como fallback. 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 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.
O roteamento nativo do Matrix oferece suporte a ambos os tipos de aprovação:
- `channels.matrix.execApprovals.*` controla o modo nativo de distribuição 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 em `channels.matrix.dm.allowFrom`.
- Atalhos por reação e atualizações de mensagem do Matrix se aplicam tanto a aprovações de exec quanto a aprovações de plugin.
- `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.
Regras de entrega:
@ -874,23 +857,23 @@ Regras de entrega:
- `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
Prompts de aprovação do Matrix adicionam atalhos por reação na mensagem principal de aprovação:
Os 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 exec
- `♾️` = permitir sempre quando essa decisão for permitida pela política efetiva de execução
Aprovadores podem reagir nessa mensagem ou usar os comandos slash alternativos: `/approve <id> allow-once`, `/approve <id> allow-always` ou `/approve <id> deny`.
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`.
Apenas aprovadores resolvidos podem aprovar ou negar. Para aprovações de exec, a entrega em 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 execução, a entrega por canal inclui o texto do comando, então só ative `channel` ou `both` em salas confiáveis.
Substituição por conta:
- `channels.matrix.accounts.<account>.execApprovals`
Documentação relacionada: [Aprovações de exec](/pt-BR/tools/exec-approvals)
Documentação relacionada: [Aprovações de execução](/pt-BR/tools/exec-approvals)
## Múltiplas contas
## Várias contas
```json5
{
@ -920,23 +903,24 @@ Documentação relacionada: [Aprovações de exec](/pt-BR/tools/exec-approvals)
}
```
Valores de nível superior em `channels.matrix` atuam como padrões para contas nomeadas, a menos que uma conta os substitua.
Você pode aplicar entradas de sala herdadas a uma conta Matrix com `groups.<room>.account`.
Entradas sem `account` continuam compartilhadas entre todas as contas Matrix, e entradas com `account: "default"` continuam funcionando quando a conta padrão está configurada diretamente no nível superior em `channels.matrix.*`.
Padrões compartilhados parciais de autenticação não criam sozinhos uma conta padrão implícita separada. O OpenClaw só sintetiza a conta `default` de nível superior quando essa conta padrão tem autenticação válida (`homeserver` mais `accessToken`, ou `homeserver` mais `userId` e `password`); contas nomeadas ainda podem continuar detectáveis com `homeserver` mais `userId` quando credenciais em cache satisfazem a autenticação mais tarde.
Se o Matrix já tiver exatamente uma conta nomeada, ou se `defaultAccount` apontar para uma chave existente de conta nomeada, a promoção de reparo/configuração inicial de conta única para múltiplas 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, probing e operações de CLI.
Se você configurar várias contas nomeadas, defina `defaultAccount` ou passe `--account <id>` para comandos de CLI que dependem de seleção implícita de conta.
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.
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.
Passe `--account <id>` para `openclaw matrix verify ...` e `openclaw matrix devices ...` quando quiser substituir essa seleção implícita para um comando.
Veja [Referência de configuração](/pt-BR/gateway/configuration-reference#multi-account-all-channels) para o padrão compartilhado de múltiplas contas.
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.
## Homeservers privados/LAN
Por padrão, o OpenClaw bloqueia homeservers Matrix privados/internos para proteção contra SSRF, a menos que você
faça opt-in explicitamente por conta.
ative explicitamente essa permissão por conta.
Se seu homeserver roda em localhost, um IP de LAN/Tailscale ou um hostname interno, ative
Se seu homeserver estiver em localhost, em um IP de LAN/Tailscale ou em um nome de host interno, ative
`network.dangerouslyAllowPrivateNetwork` para essa conta Matrix:
```json5
@ -953,7 +937,7 @@ Se seu homeserver roda em localhost, um IP de LAN/Tailscale ou um hostname inter
}
```
Exemplo de configuração por CLI:
Exemplo de configuração pela CLI:
```bash
openclaw matrix account add \
@ -963,8 +947,8 @@ openclaw matrix account add \
--access-token syt_ops_xxx
```
Esse opt-in permite apenas destinos privados/internos confiáveis. Homeservers públicos em texto claro como
`http://matrix.example.org:8008` continuam bloqueados. Prefira `https://` sempre que possível.
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.
## Uso de proxy para tráfego Matrix
@ -983,85 +967,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 tempo de execução e para sondas de status da conta.
O OpenClaw usa a mesma configuração de proxy para tráfego Matrix em execução e para sondas de status da conta.
## Resolução de destino
O Matrix aceita estas formas de destino em qualquer lugar onde o OpenClaw peça um destino de sala ou usuário:
O Matrix aceita estes formatos de destino em qualquer lugar onde o OpenClaw pedir um destino 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 ativa em diretório usa a conta Matrix autenticada:
A busca ao vivo em diretório usa a conta Matrix autenticada:
- 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, depois recorrem à busca por nomes de salas já conectadas para essa conta.
- A busca por nome de sala conectada é best-effort. Se o nome de uma sala não puder ser resolvido para um ID ou alias, ele será ignorado pela resolução de allowlist em tempo de execução.
- 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.
## Referência de configuração
- `enabled`: ativa ou desativa o canal.
- `name`: rótulo opcional da conta.
- `defaultAccount`: ID de conta preferido quando várias contas Matrix estão configuradas.
- `name`: rótulo opcional para a conta.
- `defaultAccount`: ID de conta preferido quando várias contas Matrix estiverem 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 resolver para `localhost`, um IP de LAN/Tailscale ou um host interno como `matrix-synapse`.
- `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 de 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` em provedores env/file/exec. Veja [Gerenciamento de segredos](/pt-BR/gateway/secrets).
- `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).
- `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`.
- `initialSyncLimit`: número máximo de eventos buscados durante a sincronização na inicialização.
- `initialSyncLimit`: número máximo de eventos buscados durante a sincronização de inicialização.
- `encryption`: ativa E2EE.
- `allowlistOnly`: quando `true`, promove 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`.
- `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"`).
- `groupPolicy`: `open`, `allowlist` ou `disabled`.
- `contextVisibility`: modo de visibilidade do contexto suplementar 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 tempo de execução.
- `historyLimit`: máximo de mensagens da sala a incluir como contexto de histórico de grupo. Usa `messages.groupChat.historyLimit` como fallback; se ambos não estiverem definidos, o padrão efetivo é `0`. Defina `0` para desativar.
- `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.
- `replyToMode`: `off`, `first`, `all` ou `batched`.
- `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` equivale a `"off"`.
- `blockStreaming`: `true` ativa mensagens separadas de progresso para blocos concluídos do assistente enquanto o streaming de prévia em rascunho estiver ativo.
- `markdown`: configuração opcional de renderização de 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.
- `threadReplies`: `off`, `inbound` ou `always`.
- `threadBindings`: substituições por canal para roteamento e ciclo de vida de sessão vinculada a thread.
- `threadBindings`: substituições por canal para roteamento e ciclo de vida de sessão vinculados a thread.
- `startupVerification`: modo automático de solicitação de autoverificação na inicialização (`if-unverified`, `off`).
- `startupVerificationCooldownHours`: cooldown antes de repetir solicitações automáticas de verificação na inicialização.
- `textChunkLimit`: tamanho do bloco de mensagem de saída em caracteres (aplica-se quando `chunkMode` é `length`).
- `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`).
- `chunkMode`: `length` divide mensagens por contagem de caracteres; `newline` divide em limites de linha.
- `responsePrefix`: string opcional prefixada a todas as respostas de saída deste canal.
- `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`).
- `reactionNotifications`: modo de notificação de reação recebida (`own`, `off`).
- `mediaMaxMb`: limite de tamanho de mídia em MB para envios de saída e processamento de mídia recebida.
- `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.
- `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 entrou na sala e a classificou como DM. 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 via busca ativa 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 se o par for o mesmo.
- `dm.threadReplies`: substituição da política de thread apenas para DMs (`off`, `inbound`, `always`). Ela substitui a configuração de nível superior `threadReplies` tanto para posicionamento da resposta quanto para isolamento de sessão em DMs.
- `execApprovals`: entrega nativa de aprovação de exec no 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.
- `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.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.
- `execApprovals.target`: `dm | channel | both` (padrão: `dm`).
- `accounts`: substituições nomeadas por conta. Valores de nível superior em `channels.matrix` atuam como padrões para essas entradas.
- `groups`: mapa de políticas por sala. Prefira IDs ou aliases de sala; nomes de salas não resolvidos são ignorados em tempo de execução. 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 múltiplas contas.
- `groups.<room>.allowBots`: substituição em nível de sala para remetentes bot configurados (`true` ou `"mentions"`).
- `groups.<room>.users`: allowlist de remetentes por sala.
- `groups.<room>.tools`: substituições por sala de permitir/negar ferramentas.
- `groups.<room>.autoReply`: substituição em nível de sala para exigência de menção. `true` desativa exigências de menção para essa sala; `false` volta a forçá-las.
- `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.<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>.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.
- `rooms`: alias legado para `groups`.
- `actions`: controle por ação do uso de ferramentas (`messages`, `reactions`, `pins`, `profile`, `memberInfo`, `channelInfo`, `verification`).
- `actions`: controle por ação de ferramentas (`messages`, `reactions`, `pins`, `profile`, `memberInfo`, `channelInfo`, `verification`).
## Relacionado
- [Visão geral dos canais](/pt-BR/channels) — todos os canais compatíveis
- [Pareamento](/pt-BR/channels/pairing) — autenticação por DM e fluxo de pareamento
- [Grupos](/pt-BR/channels/groups) — comportamento de chat em grupo e exigência de 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 endurecimento
- [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

View File

@ -1,15 +1,15 @@
---
read_when:
- Você quer que a promoção de memória seja executada automaticamente
- Você quer entender o que cada fase do dreaming faz
- Você quer ajustar a consolidação sem poluir o `MEMORY.md`
summary: Consolidação de memória em segundo plano com fases leve, profunda e REM, além de um Diário de Sonhos
- Você quer entender o que cada fase de Dreaming faz
- Você quer ajustar a consolidação sem poluir `MEMORY.md`
summary: Consolidação da memória em segundo plano com fases leve, profunda e REM, além de um Diário de Sonhos
title: Dreaming (experimental)
x-i18n:
generated_at: "2026-04-09T01:27:43Z"
generated_at: "2026-04-15T05:33:47Z"
model: gpt-5.4
provider: openai
source_hash: 26476eddb8260e1554098a6adbb069cf7f5e284cf2e09479c6d9d8f8b93280ef
source_hash: 5882a5068f2eabe54ca9893184e5385330a432b921870c38626399ce11c31e25
source_path: concepts/dreaming.md
workflow: 15
---
@ -17,27 +17,27 @@ x-i18n:
# Dreaming (experimental)
Dreaming é o sistema de consolidação de memória em segundo plano no `memory-core`.
Ele ajuda o OpenClaw a mover sinais fortes de curto prazo para memória durável, enquanto
Ele ajuda o OpenClaw a mover sinais fortes de curto prazo para memória durável, ao mesmo tempo em que
mantém o processo explicável e revisável.
Dreaming é **opt-in** e fica desativado por padrão.
Dreaming é **opt-in** e vem desabilitado por padrão.
## O que o dreaming grava
## O que o Dreaming grava
O Dreaming mantém dois tipos de saída:
- **Estado da máquina** em `memory/.dreams/` (armazenamento de recall, sinais de fase, checkpoints de ingestão, locks).
- **Saída legível por humanos** em `DREAMS.md` (ou `dreams.md`, se já existir) e arquivos opcionais de relatório de fase em `memory/dreaming/<phase>/YYYY-MM-DD.md`.
- **Saída legível por humanos** em `DREAMS.md` (ou `dreams.md`, se já existir) e arquivos opcionais de relatório por fase em `memory/dreaming/<phase>/YYYY-MM-DD.md`.
A promoção para longo prazo ainda grava somente em `MEMORY.md`.
A promoção de longo prazo ainda grava apenas em `MEMORY.md`.
## Modelo de fases
Dreaming usa três fases cooperativas:
O Dreaming usa três fases cooperativas:
| Fase | Finalidade | Gravação durável |
| ----- | ---------- | ---------------- |
| Leve | Classificar e preparar material recente de curto prazo | Não |
| Leve | Organizar e preparar material recente de curto prazo | Não |
| Profunda | Pontuar e promover candidatos duráveis | Sim (`MEMORY.md`) |
| REM | Refletir sobre temas e ideias recorrentes | Não |
@ -46,7 +46,7 @@ separados configurados pelo usuário.
### Fase leve
A fase leve ingere sinais recentes de memória diária e rastros de recall, remove duplicatas
A fase leve ingere sinais recentes de memória diária e rastros de recall, remove duplicações
e prepara linhas candidatas.
- Lê do estado de recall de curto prazo, de arquivos recentes de memória diária e de transcrições de sessão redigidas, quando disponíveis.
@ -59,10 +59,10 @@ e prepara linhas candidatas.
A fase profunda decide o que se torna memória de longo prazo.
- Classifica candidatos usando pontuação ponderada e limites mínimos.
- Exige que `minScore`, `minRecallCount` e `minUniqueQueries` sejam atingidos.
- Reidrata trechos a partir de arquivos diários ativos antes de gravar, para que trechos obsoletos ou excluídos sejam ignorados.
- Exige que `minScore`, `minRecallCount` e `minUniqueQueries` sejam atendidos.
- Reidrata trechos a partir de arquivos diários ativos antes de gravar, portanto trechos desatualizados/excluídos são ignorados.
- Acrescenta entradas promovidas a `MEMORY.md`.
- Grava um resumo `## Deep Sleep` em `DREAMS.md` e, opcionalmente, grava em `memory/dreaming/deep/YYYY-MM-DD.md`.
- Grava um resumo `## Deep Sleep` em `DREAMS.md` e, opcionalmente, grava `memory/dreaming/deep/YYYY-MM-DD.md`.
### Fase REM
@ -75,63 +75,65 @@ A fase REM extrai padrões e sinais reflexivos.
## Ingestão de transcrições de sessão
Dreaming pode ingerir transcrições de sessão redigidas no corpus do dreaming. Quando
as transcrições estão disponíveis, elas são alimentadas na fase leve junto com sinais
de memória diária e rastros de recall. Conteúdo pessoal e sensível é redigido
O Dreaming pode ingerir transcrições de sessão redigidas no corpus de Dreaming. Quando
as transcrições estão disponíveis, elas são alimentadas na fase leve junto com sinais de
memória diária e rastros de recall. Conteúdo pessoal e sensível é redigido
antes da ingestão.
## Diário de Sonhos
Dreaming também mantém um **Diário de Sonhos** narrativo em `DREAMS.md`.
Depois que cada fase tem material suficiente, o `memory-core` executa uma rodada em segundo plano
de subagente em modo best-effort (usando o modelo de runtime padrão) e acrescenta uma entrada curta ao diário.
O Dreaming também mantém um **Diário de Sonhos** narrativo em `DREAMS.md`.
Depois que cada fase tem material suficiente, o `memory-core` executa uma rodada em segundo plano de subagente em modo best-effort
(usando o modelo padrão de runtime) e acrescenta uma entrada curta ao diário.
Este diário é para leitura humana na interface Dreams, não uma fonte de promoção.
Esse diário é para leitura humana na UI de Sonhos, não é uma fonte de promoção.
Artefatos de diário/relatório gerados pelo Dreaming são excluídos da
promoção de curto prazo. Apenas trechos de memória fundamentados são elegíveis para promoção para
`MEMORY.md`.
Também existe um fluxo fundamentado de preenchimento histórico para trabalho de revisão e recuperação:
Também existe uma trilha fundamentada de preenchimento retroativo histórico para trabalho de revisão e recuperação:
- `memory rem-harness --path ... --grounded` mostra uma prévia da saída fundamentada do diário a partir de notas históricas `YYYY-MM-DD.md`.
- `memory rem-backfill --path ...` grava entradas fundamentadas e reversíveis no diário em `DREAMS.md`.
- `memory rem-harness --path ... --grounded` pré-visualiza a saída fundamentada do diário a partir de notas históricas `YYYY-MM-DD.md`.
- `memory rem-backfill --path ...` grava entradas reversíveis fundamentadas do diário em `DREAMS.md`.
- `memory rem-backfill --path ... --stage-short-term` prepara candidatos duráveis fundamentados no mesmo armazenamento de evidências de curto prazo que a fase profunda normal já usa.
- `memory rem-backfill --rollback` e `--rollback-short-term` removem esses artefatos preparados de backfill sem tocar nas entradas normais do diário nem no recall ativo de curto prazo.
- `memory rem-backfill --rollback` e `--rollback-short-term` removem esses artefatos preparados de preenchimento retroativo sem tocar em entradas comuns do diário nem no recall ativo normal de curto prazo.
A Control UI expõe o mesmo fluxo de backfill/redefinição do diário para que você possa inspecionar
os resultados na cena Dreams antes de decidir se os candidatos fundamentados
merecem promoção. A cena também mostra uma faixa fundamentada distinta para que você veja
A UI de Controle expõe o mesmo fluxo de preenchimento retroativo/redefinição do diário para que você possa inspecionar
os resultados na cena de Sonhos antes de decidir se os candidatos fundamentados
merecem promoção. A cena também mostra uma trilha fundamentada distinta para que você possa ver
quais entradas preparadas de curto prazo vieram de replay histórico, quais itens promovidos
foram guiados por conteúdo fundamentado e limpe apenas as entradas preparadas exclusivamente fundamentadas sem
tocar no estado normal ativo de curto prazo.
foram conduzidos por conteúdo fundamentado e limpar apenas entradas preparadas exclusivamente fundamentadas sem
tocar no estado comum ativo de curto prazo.
## Sinais de classificação profunda
A classificação profunda usa seis sinais-base ponderados mais reforço de fase:
| Sinal | Peso | Descrição |
| ------ | ---- | --------- |
| ------------------- | ------ | ------------------------------------------------- |
| Frequência | 0.24 | Quantos sinais de curto prazo a entrada acumulou |
| Relevância | 0.30 | Qualidade média de recuperação da entrada |
| Diversidade de consultas | 0.15 | Contextos distintos de consulta/dia que a revelaram |
| Diversidade de consulta | 0.15 | Contextos distintos de consulta/dia que a trouxeram à tona |
| Recência | 0.15 | Pontuação de atualização com decaimento temporal |
| Consolidação | 0.10 | Força de recorrência em múltiplos dias |
| Riqueza conceitual | 0.06 | Densidade de tags conceituais do trecho/caminho |
| Consolidação | 0.10 | Força de recorrência em vários dias |
| Riqueza conceitual | 0.06 | Densidade de tags de conceito a partir do trecho/caminho |
Acertos das fases leve e REM adicionam um pequeno reforço com decaimento temporal a partir de
Acertos das fases leve e REM adicionam um pequeno impulso com decaimento de recência a partir de
`memory/.dreams/phase-signals.json`.
## Agendamento
Quando ativado, o `memory-core` gerencia automaticamente um job cron para uma varredura completa
de dreaming. Cada varredura executa as fases em ordem: leve -> REM -> profunda.
Quando habilitado, o `memory-core` gerencia automaticamente um trabalho de Cron para uma varredura completa de Dreaming. Cada varredura executa as fases em ordem: leve -> REM -> profunda.
Comportamento de cadência padrão:
Comportamento padrão de cadência:
| Configuração | Padrão |
| ------------ | ------ |
| -------------------- | ----------- |
| `dreaming.frequency` | `0 3 * * *` |
## Início rápido
Ative o dreaming:
Habilite o Dreaming:
```json
{
@ -149,7 +151,7 @@ Ative o dreaming:
}
```
Ative o dreaming com uma cadência personalizada de varredura:
Habilite o Dreaming com uma cadência de varredura personalizada:
```json
{
@ -180,7 +182,7 @@ Ative o dreaming com uma cadência personalizada de varredura:
## Fluxo de trabalho da CLI
Use a promoção pela CLI para prévia ou aplicação manual:
Use a promoção via CLI para pré-visualização ou aplicação manual:
```bash
openclaw memory promote
@ -190,7 +192,7 @@ openclaw memory status --deep
```
O `memory promote` manual usa os limites da fase profunda por padrão, a menos que sejam substituídos
com flags da CLI.
por flags da CLI.
Explique por que um candidato específico seria ou não promovido:
@ -199,7 +201,7 @@ openclaw memory promote-explain "router vlan"
openclaw memory promote-explain "router vlan" --json
```
Visualize reflexões REM, verdades candidatas e a saída de promoção profunda sem
Pré-visualize reflexões REM, verdades candidatas e a saída de promoção profunda sem
gravar nada:
```bash
@ -212,30 +214,30 @@ openclaw memory rem-harness --json
Todas as configurações ficam em `plugins.entries.memory-core.config.dreaming`.
| Chave | Padrão |
| ----- | ------ |
| ----------- | ----------- |
| `enabled` | `false` |
| `frequency` | `0 3 * * *` |
Política de fases, limites e comportamento de armazenamento são detalhes internos de implementação
(não configuração voltada ao usuário).
Política de fase, limites e comportamento de armazenamento são detalhes internos de implementação
(não são configurações voltadas ao usuário).
Consulte a [referência de configuração de memória](/pt-BR/reference/memory-config#dreaming-experimental)
para ver a lista completa de chaves.
## Interface Dreams
## UI de Sonhos
Quando ativada, a aba **Dreams** do Gateway mostra:
Quando habilitada, a aba **Dreams** do Gateway mostra:
- estado atual de ativação do dreaming
- status em nível de fase e presença de varredura gerenciada
- estado atual de habilitação do Dreaming
- status por fase e presença de varredura gerenciada
- contagens de curto prazo, fundamentadas, de sinais e promovidas hoje
- horário da próxima execução agendada
- uma faixa Scene fundamentada distinta para entradas preparadas de replay histórico
- um leitor expansível do Diário de Sonhos com base em `doctor.memory.dreamDiary`
- uma trilha distinta fundamentada na cena para entradas preparadas de replay histórico
- um leitor expansível do Diário de Sonhos baseado em `doctor.memory.dreamDiary`
## Relacionado
- [Memory](/pt-BR/concepts/memory)
- [Memory Search](/pt-BR/concepts/memory-search)
- [Memória](/pt-BR/concepts/memory)
- [Busca de memória](/pt-BR/concepts/memory-search)
- [CLI de memory](/cli/memory)
- [referência de configuração de memória](/pt-BR/reference/memory-config)
- [Referência de configuração de memória](/pt-BR/reference/memory-config)

View File

@ -6,23 +6,23 @@ read_when:
summary: Execute o OpenClaw em LLMs locais (LM Studio, vLLM, LiteLLM, endpoints OpenAI personalizados)
title: Modelos locais
x-i18n:
generated_at: "2026-04-14T13:04:28Z"
generated_at: "2026-04-15T05:33:49Z"
model: gpt-5.4
provider: openai
source_hash: 1544c522357ba4b18dfa6d05ea8d60c7c6262281b53863d9aee7002464703ca7
source_hash: 8778cc1c623a356ff3cf306c494c046887f9417a70ec71e659e4a8aae912a780
source_path: gateway/local-models.md
workflow: 15
---
# Modelos locais
Localmente é viável, mas o OpenClaw espera contexto grande + defesas fortes contra injeção de prompt. Placas pequenas truncam o contexto e enfraquecem a segurança. Mire alto: **≥2 Mac Studios no máximo ou uma máquina com GPU equivalente (~US$ 30 mil+)**. Uma única GPU de **24 GB** funciona apenas para prompts mais leves, com latência maior. Use a **maior variante / variante de tamanho completo do modelo que você conseguir executar**; checkpoints agressivamente quantizados ou “small” aumentam o risco de injeção de prompt (veja [Segurança](/pt-BR/gateway/security)).
Localmente é viável, mas o OpenClaw espera um contexto grande + defesas fortes contra injeção de prompt. Placas pequenas truncam o contexto e comprometem a segurança. Mire alto: **≥2 Mac Studios no máximo ou equipamento GPU equivalente (~US$ 30 mil+)**. Uma única GPU de **24 GB** funciona apenas para prompts mais leves, com latência maior. Use a **maior variante / variante de tamanho completo do modelo que você conseguir executar**; checkpoints agressivamente quantizados ou “small” aumentam o risco de injeção de prompt (veja [Segurança](/pt-BR/gateway/security)).
Se você quer a configuração local com menos atrito, comece com [LM Studio](/pt-BR/providers/lmstudio) ou [Ollama](/pt-BR/providers/ollama) e `openclaw onboard`. Esta página é o guia opinativo para stacks locais de nível mais alto e servidores locais personalizados compatíveis com OpenAI.
Se você quiser a configuração local com menos atrito, comece com [LM Studio](/pt-BR/providers/lmstudio) ou [Ollama](/pt-BR/providers/ollama) e `openclaw onboard`. Esta página é o guia opinativo para stacks locais mais robustas e servidores locais personalizados compatíveis com OpenAI.
## Recomendado: LM Studio + modelo local grande (Responses API)
## Recomendado: LM Studio + modelo local grande (API Responses)
Melhor stack local atual. Carregue um modelo grande no LM Studio (por exemplo, uma versão completa do Qwen, DeepSeek ou Llama), habilite o servidor local (padrão `http://127.0.0.1:1234`), e use a Responses API para manter o raciocínio separado do texto final.
Melhor stack local atual. Carregue um modelo grande no LM Studio (por exemplo, uma build completa de Qwen, DeepSeek ou Llama), ative o servidor local (padrão `http://127.0.0.1:1234`) e use a API Responses para manter o raciocínio separado do texto final.
```json5
{
@ -62,15 +62,15 @@ Melhor stack local atual. Carregue um modelo grande no LM Studio (por exemplo, u
**Checklist de configuração**
- Instale o LM Studio: [https://lmstudio.ai](https://lmstudio.ai)
- No LM Studio, baixe a **maior versão de modelo disponível** (evite variantes “small”/fortemente quantizadas), inicie o servidor e confirme que `http://127.0.0.1:1234/v1/models` o lista.
- Substitua `my-local-model` pelo ID real do modelo mostrado no LM Studio.
- Mantenha o modelo carregado; carregamento a frio adiciona latência de inicialização.
- Ajuste `contextWindow`/`maxTokens` se a sua versão do LM Studio for diferente.
- Para WhatsApp, mantenha a Responses API para que apenas o texto final seja enviado.
- No LM Studio, baixe a **maior build de modelo disponível** (evite variantes “small”/muito quantizadas), inicie o servidor e confirme que `http://127.0.0.1:1234/v1/models` o lista.
- Substitua `my-local-model` pelo ID real do modelo exibido no LM Studio.
- Mantenha o modelo carregado; o carregamento a frio adiciona latência na inicialização.
- Ajuste `contextWindow`/`maxTokens` se a sua build do LM Studio for diferente.
- Para WhatsApp, use a API Responses para que apenas o texto final seja enviado.
Mantenha modelos hospedados configurados mesmo ao executar localmente; use `models.mode: "merge"` para que os fallbacks continuem disponíveis.
Mantenha também os modelos hospedados configurados mesmo ao executar localmente; use `models.mode: "merge"` para que fallbacks continuem disponíveis.
### Configuração híbrida: principal hospedado, fallback local
### Configuração híbrida: primário hospedado, fallback local
```json5
{
@ -111,18 +111,18 @@ Mantenha modelos hospedados configurados mesmo ao executar localmente; use `mode
}
```
### Prioridade local com rede de segurança hospedada
### Local primeiro com rede de segurança hospedada
Troque a ordem do principal e do fallback; mantenha o mesmo bloco de providers e `models.mode: "merge"` para poder recorrer a Sonnet ou Opus quando a máquina local estiver fora do ar.
Troque a ordem de primário e fallback; mantenha o mesmo bloco `providers` e `models.mode: "merge"` para poder recorrer a Sonnet ou Opus quando a máquina local estiver indisponível.
### Hospedagem regional / roteamento de dados
- Variantes hospedadas de MiniMax/Kimi/GLM também existem no OpenRouter com endpoints fixados por região (por exemplo, hospedados nos EUA). Escolha ali a variante regional para manter o tráfego na jurisdição desejada, enquanto continua usando `models.mode: "merge"` para fallbacks de Anthropic/OpenAI.
- Somente local continua sendo o caminho mais forte em privacidade; o roteamento regional hospedado é o meio-termo quando você precisa de recursos do provedor, mas quer controle sobre o fluxo de dados.
- Variantes hospedadas de MiniMax/Kimi/GLM também existem no OpenRouter com endpoints fixados por região (por exemplo, hospedados nos EUA). Escolha ali a variante regional para manter o tráfego dentro da jurisdição desejada, enquanto ainda usa `models.mode: "merge"` para fallbacks de Anthropic/OpenAI.
- Somente local continua sendo o caminho mais forte para privacidade; o roteamento regional hospedado é o meio-termo quando você precisa de recursos do provedor, mas quer controle sobre o fluxo de dados.
## Outros proxies locais compatíveis com OpenAI
vLLM, LiteLLM, OAI-proxy ou gateways personalizados funcionam se expuserem um endpoint `/v1` no estilo OpenAI. Substitua o bloco do provider acima pelo seu endpoint e ID de modelo:
vLLM, LiteLLM, OAI-proxy ou gateways personalizados funcionam se expuserem um endpoint `/v1` no estilo OpenAI. Substitua o bloco do provedor acima pelo seu endpoint e ID de modelo:
```json5
{
@ -150,40 +150,30 @@ vLLM, LiteLLM, OAI-proxy ou gateways personalizados funcionam se expuserem um en
}
```
Mantenha `models.mode: "merge"` para que modelos hospedados continuem disponíveis como fallbacks.
Mantenha `models.mode: "merge"` para que os modelos hospedados continuem disponíveis como fallbacks.
Observação de comportamento para backends `/v1` locais/com proxy:
Observação de comportamento para backends locais/proxy com `/v1`:
- O OpenClaw trata isso como rotas compatíveis com OpenAI no estilo proxy, não como endpoints OpenAI nativos
- a modelagem de requisição específica do OpenAI nativo não se aplica aqui: sem
`service_tier`, sem `store` da Responses, sem modelagem de payload de compatibilidade de raciocínio do OpenAI, e sem dicas de cache de prompt
- cabeçalhos ocultos de atribuição do OpenClaw (`originator`, `version`, `User-Agent`)
não são injetados nesses URLs de proxy personalizados
- O OpenClaw trata esses backends como rotas no estilo proxy compatíveis com OpenAI, não como endpoints OpenAI nativos
- a formatação de requisição exclusiva do OpenAI nativo não se aplica aqui: sem `service_tier`, sem `store` de Responses, sem formatação de payload de compatibilidade de raciocínio do OpenAI e sem dicas de cache de prompt
- cabeçalhos ocultos de atribuição do OpenClaw (`originator`, `version`, `User-Agent`) não são injetados nessas URLs de proxy personalizadas
Observações de compatibilidade para backends compatíveis com OpenAI mais rígidos:
Observações de compatibilidade para backends compatíveis com OpenAI mais restritivos:
- Alguns servidores aceitam apenas `messages[].content` como string em Chat Completions, não
arrays estruturados de partes de conteúdo. Defina
`models.providers.<provider>.models[].compat.requiresStringContent: true` para
esses endpoints.
- Alguns backends locais menores ou mais rígidos ficam instáveis com o formato completo de prompt do runtime do agente do OpenClaw,
especialmente quando esquemas de ferramentas estão incluídos. Se o
backend funciona para chamadas diretas pequenas de `/v1/chat/completions`, mas falha em turnos normais de agente do
OpenClaw, tente primeiro
`models.providers.<provider>.models[].compat.supportsTools: false`.
- Se o backend ainda falhar apenas em execuções maiores do OpenClaw, o problema restante
geralmente está na capacidade do modelo/servidor upstream ou em um bug do backend, não na camada de transporte do OpenClaw.
- Alguns servidores aceitam apenas `messages[].content` como string em Chat Completions, e não arrays estruturados de partes de conteúdo. Defina `models.providers.<provider>.models[].compat.requiresStringContent: true` para esses endpoints.
- Alguns backends locais menores ou mais restritivos são instáveis com o formato completo de prompt do runtime do agente do OpenClaw, especialmente quando esquemas de ferramentas são incluídos. Se o backend funciona para chamadas diretas pequenas a `/v1/chat/completions`, mas falha em turnos normais do agente do OpenClaw, primeiro tente `agents.defaults.localModelMode: "lean"` para remover ferramentas padrão pesadas como `browser`, `cron` e `message`; se isso ainda falhar, tente `models.providers.<provider>.models[].compat.supportsTools: false`.
- Se o backend ainda falhar apenas em execuções maiores do OpenClaw, o problema restante normalmente é capacidade do modelo/servidor upstream ou um bug do backend, não da camada de transporte do OpenClaw.
## Solução de problemas
- O Gateway consegue alcançar o proxy? `curl http://127.0.0.1:1234/v1/models`.
- O modelo do LM Studio foi descarregado? Recarregue; inicialização a frio é uma causa comum de “travamento”.
- O OpenClaw avisa quando a janela de contexto detectada está abaixo de **32k** e bloqueia abaixo de **16k**. Se você atingir essa verificação prévia, aumente o limite de contexto do servidor/modelo ou escolha um modelo maior.
- Modelo do LM Studio descarregado? Carregue novamente; inicialização a frio é uma causa comum de “travamento”.
- O OpenClaw avisa quando a janela de contexto detectada fica abaixo de **32k** e bloqueia abaixo de **16k**. Se você encontrar essa verificação prévia, aumente o limite de contexto do servidor/modelo ou escolha um modelo maior.
- Erros de contexto? Reduza `contextWindow` ou aumente o limite do seu servidor.
- O servidor compatível com OpenAI retorna `messages[].content ... expected a string`?
Adicione `compat.requiresStringContent: true` nessa entrada de modelo.
- Chamadas diretas pequenas para `/v1/chat/completions` funcionam, mas `openclaw infer model run`
falha com Gemma ou outro modelo local? Primeiro desative os esquemas de ferramentas com
falha com Gemma ou outro modelo local? Desative primeiro os esquemas de ferramentas com
`compat.supportsTools: false`, depois teste novamente. Se o servidor ainda travar apenas
com prompts maiores do OpenClaw, trate isso como uma limitação do modelo/servidor upstream.
- Segurança: modelos locais ignoram filtros do lado do provedor; mantenha os agentes restritos e a Compaction ativada para limitar o raio de impacto de injeção de prompt.
com prompts maiores do OpenClaw, trate isso como uma limitação do servidor/modelo upstream.
- Segurança: modelos locais ignoram filtros do lado do provedor; mantenha os agentes limitados e a Compaction ativada para limitar o raio de impacto da injeção de prompt.

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -1,65 +1,57 @@
---
read_when:
- Você está criando um Plugin do OpenClaw
- Você precisa fornecer um schema de configuração do plugin ou depurar erros de validação do plugin
summary: Manifest do Plugin + requisitos do schema JSON (validação estrita de configuração)
title: Manifest do Plugin
- Você precisa entregar um esquema de configuração de Plugin ou depurar erros de validação de Plugin
summary: Manifesto do Plugin + requisitos do esquema JSON (validação estrita de configuração)
title: Manifesto do Plugin
x-i18n:
generated_at: "2026-04-12T23:28:50Z"
generated_at: "2026-04-15T05:33:47Z"
model: gpt-5.4
provider: openai
source_hash: 93b57c7373e4ccd521b10945346db67991543bd2bed4cc8b6641e1f215b48579
source_hash: ba2183bfa8802871e4ef33a0ebea290606e8351e9e83e25ee72456addb768730
source_path: plugins/manifest.md
workflow: 15
---
# Manifest do Plugin (`openclaw.plugin.json`)
# Manifesto do Plugin (`openclaw.plugin.json`)
Esta página é apenas para o **manifest nativo de Plugin do OpenClaw**.
Esta página é apenas para o **manifesto de Plugin nativo do OpenClaw**.
Para layouts de bundle compatíveis, consulte [Bundles de Plugin](/pt-BR/plugins/bundles).
Formatos de bundle compatíveis usam arquivos de manifest diferentes:
Formatos de bundle compatíveis usam arquivos de manifesto diferentes:
- Bundle do Codex: `.codex-plugin/plugin.json`
- Bundle do Claude: `.claude-plugin/plugin.json` ou o layout padrão de componente do Claude
sem um manifest
- Bundle do Claude: `.claude-plugin/plugin.json` ou o layout de componente padrão do Claude sem manifesto
- Bundle do Cursor: `.cursor-plugin/plugin.json`
O OpenClaw também detecta automaticamente esses layouts de bundle, mas eles não são validados
com base no schema de `openclaw.plugin.json` descrito aqui.
O OpenClaw também detecta automaticamente esses layouts de bundle, mas eles não são validados em relação ao esquema `openclaw.plugin.json` descrito aqui.
Para bundles compatíveis, o OpenClaw atualmente lê metadados do bundle mais as raízes de
Skills declaradas, raízes de comandos do Claude, padrões de `settings.json` do bundle Claude,
padrões de LSP do bundle Claude e pacotes de hooks suportados quando o layout corresponde
às expectativas de runtime do OpenClaw.
Para bundles compatíveis, o OpenClaw atualmente lê os metadados do bundle mais as raízes de Skills declaradas, raízes de comandos do Claude, padrões de `settings.json` do bundle do Claude, padrões de LSP do bundle do Claude e pacotes de hooks compatíveis quando o layout corresponde às expectativas de runtime do OpenClaw.
Todo Plugin nativo do OpenClaw **deve** incluir um arquivo `openclaw.plugin.json` na
**raiz do plugin**. O OpenClaw usa esse manifest para validar a configuração
**sem executar o código do plugin**. Manifests ausentes ou inválidos são tratados como
erros do plugin e bloqueiam a validação da configuração.
Todo Plugin nativo do OpenClaw **deve** incluir um arquivo `openclaw.plugin.json` na **raiz do Plugin**. O OpenClaw usa esse manifesto para validar a configuração **sem executar código do Plugin**. Manifestos ausentes ou inválidos são tratados como erros de Plugin e bloqueiam a validação da configuração.
Consulte o guia completo do sistema de plugins: [Plugins](/pt-BR/tools/plugin).
Para o modelo de capacidades nativo e a orientação atual de compatibilidade externa:
Para o modelo nativo de capacidades e a orientação atual de compatibilidade externa:
[Modelo de capacidades](/pt-BR/plugins/architecture#public-capability-model).
## O que este arquivo faz
`openclaw.plugin.json` são os metadados que o OpenClaw lê antes de carregar o
código do seu plugin.
`openclaw.plugin.json` é o metadado que o OpenClaw lê antes de carregar o código do seu Plugin.
Use-o para:
- identidade do plugin
- identidade do Plugin
- validação de configuração
- metadados de autenticação e onboarding que devem estar disponíveis sem iniciar o runtime do plugin
- metadados de autenticação e onboarding que devem estar disponíveis sem iniciar o runtime do Plugin
- dicas baratas de ativação que superfícies do plano de controle podem inspecionar antes de o runtime carregar
- descritores baratos de setup que superfícies de setup/onboarding podem inspecionar antes de o runtime carregar
- metadados de alias e auto-habilitação que devem ser resolvidos antes de o runtime do plugin carregar
- metadados abreviados de propriedade de família de modelos que devem autoativar o plugin antes de o runtime carregar
- snapshots estáticos de propriedade de capacidades usados para wiring de compatibilidade de bundles e cobertura de contrato
- descritores baratos de configuração que superfícies de configuração/onboarding podem inspecionar antes de o runtime carregar
- metadados de alias e autoativação que devem ser resolvidos antes de o runtime do Plugin carregar
- metadados abreviados de propriedade de família de modelos que devem autoativar o Plugin antes de o runtime carregar
- snapshots estáticos de propriedade de capacidades usados para wiring de compatibilidade de bundles e cobertura de contratos
- metadados baratos do executor de QA que o host compartilhado `openclaw qa` pode inspecionar antes de o runtime do Plugin carregar
- metadados de configuração específicos de canal que devem ser mesclados em superfícies de catálogo e validação sem carregar o runtime
- dicas de UI para configuração
- dicas de UI de configuração
Não o use para:
@ -67,7 +59,7 @@ Não o use para:
- declarar entrypoints de código
- metadados de instalação npm
Esses pertencem ao código do seu plugin e ao `package.json`.
Esses pertencem ao código do seu Plugin e ao `package.json`.
## Exemplo mínimo
@ -88,7 +80,7 @@ Esses pertencem ao código do seu plugin e ao `package.json`.
{
"id": "openrouter",
"name": "OpenRouter",
"description": "Plugin provider do OpenRouter",
"description": "OpenRouter provider plugin",
"version": "1.0.0",
"providers": ["openrouter"],
"modelSupport": {
@ -109,19 +101,19 @@ Esses pertencem ao código do seu plugin e ao `package.json`.
"provider": "openrouter",
"method": "api-key",
"choiceId": "openrouter-api-key",
"choiceLabel": "Chave de API do OpenRouter",
"choiceLabel": "OpenRouter API key",
"groupId": "openrouter",
"groupLabel": "OpenRouter",
"optionKey": "openrouterApiKey",
"cliFlag": "--openrouter-api-key",
"cliOption": "--openrouter-api-key <key>",
"cliDescription": "Chave de API do OpenRouter",
"cliDescription": "OpenRouter API key",
"onboardingScopes": ["text-inference"]
}
],
"uiHints": {
"apiKey": {
"label": "Chave de API",
"label": "API key",
"placeholder": "sk-or-v1-...",
"sensitive": true
}
@ -138,64 +130,65 @@ Esses pertencem ao código do seu plugin e ao `package.json`.
}
```
## Referência dos campos de nível superior
## Referência de campos de nível superior
| Campo | Obrigatório | Tipo | O que significa |
| ----------------------------------- | ----------- | -------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
| `id` | Sim | `string` | ID canônico do plugin. Este é o ID usado em `plugins.entries.<id>`. |
| `configSchema` | Sim | `object` | Schema JSON inline para a configuração deste plugin. |
| `enabledByDefault` | Não | `true` | Marca um plugin empacotado como habilitado por padrão. Omita-o ou defina qualquer valor diferente de `true` para deixar o plugin desabilitado por padrão. |
| `legacyPluginIds` | Não | `string[]` | IDs legados que são normalizados para este ID canônico de plugin. |
| `autoEnableWhenConfiguredProviders` | Não | `string[]` | IDs de provider que devem auto-habilitar este plugin quando autenticação, configuração ou referências de modelo os mencionarem. |
| `kind` | Não | `"memory"` \| `"context-engine"` | Declara um tipo exclusivo de plugin usado por `plugins.slots.*`. |
| `channels` | Não | `string[]` | IDs de canal pertencentes a este plugin. Usados para descoberta e validação de configuração. |
| `providers` | Não | `string[]` | IDs de provider pertencentes a este plugin. |
| `modelSupport` | Não | `object` | Metadados abreviados de família de modelos pertencentes ao manifest usados para carregar automaticamente o plugin antes do runtime. |
| `cliBackends` | Não | `string[]` | IDs de backend de inferência da CLI pertencentes a este plugin. Usados para autoativação na inicialização a partir de referências explícitas na configuração. |
| `commandAliases` | Não | `object[]` | Nomes de comando pertencentes a este plugin que devem produzir diagnósticos de configuração e CLI conscientes do plugin antes de o runtime carregar. |
| `providerAuthEnvVars` | Não | `Record<string, string[]>` | Metadados baratos de env de autenticação de provider que o OpenClaw pode inspecionar sem carregar o código do plugin. |
| `providerAuthAliases` | Não | `Record<string, string>` | IDs de provider que devem reutilizar outro ID de provider para busca de autenticação, por exemplo um provider de coding que compartilha a chave de API do provider base e perfis de autenticação. |
| `channelEnvVars` | Não | `Record<string, string[]>` | Metadados baratos de env de canal que o OpenClaw pode inspecionar sem carregar o código do plugin. Use isso para superfícies de setup ou autenticação de canal orientadas por env que helpers genéricos de inicialização/configuração devem enxergar. |
| `providerAuthChoices` | Não | `object[]` | Metadados baratos de escolhas de autenticação para seletores de onboarding, resolução de provider preferido e wiring simples de flags da CLI. |
| `activation` | Não | `object` | Dicas baratas de ativação para carregamento acionado por provider, comando, canal, rota e capacidade. Apenas metadados; o runtime do plugin ainda é dono do comportamento real. |
| `setup` | Não | `object` | Descritores baratos de setup/onboarding que superfícies de descoberta e setup podem inspecionar sem carregar o runtime do plugin. |
| `contracts` | Não | `object` | Snapshot estático de capacidades empacotadas para speech, transcrição em tempo real, voz em tempo real, media-understanding, geração de imagem, geração de música, geração de vídeo, web-fetch, busca na web e propriedade de ferramentas. |
| `channelConfigs` | Não | `Record<string, object>` | Metadados de configuração de canal pertencentes ao manifest mesclados em superfícies de descoberta e validação antes de o runtime carregar. |
| `skills` | Não | `string[]` | Diretórios de Skills a serem carregados, relativos à raiz do plugin. |
| `name` | Não | `string` | Nome legível do plugin. |
| `description` | Não | `string` | Resumo curto exibido nas superfícies do plugin. |
| `version` | Não | `string` | Versão informativa do plugin. |
| `id` | Sim | `string` | ID canônico do Plugin. Este é o ID usado em `plugins.entries.<id>`. |
| `configSchema` | Sim | `object` | Esquema JSON inline para a configuração deste Plugin. |
| `enabledByDefault` | Não | `true` | Marca um Plugin empacotado como habilitado por padrão. Omita-o, ou defina qualquer valor diferente de `true`, para deixar o Plugin desabilitado por padrão. |
| `legacyPluginIds` | Não | `string[]` | IDs legados que são normalizados para este ID canônico de Plugin. |
| `autoEnableWhenConfiguredProviders` | Não | `string[]` | IDs de provider que devem autoabilitar este Plugin quando autenticação, configuração ou referências de modelo os mencionarem. |
| `kind` | Não | `"memory"` \| `"context-engine"` | Declara um tipo exclusivo de Plugin usado por `plugins.slots.*`. |
| `channels` | Não | `string[]` | IDs de canal pertencentes a este Plugin. Usado para descoberta e validação de configuração. |
| `providers` | Não | `string[]` | IDs de provider pertencentes a este Plugin. |
| `modelSupport` | Não | `object` | Metadados abreviados de família de modelos pertencentes ao manifesto usados para carregar automaticamente o Plugin antes do runtime. |
| `cliBackends` | Não | `string[]` | IDs de backend de inferência da CLI pertencentes a este Plugin. Usado para autoativação na inicialização a partir de referências explícitas de configuração. |
| `commandAliases` | Não | `object[]` | Nomes de comando pertencentes a este Plugin que devem produzir configuração e diagnósticos de CLI cientes do Plugin antes de o runtime carregar. |
| `providerAuthEnvVars` | Não | `Record<string, string[]>` | Metadados baratos de variáveis de ambiente para autenticação de provider que o OpenClaw pode inspecionar sem carregar o código do Plugin. |
| `providerAuthAliases` | Não | `Record<string, string>` | IDs de provider que devem reutilizar outro ID de provider para busca de autenticação, por exemplo, um provider de coding que compartilha a chave de API e os perfis de autenticação do provider base. |
| `channelEnvVars` | Não | `Record<string, string[]>` | Metadados baratos de variáveis de ambiente de canal que o OpenClaw pode inspecionar sem carregar o código do Plugin. Use isso para superfícies de configuração ou autenticação de canal orientadas por env que helpers genéricos de inicialização/configuração devem enxergar. |
| `providerAuthChoices` | Não | `object[]` | Metadados baratos de opções de autenticação para seletores de onboarding, resolução de provider preferido e wiring simples de flags da CLI. |
| `activation` | Não | `object` | Dicas baratas de ativação para carregamento acionado por provider, comando, canal, rota e capacidade. Apenas metadados; o runtime do Plugin ainda é dono do comportamento real. |
| `setup` | Não | `object` | Descritores baratos de configuração/onboarding que superfícies de descoberta e configuração podem inspecionar sem carregar o runtime do Plugin. |
| `qaRunners` | Não | `object[]` | Descritores baratos de executores de QA usados pelo host compartilhado `openclaw qa` antes de o runtime do Plugin carregar. |
| `contracts` | Não | `object` | Snapshot estático de capacidades empacotadas para fala, transcrição em tempo real, voz em tempo real, media-understanding, image-generation, music-generation, video-generation, web-fetch, busca na web e propriedade de ferramentas. |
| `channelConfigs` | Não | `Record<string, object>` | Metadados de configuração de canal pertencentes ao manifesto, mesclados em superfícies de descoberta e validação antes de o runtime carregar. |
| `skills` | Não | `string[]` | Diretórios de Skills a serem carregados, relativos à raiz do Plugin. |
| `name` | Não | `string` | Nome legível do Plugin. |
| `description` | Não | `string` | Resumo curto exibido em superfícies de Plugin. |
| `version` | Não | `string` | Versão informativa do Plugin. |
| `uiHints` | Não | `Record<string, object>` | Rótulos de UI, placeholders e dicas de sensibilidade para campos de configuração. |
## Referência de `providerAuthChoices`
Cada entrada de `providerAuthChoices` descreve uma escolha de onboarding ou autenticação.
Cada entrada de `providerAuthChoices` descreve uma opção de onboarding ou autenticação.
O OpenClaw lê isso antes de o runtime do provider carregar.
| Campo | Obrigatório | Tipo | O que significa |
| --------------------- | ----------- | ----------------------------------------------- | -------------------------------------------------------------------------------------------------------- |
| `provider` | Sim | `string` | ID do provider ao qual esta escolha pertence. |
| `method` | Sim | `string` | ID do método de autenticação para direcionamento. |
| `choiceId` | Sim | `string` | ID estável de escolha de autenticação usado pelos fluxos de onboarding e CLI. |
| Campo | Obrigatório | Tipo | O que significa |
| --------------------- | ----------- | ----------------------------------------------- | --------------------------------------------------------------------------------------------------------- |
| `provider` | Sim | `string` | ID do provider ao qual esta opção pertence. |
| `method` | Sim | `string` | ID do método de autenticação para despacho. |
| `choiceId` | Sim | `string` | ID estável da opção de autenticação usado por fluxos de onboarding e CLI. |
| `choiceLabel` | Não | `string` | Rótulo voltado ao usuário. Se omitido, o OpenClaw usa `choiceId` como fallback. |
| `choiceHint` | Não | `string` | Texto curto de ajuda para o seletor. |
| `assistantPriority` | Não | `number` | Valores menores aparecem antes em seletores interativos guiados pelo assistant. |
| `assistantVisibility` | Não | `"visible"` \| `"manual-only"` | Oculta a escolha dos seletores do assistant, enquanto ainda permite seleção manual pela CLI. |
| `deprecatedChoiceIds` | Não | `string[]` | IDs legados de escolha que devem redirecionar os usuários para esta escolha substituta. |
| `groupId` | Não | `string` | ID opcional de grupo para agrupar escolhas relacionadas. |
| `groupLabel` | Não | `string` | Rótulo voltado ao usuário para esse grupo. |
| `groupHint` | Não | `string` | Texto curto de ajuda para o grupo. |
| `optionKey` | Não | `string` | Chave de opção interna para fluxos simples de autenticação com uma única flag. |
| `cliFlag` | Não | `string` | Nome da flag da CLI, como `--openrouter-api-key`. |
| `cliOption` | Não | `string` | Formato completo da opção da CLI, como `--openrouter-api-key <key>`. |
| `cliDescription` | Não | `string` | Descrição usada na ajuda da CLI. |
| `onboardingScopes` | Não | `Array<"text-inference" \| "image-generation">` | Em quais superfícies de onboarding esta escolha deve aparecer. Se omitido, o padrão é `["text-inference"]`. |
| `choiceHint` | Não | `string` | Texto auxiliar curto para o seletor. |
| `assistantPriority` | Não | `number` | Valores menores são ordenados primeiro em seletores interativos guiados pelo assistente. |
| `assistantVisibility` | Não | `"visible"` \| `"manual-only"` | Oculta a opção dos seletores do assistente, mas ainda permite seleção manual pela CLI. |
| `deprecatedChoiceIds` | Não | `string[]` | IDs legados de opção que devem redirecionar os usuários para esta opção de substituição. |
| `groupId` | Não | `string` | ID opcional de grupo para agrupar opções relacionadas. |
| `groupLabel` | Não | `string` | Rótulo voltado ao usuário para esse grupo. |
| `groupHint` | Não | `string` | Texto auxiliar curto para o grupo. |
| `optionKey` | Não | `string` | Chave interna de opção para fluxos de autenticação simples com uma única flag. |
| `cliFlag` | Não | `string` | Nome da flag da CLI, como `--openrouter-api-key`. |
| `cliOption` | Não | `string` | Formato completo da opção da CLI, como `--openrouter-api-key <key>`. |
| `cliDescription` | Não | `string` | Descrição usada na ajuda da CLI. |
| `onboardingScopes` | Não | `Array<"text-inference" \| "image-generation">` | Em quais superfícies de onboarding esta opção deve aparecer. Se omitido, o padrão é `["text-inference"]`. |
## Referência de `commandAliases`
Use `commandAliases` quando um plugin é dono de um nome de comando de runtime que os usuários podem
colocar por engano em `plugins.allow` ou tentar executar como um comando raiz da CLI. O OpenClaw
usa esses metadados para diagnósticos sem importar o código de runtime do plugin.
Use `commandAliases` quando um Plugin é dono de um nome de comando de runtime que os usuários podem, por engano,
colocar em `plugins.allow` ou tentar executar como um comando raiz da CLI. O OpenClaw
usa esses metadados para diagnósticos sem importar o código de runtime do Plugin.
```json
{
@ -209,22 +202,40 @@ usa esses metadados para diagnósticos sem importar o código de runtime do plug
}
```
| Campo | Obrigatório | Tipo | O que significa |
| ------------ | ----------- | ----------------- | ----------------------------------------------------------------------- |
| `name` | Sim | `string` | Nome do comando que pertence a este plugin. |
| Campo | Obrigatório | Tipo | O que significa |
| ------------ | ----------- | ----------------- | ------------------------------------------------------------------------- |
| `name` | Sim | `string` | Nome do comando que pertence a este Plugin. |
| `kind` | Não | `"runtime-slash"` | Marca o alias como um comando slash de chat em vez de um comando raiz da CLI. |
| `cliCommand` | Não | `string` | Comando raiz relacionado da CLI a ser sugerido para operações da CLI, se existir. |
| `cliCommand` | Não | `string` | Comando raiz relacionado da CLI a ser sugerido para operações de CLI, se existir. |
## Referência de `activation`
Use `activation` quando o plugin puder declarar de forma barata quais eventos do plano de controle
Use `activation` quando o Plugin pode declarar de forma barata quais eventos do plano de controle
devem ativá-lo depois.
Este bloco contém apenas metadados. Ele não registra comportamento de runtime e não
substitui `register(...)`, `setupEntry` nem outros entrypoints de runtime/plugin.
Os consumidores atuais o usam como uma dica de restrição antes de um carregamento mais amplo de plugins, então
a ausência de metadados de ativação normalmente só custa desempenho; ela não deve
mudar a correção enquanto ainda existirem fallbacks legados de propriedade no manifest.
## Referência de `qaRunners`
Use `qaRunners` quando um Plugin contribui com um ou mais executores de transporte sob a raiz compartilhada `openclaw qa`. Mantenha esses metadados baratos e estáticos; o runtime do Plugin ainda é dono do registro real da CLI por meio de uma superfície leve `runtime-api.ts` que exporta `qaRunnerCliRegistrations`.
```json
{
"qaRunners": [
{
"commandName": "matrix",
"description": "Run the Docker-backed Matrix live QA lane against a disposable homeserver"
}
]
}
```
| Campo | Obrigatório | Tipo | O que significa |
| ------------- | ----------- | -------- | ------------------------------------------------------------------- |
| `commandName` | Sim | `string` | Subcomando montado sob `openclaw qa`, por exemplo `matrix`. |
| `description` | Não | `string` | Texto de ajuda de fallback usado quando o host compartilhado precisa de um comando stub. |
Este bloco é apenas metadados. Ele não registra comportamento de runtime e não substitui `register(...)`, `setupEntry` nem outros entrypoints de runtime/Plugin.
Os consumidores atuais o usam como uma dica de refinamento antes de um carregamento mais amplo de Plugins, portanto a ausência de metadados de ativação normalmente só afeta o desempenho; ela não deve
alterar a correção enquanto os fallbacks legados de propriedade no manifesto ainda existirem.
```json
{
@ -238,27 +249,26 @@ mudar a correção enquanto ainda existirem fallbacks legados de propriedade no
}
```
| Campo | Obrigatório | Tipo | O que significa |
| ---------------- | ----------- | ---------------------------------------------------- | ---------------------------------------------------------------- |
| `onProviders` | Não | `string[]` | IDs de provider que devem ativar este plugin quando solicitados. |
| `onCommands` | Não | `string[]` | IDs de comando que devem ativar este plugin. |
| `onChannels` | Não | `string[]` | IDs de canal que devem ativar este plugin. |
| `onRoutes` | Não | `string[]` | Tipos de rota que devem ativar este plugin. |
| Campo | Obrigatório | Tipo | O que significa |
| ---------------- | ----------- | ---------------------------------------------------- | ------------------------------------------------------------------ |
| `onProviders` | Não | `string[]` | IDs de provider que devem ativar este Plugin quando solicitados. |
| `onCommands` | Não | `string[]` | IDs de comando que devem ativar este Plugin. |
| `onChannels` | Não | `string[]` | IDs de canal que devem ativar este Plugin. |
| `onRoutes` | Não | `string[]` | Tipos de rota que devem ativar este Plugin. |
| `onCapabilities` | Não | `Array<"provider" \| "channel" \| "tool" \| "hook">` | Dicas amplas de capacidade usadas pelo planejamento de ativação do plano de controle. |
Consumidores ativos atuais:
Consumidores ativos atualmente:
- o planejamento da CLI acionado por comando recorre a
`commandAliases[].cliCommand` ou `commandAliases[].name` legados
- o planejamento de setup/canal acionado por canal recorre à propriedade legada de `channels[]`
quando metadados explícitos de ativação de canal estão ausentes
- o planejamento de setup/runtime acionado por provider recorre à propriedade legada de
`providers[]` e `cliBackends[]` de nível superior quando metadados explícitos de ativação de provider
estão ausentes
- o planejamento da CLI acionado por comando usa como fallback
`commandAliases[].cliCommand` ou `commandAliases[].name`
- o planejamento de configuração/canal acionado por canal usa como fallback a propriedade legada de `channels[]`
quando faltam metadados explícitos de ativação de canal
- o planejamento de configuração/runtime acionado por provider usa como fallback a propriedade legada de
`providers[]` e `cliBackends[]` de nível superior quando faltam metadados explícitos de ativação de provider
## Referência de `setup`
Use `setup` quando as superfícies de setup e onboarding precisarem de metadados baratos pertencentes ao plugin
Use `setup` quando as superfícies de configuração e onboarding precisarem de metadados baratos pertencentes ao Plugin
antes de o runtime carregar.
```json
@ -278,36 +288,28 @@ antes de o runtime carregar.
}
```
`cliBackends` de nível superior continua válido e continua descrevendo backends
de inferência da CLI. `setup.cliBackends` é a superfície de descritor específica de setup para
fluxos de setup/plano de controle que devem permanecer somente em metadados.
`cliBackends` de nível superior continua válido e segue descrevendo backends de inferência da CLI. `setup.cliBackends` é a superfície de descritor específica de configuração para fluxos de plano de controle/configuração que devem permanecer apenas como metadados.
Quando presentes, `setup.providers` e `setup.cliBackends` são a superfície preferida
de busca baseada primeiro em descritor para descoberta de setup. Se o descritor apenas restringir
o plugin candidato e o setup ainda precisar de hooks de runtime mais ricos em tempo de setup,
defina `requiresRuntime: true` e mantenha `setup-api` como o caminho de execução de fallback.
Quando presentes, `setup.providers` e `setup.cliBackends` são a superfície preferencial de busca guiada por descritores para descoberta de configuração. Se o descritor apenas restringir o Plugin candidato e a configuração ainda precisar de hooks de runtime mais ricos em tempo de configuração, defina `requiresRuntime: true` e mantenha `setup-api` como o caminho de execução de fallback.
Como a busca de setup pode executar código `setup-api` pertencente ao plugin, os valores normalizados de
`setup.providers[].id` e `setup.cliBackends[]` devem permanecer únicos entre os
plugins descobertos. Propriedade ambígua falha de forma conservadora em vez de escolher um
vencedor pela ordem de descoberta.
Como a busca de configuração pode executar código `setup-api` pertencente ao Plugin, os valores normalizados de `setup.providers[].id` e `setup.cliBackends[]` devem permanecer únicos entre os plugins descobertos. Propriedade ambígua falha em modo fechado em vez de escolher um vencedor pela ordem de descoberta.
### Referência de `setup.providers`
| Campo | Obrigatório | Tipo | O que significa |
| ------------- | ----------- | ---------- | --------------------------------------------------------------------------------------- |
| `id` | Sim | `string` | ID do provider exposto durante setup ou onboarding. Mantenha IDs normalizados globalmente únicos. |
| `authMethods` | Não | `string[]` | IDs de método de setup/autenticação que este provider suporta sem carregar o runtime completo. |
| `envVars` | Não | `string[]` | Variáveis de ambiente que superfícies genéricas de setup/status podem verificar antes de o runtime do plugin carregar. |
| Campo | Obrigatório | Tipo | O que significa |
| ------------- | ----------- | ---------- | ----------------------------------------------------------------------------------- |
| `id` | Sim | `string` | ID do provider exposto durante a configuração ou o onboarding. Mantenha IDs normalizados globalmente únicos. |
| `authMethods` | Não | `string[]` | IDs de método de configuração/autenticação compatíveis com este provider sem carregar o runtime completo. |
| `envVars` | Não | `string[]` | Variáveis de ambiente que superfícies genéricas de configuração/status podem verificar antes de o runtime do Plugin carregar. |
### Campos de `setup`
| Campo | Obrigatório | Tipo | O que significa |
| ------------------ | ----------- | ---------- | ------------------------------------------------------------------------------------------------------- |
| `providers` | Não | `object[]` | Descritores de setup de provider expostos durante setup e onboarding. |
| `cliBackends` | Não | `string[]` | IDs de backend em tempo de setup usados para busca de setup baseada primeiro em descritor. Mantenha IDs normalizados globalmente únicos. |
| `configMigrations` | Não | `string[]` | IDs de migração de configuração pertencentes à superfície de setup deste plugin. |
| `requiresRuntime` | Não | `boolean` | Se o setup ainda precisa da execução de `setup-api` após a busca por descritor. |
| Campo | Obrigatório | Tipo | O que significa |
| ------------------ | ----------- | ---------- | ---------------------------------------------------------------------------------------------------- |
| `providers` | Não | `object[]` | Descritores de configuração de provider expostos durante a configuração e o onboarding. |
| `cliBackends` | Não | `string[]` | IDs de backend em tempo de configuração usados para busca de configuração guiada por descritores. Mantenha IDs normalizados globalmente únicos. |
| `configMigrations` | Não | `string[]` | IDs de migração de configuração pertencentes à superfície de configuração deste Plugin. |
| `requiresRuntime` | Não | `boolean` | Se a configuração ainda precisa de execução de `setup-api` após a busca por descritor. |
## Referência de `uiHints`
@ -328,19 +330,19 @@ vencedor pela ordem de descoberta.
Cada dica de campo pode incluir:
| Campo | Tipo | O que significa |
| ------------- | ---------- | -------------------------------------- |
| `label` | `string` | Rótulo do campo voltado ao usuário. |
| `help` | `string` | Texto curto de ajuda. |
| `tags` | `string[]` | Tags opcionais de UI. |
| `advanced` | `boolean` | Marca o campo como avançado. |
| Campo | Tipo | O que significa |
| ------------- | ---------- | --------------------------------------- |
| `label` | `string` | Rótulo do campo voltado ao usuário. |
| `help` | `string` | Texto auxiliar curto. |
| `tags` | `string[]` | Tags opcionais de UI. |
| `advanced` | `boolean` | Marca o campo como avançado. |
| `sensitive` | `boolean` | Marca o campo como secreto ou sensível. |
| `placeholder` | `string` | Texto de placeholder para entradas de formulário. |
## Referência de `contracts`
Use `contracts` apenas para metadados estáticos de propriedade de capacidade que o OpenClaw pode
ler sem importar o runtime do plugin.
Use `contracts` apenas para metadados estáticos de propriedade de capacidades que o OpenClaw pode
ler sem importar o runtime do Plugin.
```json
{
@ -360,22 +362,21 @@ ler sem importar o runtime do plugin.
Cada lista é opcional:
| Campo | Tipo | O que significa |
| -------------------------------- | ---------- | ---------------------------------------------------------------- |
| `speechProviders` | `string[]` | IDs de provider de speech pertencentes a este plugin. |
| `realtimeTranscriptionProviders` | `string[]` | IDs de provider de transcrição em tempo real pertencentes a este plugin. |
| `realtimeVoiceProviders` | `string[]` | IDs de provider de voz em tempo real pertencentes a este plugin. |
| `mediaUnderstandingProviders` | `string[]` | IDs de provider de media-understanding pertencentes a este plugin. |
| `imageGenerationProviders` | `string[]` | IDs de provider de geração de imagem pertencentes a este plugin. |
| `videoGenerationProviders` | `string[]` | IDs de provider de geração de vídeo pertencentes a este plugin. |
| `webFetchProviders` | `string[]` | IDs de provider de web-fetch pertencentes a este plugin. |
| `webSearchProviders` | `string[]` | IDs de provider de busca na web pertencentes a este plugin. |
| `tools` | `string[]` | Nomes de ferramentas do agente pertencentes a este plugin para verificações de contrato empacotado. |
| Campo | Tipo | O que significa |
| -------------------------------- | ---------- | ------------------------------------------------------------- |
| `speechProviders` | `string[]` | IDs de provider de fala pertencentes a este Plugin. |
| `realtimeTranscriptionProviders` | `string[]` | IDs de provider de transcrição em tempo real pertencentes a este Plugin. |
| `realtimeVoiceProviders` | `string[]` | IDs de provider de voz em tempo real pertencentes a este Plugin. |
| `mediaUnderstandingProviders` | `string[]` | IDs de provider de media-understanding pertencentes a este Plugin. |
| `imageGenerationProviders` | `string[]` | IDs de provider de geração de imagem pertencentes a este Plugin. |
| `videoGenerationProviders` | `string[]` | IDs de provider de geração de vídeo pertencentes a este Plugin. |
| `webFetchProviders` | `string[]` | IDs de provider de web-fetch pertencentes a este Plugin. |
| `webSearchProviders` | `string[]` | IDs de provider de busca na web pertencentes a este Plugin. |
| `tools` | `string[]` | Nomes de ferramentas de agente pertencentes a este Plugin para verificações de contrato de bundles. |
## Referência de `channelConfigs`
Use `channelConfigs` quando um plugin de canal precisar de metadados baratos de configuração antes de
o runtime carregar.
Use `channelConfigs` quando um Plugin de canal precisar de metadados baratos de configuração antes de o runtime carregar.
```json
{
@ -404,19 +405,17 @@ o runtime carregar.
Cada entrada de canal pode incluir:
| Campo | Tipo | O que significa |
| ------------- | ------------------------ | -------------------------------------------------------------------------------------------- |
| `schema` | `object` | Schema JSON para `channels.<id>`. Obrigatório para cada entrada declarada de configuração de canal. |
| Campo | Tipo | O que significa |
| ------------- | ------------------------ | ---------------------------------------------------------------------------------------- |
| `schema` | `object` | Esquema JSON para `channels.<id>`. Obrigatório para cada entrada declarada de configuração de canal. |
| `uiHints` | `Record<string, object>` | Rótulos/placeholders/dicas de sensibilidade de UI opcionais para essa seção de configuração de canal. |
| `label` | `string` | Rótulo do canal mesclado em superfícies de seleção e inspeção quando os metadados de runtime ainda não estiverem prontos. |
| `description` | `string` | Descrição curta do canal para superfícies de inspeção e catálogo. |
| `preferOver` | `string[]` | IDs de plugin legados ou de menor prioridade sobre os quais este canal deve ter precedência nas superfícies de seleção. |
| `label` | `string` | Rótulo do canal mesclado em superfícies de seletor e inspeção quando os metadados de runtime não estiverem prontos. |
| `description` | `string` | Descrição curta do canal para superfícies de inspeção e catálogo. |
| `preferOver` | `string[]` | IDs legados ou de menor prioridade de Plugin que este canal deve superar em superfícies de seleção. |
## Referência de `modelSupport`
Use `modelSupport` quando o OpenClaw precisar inferir seu plugin de provider a partir de
IDs abreviados de modelo como `gpt-5.4` ou `claude-sonnet-4.6` antes de o runtime do plugin
carregar.
Use `modelSupport` quando o OpenClaw precisar inferir seu Plugin de provider a partir de IDs abreviados de modelo, como `gpt-5.4` ou `claude-sonnet-4.6`, antes de o runtime do Plugin carregar.
```json
{
@ -429,74 +428,58 @@ carregar.
O OpenClaw aplica esta precedência:
- referências explícitas `provider/model` usam os metadados de manifest `providers` do plugin proprietário
- referências explícitas `provider/model` usam os metadados de manifesto `providers` do proprietário
- `modelPatterns` têm precedência sobre `modelPrefixes`
- se um plugin não empacotado e um plugin empacotado corresponderem, o plugin não empacotado
vence
- se um Plugin não empacotado e um Plugin empacotado corresponderem, o Plugin não empacotado vence
- ambiguidades restantes são ignoradas até que o usuário ou a configuração especifique um provider
Campos:
| Campo | Tipo | O que significa |
| --------------- | ---------- | --------------------------------------------------------------------------------- |
| `modelPrefixes` | `string[]` | Prefixos comparados com `startsWith` em relação a IDs abreviados de modelo. |
| `modelPatterns` | `string[]` | Fontes de regex comparadas com IDs abreviados de modelo após a remoção do sufixo de perfil. |
| Campo | Tipo | O que significa |
| --------------- | ---------- | -------------------------------------------------------------------------------- |
| `modelPrefixes` | `string[]` | Prefixos correspondidos com `startsWith` em relação a IDs abreviados de modelo. |
| `modelPatterns` | `string[]` | Fontes de regex correspondidas em relação a IDs abreviados de modelo após a remoção do sufixo do perfil. |
As chaves legadas de capacidade de nível superior estão obsoletas. Use `openclaw doctor --fix` para
mover `speechProviders`, `realtimeTranscriptionProviders`,
`realtimeVoiceProviders`, `mediaUnderstandingProviders`,
`imageGenerationProviders`, `videoGenerationProviders`,
`webFetchProviders` e `webSearchProviders` para `contracts`; o carregamento normal
do manifest não trata mais esses campos de nível superior como propriedade
de capacidade.
Chaves legadas de capacidade de nível superior estão obsoletas. Use `openclaw doctor --fix` para mover `speechProviders`, `realtimeTranscriptionProviders`, `realtimeVoiceProviders`, `mediaUnderstandingProviders`, `imageGenerationProviders`, `videoGenerationProviders`, `webFetchProviders` e `webSearchProviders` para `contracts`; o carregamento normal do manifesto não trata mais esses campos de nível superior como propriedade de capacidades.
## Manifest versus package.json
## Manifesto versus package.json
Os dois arquivos m funções diferentes:
Os dois arquivos cumprem funções diferentes:
| Arquivo | Use para |
| ---------------------- | -------------------------------------------------------------------------------------------------------------------------------- |
| `openclaw.plugin.json` | Descoberta, validação de configuração, metadados de escolha de autenticação e dicas de UI que precisam existir antes de o código do plugin rodar |
| `package.json` | Metadados npm, instalação de dependências e o bloco `openclaw` usado para entrypoints, controle de instalação, setup ou metadados de catálogo |
| Arquivo | Use para |
| ---------------------- | --------------------------------------------------------------------------------------------------------------------------------------- |
| `openclaw.plugin.json` | Descoberta, validação de configuração, metadados de opções de autenticação e dicas de UI que devem existir antes de o código do Plugin rodar |
| `package.json` | Metadados npm, instalação de dependências e o bloco `openclaw` usado para entrypoints, bloqueio de instalação, configuração ou metadados de catálogo |
Se você não tiver certeza de onde uma informação deve ficar, use esta regra:
Se você não tiver certeza de onde um metadado deve ficar, use esta regra:
- se o OpenClaw precisar conhecê-la antes de carregar o código do plugin, coloque-a em `openclaw.plugin.json`
- se for sobre empacotamento, arquivos de entrada ou comportamento de instalação do npm, coloque-a em `package.json`
- se o OpenClaw precisar conhecê-lo antes de carregar o código do Plugin, coloque-o em `openclaw.plugin.json`
- se for sobre empacotamento, arquivos de entrada ou comportamento de instalação do npm, coloque-o em `package.json`
### Campos de `package.json` que afetam a descoberta
Alguns metadados de plugin de pré-runtime intencionalmente ficam em `package.json` sob o bloco
`openclaw`, em vez de `openclaw.plugin.json`.
Alguns metadados de Plugin pré-runtime intencionalmente ficam em `package.json` sob o bloco `openclaw` em vez de `openclaw.plugin.json`.
Exemplos importantes:
| Campo | O que significa |
| ----------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------- |
| `openclaw.extensions` | Declara entrypoints de Plugin nativos. |
| `openclaw.setupEntry` | Entrypoint leve apenas de setup usado durante o onboarding e a inicialização adiada de canais. |
| `openclaw.channel` | Metadados baratos de catálogo de canal, como rótulos, caminhos de docs, aliases e textos de seleção. |
| `openclaw.channel.configuredState` | Metadados leves do verificador de estado configurado que podem responder "já existe setup somente por env?" sem carregar o runtime completo do canal. |
| `openclaw.channel.persistedAuthState` | Metadados leves do verificador de autenticação persistida que podem responder "já existe algo autenticado?" sem carregar o runtime completo do canal. |
| `openclaw.install.npmSpec` / `openclaw.install.localPath` | Dicas de instalação/atualização para plugins empacotados e publicados externamente. |
| `openclaw.install.defaultChoice` | Caminho de instalação preferido quando múltiplas fontes de instalação estão disponíveis. |
| `openclaw.install.minHostVersion` | Versão mínima suportada do host OpenClaw, usando um piso semver como `>=2026.3.22`. |
| `openclaw.install.allowInvalidConfigRecovery` | Permite um caminho restrito de recuperação por reinstalação de plugin empacotado quando a configuração é inválida. |
| `openclaw.startup.deferConfiguredChannelFullLoadUntilAfterListen` | Permite que superfícies de canal apenas de setup sejam carregadas antes do plugin de canal completo durante a inicialização. |
| Campo | O que significa |
| ----------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------- |
| `openclaw.extensions` | Declara entrypoints nativos de Plugin. |
| `openclaw.setupEntry` | Entrypoint leve apenas de configuração usado durante onboarding e inicialização adiada de canal. |
| `openclaw.channel` | Metadados baratos de catálogo de canal, como rótulos, caminhos de documentação, aliases e texto de seleção. |
| `openclaw.channel.configuredState` | Metadados leves de verificador de estado configurado que podem responder "já existe uma configuração apenas por env?" sem carregar o runtime completo do canal. |
| `openclaw.channel.persistedAuthState` | Metadados leves de verificador de autenticação persistida que podem responder "já existe algo autenticado?" sem carregar o runtime completo do canal. |
| `openclaw.install.npmSpec` / `openclaw.install.localPath` | Dicas de instalação/atualização para plugins empacotados e publicados externamente. |
| `openclaw.install.defaultChoice` | Caminho de instalação preferido quando várias fontes de instalação estão disponíveis. |
| `openclaw.install.minHostVersion` | Versão mínima compatível do host OpenClaw, usando um piso semver como `>=2026.3.22`. |
| `openclaw.install.allowInvalidConfigRecovery` | Permite um caminho restrito de recuperação por reinstalação de Plugin empacotado quando a configuração é inválida. |
| `openclaw.startup.deferConfiguredChannelFullLoadUntilAfterListen` | Permite que superfícies de canal apenas de configuração carreguem antes do Plugin de canal completo durante a inicialização. |
`openclaw.install.minHostVersion` é aplicado durante a instalação e o carregamento do
registro de manifests. Valores inválidos são rejeitados; valores mais novos, mas válidos, fazem o
plugin ser ignorado em hosts mais antigos.
`openclaw.install.minHostVersion` é aplicado durante a instalação e o carregamento do registro de manifestos. Valores inválidos são rejeitados; valores mais novos, porém válidos, fazem o Plugin ser ignorado em hosts mais antigos.
`openclaw.install.allowInvalidConfigRecovery` é intencionalmente restrito. Ele não torna
configurações quebradas arbitrárias instaláveis. Hoje, ele só permite que fluxos de instalação
se recuperem de falhas específicas e obsoletas de upgrade de plugin empacotado, como um
caminho ausente de plugin empacotado ou uma entrada obsoleta `channels.<id>` para esse mesmo
plugin empacotado. Erros de configuração não relacionados ainda bloqueiam a instalação e direcionam os
operadores para `openclaw doctor --fix`.
`openclaw.install.allowInvalidConfigRecovery` é intencionalmente restrito. Ele não torna instaláveis configurações arbitrariamente quebradas. Hoje ele só permite que fluxos de instalação se recuperem de falhas específicas e antigas de upgrade de Plugin empacotado, como um caminho ausente de Plugin empacotado ou uma entrada antiga `channels.<id>` para esse mesmo Plugin empacotado. Erros de configuração não relacionados ainda bloqueiam a instalação e enviam operadores para `openclaw doctor --fix`.
`openclaw.channel.persistedAuthState` é um metadado de pacote para um pequeno módulo
verificador:
`openclaw.channel.persistedAuthState` é um metadado de pacote para um pequeno módulo verificador:
```json
{
@ -512,13 +495,9 @@ verificador:
}
```
Use-o quando fluxos de setup, doctor ou estado configurado precisarem de uma sondagem barata de autenticação
sim/não antes de o plugin de canal completo carregar. A exportação de destino deve ser uma
função pequena que leia apenas o estado persistido; não a encaminhe pelo barrel completo
do runtime do canal.
Use-o quando fluxos de configuração, doctor ou estado configurado precisarem de uma sondagem barata de autenticação sim/não antes de o Plugin de canal completo carregar. A exportação de destino deve ser uma função pequena que leia apenas o estado persistido; não a encaminhe pelo barrel completo de runtime do canal.
`openclaw.channel.configuredState` segue o mesmo formato para verificações baratas de estado
configurado apenas por env:
`openclaw.channel.configuredState` segue o mesmo formato para verificações baratas de estado configurado apenas por env:
```json
{
@ -534,64 +513,45 @@ configurado apenas por env:
}
```
Use-o quando um canal puder responder ao estado configurado a partir de env ou de outras pequenas
entradas não relacionadas ao runtime. Se a verificação precisar da resolução completa de configuração ou do
runtime real do canal, mantenha essa lógica no hook `config.hasConfiguredState` do plugin.
Use-o quando um canal puder responder o estado configurado a partir de env ou outras entradas pequenas sem runtime. Se a verificação precisar da resolução completa da configuração ou do runtime real do canal, mantenha essa lógica no hook `config.hasConfiguredState` do Plugin.
## Requisitos do schema JSON
## Requisitos de JSON Schema
- **Todo plugin deve fornecer um schema JSON**, mesmo que ele não aceite configuração.
- Um schema vazio é aceitável (por exemplo, `{ "type": "object", "additionalProperties": false }`).
- Os schemas são validados no momento de leitura/gravação da configuração, não em runtime.
- **Todo Plugin deve incluir um JSON Schema**, mesmo que não aceite nenhuma configuração.
- Um esquema vazio é aceitável (por exemplo, `{ "type": "object", "additionalProperties": false }`).
- Os esquemas são validados no momento de leitura/gravação da configuração, não em runtime.
## Comportamento de validação
- Chaves desconhecidas em `channels.*` são **erros**, a menos que o ID do canal seja declarado por
um manifest de plugin.
- Chaves desconhecidas em `channels.*` são **erros**, a menos que o ID do canal seja declarado por um manifesto de Plugin.
- `plugins.entries.<id>`, `plugins.allow`, `plugins.deny` e `plugins.slots.*`
devem referenciar IDs de plugin **descobertos**. IDs desconhecidos são **erros**.
- Se um plugin estiver instalado, mas tiver um manifest ou schema quebrado ou ausente,
a validação falha e o Doctor relata o erro do plugin.
- Se a configuração do plugin existir, mas o plugin estiver **desabilitado**, a configuração é mantida e
um **aviso** é exibido no Doctor + logs.
devem referenciar IDs de Plugin **detectáveis**. IDs desconhecidos são **erros**.
- Se um Plugin estiver instalado, mas tiver um manifesto ou esquema ausente ou quebrado,
a validação falha e o Doctor relata o erro do Plugin.
- Se a configuração do Plugin existir, mas o Plugin estiver **desabilitado**, a configuração será mantida e um **aviso** será exibido no Doctor + logs.
Consulte a [Referência de configuração](/pt-BR/gateway/configuration) para todo o schema `plugins.*`.
Consulte [Referência de configuração](/pt-BR/gateway/configuration) para o esquema completo de `plugins.*`.
## Observações
- O manifest é **obrigatório para Plugins nativos do OpenClaw**, incluindo carregamentos locais do sistema de arquivos.
- O runtime ainda carrega o módulo do plugin separadamente; o manifest serve apenas para
descoberta + validação.
- Manifests nativos são analisados com JSON5, então comentários, vírgulas finais e
chaves sem aspas são aceitos, desde que o valor final ainda seja um objeto.
- Apenas os campos de manifest documentados são lidos pelo carregador de manifest. Evite adicionar
chaves personalizadas de nível superior aqui.
- `providerAuthEnvVars` é o caminho barato de metadados para sondagens de autenticação, validação
de marcadores de env e superfícies semelhantes de autenticação de provider que não devem iniciar o runtime do plugin
apenas para inspecionar nomes de env.
- `providerAuthAliases` permite que variantes de provider reutilizem as variáveis de ambiente de autenticação,
perfis de autenticação, autenticação baseada em configuração e escolha de onboarding por chave de API de outro provider
sem codificar essa relação diretamente no core.
- `channelEnvVars` é o caminho barato de metadados para fallback de env do shell, prompts de setup
e superfícies semelhantes de canal que não devem iniciar o runtime do plugin
apenas para inspecionar nomes de env.
- `providerAuthChoices` é o caminho barato de metadados para seletores de escolha de autenticação,
resolução de `--auth-choice`, mapeamento de provider preferido e registro simples de flags de CLI de onboarding
antes de o runtime do provider carregar. Para metadados de assistente de runtime
que exigem código do provider, consulte
[Hooks de runtime do provider](/pt-BR/plugins/architecture#provider-runtime-hooks).
- Tipos exclusivos de plugin são selecionados por meio de `plugins.slots.*`.
- O manifesto é **obrigatório para plugins nativos do OpenClaw**, incluindo carregamentos locais do sistema de arquivos.
- O runtime ainda carrega o módulo do Plugin separadamente; o manifesto é apenas para descoberta + validação.
- Manifestos nativos são analisados com JSON5, então comentários, vírgulas finais e chaves sem aspas são aceitos, desde que o valor final ainda seja um objeto.
- Apenas os campos de manifesto documentados são lidos pelo carregador de manifesto. Evite adicionar chaves personalizadas de nível superior aqui.
- `providerAuthEnvVars` é o caminho barato de metadados para sondagens de autenticação, validação de marcadores de env e superfícies semelhantes de autenticação de provider que não devem iniciar o runtime do Plugin apenas para inspecionar nomes de env.
- `providerAuthAliases` permite que variantes de provider reutilizem as variáveis de ambiente de autenticação, perfis de autenticação, autenticação baseada em configuração e a opção de onboarding com chave de API de outro provider sem hardcodar essa relação no core.
- `channelEnvVars` é o caminho barato de metadados para fallback de shell-env, prompts de configuração e superfícies de canal semelhantes que não devem iniciar o runtime do Plugin apenas para inspecionar nomes de env.
- `providerAuthChoices` é o caminho barato de metadados para seletores de opção de autenticação, resolução de `--auth-choice`, mapeamento de provider preferido e registro simples de flags de CLI de onboarding antes de o runtime do provider carregar. Para metadados de assistente de runtime que exigem código de provider, consulte [Hooks de runtime de provider](/pt-BR/plugins/architecture#provider-runtime-hooks).
- Tipos exclusivos de Plugin são selecionados por meio de `plugins.slots.*`.
- `kind: "memory"` é selecionado por `plugins.slots.memory`.
- `kind: "context-engine"` é selecionado por `plugins.slots.contextEngine`
(padrão: `legacy` builtin).
- `channels`, `providers`, `cliBackends` e `skills` podem ser omitidos quando um
plugin não precisar deles.
- Se seu plugin depender de módulos nativos, documente as etapas de build e quaisquer
requisitos de allowlist do gerenciador de pacotes (por exemplo, `allow-build-scripts` do pnpm
(padrão: `legacy` embutido).
- `channels`, `providers`, `cliBackends` e `skills` podem ser omitidos quando um Plugin não precisar deles.
- Se o seu Plugin depender de módulos nativos, documente as etapas de build e quaisquer requisitos de allowlist do gerenciador de pacotes (por exemplo, pnpm `allow-build-scripts`
- `pnpm rebuild <package>`).
## Relacionado
- [Criando Plugins](/pt-BR/plugins/building-plugins) — introdução a plugins
- [Arquitetura de Plugins](/pt-BR/plugins/architecture) — arquitetura interna
- [Visão geral do SDK](/pt-BR/plugins/sdk-overview) — referência do Plugin SDK
- [Criando Plugins](/pt-BR/plugins/building-plugins) — primeiros passos com plugins
- [Arquitetura de Plugin](/pt-BR/plugins/architecture) — arquitetura interna
- [Visão geral do SDK](/pt-BR/plugins/sdk-overview) — referência do SDK de Plugin

View File

@ -1,99 +1,114 @@
---
read_when:
- Você está criando um novo plugin de canal de mensagens
- Você está criando um novo Plugin de canal de mensagens
- Você quer conectar o OpenClaw a uma plataforma de mensagens
- Você precisa entender a superfície de adaptador `ChannelPlugin`
- Você precisa entender a superfície do adaptador `ChannelPlugin`
sidebarTitle: Channel Plugins
summary: Guia passo a passo para criar um plugin de canal de mensagens para o OpenClaw
title: Criando plugins de canal
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-11T02:46:22Z"
generated_at: "2026-04-15T05:33:50Z"
model: gpt-5.4
provider: openai
source_hash: 8a026e924f9ae8a3ddd46287674443bcfccb0247be504261522b078e1f440aef
source_hash: a7f4c746fe3163a8880e14c433f4db4a1475535d91716a53fb879551d8d62f65
source_path: plugins/sdk-channel-plugins.md
workflow: 15
---
# Criando plugins de canal
# Criando Plugins de canal
Este guia mostra como criar um plugin de canal que conecta o OpenClaw a uma
plataforma de mensagens. Ao final, você terá um canal funcional com segurança de DM,
pareamento, encadeamento de respostas e envio de mensagens.
Este guia apresenta a criação de 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.
<Info>
Se você ainda não criou nenhum plugin do OpenClaw, leia primeiro
[Primeiros passos](/pt-BR/plugins/building-plugins) para entender a estrutura básica
do pacote e a configuração do manifesto.
Se você ainda não criou nenhum Plugin do OpenClaw antes, leia
[Primeiros passos](/pt-BR/plugins/building-plugins) primeiro para entender a estrutura
básica do pacote e a configuração do manifesto.
</Info>
## Como os plugins de canal funcionam
## 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
ferramenta `message` compartilhada no core. Seu plugin é responsável por:
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 allowlists
- **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
- **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 de mensagem compartilhada, pela conexão com prompts, pelo formato externo da chave de sessão,
pela contabilidade genérica de `:thread:` e pelo despacho.
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.
Se a sua plataforma armazena escopo extra dentro de ids de conversa, mantenha esse parsing
no plugin com `messaging.resolveSessionConversation(...)`. Esse é o
hook canônico para mapear `rawId` para o id base da conversa, id opcional
da thread, `baseConversationId` explícito e quaisquer `parentConversationCandidates`.
Ao retornar `parentConversationCandidates`, mantenha a ordem
do pai mais específico para o mais amplo/conversa base.
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
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.
Plugins integrados que precisam do mesmo parsing antes de o registro do canal inicializar
também podem expor um arquivo `session-key-api.ts` de nível superior com um
export `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.
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,
`baseConversationId` explícito e quaisquer `parentConversationCandidates`.
Ao retornar `parentConversationCandidates`, mantenha-os ordenados do
pai mais específico para a conversa pai mais ampla/base.
`messaging.resolveParentConversationCandidates(...)` continua disponível como fallback legado de compatibilidade quando um plugin precisa apenas de fallbacks de pai sobre o id genérico/raw. Se ambos os hooks existirem, o core usa primeiro
`resolveSessionConversation(...).parentConversationCandidates` e só
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
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
recorre a `resolveParentConversationCandidates(...)` quando o hook canônico
os omite.
não os inclui.
## Aprovações e capacidades do canal
A maioria dos plugins de canal não precisa de código específico para aprovações.
A maioria dos Plugins de canal não precisa de código específico para aprovação.
- 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/aprovação nativa/renderização/autenticação em `approvalCapability`.
- 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 seam canônica de autenticação de aprovação.
- `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 exec, 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 exec para distinguir `enabled` de `disabled`, decidir se o canal iniciador oferece suporte a aprovações nativas de exec e incluir o canal nas orientações de fallback para 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.
- 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 sob responsabilidade do canal. Mantenha isso lazy em entrypoints quentes de 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.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.
- 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 desativado explique os controles exatos de configuração necessários para ativar aprovações nativas de exec. 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 no nível superior.
- Se um canal puder inferir identidades estáveis semelhantes a proprietário em DMs 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 destino 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 assumir filtro de requisições, roteamento, deduplicação, expiração, assinatura do gateway e avisos de redirecionamento. `nativeRuntime` é dividido em algumas seams menores:
- 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 view model compartilhado de aprovação para payloads nativos pendentes/resolvidos/expirados ou ações finais
- `transport` — prepara destinos e envia/atualiza/exclui mensagens nativas de aprovação
- `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
- `observe` — hooks opcionais de diagnóstico de entrega
- Se o canal precisar de objetos sob responsabilidade do runtime, como um client, 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 wrapper específico de aprovação.
- Recorra ao nível mais baixo de `createChannelApprovalHandler` ou `createChannelNativeApprovalRuntime` apenas quando a seam orientada por capacidade ainda não for suficientemente expressiva.
- Canais de aprovação nativa devem rotear `accountId` e `approvalKind` por esses helpers. `accountId` mantém a política de aprovação multi-account no escopo correto da conta do bot, e `approvalKind` mantém o comportamento de aprovação de exec versus plugin disponível para o canal sem branches hardcoded no core.
- 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 de id de aprovação entregue de ponta a ponta. Clientes nativos não devem adivinhar nem reescrever o roteamento de aprovação de exec versus plugin a partir de estado local do canal.
- Diferentes tipos de aprovação podem expor intencionalmente superfícies nativas diferentes.
Exemplos integrados atuais:
- O Slack mantém o roteamento de aprovação nativa disponível tanto para ids de exec quanto de plugin.
- O Matrix mantém o mesmo roteamento nativo de DM/canal e UX de reação para aprovações de exec e plugin, ao mesmo tempo em que ainda permite que a autenticação varie por tipo de aprovação.
- `createApproverRestrictedNativeApprovalAdapter` ainda existe como wrapper de compatibilidade, mas código novo deve preferir o construtor de capability e expor `approvalCapability` no plugin.
- 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.
- 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.
Para entrypoints quentes de canal, prefira os subcaminhos de runtime mais estreitos quando precisar apenas de uma parte dessa família:
Para entrypoints quentes do canal, prefira os subcaminhos de runtime mais específicos quando você
precisar de apenas uma parte dessa família:
- `openclaw/plugin-sdk/approval-auth-runtime`
- `openclaw/plugin-sdk/approval-client-runtime`
@ -110,69 +125,76 @@ Da mesma forma, prefira `openclaw/plugin-sdk/setup-runtime`,
`openclaw/plugin-sdk/reply-runtime`,
`openclaw/plugin-sdk/reply-dispatch-runtime`,
`openclaw/plugin-sdk/reply-reference` e
`openclaw/plugin-sdk/reply-chunking` quando você não precisar da
superfície mais ampla.
`openclaw/plugin-sdk/reply-chunking` quando você não precisar da superfície
guarda-chuva mais ampla.
Especificamente para setup:
- `openclaw/plugin-sdk/setup-runtime` cobre os helpers de setup seguros para runtime:
adaptadores de patch de setup seguros para importação (`createPatchedAccountSetupAdapter`,
`createEnvPatchedAccountSetupAdapter`,
`createSetupInputPresenceValidator`), saída de nota de lookup,
`createSetupInputPresenceValidator`), saída de nota de consulta,
`promptResolvedAllowFrom`, `splitSetupEntries` e os builders
delegados de proxy de setup
- `openclaw/plugin-sdk/setup-adapter-runtime` é a seam estreita de adaptador
com suporte a env para `createEnvPatchedAccountSetupAdapter`
- `openclaw/plugin-sdk/channel-setup` cobre os builders de setup com instalação opcional
mais alguns primitivos seguros para setup:
- `openclaw/plugin-sdk/setup-adapter-runtime` é a interface estreita sensível a ambiente
para `createEnvPatchedAccountSetupAdapter`
- `openclaw/plugin-sdk/channel-setup` cobre os builders de setup de instalação opcional
além de alguns primitivos seguros para setup:
`createOptionalChannelSetupSurface`, `createOptionalChannelSetupAdapter`,
Se o seu canal oferece suporte a setup ou autenticação orientados por env e fluxos genéricos de inicialização/configuração devem conhecer esses nomes de env antes de o runtime carregar, 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 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.
`createOptionalChannelSetupWizard`, `DEFAULT_ACCOUNT_ID`,
`createTopLevelChannelDmPolicy`, `setSetupChannelEnabled` e
`splitSetupEntries`
- use a seam mais ampla `openclaw/plugin-sdk/setup` apenas quando também precisar dos helpers compartilhados mais pesados de setup/configuração, como
- use a interface mais ampla `openclaw/plugin-sdk/setup` apenas quando 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 cópia de links de documentação.
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.
Para outros caminhos quentes de canal, prefira os helpers estreitos em vez de superfícies legadas mais amplas:
Para outros caminhos quentes do canal, prefira os helpers estreitos em vez de superfícies
legadas mais amplas:
- `openclaw/plugin-sdk/account-core`,
`openclaw/plugin-sdk/account-id`,
`openclaw/plugin-sdk/account-resolution` e
`openclaw/plugin-sdk/account-helpers` para configuração multi-account e
`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 rota/envelope de entrada e
wiring de registrar e despachar
- `openclaw/plugin-sdk/messaging-targets` para parsing/correspondência de destinos
`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/outbound-media` e
`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 thread-binding
`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 ainda for necessário
um layout legado de campo de payload de agente/mídia
- `openclaw/plugin-sdk/telegram-command-config` para normalização de comandos personalizados do Telegram, validação de duplicatas/conflitos e um contrato estável de fallback para configuração de comandos
- `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
Canais apenas de autenticação normalmente podem parar no caminho padrão: o core lida com aprovações e o plugin só expõe capacidades de saída/autenticação. 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.
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.
## Política de menção de entrada
Mantenha o tratamento de menções de entrada dividido em duas camadas:
- coleta de evidências sob responsabilidade do plugin
- avaliação compartilhada de política
- coleta de evidências pertencente ao 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 ajuste para lógica local do Plugin:
- detecção de resposta ao bot
- detecção de citação do bot
- verificações de participação em thread
- verificações de participação na thread
- exclusões de mensagens de serviço/sistema
- caches nativos da plataforma necessários para comprovar a participação do bot
@ -180,7 +202,7 @@ Bom ajuste para o helper compartilhado:
- `requireMention`
- resultado explícito de menção
- allowlist de menção implícita
- lista de permissão de menção implícita
- bypass de comando
- decisão final de ignorar
@ -228,7 +250,7 @@ if (decision.shouldSkip) return;
```
`api.runtime.channel.mentions` expõe os mesmos helpers compartilhados de menção para
plugins de canal integrados que já dependem de injeção em runtime:
Plugins de canal empacotados que já dependem de injeção em runtime:
- `buildMentionRegexes`
- `matchesMentionPatterns`
@ -237,17 +259,17 @@ plugins de canal integrados que já dependem de injeção em runtime:
- `resolveInboundMentionDecision`
Os helpers mais antigos `resolveMentionGating*` permanecem em
`openclaw/plugin-sdk/channel-inbound` apenas como exports de compatibilidade. Código novo
deve usar `resolveInboundMentionDecision({ facts, policy })`.
`openclaw/plugin-sdk/channel-inbound` apenas como exportações de compatibilidade. Novos códigos
devem usar `resolveInboundMentionDecision({ facts, policy })`.
## Passo a passo
<Steps>
<a id="step-1-package-and-manifest"></a>
<Step title="Pacote e manifesto">
Crie os arquivos padrão do plugin. O campo `channel` em `package.json` é
o que faz deste um plugin de canal. Para a superfície completa de metadados
do pacote, veja [Setup e configuração de plugins](/pt-BR/plugins/sdk-setup#openclaw-channel):
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):
<CodeGroup>
```json package.json
@ -261,7 +283,7 @@ deve usar `resolveInboundMentionDecision({ facts, policy })`.
"channel": {
"id": "acme-chat",
"label": "Acme Chat",
"blurb": "Conecte o OpenClaw ao Acme Chat."
"blurb": "Connect OpenClaw to Acme Chat."
}
}
}
@ -273,7 +295,7 @@ deve usar `resolveInboundMentionDecision({ facts, policy })`.
"kind": "channel",
"channels": ["acme-chat"],
"name": "Acme Chat",
"description": "Plugin de canal Acme Chat",
"description": "Acme Chat channel plugin",
"configSchema": {
"type": "object",
"additionalProperties": false,
@ -296,7 +318,7 @@ deve usar `resolveInboundMentionDecision({ facts, policy })`.
</Step>
<Step title="Crie o objeto do plugin de canal">
<Step title="Crie o objeto do Plugin de canal">
A interface `ChannelPlugin` tem muitas superfícies opcionais de adaptador. Comece com
o mínimo — `id` e `setup` — e adicione adaptadores conforme necessário.
@ -394,15 +416,15 @@ deve usar `resolveInboundMentionDecision({ facts, policy })`.
```
<Accordion title="O que `createChatChannelPlugin` faz por você">
Em vez de implementar manualmente interfaces de adaptador de baixo nível, você passa
opções declarativas e o builder compõe tudo:
Em vez de implementar interfaces de adaptador de baixo nível manualmente, você passa
opções declarativas e o builder as compõe:
| Option | O que ele conecta |
| 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 do modo reply-to (fixo, com escopo de conta ou personalizado) |
| `outbound.attachedResults` | Funções de envio que retornam metadados do resultado (ids de mensagem) |
| `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) |
Você também pode passar objetos brutos de adaptador em vez de opções declarativas
se precisar de controle total.
@ -420,20 +442,20 @@ deve usar `resolveInboundMentionDecision({ facts, policy })`.
export default defineChannelPluginEntry({
id: "acme-chat",
name: "Acme Chat",
description: "Plugin de canal Acme Chat",
description: "Acme Chat channel plugin",
plugin: acmeChatPlugin,
registerCliMetadata(api) {
api.registerCli(
({ program }) => {
program
.command("acme-chat")
.description("Gerenciamento do Acme Chat");
.description("Acme Chat management");
},
{
descriptors: [
{
name: "acme-chat",
description: "Gerenciamento do Acme Chat",
description: "Acme Chat management",
hasSubcommands: false,
},
],
@ -446,15 +468,15 @@ deve usar `resolveInboundMentionDecision({ facts, policy })`.
});
```
Coloque descritores de CLI sob responsabilidade do canal em `registerCliMetadata(...)` para que o OpenClaw
Coloque descritores de CLI pertencentes ao 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 de comandos.
Mantenha `registerFull(...)` para trabalho apenas de runtime.
Se `registerFull(...)` registrar métodos RPC do gateway, use um
prefixo específico do plugin. Namespaces de administração do core (`config.*`,
enquanto carregamentos completos normais ainda capturam os mesmos descritores para o registro
real dos comandos. Mantenha `registerFull(...)` para trabalho exclusivo 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 separação entre modos de registro. Veja
`defineChannelPluginEntry` lida automaticamente com a divisão de modo de registro. Consulte
[Pontos de entrada](/pt-BR/plugins/sdk-entrypoints#definechannelpluginentry) para todas as
opções.
@ -470,15 +492,15 @@ deve usar `resolveInboundMentionDecision({ facts, policy })`.
export default defineSetupPluginEntry(acmeChatPlugin);
```
O OpenClaw carrega isso em vez da entrada completa quando o canal está desativado
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.
Veja [Setup e configuração](/pt-BR/plugins/sdk-setup#setup-entry) para detalhes.
Consulte [Setup e Configuração](/pt-BR/plugins/sdk-setup#setup-entry) para detalhes.
</Step>
<Step title="Lide com mensagens de entrada">
Seu plugin precisa receber mensagens da plataforma e encaminhá-las para
o OpenClaw. O padrão típico é um webhook que verifica a requisição e
<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
a despacha por meio do handler de entrada do seu canal:
```typescript
@ -503,16 +525,16 @@ deve usar `resolveInboundMentionDecision({ facts, policy })`.
```
<Note>
O tratamento de mensagens de entrada é específico de cada canal. Cada plugin de canal é responsável
pelo seu próprio pipeline de entrada. Veja plugins de canal integrados
(por exemplo, o pacote de plugin do Microsoft Teams ou do Google Chat) para padrões reais.
O tratamento de mensagens de entrada é específico de cada canal. Cada Plugin de canal é responsável
pelo seu próprio pipeline de entrada. Veja Plugins de canal empacotados
(por exemplo, o pacote de Plugin do Microsoft Teams ou do Google Chat) para padrões reais.
</Note>
</Step>
<a id="step-6-test"></a>
<Step title="Teste">
Escreva testes colocados junto do código em `src/channel.test.ts`:
Escreva testes colocados ao lado do código em `src/channel.test.ts`:
```typescript src/channel.test.ts
import { describe, it, expect } from "vitest";
@ -550,7 +572,7 @@ Escreva testes colocados junto do código em `src/channel.test.ts`:
pnpm test -- <bundled-plugin-root>/acme-chat/
```
Para helpers de teste compartilhados, veja [Testes](/pt-BR/plugins/sdk-testing).
Para helpers de teste compartilhados, consulte [Testes](/pt-BR/plugins/sdk-testing).
</Step>
</Steps>
@ -559,16 +581,16 @@ Escreva testes colocados junto do código em `src/channel.test.ts`:
```
<bundled-plugin-root>/acme-chat/
├── package.json # metadados openclaw.channel
├── openclaw.plugin.json # Manifesto com esquema de configuração
├── package.json # metadados de openclaw.channel
├── openclaw.plugin.json # Manifesto com schema de configuração
├── index.ts # defineChannelPluginEntry
├── setup-entry.ts # defineSetupPluginEntry
├── api.ts # Exports públicos (opcional)
├── runtime-api.ts # Exports internos de runtime (opcional)
├── api.ts # Exportações públicas (opcional)
├── runtime-api.ts # Exportações internas de runtime (opcional)
└── src/
├── channel.ts # ChannelPlugin via createChatChannelPlugin
├── channel.test.ts # Testes
├── client.ts # Client da API da plataforma
├── client.ts # Cliente de API da plataforma
└── runtime.ts # Armazenamento de runtime (se necessário)
```
@ -576,9 +598,9 @@ Escreva testes colocados junto 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 de conta ou personalizados
Modos de resposta fixos, com escopo por conta ou personalizados
</Card>
<Card title="Integração da ferramenta de mensagem" icon="puzzle" href="/pt-BR/plugins/architecture#channel-plugins-and-the-shared-message-tool">
<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">
@ -590,15 +612,15 @@ Escreva testes colocados junto do código em `src/channel.test.ts`:
</CardGroup>
<Note>
Algumas seams auxiliares integradas ainda existem para manutenção de bundled-plugin e
compatibilidade. Elas não são o padrão recomendado para novos plugins de canal;
prefira os subcaminhos genéricos de channel/setup/reply/runtime da superfície
comum do SDK, a menos que você esteja mantendo diretamente essa família de bundled plugin.
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.
</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 imports por subcaminho
- [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
- [Testes do SDK](/pt-BR/plugins/sdk-testing) — utilitários de teste e testes de contrato
- [Manifesto de plugin](/pt-BR/plugins/manifest) — esquema completo do manifesto
- [Manifesto de Plugin](/pt-BR/plugins/manifest) — schema completo do manifesto

View File

@ -5,21 +5,21 @@ read_when:
summary: Canais de lançamento públicos, nomenclatura de versões e cadência
title: Política de lançamento
x-i18n:
generated_at: "2026-04-14T05:33:33Z"
generated_at: "2026-04-15T05:33:47Z"
model: gpt-5.4
provider: openai
source_hash: 3eaf9f1786b8c9fd4f5a9c657b623cb69d1a485958e1a9b8f108511839b63587
source_hash: 88724307269ab783a9fbf8a0540fea198d8a3add68457f4e64d5707114fa518c
source_path: reference/RELEASING.md
workflow: 15
---
# Política de lançamento
O OpenClaw tem três linhas públicas de lançamento:
O OpenClaw tem três faixas públicas de lançamento:
- stable: lançamentos com tag que publicam no npm `beta` por padrão, ou no npm `latest` quando solicitado explicitamente
- beta: tags de pré-lançamento que publicam no npm `beta`
- dev: a ponta móvel de `main`
- dev: a ponta móvel da `main`
## Nomenclatura de versões
@ -29,122 +29,137 @@ O OpenClaw tem três linhas públicas de lançamento:
- Tag Git: `vYYYY.M.D-N`
- Versão de pré-lançamento beta: `YYYY.M.D-beta.N`
- Tag Git: `vYYYY.M.D-beta.N`
- Não use preenchimento com zero para mês ou dia
- `latest` significa o lançamento stable promovido atual do npm
- Não preencha mês ou dia com zeros à esquerda
- `latest` significa o lançamento npm stable promovido atual
- `beta` significa o destino de instalação beta atual
- Lançamentos stable e de correção stable publicam no npm `beta` por padrão; operadores de lançamento podem direcionar para `latest` explicitamente, ou promover depois uma build beta validada
- Todo lançamento do OpenClaw envia o pacote npm e o app macOS juntos
- Lançamentos stable e correções stable publicam no npm `beta` por padrão; operadores de lançamento podem direcionar explicitamente para `latest` ou promover uma build beta validada depois
- Todo lançamento do OpenClaw entrega o pacote npm e o app macOS juntos
## Cadência de lançamento
## Cadência de lançamentos
- Os lançamentos passam primeiro por beta
- stable vem somente depois que o beta mais recente é validado
- O procedimento detalhado de lançamento, aprovações, credenciais e notas de recuperação é exclusivo para mantenedores
- Os lançamentos seguem primeiro para beta
- stable só vem depois que a beta mais recente é validada
- Procedimento detalhado de lançamento, aprovações, credenciais e notas de recuperação são exclusivos para maintainers
## Verificações prévias de lançamento
## Pré-verificação de lançamento
- Execute `pnpm build && pnpm ui:build` antes de `pnpm release:check` para que os artefatos de lançamento esperados em `dist/*` e o bundle da Control UI existam para a etapa de validação do pack
- Execute `pnpm release:check` antes de todo lançamento com tag
- As verificações de lançamento agora são executadas em um workflow manual separado:
`OpenClaw Release Checks`
- Essa separação é intencional: mantém o caminho real de lançamento no npm curto,
determinístico e focado em artefatos, enquanto verificações live mais lentas ficam em sua própria linha para não atrasar nem bloquear a publicação
- As verificações de lançamento devem ser disparadas a partir da ref de workflow `main` para que a lógica do workflow e os segredos permaneçam canônicos
- Esse workflow aceita uma tag de lançamento existente ou o SHA completo de 40 caracteres do commit atual de `main`
- No modo de commit SHA, ele aceita apenas o HEAD atual de `origin/main`; use uma tag de lançamento para commits de lançamento mais antigos
- A validação prévia apenas de validação de `OpenClaw NPM Release` também aceita o SHA completo de 40 caracteres do commit atual de `main` sem exigir uma tag enviada
- Esse caminho por SHA é apenas para validação e não pode ser promovido para uma publicação real
- No modo SHA, o workflow sintetiza `v<package.json version>` apenas para a verificação dos metadados do pacote; a publicação real ainda exige uma tag de lançamento real
- A validação de runtime de instalação e upgrade entre sistemas operacionais é despachada a partir do workflow chamador privado
`openclaw/releases-private/.github/workflows/openclaw-cross-os-release-checks.yml`,
que invoca o workflow público reutilizável
`.github/workflows/openclaw-cross-os-release-checks-reusable.yml`
- Essa divisão é intencional: mantém o caminho real de lançamento no npm curto,
determinístico e focado em artefatos, enquanto as verificações ao vivo mais lentas ficam em sua própria faixa para não atrasarem nem bloquearem a publicação
- As verificações de lançamento devem ser despachadas a partir da referência de workflow `main` para que a lógica do workflow e os segredos permaneçam canônicos
- Esse workflow aceita uma tag de lançamento existente ou o SHA completo atual de 40 caracteres do commit da `main`
- No modo SHA de commit, ele aceita apenas o HEAD atual de `origin/main`; use uma tag de lançamento para commits de lançamento mais antigos
- A pré-verificação somente de validação de `OpenClaw NPM Release` também aceita o SHA completo atual de 40 caracteres do commit da `main` sem exigir uma tag enviada
- Esse caminho por SHA é apenas de validação e não pode ser promovido para uma publicação real
- No modo SHA, o workflow sintetiza `v<package.json version>` apenas para a verificação de metadados do pacote; a publicação real ainda exige uma tag de lançamento real
- Ambos os workflows mantêm o caminho real de publicação e promoção em runners hospedados pelo GitHub, enquanto o caminho de validação não mutável pode usar os runners Linux maiores da Blacksmith
- Esse workflow executa
`OPENCLAW_LIVE_TEST=1 OPENCLAW_LIVE_CACHE_TEST=1 pnpm test:live:cache`
usando os segredos de workflow `OPENAI_API_KEY` e `ANTHROPIC_API_KEY`
- A validação prévia de lançamento no npm não espera mais pela linha separada de verificações de lançamento
- A pré-verificação de lançamento npm não espera mais pela faixa separada de verificações de lançamento
- Execute `RELEASE_TAG=vYYYY.M.D node --import tsx scripts/openclaw-npm-release-check.ts`
(ou a tag beta/correção correspondente) antes da aprovação
- Depois da publicação no npm, execute
- Após a publicação no npm, execute
`node --import tsx scripts/openclaw-npm-postpublish-verify.ts YYYY.M.D`
(ou a versão beta/correção correspondente) para verificar o caminho de instalação publicado no registro em um prefixo temporário novo
- A automação de lançamento dos mantenedores agora usa pré-verificação seguida de promoção:
- a publicação real no npm deve passar por um `preflight_run_id` bem-sucedido
- A automação de lançamento de maintainers agora usa pré-verificação seguida de promoção:
- a publicação real no npm deve passar por um `preflight_run_id` bem-sucedido do npm
- lançamentos npm stable usam `beta` por padrão
- a publicação npm stable pode direcionar para `latest` explicitamente por meio da entrada do workflow
- a promoção npm stable de `beta` para `latest` continua disponível como um modo manual explícito no workflow confiável `OpenClaw NPM Release`
- publicações stable diretas também podem executar um modo explícito de sincronização de dist-tag que aponta `latest` e `beta` para a versão stable já publicada
- esses modos de dist-tag ainda precisam de um `NPM_TOKEN` válido no ambiente `npm-release`, porque o gerenciamento de `npm dist-tag` é separado da publicação confiável
- `macOS Release` público é somente para validação
- a publicação npm stable pode direcionar explicitamente para `latest` por entrada do workflow
- a mutação de dist-tag do npm baseada em token agora fica em
`openclaw/releases-private/.github/workflows/openclaw-npm-dist-tags.yml`
por segurança, porque `npm dist-tag add` ainda precisa de `NPM_TOKEN`, enquanto o repositório público mantém publicação somente com OIDC
- o `macOS Release` público é apenas de validação
- a publicação real privada do mac deve passar por `preflight_run_id` e `validate_run_id` privados do mac bem-sucedidos
- os caminhos de publicação reais promovem artefatos preparados em vez de reconstruí-los novamente
- Para lançamentos de correção stable como `YYYY.M.D-N`, o verificador pós-publicação também verifica o mesmo caminho de upgrade em prefixo temporário de `YYYY.M.D` para `YYYY.M.D-N`, para que correções de lançamento não possam deixar silenciosamente instalações globais antigas na carga stable base
- A validação prévia de lançamento no npm falha em modo fechado, a menos que o tarball inclua `dist/control-ui/index.html` e uma carga `dist/control-ui/assets/` não vazia, para que não enviemos novamente um painel do navegador vazio
- `pnpm test:install:smoke` também impõe o orçamento de `unpackedSize` do `npm pack` no tarball de atualização candidato, para que o e2e do instalador detecte aumento acidental do pack antes do caminho de publicação de lançamento
- Se o trabalho de lançamento tiver alterado o planejamento de CI, manifestos de tempo de extensões ou matrizes de teste de extensões, regenere e revise as saídas da matriz de workflow `checks-node-extensions` de propriedade do planejador a partir de `.github/workflows/ci.yml` antes da aprovação, para que as notas de lançamento não descrevam um layout de CI desatualizado
- A prontidão de lançamento stable do macOS também inclui as superfícies do atualizador:
- Para lançamentos de correção stable como `YYYY.M.D-N`, o verificador pós-publicação
também verifica o mesmo caminho de upgrade em prefixo temporário de `YYYY.M.D` para `YYYY.M.D-N`,
para que correções de lançamento não deixem silenciosamente instalações globais mais antigas na carga stable base
- A pré-verificação de lançamento npm falha de forma fechada, a menos que o tarball inclua `dist/control-ui/index.html` e uma carga útil não vazia em `dist/control-ui/assets/`,
para que não entreguemos novamente um dashboard de navegador vazio
- `pnpm test:install:smoke` também impõe o orçamento de `unpackedSize` do npm pack no tarball candidato de atualização,
para que o e2e do instalador detecte aumento acidental do pack antes do caminho de publicação do lançamento
- Se o trabalho de lançamento tocou no planejamento de CI, manifestos de tempo de extensões ou matrizes de teste de extensões, regenere e revise as saídas da matriz de workflow `checks-node-extensions`, de propriedade do planner, em `.github/workflows/ci.yml`
antes da aprovação, para que as notas de lançamento não descrevam um layout de CI desatualizado
- A prontidão de lançamento stable no macOS também inclui as superfícies do atualizador:
- o lançamento no GitHub deve terminar com os arquivos empacotados `.zip`, `.dmg` e `.dSYM.zip`
- `appcast.xml` em `main` deve apontar para o novo zip stable após a publicação
- o app empacotado deve manter um bundle id que não seja de depuração, uma URL de feed Sparkle não vazia e um `CFBundleVersion` igual ou superior ao piso canônico de build do Sparkle para essa versão de lançamento
- `appcast.xml` na `main` deve apontar para o novo zip stable após a publicação
- o app empacotado deve manter um bundle id não debug, uma URL de feed Sparkle não vazia
e um `CFBundleVersion` igual ou acima do piso canônico de build do Sparkle
para essa versão de lançamento
## Entradas de workflow do npm
## Entradas do workflow de NPM
`OpenClaw NPM Release` aceita estas entradas controladas pelo operador:
- `tag`: tag de lançamento obrigatória, como `v2026.4.2`, `v2026.4.2-1` ou
`v2026.4.2-beta.1`; quando `preflight_only=true`, também pode ser o SHA completo de 40 caracteres do commit atual de `main` para uma validação prévia somente de validação
- `preflight_only`: `true` para apenas validação/build/package, `false` para o caminho de publicação real
- `preflight_run_id`: obrigatório no caminho de publicação real para que o workflow reutilize o tarball preparado da execução de pré-verificação bem-sucedida
- `npm_dist_tag`: tag de destino do npm para o caminho de publicação; o padrão é `beta`
- `promote_beta_to_latest`: `true` para pular a publicação e mover uma build stable `beta` já publicada para `latest`
- `sync_stable_dist_tags`: `true` para pular a publicação e apontar `latest` e `beta` para uma versão stable já publicada
- `tag`: tag de lançamento obrigatória como `v2026.4.2`, `v2026.4.2-1` ou
`v2026.4.2-beta.1`; quando `preflight_only=true`, também pode ser o
SHA completo atual de 40 caracteres do commit da `main` para pré-verificação apenas de validação
- `preflight_only`: `true` apenas para validação/build/package, `false` para o
caminho de publicação real
- `preflight_run_id`: obrigatório no caminho de publicação real para que o workflow reutilize
o tarball preparado da execução de pré-verificação bem-sucedida
- `npm_dist_tag`: tag de destino no npm para o caminho de publicação; o padrão é `beta`
`OpenClaw Release Checks` aceita estas entradas controladas pelo operador:
- `ref`: tag de lançamento existente ou o SHA completo de 40 caracteres do commit atual de `main` para validar
- `ref`: tag de lançamento existente ou o SHA completo atual de 40 caracteres do commit da `main`
para validar
Regras:
- Tags stable e de correção podem publicar em `beta` ou `latest`
- Tags de pré-lançamento beta podem publicar somente em `beta`
- Tags de pré-lançamento beta podem publicar apenas em `beta`
- A entrada de SHA completo de commit é permitida apenas quando `preflight_only=true`
- O modo por commit SHA das verificações de lançamento também exige o HEAD atual de `origin/main`
- O caminho de publicação real deve usar o mesmo `npm_dist_tag` usado durante a pré-verificação; o workflow verifica esses metadados antes de a publicação continuar
- O modo de promoção deve usar uma tag stable ou de correção, `preflight_only=false`,
`preflight_run_id` vazio e `npm_dist_tag=beta`
- O modo de sincronização de dist-tag deve usar uma tag stable ou de correção,
`preflight_only=false`, `preflight_run_id` vazio, `npm_dist_tag=latest`,
e `promote_beta_to_latest=false`
- Os modos de promoção e sincronização de dist-tag também exigem um `NPM_TOKEN` válido porque `npm dist-tag add` ainda precisa de autenticação npm normal; a publicação confiável cobre apenas o caminho de publicação do pacote
- O modo SHA de commit das verificações de lançamento também exige o HEAD atual de `origin/main`
- O caminho de publicação real deve usar o mesmo `npm_dist_tag` usado durante a pré-verificação;
o workflow verifica esses metadados antes de a publicação continuar
## Sequência de lançamento npm stable
Ao criar um lançamento npm stable:
1. Execute `OpenClaw NPM Release` com `preflight_only=true`
- Antes de existir uma tag, você pode usar o SHA completo atual de `main` para uma simulação somente de validação do workflow de pré-verificação
2. Escolha `npm_dist_tag=beta` para o fluxo normal beta-first, ou `latest` somente quando quiser intencionalmente uma publicação stable direta
3. Execute `OpenClaw Release Checks` separadamente com a mesma tag ou o SHA completo atual de `main` quando quiser cobertura live de cache de prompt
- Isso é separado de propósito para que a cobertura live continue disponível sem reacoplar verificações demoradas ou instáveis ao workflow de publicação
- Antes de existir uma tag, você pode usar o SHA completo atual da `main` para uma execução de teste apenas de validação do workflow de pré-verificação
2. Escolha `npm_dist_tag=beta` para o fluxo normal beta-first, ou `latest` apenas
quando você quiser intencionalmente uma publicação stable direta
3. Execute `OpenClaw Release Checks` separadamente com a mesma tag ou o
SHA completo atual da `main` quando quiser cobertura ao vivo do cache de prompt
- Isso é separado de propósito para que a cobertura ao vivo continue disponível sem
reacoplar verificações longas ou instáveis ao workflow de publicação
4. Salve o `preflight_run_id` bem-sucedido
5. Execute `OpenClaw NPM Release` novamente com `preflight_only=false`, a mesma
`tag`, o mesmo `npm_dist_tag` e o `preflight_run_id` salvo
6. Se o lançamento chegou a `beta`, execute `OpenClaw NPM Release` mais tarde com a mesma `tag` stable, `promote_beta_to_latest=true`, `preflight_only=false`,
`preflight_run_id` vazio e `npm_dist_tag=beta` quando quiser mover essa build publicada para `latest`
7. Se o lançamento foi intencionalmente publicado diretamente em `latest` e `beta`
deve seguir a mesma build stable, execute `OpenClaw NPM Release` com a mesma
`tag` stable, `sync_stable_dist_tags=true`, `promote_beta_to_latest=false`,
`preflight_only=false`, `preflight_run_id` vazio e `npm_dist_tag=latest`
6. Se o lançamento caiu em `beta`, use o workflow privado
`openclaw/releases-private/.github/workflows/openclaw-npm-dist-tags.yml`
para promover essa versão stable de `beta` para `latest`
7. Se o lançamento foi publicado intencionalmente diretamente em `latest` e `beta`
deve seguir imediatamente a mesma build stable, use esse mesmo workflow privado
para apontar ambas as dist-tags para a versão stable, ou deixe sua sincronização
automática agendada mover `beta` depois
Os modos de promoção e sincronização de dist-tag ainda exigem a aprovação do ambiente `npm-release` e um `NPM_TOKEN` válido acessível a essa execução de workflow.
A mutação de dist-tag fica no repositório privado por segurança porque ainda
exige `NPM_TOKEN`, enquanto o repositório público mantém publicação somente com OIDC.
Isso mantém o caminho de publicação direta e o caminho de promoção beta-first ambos documentados e visíveis para o operador.
Isso mantém tanto o caminho de publicação direta quanto o caminho de promoção beta-first
documentados e visíveis para o operador.
## Referências públicas
- [`.github/workflows/openclaw-npm-release.yml`](https://github.com/openclaw/openclaw/blob/main/.github/workflows/openclaw-npm-release.yml)
- [`.github/workflows/openclaw-release-checks.yml`](https://github.com/openclaw/openclaw/blob/main/.github/workflows/openclaw-release-checks.yml)
- [`.github/workflows/openclaw-cross-os-release-checks-reusable.yml`](https://github.com/openclaw/openclaw/blob/main/.github/workflows/openclaw-cross-os-release-checks-reusable.yml)
- [`scripts/openclaw-npm-release-check.ts`](https://github.com/openclaw/openclaw/blob/main/scripts/openclaw-npm-release-check.ts)
- [`scripts/package-mac-dist.sh`](https://github.com/openclaw/openclaw/blob/main/scripts/package-mac-dist.sh)
- [`scripts/make_appcast.sh`](https://github.com/openclaw/openclaw/blob/main/scripts/make_appcast.sh)
Os mantenedores usam a documentação privada de lançamento em
Maintainers usam a documentação privada de lançamento em
[`openclaw/maintainers/release/README.md`](https://github.com/openclaw/maintainers/blob/main/release/README.md)
para o runbook real.

View File

@ -3,13 +3,13 @@ read_when:
- Verificando a cobertura de credenciais SecretRef
- Auditando se uma credencial é elegível para `secrets configure` ou `secrets apply`
- Verificando por que uma credencial está fora da superfície suportada
summary: Superfície canônica de credenciais SecretRef suportadas vs. não suportadas
summary: Superfície canônica suportada vs. não suportada de credenciais SecretRef
title: Superfície de credenciais SecretRef
x-i18n:
generated_at: "2026-04-07T05:31:11Z"
generated_at: "2026-04-15T05:34:18Z"
model: gpt-5.4
provider: openai
source_hash: 211f4b504c5808f7790683066fc2c8b700c705c598f220a264daf971b81cc593
source_hash: dd0b9c379236b17a72f552d6360b8b5a2269009e019c138c6bb50f4f7328ddaf
source_path: reference/secretref-credential-surface.md
workflow: 15
---
@ -18,7 +18,7 @@ x-i18n:
Esta página define a superfície canônica de credenciais SecretRef.
Intenção de escopo:
Intenção do escopo:
- No escopo: credenciais estritamente fornecidas pelo usuário que o OpenClaw não emite nem rotaciona.
- Fora do escopo: credenciais emitidas em runtime ou rotativas, material de refresh OAuth e artefatos semelhantes a sessão.
@ -49,6 +49,7 @@ Intenção de escopo:
- `messages.tts.providers.*.apiKey`
- `tools.web.fetch.firecrawl.apiKey`
- `plugins.entries.brave.config.webSearch.apiKey`
- `plugins.entries.exa.config.webSearch.apiKey`
- `plugins.entries.google.config.webSearch.apiKey`
- `plugins.entries.xai.config.webSearch.apiKey`
- `plugins.entries.moonshot.config.webSearch.apiKey`
@ -122,14 +123,14 @@ Observações:
- Alvos de plano de perfil de autenticação exigem `agentId`.
- Entradas de plano têm como alvo `profiles.*.key` / `profiles.*.token` e gravam refs irmãs (`keyRef` / `tokenRef`).
- Refs de perfil de autenticação estão incluídas na resolução em runtime e na cobertura de auditoria.
- Regra de proteção da política OAuth: `auth.profiles.<id>.mode = "oauth"` não pode ser combinado com entradas SecretRef para esse perfil. Inicialização/recarga e resolução de perfil de autenticação falham rapidamente quando essa política é violada.
- Para provedores de modelo gerenciados por SecretRef, entradas geradas em `agents/*/agent/models.json` persistem marcadores não secretos (não valores secretos resolvidos) para superfícies `apiKey`/header.
- A persistência de marcadores é autoritativa pela origem: o OpenClaw grava marcadores a partir do snapshot de configuração da origem ativa (pré-resolução), não a partir de valores secretos resolvidos em runtime.
- Para pesquisa na web:
- Proteção de política OAuth: `auth.profiles.<id>.mode = "oauth"` não pode ser combinado com entradas SecretRef para esse perfil. Inicialização/reload e resolução de perfil de autenticação falham rapidamente quando essa política é violada.
- Para provedores de modelo gerenciados por SecretRef, entradas geradas em `agents/*/agent/models.json` persistem marcadores não secretos (não valores secretos resolvidos) para superfícies de `apiKey`/cabeçalhos.
- A persistência de marcadores é autoritativa em relação à origem: o OpenClaw grava marcadores a partir do snapshot da configuração da fonte ativa (pré-resolução), não a partir de valores secretos resolvidos em runtime.
- Para busca na web:
- No modo de provedor explícito (`tools.web.search.provider` definido), apenas a chave do provedor selecionado fica ativa.
- No modo automático (`tools.web.search.provider` não definido), apenas a primeira chave de provedor resolvida por precedência fica ativa.
- No modo automático (`tools.web.search.provider` não definido), apenas a primeira chave de provedor que for resolvida por precedência fica ativa.
- No modo automático, refs de provedores não selecionados são tratadas como inativas até serem selecionadas.
- Caminhos legados de provedor `tools.web.search.*` ainda resolvem durante a janela de compatibilidade, mas a superfície canônica de SecretRef é `plugins.entries.<plugin>.config.webSearch.*`.
- Caminhos legados de provedor em `tools.web.search.*` ainda são resolvidos durante a janela de compatibilidade, mas a superfície canônica de SecretRef é `plugins.entries.<plugin>.config.webSearch.*`.
## Credenciais não suportadas
@ -151,4 +152,4 @@ Credenciais fora do escopo incluem:
Justificativa:
- Essas credenciais são emitidas, rotacionadas, carregam sessão ou pertencem a classes duráveis de OAuth que não se encaixam na resolução externa somente leitura de SecretRef.
- Essas credenciais são emitidas, rotacionadas, carregam sessão ou pertencem a classes duráveis de OAuth que não se encaixam na resolução externa de SecretRef somente leitura.

View File

@ -1,104 +1,131 @@
---
description: Real-world OpenClaw projects from the community
read_when:
- Procurando exemplos reais de uso do OpenClaw
- Atualizando os destaques de projetos da comunidade
summary: Projetos e integrações criados pela comunidade com OpenClaw
- Atualizando destaques de projetos da comunidade
summary: Projetos e integrações criados pela comunidade com tecnologia OpenClaw
title: Vitrine
x-i18n:
generated_at: "2026-04-05T12:54:13Z"
generated_at: "2026-04-15T05:34:17Z"
model: gpt-5.4
provider: openai
source_hash: 2917e9a476ef527ddb3e51c610bbafbd145e705c9cc29f191639fb63d238ef70
source_hash: 797d0b85c9eca920240c79d870eb9636216714f3eba871c5ebd0f7f40cf7bbf1
source_path: start/showcase.md
workflow: 15
---
<!-- markdownlint-disable MD033 -->
# Vitrine
Projetos reais da comunidade. Veja o que as pessoas estão criando com OpenClaw.
<div className="showcase-hero">
<p className="showcase-kicker">Criado em chats, terminais, navegadores e salas de estar</p>
<p className="showcase-lead">
Os projetos OpenClaw não são demos de brinquedo. As pessoas estão colocando em produção ciclos de revisão de PR, aplicativos móveis, automação residencial,
sistemas de voz, ferramentas de desenvolvimento e fluxos de trabalho intensivos em memória a partir dos canais que já usam.
</p>
<div className="showcase-actions">
<a href="#videos">Assistir demos</a>
<a href="#fresh-from-discord">Explorar projetos</a>
<a href="https://discord.gg/clawd">Compartilhe o seu</a>
</div>
<div className="showcase-highlights">
<div className="showcase-highlight">
<strong>Criações nativas de chat</strong>
<span>Fluxos de trabalho com Telegram, WhatsApp, Discord, Beeper, chat web e terminal em primeiro lugar.</span>
</div>
<div className="showcase-highlight">
<strong>Automação real</strong>
<span>Reservas, compras, suporte, relatórios e controle de navegador sem esperar por uma API.</span>
</div>
<div className="showcase-highlight">
<strong>Mundo local + físico</strong>
<span>Impressoras, aspiradores, câmeras, dados de saúde, sistemas domésticos e bases de conhecimento pessoais.</span>
</div>
</div>
</div>
<Info>
**Quer aparecer aqui?** Compartilhe seu projeto em [#self-promotion no Discord](https://discord.gg/clawd) ou [marque @openclaw no X](https://x.com/openclaw).
</Info>
## 🎥 OpenClaw em ação
Passo a passo completo de configuração (28 min) por VelvetShark.
<div
style={{
position: "relative",
paddingBottom: "56.25%",
height: 0,
overflow: "hidden",
borderRadius: 16,
}}
>
<iframe
src="https://www.youtube-nocookie.com/embed/SaWSPZoPX34"
title="OpenClaw: A IA self-hosted que a Siri deveria ter sido (configuração completa)"
style={{ position: "absolute", top: 0, left: 0, width: "100%", height: "100%" }}
frameBorder="0"
loading="lazy"
allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share"
allowFullScreen
/>
<div className="showcase-jump-links">
<a href="#videos">Vídeos</a>
<a href="#fresh-from-discord">Novidades do Discord</a>
<a href="#automation-workflows">Automação</a>
<a href="#knowledge-memory">Memória</a>
<a href="#voice-phone">Voz &amp; Telefone</a>
<a href="#infrastructure-deployment">Infraestrutura</a>
<a href="#home-hardware">Casa &amp; Hardware</a>
<a href="#community-projects">Comunidade</a>
<a href="#submit-your-project">Envie um projeto</a>
</div>
[Assistir no YouTube](https://www.youtube.com/watch?v=SaWSPZoPX34)
<h2 id="videos">Vídeos</h2>
<div
style={{
position: "relative",
paddingBottom: "56.25%",
height: 0,
overflow: "hidden",
borderRadius: 16,
}}
>
<iframe
src="https://www.youtube-nocookie.com/embed/mMSKQvlmFuQ"
title="Vídeo de vitrine do OpenClaw"
style={{ position: "absolute", top: 0, left: 0, width: "100%", height: "100%" }}
frameBorder="0"
loading="lazy"
allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share"
allowFullScreen
/>
<p className="showcase-section-intro">
Comece aqui se quiser o caminho mais curto de “o que é isso?” até “ok, entendi”.
</p>
<div className="showcase-video-grid">
<div className="showcase-video-card">
<div className="showcase-video-shell">
<iframe
src="https://www.youtube-nocookie.com/embed/SaWSPZoPX34"
title="OpenClaw: The self-hosted AI that Siri should have been (Full setup)"
loading="lazy"
allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share"
allowFullScreen
/>
</div>
<h3>Passo a passo completo de configuração</h3>
<p>VelvetShark, 28 minutos. Instale, faça o onboarding e tenha um primeiro assistente funcionando de ponta a ponta.</p>
<a href="https://www.youtube.com/watch?v=SaWSPZoPX34">Assistir no YouTube</a>
</div>
<div className="showcase-video-card">
<div className="showcase-video-shell">
<iframe
src="https://www.youtube-nocookie.com/embed/mMSKQvlmFuQ"
title="OpenClaw showcase video"
loading="lazy"
allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share"
allowFullScreen
/>
</div>
<h3>Reel de vitrine da comunidade</h3>
<p>Uma passagem mais rápida por projetos, superfícies e fluxos de trabalho reais criados em torno do OpenClaw.</p>
<a href="https://www.youtube.com/watch?v=mMSKQvlmFuQ">Assistir no YouTube</a>
</div>
<div className="showcase-video-card">
<div className="showcase-video-shell">
<iframe
src="https://www.youtube-nocookie.com/embed/5kkIJNUGFho"
title="OpenClaw community showcase"
loading="lazy"
allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share"
allowFullScreen
/>
</div>
<h3>Projetos no mundo real</h3>
<p>Exemplos da comunidade, de ciclos de programação nativos de chat até hardware e automação pessoal.</p>
<a href="https://www.youtube.com/watch?v=5kkIJNUGFho">Assistir no YouTube</a>
</div>
</div>
[Assistir no YouTube](https://www.youtube.com/watch?v=mMSKQvlmFuQ)
<h2 id="fresh-from-discord">Novidades do Discord</h2>
<div
style={{
position: "relative",
paddingBottom: "56.25%",
height: 0,
overflow: "hidden",
borderRadius: 16,
}}
>
<iframe
src="https://www.youtube-nocookie.com/embed/5kkIJNUGFho"
title="Vitrine da comunidade OpenClaw"
style={{ position: "absolute", top: 0, left: 0, width: "100%", height: "100%" }}
frameBorder="0"
loading="lazy"
allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share"
allowFullScreen
/>
</div>
[Assistir no YouTube](https://www.youtube.com/watch?v=5kkIJNUGFho)
## 🆕 Novidades do Discord
<p className="showcase-section-intro">
Destaques recentes em programação, ferramentas de desenvolvimento, mobile e criação de produtos nativos de chat.
</p>
<CardGroup cols={2}>
<Card title="Avaliação de PR → feedback no Telegram" icon="code-pull-request" href="https://x.com/i/status/2010878524543131691">
<Card title="Revisão de PR → Feedback no Telegram" icon="code-pull-request" href="https://x.com/i/status/2010878524543131691">
**@bangnokia** • `review` `github` `telegram`
O OpenCode conclui a alteração → abre um PR → o OpenClaw revisa o diff e responde no Telegram com “minor suggestions” mais um veredito claro de merge (incluindo correções críticas a aplicar primeiro).
O OpenCode conclui a mudança → abre um PR → o OpenClaw revisa o diff e responde no Telegram com “minor suggestions” e um veredito claro de merge (incluindo correções críticas a aplicar primeiro).
<img src="/assets/showcase/pr-review-telegram.jpg" alt="Feedback de revisão de PR do OpenClaw entregue no Telegram" />
</Card>
@ -106,12 +133,12 @@ O OpenCode conclui a alteração → abre um PR → o OpenClaw revisa o diff e r
<Card title="Skill de adega em minutos" icon="wine-glass" href="https://x.com/i/status/2010916352454791216">
**@prades_maxime** • `skills` `local` `csv`
Pediram ao “Robby” (@openclaw) uma Skill local para adega. Ele solicita uma exportação CSV de exemplo + onde armazená-la, depois cria/testa a Skill rapidamente (962 garrafas no exemplo).
Pediram ao “Robby” (@openclaw) uma Skill local de adega. Ele solicita um exemplo de exportação CSV + onde armazená-lo, depois cria/testa a Skill rapidamente (962 garrafas no exemplo).
<img src="/assets/showcase/wine-cellar-skill.jpg" alt="OpenClaw criando uma Skill local de adega a partir de CSV" />
</Card>
<Card title="Piloto automático para compras no Tesco" icon="cart-shopping" href="https://x.com/i/status/2009724862470689131">
<Card title="Piloto automático de compras no Tesco" icon="cart-shopping" href="https://x.com/i/status/2009724862470689131">
**@marchattonhere** • `automation` `browser` `shopping`
Plano semanal de refeições → itens habituais → reservar horário de entrega → confirmar pedido. Sem APIs, apenas controle do navegador.
@ -122,31 +149,31 @@ Plano semanal de refeições → itens habituais → reservar horário de entreg
<Card title="SNAG de captura de tela para Markdown" icon="scissors" href="https://github.com/am-will/snag">
**@am-will** • `devtools` `screenshots` `markdown`
Tecla de atalho para uma região da tela → visão do Gemini → Markdown instantâneo na área de transferência.
Atalho para uma região da tela → visão do Gemini → Markdown instantâneo na sua área de transferência.
<img src="/assets/showcase/snag.png" alt="Ferramenta SNAG de captura de tela para Markdown" />
</Card>
<Card title="Agents UI" icon="window-maximize" href="https://releaseflow.net/kitze/agents-ui">
<Card title="UI de Agents" icon="window-maximize" href="https://releaseflow.net/kitze/agents-ui">
**@kitze** • `ui` `skills` `sync`
App para desktop para gerenciar Skills/comandos entre Agents, Claude, Codex e OpenClaw.
Aplicativo desktop para gerenciar Skills/comandos em Agents, Claude, Codex e OpenClaw.
<img src="/assets/showcase/agents-ui.jpg" alt="App Agents UI" />
<img src="/assets/showcase/agents-ui.jpg" alt="Aplicativo Agents UI" />
</Card>
<Card title="Notas de voz no Telegram (papla.media)" icon="microphone" href="https://papla.media/docs">
<Card title="Mensagens de voz no Telegram (papla.media)" icon="microphone" href="https://papla.media/docs">
**Comunidade**`voice` `tts` `telegram`
Empacota o TTS do papla.media e envia os resultados como notas de voz no Telegram (sem autoplay irritante).
Encapsula o TTS do papla.media e envia os resultados como mensagens de voz no Telegram (sem reprodução automática irritante).
<img src="/assets/showcase/papla-tts.jpg" alt="Saída de nota de voz no Telegram a partir de TTS" />
<img src="/assets/showcase/papla-tts.jpg" alt="Saída de mensagem de voz no Telegram a partir de TTS" />
</Card>
<Card title="CodexMonitor" icon="eye" href="https://clawhub.ai/odrobnik/codexmonitor">
**@odrobnik** • `devtools` `codex` `brew`
Helper instalado via Homebrew para listar/inspecionar/observar sessões locais do OpenAI Codex (CLI + VS Code).
Auxiliar instalado via Homebrew para listar/inspecionar/monitorar sessões locais do OpenAI Codex (CLI + VS Code).
<img src="/assets/showcase/codexmonitor.png" alt="CodexMonitor no ClawHub" />
</Card>
@ -162,12 +189,12 @@ Controle e solução de problemas de impressoras BambuLab: status, trabalhos, c
<Card title="Transporte de Viena (Wiener Linien)" icon="train" href="https://clawhub.ai/hjanuschka/wienerlinien">
**@hjanuschka** • `travel` `transport` `skill`
Partidas em tempo real, interrupções, status de elevadores e roteamento para o transporte público de Viena.
Partidas em tempo real, interrupções, status de elevadores e rotas para o transporte público de Viena.
<img src="/assets/showcase/wienerlinien.png" alt="Skill Wiener Linien no ClawHub" />
</Card>
<Card title="Refeições escolares no ParentPay" icon="utensils" href="#">
<Card title="Refeições escolares ParentPay" icon="utensils">
**@George5562** • `automation` `browser` `parenting`
Reserva automatizada de refeições escolares no Reino Unido via ParentPay. Usa coordenadas do mouse para clicar com confiabilidade nas células da tabela.
@ -176,10 +203,10 @@ Reserva automatizada de refeições escolares no Reino Unido via ParentPay. Usa
<Card title="Upload para R2 (Send Me My Files)" icon="cloud-arrow-up" href="https://clawhub.ai/skills/r2-upload">
**@julianengel** • `files` `r2` `presigned-urls`
Faça upload para Cloudflare R2/S3 e gere links de download presigned seguros. Perfeito para instâncias remotas do OpenClaw.
Faz upload para Cloudflare R2/S3 e gera links seguros de download pré-assinados. Perfeito para instâncias remotas do OpenClaw.
</Card>
<Card title="App iOS via Telegram" icon="mobile" href="#">
<Card title="App iOS via Telegram" icon="mobile">
**@coard** • `ios` `xcode` `testflight`
Criou um app iOS completo com mapas e gravação de voz, implantado no TestFlight inteiramente via chat no Telegram.
@ -187,57 +214,61 @@ Criou um app iOS completo com mapas e gravação de voz, implantado no TestFligh
<img src="/assets/showcase/ios-testflight.jpg" alt="App iOS no TestFlight" />
</Card>
<Card title="Assistente de saúde com Oura Ring" icon="heart-pulse" href="#">
<Card title="Assistente de saúde com Oura Ring" icon="heart-pulse">
**@AS** • `health` `oura` `calendar`
Assistente pessoal de saúde com IA integrando dados do Oura ring com calendário, compromissos e agenda da academia.
Assistente pessoal de saúde com IA integrando dados do Oura Ring com calendário, compromissos e agenda de academia.
<img src="/assets/showcase/oura-health.png" alt="Assistente de saúde com Oura ring" />
<img src="/assets/showcase/oura-health.png" alt="Assistente de saúde com Oura Ring" />
</Card>
<Card title="Kev's Dream Team (14+ Agents)" icon="robot" href="https://github.com/adam91holt/orchestrated-ai-articles">
<Card title="Dream Team do Kev (14+ Agents)" icon="robot" href="https://github.com/adam91holt/orchestrated-ai-articles">
**@adam91holt** • `multi-agent` `orchestration` `architecture` `manifesto`
Mais de 14 agents sob um gateway com um orquestrador Opus 4.5 delegando a workers do Codex. [Texto técnico](https://github.com/adam91holt/orchestrated-ai-articles) abrangente cobrindo a equipe Dream Team, seleção de modelos, sandboxing, webhooks, heartbeats e fluxos de delegação. [Clawdspace](https://github.com/adam91holt/clawdspace) para sandboxing de agents. [Post no blog](https://adams-ai-journey.ghost.io/2026-the-year-of-the-orchestrator/).
Mais de 14 agentes sob um Gateway com orquestrador Opus 4.5 delegando para workers do Codex. [Texto técnico](https://github.com/adam91holt/orchestrated-ai-articles) abrangente cobrindo a equipe Dream Team, seleção de modelos, sandboxing, webhooks, Heartbeats e fluxos de delegação. [Clawdspace](https://github.com/adam91holt/clawdspace) para sandboxing de agentes. [Post de blog](https://adams-ai-journey.ghost.io/2026-the-year-of-the-orchestrator/).
</Card>
<Card title="Linear CLI" icon="terminal" href="https://github.com/Finesssee/linear-cli">
<Card title="CLI do Linear" icon="terminal" href="https://github.com/Finesssee/linear-cli">
**@NessZerra** • `devtools` `linear` `cli` `issues`
CLI para Linear que se integra com fluxos de trabalho agentic (Claude Code, OpenClaw). Gerencie issues, projetos e fluxos de trabalho a partir do terminal. Primeiro PR externo mesclado!
CLI para o Linear que se integra a fluxos de trabalho agentivos (Claude Code, OpenClaw). Gerencie issues, projetos e fluxos de trabalho a partir do terminal. Primeiro PR externo mesclado!
</Card>
<Card title="Beeper CLI" icon="message" href="https://github.com/blqke/beepcli">
<Card title="CLI do Beeper" icon="message" href="https://github.com/blqke/beepcli">
**@jules** • `messaging` `beeper` `cli` `automation`
Leia, envie e arquive mensagens via Beeper Desktop. Usa a API local MCP do Beeper para que agents gerenciem todos os seus chats (iMessage, WhatsApp etc.) em um só lugar.
Leia, envie e arquive mensagens via Beeper Desktop. Usa a API local MCP do Beeper para que agentes possam gerenciar todos os seus chats (iMessage, WhatsApp etc.) em um só lugar.
</Card>
</CardGroup>
## 🤖 Automação e fluxos de trabalho
<h2 id="automation-workflows">Automação &amp; Fluxos de trabalho</h2>
<p className="showcase-section-intro">
Agendamento, controle do navegador, ciclos de suporte e o lado “simplesmente faça a tarefa para mim” do produto.
</p>
<CardGroup cols={2}>
<Card title="Controle de purificador de ar Winix" icon="wind" href="https://x.com/antonplex/status/2010518442471006253">
**@antonplex** • `automation` `hardware` `air-quality`
Claude Code descobriu e confirmou os controles do purificador; depois o OpenClaw assume para gerenciar a qualidade do ar do ambiente.
O Claude Code descobriu e confirmou os controles do purificador, depois o OpenClaw assume para gerenciar a qualidade do ar do ambiente.
<img src="/assets/showcase/winix-air-purifier.jpg" alt="Controle de purificador de ar Winix via OpenClaw" />
<img src="/assets/showcase/winix-air-purifier.jpg" alt="Controle do purificador de ar Winix via OpenClaw" />
</Card>
<Card title="Belas fotos do céu com câmera" icon="camera" href="https://x.com/signalgaining/status/2010523120604746151">
<Card title="Fotos bonitas do céu com câmera" icon="camera" href="https://x.com/signalgaining/status/2010523120604746151">
**@signalgaining** • `automation` `camera` `skill` `images`
Acionado por uma câmera no telhado: peça ao OpenClaw para tirar uma foto do céu sempre que ele parecer bonito — ele projetou uma Skill e tirou a foto.
Acionado por uma câmera no telhado: pedir ao OpenClaw para tirar uma foto do céu sempre que ele estiver bonito — ele projetou uma Skill e tirou a foto.
<img src="/assets/showcase/roof-camera-sky.jpg" alt="Foto do céu com câmera no telhado capturada pelo OpenClaw" />
<img src="/assets/showcase/roof-camera-sky.jpg" alt="Captura do céu pela câmera do telhado feita pelo OpenClaw" />
</Card>
<Card title="Cena visual de briefing matinal" icon="robot" href="https://x.com/buddyhadry/status/2010005331925954739">
**@buddyhadry** • `automation` `briefing` `images` `telegram`
Um prompt agendado gera uma única imagem de “cena” toda manhã (clima, tarefas, data, publicação/citação favorita) via uma persona do OpenClaw.
Um prompt agendado gera uma única imagem de "cena" toda manhã (clima, tarefas, data, post/citação favorita) por meio de uma persona do OpenClaw.
</Card>
<Card title="Reserva de quadra de padel" icon="calendar-check" href="https://github.com/joshp123/padel-cli">
@ -248,10 +279,10 @@ Um prompt agendado gera uma única imagem de “cena” toda manhã (clima, tare
<img src="/assets/showcase/padel-screenshot.jpg" alt="Captura de tela do padel-cli" />
</Card>
<Card title="Triagem contábil" icon="file-invoice-dollar">
<Card title="Recebimento contábil" icon="file-invoice-dollar">
**Comunidade**`automation` `email` `pdf`
Coleta PDFs do e-mail e prepara documentos para o consultor tributário. Contabilidade mensal no piloto automático.
Coleta PDFs do e-mail, prepara documentos para o consultor tributário. Contabilidade mensal no piloto automático.
</Card>
<Card title="Modo dev no sofá" icon="couch" href="https://davekiss.com">
@ -260,10 +291,10 @@ Um prompt agendado gera uma única imagem de “cena” toda manhã (clima, tare
Reconstruiu o site pessoal inteiro via Telegram enquanto assistia Netflix — Notion → Astro, 18 posts migrados, DNS para Cloudflare. Nunca abriu um laptop.
</Card>
<Card title="Agent de busca de emprego" icon="briefcase">
<Card title="Agente de busca de empregos" icon="briefcase">
**@attol8** • `automation` `api` `skill`
Pesquisa vagas de emprego, compara com palavras-chave do CV e retorna oportunidades relevantes com links. Criado em 30 minutos usando a API JSearch.
Busca vagas de emprego, faz correspondência com palavras-chave do currículo e retorna oportunidades relevantes com links. Criado em 30 minutos usando a API JSearch.
</Card>
<Card title="Criador de Skill para Jira" icon="diagram-project" href="https://x.com/jdrhyne/status/2008336434827002232">
@ -278,21 +309,25 @@ O OpenClaw se conectou ao Jira e depois gerou uma nova Skill na hora (antes de e
Automatizou tarefas do Todoist e fez o OpenClaw gerar a Skill diretamente no chat do Telegram.
</Card>
<Card title="Análise no TradingView" icon="chart-line">
<Card title="Análise do TradingView" icon="chart-line">
**@bheem1798** • `finance` `browser` `automation`
Faz login no TradingView por automação do navegador, captura gráficos e realiza análise técnica sob demanda. Sem API — apenas controle do navegador.
Faz login no TradingView por automação de navegador, captura screenshots dos gráficos e realiza análise técnica sob demanda. Não precisa de API — apenas controle do navegador.
</Card>
<Card title="Auto-suporte no Slack" icon="slack">
<Card title="Suporte automático no Slack" icon="slack">
**@henrymascot** • `slack` `automation` `support`
Observa o canal da empresa no Slack, responde de forma útil e encaminha notificações para o Telegram. Corrigiu autonomamente um bug de produção em um app implantado sem que ninguém pedisse.
Monitora o canal da empresa no Slack, responde de forma útil e encaminha notificações para o Telegram. Corrigiu autonomamente um bug de produção em um aplicativo implantado sem que ninguém pedisse.
</Card>
</CardGroup>
## 🧠 Conhecimento e memória
<h2 id="knowledge-memory">Conhecimento &amp; Memória</h2>
<p className="showcase-section-intro">
Sistemas que indexam, pesquisam, lembram e raciocinam sobre conhecimento pessoal ou de equipe.
</p>
<CardGroup cols={2}>
@ -301,22 +336,22 @@ Observa o canal da empresa no Slack, responde de forma útil e encaminha notific
Motor de aprendizado de chinês com feedback de pronúncia e fluxos de estudo via OpenClaw.
<img src="/assets/showcase/xuezh-pronunciation.jpeg" alt="Feedback de pronúncia do xuezh" />
<img src="/assets/showcase/xuezh-pronunciation.jpeg" alt="feedback de pronúncia do xuezh" />
</Card>
<Card title="Cofre de memória do WhatsApp" icon="vault">
**Comunidade**`memory` `transcription` `indexing`
Ingere exportações completas do WhatsApp, transcreve mais de 1 mil notas de voz, cruza com logs do git e gera relatórios em Markdown com links.
Ingere exportações completas do WhatsApp, transcreve mais de 1 mil notas de voz, cruza com logs do git e gera relatórios Markdown vinculados.
</Card>
<Card title="Busca semântica no Karakeep" icon="magnifying-glass" href="https://github.com/jamesbrooksco/karakeep-semantic-search">
<Card title="Busca semântica do Karakeep" icon="magnifying-glass" href="https://github.com/jamesbrooksco/karakeep-semantic-search">
**@jamesbrooksco** • `search` `vector` `bookmarks`
Adiciona busca vetorial aos favoritos do Karakeep usando embeddings do Qdrant + OpenAI/Ollama.
Adiciona busca vetorial aos favoritos do Karakeep usando embeddings com Qdrant + OpenAI/Ollama.
</Card>
<Card title="Memória de Divertida Mente 2" icon="brain">
<Card title="Memória do Divertida Mente 2" icon="brain">
**Comunidade**`memory` `beliefs` `self-model`
Gerenciador de memória separado que transforma arquivos de sessão em memórias → crenças → modelo de self em evolução.
@ -324,14 +359,18 @@ Observa o canal da empresa no Slack, responde de forma útil e encaminha notific
</CardGroup>
## 🎙️ Voz e telefone
<h2 id="voice-phone">Voz &amp; Telefone</h2>
<p className="showcase-section-intro">
Pontos de entrada orientados por fala, pontes telefônicas e fluxos de trabalho intensivos em transcrição.
</p>
<CardGroup cols={2}>
<Card title="Ponte telefônica Clawdia" icon="phone" href="https://github.com/alejandroOPI/clawdia-bridge">
**@alejandroOPI** • `voice` `vapi` `bridge`
Ponte HTTP entre o assistente de voz Vapi e o OpenClaw. Chamadas telefônicas quase em tempo real com seu agent.
Assistente de voz Vapi ↔ ponte HTTP do OpenClaw. Chamadas telefônicas quase em tempo real com seu agente.
</Card>
<Card title="Transcrição com OpenRouter" icon="microphone" href="https://clawhub.ai/obviyus/openrouter-transcribe">
@ -342,26 +381,30 @@ Transcrição de áudio multilíngue via OpenRouter (Gemini etc.). Disponível n
</CardGroup>
## 🏗️ Infraestrutura e implantação
<h2 id="infrastructure-deployment">Infraestrutura &amp; Implantação</h2>
<p className="showcase-section-intro">
Empacotamento, implantação e integrações que facilitam executar e estender o OpenClaw.
</p>
<CardGroup cols={2}>
<Card title="Add-on do Home Assistant" icon="home" href="https://github.com/ngutman/openclaw-ha-addon">
<Card title="Complemento do Home Assistant" icon="home" href="https://github.com/ngutman/openclaw-ha-addon">
**@ngutman** • `homeassistant` `docker` `raspberry-pi`
Gateway OpenClaw em execução no Home Assistant OS com suporte a túnel SSH e estado persistente.
Gateway do OpenClaw rodando no Home Assistant OS com suporte a túnel SSH e estado persistente.
</Card>
<Card title="Skill do Home Assistant" icon="toggle-on" href="https://clawhub.ai/skills/homeassistant">
**ClawHub**`homeassistant` `skill` `automation`
Controle e automatize dispositivos do Home Assistant com linguagem natural.
Controle e automatize dispositivos do Home Assistant por linguagem natural.
</Card>
<Card title="Empacotamento Nix" icon="snowflake" href="https://github.com/openclaw/nix-openclaw">
**@openclaw** • `nix` `packaging` `deployment`
Configuração do OpenClaw baseada em nix, com tudo incluído, para implantações reproduzíveis.
Configuração do OpenClaw com Nix incluído para implantações reproduzíveis.
</Card>
<Card title="Calendário CalDAV" icon="calendar" href="https://clawhub.ai/skills/caldav-calendar">
@ -372,16 +415,20 @@ Transcrição de áudio multilíngue via OpenRouter (Gemini etc.). Disponível n
</CardGroup>
## 🏠 Casa e hardware
<h2 id="home-hardware">Casa &amp; Hardware</h2>
<p className="showcase-section-intro">
O lado do mundo físico do OpenClaw: casas, sensores, câmeras, aspiradores e outros dispositivos.
</p>
<CardGroup cols={2}>
<Card title="Automação GoHome" icon="house-signal" href="https://github.com/joshp123/gohome">
**@joshp123** • `home` `nix` `grafana`
Automação residencial nativa de Nix com OpenClaw como interface, além de lindos painéis Grafana.
Automação residencial nativa de Nix com OpenClaw como interface, além de lindos painéis no Grafana.
<img src="/assets/showcase/gohome-grafana.png" alt="Painel Grafana do GoHome" />
<img src="/assets/showcase/gohome-grafana.png" alt="Painel do Grafana do GoHome" />
</Card>
<Card title="Aspirador Roborock" icon="robot" href="https://github.com/joshp123/gohome/tree/main/plugins/roborock">
@ -394,32 +441,40 @@ Transcrição de áudio multilíngue via OpenRouter (Gemini etc.). Disponível n
</CardGroup>
## 🌟 Projetos da comunidade
<h2 id="community-projects">Projetos da comunidade</h2>
<p className="showcase-section-intro">
Coisas que cresceram além de um único fluxo de trabalho e viraram produtos ou ecossistemas mais amplos.
</p>
<CardGroup cols={2}>
<Card title="Marketplace StarSwap" icon="star" href="https://star-swap.com/">
**Comunidade**`marketplace` `astronomy` `webapp`
Marketplace completo de equipamentos de astronomia. Criado com/ao redor do ecossistema OpenClaw.
Marketplace completo de equipamentos de astronomia. Criado com/em torno do ecossistema OpenClaw.
</Card>
</CardGroup>
---
## Envie seu projeto
<h2 id="submit-your-project">Envie seu projeto</h2>
Tem algo para compartilhar? Adoraríamos destacá-lo!
<p className="showcase-section-intro">
Se você está criando algo interessante com OpenClaw, envie para nós. Bons screenshots e resultados concretos ajudam.
</p>
Tem algo para compartilhar? Adoraríamos destacar!
<Steps>
<Step title="Compartilhe">
Publique em [#self-promotion no Discord](https://discord.gg/clawd) ou [poste no X marcando @openclaw](https://x.com/openclaw)
</Step>
<Step title="Inclua detalhes">
Conte o que ele faz, inclua o link para o repositório/demo e compartilhe uma captura de tela, se tiver
Conte o que faz, coloque o link do repositório/demo e compartilhe um screenshot, se tiver
</Step>
<Step title="Seja destacado">
Adicionaremos projetos de destaque a esta página
Adicionaremos os projetos de destaque a esta página
</Step>
</Steps>

View File

@ -1,28 +1,28 @@
---
read_when:
- Gerando vídeos por meio do agente
- Configurando provedores e modelos de geração de vídeos
- Configurando provedores e modelos de geração de vídeo
- Entendendo os parâmetros da ferramenta `video_generate`
summary: Gere vídeos a partir de texto, imagens ou vídeos existentes usando 14 backends de provedores
title: Geração de vídeos
title: Geração de vídeo
x-i18n:
generated_at: "2026-04-11T15:16:05Z"
generated_at: "2026-04-15T05:34:27Z"
model: gpt-5.4
provider: openai
source_hash: 0ec159a0bbb6b8a030e68828c0a8bcaf40c8538ecf98bc8ff609dab9d0068263
source_hash: c182f24b25e44f157a820e82a1f7422247f26125956944b5eb98613774268cfe
source_path: tools/video-generation.md
workflow: 15
---
# Geração de vídeos
# Geração de vídeo
Agentes OpenClaw podem gerar vídeos a partir de prompts de texto, imagens de referência ou vídeos existentes. Há suporte para quatorze backends de provedores, cada um com diferentes opções de modelo, modos de entrada e conjuntos de recursos. O agente escolhe automaticamente o provedor certo com base na sua configuração e nas chaves de API disponíveis.
Os agentes do OpenClaw podem gerar vídeos a partir de prompts de texto, imagens de referência ou vídeos existentes. Catorze backends de provedores são compatíveis, cada um com diferentes opções de modelo, modos de entrada e conjuntos de recursos. O agente escolhe o provedor certo automaticamente com base na sua configuração e nas chaves de API disponíveis.
<Note>
A ferramenta `video_generate` só aparece quando pelo menos um provedor de geração de vídeo está disponível. Se você não a vir nas ferramentas do seu agente, defina uma chave de API de provedor ou configure `agents.defaults.videoGenerationModel`.
</Note>
O OpenClaw trata a geração de vídeos como três modos de execução:
O OpenClaw trata a geração de vídeo como três modos de runtime:
- `generate` para solicitações de texto para vídeo sem mídia de referência
- `imageToVideo` quando a solicitação inclui uma ou mais imagens de referência
@ -48,11 +48,11 @@ openclaw config set agents.defaults.videoGenerationModel.primary "google/veo-3.1
> Gere um vídeo cinematográfico de 5 segundos de uma lagosta amigável surfando ao pôr do sol.
O agente chama `video_generate` automaticamente. Nenhuma allowlist de ferramentas é necessária.
O agente chama `video_generate` automaticamente. Não é necessário allowlist de ferramentas.
## O que acontece quando você gera um vídeo
A geração de vídeos é assíncrona. Quando o agente chama `video_generate` em uma sessão:
A geração de vídeo é assíncrona. Quando o agente chama `video_generate` em uma sessão:
1. O OpenClaw envia a solicitação ao provedor e retorna imediatamente um ID de tarefa.
2. O provedor processa o trabalho em segundo plano (normalmente de 30 segundos a 5 minutos, dependendo do provedor e da resolução).
@ -61,7 +61,7 @@ A geração de vídeos é assíncrona. Quando o agente chama `video_generate` em
Enquanto um trabalho está em andamento, chamadas duplicadas de `video_generate` na mesma sessão retornam o status atual da tarefa em vez de iniciar outra geração. Use `openclaw tasks list` ou `openclaw tasks show <taskId>` para verificar o progresso pela CLI.
Fora de execuções de agente com suporte de sessão (por exemplo, invocações diretas da ferramenta), a ferramenta recorre à geração inline e retorna o caminho final da mídia no mesmo turno.
Fora de execuções de agente com suporte de sessão (por exemplo, invocações diretas de ferramenta), a ferramenta recorre à geração inline e retorna o caminho final da mídia no mesmo turno.
### Ciclo de vida da tarefa
@ -69,8 +69,8 @@ Cada solicitação `video_generate` passa por quatro estados:
1. **queued** -- tarefa criada, aguardando o provedor aceitá-la.
2. **running** -- o provedor está processando (normalmente de 30 segundos a 5 minutos, dependendo do provedor e da resolução).
3. **succeeded** -- vídeo pronto; o agente reativa e o publica na conversa.
4. **failed** -- erro do provedor ou tempo limite; o agente reativa com detalhes do erro.
3. **succeeded** -- vídeo pronto; o agente é reativado e o publica na conversa.
4. **failed** -- erro do provedor ou timeout; o agente é reativado com detalhes do erro.
Verifique o status pela CLI:
@ -80,125 +80,146 @@ openclaw tasks show <taskId>
openclaw tasks cancel <taskId>
```
Prevenção de duplicatas: se uma tarefa de vídeo já estiver `queued` ou `running` para a sessão atual, `video_generate` retorna o status da tarefa existente em vez de iniciar uma nova. Use `action: "status"` para verificar explicitamente sem acionar uma nova geração.
Prevenção de duplicidade: se uma tarefa de vídeo já estiver `queued` ou `running` para a sessão atual, `video_generate` retorna o status da tarefa existente em vez de iniciar uma nova. Use `action: "status"` para verificar explicitamente sem acionar uma nova geração.
## Provedores compatíveis
| Provedor | Modelo padrão | Texto | Imagem de referência | Vídeo de referência | Chave de API |
| --------------------- | ------------------------------- | ----- | ----------------------------------------------------- | ------------------- | ----------------------------------------- |
| Alibaba | `wan2.6-t2v` | Sim | Sim (URL remota) | Sim (URL remota) | `MODELSTUDIO_API_KEY` |
| BytePlus (1.0) | `seedance-1-0-pro-250528` | Sim | Até 2 imagens (apenas modelos I2V; primeiro + último quadro) | Não | `BYTEPLUS_API_KEY` |
| BytePlus Seedance 1.5 | `seedance-1-5-pro-251215` | Sim | Até 2 imagens (primeiro + último quadro via função) | Não | `BYTEPLUS_API_KEY` |
| BytePlus Seedance 2.0 | `dreamina-seedance-2-0-260128` | Sim | Até 9 imagens de referência | Até 3 vídeos | `BYTEPLUS_API_KEY` |
| ComfyUI | `workflow` | Sim | 1 imagem | Não | `COMFY_API_KEY` ou `COMFY_CLOUD_API_KEY` |
| fal | `fal-ai/minimax/video-01-live` | Sim | 1 imagem | Não | `FAL_KEY` |
| Google | `veo-3.1-fast-generate-preview` | Sim | 1 imagem | 1 vídeo | `GEMINI_API_KEY` |
| MiniMax | `MiniMax-Hailuo-2.3` | Sim | 1 imagem | Não | `MINIMAX_API_KEY` |
| OpenAI | `sora-2` | Sim | 1 imagem | 1 vídeo | `OPENAI_API_KEY` |
| Qwen | `wan2.6-t2v` | Sim | Sim (URL remota) | Sim (URL remota) | `QWEN_API_KEY` |
| Runway | `gen4.5` | Sim | 1 imagem | 1 vídeo | `RUNWAYML_API_SECRET` |
| Together | `Wan-AI/Wan2.2-T2V-A14B` | Sim | 1 imagem | Não | `TOGETHER_API_KEY` |
| Vydra | `veo3` | Sim | 1 imagem (`kling`) | Não | `VYDRA_API_KEY` |
| xAI | `grok-imagine-video` | Sim | 1 imagem | 1 vídeo | `XAI_API_KEY` |
| Provedor | Modelo padrão | Texto | Ref. de imagem | Ref. de vídeo | Chave de API |
| --------------------- | ------------------------------ | ----- | ----------------------------------------------------- | ---------------- | ----------------------------------------- |
| Alibaba | `wan2.6-t2v` | Sim | Sim (URL remota) | Sim (URL remota) | `MODELSTUDIO_API_KEY` |
| BytePlus (1.0) | `seedance-1-0-pro-250528` | Sim | Até 2 imagens (apenas modelos I2V; primeiro + último quadro) | Não | `BYTEPLUS_API_KEY` |
| BytePlus Seedance 1.5 | `seedance-1-5-pro-251215` | Sim | Até 2 imagens (primeiro + último quadro via papel) | Não | `BYTEPLUS_API_KEY` |
| BytePlus Seedance 2.0 | `dreamina-seedance-2-0-260128` | Sim | Até 9 imagens de referência | Até 3 vídeos | `BYTEPLUS_API_KEY` |
| ComfyUI | `workflow` | Sim | 1 imagem | Não | `COMFY_API_KEY` ou `COMFY_CLOUD_API_KEY` |
| fal | `fal-ai/minimax/video-01-live` | Sim | 1 imagem | Não | `FAL_KEY` |
| Google | `veo-3.1-fast-generate-preview`| Sim | 1 imagem | 1 vídeo | `GEMINI_API_KEY` |
| MiniMax | `MiniMax-Hailuo-2.3` | Sim | 1 imagem | Não | `MINIMAX_API_KEY` |
| OpenAI | `sora-2` | Sim | 1 imagem | 1 vídeo | `OPENAI_API_KEY` |
| Qwen | `wan2.6-t2v` | Sim | Sim (URL remota) | Sim (URL remota) | `QWEN_API_KEY` |
| Runway | `gen4.5` | Sim | 1 imagem | 1 vídeo | `RUNWAYML_API_SECRET` |
| Together | `Wan-AI/Wan2.2-T2V-A14B` | Sim | 1 imagem | Não | `TOGETHER_API_KEY` |
| Vydra | `veo3` | Sim | 1 imagem (`kling`) | Não | `VYDRA_API_KEY` |
| xAI | `grok-imagine-video` | Sim | 1 imagem | 1 vídeo | `XAI_API_KEY` |
Alguns provedores aceitam variáveis de ambiente adicionais ou alternativas para a chave de API. Consulte as [páginas individuais dos provedores](#related) para obter detalhes.
Alguns provedores aceitam variáveis de ambiente adicionais ou alternativas para chave de API. Consulte as [páginas individuais dos provedores](#related) para detalhes.
Execute `video_generate action=list` para inspecionar os provedores, modelos e modos de execução disponíveis em tempo de execução.
Execute `video_generate action=list` para inspecionar provedores, modelos e modos de runtime disponíveis em tempo de execução.
### Matriz de capacidades declarada
### Matriz de capacidade declarada
Este é o contrato explícito de modo usado por `video_generate`, testes de contrato e a varredura live compartilhada.
Este é o contrato explícito de modo usado por `video_generate`, pelos testes de contrato e pela varredura ao vivo compartilhada.
| Provedor | `generate` | `imageToVideo` | `videoToVideo` | Lanes live compartilhadas atualmente |
| -------- | ---------- | -------------- | -------------- | --------------------------------------------------------------------------------------------------------------------------------------- |
| Alibaba | Sim | Sim | Sim | `generate`, `imageToVideo`; `videoToVideo` ignorado porque este provedor exige URLs de vídeo remotas `http(s)` |
| BytePlus | Sim | Sim | Não | `generate`, `imageToVideo` |
| ComfyUI | Sim | Sim | Não | Não está na varredura compartilhada; a cobertura específica de workflow fica com os testes do Comfy |
| fal | Sim | Sim | Não | `generate`, `imageToVideo` |
| Google | Sim | Sim | Sim | `generate`, `imageToVideo`; `videoToVideo` compartilhado ignorado porque a varredura Gemini/Veo atual com buffer não aceita essa entrada |
| MiniMax | Sim | Sim | Não | `generate`, `imageToVideo` |
| OpenAI | Sim | Sim | Sim | `generate`, `imageToVideo`; `videoToVideo` compartilhado ignorado porque este caminho de organização/entrada atualmente exige acesso a inpaint/remix do lado do provedor |
| Qwen | Sim | Sim | Sim | `generate`, `imageToVideo`; `videoToVideo` ignorado porque este provedor exige URLs de vídeo remotas `http(s)` |
| Runway | Sim | Sim | Sim | `generate`, `imageToVideo`; `videoToVideo` só é executado quando o modelo selecionado é `runway/gen4_aleph` |
| Together | Sim | Sim | Não | `generate`, `imageToVideo` |
| Vydra | Sim | Sim | Não | `generate`; `imageToVideo` compartilhado ignorado porque o `veo3` empacotado é somente texto e o `kling` empacotado exige uma URL de imagem remota |
| xAI | Sim | Sim | Sim | `generate`, `imageToVideo`; `videoToVideo` ignorado porque este provedor atualmente exige uma URL MP4 remota |
| Provedor | `generate` | `imageToVideo` | `videoToVideo` | Faixas compartilhadas ao vivo hoje |
| -------- | ---------- | -------------- | -------------- | ---------------------------------------------------------------------------------------------------------------------------------------- |
| Alibaba | Sim | Sim | Sim | `generate`, `imageToVideo`; `videoToVideo` ignorado porque este provedor exige URLs de vídeo remotas `http(s)` |
| BytePlus | Sim | Sim | Não | `generate`, `imageToVideo` |
| ComfyUI | Sim | Sim | Não | Não está na varredura compartilhada; a cobertura específica de workflow fica com os testes do Comfy |
| fal | Sim | Sim | Não | `generate`, `imageToVideo` |
| Google | Sim | Sim | Sim | `generate`, `imageToVideo`; `videoToVideo` compartilhado ignorado porque a varredura atual Gemini/Veo com buffer não aceita essa entrada |
| MiniMax | Sim | Sim | Não | `generate`, `imageToVideo` |
| OpenAI | Sim | Sim | Sim | `generate`, `imageToVideo`; `videoToVideo` compartilhado ignorado porque este caminho atual de organização/entrada precisa de acesso a inpaint/remix do lado do provedor |
| Qwen | Sim | Sim | Sim | `generate`, `imageToVideo`; `videoToVideo` ignorado porque este provedor exige URLs de vídeo remotas `http(s)` |
| Runway | Sim | Sim | Sim | `generate`, `imageToVideo`; `videoToVideo` só é executado quando o modelo selecionado é `runway/gen4_aleph` |
| Together | Sim | Sim | Não | `generate`, `imageToVideo` |
| Vydra | Sim | Sim | Não | `generate`; `imageToVideo` compartilhado ignorado porque o `veo3` incluído é apenas texto e o `kling` incluído exige uma URL de imagem remota |
| xAI | Sim | Sim | Sim | `generate`, `imageToVideo`; `videoToVideo` ignorado porque este provedor atualmente exige uma URL MP4 remota |
## Parâmetros da ferramenta
### Obrigatórios
| Parâmetro | Tipo | Descrição |
| --------- | ------ | ---------------------------------------------------------------------------- |
| Parâmetro | Tipo | Descrição |
| --------- | ------ | -------------------------------------------------------------------------- |
| `prompt` | string | Descrição em texto do vídeo a ser gerado (obrigatória para `action: "generate"`) |
### Entradas de conteúdo
| Parâmetro | Tipo | Descrição |
| ----------- | -------- | -------------------------------------------------------------------------------------------------------------------------------------- |
| `image` | string | Imagem de referência única (caminho ou URL) |
| `images` | string[] | Múltiplas imagens de referência (até 9) |
| `imageRoles`| string[] | Dicas opcionais de função por posição paralelas à lista combinada de imagens. Valores canônicos: `first_frame`, `last_frame`, `reference_image` |
| `video` | string | Vídeo de referência único (caminho ou URL) |
| `videos` | string[] | Múltiplos vídeos de referência (até 4) |
| `videoRoles`| string[] | Dicas opcionais de função por posição paralelas à lista combinada de vídeos. Valor canônico: `reference_video` |
| Parâmetro | Tipo | Descrição |
| ----------- | -------- | ---------------------------------------------------------------------------------------------------------------------------------------- |
| `image` | string | Imagem de referência única (caminho ou URL) |
| `images` | string[] | Várias imagens de referência (até 9) |
| `imageRoles`| string[] | Dicas opcionais de papel por posição em paralelo à lista combinada de imagens. Valores canônicos: `first_frame`, `last_frame`, `reference_image` |
| `video` | string | Vídeo de referência único (caminho ou URL) |
| `videos` | string[] | Vários vídeos de referência (até 4) |
| `videoRoles`| string[] | Dicas opcionais de papel por posição em paralelo à lista combinada de vídeos. Valor canônico: `reference_video` |
| `audioRef` | string | Áudio de referência único (caminho ou URL). Usado, por exemplo, para música de fundo ou referência de voz quando o provedor oferece suporte a entradas de áudio |
| `audioRefs` | string[] | Múltiplos áudios de referência (até 3) |
| `audioRoles`| string[] | Dicas opcionais de função por posição paralelas à lista combinada de áudios. Valor canônico: `reference_audio` |
| `audioRefs` | string[] | Vários áudios de referência (até 3) |
| `audioRoles`| string[] | Dicas opcionais de papel por posição em paralelo à lista combinada de áudios. Valor canônico: `reference_audio` |
As dicas de função são encaminhadas ao provedor como estão. Os valores canônicos vêm da união `VideoGenerationAssetRole`, mas os provedores podem aceitar strings de função adicionais. Os arrays `*Roles` não devem ter mais entradas do que a lista de referência correspondente; erros de contagem recebem uma mensagem clara. Use uma string vazia para deixar uma posição sem definir.
As dicas de papel são encaminhadas ao provedor como estão. Os valores canônicos vêm da união `VideoGenerationAssetRole`, mas os provedores podem aceitar strings de papel adicionais. Arrays `*Roles` não podem ter mais entradas do que a lista de referência correspondente; erros de contagem falham com uma mensagem clara.
Use uma string vazia para deixar uma posição sem valor definido.
### Controles de estilo
| Parâmetro | Tipo | Descrição |
| ---------------- | ------- | ------------------------------------------------------------------------------------ |
| `aspectRatio` | string | `1:1`, `2:3`, `3:2`, `3:4`, `4:3`, `4:5`, `5:4`, `9:16`, `16:9`, `21:9` ou `adaptive` |
| `resolution` | string | `480P`, `720P`, `768P` ou `1080P` |
| `durationSeconds`| number | Duração alvo em segundos (arredondada para o valor compatível mais próximo do provedor) |
| `size` | string | Dica de tamanho quando o provedor oferece suporte a isso |
| `audio` | boolean | Ativa o áudio gerado na saída quando compatível. Diferente de `audioRef*` (entradas) |
| `watermark` | boolean | Ativa ou desativa a marca d'água do provedor quando compatível |
| Parâmetro | Tipo | Descrição |
| ---------------- | ------- | ----------------------------------------------------------------------------------------- |
| `aspectRatio` | string | `1:1`, `2:3`, `3:2`, `3:4`, `4:3`, `4:5`, `5:4`, `9:16`, `16:9`, `21:9` ou `adaptive` |
| `resolution` | string | `480P`, `720P`, `768P` ou `1080P` |
| `durationSeconds`| number | Duração-alvo em segundos (arredondada para o valor compatível mais próximo do provedor) |
| `size` | string | Dica de tamanho quando o provedor oferece suporte a isso |
| `audio` | boolean | Ativa áudio gerado na saída quando compatível. Diferente de `audioRef*` (entradas) |
| `watermark` | boolean | Ativa ou desativa a marca d'água do provedor quando compatível |
`adaptive` é um valor sentinela específico do provedor: ele é encaminhado como está para provedores que declaram `adaptive` em suas capacidades (por exemplo, o BytePlus Seedance o usa para detectar automaticamente a proporção com base nas dimensões da imagem de entrada). Provedores que não o declaram expõem o valor por meio de `details.ignoredOverrides` no resultado da ferramenta para que a omissão fique visível.
`adaptive` é um sentinela específico do provedor: ele é encaminhado como está
para provedores que declaram `adaptive` em suas capacidades (por exemplo, o BytePlus
Seedance o usa para detectar automaticamente a proporção com base nas dimensões
da imagem de entrada). Provedores que não o declaram expõem o valor por meio de
`details.ignoredOverrides` no resultado da ferramenta, para que a omissão fique visível.
### Avançado
| Parâmetro | Tipo | Descrição |
| ---------------- | ------ | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `action` | string | `"generate"` (padrão), `"status"` ou `"list"` |
| `model` | string | Sobrescrita de provedor/modelo (por exemplo, `runway/gen4.5`) |
| `filename` | string | Dica de nome de arquivo de saída |
| `providerOptions`| object | Opções específicas do provedor como um objeto JSON (por exemplo, `{"seed": 42, "draft": true}`). Provedores que declaram um esquema tipado validam as chaves e os tipos; chaves desconhecidas ou incompatibilidades fazem com que o candidato seja ignorado durante o fallback. Provedores sem um esquema declarado recebem as opções como estão. Execute `video_generate action=list` para ver o que cada provedor aceita |
| Parâmetro | Tipo | Descrição |
| ---------------- | ------ | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `action` | string | `"generate"` (padrão), `"status"` ou `"list"` |
| `model` | string | Sobrescrita de provedor/modelo (por exemplo, `runway/gen4.5`) |
| `filename` | string | Dica de nome de arquivo de saída |
| `providerOptions`| object | Opções específicas do provedor como um objeto JSON (por exemplo, `{"seed": 42, "draft": true}`). Provedores que declaram um schema tipado validam as chaves e os tipos; chaves desconhecidas ou incompatibilidades fazem o candidato ser ignorado durante o fallback. Provedores sem schema declarado recebem as opções como estão. Execute `video_generate action=list` para ver o que cada provedor aceita |
Nem todos os provedores oferecem suporte a todos os parâmetros. O OpenClaw já normaliza a duração para o valor compatível mais próximo do provedor e também remapeia dicas de geometria traduzidas, como tamanho para proporção, quando um provedor de fallback expõe uma superfície de controle diferente. Sobrescritas realmente não compatíveis são ignoradas em regime de melhor esforço e relatadas como avisos no resultado da ferramenta. Limites rígidos de capacidade, como entradas de referência demais, falham antes do envio.
Nem todos os provedores oferecem suporte a todos os parâmetros. O OpenClaw já normaliza a duração para o valor compatível mais próximo do provedor e também remapeia dicas de geometria traduzidas, como tamanho para proporção, quando um provedor de fallback expõe uma superfície de controle diferente. Sobrescritas realmente não compatíveis são ignoradas em regime de melhor esforço e informadas como avisos no resultado da ferramenta. Limites rígidos de capacidade (como entradas de referência demais) falham antes do envio.
Os resultados da ferramenta informam as configurações aplicadas. Quando o OpenClaw remapeia duração ou geometria durante o fallback do provedor, os valores retornados de `durationSeconds`, `size`, `aspectRatio` e `resolution` refletem o que foi enviado, e `details.normalization` captura a tradução do solicitado para o aplicado.
Os resultados da ferramenta informam as configurações aplicadas. Quando o OpenClaw remapeia duração ou geometria durante o fallback de provedor, os valores retornados de `durationSeconds`, `size`, `aspectRatio` e `resolution` refletem o que foi enviado, e `details.normalization` captura a tradução de solicitado para aplicado.
As entradas de referência também selecionam o modo de execução:
As entradas de referência também selecionam o modo de runtime:
- Sem mídia de referência: `generate`
- Qualquer imagem de referência: `imageToVideo`
- Qualquer vídeo de referência: `videoToVideo`
- Entradas de áudio de referência não alteram o modo resolvido; elas se aplicam sobre o modo que as referências de imagem/vídeo selecionarem e só funcionam com provedores que declaram `maxInputAudios`
- Qualquer referência de imagem: `imageToVideo`
- Qualquer referência de vídeo: `videoToVideo`
- Entradas de áudio de referência não alteram o modo resolvido; elas se aplicam por cima do modo que as referências de imagem/vídeo selecionarem e só funcionam com provedores que declaram `maxInputAudios`
Referências mistas de imagem e vídeo não são uma superfície de capacidade compartilhada estável.
Prefira um tipo de referência por solicitação.
#### Fallback e opções tipadas
Algumas verificações de capacidade são aplicadas na camada de fallback, e não no limite da ferramenta, para que uma solicitação que exceda os limites do provedor principal ainda possa ser executada em um fallback compatível:
Algumas verificações de capacidade são aplicadas na camada de fallback em vez do
limite da ferramenta, para que uma solicitação que exceda os limites do provedor principal
ainda possa ser executada em um fallback compatível:
- Se o candidato ativo não declarar `maxInputAudios` (ou o declarar como `0`), ele será ignorado quando a solicitação contiver referências de áudio, e o próximo candidato será tentado.
- Se `maxDurationSeconds` do candidato ativo for menor que `durationSeconds` solicitado e o candidato não declarar uma lista `supportedDurationSeconds`, ele será ignorado.
- Se a solicitação contiver `providerOptions` e o candidato ativo declarar explicitamente um esquema tipado de `providerOptions`, o candidato será ignorado quando as chaves fornecidas não estiverem no esquema ou quando os tipos dos valores não corresponderem. Provedores que ainda não declararam um esquema recebem as opções como estão (pass-through compatível com versões anteriores). Um provedor pode desativar explicitamente todas as opções de provedor declarando um esquema vazio (`capabilities.providerOptions: {}`), o que causa a mesma omissão que uma incompatibilidade de tipo.
- Se o candidato ativo não declarar `maxInputAudios` (ou o declarar como
`0`), ele será ignorado quando a solicitação contiver referências de áudio, e o
próximo candidato será tentado.
- Se `maxDurationSeconds` do candidato ativo estiver abaixo de
`durationSeconds` solicitado e o candidato não declarar uma lista
`supportedDurationSeconds`, ele será ignorado.
- Se a solicitação contiver `providerOptions` e o candidato ativo
declarar explicitamente um schema tipado para `providerOptions`, o candidato será
ignorado quando as chaves fornecidas não estiverem no schema ou os tipos dos valores não
corresponderem. Provedores que ainda não declararam um schema recebem as
opções como estão (pass-through compatível com versões anteriores). Um provedor pode
optar explicitamente por não aceitar nenhuma opção de provedor declarando um schema vazio
(`capabilities.providerOptions: {}`), o que causa a mesma omissão que uma
incompatibilidade de tipo.
O primeiro motivo de omissão em uma solicitação é registrado em `warn` para que os operadores vejam quando seu provedor principal foi ignorado; omissões posteriores são registradas em `debug` para manter silenciosas cadeias longas de fallback. Se todos os candidatos forem ignorados, o erro agregado inclui o motivo da omissão de cada um.
O primeiro motivo de omissão em uma solicitação é registrado em `warn` para que operadores vejam
quando seu provedor principal foi ignorado; omissões subsequentes são registradas em
`debug` para manter cadeias longas de fallback silenciosas. Se todos os candidatos forem ignorados,
o erro agregado inclui o motivo de omissão de cada um.
## Ações
- **generate** (padrão) -- cria um vídeo a partir do prompt fornecido e de entradas de referência opcionais.
- **status** -- verifica o estado da tarefa de vídeo em andamento da sessão atual sem iniciar outra geração.
- **list** -- mostra provedores, modelos e suas capacidades disponíveis.
- **generate** (padrão) -- cria um vídeo a partir do prompt fornecido e das entradas de referência opcionais.
- **status** -- verifica o estado da tarefa de vídeo em andamento para a sessão atual sem iniciar outra geração.
- **list** -- mostra os provedores, modelos e suas capacidades disponíveis.
## Seleção de modelo
@ -207,11 +228,12 @@ Ao gerar um vídeo, o OpenClaw resolve o modelo nesta ordem:
1. **Parâmetro de ferramenta `model`** -- se o agente especificar um na chamada.
2. **`videoGenerationModel.primary`** -- da configuração.
3. **`videoGenerationModel.fallbacks`** -- tentados em ordem.
4. **Detecção automática** -- usa provedores que têm autenticação válida, começando pelo provedor padrão atual e depois os provedores restantes em ordem alfabética.
4. **Detecção automática** -- usa provedores que têm autenticação válida, começando pelo provedor padrão atual e depois pelos provedores restantes em ordem alfabética.
Se um provedor falhar, o próximo candidato será tentado automaticamente. Se todos os candidatos falharem, o erro incluirá detalhes de cada tentativa.
Se um provedor falhar, o próximo candidato é tentado automaticamente. Se todos os candidatos falharem, o erro incluirá detalhes de cada tentativa.
Defina `agents.defaults.mediaGenerationAutoProviderFallback: false` se quiser que a geração de vídeos use apenas as entradas explícitas `model`, `primary` e `fallbacks`.
Defina `agents.defaults.mediaGenerationAutoProviderFallback: false` se quiser
que a geração de vídeo use apenas as entradas explícitas `model`, `primary` e `fallbacks`.
```json5
{
@ -228,26 +250,28 @@ Defina `agents.defaults.mediaGenerationAutoProviderFallback: false` se quiser qu
## Observações sobre provedores
| Provedor | Observações |
| --------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| Alibaba | Usa o endpoint assíncrono do DashScope/Model Studio. Imagens e vídeos de referência devem ser URLs remotas `http(s)`. |
| BytePlus (1.0) | ID do provedor `byteplus`. Modelos: `seedance-1-0-pro-250528` (padrão), `seedance-1-0-pro-t2v-250528`, `seedance-1-0-pro-fast-251015`, `seedance-1-0-lite-t2v-250428`, `seedance-1-0-lite-i2v-250428`. Modelos T2V (`*-t2v-*`) não aceitam entradas de imagem; modelos I2V e modelos gerais `*-pro-*` oferecem suporte a uma única imagem de referência (primeiro quadro). Passe a imagem posicionalmente ou defina `role: "first_frame"`. IDs de modelo T2V são alternados automaticamente para a variante I2V correspondente quando uma imagem é fornecida. Chaves `providerOptions` compatíveis: `seed` (number), `draft` (boolean, força 480p), `camera_fixed` (boolean). |
| BytePlus Seedance 1.5 | Requer o plugin [`@openclaw/byteplus-modelark`](https://www.npmjs.com/package/@openclaw/byteplus-modelark). ID do provedor `byteplus-seedance15`. Modelo: `seedance-1-5-pro-251215`. Usa a API unificada `content[]`. Oferece suporte a no máximo 2 imagens de entrada (`first_frame` + `last_frame`). Todas as entradas devem ser URLs remotas `https://`. Defina `role: "first_frame"` / `"last_frame"` em cada imagem ou passe as imagens posicionalmente. `aspectRatio: "adaptive"` detecta automaticamente a proporção a partir da imagem de entrada. `audio: true` é mapeado para `generate_audio`. `providerOptions.seed` (number) é encaminhado. |
| BytePlus Seedance 2.0 | Requer o plugin [`@openclaw/byteplus-modelark`](https://www.npmjs.com/package/@openclaw/byteplus-modelark). ID do provedor `byteplus-seedance2`. Modelos: `dreamina-seedance-2-0-260128`, `dreamina-seedance-2-0-fast-260128`. Usa a API unificada `content[]`. Oferece suporte a até 9 imagens de referência, 3 vídeos de referência e 3 áudios de referência. Todas as entradas devem ser URLs remotas `https://`. Defina `role` em cada asset — valores compatíveis: `"first_frame"`, `"last_frame"`, `"reference_image"`, `"reference_video"`, `"reference_audio"`. `aspectRatio: "adaptive"` detecta automaticamente a proporção a partir da imagem de entrada. `audio: true` é mapeado para `generate_audio`. `providerOptions.seed` (number) é encaminhado. |
| ComfyUI | Execução local ou na nuvem orientada por workflow. Oferece suporte a texto para vídeo e imagem para vídeo por meio do grafo configurado. |
| Provedor | Observações |
| --------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
| Alibaba | Usa o endpoint assíncrono DashScope/Model Studio. Imagens e vídeos de referência devem ser URLs remotas `http(s)`. |
| BytePlus (1.0) | ID do provedor `byteplus`. Modelos: `seedance-1-0-pro-250528` (padrão), `seedance-1-0-pro-t2v-250528`, `seedance-1-0-pro-fast-251015`, `seedance-1-0-lite-t2v-250428`, `seedance-1-0-lite-i2v-250428`. Modelos T2V (`*-t2v-*`) não aceitam entradas de imagem; modelos I2V e modelos gerais `*-pro-*` oferecem suporte a uma única imagem de referência (primeiro quadro). Passe a imagem por posição ou defina `role: "first_frame"`. IDs de modelo T2V são trocados automaticamente para a variante I2V correspondente quando uma imagem é fornecida. Chaves `providerOptions` compatíveis: `seed` (number), `draft` (boolean, força 480p), `camera_fixed` (boolean). |
| BytePlus Seedance 1.5 | Requer o Plugin [`@openclaw/byteplus-modelark`](https://www.npmjs.com/package/@openclaw/byteplus-modelark). ID do provedor `byteplus-seedance15`. Modelo: `seedance-1-5-pro-251215`. Usa a API unificada `content[]`. Oferece suporte a no máximo 2 imagens de entrada (first_frame + last_frame). Todas as entradas devem ser URLs remotas `https://`. Defina `role: "first_frame"` / `"last_frame"` em cada imagem, ou passe as imagens por posição. `aspectRatio: "adaptive"` detecta automaticamente a proporção a partir da imagem de entrada. `audio: true` é mapeado para `generate_audio`. `providerOptions.seed` (number) é encaminhado. |
| BytePlus Seedance 2.0 | Requer o Plugin [`@openclaw/byteplus-modelark`](https://www.npmjs.com/package/@openclaw/byteplus-modelark). ID do provedor `byteplus-seedance2`. Modelos: `dreamina-seedance-2-0-260128`, `dreamina-seedance-2-0-fast-260128`. Usa a API unificada `content[]`. Oferece suporte a até 9 imagens de referência, 3 vídeos de referência e 3 áudios de referência. Todas as entradas devem ser URLs remotas `https://`. Defina `role` em cada asset — valores compatíveis: `"first_frame"`, `"last_frame"`, `"reference_image"`, `"reference_video"`, `"reference_audio"`. `aspectRatio: "adaptive"` detecta automaticamente a proporção a partir da imagem de entrada. `audio: true` é mapeado para `generate_audio`. `providerOptions.seed` (number) é encaminhado. |
| ComfyUI | Execução local ou em nuvem orientada por workflow. Oferece suporte a texto para vídeo e imagem para vídeo por meio do grafo configurado. |
| fal | Usa fluxo com fila para trabalhos de longa duração. Apenas uma única imagem de referência. |
| Google | Usa Gemini/Veo. Oferece suporte a uma imagem ou um vídeo de referência. |
| MiniMax | Apenas uma única imagem de referência. |
| OpenAI | Apenas a sobrescrita `size` é encaminhada. Outras sobrescritas de estilo (`aspectRatio`, `resolution`, `audio`, `watermark`) são ignoradas com um aviso. |
| Qwen | Mesmo backend DashScope do Alibaba. Entradas de referência devem ser URLs remotas `http(s)`; arquivos locais são rejeitados antecipadamente. |
| Runway | Oferece suporte a arquivos locais por meio de URIs de dados. Vídeo para vídeo requer `runway/gen4_aleph`. Execuções somente com texto expõem proporções `16:9` e `9:16`. |
| Together | Apenas uma única imagem de referência. |
| Vydra | Usa `https://www.vydra.ai/api/v1` diretamente para evitar redirecionamentos que descartam a autenticação. `veo3` vem empacotado apenas como texto para vídeo; `kling` exige uma URL de imagem remota. |
| xAI | Oferece suporte a fluxos de texto para vídeo, imagem para vídeo e edição/extensão de vídeo remoto. |
| Google | Usa Gemini/Veo. Oferece suporte a uma imagem ou um vídeo de referência. |
| MiniMax | Apenas uma única imagem de referência. |
| OpenAI | Apenas a sobrescrita de `size` é encaminhada. Outras sobrescritas de estilo (`aspectRatio`, `resolution`, `audio`, `watermark`) são ignoradas com um aviso. |
| Qwen | Mesmo backend DashScope do Alibaba. Entradas de referência devem ser URLs remotas `http(s)`; arquivos locais são rejeitados de imediato. |
| Runway | Oferece suporte a arquivos locais por meio de URIs de dados. Vídeo para vídeo requer `runway/gen4_aleph`. Execuções somente com texto expõem as proporções `16:9` e `9:16`. |
| Together | Apenas uma única imagem de referência. |
| Vydra | Usa `https://www.vydra.ai/api/v1` diretamente para evitar redirecionamentos que descartam autenticação. `veo3` vem incluído apenas como texto para vídeo; `kling` requer uma URL de imagem remota. |
| xAI | Oferece suporte a fluxos de texto para vídeo, imagem para vídeo e edição/extensão de vídeo remoto. |
## Modos de capacidade do provedor
O contrato compartilhado de geração de vídeos agora permite que os provedores declarem capacidades específicas por modo em vez de apenas limites agregados fixos. Novas implementações de provedores devem preferir blocos de modo explícitos:
O contrato compartilhado de geração de vídeo agora permite que os provedores declarem
capacidades específicas por modo, em vez de apenas limites agregados simples. Novas
implementações de provedor devem preferir blocos de modo explícitos:
```typescript
capabilities: {
@ -271,11 +295,15 @@ capabilities: {
}
```
Campos agregados fixos como `maxInputImages` e `maxInputVideos` não são suficientes para anunciar suporte ao modo de transformação. Os provedores devem declarar `generate`, `imageToVideo` e `videoToVideo` explicitamente para que testes live, testes de contrato e a ferramenta compartilhada `video_generate` possam validar o suporte ao modo de forma determinística.
Campos agregados simples como `maxInputImages` e `maxInputVideos` não são
suficientes para anunciar suporte a modos de transformação. Os provedores devem declarar
`generate`, `imageToVideo` e `videoToVideo` explicitamente para que os testes ao vivo,
os testes de contrato e a ferramenta compartilhada `video_generate` possam validar o suporte a modos
de forma determinística.
## Testes live
## Testes ao vivo
Cobertura live opt-in para os provedores compartilhados empacotados:
Cobertura ao vivo opt-in para os provedores compartilhados incluídos:
```bash
OPENCLAW_LIVE_TEST=1 pnpm test:live -- extensions/video-generation-providers.live.test.ts
@ -287,19 +315,35 @@ Wrapper do repositório:
pnpm test:live:media video
```
Este arquivo live carrega variáveis de ambiente ausentes do provedor a partir de `~/.profile`, prioriza chaves de API live/env em vez de perfis de autenticação armazenados por padrão e executa os modos declarados que consegue exercitar com segurança usando mídia local:
Esse arquivo de teste ao vivo carrega variáveis de ambiente de provedores ausentes a partir de `~/.profile`, dá preferência
a chaves de API ao vivo/do ambiente em vez de perfis de autenticação armazenados por padrão e executa
um smoke test seguro para lançamento por padrão:
- `generate` para todo provedor não FAL na varredura
- prompt de lagosta de um segundo
- limite de operação por provedor vindo de `OPENCLAW_LIVE_VIDEO_GENERATION_TIMEOUT_MS`
(`180000` por padrão)
FAL é opt-in porque a latência da fila no lado do provedor pode dominar o tempo de lançamento:
```bash
pnpm test:live:media video --video-providers fal
```
Defina `OPENCLAW_LIVE_VIDEO_GENERATION_FULL_MODES=1` para também executar os modos de transformação declarados
que a varredura compartilhada consegue exercitar com segurança usando mídia local:
- `generate` para todos os provedores na varredura
- `imageToVideo` quando `capabilities.imageToVideo.enabled`
- `videoToVideo` quando `capabilities.videoToVideo.enabled` e o provedor/modelo aceita entrada de vídeo local com buffer na varredura compartilhada
- `videoToVideo` quando `capabilities.videoToVideo.enabled` e o provedor/modelo
aceita entrada de vídeo local com buffer na varredura compartilhada
Atualmente, a lane live compartilhada `videoToVideo` cobre:
Hoje, a faixa ao vivo compartilhada de `videoToVideo` cobre:
- `runway` somente quando você seleciona `runway/gen4_aleph`
- `runway` apenas quando você seleciona `runway/gen4_aleph`
## Configuração
Defina o modelo padrão de geração de vídeos na sua configuração do OpenClaw:
Defina o modelo padrão de geração de vídeo na sua configuração do OpenClaw:
```json5
{
@ -314,7 +358,7 @@ Defina o modelo padrão de geração de vídeos na sua configuração do OpenCla
}
```
Ou via CLI:
Ou pela CLI:
```bash
openclaw config set agents.defaults.videoGenerationModel.primary "qwen/wan2.6-t2v"
@ -323,7 +367,7 @@ openclaw config set agents.defaults.videoGenerationModel.primary "qwen/wan2.6-t2
## Relacionado
- [Visão geral das ferramentas](/pt-BR/tools)
- [Tarefas em segundo plano](/pt-BR/automation/tasks) -- rastreamento de tarefas para geração assíncrona de vídeos
- [Tarefas em segundo plano](/pt-BR/automation/tasks) -- rastreamento de tarefas para geração assíncrona de vídeo
- [Alibaba Model Studio](/pt-BR/providers/alibaba)
- [BytePlus](/pt-BR/concepts/model-providers#byteplus-international)
- [ComfyUI](/pt-BR/providers/comfy)