Pular para o conteúdo principal

Telegram (Bot API)

Status: pronto para produção para DMs + grupos do bot via grammY. Long polling é o modo padrão; o modo Webhook é opcional.

Pareamento

A política padrão de DM para Telegram é pareamento.

Solução de problemas do canal

Diagnósticos entre canais e playbooks de correção.

Configuração do Gateway

Padrões completos de configuração de canal e exemplos.

Configuração rápida

1

Criar o token do bot no BotFather

Abra o Telegram e converse com @BotFather (confirme que o identificador é exatamente @BotFather).Execute /newbot, siga as instruções e salve o token.
2

Configurar o token e a política de DM

{
  channels: {
    telegram: {
      enabled: true,
      botToken: "123:abc",
      dmPolicy: "pairing",
      groups: { "*": { requireMention: true } },
    },
  },
}
Fallback por variável de ambiente: TELEGRAM_BOT_TOKEN=... (somente conta padrão). O Telegram não usa openclaw channels login telegram; configure o token no config/env e depois inicie o Gateway.
3

Iniciar o Gateway e aprovar a primeira DM

openclaw gateway
openclaw pairing list telegram
openclaw pairing approve telegram <CODE>
Códigos de pareamento expiram após 1 hora.
4

Adicionar 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.
A ordem de resolução do token reconhece contas. Na prática, valores do config têm prioridade sobre o fallback por variável de ambiente, e TELEGRAM_BOT_TOKEN se aplica apenas à conta padrão.

Configurações do lado do Telegram

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:
  • desative o modo de privacidade com /setprivacy, ou
  • torne o bot um administrador do grupo.
Ao alternar o modo de privacidade, remova e adicione novamente o bot em cada grupo para que o Telegram aplique a alteração.
O status de administrador é controlado nas configurações do grupo do Telegram.Bots administradores recebem todas as mensagens do grupo, o que é útil para comportamento sempre ativo em grupos.
  • /setjoingroups para permitir/negar adição a grupos
  • /setprivacy para comportamento de visibilidade em grupos

Controle de acesso e ativação

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. dmPolicy: "allowlist" com allowFrom vazio bloqueia todas as DMs e é rejeitado pela validação de configuração. A configuração inicial solicita apenas IDs numéricos de usuário. Se você fez upgrade 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 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 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 configuração (em vez de depender de aprovações de pareamento anteriores).Confusão comum: aprovação de pareamento de DM não significa “este remetente está autorizado em qualquer lugar”. O pareamento concede acesso somente a DM. A autorização de remetente em grupo ainda vem de allowlists explícitas na configuração. Se você quiser “estou autorizado uma vez e tanto DMs quanto comandos de grupo funcionam”, coloque seu ID numérico de usuário do Telegram em channels.telegram.allowFrom.

Encontrando seu ID de usuário do Telegram

Mais seguro (sem bot de terceiros):
  1. Envie DM para seu bot.
  2. Execute openclaw logs --follow.
  3. Leia from.id.
Método oficial da Bot API:
curl "https://api.telegram.org/bot<bot_token>/getUpdates"
Método de terceiros (menos privado): @userinfobot ou @getidsbot.

Comportamento em runtime

  • O Telegram é controlado pelo processo do Gateway.
  • O roteamento é determinístico: respostas de entrada 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 tópicos isolados.
  • Mensagens de DM podem carregar message_thread_id; o OpenClaw as roteia com chaves de sessão cientes de thread e preserva o ID da thread para respostas.
  • O long polling usa grammY runner com sequenciamento por chat/por thread. A concorrência geral do sink do runner usa agents.defaults.maxConcurrent.
  • Reinicializações do watchdog de long polling são disparadas por padrão após 120 segundos sem liveness concluído de getUpdates. Aumente channels.telegram.pollingStallThresholdMs apenas se sua implantação ainda observar reinicializações falsas de polling travado durante trabalhos de longa duração. O valor está em milissegundos e é permitido de 30000 a 600000; sobrescritas por conta são suportadas.
  • A Telegram Bot API não oferece suporte a confirmação de leitura (sendReadReceipts não se aplica).

Referência de recursos

O OpenClaw pode transmitir respostas parciais em tempo real:
  • chats diretos: mensagem de prévia + editMessageText
  • grupos/tópicos: mensagem de prévia + editMessageText
Requisito:
  • channels.telegram.streaming é off | partial | block | progress (padrão: partial)
  • progress é mapeado para partial no Telegram (compatibilidade com nomenclatura entre canais)
  • streaming.preview.toolProgress controla se atualizações de ferramenta/progresso reutilizam a mesma mensagem de prévia editada (padrão: true). Defina false para manter mensagens separadas de ferramenta/progresso.
  • channels.telegram.streamMode legado e valores booleanos de streaming são mapeados automaticamente
Para respostas somente de texto:
  • DM: o OpenClaw mantém a mesma mensagem de prévia e faz uma edição final no mesmo lugar (sem segunda mensagem)
  • grupo/tópico: o OpenClaw mantém a mesma mensagem de prévia e faz uma edição final no mesmo lugar (sem segunda mensagem)
Para respostas complexas (por exemplo, payloads de mídia), o OpenClaw recorre à entrega final normal e depois limpa a mensagem de prévia.Streaming de prévia é separado de block streaming. Quando block streaming está explicitamente ativado 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 recorre automaticamente a sendMessage + editMessageText.Stream de reasoning exclusivo do Telegram:
  • /reasoning stream envia reasoning para a prévia ao vivo durante a geração
  • a resposta final é enviada sem o texto de reasoning
O texto de saída usa Telegram parse_mode: "HTML".
  • Texto em estilo Markdown é renderizado para HTML seguro para Telegram.
  • HTML bruto do modelo é escapado para reduzir falhas de parsing do Telegram.
  • Se o Telegram rejeitar o HTML parseado, o OpenClaw tenta novamente como texto simples.
Pré-visualizações de link são ativadas por padrão e podem ser desativadas com channels.telegram.linkPreview: false.
O registro do menu de comandos do Telegram é tratado na inicialização com setMyCommands.Padrões de comandos nativos:
  • commands.native: "auto" ativa comandos nativos para Telegram
Adicione entradas personalizadas ao menu de comandos:
{
  channels: {
    telegram: {
      customCommands: [
        { command: "backup", description: "Backup do Git" },
        { command: "generate", description: "Criar uma imagem" },
      ],
    },
  },
}
Regras:
  • nomes são normalizados (remove / inicial, minúsculas)
  • padrão válido: a-z, 0-9, _, comprimento 1..32
  • 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 sejam mostrados no menu do Telegram
Se os comandos nativos estiverem desativados, os integrados 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 de Plugin/Skills/personalizados ou desative channels.telegram.commands.native.
  • setMyCommands failed com erros de rede/fetch geralmente significa que DNS/HTTPS de saída para api.telegram.org está bloqueado.

Comandos de pareamento de dispositivo (Plugin device-pair)

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 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 Node 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, 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.
Configure o escopo do teclado inline:
{
  channels: {
    telegram: {
      capabilities: {
        inlineButtons: "allowlist",
      },
    },
  },
}
Sobrescrita por conta:
{
  channels: {
    telegram: {
      accounts: {
        main: {
          capabilities: {
            inlineButtons: "allowlist",
          },
        },
      },
    },
  },
}
Escopos:
  • off
  • dm
  • group
  • all
  • allowlist (padrão)
capabilities: ["inlineButtons"] legado é mapeado para inlineButtons: "all".Exemplo de ação de mensagem:
{
  action: "send",
  channel: "telegram",
  to: "123456789",
  message: "Choose an option:",
  buttons: [
    [
      { text: "Yes", callback_data: "yes" },
      { text: "No", callback_data: "no" },
    ],
    [{ text: "Cancel", callback_data: "cancel" }],
  ],
}
Cliques de callback são passados ao agente como texto: callback_data: <value>
As ações da ferramenta do Telegram incluem:
  • sendMessage (to, content, mediaUrl, replyToMessageId, messageThreadId opcionais)
  • react (chatId, messageId, emoji)
  • deleteMessage (chatId, messageId)
  • editMessage (chatId, messageId, content)
  • createForumTopic (chatId, name, iconColor, iconCustomEmojiId opcionais)
As ações de mensagem do canal expõem aliases ergonômicos (send, react, delete, edit, sticker, sticker-search, topic-create).Controles de bloqueio:
  • 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), portanto caminhos de ação não executam nova resolução ad hoc de SecretRef por envio.Semântica de remoção de reação: /tools/reactions
O Telegram oferece suporte a tags explícitas de encadeamento de resposta na saída gerada:
  • [[reply_to_current]] responde à mensagem que acionou
  • [[reply_to:<id>]] responde a um ID de mensagem específico do Telegram
channels.telegram.replyToMode controla o tratamento:
  • off (padrão)
  • first
  • all
Observação: off desativa o encadeamento implícito de resposta. Tags explícitas [[reply_to_*]] ainda são respeitadas.
Supergrupos de fórum:
  • chaves de sessão de tópico acrescentam :topic:<threadId>
  • respostas e digitação são direcionadas à thread do tópico
  • caminho de configuração do tópico: channels.telegram.groups.<chatId>.topics.<threadId>
Caso especial do tópico geral (threadId=1):
  • 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 as configurações do grupo, a menos que sejam sobrescritas (requireMention, allowFrom, skills, systemPrompt, enabled, groupPolicy). agentId é exclusivo do tópico e não é herdado 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:
{
  channels: {
    telegram: {
      groups: {
        "-1001234567890": {
          topics: {
            "1": { agentId: "main" },      // General topic → main agent
            "3": { agentId: "zu" },        // Dev topic → zu agent
            "5": { agentId: "coder" }      // Code review → coder agent
          }
        }
      }
    }
  }
}
Cada tópico então tem sua própria chave de sessão: agent:zu:telegram:group:-1001234567890:topic:3Binding 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:
  • bindings[] com type: "acp" e match.channel: "telegram"
Exemplo:
{
  agents: {
    list: [
      {
        id: "codex",
        runtime: {
          type: "acp",
          acp: {
            agent: "codex",
            backend: "acpx",
            mode: "persistent",
            cwd: "/workspace/openclaw",
          },
        },
      },
    ],
  },
  bindings: [
    {
      type: "acp",
      agentId: "codex",
      match: {
        channel: "telegram",
        accountId: "default",
        peer: { kind: "group", id: "-1001234567890:topic:42" },
      },
    },
  ],
  channels: {
    telegram: {
      groups: {
        "-1001234567890": {
          topics: {
            "42": {
              requireMention: false,
            },
          },
        },
      },
    },
  },
}
No momento, isso está limitado a tópicos de fórum em grupos e supergrupos.Spawn 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 no tópico após um binding bem-sucedido.
  • Requer channels.telegram.threadBindings.spawnAcpSessions=true.
O contexto do template inclui:
  • MessageThreadId
  • IsForum
Comportamento de thread em DM:
  • chats privados com message_thread_id mantêm o roteamento de DM, mas usam chaves de sessão e alvos de resposta cientes de thread.

Mensagens de áudio

O Telegram distingue 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
Exemplo de ação de mensagem:
{
  action: "send",
  channel: "telegram",
  to: "123456789",
  media: "https://example.com/voice.ogg",
  asVoice: true,
}

Mensagens de vídeo

O Telegram distingue arquivos de vídeo de video notes.Exemplo de ação de mensagem:
{
  action: "send",
  channel: "telegram",
  to: "123456789",
  media: "https://example.com/video.mp4",
  asVideoNote: true,
}
Video notes não oferecem suporte a legendas; o texto de mensagem fornecido é enviado separadamente.

Stickers

Tratamento de stickers de entrada:
  • WEBP estático: baixado e processado (placeholder <media:sticker>)
  • TGS animado: ignorado
  • WEBM em vídeo: ignorado
Campos de contexto do sticker:
  • Sticker.emoji
  • Sticker.setName
  • Sticker.fileId
  • Sticker.fileUniqueId
  • Sticker.cachedDescription
Arquivo de cache de sticker:
  • ~/.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.Ativar ações de sticker:
{
  channels: {
    telegram: {
      actions: {
        sticker: true,
      },
    },
  },
}
Ação de envio de sticker:
{
  action: "sticker",
  channel: "telegram",
  to: "123456789",
  fileId: "CAACAgIAAxkBAAI...",
}
Pesquisar stickers em cache:
{
  action: "sticker-search",
  channel: "telegram",
  query: "cat waving",
  limit: 5,
}
Reações do Telegram chegam como atualizações message_reaction (separadas dos payloads de mensagem).Quando ativado, o OpenClaw enfileira eventos de sistema como:
  • Telegram reaction added: 👍 by Alice (@alice) on msg 42
Configuração:
  • 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ários a mensagens enviadas pelo bot (best-effort 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 que não são fórum são roteados para a sessão de chat do grupo
    • grupos de fórum são roteados para a sessão do tópico geral do grupo (:topic:1), não para o tópico exato de origem
allowed_updates para polling/Webhook inclui message_reaction automaticamente.
ackReaction envia um emoji de confirmação enquanto o OpenClaw está processando uma mensagem de entrada.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, caso contrário "👀")
Observações:
  • O Telegram espera emoji Unicode (por exemplo "👀").
  • Use "" para desativar a reação para um canal ou conta.
Gravações de configuração do canal são ativadas por padrão (configWrites !== false).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 comandos)
Desativar:
{
  channels: {
    telegram: {
      configWrites: false,
    },
  },
}
Padrão: long polling.Modo Webhook:
  • defina channels.telegram.webhookUrl
  • defina channels.telegram.webhookSecret (obrigatório quando webhookUrl estiver definido)
  • opcional channels.telegram.webhookPath (padrão /telegram-webhook)
  • opcional channels.telegram.webhookHost (padrão 127.0.0.1)
  • opcional channels.telegram.webhookPort (padrão 8787)
O listener local padrão para o modo Webhook faz bind em 127.0.0.1:8787.Se o 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ê precisar intencionalmente de ingresso externo.
  • 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 do Telegram de entrada e saída.
  • channels.telegram.timeoutSeconds sobrescreve o timeout do cliente da API do Telegram (se não definido, aplica-se o padrão do grammY).
  • channels.telegram.pollingStallThresholdMs tem padrão 120000; ajuste entre 30000 e 600000 apenas para reinicializações falso-positivas de polling travado.
  • o histórico de contexto de grupo usa channels.telegram.historyLimit ou messages.groupChat.historyLimit (padrão 50); 0 desativa.
  • contexto suplementar de resposta/citação/encaminhamento atualmente é repassado como recebido.
  • 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 da API de saída.
O destino de envio da CLI pode ser ID numérico de chat ou nome de usuário:
openclaw message send --channel telegram --target 123456789 --message "hi"
openclaw message send --channel telegram --target @name --message "hi"
Polls do Telegram usam openclaw message poll e oferecem suporte a tópicos de fórum:
openclaw message poll --channel telegram --target 123456789 \
  --poll-question "Ship it?" --poll-option "Yes" --poll-option "No"
openclaw message poll --channel telegram --target -1001234567890:topic:42 \
  --poll-question "Pick a time" --poll-option "10am" --poll-option "2pm" \
  --poll-duration-seconds 300 --poll-public
Flags de poll exclusivas do Telegram:
  • --poll-duration-seconds (5-600)
  • --poll-anonymous
  • --poll-public
  • --thread-id para tópicos de fórum (ou use um destino :topic:)
O envio no Telegram também oferece suporte a:
  • --presentation com blocos buttons para teclados inline quando channels.telegram.capabilities.inlineButtons permitir
  • --pin ou --delivery '{"pin":true}' para solicitar entrega fixada quando o bot puder fixar naquela conversa
  • --force-document para enviar imagens e GIFs de saída como documentos em vez de uploads comprimidos de foto ou mídia animada
Controle de ações:
  • channels.telegram.actions.sendMessage=false desativa mensagens de saída do Telegram, incluindo polls
  • channels.telegram.actions.poll=false desativa a criação de polls no Telegram, mantendo envios regulares ativados
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:
  • channels.telegram.execApprovals.enabled
  • channels.telegram.execApprovals.approvers (opcional; usa como fallback IDs numéricos do proprietário inferidos de allowFrom e defaultTo direto quando possível)
  • channels.telegram.execApprovals.target (dm | channel | both, padrão: dm)
  • agentFilter, sessionFilter
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 de execApprovals.approvers ou da configuração 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, solicitações de aprovação recorrem a outras rotas de aprovação configuradas ou à 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 de aprovador, fanout para canal/tópico e hints de digitação antes da entrega. Quando esses botões estão presentes, eles são a UX principal de aprovação; o OpenClaw só deve incluir um comando manual /approve 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 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 nem os 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 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 tenta novamente uma vez via plugin.approval.resolve.
  • Negativas/erros reais de aprovação de exec não fazem fallback silencioso para resolução de aprovação de Plugin.
A entrega em canal mostra o texto do comando no chat, portanto só 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.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

Controles de resposta de erro

Quando o agente encontra um erro de entrega ou do provider, o Telegram pode responder com o texto do erro ou suprimi-lo. Duas chaves de configuração controlam esse comportamento:
ChaveValoresPadrãoDescrição
channels.telegram.errorPolicyreply, silentreplyreply envia uma mensagem de erro amigável ao chat. silent suprime totalmente respostas de erro.
channels.telegram.errorCooldownMsnúmero (ms)60000Tempo mínimo entre respostas de erro para o mesmo chat. Evita spam de erros durante indisponibilidades.
Sobrescritas por conta, por grupo e por tópico são suportadas (mesma herança das outras chaves de configuração do Telegram).
{
  channels: {
    telegram: {
      errorPolicy: "reply",
      errorCooldownMs: 120000,
      groups: {
        "-1001234567890": {
          errorPolicy: "silent", // suprime erros neste grupo
        },
      },
    },
  },
}

Solução de problemas

  • se requireMention=false, o modo de privacidade do Telegram deve permitir visibilidade completa.
    • BotFather: /setprivacy -> Disable
    • depois remova + adicione novamente o bot ao grupo
  • openclaw channels status avisa 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 ser verificado por associação.
  • teste rápido de sessão: /activation always.
  • quando channels.telegram.groups existe, o grupo deve estar listado (ou incluir "*")
  • verifique a participação do bot no grupo
  • revise os logs: openclaw logs --follow para motivos de ignorar
  • autorize sua identidade de remetente (pareamento e/ou allowFrom numérico)
  • 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 geralmente indica problemas de alcance DNS/HTTPS até api.telegram.org
  • Node 22+ + fetch/proxy personalizado pode disparar comportamento de abort imediato se os tipos de AbortSignal não corresponderem.
  • Alguns hosts resolvem api.telegram.org para IPv6 primeiro; saída IPv6 com falha pode causar falhas intermitentes na 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.
  • Se os logs incluírem Polling stall detected, o OpenClaw reinicia o polling e reconstrói o transporte do Telegram após 120 segundos sem liveness concluído de long poll por padrão.
  • Aumente channels.telegram.pollingStallThresholdMs apenas quando chamadas longas de getUpdates estiverem saudáveis, mas seu host ainda relatar reinicializações falso-positivas de polling travado. Stalls persistentes normalmente apontam para problemas de proxy, DNS, IPv6 ou saída TLS entre o host e api.telegram.org.
  • Em hosts VPS com saída direta/TLS instável, roteie chamadas da API do Telegram por channels.telegram.proxy:
channels:
  telegram:
    proxy: socks5://<user>:<password>@proxy-host:1080
  • Node 22+ usa por padrão autoSelectFamily=true (exceto WSL2) e dnsResultOrder=ipv4first.
  • Se seu host for WSL2 ou funcionar explicitamente melhor com comportamento somente IPv4, force a seleção de família:
channels:
  telegram:
    network:
      autoSelectFamily: false
  • Respostas na faixa de benchmark RFC 2544 (198.18.0.0/15) já são permitidas para downloads de mídia do Telegram por padrão. 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 exclusivo do Telegram:
channels:
  telegram:
    network:
      dangerouslyAllowPrivateNetwork: true
  • 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 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.
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 de Clash, Mihomo ou Surge, quando eles sintetizam respostas privadas ou de uso especial fora da faixa de benchmark RFC 2544. Deixe desativado para acesso normal ao Telegram pela internet pública.
  • Sobrescritas 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:
dig +short api.telegram.org A
dig +short api.telegram.org AAAA
Mais ajuda: Solução de problemas do canal.

Ponteiros para a referência de configuração 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 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 armazenamento de pareamento em fluxos de migração de allowlist.
  • channels.telegram.actions.poll: ativa ou desativa a criação de polls no Telegram (padrão: ativado; ainda requer sendMessage).
  • channels.telegram.defaultTo: destino padrão do Telegram usado pelo CLI --deliver quando nenhum --reply-to explícito é fornecido.
  • channels.telegram.groupPolicy: open | allowlist | disabled (padrão: allowlist).
  • channels.telegram.groupAllowFrom: allowlist de remetentes de 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 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 estão 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 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 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: sobrescrita por grupo para groupPolicy (open | allowlist | disabled).
    • channels.telegram.groups.<id>.requireMention: padrão de bloqueio por menção.
    • channels.telegram.groups.<id>.skills: filtro de Skills (omitir = todas as Skills, vazio = nenhuma).
    • channels.telegram.groups.<id>.allowFrom: sobrescrita de 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>.*: sobrescritas 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 (sobrescreve roteamento no nível de grupo e por binding).
  • channels.telegram.groups.<id>.topics.<threadId>.groupPolicy: sobrescrita por tópico para groupPolicy (open | allowlist | disabled).
  • channels.telegram.groups.<id>.topics.<threadId>.requireMention: sobrescrita de bloqueio por menção por tópico.
  • bindings[] de nível superior com type: "acp" e ID canônico de tópico chatId:topic:topicId em match.peer.id: campos persistentes de binding de tópico ACP (consulte ACP Agents).
  • 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 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 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: sobrescrita 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: sobrescrita por conta.
  • channels.telegram.commands.nativeSkills: ativa/desativa comandos nativos de Skills do Telegram.
  • channels.telegram.replyToMode: off | first | all (padrão: off).
  • channels.telegram.textChunkLimit: tamanho do bloco 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: ativa/desativa pré-visualizações de link para mensagens de saída (padrão: true).
  • channels.telegram.streaming: off | partial | block | progress (prévia de streaming ao vivo; padrão: partial; progress é mapeado para partial; block é compatibilidade legada com modo de prévia). O streaming de prévia no Telegram usa uma única mensagem de prévia que é editada no mesmo lugar.
  • channels.telegram.streaming.preview.toolProgress: reutiliza a mensagem de prévia ao vivo para atualizações de ferramenta/progresso quando o streaming de prévia está ativo (padrão: true). Defina false para manter mensagens separadas de ferramenta/progresso.
  • channels.telegram.mediaMaxMb: limite de mídia do Telegram de entrada/saída (MB, padrão: 100).
  • channels.telegram.retry: política de retry para helpers de envio do Telegram (CLI/tools/actions) em erros recuperáveis da API de saída (tentativas, minDelayMs, maxDelayMs, jitter).
  • channels.telegram.network.autoSelectFamily: sobrescreve autoSelectFamily do Node (true=ativar, false=desativar). O padrão é ativado no Node 22+, com WSL2 tendo padrão desativado.
  • channels.telegram.network.dnsResultOrder: sobrescreve a ordem de resultado 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 em que downloads de mídia do Telegram resolvem api.telegram.org para endereços privados/internos/de uso especial fora da faixa permitida padrão 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 está 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: controla reações de ferramenta do Telegram.
  • channels.telegram.actions.sendMessage: controla envios de mensagem de ferramenta do Telegram.
  • channels.telegram.actions.deleteMessage: controla exclusões de mensagem de ferramenta do Telegram.
  • channels.telegram.actions.sticker: controla ações de sticker do Telegram — enviar e pesquisar (padrão: false).
  • channels.telegram.reactionNotifications: off | own | all — controla quais reações disparam eventos de 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). Sobrescritas por conta/grupo/tópico são suportadas.
  • 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
Campos específicos do Telegram com alto valor de sinal:
  • 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[] de 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), streaming.preview.toolProgress, blockStreaming
  • formatação/entrega: textChunkLimit, chunkMode, linkPreview, responsePrefix
  • mídia/rede: mediaMaxMb, timeoutSeconds, pollingStallThresholdMs, retry, network.autoSelectFamily, network.dangerouslyAllowPrivateNetwork, proxy
  • 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