chore(i18n): refresh pt-BR translations

This commit is contained in:
openclaw-docs-i18n[bot] 2026-04-20 05:50:45 +00:00
parent 2ea29d1a46
commit 741e5b4089
9 changed files with 2603 additions and 2486 deletions

View File

@ -1,30 +1,30 @@
---
read_when:
- Trabalhando em recursos do Telegram ou webhooks
summary: Status de suporte do bot do Telegram, recursos e configuração
- Trabalhando em recursos do Telegram ou Webhooks
summary: Status do bot do Telegram, capacidades e configuração
title: Telegram
x-i18n:
generated_at: "2026-04-05T12:37:54Z"
generated_at: "2026-04-20T05:41:38Z"
model: gpt-5.4
provider: openai
source_hash: 39fbf328375fbc5d08ec2e3eed58b19ee0afa102010ecbc02e074a310ced157e
source_hash: b9903fae98bca0c345aa86d5c29015539c375442524a34d26bd28181470b8477
source_path: channels/telegram.md
workflow: 15
---
# Telegram (Bot API)
# Telegram (API de Bot)
Status: pronto para produção para DMs de bot + grupos via grammY. Long polling é o modo padrão; o modo webhook é opcional.
Status: pronto para produção para DMs de bot + grupos via grammY. O modo padrão é long polling; o modo Webhook é opcional.
<CardGroup cols={3}>
<Card title="Pareamento" icon="link" href="/channels/pairing">
A política padrão de DM para Telegram é `pairing`.
<Card title="Pareamento" icon="link" href="/pt-BR/channels/pairing">
A política padrão de DM para Telegram é pareamento.
</Card>
<Card title="Solução de problemas de canais" icon="wrench" href="/channels/troubleshooting">
<Card title="Solução de problemas do canal" icon="wrench" href="/pt-BR/channels/troubleshooting">
Diagnósticos entre canais e playbooks de reparo.
</Card>
<Card title="Configuração do Gateway" icon="settings" href="/gateway/configuration">
Padrões completos de configuração de canal e exemplos.
<Card title="Configuração do Gateway" icon="settings" href="/pt-BR/gateway/configuration">
Padrões e exemplos completos de configuração de canal.
</Card>
</CardGroup>
@ -34,7 +34,7 @@ Status: pronto para produção para DMs de bot + grupos via grammY. Long polling
<Step title="Crie o token do bot no BotFather">
Abra o Telegram e converse com **@BotFather** (confirme que o identificador é exatamente `@BotFather`).
Execute `/newbot`, siga os prompts e salve o token.
Execute `/newbot`, siga as instruções e salve o token.
</Step>
@ -53,7 +53,7 @@ Status: pronto para produção para DMs de bot + grupos via grammY. Long polling
}
```
Fallback por ambiente: `TELEGRAM_BOT_TOKEN=...` (somente conta padrão).
Fallback por variável de ambiente: `TELEGRAM_BOT_TOKEN=...` (apenas conta padrão).
O Telegram **não** usa `openclaw channels login telegram`; configure o token em config/env e depois inicie o gateway.
</Step>
@ -66,31 +66,31 @@ openclaw pairing list telegram
openclaw pairing approve telegram <CODE>
```
Códigos de pareamento expiram após 1 hora.
Os códigos de pareamento expiram após 1 hora.
</Step>
<Step title="Adicione o bot a um grupo">
Adicione o bot ao seu grupo e depois defina `channels.telegram.groups` e `groupPolicy` para corresponder ao seu modelo de acesso.
Adicione o bot ao seu grupo e depois ajuste `channels.telegram.groups` e `groupPolicy` para corresponder ao seu modelo de acesso.
</Step>
</Steps>
<Note>
A ordem de resolução do token reconhece contas. Na prática, valores em configuração vencem o fallback por ambiente, e `TELEGRAM_BOT_TOKEN` se aplica somente à conta padrão.
A ordem de resolução do token é sensível à conta. Na prática, os valores da config têm prioridade sobre o fallback por variável de ambiente, e `TELEGRAM_BOT_TOKEN` se aplica apenas à conta padrão.
</Note>
## Configurações do lado do Telegram
## Configurações no lado do Telegram
<AccordionGroup>
<Accordion title="Modo de privacidade e visibilidade em grupos">
Bots do Telegram usam **Modo de Privacidade** por padrão, o que limita quais mensagens de grupo eles recebem.
Se o bot precisar ver todas as mensagens do grupo, faça um destes:
Se o bot precisar ver todas as mensagens do grupo, faça uma destas opções:
- desative o modo de privacidade via `/setprivacy`, ou
- torne o bot um administrador do grupo.
- torne o bot administrador do grupo.
Ao alternar o modo de privacidade, remova + adicione novamente o bot em cada grupo para que o Telegram aplique a alteração.
Ao alternar o modo de privacidade, remova + readicione o bot em cada grupo para que o Telegram aplique a mudança.
</Accordion>
@ -103,8 +103,8 @@ A ordem de resolução do token reconhece contas. Na prática, valores em config
<Accordion title="Alternâncias úteis do BotFather">
- `/setjoingroups` para permitir/negar adições a grupos
- `/setprivacy` para comportamento de visibilidade em grupos
- `/setjoingroups` para permitir/negar adição a grupos
- `/setprivacy` para o comportamento de visibilidade em grupos
</Accordion>
</AccordionGroup>
@ -113,24 +113,24 @@ A ordem de resolução do token reconhece contas. Na prática, valores em config
<Tabs>
<Tab title="Política de DM">
`channels.telegram.dmPolicy` controla o acesso a mensagens diretas:
`channels.telegram.dmPolicy` controla o acesso por mensagem direta:
- `pairing` (padrão)
- `allowlist` (exige pelo menos um ID de remetente em `allowFrom`)
- `open` (exige que `allowFrom` inclua `"*"`)
- `disabled`
`channels.telegram.allowFrom` aceita IDs numéricos de usuário do Telegram. Prefixos `telegram:` / `tg:` são aceitos e normalizados.
`channels.telegram.allowFrom` aceita IDs numéricos de usuários do Telegram. Prefixos `telegram:` / `tg:` são aceitos e normalizados.
`dmPolicy: "allowlist"` com `allowFrom` vazio bloqueia todas as DMs e é rejeitado pela validação de configuração.
O onboarding aceita entrada `@username` e a resolve para IDs numéricos.
Se você atualizou e sua configuração contém entradas `@username` na allowlist, execute `openclaw doctor --fix` para resolvê-las (best-effort; requer um token de bot do Telegram).
Se você antes dependia de arquivos de allowlist do pairing store, `openclaw doctor --fix` pode recuperar entradas para `channels.telegram.allowFrom` em fluxos de allowlist (por exemplo quando `dmPolicy: "allowlist"` ainda não tem IDs explícitos).
A configuração solicita apenas IDs numéricos de usuário.
Se você atualizou e sua config contém entradas `@username` na allowlist, execute `openclaw doctor --fix` para resolvê-las (melhor esforço; exige um token de bot do Telegram).
Se você antes dependia de arquivos de allowlist do armazenamento de pareamento, `openclaw doctor --fix` pode recuperar entradas para `channels.telegram.allowFrom` em fluxos de allowlist (por exemplo, quando `dmPolicy: "allowlist"` ainda não tem IDs explícitos).
Para bots com um único dono, prefira `dmPolicy: "allowlist"` com IDs numéricos explícitos em `allowFrom` para manter a política de acesso durável na configuração (em vez de depender de aprovações de pareamento anteriores).
Para bots de um único proprietário, prefira `dmPolicy: "allowlist"` com IDs numéricos explícitos em `allowFrom` para manter a política de acesso persistente na config (em vez de depender de aprovações de pareamento anteriores).
Confusão comum: aprovação de pareamento por DM não significa "este remetente está autorizado em todo lugar".
O pareamento concede acesso por DM apenas. A autorização de remetente em grupos continua vindo de allowlists explícitas na configuração.
Se você quer "estou autorizado uma vez e tanto DMs quanto comandos em grupo funcionam", coloque seu ID numérico de usuário do Telegram em `channels.telegram.allowFrom`.
Confusão comum: a aprovação de pareamento de DM não significa “este remetente está autorizado em todos os lugares”.
O pareamento concede acesso apenas a DM. A autorização de remetente em grupos ainda vem de allowlists explícitas na config.
Se você quer “estou autorizado uma vez e tanto DMs quanto comandos em grupo funcionam”, coloque seu ID numérico de usuário do Telegram em `channels.telegram.allowFrom`.
### Encontrando seu ID de usuário do Telegram
@ -140,7 +140,7 @@ A ordem de resolução do token reconhece contas. Na prática, valores em config
2. Execute `openclaw logs --follow`.
3. Leia `from.id`.
Método oficial da Bot API:
Método oficial da API de Bot:
```bash
curl "https://api.telegram.org/bot<bot_token>/getUpdates"
@ -151,28 +151,28 @@ curl "https://api.telegram.org/bot<bot_token>/getUpdates"
</Tab>
<Tab title="Política de grupo e allowlists">
Dois controles se aplicam juntos:
Dois controles se aplicam em conjunto:
1. **Quais grupos são permitidos** (`channels.telegram.groups`)
- sem configuração de `groups`:
- com `groupPolicy: "open"`: qualquer grupo pode passar nas verificações de ID de grupo
- com `groupPolicy: "allowlist"` (padrão): grupos são bloqueados até você adicionar entradas em `groups` (ou `"*"`)
- `groups` configurado: funciona como allowlist (IDs explícitos ou `"*"`)
- com `groupPolicy: "allowlist"` (padrão): grupos são bloqueados até que você adicione entradas em `groups` (ou `"*"`)
- `groups` configurado: atua como allowlist (IDs explícitos ou `"*"`)
2. **Quais remetentes são permitidos em grupos** (`channels.telegram.groupPolicy`)
- `open`
- `allowlist` (padrão)
- `disabled`
`groupAllowFrom` é usado para filtragem de remetentes em grupo. Se não estiver definido, o Telegram recai para `allowFrom`.
Entradas de `groupAllowFrom` devem ser IDs numéricos de usuário do Telegram (prefixos `telegram:` / `tg:` são normalizados).
Não coloque IDs de chat de grupo ou supergrupo do Telegram em `groupAllowFrom`. IDs de chat negativos pertencem a `channels.telegram.groups`.
`groupAllowFrom` é usado para filtragem de remetentes em grupos. Se não estiver definido, o Telegram usa `allowFrom` como fallback.
As entradas de `groupAllowFrom` devem ser IDs numéricos de usuários do Telegram (prefixos `telegram:` / `tg:` são normalizados).
Não coloque IDs de chat de grupo ou supergrupo do Telegram em `groupAllowFrom`. IDs negativos de chat pertencem a `channels.telegram.groups`.
Entradas não numéricas são ignoradas para autorização de remetente.
Limite de segurança (`2026.2.25+`): autorização de remetente em grupo **não** herda aprovações do pairing store de DM.
Limite de segurança (`2026.2.25+`): a autenticação de remetente em grupo **não** herda aprovações do armazenamento de pareamento de DM.
O pareamento continua sendo apenas para DM. Para grupos, defina `groupAllowFrom` ou `allowFrom` por grupo/por tópico.
Se `groupAllowFrom` não estiver definido, o Telegram recai para `allowFrom` da configuração, não para o pairing store.
Padrão prático para bots com um único dono: defina seu ID de usuário em `channels.telegram.allowFrom`, deixe `groupAllowFrom` indefinido e permita os grupos-alvo em `channels.telegram.groups`.
Observação de runtime: se `channels.telegram` estiver completamente ausente, o runtime assume por padrão `groupPolicy="allowlist"` em fail-closed, a menos que `channels.defaults.groupPolicy` esteja definido explicitamente.
Se `groupAllowFrom` não estiver definido, o Telegram usa `allowFrom` da config como fallback, não o armazenamento de pareamento.
Padrão prático para bots de um único proprietário: defina seu ID de usuário em `channels.telegram.allowFrom`, deixe `groupAllowFrom` sem definir e permita os grupos de destino em `channels.telegram.groups`.
Observação de runtime: se `channels.telegram` estiver completamente ausente, o runtime usa por padrão `groupPolicy="allowlist"` com fail-closed, a menos que `channels.defaults.groupPolicy` esteja definido explicitamente.
Exemplo: permitir qualquer membro em um grupo específico:
@ -213,7 +213,7 @@ curl "https://api.telegram.org/bot<bot_token>/getUpdates"
- Coloque IDs negativos de grupo ou supergrupo do Telegram como `-1001234567890` em `channels.telegram.groups`.
- Coloque IDs de usuário do Telegram como `8734062810` em `groupAllowFrom` quando quiser limitar quais pessoas dentro de um grupo permitido podem acionar o bot.
- Use `groupAllowFrom: ["*"]` somente quando quiser que qualquer membro de um grupo permitido possa falar com o bot.
- Use `groupAllowFrom: ["*"]` apenas quando quiser que qualquer membro de um grupo permitido possa falar com o bot.
</Warning>
</Tab>
@ -228,12 +228,12 @@ curl "https://api.telegram.org/bot<bot_token>/getUpdates"
- `agents.list[].groupChat.mentionPatterns`
- `messages.groupChat.mentionPatterns`
Alternâncias por comando no nível da sessão:
Alternâncias de comando em nível de sessão:
- `/activation always`
- `/activation mention`
Elas atualizam apenas o estado da sessão. Use configuração para persistência.
Elas atualizam apenas o estado da sessão. Use a config para persistência.
Exemplo de configuração persistente:
@ -249,24 +249,24 @@ curl "https://api.telegram.org/bot<bot_token>/getUpdates"
}
```
Obtendo o ID do chat em grupo:
Obtendo o ID do chat de grupo:
- encaminhe uma mensagem de grupo para `@userinfobot` / `@getidsbot`
- encaminhe uma mensagem do grupo para `@userinfobot` / `@getidsbot`
- ou leia `chat.id` em `openclaw logs --follow`
- ou inspecione `getUpdates` da Bot API
- ou inspecione `getUpdates` da API de Bot
</Tab>
</Tabs>
## Comportamento em runtime
- O Telegram é gerenciado pelo processo do gateway.
- O Telegram é controlado pelo processo do gateway.
- O roteamento é determinístico: respostas recebidas do Telegram voltam para o Telegram (o modelo não escolhe canais).
- Mensagens de entrada são normalizadas para o envelope compartilhado de canal com metadados de resposta e placeholders de mídia.
- Sessões de grupo são isoladas por ID do grupo. Tópicos de fórum acrescentam `:topic:<threadId>` para manter os tópicos isolados.
- Mensagens de DM podem carregar `message_thread_id`; o OpenClaw as roteia com chaves de sessão cientes da thread e preserva o ID da thread nas respostas.
- O long polling usa grammY runner com sequenciamento por chat/por thread. A concorrência geral do runner sink usa `agents.defaults.maxConcurrent`.
- A Telegram Bot API não oferece suporte a confirmação de leitura (`sendReadReceipts` não se aplica).
- Mensagens recebidas são normalizadas no envelope compartilhado de canal com metadados de resposta e placeholders de mídia.
- Sessões de grupo são isoladas por ID de grupo. Tópicos de fórum adicionam `:topic:<threadId>` para manter os tópicos isolados.
- Mensagens de DM podem carregar `message_thread_id`; o OpenClaw as roteia com chaves de sessão sensíveis a thread e preserva o ID da thread para as respostas.
- O long polling usa o runner do grammY com sequenciamento por chat/por thread. A concorrência geral do sink do runner usa `agents.defaults.maxConcurrent`.
- A API de Bot do Telegram não tem suporte a confirmação de leitura (`sendReadReceipts` não se aplica).
## Referência de recursos
@ -281,34 +281,34 @@ curl "https://api.telegram.org/bot<bot_token>/getUpdates"
- `channels.telegram.streaming` é `off | partial | block | progress` (padrão: `partial`)
- `progress` é mapeado para `partial` no Telegram (compatibilidade com nomenclatura entre canais)
- valores legados booleanos de `channels.telegram.streamMode` e `streaming` são mapeados automaticamente
- valores legados `channels.telegram.streamMode` e booleanos `streaming` são mapeados automaticamente
Para respostas somente de texto:
Para respostas apenas de texto:
- DM: o OpenClaw mantém a mesma mensagem de prévia e faz uma edição final no lugar (sem segunda mensagem)
- grupo/tópico: o OpenClaw mantém a mesma mensagem de prévia e faz uma edição final no lugar (sem segunda mensagem)
Para respostas complexas (por exemplo payloads de mídia), o OpenClaw recai para a entrega final normal e depois limpa a mensagem de prévia.
Para respostas complexas (por exemplo, payloads de mídia), o OpenClaw usa fallback para a entrega final normal e depois limpa a mensagem de prévia.
O streaming de prévia é separado do block streaming. Quando o block streaming é ativado explicitamente para Telegram, o OpenClaw ignora o stream de prévia para evitar streaming duplo.
Se o transporte nativo de rascunho estiver indisponível/for rejeitado, o OpenClaw recai automaticamente para `sendMessage` + `editMessageText`.
Se o transporte nativo de rascunho não estiver disponível/for rejeitado, o OpenClaw usa automaticamente `sendMessage` + `editMessageText`.
Stream de raciocínio somente do Telegram:
Stream de raciocínio somente para Telegram:
- `/reasoning stream` envia o raciocínio para a prévia ao vivo durante a geração
- `/reasoning stream` envia o raciocínio para a prévia ao vivo enquanto gera
- a resposta final é enviada sem o texto de raciocínio
</Accordion>
<Accordion title="Formatação e fallback para HTML">
O texto de saída usa `parse_mode: "HTML"` do Telegram.
O texto de saída usa Telegram `parse_mode: "HTML"`.
- Texto em estilo Markdown é renderizado em HTML seguro para Telegram.
- HTML bruto do modelo é escapado para reduzir falhas de parse do Telegram.
- Se o Telegram rejeitar o HTML parseado, o OpenClaw tenta novamente como texto simples.
- Texto no estilo Markdown é renderizado como HTML seguro para Telegram.
- HTML bruto do modelo é escapado para reduzir falhas de parsing no Telegram.
- Se o Telegram rejeitar o HTML processado, o OpenClaw tenta novamente como texto simples.
Prévias de link são ativadas por padrão e podem ser desativadas com `channels.telegram.linkPreview: false`.
As prévias de links ficam ativadas por padrão e podem ser desativadas com `channels.telegram.linkPreview: false`.
</Accordion>
@ -317,17 +317,17 @@ curl "https://api.telegram.org/bot<bot_token>/getUpdates"
Padrões de comandos nativos:
- `commands.native: "auto"` ativa comandos nativos para o Telegram
- `commands.native: "auto"` ativa comandos nativos para Telegram
Adicione entradas personalizadas ao menu de comandos:
Adicione entradas de menu de comando personalizado:
```json5
{
channels: {
telegram: {
customCommands: [
{ command: "backup", description: "Git backup" },
{ command: "generate", description: "Create an image" },
{ command: "backup", description: "Backup do Git" },
{ command: "generate", description: "Criar uma imagem" },
],
},
},
@ -336,40 +336,40 @@ curl "https://api.telegram.org/bot<bot_token>/getUpdates"
Regras:
- nomes são normalizados (remove `/` inicial, minúsculas)
- os nomes são normalizados (remover `/` inicial, minúsculas)
- padrão válido: `a-z`, `0-9`, `_`, comprimento `1..32`
- comandos personalizados não podem substituir comandos nativos
- comandos personalizados não podem sobrescrever comandos nativos
- conflitos/duplicatas são ignorados e registrados em log
Observações:
- comandos personalizados são apenas entradas de menu; eles não implementam comportamento automaticamente
- comandos de plugin/Skills ainda podem funcionar quando digitados, mesmo que não apareçam no menu do Telegram
- comandos de Plugin/Skills ainda podem funcionar quando digitados, mesmo que não apareçam no menu do Telegram
Se os comandos nativos estiverem desativados, os comandos integrados serão removidos. Comandos personalizados/de plugin ainda podem ser registrados se configurados.
Se os comandos nativos estiverem desativados, os embutidos serão removidos. Comandos personalizados/de Plugin ainda podem ser registrados se configurados.
Falhas comuns de configuração:
- `setMyCommands failed` com `BOT_COMMANDS_TOO_MUCH` significa que o menu do Telegram ainda excedeu o limite após o corte; reduza comandos personalizados/de plugin/Skills ou desative `channels.telegram.commands.native`.
- `setMyCommands failed` com erros de rede/fetch normalmente significa que o DNS/HTTPS de saída para `api.telegram.org` está bloqueado.
- `setMyCommands failed` com `BOT_COMMANDS_TOO_MUCH` significa que o menu do Telegram ainda excedeu o limite após o corte; reduza comandos de Plugin/Skills/personalizados ou desative `channels.telegram.commands.native`.
- `setMyCommands failed` com erros de rede/fetch normalmente significa que DNS/HTTPS de saída para `api.telegram.org` está bloqueado.
### Comandos de pareamento de dispositivo (plugin `device-pair`)
### Comandos de pareamento de dispositivo (Plugin `device-pair`)
Quando o plugin `device-pair` estiver instalado:
Quando o Plugin `device-pair` está instalado:
1. `/pair` gera um código de configuração
2. cole o código no app iOS
3. `/pair pending` lista solicitações pendentes (incluindo papel/escopos)
3. `/pair pending` lista solicitações pendentes (incluindo função/escopos)
4. aprove a solicitação:
- `/pair approve <requestId>` para aprovação explícita
- `/pair approve` quando houver apenas uma solicitação pendente
- `/pair approve latest` para a mais recente
O código de configuração carrega um token bootstrap de curta duração. O handoff bootstrap integrado mantém o token principal do nó em `scopes: []`; qualquer token de operador transferido continua limitado a `operator.approvals`, `operator.read`, `operator.talk.secrets` e `operator.write`. As verificações de escopo do bootstrap têm prefixo de papel, então essa allowlist de operador só satisfaz solicitações de operador; papéis que não sejam de operador ainda precisam de escopos sob o prefixo do próprio papel.
O código de configuração carrega um token de bootstrap de curta duração. A transferência de bootstrap embutida mantém o token do Node primário em `scopes: []`; qualquer token de operador transferido permanece limitado a `operator.approvals`, `operator.read`, `operator.talk.secrets` e `operator.write`. As verificações de escopo de bootstrap usam prefixo de função, então essa allowlist de operador atende apenas solicitações de operador; funções que não sejam de operador ainda precisam de escopos sob seu próprio prefixo de função.
Se um dispositivo tentar novamente com detalhes de autenticação alterados (por exemplo papel/escopos/chave pública), a solicitação pendente anterior é substituída, e a nova solicitação usa um `requestId` diferente. Execute `/pair pending` novamente antes de aprovar.
Se um dispositivo tentar novamente com detalhes de autenticação alterados (por exemplo, função/escopos/chave pública), a solicitação pendente anterior será substituída e a nova solicitação usará um `requestId` diferente. Execute `/pair pending` novamente antes de aprovar.
Mais detalhes: [Pareamento](/channels/pairing#pair-via-telegram-recommended-for-ios).
Mais detalhes: [Pareamento](/pt-BR/channels/pairing#pair-via-telegram-recommended-for-ios).
</Accordion>
@ -414,7 +414,7 @@ curl "https://api.telegram.org/bot<bot_token>/getUpdates"
- `all`
- `allowlist` (padrão)
Legado `capabilities: ["inlineButtons"]` é mapeado para `inlineButtons: "all"`.
O legado `capabilities: ["inlineButtons"]` é mapeado para `inlineButtons: "all"`.
Exemplo de ação de mensagem:
@ -434,33 +434,33 @@ curl "https://api.telegram.org/bot<bot_token>/getUpdates"
}
```
Cliques de callback são passados ao agente como texto:
Cliques em callback são passados ao agente como texto:
`callback_data: <value>`
</Accordion>
<Accordion title="Ações de mensagem do Telegram para agentes e automação">
As ações da ferramenta do Telegram incluem:
As ações de ferramenta do Telegram incluem:
- `sendMessage` (`to`, `content`, `mediaUrl`, `replyToMessageId`, `messageThreadId` opcionais)
- `sendMessage` (`to`, `content`, opcional `mediaUrl`, `replyToMessageId`, `messageThreadId`)
- `react` (`chatId`, `messageId`, `emoji`)
- `deleteMessage` (`chatId`, `messageId`)
- `editMessage` (`chatId`, `messageId`, `content`)
- `createForumTopic` (`chatId`, `name`, `iconColor`, `iconCustomEmojiId` opcionais)
- `createForumTopic` (`chatId`, `name`, opcional `iconColor`, `iconCustomEmojiId`)
Ações de mensagem de canal expõem aliases ergonômicos (`send`, `react`, `delete`, `edit`, `sticker`, `sticker-search`, `topic-create`).
As ações de mensagem do canal expõem aliases ergonômicos (`send`, `react`, `delete`, `edit`, `sticker`, `sticker-search`, `topic-create`).
Controles de bloqueio:
Controles de gate:
- `channels.telegram.actions.sendMessage`
- `channels.telegram.actions.deleteMessage`
- `channels.telegram.actions.reactions`
- `channels.telegram.actions.sticker` (padrão: desativado)
Observação: `edit` e `topic-create` estão atualmente ativados por padrão e não têm alternâncias `channels.telegram.actions.*` separadas.
Envios em runtime usam o snapshot ativo de config/secrets (inicialização/reload), então caminhos de ação não fazem uma nova resolução ad hoc de SecretRef por envio.
Observação: `edit` e `topic-create` estão atualmente ativados por padrão e não têm alternâncias separadas em `channels.telegram.actions.*`.
Os envios em runtime usam o snapshot ativo de config/segredos (inicialização/reload), então os caminhos de ação não fazem nova resolução ad hoc de SecretRef a cada envio.
Semântica de remoção de reação: [/tools/reactions](/tools/reactions)
Semântica de remoção de reação: [/tools/reactions](/pt-BR/tools/reactions)
</Accordion>
@ -481,11 +481,11 @@ curl "https://api.telegram.org/bot<bot_token>/getUpdates"
</Accordion>
<Accordion title="Tópicos de fórum e comportamento de thread">
Supergrupos com fórum:
Supergrupos de fórum:
- chaves de sessão de tópico acrescentam `:topic:<threadId>`
- respostas e digitação têm como alvo a thread do tópico
- caminho de configuração do tópico:
- chaves de sessão de tópico adicionam `:topic:<threadId>`
- respostas e indicadores de digitação têm como destino a thread do tópico
- caminho de config do tópico:
`channels.telegram.groups.<chatId>.topics.<threadId>`
Caso especial do tópico geral (`threadId=1`):
@ -493,10 +493,10 @@ curl "https://api.telegram.org/bot<bot_token>/getUpdates"
- envios de mensagem omitem `message_thread_id` (o Telegram rejeita `sendMessage(...thread_id=1)`)
- ações de digitação ainda incluem `message_thread_id`
Herança de tópico: entradas de tópico herdam configurações do grupo, salvo substituição (`requireMention`, `allowFrom`, `skills`, `systemPrompt`, `enabled`, `groupPolicy`).
`agentId` é somente de tópico e não é herdado dos padrões de grupo.
Herança de tópico: entradas de tópico herdam configurações do grupo, a menos que sejam substituídas (`requireMention`, `allowFrom`, `skills`, `systemPrompt`, `enabled`, `groupPolicy`).
`agentId` é exclusivo de tópico e não herda dos padrões do grupo.
**Roteamento de agente por tópico**: cada tópico pode rotear para um agente diferente definindo `agentId` na configuração do tópico. Isso dá a cada tópico seu próprio workspace, memória e sessão isolados. Exemplo:
**Roteamento de agente por tópico**: cada tópico pode rotear para um agente diferente definindo `agentId` na config do tópico. Isso dá a cada tópico seu próprio workspace, memória e sessão isolados. Exemplo:
```json5
{
@ -505,8 +505,8 @@ curl "https://api.telegram.org/bot<bot_token>/getUpdates"
groups: {
"-1001234567890": {
topics: {
"1": { agentId: "main" }, // Tópico Geral → agente main
"3": { agentId: "zu" }, // Tópico Dev → agente zu
"1": { agentId: "main" }, // Tópico geral → agente principal
"3": { agentId: "zu" }, // Tópico de desenvolvimento → agente zu
"5": { agentId: "coder" } // Revisão de código → agente coder
}
}
@ -518,7 +518,7 @@ curl "https://api.telegram.org/bot<bot_token>/getUpdates"
Cada tópico então tem sua própria chave de sessão: `agent:zu:telegram:group:-1001234567890:topic:3`
**Binding persistente de tópico ACP**: tópicos de fórum podem fixar sessões do harness ACP por meio de bindings ACP tipados de nível superior:
**Vinculação persistente de tópico ACP**: tópicos de fórum podem fixar sessões de harness ACP por meio de bindings ACP tipados de nível superior:
- `bindings[]` com `type: "acp"` e `match.channel: "telegram"`
@ -569,13 +569,13 @@ curl "https://api.telegram.org/bot<bot_token>/getUpdates"
}
```
Isso atualmente está limitado a tópicos de fórum em grupos e supergrupos.
Atualmente, isso está limitado a tópicos de fórum em grupos e supergrupos.
**Spawn ACP vinculado à thread a partir do chat**:
**Criação de ACP vinculado à thread a partir do chat**:
- `/acp spawn <agent> --thread here|auto` pode vincular o tópico atual do Telegram a uma nova sessão ACP.
- Mensagens subsequentes do tópico são roteadas diretamente para a sessão ACP vinculada (sem necessidade de `/acp steer`).
- O OpenClaw fixa a mensagem de confirmação do spawn dentro do tópico após um vínculo bem-sucedido.
- Mensagens subsequentes no tópico são roteadas diretamente para a sessão ACP vinculada (sem necessidade de `/acp steer`).
- O OpenClaw fixa a mensagem de confirmação de criação dentro do tópico após uma vinculação bem-sucedida.
- Requer `channels.telegram.threadBindings.spawnAcpSessions=true`.
O contexto do template inclui:
@ -585,14 +585,14 @@ curl "https://api.telegram.org/bot<bot_token>/getUpdates"
Comportamento de thread em DM:
- chats privados com `message_thread_id` mantêm o roteamento de DM, mas usam chaves de sessão/alvos de resposta cientes da thread.
- chats privados com `message_thread_id` mantêm o roteamento de DM, mas usam chaves de sessão e destinos de resposta sensíveis a thread.
</Accordion>
<Accordion title="Áudio, vídeo e stickers">
### Mensagens de áudio
O Telegram distingue notas de voz de arquivos de áudio.
O Telegram diferencia notas de voz de arquivos de áudio.
- padrão: comportamento de arquivo de áudio
- tag `[[audio_as_voice]]` na resposta do agente para forçar envio como nota de voz
@ -611,7 +611,7 @@ curl "https://api.telegram.org/bot<bot_token>/getUpdates"
### Mensagens de vídeo
O Telegram distingue arquivos de vídeo de video notes.
O Telegram diferencia arquivos de vídeo de notas de vídeo.
Exemplo de ação de mensagem:
@ -625,15 +625,15 @@ curl "https://api.telegram.org/bot<bot_token>/getUpdates"
}
```
Video notes não oferecem suporte a legendas; o texto de mensagem fornecido é enviado separadamente.
Notas de vídeo não suportam legendas; o texto de mensagem fornecido é enviado separadamente.
### Stickers
Tratamento de sticker de entrada:
Tratamento de stickers recebidos:
- WEBP estático: baixado e processado (placeholder `<media:sticker>`)
- TGS animado: ignorado
- WEBM de vídeo: ignorado
- WEBM em vídeo: ignorado
Campos de contexto de sticker:
@ -647,7 +647,7 @@ curl "https://api.telegram.org/bot<bot_token>/getUpdates"
- `~/.openclaw/telegram/sticker-cache.json`
Stickers são descritos uma vez (quando possível) e armazenados em cache para reduzir chamadas repetidas de visão.
Os stickers são descritos uma vez (quando possível) e armazenados em cache para reduzir chamadas repetidas de visão.
Ative ações de sticker:
@ -694,47 +694,47 @@ curl "https://api.telegram.org/bot<bot_token>/getUpdates"
- `Telegram reaction added: 👍 by Alice (@alice) on msg 42`
Configuração:
Config:
- `channels.telegram.reactionNotifications`: `off | own | all` (padrão: `own`)
- `channels.telegram.reactionLevel`: `off | ack | minimal | extensive` (padrão: `minimal`)
Observações:
- `own` significa apenas reações de usuário a mensagens enviadas pelo bot (best-effort via cache de mensagens enviadas).
- `own` significa apenas reações de usuários a mensagens enviadas pelo bot (melhor esforço via cache de mensagens enviadas).
- Eventos de reação ainda respeitam os controles de acesso do Telegram (`dmPolicy`, `allowFrom`, `groupPolicy`, `groupAllowFrom`); remetentes não autorizados são descartados.
- O Telegram não fornece IDs de thread em atualizações de reação.
- grupos sem fórum roteiam para a sessão do chat em grupo
- grupos com fórum roteiam para a sessão do tópico geral do grupo (`:topic:1`), não para o tópico exato de origem
- grupos sem fórum são roteados para a sessão de chat do grupo
- grupos com fórum são roteados para a sessão do tópico geral do grupo (`:topic:1`), não para o tópico de origem exato
`allowed_updates` para polling/webhook inclui `message_reaction` automaticamente.
`allowed_updates` para polling/Webhook inclui `message_reaction` automaticamente.
</Accordion>
<Accordion title="Reações de confirmação">
`ackReaction` envia um emoji de confirmação enquanto o OpenClaw processa uma mensagem de entrada.
`ackReaction` envia um emoji de confirmação enquanto o OpenClaw está processando uma mensagem recebida.
Ordem de resolução:
- `channels.telegram.accounts.<accountId>.ackReaction`
- `channels.telegram.ackReaction`
- `messages.ackReaction`
- fallback para emoji de identidade do agente (`agents.list[].identity.emoji`, senão "👀")
- fallback para emoji de identidade do agente (`agents.list[].identity.emoji`, caso contrário "👀")
Observações:
- O Telegram espera emoji unicode (por exemplo "👀").
- Use `""` para desativar a reação para um canal ou conta.
- Use `""` para desativar a reação em um canal ou conta.
</Accordion>
<Accordion title="Gravações de config a partir de eventos e comandos do Telegram">
Gravações de configuração do canal são ativadas por padrão (`configWrites !== false`).
Gravações de config do canal ficam ativadas por padrão (`configWrites !== false`).
Gravações acionadas pelo Telegram incluem:
As gravações acionadas pelo Telegram incluem:
- eventos de migração de grupo (`migrate_to_chat_id`) para atualizar `channels.telegram.groups`
- `/config set` e `/config unset` (requer ativação de comando)
- `/config set` e `/config unset` (exige ativação de comando)
Desative:
@ -750,10 +750,10 @@ curl "https://api.telegram.org/bot<bot_token>/getUpdates"
</Accordion>
<Accordion title="Long polling vs webhook">
<Accordion title="Long polling vs Webhook">
Padrão: long polling.
Modo webhook:
Modo Webhook:
- defina `channels.telegram.webhookUrl`
- defina `channels.telegram.webhookSecret` (obrigatório quando `webhookUrl` estiver definido)
@ -761,34 +761,34 @@ curl "https://api.telegram.org/bot<bot_token>/getUpdates"
- `channels.telegram.webhookHost` opcional (padrão `127.0.0.1`)
- `channels.telegram.webhookPort` opcional (padrão `8787`)
O listener local padrão para o modo webhook é vinculado a `127.0.0.1:8787`.
O listener local padrão para o modo Webhook faz bind em `127.0.0.1:8787`.
Se seu endpoint público for diferente, coloque um proxy reverso na frente e aponte `webhookUrl` para a URL pública.
Defina `webhookHost` (por exemplo `0.0.0.0`) quando você intencionalmente precisar de entrada externa.
</Accordion>
<Accordion title="Limites, nova tentativa e alvos da CLI">
<Accordion title="Limites, tentativas e destinos da CLI">
- o padrão de `channels.telegram.textChunkLimit` é 4000.
- `channels.telegram.chunkMode="newline"` prefere limites de parágrafo (linhas em branco) antes da divisão por comprimento.
- `channels.telegram.mediaMaxMb` (padrão 100) limita o tamanho de mídia de entrada e saída do Telegram.
- `channels.telegram.timeoutSeconds` substitui o timeout do cliente da API do Telegram (se não definido, o padrão do grammY se aplica).
- `channels.telegram.chunkMode="newline"` prefere limites de parágrafo (linhas em branco) antes da divisão por tamanho.
- `channels.telegram.mediaMaxMb` (padrão 100) limita o tamanho de mídia recebida e enviada no Telegram.
- `channels.telegram.timeoutSeconds` substitui o tempo limite do cliente da API do Telegram (se não definido, aplica-se o padrão do grammY).
- o histórico de contexto de grupo usa `channels.telegram.historyLimit` ou `messages.groupChat.historyLimit` (padrão 50); `0` desativa.
- o contexto suplementar de resposta/citação/encaminhamento atualmente é repassado como recebido.
- o contexto suplementar de resposta/citação/encaminhamento atualmente é repassado conforme recebido.
- as allowlists do Telegram controlam principalmente quem pode acionar o agente, não um limite completo de redação de contexto suplementar.
- controles de histórico de DM:
- `channels.telegram.dmHistoryLimit`
- `channels.telegram.dms["<user_id>"].historyLimit`
- a configuração `channels.telegram.retry` se aplica aos helpers de envio do Telegram (CLI/tools/actions) para erros recuperáveis de API de saída.
- a config `channels.telegram.retry` se aplica aos helpers de envio do Telegram (CLI/ferramentas/ações) para erros recuperáveis de saída da API.
O alvo de envio da CLI pode ser ID numérico de chat ou username:
O destino de envio da CLI pode ser um ID numérico de chat ou um nome de usuário:
```bash
openclaw message send --channel telegram --target 123456789 --message "hi"
openclaw message send --channel telegram --target @name --message "hi"
```
Enquetes do Telegram usam `openclaw message poll` e oferecem suporte a tópicos de fórum:
As enquetes do Telegram usam `openclaw message poll` e oferecem suporte a tópicos de fórum:
```bash
openclaw message poll --channel telegram --target 123456789 \
@ -798,78 +798,79 @@ openclaw message poll --channel telegram --target -1001234567890:topic:42 \
--poll-duration-seconds 300 --poll-public
```
Flags de enquete somente do Telegram:
Flags de enquete exclusivas do Telegram:
- `--poll-duration-seconds` (5-600)
- `--poll-anonymous`
- `--poll-public`
- `--thread-id` para tópicos de fórum (ou use um alvo `:topic:`)
- `--thread-id` para tópicos de fórum (ou use um destino `:topic:`)
O envio no Telegram também oferece suporte a:
- `--buttons` para teclados inline quando `channels.telegram.capabilities.inlineButtons` permitir
- `--force-document` para enviar imagens e GIFs de saída como documentos em vez de upload comprimido de foto ou mídia animada
- `--force-document` para enviar imagens e GIFs de saída como documentos em vez de uploads compactados de foto ou mídia animada
Bloqueio de ações:
Controle de ações:
- `channels.telegram.actions.sendMessage=false` desativa mensagens de saída do Telegram, incluindo enquetes
- `channels.telegram.actions.poll=false` desativa a criação de enquete no Telegram enquanto mantém envios regulares ativados
- `channels.telegram.actions.poll=false` desativa a criação de enquetes no Telegram, mantendo os envios regulares ativados
</Accordion>
<Accordion title="Aprovações de exec no Telegram">
O Telegram oferece suporte a aprovações de exec em DMs de aprovadores e pode opcionalmente publicar prompts de aprovação no chat ou tópico de origem.
O Telegram oferece suporte a aprovações de exec em DMs de aprovadores e pode, opcionalmente, publicar prompts de aprovação no chat ou tópico de origem.
Caminho de configuração:
Caminho de config:
- `channels.telegram.execApprovals.enabled`
- `channels.telegram.execApprovals.approvers` (opcional; recai para IDs numéricos de dono inferidos de `allowFrom` e `defaultTo` direto quando possível)
- `channels.telegram.execApprovals.approvers` (opcional; usa como fallback IDs numéricos de proprietário inferidos de `allowFrom` e `defaultTo` direto quando possível)
- `channels.telegram.execApprovals.target` (`dm` | `channel` | `both`, padrão: `dm`)
- `agentFilter`, `sessionFilter`
Os aprovadores devem ser IDs numéricos de usuário do Telegram. O Telegram ativa automaticamente aprovações nativas de exec quando `enabled` não está definido ou é `"auto"` e pelo menos um aprovador pode ser resolvido, seja a partir de `execApprovals.approvers` ou da configuração numérica de dono da conta (`allowFrom` e `defaultTo` de mensagem direta). Defina `enabled: false` para desativar explicitamente o Telegram 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 fallback de aprovação de exec.
Os aprovadores devem ser IDs numéricos de usuários do Telegram. O Telegram ativa automaticamente aprovações nativas de exec quando `enabled` não está definido ou é `"auto"` e pelo menos um aprovador pode ser resolvido, seja a partir de `execApprovals.approvers` ou da config numérica de proprietário da conta (`allowFrom` e `defaultTo` de mensagem direta). Defina `enabled: false` para desativar explicitamente o Telegram como cliente nativo de aprovação. Caso contrário, as solicitações de aprovação usam fallback para outras rotas de aprovação configuradas ou para a política de fallback de aprovação de exec.
O Telegram também renderiza os botões compartilhados de aprovação usados por outros canais de chat. O adaptador nativo do Telegram adiciona principalmente roteamento de DM para aprovadores, fanout para canal/tópico e indicações de digitação antes da entrega.
Quando esses botões estiverem presentes, eles serão a UX principal de aprovação; o OpenClaw
deve incluir um comando manual `/approve` quando o resultado da ferramenta disser
que aprovações por chat não estão disponíveis ou quando a aprovação manual for o único caminho.
O Telegram também renderiza os botões compartilhados de aprovação usados por outros canais de chat. O adaptador nativo do Telegram adiciona principalmente roteamento de DM de aprovador, fanout para canal/tópico e dicas de digitação antes da entrega.
Quando esses botões estão presentes, eles são a UX principal de aprovação; o OpenClaw
deve incluir um comando manual `/approve` apenas quando o resultado da ferramenta disser
que aprovações por chat não estão disponíveis ou que a aprovação manual é o único caminho.
Regras de entrega:
- `target: "dm"` envia prompts de aprovação somente para DMs de aprovadores resolvidos
- `target: "dm"` envia prompts de aprovação apenas para DMs de aprovadores resolvidos
- `target: "channel"` envia o prompt de volta para o chat/tópico de origem no Telegram
- `target: "both"` envia para DMs de aprovadores e para o chat/tópico de origem
Somente aprovadores resolvidos podem aprovar ou negar. Não aprovadores não podem usar `/approve` e não podem usar botões de aprovação do Telegram.
Apenas aprovadores resolvidos podem aprovar ou negar. Não aprovadores não podem usar `/approve` nem usar botões de aprovação do Telegram.
Comportamento de resolução de aprovação:
- IDs com prefixo `plugin:` sempre são resolvidos por aprovações de plugin.
- Outros IDs tentam `exec.approval.resolve` primeiro.
- Se o Telegram também estiver autorizado para aprovações de plugin e o gateway disser
que a aprovação de exec é desconhecida/expirada, o Telegram tenta novamente uma vez via
- IDs com prefixo `plugin:` sempre são resolvidos por aprovações de Plugin.
- Outros IDs de aprovação tentam primeiro `exec.approval.resolve`.
- Se o Telegram também estiver autorizado para aprovações de Plugin e o gateway disser
que a aprovação de exec é desconhecida/expirada, o Telegram tentará novamente uma vez por
`plugin.approval.resolve`.
- Negativas/erros reais de aprovação de exec não recorrem silenciosamente à resolução de aprovação de plugin.
- Negativas/erros reais de aprovação de exec não passam silenciosamente para a resolução
de aprovação de Plugin.
A entrega no canal mostra o texto do comando no chat, então ative `channel` ou `both` em grupos/tópicos confiáveis. Quando o prompt chega em um tópico de fórum, o OpenClaw preserva o tópico tanto para o prompt de aprovação quanto para o acompanhamento pós-aprovação. Aprovações de exec expiram após 30 minutos por padrão.
A entrega no canal mostra o texto do comando no chat, então ative `channel` ou `both` apenas em grupos/tópicos confiáveis. Quando o prompt chega em um tópico de fórum, o OpenClaw preserva o tópico tanto para o prompt de aprovação quanto para o acompanhamento pós-aprovação. As aprovações de exec expiram após 30 minutos por padrão.
Botões inline de aprovação também dependem de `channels.telegram.capabilities.inlineButtons` permitir a superfície alvo (`dm`, `group` ou `all`).
Botões inline de aprovação também dependem de `channels.telegram.capabilities.inlineButtons` permitir a superfície de destino (`dm`, `group` ou `all`).
Documentação relacionada: [Aprovações de exec](/tools/exec-approvals)
Documentação relacionada: [Aprovações de exec](/pt-BR/tools/exec-approvals)
</Accordion>
</AccordionGroup>
## Controles de resposta de erro
Quando o agente encontra um erro de entrega ou de provedor, o Telegram pode responder com o texto do erro ou suprimi-lo. Duas chaves de configuração controlam esse comportamento:
Quando o agente encontra um erro de entrega ou do provedor, o Telegram pode responder com o texto do erro ou suprimi-lo. Duas chaves de config controlam esse comportamento:
| Chave | Valores | Padrão | Descrição |
| ----------------------------------- | ----------------- | ------- | ------------------------------------------------------------------------------------------------ |
| `channels.telegram.errorPolicy` | `reply`, `silent` | `reply` | `reply` envia uma mensagem de erro amigável para o chat. `silent` suprime totalmente respostas de erro. |
| `channels.telegram.errorCooldownMs` | number (ms) | `60000` | Tempo mínimo entre respostas de erro para o mesmo chat. Evita spam de erros durante indisponibilidades. |
| Key | Values | Default | Description |
| ----------------------------------- | ----------------- | ------- | ----------------------------------------------------------------------------------------------- |
| `channels.telegram.errorPolicy` | `reply`, `silent` | `reply` | `reply` envia uma mensagem de erro amigável para o chat. `silent` suprime totalmente as respostas de erro. |
| `channels.telegram.errorCooldownMs` | number (ms) | `60000` | Tempo mínimo entre respostas de erro para o mesmo chat. Evita spam de erros durante indisponibilidades. |
Substituições por conta, por grupo e por tópico são compatíveis (mesma herança das outras chaves de configuração do Telegram).
Substituições por conta, por grupo e por tópico são compatíveis (mesma herança das outras chaves de config do Telegram).
```json5
{
@ -879,7 +880,7 @@ Substituições por conta, por grupo e por tópico são compatíveis (mesma hera
errorCooldownMs: 120000,
groups: {
"-1001234567890": {
errorPolicy: "silent", // suprimir erros neste grupo
errorPolicy: "silent", // suprime erros neste grupo
},
},
},
@ -892,19 +893,19 @@ Substituições por conta, por grupo e por tópico são compatíveis (mesma hera
<AccordionGroup>
<Accordion title="O bot não responde a mensagens de grupo sem menção">
- Se `requireMention=false`, o modo de privacidade do Telegram deve permitir visibilidade completa.
- Se `requireMention=false`, o modo de privacidade do Telegram deve permitir visibilidade total.
- BotFather: `/setprivacy` -> Disable
- depois remova + adicione novamente o bot ao grupo
- `openclaw channels status` emite aviso quando a configuração espera mensagens de grupo sem menção.
- `openclaw channels status --probe` pode verificar IDs numéricos explícitos de grupo; o curinga `"*"` não pode ter associação verificada.
- depois remova + readicione o bot ao grupo
- `openclaw channels status` avisa quando a config espera mensagens de grupo sem menção.
- `openclaw channels status --probe` pode verificar IDs numéricos explícitos de grupo; o curinga `"*"` não pode ser verificado quanto à associação.
- teste rápido de sessão: `/activation always`.
</Accordion>
<Accordion title="O bot não está vendo mensagens de grupo de forma alguma">
- quando `channels.telegram.groups` existe, o grupo precisa estar listado (ou incluir `"*"`)
- verifique se o bot é membro do grupo
- quando `channels.telegram.groups` existe, o grupo deve estar listado (ou incluir `"*"`)
- verifique a associação do bot ao grupo
- revise os logs: `openclaw logs --follow` para motivos de ignorar
</Accordion>
@ -912,18 +913,18 @@ Substituições por conta, por grupo e por tópico são compatíveis (mesma hera
<Accordion title="Os comandos funcionam parcialmente ou não funcionam">
- autorize sua identidade de remetente (pareamento e/ou `allowFrom` numérico)
- a autorização de comandos ainda se aplica mesmo quando a política de grupo é `open`
- `setMyCommands failed` com `BOT_COMMANDS_TOO_MUCH` significa que o menu nativo tem entradas demais; reduza comandos personalizados/de plugin/Skills ou desative menus nativos
- `setMyCommands failed` com erros de rede/fetch normalmente indica problemas de alcance DNS/HTTPS para `api.telegram.org`
- a autorização de comando ainda se aplica mesmo quando a política de grupo é `open`
- `setMyCommands failed` com `BOT_COMMANDS_TOO_MUCH` significa que o menu nativo tem entradas demais; reduza comandos de Plugin/Skills/personalizados ou desative menus nativos
- `setMyCommands failed` com erros de rede/fetch normalmente indica problemas de alcance de DNS/HTTPS até `api.telegram.org`
</Accordion>
<Accordion title="Instabilidade de polling ou de rede">
- Node 22+ + fetch/proxy personalizado podem disparar comportamento de aborto imediato se os tipos de AbortSignal não forem compatíveis.
- Alguns hosts resolvem `api.telegram.org` para IPv6 primeiro; saída IPv6 quebrada pode causar falhas intermitentes na API do Telegram.
- Node 22+ + fetch/proxy personalizado pode disparar comportamento de aborto imediato se os tipos de AbortSignal não corresponderem.
- Alguns hosts resolvem `api.telegram.org` para IPv6 primeiro; saída IPv6 com problema pode causar falhas intermitentes da API do Telegram.
- Se os logs incluírem `TypeError: fetch failed` ou `Network request for 'getUpdates' failed!`, o OpenClaw agora tenta novamente esses casos como erros de rede recuperáveis.
- Em hosts VPS com saída direta/TLS instável, encaminhe chamadas da API do Telegram por `channels.telegram.proxy`:
- Em hosts VPS com saída direta/TLS instável, roteie chamadas da API do Telegram por `channels.telegram.proxy`:
```yaml
channels:
@ -931,7 +932,7 @@ channels:
proxy: socks5://<user>:<password>@proxy-host:1080
```
- Node 22+ usa por padrão `autoSelectFamily=true` (exceto WSL2) e `dnsResultOrder=ipv4first`.
- Node 22+ usa por padrão `autoSelectFamily=true` (exceto no WSL2) e `dnsResultOrder=ipv4first`.
- Se seu host for WSL2 ou funcionar explicitamente melhor com comportamento somente IPv4, force a seleção de família:
```yaml
@ -945,7 +946,7 @@ channels:
por padrão para downloads de mídia do Telegram. Se um fake-IP confiável ou
proxy transparente reescrever `api.telegram.org` para algum outro
endereço privado/interno/de uso especial durante downloads de mídia, você pode
ativar o bypass somente do Telegram:
ativar o bypass exclusivo do Telegram:
```yaml
channels:
@ -954,24 +955,25 @@ channels:
dangerouslyAllowPrivateNetwork: true
```
- A mesma ativação opcional também está disponível por conta em
- O mesmo opt-in está disponível por conta em
`channels.telegram.accounts.<accountId>.network.dangerouslyAllowPrivateNetwork`.
- Se seu proxy resolver hosts de mídia do Telegram em `198.18.x.x`, deixe a
flag perigosa desativada primeiro. A mídia do Telegram já permite a faixa
de benchmark RFC 2544 por padrão.
- Se seu proxy resolver hosts de mídia do Telegram para `198.18.x.x`, deixe a
flag perigosa desativada primeiro. A mídia do Telegram já permite a faixa de
benchmark RFC 2544 por padrão.
<Warning>
`channels.telegram.network.dangerouslyAllowPrivateNetwork` enfraquece as
proteções SSRF de mídia do Telegram. Use isso apenas em ambientes de proxy
confiáveis e controlados pelo operador, como roteamento fake-IP do Clash, Mihomo ou Surge, quando eles sintetizarem respostas
privadas ou de uso especial fora da faixa de benchmark RFC 2544. Deixe isso desativado para acesso normal do Telegram pela internet pública.
`channels.telegram.network.dangerouslyAllowPrivateNetwork` enfraquece as proteções
SSRF de mídia do Telegram. Use isso apenas em ambientes de proxy confiáveis controlados pelo operador,
como roteamento fake-IP do Clash, Mihomo ou Surge, quando eles sintetizarem
respostas privadas ou de uso especial fora da faixa de benchmark RFC 2544.
Deixe isso desativado para acesso normal ao Telegram pela internet pública.
</Warning>
- Substituições por ambiente (temporárias):
- Substituições por variável de ambiente (temporárias):
- `OPENCLAW_TELEGRAM_DISABLE_AUTO_SELECT_FAMILY=1`
- `OPENCLAW_TELEGRAM_ENABLE_AUTO_SELECT_FAMILY=1`
- `OPENCLAW_TELEGRAM_DNS_RESULT_ORDER=ipv4first`
- Valide respostas DNS:
- Valide as respostas de DNS:
```bash
dig +short api.telegram.org A
@ -981,97 +983,97 @@ dig +short api.telegram.org AAAA
</Accordion>
</AccordionGroup>
Mais ajuda: [Solução de problemas de canais](/channels/troubleshooting).
Mais ajuda: [Solução de problemas do canal](/pt-BR/channels/troubleshooting).
## Ponteiros de referência da configuração do Telegram
## Ponteiros para a referência de config do Telegram
Referência principal:
- `channels.telegram.enabled`: ativa/desativa a inicialização do canal.
- `channels.telegram.botToken`: token do bot (BotFather).
- `channels.telegram.tokenFile`: lê o token de um caminho de arquivo comum. Symlinks são rejeitados.
- `channels.telegram.tokenFile`: lê o token de um caminho de arquivo regular. Symlinks são rejeitados.
- `channels.telegram.dmPolicy`: `pairing | allowlist | open | disabled` (padrão: pairing).
- `channels.telegram.allowFrom`: allowlist de DM (IDs numéricos de usuário do Telegram). `allowlist` exige pelo menos um ID de remetente. `open` exige `"*"`. `openclaw doctor --fix` pode resolver entradas legadas `@username` para IDs e pode recuperar entradas de allowlist de arquivos do pairing store em fluxos de migração de allowlist.
- `channels.telegram.allowFrom`: allowlist de DM (IDs numéricos de usuários do Telegram). `allowlist` exige pelo menos um ID de remetente. `open` exige `"*"`. `openclaw doctor --fix` pode resolver entradas legadas `@username` para IDs e pode recuperar entradas de allowlist de arquivos do armazenamento de pareamento em fluxos de migração de allowlist.
- `channels.telegram.actions.poll`: ativa ou desativa a criação de enquetes no Telegram (padrão: ativado; ainda requer `sendMessage`).
- `channels.telegram.defaultTo`: alvo padrão do Telegram usado por `--deliver` da CLI quando nenhum `--reply-to` explícito é fornecido.
- `channels.telegram.defaultTo`: destino padrão do Telegram usado pelo `--deliver` da CLI quando nenhum `--reply-to` explícito é fornecido.
- `channels.telegram.groupPolicy`: `open | allowlist | disabled` (padrão: allowlist).
- `channels.telegram.groupAllowFrom`: allowlist de remetente em grupo (IDs numéricos de usuário do Telegram). `openclaw doctor --fix` pode resolver entradas legadas `@username` para IDs. Entradas não numéricas são ignoradas no momento da autorização. A autorização em grupo não usa fallback do pairing store de DM (`2026.2.25+`).
- `channels.telegram.groupAllowFrom`: allowlist de remetentes em grupo (IDs numéricos de usuários do Telegram). `openclaw doctor --fix` pode resolver entradas legadas `@username` para IDs. Entradas não numéricas são ignoradas no momento da autenticação. A autenticação de grupo não usa fallback do armazenamento de pareamento de DM (`2026.2.25+`).
- Precedência de múltiplas contas:
- Quando dois ou mais IDs de conta estiverem configurados, defina `channels.telegram.defaultAccount` (ou inclua `channels.telegram.accounts.default`) para tornar o roteamento padrão explícito.
- Se nenhum dos dois estiver definido, o OpenClaw recai para o primeiro ID de conta normalizado e `openclaw doctor` emite aviso.
- `channels.telegram.accounts.default.allowFrom` e `channels.telegram.accounts.default.groupAllowFrom` se aplicam somente à conta `default`.
- Se nenhum dos dois estiver definido, o OpenClaw usa como fallback o primeiro ID de conta normalizado e `openclaw doctor` emite um aviso.
- `channels.telegram.accounts.default.allowFrom` e `channels.telegram.accounts.default.groupAllowFrom` se aplicam apenas à conta `default`.
- Contas nomeadas herdam `channels.telegram.allowFrom` e `channels.telegram.groupAllowFrom` quando os valores no nível da conta não estão definidos.
- Contas nomeadas não herdam `channels.telegram.accounts.default.allowFrom` / `groupAllowFrom`.
- `channels.telegram.groups`: padrões por grupo + allowlist (use `"*"` para padrões globais).
- `channels.telegram.groups.<id>.groupPolicy`: substituição por grupo para `groupPolicy` (`open | allowlist | disabled`).
- `channels.telegram.groups.<id>.requireMention`: padrão de bloqueio por menção.
- `channels.telegram.groups.<id>.groupPolicy`: substituição por grupo para groupPolicy (`open | allowlist | disabled`).
- `channels.telegram.groups.<id>.requireMention`: gate padrão de menção.
- `channels.telegram.groups.<id>.skills`: filtro de Skills (omitir = todas as Skills, vazio = nenhuma).
- `channels.telegram.groups.<id>.allowFrom`: substituição por grupo para allowlist de remetentes.
- `channels.telegram.groups.<id>.allowFrom`: substituição da allowlist de remetentes por grupo.
- `channels.telegram.groups.<id>.systemPrompt`: prompt de sistema extra para o grupo.
- `channels.telegram.groups.<id>.enabled`: desativa o grupo quando `false`.
- `channels.telegram.groups.<id>.topics.<threadId>.*`: substituições por tópico (campos de grupo + `agentId` exclusivo de tópico).
- `channels.telegram.groups.<id>.topics.<threadId>.agentId`: roteia este tópico para um agente específico (substitui o roteamento de nível de grupo e por binding).
- `channels.telegram.groups.<id>.topics.<threadId>.groupPolicy`: substituição por tópico para `groupPolicy` (`open | allowlist | disabled`).
- `channels.telegram.groups.<id>.topics.<threadId>.requireMention`: substituição por tópico para bloqueio por menção.
- `bindings[]` de nível superior com `type: "acp"` e ID canônico de tópico `chatId:topic:topicId` em `match.peer.id`: campos de binding persistente de tópico ACP (veja [Agentes ACP](/tools/acp-agents#channel-specific-settings)).
- `channels.telegram.groups.<id>.topics.<threadId>.*`: substituições por tópico (campos de grupo + `agentId` exclusivo do tópico).
- `channels.telegram.groups.<id>.topics.<threadId>.agentId`: roteia este tópico para um agente específico (substitui o roteamento no nível de grupo e por binding).
- `channels.telegram.groups.<id>.topics.<threadId>.groupPolicy`: substituição por tópico para groupPolicy (`open | allowlist | disabled`).
- `channels.telegram.groups.<id>.topics.<threadId>.requireMention`: substituição por tópico para o gate de menção.
- `bindings[]` no nível superior com `type: "acp"` e ID canônico de tópico `chatId:topic:topicId` em `match.peer.id`: campos persistentes de vinculação de tópico ACP (veja [Agentes ACP](/pt-BR/tools/acp-agents#channel-specific-settings)).
- `channels.telegram.direct.<id>.topics.<threadId>.agentId`: roteia tópicos de DM para um agente específico (mesmo comportamento de tópicos de fórum).
- `channels.telegram.execApprovals.enabled`: ativa o Telegram como cliente de aprovação de exec baseado em chat para esta conta.
- `channels.telegram.execApprovals.approvers`: IDs de usuário do Telegram autorizados a aprovar ou negar solicitações de exec. Opcional quando `channels.telegram.allowFrom` ou um `channels.telegram.defaultTo` direto já identifica o dono.
- `channels.telegram.execApprovals.approvers`: IDs de usuários do Telegram autorizados a aprovar ou negar solicitações de exec. Opcional quando `channels.telegram.allowFrom` ou um `channels.telegram.defaultTo` direto já identifica o proprietário.
- `channels.telegram.execApprovals.target`: `dm | channel | both` (padrão: `dm`). `channel` e `both` preservam o tópico de origem do Telegram quando presente.
- `channels.telegram.execApprovals.agentFilter`: filtro opcional por ID de agente para prompts de aprovação encaminhados.
- `channels.telegram.execApprovals.sessionFilter`: filtro opcional por chave de sessão (substring ou regex) para prompts de aprovação encaminhados.
- `channels.telegram.accounts.<account>.execApprovals`: substituição por conta para roteamento de aprovação de exec no Telegram e autorização de aprovadores.
- `channels.telegram.execApprovals.agentFilter`: filtro opcional de ID de agente para prompts de aprovação encaminhados.
- `channels.telegram.execApprovals.sessionFilter`: filtro opcional de chave de sessão (substring ou regex) para prompts de aprovação encaminhados.
- `channels.telegram.accounts.<account>.execApprovals`: substituição por conta para roteamento de aprovação de exec no Telegram e autorização de aprovador.
- `channels.telegram.capabilities.inlineButtons`: `off | dm | group | all | allowlist` (padrão: allowlist).
- `channels.telegram.accounts.<account>.capabilities.inlineButtons`: substituição por conta.
- `channels.telegram.commands.nativeSkills`: ativa/desativa comandos nativos de Skills no Telegram.
- `channels.telegram.replyToMode`: `off | first | all` (padrão: `off`).
- `channels.telegram.textChunkLimit`: tamanho do chunk de saída (caracteres).
- `channels.telegram.chunkMode`: `length` (padrão) ou `newline` para dividir em linhas em branco (limites de parágrafo) antes da divisão por comprimento.
- `channels.telegram.linkPreview`: alterna prévias de link para mensagens de saída (padrão: true).
- `channels.telegram.streaming`: `off | partial | block | progress` (prévia de stream ao vivo; padrão: `partial`; `progress` é mapeado para `partial`; `block` é compatibilidade legada com modo de prévia). O streaming de prévia do Telegram usa uma única mensagem de prévia editada no lugar.
- `channels.telegram.mediaMaxMb`: limite de mídia de entrada/saída do Telegram (MB, padrão: 100).
- `channels.telegram.retry`: política de nova tentativa para helpers de envio do Telegram (CLI/tools/actions) em erros recuperáveis de API de saída (tentativas, `minDelayMs`, `maxDelayMs`, jitter).
- `channels.telegram.chunkMode`: `length` (padrão) ou `newline` para dividir em linhas em branco (limites de parágrafo) antes do chunking por tamanho.
- `channels.telegram.linkPreview`: alterna prévias de links para mensagens de saída (padrão: true).
- `channels.telegram.streaming`: `off | partial | block | progress` (prévia de stream ao vivo; padrão: `partial`; `progress` é mapeado para `partial`; `block` é compatibilidade legada com o modo de prévia). O streaming de prévia do Telegram usa uma única mensagem de prévia que é editada no lugar.
- `channels.telegram.mediaMaxMb`: limite de mídia recebida/enviada do Telegram (MB, padrão: 100).
- `channels.telegram.retry`: política de tentativas para helpers de envio do Telegram (CLI/ferramentas/ações) em erros recuperáveis de saída da API (tentativas, minDelayMs, maxDelayMs, jitter).
- `channels.telegram.network.autoSelectFamily`: substitui o autoSelectFamily do Node (true=ativar, false=desativar). O padrão é ativado no Node 22+, com WSL2 usando desativado por padrão.
- `channels.telegram.network.dnsResultOrder`: substitui a ordem de resultado do DNS (`ipv4first` ou `verbatim`). O padrão é `ipv4first` no Node 22+.
- `channels.telegram.network.dangerouslyAllowPrivateNetwork`: ativação perigosa para ambientes confiáveis com fake-IP ou proxy transparente em que downloads de mídia do Telegram resolvem `api.telegram.org` para endereços privados/internos/de uso especial fora da permissão padrão da faixa de benchmark RFC 2544.
- `channels.telegram.proxy`: URL de proxy para chamadas da Bot API (SOCKS/HTTP).
- `channels.telegram.webhookUrl`: ativa o modo webhook (requer `channels.telegram.webhookSecret`).
- `channels.telegram.webhookSecret`: segredo do webhook (obrigatório quando `webhookUrl` estiver definido).
- `channels.telegram.webhookPath`: caminho local do webhook (padrão `/telegram-webhook`).
- `channels.telegram.webhookHost`: host local de bind do webhook (padrão `127.0.0.1`).
- `channels.telegram.webhookPort`: porta local de bind do webhook (padrão `8787`).
- `channels.telegram.actions.reactions`: bloqueia reações da ferramenta do Telegram.
- `channels.telegram.actions.sendMessage`: bloqueia envios de mensagem da ferramenta do Telegram.
- `channels.telegram.actions.deleteMessage`: bloqueia exclusões de mensagem da ferramenta do Telegram.
- `channels.telegram.actions.sticker`: bloqueia ações de sticker do Telegram — envio e pesquisa (padrão: false).
- `channels.telegram.reactionNotifications`: `off | own | all` — controla quais reações acionam eventos de sistema (padrão: `own` quando não definido).
- `channels.telegram.network.dnsResultOrder`: substitui a ordem de resultados de DNS (`ipv4first` ou `verbatim`). O padrão é `ipv4first` no Node 22+.
- `channels.telegram.network.dangerouslyAllowPrivateNetwork`: opt-in perigoso para ambientes confiáveis de fake-IP ou proxy transparente nos quais downloads de mídia do Telegram resolvem `api.telegram.org` para endereços privados/internos/de uso especial fora da permissão padrão da faixa de benchmark RFC 2544.
- `channels.telegram.proxy`: URL de proxy para chamadas da API de Bot (SOCKS/HTTP).
- `channels.telegram.webhookUrl`: ativa o modo Webhook (requer `channels.telegram.webhookSecret`).
- `channels.telegram.webhookSecret`: segredo do Webhook (obrigatório quando `webhookUrl` estiver definido).
- `channels.telegram.webhookPath`: caminho local do Webhook (padrão `/telegram-webhook`).
- `channels.telegram.webhookHost`: host local de bind do Webhook (padrão `127.0.0.1`).
- `channels.telegram.webhookPort`: porta local de bind do Webhook (padrão `8787`).
- `channels.telegram.actions.reactions`: gate para reações de ferramenta do Telegram.
- `channels.telegram.actions.sendMessage`: gate para envios de mensagem de ferramenta do Telegram.
- `channels.telegram.actions.deleteMessage`: gate para exclusões de mensagem de ferramenta do Telegram.
- `channels.telegram.actions.sticker`: gate para ações de sticker do Telegram — enviar e pesquisar (padrão: false).
- `channels.telegram.reactionNotifications`: `off | own | all` — controla quais reações acionam eventos do sistema (padrão: `own` quando não definido).
- `channels.telegram.reactionLevel`: `off | ack | minimal | extensive` — controla a capacidade de reação do agente (padrão: `minimal` quando não definido).
- `channels.telegram.errorPolicy`: `reply | silent` — controla o comportamento de resposta de erro (padrão: `reply`). Substituições por conta/grupo/tópico são compatíveis.
- `channels.telegram.errorCooldownMs`: ms mínimos entre respostas de erro para o mesmo chat (padrão: `60000`). Evita spam de erros durante indisponibilidades.
- `channels.telegram.errorPolicy`: `reply | silent` — controla o comportamento de resposta de erro (padrão: `reply`). Compatível com substituições por conta/grupo/tópico.
- `channels.telegram.errorCooldownMs`: mínimo em ms entre respostas de erro para o mesmo chat (padrão: `60000`). Evita spam de erros durante indisponibilidades.
- [Referência de configuração - Telegram](/gateway/configuration-reference#telegram)
- [Referência de configuração - Telegram](/pt-BR/gateway/configuration-reference#telegram)
Campos de alto sinal específicos do Telegram:
Campos específicos do Telegram com maior sinal:
- inicialização/autenticação: `enabled`, `botToken`, `tokenFile`, `accounts.*` (`tokenFile` deve apontar para um arquivo comum; symlinks são rejeitados)
- controle de acesso: `dmPolicy`, `allowFrom`, `groupPolicy`, `groupAllowFrom`, `groups`, `groups.*.topics.*`, `bindings[]` de nível superior (`type: "acp"`)
- inicialização/autenticação: `enabled`, `botToken`, `tokenFile`, `accounts.*` (`tokenFile` deve apontar para um arquivo regular; symlinks são rejeitados)
- controle de acesso: `dmPolicy`, `allowFrom`, `groupPolicy`, `groupAllowFrom`, `groups`, `groups.*.topics.*`, `bindings[]` no nível superior (`type: "acp"`)
- aprovações de exec: `execApprovals`, `accounts.*.execApprovals`
- comando/menu: `commands.native`, `commands.nativeSkills`, `customCommands`
- threading/respostas: `replyToMode`
- streaming: `streaming` (prévia), `blockStreaming`
- formatação/entrega: `textChunkLimit`, `chunkMode`, `linkPreview`, `responsePrefix`
- mídia/rede: `mediaMaxMb`, `timeoutSeconds`, `retry`, `network.autoSelectFamily`, `network.dangerouslyAllowPrivateNetwork`, `proxy`
- webhook: `webhookUrl`, `webhookSecret`, `webhookPath`, `webhookHost`
- ações/recursos: `capabilities.inlineButtons`, `actions.sendMessage|editMessage|deleteMessage|reactions|sticker`
- Webhook: `webhookUrl`, `webhookSecret`, `webhookPath`, `webhookHost`
- ações/capacidades: `capabilities.inlineButtons`, `actions.sendMessage|editMessage|deleteMessage|reactions|sticker`
- reações: `reactionNotifications`, `reactionLevel`
- erros: `errorPolicy`, `errorCooldownMs`
- gravações/histórico: `configWrites`, `historyLimit`, `dmHistoryLimit`, `dms.*.historyLimit`
## Relacionado
- [Pareamento](/channels/pairing)
- [Grupos](/channels/groups)
- [Segurança](/gateway/security)
- [Roteamento de canal](/channels/channel-routing)
- [Roteamento multiagente](/concepts/multi-agent)
- [Solução de problemas](/channels/troubleshooting)
- [Pareamento](/pt-BR/channels/pairing)
- [Grupos](/pt-BR/channels/groups)
- [Segurança](/pt-BR/gateway/security)
- [Roteamento de canal](/pt-BR/channels/channel-routing)
- [Roteamento multiagente](/pt-BR/concepts/multi-agent)
- [Solução de problemas](/pt-BR/channels/troubleshooting)

View File

@ -2,29 +2,33 @@
read_when:
- Estendendo o qa-lab ou o qa-channel
- Adicionando cenários de QA com suporte do repositório
- Criando automação de QA com maior realismo em torno do painel do Gateway
summary: Formato privado de automação de QA para qa-lab, qa-channel, cenários com seed e relatórios de protocolo
- Criando uma automação de QA com maior realismo em torno do painel do Gateway
summary: Formato da automação privada de QA para qa-lab, qa-channel, cenários com seed e relatórios de protocolo
title: Automação E2E de QA
x-i18n:
generated_at: "2026-04-18T05:24:45Z"
generated_at: "2026-04-20T05:41:39Z"
model: gpt-5.4
provider: openai
source_hash: adf8c5f74e8fabdc8e9fd7ecd41afce8b60354c7dd24d92ac926d3c527927cd4
source_hash: 34245ce871356caeab0d9e0eeeaa9fb4e408920a4a97ad27567fa365d8db17c7
source_path: concepts/qa-e2e-automation.md
workflow: 15
---
# Automação E2E de QA
A pilha privada de QA foi projetada para exercitar o OpenClaw de uma forma mais realista e com formato de canal do que um único teste unitário consegue.
A stack privada de QA foi projetada para exercitar o OpenClaw de uma forma mais
realista e com formato de canal do que um único teste unitário consegue.
Peças atuais:
- `extensions/qa-channel`: canal de mensagens sintético com superfícies de DM, canal, thread, reação, edição e exclusão.
- `extensions/qa-lab`: UI de depuração e barramento de QA para observar a transcrição, injetar mensagens de entrada e exportar um relatório em Markdown.
- `qa/`: recursos com seed mantidos no repositório para a tarefa inicial e cenários básicos de QA.
- `extensions/qa-channel`: canal de mensagens sintético com superfícies de DM, canal, thread,
reação, edição e exclusão.
- `extensions/qa-lab`: UI de depuração e barramento de QA para observar a transcrição,
injetar mensagens de entrada e exportar um relatório em Markdown.
- `qa/`: recursos com seed versionados no repositório para a tarefa inicial e
cenários de QA de linha de base.
O fluxo atual do operador de QA é um site de QA com dois painéis:
O fluxo atual do operador de QA é um site de QA em duas telas:
- Esquerda: painel do Gateway (Control UI) com o agente.
- Direita: QA Lab, mostrando a transcrição em estilo Slack e o plano do cenário.
@ -35,9 +39,13 @@ Execute com:
pnpm qa:lab:up
```
Isso compila o site de QA, inicia a lane do Gateway com Docker e expõe a página do QA Lab, onde um operador ou loop de automação pode dar ao agente uma missão de QA, observar o comportamento real do canal e registrar o que funcionou, falhou ou permaneceu bloqueado.
Isso compila o site de QA, inicia a lane do Gateway com Docker e expõe a
página do QA Lab, onde um operador ou loop de automação pode dar ao agente uma
missão de QA, observar o comportamento real do canal e registrar o que funcionou, falhou ou
permaneceu bloqueado.
Para uma iteração mais rápida da UI do QA Lab sem recompilar a imagem Docker a cada vez, inicie a pilha com um bundle do QA Lab montado por bind:
Para uma iteração mais rápida da UI do QA Lab sem reconstruir a imagem Docker a cada vez,
inicie a stack com um bundle do QA Lab montado por bind:
```bash
pnpm openclaw qa docker-build-image
@ -46,56 +54,89 @@ pnpm qa:lab:up:fast
pnpm qa:lab:watch
```
`qa:lab:up:fast` mantém os serviços Docker em uma imagem pré-compilada e monta por bind `extensions/qa-lab/web/dist` no contêiner `qa-lab`. `qa:lab:watch` recompila esse bundle a cada alteração, e o navegador recarrega automaticamente quando o hash de recursos do QA Lab muda.
`qa:lab:up:fast` mantém os serviços Docker em uma imagem pré-compilada e faz bind-mount de
`extensions/qa-lab/web/dist` no contêiner `qa-lab`. `qa:lab:watch`
recompila esse bundle em caso de mudança, e o navegador recarrega automaticamente quando o hash
do recurso do QA Lab muda.
Para uma lane de smoke real de transporte com Matrix, execute:
Para uma lane de smoke do Matrix com transporte real, execute:
```bash
pnpm openclaw qa matrix
```
Essa lane provisiona um homeserver Tuwunel descartável no Docker, registra usuários temporários de driver, SUT e observador, cria uma sala privada e então executa o Plugin real do Matrix dentro de um processo filho de Gateway de QA. A lane de transporte ao vivo mantém a configuração filha restrita ao transporte em teste, para que o Matrix seja executado sem `qa-channel` na configuração filha. Ela grava os artefatos estruturados do relatório e um log combinado de stdout/stderr no diretório de saída de Matrix QA selecionado. Para capturar também a saída externa de compilação/inicialização de `scripts/run-node.mjs`, defina `OPENCLAW_RUN_NODE_OUTPUT_LOG=<path>` para um arquivo de log local ao repositório.
Essa lane provisiona um homeserver Tuwunel descartável em Docker, registra
usuários temporários driver, SUT e observer, cria uma sala privada, e então executa
o Plugin real do Matrix dentro de um processo filho QA do Gateway. A lane de transporte ao vivo mantém
a configuração filha restrita ao transporte em teste, então o Matrix é executado sem
`qa-channel` na configuração filha. Ela grava os artefatos de relatório estruturado e
um log combinado de stdout/stderr no diretório de saída de QA do Matrix selecionado. Para
capturar também a saída externa de build/launcher de `scripts/run-node.mjs`, defina
`OPENCLAW_RUN_NODE_OUTPUT_LOG=<path>` para um arquivo de log local ao repositório.
Para uma lane de smoke real de transporte com Telegram, execute:
Para uma lane de smoke do Telegram com transporte real, execute:
```bash
pnpm openclaw qa telegram
```
Essa lane mira em um grupo privado real do Telegram em vez de provisionar um servidor descartável. Ela requer `OPENCLAW_QA_TELEGRAM_GROUP_ID`, `OPENCLAW_QA_TELEGRAM_DRIVER_BOT_TOKEN` e `OPENCLAW_QA_TELEGRAM_SUT_BOT_TOKEN`, além de dois bots distintos no mesmo grupo privado. O bot SUT precisa ter um nome de usuário no Telegram, e a observação entre bots funciona melhor quando ambos os bots têm o Bot-to-Bot Communication Mode habilitado em `@BotFather`.
Essa lane usa um grupo privado real do Telegram em vez de provisionar um
servidor descartável. Ela exige `OPENCLAW_QA_TELEGRAM_GROUP_ID`,
`OPENCLAW_QA_TELEGRAM_DRIVER_BOT_TOKEN` e
`OPENCLAW_QA_TELEGRAM_SUT_BOT_TOKEN`, além de dois bots distintos no mesmo
grupo privado. O bot SUT deve ter um nome de usuário do Telegram, e a observação
bot-para-bot funciona melhor quando ambos os bots têm o modo Bot-to-Bot Communication
ativado no `@BotFather`.
O comando encerra com código diferente de zero quando qualquer cenário falha. Use `--allow-failures` quando
quiser artefatos sem um código de saída de falha.
As lanes de transporte ao vivo agora compartilham um contrato menor em vez de cada uma inventar seu próprio formato de lista de cenários:
As lanes de transporte ao vivo agora compartilham um contrato menor em vez de cada uma inventar
seu próprio formato de lista de cenários:
`qa-channel` continua sendo a suíte ampla de comportamento sintético do produto e não faz parte da matriz de cobertura de transporte ao vivo.
`qa-channel` continua sendo a suíte ampla de comportamento sintético do produto e não faz parte
da matriz de cobertura de transporte ao vivo.
| Lane | Canary | Bloqueio por menção | Bloqueio por allowlist | Resposta de nível superior | Retomada após reinício | Continuação em thread | Isolamento de thread | Observação de reação | Comando de ajuda |
| -------- | ------ | ------------------- | ---------------------- | -------------------------- | ---------------------- | -------------------- | -------------------- | -------------------- | ---------------- |
| Matrix | x | x | x | x | x | x | x | x | |
| Telegram | x | | | | | | | | x |
| Lane | Canary | Bloqueio por menção | Bloqueio por allowlist | Resposta de nível superior | Retomada após reinício | Acompanhamento em thread | Isolamento de thread | Observação de reação | Comando help |
| -------- | ------ | ------------------- | ---------------------- | -------------------------- | ---------------------- | ------------------------ | -------------------- | -------------------- | ------------ |
| Matrix | x | x | x | x | x | x | x | x | |
| Telegram | x | | | | | | | | x |
Isso mantém o `qa-channel` como a suíte ampla de comportamento do produto, enquanto Matrix, Telegram e futuros transportes ao vivo compartilham uma lista explícita de verificação do contrato de transporte.
Isso mantém `qa-channel` como a suíte ampla de comportamento do produto, enquanto Matrix,
Telegram e futuros transportes ao vivo compartilham uma checklist explícita de contrato de transporte.
Para uma lane com VM Linux descartável sem trazer Docker para o fluxo de QA, execute:
Para uma lane descartável de VM Linux sem colocar Docker no caminho do QA, execute:
```bash
pnpm openclaw qa suite --runner multipass --scenario channel-chat-baseline
```
Isso inicializa um guest novo do Multipass, instala dependências, compila o OpenClaw dentro do guest, executa `qa suite` e então copia o relatório e o resumo normais de QA de volta para `.artifacts/qa-e2e/...` no host.
Isso inicializa um guest novo do Multipass, instala dependências, compila o OpenClaw
dentro do guest, executa `qa suite` e então copia o relatório e o resumo normais de QA
de volta para `.artifacts/qa-e2e/...` no host.
Ele reutiliza o mesmo comportamento de seleção de cenários de `qa suite` no host.
Execuções da suíte no host e no Multipass executam vários cenários selecionados em paralelo com workers isolados de Gateway por padrão, até 64 workers ou a contagem de cenários selecionada. Use `--concurrency <count>` para ajustar a quantidade de workers, ou `--concurrency 1` para execução serial.
Execuções ao vivo encaminham as entradas compatíveis de autenticação de QA que são práticas para o guest: chaves de provedor baseadas em env, o caminho de configuração do provedor ao vivo de QA e `CODEX_HOME` quando presente. Mantenha `--output-dir` sob a raiz do repositório para que o guest possa gravar de volta por meio do workspace montado.
Execuções da suíte no host e no Multipass executam múltiplos cenários selecionados em paralelo
com workers isolados do Gateway por padrão. `qa-channel` usa por padrão concorrência
4, limitada pela quantidade de cenários selecionados. Use `--concurrency <count>` para ajustar
a quantidade de workers, ou `--concurrency 1` para execução serial.
O comando encerra com código diferente de zero quando qualquer cenário falha. Use `--allow-failures` quando
quiser artefatos sem um código de saída de falha.
Execuções ao vivo encaminham as entradas de autenticação de QA compatíveis que são práticas para o
guest: chaves de provedor baseadas em env, o caminho de configuração do provedor ao vivo de QA e
`CODEX_HOME` quando presente. Mantenha `--output-dir` sob a raiz do repositório para que o guest
possa gravar de volta por meio do workspace montado.
## Seeds mantidos no repositório
## Seeds com suporte do repositório
Os recursos com seed ficam em `qa/`:
- `qa/scenarios/index.md`
- `qa/scenarios/<theme>/*.md`
Eles ficam intencionalmente no git para que o plano de QA seja visível tanto para humanos quanto para o agente.
Eles ficam intencionalmente no git para que o plano de QA seja visível tanto para humanos quanto para o
agente.
O `qa-lab` deve continuar sendo um executor genérico de Markdown. Cada arquivo Markdown de cenário é a fonte da verdade para uma execução de teste e deve definir:
`qa-lab` deve permanecer um executor genérico de Markdown. Cada arquivo Markdown de cenário é
a fonte da verdade para uma execução de teste e deve definir:
- metadados do cenário
- metadados opcionais de categoria, capacidade, lane e risco
@ -104,11 +145,16 @@ O `qa-lab` deve continuar sendo um executor genérico de Markdown. Cada arquivo
- patch opcional de configuração do Gateway
- o `qa-flow` executável
A superfície de runtime reutilizável que dá suporte ao `qa-flow` pode continuar genérica e transversal. Por exemplo, cenários em Markdown podem combinar helpers do lado do transporte com helpers do lado do navegador que dirigem a Control UI incorporada por meio da interface `browser.request` do Gateway sem adicionar um executor com caso especial.
A superfície de runtime reutilizável que sustenta `qa-flow` pode permanecer genérica
e transversal. Por exemplo, cenários em Markdown podem combinar helpers do lado do transporte
com helpers do lado do navegador que dirigem a Control UI incorporada pela
superfície `browser.request` do Gateway sem adicionar um executor com caso especial.
Os arquivos de cenário devem ser agrupados por capacidade do produto, e não pela pasta da árvore de código-fonte. Mantenha os IDs de cenário estáveis quando os arquivos forem movidos; use `docsRefs` e `codeRefs` para rastreabilidade de implementação.
Os arquivos de cenário devem ser agrupados por capacidade do produto, e não pela pasta da árvore
de código-fonte. Mantenha os IDs de cenário estáveis quando os arquivos forem movidos; use `docsRefs` e
`codeRefs` para rastreabilidade da implementação.
A lista básica deve permanecer ampla o suficiente para cobrir:
A lista de linha de base deve permanecer ampla o suficiente para cobrir:
- chat em DM e canal
- comportamento de thread
@ -117,37 +163,44 @@ A lista básica deve permanecer ampla o suficiente para cobrir:
- recuperação de memória
- troca de modelo
- handoff para subagente
- leitura do repositório e da documentação
- uma pequena tarefa de compilação, como Lobster Invaders
- leitura de repositório e de documentação
- uma pequena tarefa de build, como Lobster Invaders
## Lanes de mock de provedor
`qa suite` tem duas lanes locais de mock de provedor:
- `mock-openai` é o mock do OpenClaw sensível ao cenário. Ele continua sendo a lane de mock determinística padrão para QA com suporte do repositório e gates de paridade.
- `aimock` inicia um servidor de provedor baseado em AIMock para cobertura experimental de protocolo, fixture, gravação/reprodução e caos. Ele é aditivo e não substitui o despachante de cenários de `mock-openai`.
- `mock-openai` é o mock do OpenClaw orientado a cenários. Ele continua sendo a lane de mock
determinística padrão para QA com suporte do repositório e gates de paridade.
- `aimock` inicia um servidor de provedor com AIMock para cobertura experimental de protocolo,
fixture, record/replay e caos. Ele é complementar e não substitui o dispatcher
de cenários `mock-openai`.
A implementação da lane de provedor fica em `extensions/qa-lab/src/providers/`.
Cada provedor é responsável por seus padrões, inicialização de servidor local, configuração de modelo do Gateway, necessidades de preparação de perfil de autenticação e flags de capacidade de live/mock. O código compartilhado de suíte e Gateway deve rotear pelo registro de provedores em vez de ramificar pelos nomes dos provedores.
Cada provedor é responsável por seus padrões, inicialização do servidor local, configuração do modelo do Gateway,
necessidades de preparação de perfil de autenticação e flags de capacidade live/mock. O código
compartilhado da suíte e do Gateway deve passar pelo registro de provedores em vez de ramificar
com base em nomes de provedores.
## Adaptadores de transporte
O `qa-lab` é responsável por uma interface genérica de transporte para cenários de QA em Markdown.
`qa-channel` é o primeiro adaptador nessa interface, mas o objetivo do design é mais amplo:
canais futuros, reais ou sintéticos, devem se conectar ao mesmo executor de suíte em vez de adicionar um executor de QA específico de transporte.
`qa-lab` é responsável por uma superfície de transporte genérica para cenários de QA em Markdown.
`qa-channel` é o primeiro adaptador nessa superfície, mas o objetivo do design é mais amplo:
futuros canais reais ou sintéticos devem se conectar ao mesmo executor da suíte
em vez de adicionar um executor de QA específico por transporte.
No nível da arquitetura, a divisão é:
- `qa-lab` é responsável pela execução genérica de cenários, concorrência de workers, gravação de artefatos e relatórios.
- o adaptador de transporte é responsável pela configuração do Gateway, prontidão, observação de entrada e saída, ações de transporte e estado de transporte normalizado.
- os arquivos de cenário em Markdown sob `qa/scenarios/` definem a execução de teste; o `qa-lab` fornece a superfície de runtime reutilizável que os executa.
- os arquivos de cenário em Markdown em `qa/scenarios/` definem a execução do teste; `qa-lab` fornece a superfície de runtime reutilizável que os executa.
A orientação de adoção voltada a mantenedores para novos adaptadores de canal está em
A orientação de adoção voltada para mantenedores para novos adaptadores de canal fica em
[Testing](/pt-BR/help/testing#adding-a-channel-to-qa).
## Relatórios
O `qa-lab` exporta um relatório de protocolo em Markdown a partir da linha do tempo observada no barramento.
`qa-lab` exporta um relatório de protocolo em Markdown a partir da linha do tempo observada no barramento.
O relatório deve responder:
- O que funcionou
@ -155,7 +208,8 @@ O relatório deve responder:
- O que permaneceu bloqueado
- Quais cenários de acompanhamento valem a pena adicionar
Para verificações de personalidade e estilo, execute o mesmo cenário em várias refs de modelo ao vivo e grave um relatório em Markdown avaliado:
Para verificações de caráter e estilo, execute o mesmo cenário em várias refs de modelo ao vivo
e escreva um relatório em Markdown avaliado:
```bash
pnpm openclaw qa character-eval \
@ -174,17 +228,36 @@ pnpm openclaw qa character-eval \
--judge-concurrency 16
```
O comando executa processos filhos locais de Gateway de QA, não Docker. Os cenários de avaliação de personalidade devem definir a persona por meio de `SOUL.md` e então executar turnos normais de usuário, como chat, ajuda com workspace e pequenas tarefas em arquivos. O modelo candidato não deve ser informado de que está sendo avaliado. O comando preserva cada transcrição completa, registra estatísticas básicas da execução e depois solicita aos modelos juízes, em modo fast, com raciocínio `xhigh`, que classifiquem as execuções por naturalidade, vibe e humor.
Use `--blind-judge-models` ao comparar provedores: o prompt do juiz ainda recebe cada transcrição e status de execução, mas as refs dos candidatos são substituídas por rótulos neutros como `candidate-01`; o relatório remapeia as classificações para as refs reais após o parsing.
As execuções candidatas usam `high` thinking por padrão, com `xhigh` para modelos OpenAI que oferecem suporte. Substitua um candidato específico inline com `--model provider/model,thinking=<level>`. `--thinking <level>` ainda define um fallback global, e o formato mais antigo `--model-thinking <provider/model=level>` é mantido por compatibilidade.
As refs candidatas de OpenAI usam modo fast por padrão para que o processamento prioritário seja usado quando o provedor oferecer suporte. Adicione `,fast`, `,no-fast` ou `,fast=false` inline quando um único candidato ou juiz precisar de substituição. Passe `--fast` apenas quando quiser forçar o modo fast para todos os modelos candidatos. As durações de candidatos e juízes são registradas no relatório para análise de benchmark, mas os prompts dos juízes dizem explicitamente para não classificar por velocidade.
As execuções de modelos candidatos e juízes usam concorrência 16 por padrão. Reduza `--concurrency` ou `--judge-concurrency` quando limites do provedor ou pressão no Gateway local tornarem uma execução muito ruidosa.
Quando nenhum `--model` candidato é informado, a avaliação de personalidade usa por padrão
O comando executa processos filhos locais do Gateway de QA, não Docker. Cenários de avaliação de caráter
devem definir a persona por meio de `SOUL.md` e então executar turnos normais de usuário,
como chat, ajuda de workspace e pequenas tarefas com arquivos. O modelo candidato
não deve ser informado de que está sendo avaliado. O comando preserva cada
transcrição completa, registra estatísticas básicas da execução e então solicita aos modelos julgadores, no modo fast com
raciocínio `xhigh`, que classifiquem as execuções por naturalidade, vibe e humor.
Use `--blind-judge-models` ao comparar provedores: o prompt do julgador ainda recebe
cada transcrição e status da execução, mas as refs candidatas são substituídas por rótulos neutros
como `candidate-01`; o relatório mapeia as classificações de volta para as refs reais após
o parsing.
As execuções candidatas usam por padrão pensamento `high`, com `xhigh` para modelos OpenAI que
o suportam. Substitua um candidato específico inline com
`--model provider/model,thinking=<level>`. `--thinking <level>` ainda define um
fallback global, e o formato antigo `--model-thinking <provider/model=level>` é
mantido por compatibilidade.
As refs candidatas da OpenAI usam por padrão o modo fast para que o processamento prioritário seja usado
onde o provedor der suporte. Adicione `,fast`, `,no-fast` ou `,fast=false` inline quando um
único candidato ou julgador precisar de uma substituição. Passe `--fast` apenas quando quiser
forçar o modo fast para todos os modelos candidatos. As durações de candidatos e julgadores são
registradas no relatório para análise de benchmark, mas os prompts dos julgadores dizem explicitamente
para não classificar por velocidade.
Execuções de modelos candidatos e julgadores usam por padrão concorrência 16. Reduza
`--concurrency` ou `--judge-concurrency` quando limites do provedor ou pressão no Gateway local
deixarem a execução muito ruidosa.
Quando nenhum `--model` candidato é passado, a avaliação de caráter usa por padrão
`openai/gpt-5.4`, `openai/gpt-5.2`, `openai/gpt-5`, `anthropic/claude-opus-4-6`,
`anthropic/claude-sonnet-4-6`, `zai/glm-5.1`,
`moonshot/kimi-k2.5` e
`google/gemini-3.1-pro-preview` quando nenhum `--model` é informado.
Quando nenhum `--judge-model` é informado, os juízes usam por padrão
`google/gemini-3.1-pro-preview` quando nenhum `--model` é passado.
Quando nenhum `--judge-model` é passado, os julgadores usam por padrão
`openai/gpt-5.4,thinking=xhigh,fast` e
`anthropic/claude-opus-4-6,thinking=high`.

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -3,22 +3,22 @@ read_when:
- Você precisa de um método de instalação diferente do início rápido de Primeiros passos
- Você quer implantar em uma plataforma de nuvem
- Você precisa atualizar, migrar ou desinstalar
summary: Instale o OpenClaw — script de instalação, npm/pnpm/bun, a partir do código-fonte, Docker e mais
summary: Instale o OpenClaw — script do instalador, npm/pnpm/bun, a partir do código-fonte, Docker e mais
title: Instalar
x-i18n:
generated_at: "2026-04-05T12:45:12Z"
generated_at: "2026-04-20T05:41:43Z"
model: gpt-5.4
provider: openai
source_hash: eca17c76a2a66166b3d8cda9dc3144ab920d30ad0ed2a220eb9389d7a383ba5d
source_hash: ad0a5fdbbf13dcaf2fed6840f35aa22b2e9e458509509f98303c8d87c2556a6f
source_path: install/index.md
workflow: 15
---
# Instalar
# Instalação
## Recomendado: script de instalação
## Recomendado: script do instalador
A forma mais rápida de instalar. Ele detecta seu sistema operacional, instala o Node se necessário, instala o OpenClaw e inicia o onboarding.
A forma mais rápida de instalar. Ele detecta seu SO, instala o Node se necessário, instala o OpenClaw e inicia a integração inicial.
<Tabs>
<Tab title="macOS / Linux / WSL2">
@ -33,7 +33,7 @@ A forma mais rápida de instalar. Ele detecta seu sistema operacional, instala o
</Tab>
</Tabs>
Para instalar sem executar o onboarding:
Para instalar sem executar a integração inicial:
<Tabs>
<Tab title="macOS / Linux / WSL2">
@ -48,27 +48,27 @@ Para instalar sem executar o onboarding:
</Tab>
</Tabs>
Para ver todas as flags e opções de CI/automação, consulte [Internos do instalador](/install/installer).
Para todos os sinalizadores e opções de CI/automação, consulte [Detalhes internos do instalador](/pt-BR/install/installer).
## Requisitos do sistema
- **Node 24** (recomendado) ou Node 22.14+ — o script de instalação cuida disso automaticamente
- **macOS, Linux ou Windows** — tanto Windows nativo quanto WSL2 são compatíveis; WSL2 é mais estável. Consulte [Windows](/platforms/windows).
- `pnpm` é necessário apenas se você compilar a partir do código-fonte
- **Node 24** (recomendado) ou Node 22.14+ — o script do instalador cuida disso automaticamente
- **macOS, Linux ou Windows** — tanto o Windows nativo quanto o WSL2 são compatíveis; o WSL2 é mais estável. Consulte [Windows](/pt-BR/platforms/windows).
- `pnpm` é necessário se você compilar a partir do código-fonte
## Métodos alternativos de instalação
### Instalador com prefixo local (`install-cli.sh`)
Use este método quando quiser manter o OpenClaw e o Node sob um prefixo local, como
`~/.openclaw`, sem depender de uma instalação de Node em todo o sistema:
Use isto quando quiser manter o OpenClaw e o Node em um prefixo local como
`~/.openclaw`, sem depender de uma instalação do Node em todo o sistema:
```bash
curl -fsSL https://openclaw.ai/install-cli.sh | bash
```
Ele oferece suporte a instalações via npm por padrão, além de instalações a partir de checkout git no mesmo
fluxo de prefixo. Referência completa: [Internos do instalador](/install/installer#install-clish).
Ele oferece suporte a instalações via npm por padrão, além de instalações a partir de checkout do git dentro do mesmo
fluxo com prefixo. Referência completa: [Detalhes internos do instalador](/pt-BR/install/installer#install-clish).
### npm, pnpm ou bun
@ -100,7 +100,7 @@ Se você já gerencia o Node por conta própria:
```
<Note>
O Bun é compatível com o caminho de instalação global da CLI. Para o runtime do Gateway, o Node continua sendo o runtime de daemon recomendado.
Bun é compatível com o caminho de instalação global da CLI. Para o runtime do Gateway, o Node continua sendo o runtime de daemon recomendado.
</Note>
</Tab>
@ -122,14 +122,14 @@ Para contribuidores ou qualquer pessoa que queira executar a partir de um checko
```bash
git clone https://github.com/openclaw/openclaw.git
cd openclaw
pnpm install && pnpm ui:build && pnpm build
pnpm install && pnpm build && pnpm ui:build
pnpm link --global
openclaw onboard --install-daemon
```
Ou ignore o link e use `pnpm openclaw ...` de dentro do repositório. Consulte [Setup](/start/setup) para ver fluxos completos de desenvolvimento.
Ou ignore o link e use `pnpm openclaw ...` dentro do repositório. Consulte [Configuração](/pt-BR/start/setup) para ver os fluxos completos de desenvolvimento.
### Instalar do GitHub main
### Instalar a partir da branch `main` do GitHub
```bash
npm install -g github:openclaw/openclaw#main
@ -138,76 +138,76 @@ npm install -g github:openclaw/openclaw#main
### Contêineres e gerenciadores de pacotes
<CardGroup cols={2}>
<Card title="Docker" href="/install/docker" icon="container">
Implantações conteinerizadas ou headless.
<Card title="Docker" href="/pt-BR/install/docker" icon="container">
Implantações em contêiner ou sem interface.
</Card>
<Card title="Podman" href="/install/podman" icon="container">
Alternativa de contêiner rootless ao Docker.
<Card title="Podman" href="/pt-BR/install/podman" icon="container">
Alternativa de contêiner sem root ao Docker.
</Card>
<Card title="Nix" href="/install/nix" icon="snowflake">
<Card title="Nix" href="/pt-BR/install/nix" icon="snowflake">
Instalação declarativa via flake do Nix.
</Card>
<Card title="Ansible" href="/install/ansible" icon="server">
<Card title="Ansible" href="/pt-BR/install/ansible" icon="server">
Provisionamento automatizado de frota.
</Card>
<Card title="Bun" href="/install/bun" icon="zap">
Uso somente da CLI via runtime Bun.
<Card title="Bun" href="/pt-BR/install/bun" icon="zap">
Uso somente da CLI com o runtime Bun.
</Card>
</CardGroup>
## Verifique a instalação
```bash
openclaw --version # confirm the CLI is available
openclaw doctor # check for config issues
openclaw gateway status # verify the Gateway is running
openclaw --version # confirma se a CLI está disponível
openclaw doctor # verifica se há problemas de configuração
openclaw gateway status # verifica se o Gateway está em execução
```
Se você quiser inicialização gerenciada após a instalação:
- macOS: LaunchAgent via `openclaw onboard --install-daemon` ou `openclaw gateway install`
- Linux/WSL2: serviço de usuário systemd pelos mesmos comandos
- Windows nativo: Scheduled Task primeiro, com fallback para um item de login por usuário na pasta Startup se a criação da tarefa for negada
- Linux/WSL2: serviço de usuário do systemd pelos mesmos comandos
- Windows nativo: Scheduled Task primeiro, com fallback para um item de login na pasta Startup por usuário se a criação da tarefa for negada
## Hospedagem e implantação
Implante o OpenClaw em um servidor de nuvem ou VPS:
Implante o OpenClaw em um servidor em nuvem ou VPS:
<CardGroup cols={3}>
<Card title="VPS" href="/vps">Qualquer VPS Linux</Card>
<Card title="Docker VM" href="/install/docker-vm-runtime">Etapas compartilhadas do Docker</Card>
<Card title="Kubernetes" href="/install/kubernetes">K8s</Card>
<Card title="Fly.io" href="/install/fly">Fly.io</Card>
<Card title="Hetzner" href="/install/hetzner">Hetzner</Card>
<Card title="GCP" href="/install/gcp">Google Cloud</Card>
<Card title="Azure" href="/install/azure">Azure</Card>
<Card title="Railway" href="/install/railway">Railway</Card>
<Card title="Render" href="/install/render">Render</Card>
<Card title="Northflank" href="/install/northflank">Northflank</Card>
<Card title="VPS" href="/pt-BR/vps">Qualquer VPS Linux</Card>
<Card title="Docker VM" href="/pt-BR/install/docker-vm-runtime">Etapas compartilhadas do Docker</Card>
<Card title="Kubernetes" href="/pt-BR/install/kubernetes">K8s</Card>
<Card title="Fly.io" href="/pt-BR/install/fly">Fly.io</Card>
<Card title="Hetzner" href="/pt-BR/install/hetzner">Hetzner</Card>
<Card title="GCP" href="/pt-BR/install/gcp">Google Cloud</Card>
<Card title="Azure" href="/pt-BR/install/azure">Azure</Card>
<Card title="Railway" href="/pt-BR/install/railway">Railway</Card>
<Card title="Render" href="/pt-BR/install/render">Render</Card>
<Card title="Northflank" href="/pt-BR/install/northflank">Northflank</Card>
</CardGroup>
## Atualizar, migrar ou desinstalar
<CardGroup cols={3}>
<Card title="Atualização" href="/install/updating" icon="refresh-cw">
<Card title="Atualização" href="/pt-BR/install/updating" icon="refresh-cw">
Mantenha o OpenClaw atualizado.
</Card>
<Card title="Migração" href="/install/migrating" icon="arrow-right">
Mude para uma nova máquina.
<Card title="Migração" href="/pt-BR/install/migrating" icon="arrow-right">
Mova para uma nova máquina.
</Card>
<Card title="Desinstalar" href="/install/uninstall" icon="trash-2">
<Card title="Desinstalar" href="/pt-BR/install/uninstall" icon="trash-2">
Remova o OpenClaw completamente.
</Card>
</CardGroup>
## Solução de problemas: `openclaw` não encontrado
Se a instalação foi bem-sucedida, mas `openclaw` não é encontrado no terminal:
Se a instalação foi concluída com sucesso, mas `openclaw` não é encontrado no terminal:
```bash
node -v # Node installed?
npm prefix -g # Where are global packages?
echo "$PATH" # Is the global bin dir in PATH?
node -v # Node instalado?
npm prefix -g # Onde estão os pacotes globais?
echo "$PATH" # O diretório global de bin está no PATH?
```
Se `$(npm prefix -g)/bin` não estiver no seu `$PATH`, adicione-o ao arquivo de inicialização do shell (`~/.zshrc` ou `~/.bashrc`):
@ -216,4 +216,4 @@ Se `$(npm prefix -g)/bin` não estiver no seu `$PATH`, adicione-o ao arquivo de
export PATH="$(npm prefix -g)/bin:$PATH"
```
Depois abra um novo terminal. Consulte [Configuração do Node](/install/node) para mais detalhes.
Depois, abra um novo terminal. Consulte [Configuração do Node](/pt-BR/install/node) para mais detalhes.

View File

@ -1,24 +1,27 @@
---
read_when:
- Instalando o OpenClaw no Windows
- Escolhendo entre Windows nativo e WSL2
- Buscando o status do app complementar para Windows
summary: 'Suporte ao Windows: caminhos de instalação nativo e WSL2, daemon e limitações atuais'
- Escolhendo entre o Windows nativo e o WSL2
- Procurando o status do aplicativo complementar para Windows
summary: 'Suporte ao Windows: caminhos de instalação nativos e via WSL2, daemon e limitações atuais'
title: Windows
x-i18n:
generated_at: "2026-04-05T12:48:32Z"
generated_at: "2026-04-20T05:41:42Z"
model: gpt-5.4
provider: openai
source_hash: 7d9819206bdd65cf03519c1bc73ed0c7889b0ab842215ea94343262300adfd14
source_hash: 1e7451c785a1d75c809522ad93e2c44a00b211f77f14c5c489fd0b01840d3fe2
source_path: platforms/windows.md
workflow: 15
---
# Windows
O OpenClaw oferece suporte tanto a **Windows nativo** quanto a **WSL2**. O WSL2 é o caminho mais estável e recomendado para a experiência completa — a CLI, o Gateway e as ferramentas são executados dentro do Linux com compatibilidade total. O Windows nativo funciona para o uso principal da CLI e do Gateway, com algumas limitações observadas abaixo.
O OpenClaw oferece suporte tanto a **Windows nativo** quanto a **WSL2**. O WSL2 é o caminho mais
estável e recomendado para a experiência completa — a CLI, o Gateway e as
ferramentas são executados dentro do Linux com compatibilidade total. O Windows nativo funciona para
uso básico da CLI e do Gateway, com algumas limitações observadas abaixo.
Apps complementares nativos para Windows estão planejados.
Aplicativos complementares nativos para Windows estão planejados.
## WSL2 (recomendado)
@ -28,13 +31,13 @@ Apps complementares nativos para Windows estão planejados.
## Status do Windows nativo
Os fluxos da CLI no Windows nativo estão melhorando, mas o WSL2 ainda é o caminho recomendado.
Os fluxos da CLI nativa no Windows estão melhorando, mas o WSL2 ainda é o caminho recomendado.
O que funciona bem no Windows nativo hoje:
- instalador do site via `install.ps1`
- uso local da CLI, como `openclaw --version`, `openclaw doctor` e `openclaw plugins list --json`
- smoke de agent/provider local incorporado, como:
- teste básico incorporado de agente/provedor local, como:
```powershell
openclaw agent --local --agent main --thinking low -m "Reply with exactly WINDOWS-HATCH-OK."
@ -44,11 +47,11 @@ Limitações atuais:
- `openclaw onboard --non-interactive` ainda espera um gateway local acessível, a menos que você passe `--skip-health`
- `openclaw onboard --non-interactive --install-daemon` e `openclaw gateway install` tentam primeiro usar Tarefas Agendadas do Windows
- se a criação da Tarefa Agendada for negada, o OpenClaw recorre a um item de login por usuário na pasta Startup e inicia o gateway imediatamente
- se o próprio `schtasks` travar ou parar de responder, o OpenClaw agora aborta esse caminho rapidamente e recorre ao fallback em vez de ficar travado para sempre
- as Tarefas Agendadas ainda são preferidas quando disponíveis porque oferecem melhor status de supervisor
- se a criação da Tarefa Agendada for negada, o OpenClaw recorre a um item de inicialização por usuário na pasta Inicializar e inicia o gateway imediatamente
- se o próprio `schtasks` travar ou parar de responder, o OpenClaw agora interrompe esse caminho rapidamente e usa o fallback em vez de ficar travado indefinidamente
- Tarefas Agendadas ainda são preferidas quando disponíveis porque fornecem um melhor status de supervisão
Se você quiser apenas a CLI nativa, sem instalar o serviço do gateway, use um destes:
Se você quiser apenas a CLI nativa, sem instalar o serviço do gateway, use uma destas opções:
```powershell
openclaw onboard --non-interactive --skip-health
@ -62,14 +65,14 @@ openclaw gateway install
openclaw gateway status --json
```
Se a criação da Tarefa Agendada estiver bloqueada, o modo de serviço de fallback ainda inicia automaticamente após o login por meio da pasta Startup do usuário atual.
Se a criação de Tarefa Agendada estiver bloqueada, o modo de serviço de fallback ainda inicia automaticamente após o login por meio da pasta Inicializar do usuário atual.
## Gateway
- [Runbook do Gateway](/pt-BR/gateway)
- [Guia operacional do Gateway](/pt-BR/gateway)
- [Configuração](/pt-BR/gateway/configuration)
## Instalação do serviço Gateway (CLI)
## Instalação do serviço do Gateway (CLI)
Dentro do WSL2:
@ -99,9 +102,10 @@ openclaw doctor
## Inicialização automática do Gateway antes do login no Windows
Para configurações headless, garanta que toda a cadeia de inicialização seja executada mesmo quando ninguém fizer login no Windows.
Para configurações headless, garanta que toda a cadeia de inicialização seja executada mesmo quando ninguém fizer login no
Windows.
### 1) Mantenha os serviços do usuário em execução sem login
### 1) Manter serviços de usuário em execução sem login
Dentro do WSL:
@ -109,7 +113,7 @@ Dentro do WSL:
sudo loginctl enable-linger "$(whoami)"
```
### 2) Instale o serviço de usuário do gateway OpenClaw
### 2) Instalar o serviço de usuário do gateway do OpenClaw
Dentro do WSL:
@ -117,7 +121,7 @@ Dentro do WSL:
openclaw gateway install
```
### 3) Inicie o WSL automaticamente na inicialização do Windows
### 3) Iniciar o WSL automaticamente na inicialização do Windows
No PowerShell como Administrador:
@ -125,7 +129,7 @@ No PowerShell como Administrador:
schtasks /create /tn "WSL Boot" /tr "wsl.exe -d Ubuntu --exec /bin/true" /sc onstart /ru SYSTEM
```
Substitua `Ubuntu` pelo nome da sua distro em:
Substitua `Ubuntu` pelo nome da sua distribuição em:
```powershell
wsl --list --verbose
@ -133,16 +137,19 @@ wsl --list --verbose
### Verificar a cadeia de inicialização
Após uma reinicialização (antes do login no Windows), verifique no WSL:
Após uma reinicialização (antes do login no Windows), verifique a partir do WSL:
```bash
systemctl --user is-enabled openclaw-gateway.service
systemctl --user status openclaw-gateway.service --no-pager
```
## Avançado: expor serviços do WSL pela LAN (portproxy)
## Avançado: expor serviços do WSL na LAN (portproxy)
O WSL tem sua própria rede virtual. Se outra máquina precisar acessar um serviço em execução **dentro do WSL** (SSH, um servidor TTS local ou o Gateway), você precisará encaminhar uma porta do Windows para o IP atual do WSL. O IP do WSL muda após reinicializações, então talvez seja necessário atualizar a regra de encaminhamento.
O WSL tem sua própria rede virtual. Se outra máquina precisar acessar um serviço
em execução **dentro do WSL** (SSH, um servidor TTS local ou o Gateway), você deve
encaminhar uma porta do Windows para o IP atual do WSL. O IP do WSL muda após reinicializações,
então talvez seja necessário atualizar a regra de encaminhamento.
Exemplo (PowerShell **como Administrador**):
@ -158,7 +165,7 @@ netsh interface portproxy add v4tov4 listenaddress=0.0.0.0 listenport=$ListenPor
connectaddress=$WslIp connectport=$TargetPort
```
Permita a porta no Firewall do Windows (uma única vez):
Permita a porta no Firewall do Windows (uma vez):
```powershell
New-NetFirewallRule -DisplayName "WSL SSH $ListenPort" -Direction Inbound `
@ -175,12 +182,12 @@ netsh interface portproxy add v4tov4 listenport=$ListenPort listenaddress=0.0.0.
Observações:
- O SSH a partir de outra máquina deve apontar para o **IP do host Windows** (exemplo: `ssh user@windows-host -p 2222`).
- Nós remotos precisam apontar para uma URL do Gateway **acessível** (não `127.0.0.1`); use
- O SSH de outra máquina aponta para o **IP do host Windows** (exemplo: `ssh user@windows-host -p 2222`).
- Nós remotos devem apontar para uma URL de Gateway **acessível** (não `127.0.0.1`); use
`openclaw status --all` para confirmar.
- Use `listenaddress=0.0.0.0` para acesso pela LAN; `127.0.0.1` mantém o acesso apenas local.
- Se quiser isso automático, registre uma Tarefa Agendada para executar a etapa de atualização
no login.
- Use `listenaddress=0.0.0.0` para acesso pela LAN; `127.0.0.1` o mantém apenas local.
- Se quiser automatizar isso, registre uma Tarefa Agendada para executar a etapa de
atualização no login.
## Instalação passo a passo do WSL2
@ -190,16 +197,16 @@ Abra o PowerShell (Admin):
```powershell
wsl --install
# Ou escolha uma distro explicitamente:
# Ou escolha uma distribuição explicitamente:
wsl --list --online
wsl --install -d Ubuntu-24.04
```
Reinicie se o Windows solicitar.
### 2) Ative o systemd (necessário para instalar o gateway)
### 2) Habilite o systemd (obrigatório para instalar o gateway)
No seu terminal WSL:
No terminal do WSL:
```bash
sudo tee /etc/wsl.conf >/dev/null <<'EOF'
@ -214,7 +221,7 @@ Depois, no PowerShell:
wsl --shutdown
```
Abra o Ubuntu novamente e então verifique:
Abra o Ubuntu novamente e verifique:
```bash
systemctl --user status
@ -222,20 +229,30 @@ systemctl --user status
### 3) Instale o OpenClaw (dentro do WSL)
Siga o fluxo Linux de Primeiros passos dentro do WSL:
Para uma configuração inicial normal dentro do WSL, siga o fluxo de Primeiros passos para Linux:
```bash
git clone https://github.com/openclaw/openclaw.git
cd openclaw
pnpm install
pnpm ui:build # instala automaticamente as dependências da UI na primeira execução
pnpm build
openclaw onboard
pnpm ui:build
pnpm openclaw onboard --install-daemon
```
Se você estiver desenvolvendo a partir do código-fonte em vez de fazer a configuração inicial, use o
fluxo de desenvolvimento a partir do código-fonte em [Configuração](/pt-BR/start/setup):
```bash
pnpm install
# Apenas na primeira execução (ou após redefinir a configuração/workspace local do OpenClaw)
pnpm openclaw setup
pnpm gateway:watch
```
Guia completo: [Primeiros passos](/pt-BR/start/getting-started)
## App complementar para Windows
## Aplicativo complementar para Windows
Ainda não temos um app complementar para Windows. Contribuições são bem-vindas se você quiser
Ainda não temos um aplicativo complementar para Windows. Contribuições são bem-vindas se você quiser
ajudar a tornar isso realidade.

View File

@ -1,14 +1,14 @@
---
read_when:
- Configurando uma nova máquina
- Você quer o “mais recente e melhor” sem quebrar sua configuração pessoal
summary: Fluxos avançados de configuração e desenvolvimento para o OpenClaw
- Você quer a “última e melhor” versão sem quebrar sua configuração pessoal
summary: Fluxos de trabalho avançados de configuração e desenvolvimento para OpenClaw
title: Configuração
x-i18n:
generated_at: "2026-04-05T12:53:40Z"
generated_at: "2026-04-20T05:41:41Z"
model: gpt-5.4
provider: openai
source_hash: be4e280dde7f3a224345ca557ef2fb35a9c9db8520454ff63794ac6f8d4e71e7
source_hash: 773cdbef5f38b069303b5e13fca5fcdc28f082746869f17b8b92aab1610b95a8
source_path: start/setup.md
workflow: 15
---
@ -16,28 +16,28 @@ x-i18n:
# Configuração
<Note>
Se você está configurando pela primeira vez, comece com [Primeiros passos](/pt-BR/start/getting-started).
Para detalhes de onboarding, consulte [Onboarding (CLI)](/pt-BR/start/wizard).
Se você estiver configurando pela primeira vez, comece com [Primeiros passos](/pt-BR/start/getting-started).
Para detalhes de onboarding, veja [Onboarding (CLI)](/pt-BR/start/wizard).
</Note>
## Resumo
## Resumo rápido
- **As personalizações ficam fora do repositório:** `~/.openclaw/workspace` (workspace) + `~/.openclaw/openclaw.json` (configuração).
- **Fluxo estável:** instale o app macOS; deixe-o executar o Gateway empacotado.
- **Fluxo de ponta:** execute você mesmo o Gateway via `pnpm gateway:watch` e depois deixe o app macOS se conectar no modo Local.
- **A personalização fica fora do repositório:** `~/.openclaw/workspace` (workspace) + `~/.openclaw/openclaw.json` (configuração).
- **Fluxo de trabalho estável:** instale o app do macOS; deixe-o executar o Gateway incluído.
- **Fluxo de trabalho de ponta:** execute o Gateway você mesmo via `pnpm gateway:watch`, depois deixe o app do macOS se conectar no modo Local.
## Pré-requisitos (a partir do código-fonte)
- Node 24 recomendado (Node 22 LTS, atualmente `22.14+`, ainda compatível)
- `pnpm` preferido (ou Bun, se você intencionalmente usar o [fluxo Bun](/pt-BR/install/bun))
- Docker (opcional; apenas para configuração/e2e em contêiner — consulte [Docker](/pt-BR/install/docker))
- `pnpm` preferencial (ou Bun, se você estiver usando intencionalmente o [fluxo de trabalho com Bun](/pt-BR/install/bun))
- Docker (opcional; apenas para configuração em contêiner/e2e — veja [Docker](/pt-BR/install/docker))
## Estratégia de personalização (para que atualizações não prejudiquem)
## Estratégia de personalização (para que as atualizações não prejudiquem)
Se você quiser “100% personalizado para mim” _e_ atualizações fáceis, mantenha sua personalização em:
Se você quer algo “100% personalizado para mim” _e_ atualizações fáceis, mantenha sua personalização em:
- **Configuração:** `~/.openclaw/openclaw.json` (JSON/estilo JSON5)
- **Workspace:** `~/.openclaw/workspace` (Skills, prompts, memórias; torne-o um repositório git privado)
- **Configuração:** `~/.openclaw/openclaw.json` (estilo JSON/JSON5)
- **Workspace:** `~/.openclaw/workspace` (Skills, prompts, memórias; transforme-o em um repositório git privado)
Inicialize uma vez:
@ -51,22 +51,22 @@ De dentro deste repositório, use a entrada local da CLI:
openclaw setup
```
Se você ainda não tiver uma instalação global, execute por meio de `pnpm openclaw setup` (ou `bun run openclaw setup` se estiver usando o fluxo Bun).
Se você ainda não tiver uma instalação global, execute via `pnpm openclaw setup` (ou `bun run openclaw setup` se estiver usando o fluxo de trabalho com Bun).
## Execute o Gateway a partir deste repositório
Após `pnpm build`, você pode executar a CLI empacotada diretamente:
Depois de `pnpm build`, você pode executar a CLI empacotada diretamente:
```bash
node openclaw.mjs gateway --port 18789 --verbose
```
## Fluxo estável (app macOS primeiro)
## Fluxo de trabalho estável (app do macOS primeiro)
1. Instale e inicie o **OpenClaw.app** (barra de menu).
2. Conclua a checklist de onboarding/permissões (prompts TCC).
3. Verifique se o Gateway está em **Local** e em execução (o app o gerencia).
4. Vincule superfícies (exemplo: WhatsApp):
1. Instale e abra o **OpenClaw.app** (barra de menus).
2. Conclua a lista de verificação de onboarding/permissões (prompts do TCC).
3. Garanta que o Gateway esteja em **Local** e em execução (o app o gerencia).
4. Vincule as superfícies (exemplo: WhatsApp):
```bash
openclaw channels login
@ -78,17 +78,17 @@ openclaw channels login
openclaw health
```
Se o onboarding não estiver disponível no seu build:
Se o onboarding não estiver disponível na sua build:
- Execute `openclaw setup`, depois `openclaw channels login` e então inicie o Gateway manualmente (`openclaw gateway`).
- Execute `openclaw setup`, depois `openclaw channels login`, e então inicie o Gateway manualmente (`openclaw gateway`).
## Fluxo de ponta (Gateway em um terminal)
## Fluxo de trabalho de ponta (Gateway em um terminal)
Objetivo: trabalhar no Gateway TypeScript, obter hot reload e manter a UI do app macOS conectada.
Objetivo: trabalhar no Gateway em TypeScript, obter hot reload e manter a interface do app do macOS conectada.
### 0) (Opcional) Execute também o app macOS a partir do código-fonte
### 0) (Opcional) Execute também o app do macOS a partir do código-fonte
Se você também quiser o app macOS na ponta:
Se você também quiser o app do macOS na versão de ponta:
```bash
./scripts/restart-mac.sh
@ -98,20 +98,25 @@ Se você também quiser o app macOS na ponta:
```bash
pnpm install
# Apenas na primeira execução (ou após redefinir a configuração/workspace local do OpenClaw)
pnpm openclaw setup
pnpm gateway:watch
```
`gateway:watch` executa o gateway em modo watch e recarrega em mudanças relevantes de código-fonte,
configuração e metadados de plugins empacotados.
`gateway:watch` executa o gateway em modo watch e recarrega em mudanças relevantes no código-fonte, na configuração e nos metadados de plugins incluídos.
`pnpm openclaw setup` é a etapa única de inicialização da configuração/workspace local para um checkout novo.
`pnpm gateway:watch` não recompila `dist/control-ui`, então execute `pnpm ui:build` novamente após mudanças em `ui/` ou use `pnpm ui:dev` enquanto desenvolve a Control UI.
Se você estiver usando intencionalmente o fluxo Bun, os comandos equivalentes são:
Se você estiver usando intencionalmente o fluxo de trabalho com Bun, os comandos equivalentes são:
```bash
bun install
# Apenas na primeira execução (ou após redefinir a configuração/workspace local do OpenClaw)
bun run openclaw setup
bun run gateway:watch
```
### 2) Aponte o app macOS para o Gateway em execução
### 2) Aponte o app do macOS para o Gateway em execução
No **OpenClaw.app**:
@ -130,8 +135,8 @@ openclaw health
### Armadilhas comuns
- **Porta errada:** o WS do Gateway usa por padrão `ws://127.0.0.1:18789`; mantenha app + CLI na mesma porta.
- **Onde o estado fica:**
- Estado de canal/provider: `~/.openclaw/credentials/`
- **Onde o estado fica armazenado:**
- Estado de canal/provedor: `~/.openclaw/credentials/`
- Perfis de autenticação de modelo: `~/.openclaw/agents/<agentId>/agent/auth-profiles.json`
- Sessões: `~/.openclaw/agents/<agentId>/sessions/`
- Logs: `/tmp/openclaw/`
@ -141,39 +146,36 @@ openclaw health
Use isto ao depurar autenticação ou decidir o que fazer backup:
- **WhatsApp**: `~/.openclaw/credentials/whatsapp/<accountId>/creds.json`
- **Token do bot do Telegram**: config/env ou `channels.telegram.tokenFile` (apenas arquivo normal; symlinks rejeitados)
- **Token do bot do Discord**: config/env ou SecretRef (providers env/file/exec)
- **Tokens do Slack**: config/env (`channels.slack.*`)
- **Allowlists de pareamento**:
- **Token de bot do Telegram**: configuração/env ou `channels.telegram.tokenFile` (apenas arquivo comum; symlinks são rejeitados)
- **Token de bot do Discord**: configuração/env ou SecretRef (provedores env/file/exec)
- **Tokens do Slack**: configuração/env (`channels.slack.*`)
- **Listas de permissão de pareamento**:
- `~/.openclaw/credentials/<channel>-allowFrom.json` (conta padrão)
- `~/.openclaw/credentials/<channel>-<accountId>-allowFrom.json` (contas não padrão)
- **Perfis de autenticação de modelo**: `~/.openclaw/agents/<agentId>/agent/auth-profiles.json`
- **Payload de segredos com suporte a arquivo (opcional)**: `~/.openclaw/secrets.json`
- **Payload de segredos com base em arquivo (opcional)**: `~/.openclaw/secrets.json`
- **Importação legada de OAuth**: `~/.openclaw/credentials/oauth.json`
Mais detalhes: [Security](/pt-BR/gateway/security#credential-storage-map).
Mais detalhes: [Segurança](/pt-BR/gateway/security#credential-storage-map).
## Atualização (sem destruir sua configuração)
- Mantenha `~/.openclaw/workspace` e `~/.openclaw/` como “suas coisas”; não coloque prompts/configurações pessoais no repositório `openclaw`.
- Atualizando o código-fonte: `git pull` + a etapa de instalação do gerenciador de pacotes escolhido (`pnpm install` por padrão; `bun install` para o fluxo Bun) + continue usando o comando `gateway:watch` correspondente.
- Atualizando o código-fonte: `git pull` + a etapa de instalação do gerenciador de pacotes escolhido (`pnpm install` por padrão; `bun install` para o fluxo de trabalho com Bun) + continue usando o comando `gateway:watch` correspondente.
## Linux (serviço de usuário systemd)
Instalações Linux usam um serviço de **usuário** do systemd. Por padrão, o systemd interrompe
serviços de usuário em logout/inatividade, o que derruba o Gateway. O onboarding tenta ativar
o lingering para você (pode solicitar sudo). Se ainda estiver desativado, execute:
As instalações no Linux usam um serviço **de usuário** do systemd. Por padrão, o systemd interrompe serviços de usuário em logout/inatividade, o que encerra o Gateway. O onboarding tenta ativar o lingering para você (pode solicitar sudo). Se ainda estiver desativado, execute:
```bash
sudo loginctl enable-linger $USER
```
Para servidores sempre ativos ou multiusuário, considere um serviço de **sistema** em vez de um
serviço de usuário (sem necessidade de lingering). Consulte [Runbook do Gateway](/pt-BR/gateway) para observações sobre systemd.
Para servidores sempre ativos ou com múltiplos usuários, considere usar um serviço **de sistema** em vez de um serviço de usuário (sem necessidade de lingering). Veja o [guia operacional do Gateway](/pt-BR/gateway) para as observações sobre systemd.
## Documentação relacionada
- [Runbook do Gateway](/pt-BR/gateway) (flags, supervisão, portas)
- [Guia operacional do Gateway](/pt-BR/gateway) (flags, supervisão, portas)
- [Configuração do Gateway](/pt-BR/gateway/configuration) (schema de configuração + exemplos)
- [Discord](/pt-BR/channels/discord) e [Telegram](/pt-BR/channels/telegram) (tags de resposta + configurações `replyToMode`)
- [Configuração do assistente OpenClaw](/start/openclaw)
- [app macOS](/platforms/macos) (ciclo de vida do gateway)
- [Discord](/pt-BR/channels/discord) e [Telegram](/pt-BR/channels/telegram) (tags de resposta + configurações de replyToMode)
- [Configuração do assistente OpenClaw](/pt-BR/start/openclaw)
- [app do macOS](/pt-BR/platforms/macos) (ciclo de vida do gateway)

View File

@ -1,15 +1,15 @@
---
read_when:
- Adicionando automação de navegador controlada por agente
- Adicionando automação de navegador controlada pelo agente
- Depurando por que o openclaw está interferindo no seu próprio Chrome
- Implementando configurações do navegador + ciclo de vida no app para macOS
- Implementando configurações e ciclo de vida do navegador no app do macOS
summary: Serviço integrado de controle do navegador + comandos de ação
title: Navegador (gerenciado pelo OpenClaw)
x-i18n:
generated_at: "2026-04-14T13:04:31Z"
generated_at: "2026-04-20T05:42:07Z"
model: gpt-5.4
provider: openai
source_hash: ae9ef725f544d4236d229f498c7187871c69bd18d31069b30a7e67fac53166a2
source_hash: 3f7d37b34ba48dc7c38f8c2e77f8bb97af987eac6a874ebfc921f950fb59de4b
source_path: tools/browser.md
workflow: 15
---
@ -18,24 +18,24 @@ x-i18n:
O OpenClaw pode executar um **perfil dedicado do Chrome/Brave/Edge/Chromium** que o agente controla.
Ele é isolado do seu navegador pessoal e é gerenciado por meio de um pequeno
serviço local de controle dentro do Gateway (somente loopback).
serviço de controle local dentro do Gateway (apenas loopback).
Visão para iniciantes:
- Pense nele como um **navegador separado, apenas para o agente**.
- O perfil `openclaw` **não** interfere no perfil do seu navegador pessoal.
- O perfil `openclaw` **não** toca no perfil do seu navegador pessoal.
- O agente pode **abrir abas, ler páginas, clicar e digitar** em uma área segura.
- O perfil `user` integrado se conecta à sua sessão real do Chrome autenticada via Chrome MCP.
- O perfil integrado `user` se conecta à sua sessão real do Chrome com login feito via Chrome MCP.
## O que você obtém
## O que você recebe
- Um perfil de navegador separado chamado **openclaw** (com destaque laranja por padrão).
- Controle determinístico de abas (listar/abrir/focar/fechar).
- Ações do agente (clicar/digitar/arrastar/selecionar), snapshots, capturas de tela, PDFs.
- Suporte opcional a vários perfis (`openclaw`, `work`, `remote`, ...).
- Suporte opcional a múltiplos perfis (`openclaw`, `work`, `remote`, ...).
Este navegador **não** é o seu navegador principal do dia a dia. Ele é uma superfície segura e isolada para
automação e verificação pelo agente.
Este navegador **não** é o seu navegador do dia a dia. Ele é uma superfície
segura e isolada para automação e verificação por agentes.
## Início rápido
@ -46,16 +46,16 @@ openclaw browser --browser-profile openclaw open https://example.com
openclaw browser --browser-profile openclaw snapshot
```
Se você receber “Browser disabled”, ative-o na configuração (veja abaixo) e reinicie o
Se você receber “Navegador desativado”, ative-o na configuração (veja abaixo) e reinicie o
Gateway.
Se `openclaw browser` estiver ausente por completo, ou se o agente disser que a ferramenta de navegador
Se `openclaw browser` estiver totalmente ausente, ou se o agente disser que a ferramenta de navegador
não está disponível, vá para [Comando ou ferramenta de navegador ausente](/pt-BR/tools/browser#missing-browser-command-or-tool).
## Controle por Plugin
A ferramenta `browser` padrão agora é um Plugin incluído que vem habilitado por
padrão. Isso significa que você pode desativá-lo ou substituí-lo sem remover o restante do
padrão. Isso significa que você pode desativá-la ou substituí-la sem remover o restante do
sistema de plugins do OpenClaw:
```json5
@ -70,25 +70,25 @@ sistema de plugins do OpenClaw:
}
```
Desative o Plugin incluído antes de instalar outro Plugin que forneça o
mesmo nome de ferramenta `browser`. A experiência padrão do navegador precisa de ambos:
Desative o Plugin incluído antes de instalar outro plugin que forneça o
mesmo nome de ferramenta `browser`. A experiência padrão de navegador precisa de ambos:
- `plugins.entries.browser.enabled` não desativado
- `browser.enabled=true`
Se você desligar apenas o Plugin, a CLI de navegador incluída (`openclaw browser`),
Se você desativar apenas o plugin, a CLI de navegador incluída (`openclaw browser`),
o método do gateway (`browser.request`), a ferramenta do agente e o serviço padrão de controle do navegador
desaparecem juntos. Sua configuração `browser.*` permanece intacta para ser reutilizada por um
Plugin substituto.
desaparecem juntos. Sua configuração `browser.*` permanece intacta para que um
plugin substituto a reutilize.
O Plugin de navegador incluído agora também é responsável pela implementação do runtime do navegador.
O core mantém apenas helpers compartilhados do Plugin SDK, além de reexports de compatibilidade para
caminhos internos de importação mais antigos. Na prática, remover ou substituir o pacote do Plugin de navegador
remove o conjunto de recursos do navegador em vez de deixar um segundo runtime controlado pelo
core para trás.
O Plugin de navegador incluído agora também é responsável pela implementação de runtime do navegador.
O núcleo mantém apenas helpers compartilhados do Plugin SDK, além de reexports de compatibilidade para
caminhos de importação internos mais antigos. Na prática, remover ou substituir o pacote do plugin de navegador
remove o conjunto de recursos do navegador, em vez de deixar para trás um segundo runtime controlado pelo
núcleo.
Alterações na configuração do navegador ainda exigem um reinício do Gateway para que o Plugin incluído
possa registrar novamente seu serviço de navegador com as novas configurações.
Alterações na configuração do navegador ainda exigem uma reinicialização do Gateway para que o Plugin incluído
registre novamente seu serviço de navegador com as novas configurações.
## Comando ou ferramenta de navegador ausente
@ -106,7 +106,7 @@ Exemplo de configuração com problema:
}
```
Corrija isso adicionando `browser` à allowlist de plugins:
Corrija adicionando `browser` à allowlist de plugins:
```json5
{
@ -118,9 +118,9 @@ Corrija isso adicionando `browser` à allowlist de plugins:
Observações importantes:
- `browser.enabled=true` por si só não é suficiente quando `plugins.allow` está definido.
- `plugins.entries.browser.enabled=true` por si só também não é suficiente quando `plugins.allow` está definido.
- `tools.alsoAllow: ["browser"]` **não** carrega o Plugin de navegador incluído. Ele apenas ajusta a política da ferramenta depois que o Plugin já foi carregado.
- `browser.enabled=true` não é suficiente por si só quando `plugins.allow` está definido.
- `plugins.entries.browser.enabled=true` também não é suficiente por si só quando `plugins.allow` está definido.
- `tools.alsoAllow: ["browser"]` **não** carrega o Plugin de navegador incluído. Ele apenas ajusta a política da ferramenta depois que o plugin já foi carregado.
- Se você não precisa de uma allowlist restritiva de plugins, remover `plugins.allow` também restaura o comportamento padrão do navegador incluído.
Sintomas típicos:
@ -131,15 +131,16 @@ Sintomas típicos:
## Perfis: `openclaw` vs `user`
- `openclaw`: navegador gerenciado e isolado (nenhuma extensão necessária).
- `user`: perfil integrado de conexão ao Chrome MCP para sua **sessão real do Chrome autenticada**.
- `openclaw`: navegador gerenciado e isolado (não requer extensão).
- `user`: perfil integrado de conexão do Chrome MCP para sua **sessão real do Chrome**
com login feito.
Para chamadas da ferramenta de navegador do agente:
- Padrão: use o navegador isolado `openclaw`.
- Prefira `profile="user"` quando sessões autenticadas já existentes forem importantes e o usuário
estiver no computador para clicar/aprovar qualquer solicitação de conexão.
- `profile` é a substituição explícita quando você quiser um modo específico de navegador.
- Prefira `profile="user"` quando sessões com login já existentes forem importantes e o usuário
estiver no computador para clicar/aprovar qualquer prompt de conexão.
- `profile` é a substituição explícita quando você quer um modo específico de navegador.
Defina `browser.defaultProfile: "openclaw"` se quiser o modo gerenciado por padrão.
@ -152,13 +153,13 @@ As configurações do navegador ficam em `~/.openclaw/openclaw.json`.
browser: {
enabled: true, // padrão: true
ssrfPolicy: {
// dangerouslyAllowPrivateNetwork: true, // opte por isso apenas para acesso confiável à rede privada
// dangerouslyAllowPrivateNetwork: true, // opte por isso apenas para acesso confiável a redes privadas
// allowPrivateNetwork: true, // alias legado
// hostnameAllowlist: ["*.example.com", "example.com"],
// allowedHostnames: ["localhost"],
},
// cdpUrl: "http://127.0.0.1:18792", // substituição legada de perfil único
remoteCdpTimeoutMs: 1500, // tempo limite de HTTP do CDP remoto (ms)
remoteCdpTimeoutMs: 1500, // tempo limite HTTP do CDP remoto (ms)
remoteCdpHandshakeTimeoutMs: 3000, // tempo limite do handshake WebSocket do CDP remoto (ms)
defaultProfile: "openclaw",
color: "#FF4500",
@ -188,32 +189,32 @@ As configurações do navegador ficam em `~/.openclaw/openclaw.json`.
Observações:
- O serviço de controle do navegador se vincula ao loopback em uma porta derivada de `gateway.port`
(padrão: `18791`, que é a porta do gateway + 2).
- O serviço de controle do navegador faz bind em loopback em uma porta derivada de `gateway.port`
(padrão: `18791`, que é gateway + 2).
- Se você substituir a porta do Gateway (`gateway.port` ou `OPENCLAW_GATEWAY_PORT`),
as portas derivadas do navegador mudam para permanecer na mesma “família”.
- `cdpUrl` assume por padrão a porta CDP local gerenciada quando não está definido.
- `remoteCdpTimeoutMs` se aplica a verificações de alcance do CDP remoto (não loopback).
- `remoteCdpHandshakeTimeoutMs` se aplica a verificações de alcance do WebSocket do CDP remoto.
- A navegação/abertura de aba do navegador é protegida contra SSRF antes da navegação e verificada novamente, na medida do possível, na URL final `http(s)` após a navegação.
- No modo SSRF estrito, a descoberta/sondas de endpoint CDP remoto (`cdpUrl`, incluindo buscas em `/json/version`) também são verificadas.
- `browser.ssrfPolicy.dangerouslyAllowPrivateNetwork` fica desativado por padrão. Defina-o como `true` apenas quando você confiar intencionalmente no acesso do navegador à rede privada.
- `browser.ssrfPolicy.allowPrivateNetwork` continua com suporte como alias legado para compatibilidade.
- `attachOnly: true` significa “nunca iniciar um navegador local; apenas conectar se ele já estiver em execução.
- `cdpUrl` usa por padrão a porta CDP local gerenciada quando não definido.
- `remoteCdpTimeoutMs` se aplica a verificações de alcançabilidade do CDP remoto (não loopback).
- `remoteCdpHandshakeTimeoutMs` se aplica a verificações de alcançabilidade do WebSocket do CDP remoto.
- A navegação/abertura de aba do navegador é protegida contra SSRF antes da navegação e é verificada novamente, na medida do possível, na URL final `http(s)` após a navegação.
- No modo estrito de SSRF, a descoberta/verificação do endpoint CDP remoto (`cdpUrl`, incluindo buscas em `/json/version`) também é verificada.
- `browser.ssrfPolicy.dangerouslyAllowPrivateNetwork` vem desativado por padrão. Defina-o como `true` apenas quando você confiar intencionalmente no acesso do navegador à rede privada.
- `browser.ssrfPolicy.allowPrivateNetwork` continua compatível como alias legado para compatibilidade.
- `attachOnly: true` significa “nunca iniciar um navegador local; apenas conectar se ele já estiver em execução.
- `color` + `color` por perfil tingem a interface do navegador para que você possa ver qual perfil está ativo.
- O perfil padrão é `openclaw` (navegador independente gerenciado pelo OpenClaw). Use `defaultProfile: "user"` para optar pelo navegador do usuário autenticado.
- Ordem de autodetecção: navegador padrão do sistema se for baseado em Chromium; caso contrário Chrome → Brave → Edge → Chromium → Chrome Canary.
- Perfis `openclaw` locais atribuem automaticamente `cdpPort`/`cdpUrl` — defina esses valores apenas para CDP remoto.
- O perfil padrão é `openclaw` (navegador autônomo gerenciado pelo OpenClaw). Use `defaultProfile: "user"` para optar pelo navegador do usuário com login feito.
- Ordem de detecção automática: navegador padrão do sistema, se for baseado em Chromium; caso contrário Chrome → Brave → Edge → Chromium → Chrome Canary.
- Perfis locais `openclaw` atribuem automaticamente `cdpPort`/`cdpUrl` — defina-os apenas para CDP remoto.
- `driver: "existing-session"` usa Chrome DevTools MCP em vez de CDP bruto. Não
defina `cdpUrl` para esse driver.
- Defina `browser.profiles.<name>.userDataDir` quando um perfil existing-session
precisar se conectar a um perfil de usuário Chromium não padrão, como Brave ou Edge.
## Usar Brave (ou outro navegador baseado em Chromium)
## Use Brave (ou outro navegador baseado em Chromium)
Se o navegador **padrão do sistema** for baseado em Chromium (Chrome/Brave/Edge/etc),
o OpenClaw o usa automaticamente. Defina `browser.executablePath` para substituir a
autodetecção:
o OpenClaw o usa automaticamente. Defina `browser.executablePath` para substituir a
detecção automática:
Exemplo de CLI:
@ -246,41 +247,41 @@ openclaw config set browser.executablePath "/usr/bin/google-chrome"
## Controle local vs remoto
- **Controle local (padrão):** o Gateway inicia o serviço de controle em loopback e pode iniciar um navegador local.
- **Controle remoto (host do node):** execute um host do node na máquina que tem o navegador; o Gateway encaminha as ações do navegador para ele.
- **Controle local (padrão):** o Gateway inicia o serviço de controle em loopback e pode abrir um navegador local.
- **Controle remoto (host Node):** execute um host Node na máquina que tem o navegador; o Gateway faz proxy das ações do navegador para ele.
- **CDP remoto:** defina `browser.profiles.<name>.cdpUrl` (ou `browser.cdpUrl`) para
se conectar a um navegador remoto baseado em Chromium. Nesse caso, o OpenClaw não iniciará um navegador local.
O comportamento de parada difere por modo de perfil:
O comportamento ao parar difere por modo de perfil:
- perfis locais gerenciados: `openclaw browser stop` interrompe o processo do navegador que
o OpenClaw iniciou
- perfis somente conexão e perfis CDP remotos: `openclaw browser stop` fecha a sessão de
controle ativa e libera as substituições de emulação do Playwright/CDP (viewport,
esquema de cores, localidade, fuso horário, modo offline e estados semelhantes), mesmo
- perfis attach-only e de CDP remoto: `openclaw browser stop` fecha a sessão de controle ativa
e libera as substituições de emulação do Playwright/CDP (viewport,
esquema de cores, localidade, fuso horário, modo offline e estado semelhante), mesmo
que nenhum processo de navegador tenha sido iniciado pelo OpenClaw
As URLs de CDP remoto podem incluir autenticação:
URLs CDP remotas podem incluir autenticação:
- Tokens de query (por exemplo, `https://provider.example?token=<token>`)
- Tokens na query (por exemplo, `https://provider.example?token=<token>`)
- Autenticação HTTP Basic (por exemplo, `https://user:pass@provider.example`)
O OpenClaw preserva a autenticação ao chamar endpoints `/json/*` e ao se conectar
ao WebSocket CDP. Prefira variáveis de ambiente ou gerenciadores de segredos para
tokens em vez de registrá-los em arquivos de configuração.
ao WebSocket do CDP. Prefira variáveis de ambiente ou gerenciadores de segredos para
tokens em vez de confirmá-los em arquivos de configuração.
## Proxy de navegador do Node (padrão sem configuração)
Se você executar um **host do node** na máquina que tem o seu navegador, o OpenClaw pode
encaminhar automaticamente as chamadas da ferramenta de navegador para esse node sem nenhuma configuração adicional de navegador.
Este é o caminho padrão para gateways remotos.
Se você executar um **host Node** na máquina que tem seu navegador, o OpenClaw pode
rotear automaticamente chamadas da ferramenta de navegador para esse node sem nenhuma configuração extra do navegador.
Esse é o caminho padrão para gateways remotos.
Observações:
- O host do node expõe seu servidor local de controle do navegador por meio de um **comando proxy**.
- Os perfis vêm da configuração `browser.profiles` do próprio node (igual ao local).
- `nodeHost.browserProxy.allowProfiles` é opcional. Deixe-o vazio para o comportamento legado/padrão: todos os perfis configurados continuam acessíveis por meio do proxy, incluindo rotas de criação/exclusão de perfil.
- Se você definir `nodeHost.browserProxy.allowProfiles`, o OpenClaw o trata como um limite de menor privilégio: apenas perfis na allowlist podem ser direcionados, e rotas persistentes de criação/exclusão de perfil são bloqueadas na superfície do proxy.
- O host Node expõe seu servidor local de controle do navegador por meio de um **comando proxy**.
- Os perfis vêm da própria configuração `browser.profiles` do node (igual ao local).
- `nodeHost.browserProxy.allowProfiles` é opcional. Deixe vazio para o comportamento legado/padrão: todos os perfis configurados continuam acessíveis pelo proxy, incluindo rotas de criar/excluir perfil.
- Se você definir `nodeHost.browserProxy.allowProfiles`, o OpenClaw o trata como um limite de menor privilégio: apenas perfis na allowlist podem ser usados como alvo, e rotas persistentes de criar/excluir perfil são bloqueadas na superfície do proxy.
- Desative se não quiser isso:
- No node: `nodeHost.browserProxy.enabled=false`
- No gateway: `gateway.nodes.browser.mode="off"`
@ -314,28 +315,42 @@ Exemplo:
Observações:
- Substitua `<BROWSERLESS_API_KEY>` pelo seu token real do Browserless.
- Escolha o endpoint regional que corresponde à sua conta do Browserless (consulte a documentação deles).
- Escolha o endpoint de região que corresponda à sua conta Browserless (veja a documentação deles).
- Se o Browserless fornecer uma URL base HTTPS, você pode convertê-la para
`wss://` para uma conexão CDP direta ou manter a URL HTTPS e deixar o OpenClaw
descobrir `/json/version`.
## Provedores CDP WebSocket diretos
## Provedores CDP de WebSocket direto
Alguns serviços hospedados de navegador expõem um endpoint **WebSocket direto** em vez
da descoberta CDP padrão baseada em HTTP (`/json/version`). O OpenClaw oferece suporte a ambos:
Alguns serviços de navegador hospedados expõem um endpoint **WebSocket direto** em vez
da descoberta padrão de CDP baseada em HTTP (`/json/version`). O OpenClaw aceita três
formatos de URL CDP e escolhe automaticamente a estratégia de conexão correta:
- **Endpoints HTTP(S)** — o OpenClaw chama `/json/version` para descobrir a
URL do depurador WebSocket e então se conecta.
- **Endpoints WebSocket** (`ws://` / `wss://`) — o OpenClaw se conecta diretamente,
ignorando `/json/version`. Use isso para serviços como
[Browserless](https://browserless.io),
[Browserbase](https://www.browserbase.com) ou qualquer provedor que forneça uma
URL WebSocket.
- **Descoberta por HTTP(S)**`http://host[:port]` ou `https://host[:port]`.
O OpenClaw chama `/json/version` para descobrir a URL do depurador WebSocket e então
se conecta. Sem fallback para WebSocket.
- **Endpoints WebSocket diretos**`ws://host[:port]/devtools/<kind>/<id>` ou
`wss://...` com um caminho `/devtools/browser|page|worker|shared_worker|service_worker/<id>`.
O OpenClaw se conecta diretamente por um handshake WebSocket e ignora
`/json/version` por completo.
- **Raízes WebSocket simples**`ws://host[:port]` ou `wss://host[:port]` sem
caminho `/devtools/...` (por exemplo, [Browserless](https://browserless.io),
[Browserbase](https://www.browserbase.com)). O OpenClaw tenta primeiro a descoberta HTTP
em `/json/version` (normalizando o esquema para `http`/`https`);
se a descoberta retornar um `webSocketDebuggerUrl`, ele será usado; caso contrário, o OpenClaw
recorre a um handshake WebSocket direto na raiz simples. Isso cobre
tanto portas de depuração remota no estilo Chrome quanto provedores somente WebSocket.
`ws://host:port` / `wss://host:port` simples, sem um caminho `/devtools/...`,
apontando para uma instância local do Chrome, são compatíveis por meio do
fallback com descoberta primeiro — o Chrome só aceita upgrades WebSocket no caminho específico por navegador
ou por alvo retornado por `/json/version`, então um handshake apenas na raiz
falharia.
### Browserbase
[Browserbase](https://www.browserbase.com) é uma plataforma em nuvem para executar
navegadores headless com resolução de CAPTCHA integrada, modo furtivo e
navegadores headless com resolução integrada de CAPTCHA, modo furtivo e
proxies residenciais.
```json5
@ -359,78 +374,78 @@ Observações:
- [Cadastre-se](https://www.browserbase.com/sign-up) e copie sua **API Key**
no [painel Overview](https://www.browserbase.com/overview).
- Substitua `<BROWSERBASE_API_KEY>` pela sua chave de API real do Browserbase.
- O Browserbase cria automaticamente uma sessão de navegador ao conectar por WebSocket, então
não é necessária nenhuma etapa manual de criação de sessão.
- Substitua `<BROWSERBASE_API_KEY>` pela sua API key real do Browserbase.
- O Browserbase cria automaticamente uma sessão de navegador na conexão WebSocket, então
não é necessária uma etapa manual de criação de sessão.
- O plano gratuito permite uma sessão simultânea e uma hora de navegador por mês.
Consulte os [preços](https://www.browserbase.com/pricing) para os limites dos planos pagos.
- Consulte a [documentação do Browserbase](https://docs.browserbase.com) para a
Veja os [preços](https://www.browserbase.com/pricing) para os limites dos planos pagos.
- Veja a [documentação do Browserbase](https://docs.browserbase.com) para a
referência completa da API, guias de SDK e exemplos de integração.
## Segurança
Ideias principais:
- O controle do navegador é somente loopback; o acesso flui pela autenticação do Gateway ou pelo pareamento de node.
- A API HTTP de navegador em loopback independente usa **somente autenticação por segredo compartilhado**:
autenticação bearer por token do gateway, `x-openclaw-password` ou autenticação HTTP Basic com a
- O controle do navegador é apenas loopback; o acesso passa pela autenticação do Gateway ou pelo pareamento do node.
- A API HTTP autônoma do navegador em loopback usa **apenas autenticação por segredo compartilhado**:
auth bearer com token do gateway, `x-openclaw-password` ou HTTP Basic auth com a
senha configurada do gateway.
- Cabeçalhos de identidade do Tailscale Serve e `gateway.auth.mode: "trusted-proxy"` **não**
autenticam esta API de navegador em loopback independente.
- Se o controle do navegador estiver ativado e nenhuma autenticação por segredo compartilhado estiver configurada, o OpenClaw
autenticam esta API autônoma do navegador em loopback.
- Se o controle do navegador estiver habilitado e nenhuma autenticação por segredo compartilhado estiver configurada, o OpenClaw
gera automaticamente `gateway.auth.token` na inicialização e o persiste na configuração.
- O OpenClaw **não** gera esse token automaticamente quando `gateway.auth.mode`está em
- O OpenClaw **não** gera esse token automaticamente quando `gateway.auth.mode`é
`password`, `none` ou `trusted-proxy`.
- Mantenha o Gateway e quaisquer hosts de node em uma rede privada (Tailscale); evite exposição pública.
- Trate URLs/tokens de CDP remotos como segredos; prefira variáveis de ambiente ou um gerenciador de segredos.
- Trate URLs/tokens de CDP remoto como segredos; prefira variáveis de ambiente ou um gerenciador de segredos.
Dicas de CDP remoto:
Dicas para CDP remoto:
- Prefira endpoints criptografados (HTTPS ou WSS) e tokens de curta duração quando possível.
- Evite incorporar tokens de longa duração diretamente em arquivos de configuração.
## Perfis (vários navegadores)
## Perfis (multi-browser)
O OpenClaw oferece suporte a vários perfis nomeados (configurações de roteamento). Os perfis podem ser:
O OpenClaw oferece suporte a múltiplos perfis nomeados (configurações de roteamento). Os perfis podem ser:
- **gerenciados pelo openclaw**: uma instância dedicada de navegador baseado em Chromium com seu próprio diretório de dados do usuário + porta CDP
- **remotos**: uma URL CDP explícita (navegador baseado em Chromium em execução em outro lugar)
- **sessão existente**: seu perfil existente do Chrome via autoconexão do Chrome DevTools MCP
- **gerenciados pelo openclaw**: uma instância dedicada de navegador baseado em Chromium com seu próprio diretório de dados de usuário + porta CDP
- **remoto**: uma URL CDP explícita (navegador baseado em Chromium em execução em outro lugar)
- **sessão existente**: seu perfil atual do Chrome via conexão automática do Chrome DevTools MCP
Padrões:
- O perfil `openclaw` é criado automaticamente se estiver ausente.
- O perfil `user` é integrado para conexão existing-session do Chrome MCP.
- Perfis existing-session são opt-in além de `user`; crie-os com `--driver existing-session`.
- Portas CDP locais são alocadas em **1880018899** por padrão.
- O perfil `user` é integrado para conexão a sessão existente do Chrome MCP.
- Perfis de sessão existente são opt-in além de `user`; crie-os com `--driver existing-session`.
- As portas CDP locais são alocadas de **1880018899** por padrão.
- Excluir um perfil move seu diretório de dados local para a Lixeira.
Todos os endpoints de controle aceitam `?profile=<name>`; a CLI usa `--browser-profile`.
## Existing-session via Chrome DevTools MCP
## Sessão existente via Chrome DevTools MCP
O OpenClaw também pode se conectar a um perfil de navegador baseado em Chromium já em execução por meio do
O OpenClaw também pode se conectar a um perfil em execução de navegador baseado em Chromium por meio do
servidor oficial Chrome DevTools MCP. Isso reutiliza as abas e o estado de login
já abertos nesse perfil do navegador.
já abertos nesse perfil de navegador.
Referências oficiais de contexto e configuração:
- [Chrome for Developers: Use Chrome DevTools MCP with your browser session](https://developer.chrome.com/blog/chrome-devtools-mcp-debug-your-browser-session)
- [README do Chrome DevTools MCP](https://github.com/ChromeDevTools/chrome-devtools-mcp)
- [Chrome DevTools MCP README](https://github.com/ChromeDevTools/chrome-devtools-mcp)
Perfil integrado:
- `user`
Opcional: crie seu próprio perfil existing-session personalizado se quiser um
Opcional: crie seu próprio perfil personalizado de sessão existente se quiser um
nome, cor ou diretório de dados do navegador diferentes.
Comportamento padrão:
- O perfil integrado `user` usa autoconexão do Chrome MCP, que tem como alvo o
- O perfil integrado `user` usa conexão automática do Chrome MCP, que tem como alvo o
perfil local padrão do Google Chrome.
Use `userDataDir` para Brave, Edge, Chromium ou um perfil do Chrome que não seja o padrão:
Use `userDataDir` para Brave, Edge, Chromium ou um perfil não padrão do Chrome:
```json5
{
@ -447,13 +462,13 @@ Use `userDataDir` para Brave, Edge, Chromium ou um perfil do Chrome que não sej
}
```
Então, no navegador correspondente:
Depois, no navegador correspondente:
1. Abra a página de inspeção desse navegador para depuração remota.
2. Ative a depuração remota.
3. Mantenha o navegador em execução e aprove a solicitação de conexão quando o OpenClaw se conectar.
3. Mantenha o navegador em execução e aprove o prompt de conexão quando o OpenClaw se conectar.
Páginas de inspeção comuns:
Páginas comuns de inspeção:
- Chrome: `chrome://inspect/#remote-debugging`
- Brave: `brave://inspect/#remote-debugging`
@ -474,62 +489,63 @@ Como é o sucesso:
- `status` mostra `transport: chrome-mcp`
- `status` mostra `running: true`
- `tabs` lista as abas do navegador que já estão abertas
- `snapshot` retorna refs da aba ativa selecionada
- `snapshot` retorna refs da aba ao vivo selecionada
O que verificar se a conexão não funcionar:
- o navegador baseado em Chromium de destino está na versão `144+`
- a depuração remota está ativada na página de inspeção desse navegador
- a depuração remota está habilitada na página de inspeção desse navegador
- o navegador exibiu e você aceitou o prompt de consentimento de conexão
- `openclaw doctor` migra a configuração antiga de navegador baseada em extensão e verifica se
o Chrome está instalado localmente para perfis padrão de autoconexão, mas ele não pode
ativar a depuração remota do lado do navegador para você
o Chrome está instalado localmente para perfis padrão de conexão automática, mas ele não pode
habilitar a depuração remota no lado do navegador para você
Uso pelo agente:
- Use `profile="user"` quando precisar do estado do navegador autenticado do usuário.
- Se você usar um perfil existing-session personalizado, passe esse nome de perfil explícito.
- Escolha esse modo apenas quando o usuário estiver no computador para aprovar o
- Use `profile="user"` quando precisar do estado do navegador do usuário com login feito.
- Se você usa um perfil personalizado de sessão existente, passe esse nome de perfil explícito.
- Escolha esse modo somente quando o usuário estiver no computador para aprovar o
prompt de conexão.
- o Gateway ou host de node pode iniciar `npx chrome-devtools-mcp@latest --autoConnect`
Observações:
- Esse caminho tem risco maior que o perfil isolado `openclaw`, porque ele pode
agir dentro da sua sessão de navegador autenticada.
- Esse caminho apresenta risco mais alto do que o perfil isolado `openclaw`, pois pode
agir dentro da sua sessão de navegador com login feito.
- O OpenClaw não inicia o navegador para esse driver; ele se conecta apenas a uma
sessão existente.
- O OpenClaw usa aqui o fluxo oficial `--autoConnect` do Chrome DevTools MCP. Se
`userDataDir` estiver definido, o OpenClaw o repassa para direcionar aquele diretório
explícito de dados do usuário do Chromium.
- Capturas de tela em existing-session oferecem suporte a capturas de página e capturas
de elemento com `--ref` a partir de snapshots, mas não a seletores CSS `--element`.
- Capturas de tela de página em existing-session funcionam sem Playwright via Chrome MCP.
`userDataDir` estiver definido, o OpenClaw o repassa para ter como alvo esse diretório explícito
de dados de usuário Chromium.
- Capturas de tela em sessão existente oferecem suporte a capturas de página e capturas de elemento com `--ref`
a partir de snapshots, mas não a seletores CSS `--element`.
- Capturas de tela de página em sessão existente funcionam sem Playwright via Chrome MCP.
Capturas de elemento baseadas em ref (`--ref`) também funcionam ali, mas `--full-page`
não pode ser combinado com `--ref` ou `--element`.
- As ações de existing-session ainda são mais limitadas que o caminho do navegador
- As ações em sessão existente ainda são mais limitadas do que no caminho de navegador
gerenciado:
- `click`, `type`, `hover`, `scrollIntoView`, `drag` e `select` exigem
refs de snapshot em vez de seletores CSS
- `click` é apenas com botão esquerdo (sem substituições de botão ou modificadores)
- `click` é apenas com o botão esquerdo (sem substituições de botão ou modificadores)
- `type` não oferece suporte a `slowly=true`; use `fill` ou `press`
- `press` não oferece suporte a `delayMs`
- `hover`, `scrollIntoView`, `drag`, `select`, `fill` e `evaluate` não
oferecem suporte a substituições de timeout por chamada
- `select` atualmente oferece suporte a apenas um único valor
- `wait --url` em existing-session oferece suporte a padrões exatos, por substring e glob
- `select` atualmente aceita apenas um valor
- `wait --url` em sessão existente oferece suporte a padrões exatos, de substring e glob
como outros drivers de navegador. `wait --load networkidle` ainda não é compatível.
- Hooks de upload em existing-session exigem `ref` ou `inputRef`, oferecem suporte a um arquivo
por vez e não oferecem suporte a direcionamento CSS `element`.
- Hooks de diálogo em existing-session não oferecem suporte a substituições de timeout.
- Alguns recursos ainda exigem o caminho do navegador gerenciado, incluindo ações
em lote, exportação em PDF, interceptação de download e `responsebody`.
- Existing-session é local ao host. Se o Chrome estiver em outra máquina ou em um
namespace de rede diferente, use CDP remoto ou um host de node.
- Hooks de upload em sessão existente exigem `ref` ou `inputRef`, aceitam um arquivo
por vez e não oferecem suporte a direcionamento de CSS `element`.
- Hooks de diálogo em sessão existente não oferecem suporte a substituições de timeout.
- Alguns recursos ainda exigem o caminho de navegador gerenciado, incluindo ações em lote,
exportação para PDF, interceptação de download e `responsebody`.
- Sessão existente pode se conectar no host selecionado ou por meio de um node de navegador conectado. Se
o Chrome estiver em outro lugar e nenhum node de navegador estiver conectado, use
CDP remoto ou um host de node.
## Garantias de isolamento
- **Diretório de dados do usuário dedicado**: nunca toca o perfil do seu navegador pessoal.
- **Diretório dedicado de dados do usuário**: nunca toca no perfil do seu navegador pessoal.
- **Portas dedicadas**: evita `9222` para prevenir colisões com fluxos de trabalho de desenvolvimento.
- **Controle determinístico de abas**: direciona abas por `targetId`, não pela “última aba”.
@ -549,11 +565,11 @@ Plataformas:
- macOS: verifica `/Applications` e `~/Applications`.
- Linux: procura `google-chrome`, `brave`, `microsoft-edge`, `chromium` etc.
- Windows: verifica locais de instalação comuns.
- Windows: verifica locais comuns de instalação.
## API de controle (opcional)
Somente para integrações locais, o Gateway expõe uma pequena API HTTP em loopback:
Apenas para integrações locais, o Gateway expõe uma pequena API HTTP em loopback:
- Status/iniciar/parar: `GET /`, `POST /start`, `POST /stop`
- Abas: `GET /tabs`, `POST /tabs/open`, `POST /tabs/focus`, `DELETE /tabs/:targetId`
@ -573,19 +589,19 @@ Todos os endpoints aceitam `?profile=<name>`.
Se a autenticação do gateway por segredo compartilhado estiver configurada, as rotas HTTP do navegador também exigirão autenticação:
- `Authorization: Bearer <gateway token>`
- `x-openclaw-password: <gateway password>` ou autenticação HTTP Basic com essa senha
- `x-openclaw-password: <gateway password>` ou HTTP Basic auth com essa senha
Observações:
- Esta API de navegador em loopback independente **não** consome `trusted-proxy` nem
cabeçalhos de identidade do Tailscale Serve.
- Esta API autônoma do navegador em loopback **não** consome cabeçalhos de identidade de trusted-proxy ou
Tailscale Serve.
- Se `gateway.auth.mode` for `none` ou `trusted-proxy`, essas rotas de navegador em loopback
não herdam esses modos baseados em identidade; mantenha-as somente em loopback.
não herdam esses modos com identidade; mantenha-as apenas em loopback.
### Contrato de erro de `/act`
`POST /act` usa uma resposta de erro estruturada para falhas de validação e
política no nível da rota:
`POST /act` usa uma resposta de erro estruturada para validação em nível de rota e
falhas de política:
```json
{ "error": "<message>", "code": "ACT_*" }
@ -596,45 +612,45 @@ Valores atuais de `code`:
- `ACT_KIND_REQUIRED` (HTTP 400): `kind` está ausente ou não é reconhecido.
- `ACT_INVALID_REQUEST` (HTTP 400): o payload da ação falhou na normalização ou validação.
- `ACT_SELECTOR_UNSUPPORTED` (HTTP 400): `selector` foi usado com um tipo de ação não compatível.
- `ACT_EVALUATE_DISABLED` (HTTP 403): `evaluate` (ou `wait --fn`) está desativado pela configuração.
- `ACT_TARGET_ID_MISMATCH` (HTTP 403): `targetId` no nível superior ou em lote entra em conflito com o alvo da solicitação.
- `ACT_EXISTING_SESSION_UNSUPPORTED` (HTTP 501): a ação não é compatível com perfis existing-session.
- `ACT_EVALUATE_DISABLED` (HTTP 403): `evaluate` (ou `wait --fn`) está desabilitado por configuração.
- `ACT_TARGET_ID_MISMATCH` (HTTP 403): `targetId` de nível superior ou em lote entra em conflito com o alvo da solicitação.
- `ACT_EXISTING_SESSION_UNSUPPORTED` (HTTP 501): a ação não é compatível com perfis de sessão existente.
Outras falhas em runtime ainda podem retornar `{ "error": "<message>" }` sem um
Outras falhas de runtime ainda podem retornar `{ "error": "<message>" }` sem um
campo `code`.
### Requisito do Playwright
Alguns recursos (navigate/act/AI snapshot/role snapshot, capturas de tela de elementos,
PDF) exigem Playwright. Se o Playwright não estiver instalado, esses endpoints retornarão
PDF) exigem Playwright. Se o Playwright não estiver instalado, esses endpoints retornam
um erro 501 claro.
O que ainda funciona sem Playwright:
- Snapshots ARIA
- Capturas de tela de página para o navegador `openclaw` gerenciado quando um WebSocket
CDP por aba estiver disponível
CDP por aba está disponível
- Capturas de tela de página para perfis `existing-session` / Chrome MCP
- Capturas de tela baseadas em `--ref` em `existing-session` a partir da saída de snapshot
- Capturas de tela baseadas em ref (`--ref`) em `existing-session` a partir da saída de snapshot
O que ainda precisa de Playwright:
O que ainda exige Playwright:
- `navigate`
- `act`
- AI snapshots / role snapshots
- Capturas de tela de elemento por seletor CSS (`--element`)
- Capturas de tela de elementos por seletor CSS (`--element`)
- Exportação completa de PDF do navegador
Capturas de tela de elemento também rejeitam `--full-page`; a rota retorna `fullPage is
Capturas de tela de elementos também rejeitam `--full-page`; a rota retorna `fullPage is
not supported for element screenshots`.
Se você vir `Playwright is not available in this gateway build`, instale o pacote completo do
Playwright (não `playwright-core`) e reinicie o gateway, ou reinstale o
Se você vir `Playwright is not available in this gateway build`, instale o pacote completo
do Playwright (não `playwright-core`) e reinicie o gateway, ou reinstale o
OpenClaw com suporte a navegador.
#### Instalação do Playwright no Docker
Se o seu Gateway estiver em execução no Docker, evite `npx playwright` (conflitos de override do npm).
Se o seu Gateway for executado no Docker, evite `npx playwright` (conflitos com overrides do npm).
Use a CLI incluída:
```bash
@ -642,26 +658,26 @@ docker compose run --rm openclaw-cli \
node /app/node_modules/playwright-core/cli.js install chromium
```
Para persistir os downloads do navegador, defina `PLAYWRIGHT_BROWSERS_PATH` (por exemplo,
Para persistir downloads de navegador, defina `PLAYWRIGHT_BROWSERS_PATH` (por exemplo,
`/home/node/.cache/ms-playwright`) e garanta que `/home/node` seja persistido via
`OPENCLAW_HOME_VOLUME` ou um bind mount. Veja [Docker](/pt-BR/install/docker).
## Como funciona (internamente)
## Como funciona (interno)
Fluxo de alto nível:
Fluxo em alto nível:
- Um pequeno **servidor de controle** aceita requisições HTTP.
- Um pequeno **servidor de controle** aceita solicitações HTTP.
- Ele se conecta a navegadores baseados em Chromium (Chrome/Brave/Edge/Chromium) via **CDP**.
- Para ações avançadas (clicar/digitar/snapshot/PDF), ele usa **Playwright** sobre
- Para ações avançadas (click/type/snapshot/PDF), ele usa **Playwright** sobre
o CDP.
- Quando o Playwright está ausente, apenas operações que não usam Playwright ficam disponíveis.
- Quando o Playwright está ausente, apenas operações sem Playwright ficam disponíveis.
Esse design mantém o agente em uma interface estável e determinística, ao mesmo tempo em que permite
trocar navegadores e perfis locais/remotos.
## Referência rápida da CLI
Todos os comandos aceitam `--browser-profile <name>` para direcionar um perfil específico.
Todos os comandos aceitam `--browser-profile <name>` para direcionar a um perfil específico.
Todos os comandos também aceitam `--json` para saída legível por máquina (payloads estáveis).
Básico:
@ -695,8 +711,8 @@ Inspeção:
Observação sobre ciclo de vida:
- Para perfis somente conexão e perfis CDP remotos, `openclaw browser stop` ainda é o
comando correto de limpeza após testes. Ele fecha a sessão de controle ativa e
- Para perfis attach-only e de CDP remoto, `openclaw browser stop` ainda é o
comando de limpeza correto após testes. Ele fecha a sessão de controle ativa e
limpa substituições temporárias de emulação em vez de encerrar o navegador
subjacente.
- `openclaw browser errors --clear`
@ -749,47 +765,47 @@ Estado:
Observações:
- `upload` e `dialog` são chamadas de **preparação**; execute-as antes do clique/pressionamento
- `upload` e `dialog` são chamadas de **preparação**; execute-as antes do click/press
que aciona o seletor/diálogo.
- Os caminhos de saída de download e trace são restritos às raízes temporárias do OpenClaw:
- Os caminhos de saída de download e trace são limitados às raízes temporárias do OpenClaw:
- traces: `/tmp/openclaw` (fallback: `${os.tmpdir()}/openclaw`)
- downloads: `/tmp/openclaw/downloads` (fallback: `${os.tmpdir()}/openclaw/downloads`)
- Os caminhos de upload são restritos a uma raiz temporária de uploads do OpenClaw:
- Os caminhos de upload são limitados a uma raiz temporária de uploads do OpenClaw:
- uploads: `/tmp/openclaw/uploads` (fallback: `${os.tmpdir()}/openclaw/uploads`)
- `upload` também pode definir diretamente entradas de arquivo via `--input-ref` ou `--element`.
- `upload` também pode definir inputs de arquivo diretamente por `--input-ref` ou `--element`.
- `snapshot`:
- `--format ai` (padrão quando o Playwright está instalado): retorna um snapshot de IA com refs numéricos (`aria-ref="<n>"`).
- `--format ai` (padrão quando o Playwright está instalado): retorna um AI snapshot com refs numéricos (`aria-ref="<n>"`).
- `--format aria`: retorna a árvore de acessibilidade (sem refs; apenas inspeção).
- `--efficient` (ou `--mode efficient`): preset compacto de snapshot por role (interactive + compact + depth + maxChars menor).
- `--efficient` (ou `--mode efficient`): preset compacto de role snapshot (interactive + compact + depth + maxChars menor).
- Padrão de configuração (somente ferramenta/CLI): defina `browser.snapshotDefaults.mode: "efficient"` para usar snapshots eficientes quando o chamador não passar um modo (veja [Configuração do Gateway](/pt-BR/gateway/configuration-reference#browser)).
- Opções de snapshot por role (`--interactive`, `--compact`, `--depth`, `--selector`) forçam um snapshot baseado em role com refs como `ref=e12`.
- `--frame "<iframe selector>"` limita snapshots por role a um iframe (em conjunto com refs por role como `e12`).
- `--interactive` produz uma lista plana e fácil de escolher de elementos interativos (melhor para executar ações).
- `--labels` adiciona uma captura de tela somente da viewport com labels de ref sobrepostos (imprime `MEDIA:<path>`).
- `click`/`type`/etc exigem um `ref` de `snapshot` (seja numérico `12` ou ref por role `e12`).
- Opções de role snapshot (`--interactive`, `--compact`, `--depth`, `--selector`) forçam um snapshot baseado em função com refs como `ref=e12`.
- `--frame "<iframe selector>"` limita role snapshots a um iframe (pareado com refs de função como `e12`).
- `--interactive` produz uma lista plana e fácil de escolher de elementos interativos (melhor para conduzir ações).
- `--labels` adiciona uma captura de tela somente da viewport com rótulos de ref sobrepostos (imprime `MEDIA:<path>`).
- `click`/`type`/etc exigem um `ref` de `snapshot` (numérico `12` ou ref de função `e12`).
Seletores CSS intencionalmente não são compatíveis para ações.
## Snapshots e refs
O OpenClaw oferece suporte a dois estilos de “snapshot”:
- **Snapshot de IA (refs numéricos)**: `openclaw browser snapshot` (padrão; `--format ai`)
- Saída: um snapshot de texto que inclui refs numéricos.
- **AI snapshot (refs numéricos)**: `openclaw browser snapshot` (padrão; `--format ai`)
- Saída: um snapshot em texto que inclui refs numéricos.
- Ações: `openclaw browser click 12`, `openclaw browser type 23 "hello"`.
- Internamente, o ref é resolvido via `aria-ref` do Playwright.
- **Snapshot por role (refs por role como `e12`)**: `openclaw browser snapshot --interactive` (ou `--compact`, `--depth`, `--selector`, `--frame`)
- Saída: uma lista/árvore baseada em role com `[ref=e12]` (e opcionalmente `[nth=1]`).
- **Role snapshot (refs de função como `e12`)**: `openclaw browser snapshot --interactive` (ou `--compact`, `--depth`, `--selector`, `--frame`)
- Saída: uma lista/árvore baseada em função com `[ref=e12]` (e opcionalmente `[nth=1]`).
- Ações: `openclaw browser click e12`, `openclaw browser highlight e12`.
- Internamente, o ref é resolvido via `getByRole(...)` (mais `nth()` para duplicatas).
- Adicione `--labels` para incluir uma captura de tela da viewport com labels `e12` sobrepostos.
- Adicione `--labels` para incluir uma captura de tela da viewport com rótulos `e12` sobrepostos.
Comportamento dos refs:
- Refs **não são estáveis entre navegações**; se algo falhar, execute `snapshot` novamente e use um ref novo.
- Se o snapshot por role foi feito com `--frame`, os refs por role ficam limitados àquele iframe até o próximo snapshot por role.
- Se o role snapshot foi feito com `--frame`, os refs de função ficam limitados a esse iframe até o próximo role snapshot.
## Recursos avançados de espera
## Recursos avançados de wait
Você pode esperar por mais do que apenas tempo/texto:
@ -799,10 +815,10 @@ Você pode esperar por mais do que apenas tempo/texto:
- `openclaw browser wait --load networkidle`
- Esperar por um predicado JS:
- `openclaw browser wait --fn "window.ready===true"`
- Esperar por um seletor ficar visível:
- Esperar um seletor ficar visível:
- `openclaw browser wait "#main"`
Eles podem ser combinados:
Esses podem ser combinados:
```bash
openclaw browser wait "#main" \
@ -814,15 +830,15 @@ openclaw browser wait "#main" \
## Fluxos de depuração
Quando uma ação falhar (por exemplo, “not visible”, “strict mode violation”, “covered”):
Quando uma ação falha (por exemplo, “not visible”, “strict mode violation”, “covered”):
1. `openclaw browser snapshot --interactive`
2. Use `click <ref>` / `type <ref>` (prefira refs por role no modo interativo)
2. Use `click <ref>` / `type <ref>` (prefira refs de função no modo interativo)
3. Se ainda falhar: `openclaw browser highlight <ref>` para ver o que o Playwright está direcionando
4. Se a página se comportar de forma estranha:
- `openclaw browser errors --clear`
- `openclaw browser requests --filter api --clear`
5. Para depuração profunda: grave um trace:
5. Para depuração aprofundada: grave um trace:
- `openclaw browser trace start`
- reproduza o problema
- `openclaw browser trace stop` (imprime `TRACE:<path>`)
@ -840,7 +856,7 @@ openclaw browser requests --filter api --json
openclaw browser cookies --json
```
Snapshots por role em JSON incluem `refs` mais um pequeno bloco `stats` (lines/chars/refs/interactive) para que ferramentas possam raciocinar sobre tamanho e densidade do payload.
Role snapshots em JSON incluem `refs` mais um pequeno bloco `stats` (lines/chars/refs/interactive) para que ferramentas possam raciocinar sobre tamanho e densidade do payload.
## Controles de estado e ambiente
@ -850,7 +866,7 @@ Eles são úteis para fluxos de trabalho do tipo “faça o site se comportar co
- Storage: `storage local|session get|set|clear`
- Offline: `set offline on|off`
- Headers: `set headers --headers-json '{"X-Debug":"1"}'` (o legado `set headers --json '{"X-Debug":"1"}'` continua compatível)
- Autenticação HTTP Basic: `set credentials user pass` (ou `--clear`)
- HTTP basic auth: `set credentials user pass` (ou `--clear`)
- Geolocalização: `set geo <lat> <lon> --origin "https://example.com"` (ou `--clear`)
- Mídia: `set media dark|light|no-preference|none`
- Fuso horário / localidade: `set timezone ...`, `set locale ...`
@ -860,15 +876,15 @@ Eles são úteis para fluxos de trabalho do tipo “faça o site se comportar co
## Segurança e privacidade
- O perfil de navegador openclaw pode conter sessões autenticadas; trate-o como sensível.
- O perfil de navegador openclaw pode conter sessões com login feito; trate-o como sensível.
- `browser act kind=evaluate` / `openclaw browser evaluate` e `wait --fn`
executam JavaScript arbitrário no contexto da página. Injeção de prompt pode direcionar
executam JavaScript arbitrário no contexto da página. Injeção de prompt pode influenciar
isso. Desative com `browser.evaluateEnabled=false` se você não precisar disso.
- Para logins e observações sobre anti-bot (X/Twitter etc.), veja [Login no navegador + postagem no X/Twitter](/pt-BR/tools/browser-login).
- Para logins e observações anti-bot (X/Twitter etc.), veja [Login no navegador + postagem no X/Twitter](/pt-BR/tools/browser-login).
- Mantenha o Gateway/host de node privado (somente loopback ou tailnet).
- Endpoints CDP remotos são poderosos; faça tunnel e proteja-os.
- Endpoints CDP remotos são poderosos; faça túnel e proteja-os.
Exemplo de modo estrito (bloquear destinos privados/internos por padrão):
Exemplo de modo estrito (bloqueia destinos privados/internos por padrão):
```json5
{
@ -876,7 +892,7 @@ Exemplo de modo estrito (bloquear destinos privados/internos por padrão):
ssrfPolicy: {
dangerouslyAllowPrivateNetwork: false,
hostnameAllowlist: ["*.example.com", "example.com"],
allowedHostnames: ["localhost"], // allow exato opcional
allowedHostnames: ["localhost"], // permissão exata opcional
},
},
}
@ -887,23 +903,23 @@ Exemplo de modo estrito (bloquear destinos privados/internos por padrão):
Para problemas específicos do Linux (especialmente snap Chromium), veja
[Solução de problemas do navegador](/pt-BR/tools/browser-linux-troubleshooting).
Para configurações divididas entre Gateway no WSL2 + Chrome no Windows em hosts separados, veja
Para configurações divididas entre Gateway no WSL2 + Chrome no Windows, veja
[Solução de problemas de WSL2 + Windows + CDP remoto do Chrome](/pt-BR/tools/browser-wsl2-windows-remote-cdp-troubleshooting).
### Falha de inicialização do CDP vs bloqueio SSRF de navegação
### Falha na inicialização do CDP vs bloqueio SSRF de navegação
Essas são classes de falha diferentes e apontam para caminhos de código diferentes.
Essas são classes diferentes de falha e apontam para caminhos de código diferentes.
- **Falha de inicialização ou prontidão do CDP** significa que o OpenClaw não consegue confirmar que o plano de controle do navegador está íntegro.
- **Bloqueio SSRF de navegação** significa que o plano de controle do navegador está íntegro, mas um destino de navegação de página é rejeitado pela política.
- **Bloqueio SSRF de navegação** significa que o plano de controle do navegador está íntegro, mas um alvo de navegação de página é rejeitado pela política.
Exemplos comuns:
- Falha de inicialização ou prontidão do CDP:
- Falha na inicialização ou prontidão do CDP:
- `Chrome CDP websocket for profile "openclaw" is not reachable after start`
- `Remote CDP for profile "<name>" is not reachable at <cdpUrl>`
- Bloqueio SSRF de navegação:
- fluxos `open`, `navigate`, snapshot ou de abertura de aba falham com um erro de política de navegador/rede, enquanto `start` e `tabs` continuam funcionando
- fluxos de `open`, `navigate`, snapshot ou abertura de aba falham com um erro de política de navegador/rede enquanto `start` e `tabs` ainda funcionam
Use esta sequência mínima para separar os dois:
@ -915,41 +931,41 @@ openclaw browser --browser-profile openclaw open https://example.com
Como interpretar os resultados:
- Se `start` falhar com `not reachable after start`, primeiro resolva o problema de prontidão do CDP.
- Se `start` tiver êxito, mas `tabs` falhar, o plano de controle ainda não está íntegro. Trate isso como um problema de alcance do CDP, não como um problema de navegação de página.
- Se `start` e `tabs` tiverem êxito, mas `open` ou `navigate` falhar, o plano de controle do navegador está ativo e a falha está na política de navegação ou na página de destino.
- Se `start`, `tabs` e `open` tiverem êxito, o caminho básico de controle do navegador gerenciado está íntegro.
- Se `start` falhar com `not reachable after start`, primeiro solucione a prontidão do CDP.
- Se `start` tiver sucesso, mas `tabs` falhar, o plano de controle ainda não está íntegro. Trate isso como um problema de alcançabilidade do CDP, não como um problema de navegação de página.
- Se `start` e `tabs` tiverem sucesso, mas `open` ou `navigate` falhar, o plano de controle do navegador está ativo e a falha está na política de navegação ou na página de destino.
- Se `start`, `tabs` e `open` tiverem sucesso, o caminho básico de controle do navegador gerenciado está íntegro.
Detalhes importantes de comportamento:
- A configuração do navegador usa por padrão um objeto de política SSRF fail-closed mesmo quando você não configura `browser.ssrfPolicy`.
- Para o perfil gerenciado local em loopback `openclaw`, as verificações de integridade do CDP intencionalmente ignoram a imposição de alcance SSRF do navegador para o próprio plano de controle local do OpenClaw.
- Para o perfil gerenciado local `openclaw` em loopback, as verificações de integridade do CDP ignoram intencionalmente a aplicação de alcançabilidade SSRF do navegador para o próprio plano de controle local do OpenClaw.
- A proteção de navegação é separada. Um resultado bem-sucedido em `start` ou `tabs` não significa que um alvo posterior de `open` ou `navigate` seja permitido.
Orientação de segurança:
Orientações de segurança:
- **Não** relaxe a política SSRF do navegador por padrão.
- Prefira exceções restritas de host, como `hostnameAllowlist` ou `allowedHostnames`, em vez de acesso amplo à rede privada.
- Use `dangerouslyAllowPrivateNetwork: true` apenas em ambientes intencionalmente confiáveis em que o acesso do navegador à rede privada seja necessário e revisado.
- **Não** flexibilize a política SSRF do navegador por padrão.
- Prefira exceções estreitas de host, como `hostnameAllowlist` ou `allowedHostnames`, em vez de acesso amplo à rede privada.
- Use `dangerouslyAllowPrivateNetwork: true` apenas em ambientes intencionalmente confiáveis nos quais o acesso do navegador à rede privada seja necessário e revisado.
Exemplo: navegação bloqueada, plano de controle íntegro
- `start` tem êxito
- `tabs` tem êxito
- `start` tem sucesso
- `tabs` tem sucesso
- `open http://internal.example` falha
Isso normalmente significa que a inicialização do navegador está correta e o destino de navegação precisa de revisão da política.
Isso normalmente significa que a inicialização do navegador está correta e o alvo de navegação precisa de revisão de política.
Exemplo: inicialização bloqueada antes que a navegação importe
Exemplo: inicialização bloqueada antes de a navegação importar
- `start` falha com `not reachable after start`
- `tabs` também falha ou não pode ser executado
Isso aponta para inicialização do navegador ou alcance do CDP, não para um problema de allowlist de URL de página.
Isso aponta para inicialização do navegador ou alcançabilidade do CDP, não para um problema de allowlist de URL de página.
## Ferramentas do agente + como o controle funciona
O agente recebe **uma ferramenta** para automação do navegador:
O agente recebe **uma ferramenta** para automação de navegador:
- `browser` — status/start/stop/tabs/open/focus/close/snapshot/screenshot/navigate/act
@ -962,13 +978,13 @@ Como isso se mapeia:
- `profile` para escolher um perfil de navegador nomeado (openclaw, chrome ou CDP remoto).
- `target` (`sandbox` | `host` | `node`) para selecionar onde o navegador está.
- Em sessões em sandbox, `target: "host"` exige `agents.defaults.sandbox.browser.allowHostControl=true`.
- Se `target` for omitido: sessões em sandbox usam `sandbox` por padrão; sessões sem sandbox usam `host` por padrão.
- Se um node com capacidade de navegador estiver conectado, a ferramenta poderá encaminhar automaticamente para ele, a menos que você fixe `target="host"` ou `target="node"`.
- Se `target` for omitido: sessões em sandbox usam `sandbox` por padrão, sessões fora de sandbox usam `host` por padrão.
- Se um node com capacidade de navegador estiver conectado, a ferramenta poderá rotear automaticamente para ele, a menos que você fixe `target="host"` ou `target="node"`.
Isso mantém o agente determinístico e evita seletores frágeis.
## Relacionados
## Relacionado
- [Visão geral das ferramentas](/pt-BR/tools) — todas as ferramentas de agente disponíveis
- [Sandboxing](/pt-BR/gateway/sandboxing) — controle do navegador em ambientes com sandbox
- [Sandboxing](/pt-BR/gateway/sandboxing) — controle do navegador em ambientes em sandbox
- [Segurança](/pt-BR/gateway/security) — riscos e reforço de segurança do controle do navegador