Telegram (Bot API)

Stato: pronto per la produzione per DM + gruppi bot via grammY. Il long polling e la modalita predefinita; la modalita webhook e opzionale.

Setup rapido

Step 1: Crea il token bot in BotFather

Apri Telegram e chatta con **@BotFather** (conferma che l'handle sia esattamente `@BotFather`).

Esegui `/newbot`, segui le indicazioni e salva il token.

Step 2: Configura token e policy DM

{
  channels: {
    telegram: {
      enabled: true,
      botToken: "123:abc",
      dmPolicy: "pairing",
      groups: { "*": { requireMention: true } },
    },
  },
}
Fallback env: `TELEGRAM_BOT_TOKEN=...` (solo account predefinito).
Telegram **non** usa `openclaw channels login telegram`; configura il token nel config/env, poi avvia il gateway.

Step 3: Avvia il gateway e approva il primo DM

openclaw gateway
openclaw pairing list telegram
openclaw pairing approve telegram <CODE>
I codici di pairing scadono dopo 1 ora.

Step 4: Aggiungi il bot a un gruppo

Aggiungi il bot al tuo gruppo, poi imposta `channels.telegram.groups` e `groupPolicy` per corrispondere al tuo modello di accesso.

Nota: L’ordine di risoluzione del token e sensibile all’account. In pratica, i valori config prevalgono sul fallback env, e TELEGRAM_BOT_TOKEN si applica solo all’account predefinito.

Impostazioni lato Telegram

Modalita privacy e visibilita nei gruppi
I bot Telegram hanno la **Modalita Privacy** abilitata per impostazione predefinita, che limita quali messaggi di gruppo ricevono.

Se il bot deve vedere tutti i messaggi di gruppo:

- disabilita la modalita privacy tramite `/setprivacy`, oppure
- rendi il bot amministratore del gruppo.

Quando cambi la modalita privacy, rimuovi + ri-aggiungi il bot in ogni gruppo cosi Telegram applica la modifica.
Permessi di gruppo
Lo stato di amministratore e controllato nelle impostazioni del gruppo Telegram.

I bot amministratori ricevono tutti i messaggi di gruppo, utile per il comportamento di gruppo always-on.
Toggle BotFather utili
- `/setjoingroups` per consentire/negare l'aggiunta ai gruppi
- `/setprivacy` per il comportamento di visibilita nei gruppi

Controllo degli accessi e attivazione

Policy DM

`channels.telegram.dmPolicy` controlla l'accesso ai messaggi diretti:

- `pairing` (predefinito)
- `allowlist` (richiede almeno un ID mittente in `allowFrom`)
- `open` (richiede che `allowFrom` includa `"*"`)
- `disabled`

`channels.telegram.allowFrom` accetta ID utente Telegram numerici. I prefissi `telegram:` / `tg:` sono accettati e normalizzati.
`dmPolicy: "allowlist"` con `allowFrom` vuoto blocca tutti i DM e viene rifiutato dalla validazione config.
La procedura guidata di onboarding accetta input `@username` e li risolve in ID numerici.
Se hai aggiornato e la tua config contiene voci allowlist `@username`, esegui `openclaw doctor --fix` per risolverle (best-effort; richiede un token bot Telegram).
Se in precedenza dipendevi dai file allowlist del pairing-store, `openclaw doctor --fix` puo recuperare le voci in `channels.telegram.allowFrom` nei flussi allowlist (ad esempio quando `dmPolicy: "allowlist"` non ha ancora ID espliciti).

Per bot mono-proprietario, preferisci `dmPolicy: "allowlist"` con ID numerici espliciti in `allowFrom` per mantenere la policy di accesso duratura nel config (invece di dipendere dalle approvazioni pairing precedenti).

### Trovare il tuo ID utente Telegram

Piu sicuro (nessun bot di terze parti):

1. Scrivi un DM al tuo bot.
2. Esegui `openclaw logs --follow`.
3. Leggi `from.id`.

Metodo ufficiale Bot API:
curl "https://api.telegram.org/bot<bot_token>/getUpdates"
Metodo terze parti (meno privato): `@userinfobot` o `@getidsbot`.

Policy gruppi e allowlist

Due controlli si applicano insieme:

1. **Quali gruppi sono consentiti** (`channels.telegram.groups`)
   - nessuna config `groups`:
     - con `groupPolicy: "open"`: qualsiasi gruppo puo passare i controlli ID gruppo
     - con `groupPolicy: "allowlist"` (predefinito): i gruppi sono bloccati finche non aggiungi voci `groups` (o `"*"`)
   - `groups` configurato: agisce come allowlist (ID espliciti o `"*"`)

2. **Quali mittenti sono consentiti nei gruppi** (`channels.telegram.groupPolicy`)
   - `open`
   - `allowlist` (predefinito)
   - `disabled`

`groupAllowFrom` e usato per il filtraggio mittenti nei gruppi. Se non impostato, Telegram torna a `allowFrom`.
Le voci `groupAllowFrom` dovrebbero essere ID utente Telegram numerici (i prefissi `telegram:` / `tg:` vengono normalizzati).
Non mettere ID chat gruppo o supergruppo Telegram in `groupAllowFrom`. Gli ID chat negativi appartengono sotto `channels.telegram.groups`.
Le voci non numeriche vengono ignorate per l'autorizzazione mittente.
Confine di sicurezza (`2026.2.25+`): l'autorizzazione mittente nei gruppi **non** eredita le approvazioni del pairing-store DM.
Il pairing resta solo per i DM. Per i gruppi, imposta `groupAllowFrom` o `allowFrom` per gruppo/topic.
Nota runtime: se `channels.telegram` e completamente assente, il runtime torna a `groupPolicy="allowlist"` fail-closed a meno che `channels.defaults.groupPolicy` non sia impostato esplicitamente.

Esempio: consenti qualsiasi membro in un gruppo specifico:
{
  channels: {
    telegram: {
      groups: {
        "-1001234567890": {
          groupPolicy: "open",
          requireMention: false,
        },
      },
    },
  },
}
Esempio: consenti solo utenti specifici in un gruppo specifico:
{
  channels: {
    telegram: {
      groups: {
        "-1001234567890": {
          requireMention: true,
          allowFrom: ["8734062810", "745123456"],
        },
      },
    },
  },
}
> **Attenzione:**

Errore comune: groupAllowFrom non e un’allowlist gruppi Telegram.

  - Metti gli ID chat gruppo o supergruppo Telegram negativi come `-1001234567890` sotto `channels.telegram.groups`.
  - Metti gli ID utente Telegram come `8734062810` sotto `groupAllowFrom` quando vuoi limitare quali persone all'interno di un gruppo consentito possono attivare il bot.
  - Usa `groupAllowFrom: ["*"]` solo quando vuoi che qualsiasi membro di un gruppo consentito possa parlare al bot.

Comportamento menzioni

Le risposte nei gruppi richiedono menzione per impostazione predefinita.

La menzione puo provenire da:

- menzione nativa `@nomeutente_bot`, oppure
- pattern di menzione in:
  - `agents.list[].groupChat.mentionPatterns`
  - `messages.groupChat.mentionPatterns`

Toggle comandi a livello sessione:

- `/activation always`
- `/activation mention`

Questi aggiornano solo lo stato della sessione. Usa il config per la persistenza.

Esempio config persistente:
{
  channels: {
    telegram: {
      groups: {
        "*": { requireMention: false },
      },
    },
  },
}
Ottenere l'ID chat del gruppo:

- inoltra un messaggio del gruppo a `@userinfobot` / `@getidsbot`
- o leggi `chat.id` da `openclaw logs --follow`
- o ispeziona `getUpdates` della Bot API

Comportamento runtime

  • Telegram e posseduto dal processo gateway.
  • Il routing e deterministico: i messaggi in ingresso Telegram rispondono a Telegram (il modello non sceglie i canali).
  • I messaggi in ingresso si normalizzano nell’envelope canale condiviso con metadati di risposta e placeholder media.
  • Le sessioni di gruppo sono isolate per ID gruppo. I topic dei forum appendono :topic:<threadId> per mantenere i topic isolati.
  • I messaggi DM possono portare message_thread_id; OpenClaw li instrada con chiavi di sessione thread-aware e preserva l’ID thread per le risposte.
  • Il long polling usa il runner grammY con sequenziamento per chat/thread. La concorrenza complessiva del sink del runner usa agents.defaults.maxConcurrent.
  • La Telegram Bot API non supporta le conferme di lettura (sendReadReceipts non si applica).

Riferimento funzionalita

Anteprima live streaming (modifiche messaggi)
OpenClaw puo fare lo streaming di risposte parziali in tempo reale:

- chat dirette: messaggio anteprima + `editMessageText`
- gruppi/topic: messaggio anteprima + `editMessageText`

Requisito:

- `channels.telegram.streaming` e `off | partial | block | progress` (predefinito: `partial`)
- `progress` mappa a `partial` su Telegram (compatibilita con naming cross-canale)
- i legacy `channels.telegram.streamMode` e valori booleani `streaming` vengono auto-mappati

Per risposte solo testo:

- DM: OpenClaw mantiene lo stesso messaggio anteprima e esegue una modifica finale sul posto (nessun secondo messaggio)
- gruppo/topic: OpenClaw mantiene lo stesso messaggio anteprima e esegue una modifica finale sul posto (nessun secondo messaggio)

Per risposte complesse (ad esempio payload media), OpenClaw torna alla consegna finale normale e poi pulisce il messaggio anteprima.

Lo streaming anteprima e separato dallo streaming a blocchi. Quando lo streaming a blocchi e esplicitamente abilitato per Telegram, OpenClaw salta lo streaming anteprima per evitare il doppio streaming.

Se il trasporto bozza nativo non e disponibile/rifiutato, OpenClaw torna automaticamente a `sendMessage` + `editMessageText`.

Stream ragionamento solo Telegram:

- `/reasoning stream` invia il ragionamento all'anteprima live durante la generazione
- la risposta finale viene inviata senza testo di ragionamento
Formattazione e fallback HTML
Il testo in uscita usa `parse_mode: "HTML"` di Telegram.

- Il testo in stile Markdown viene renderizzato in HTML sicuro per Telegram.
- L'HTML raw del modello viene escaped per ridurre i fallimenti di parsing di Telegram.
- Se Telegram rifiuta l'HTML parsato, OpenClaw riprova come testo semplice.

Le anteprime link sono abilitate per impostazione predefinita e possono essere disabilitate con `channels.telegram.linkPreview: false`.
Comandi nativi e comandi personalizzati
La registrazione del menu comandi Telegram e gestita all'avvio con `setMyCommands`.

Valori predefiniti comandi nativi:

- `commands.native: "auto"` abilita i comandi nativi per Telegram

Aggiungi voci personalizzate al menu comandi:
{
  channels: {
    telegram: {
      customCommands: [
        { command: "backup", description: "Git backup" },
        { command: "generate", description: "Create an image" },
      ],
    },
  },
}
Regole:

- i nomi sono normalizzati (rimuovi `/` iniziale, minuscolo)
- pattern valido: `a-z`, `0-9`, `_`, lunghezza `1..32`
- i comandi personalizzati non possono sovrascrivere i comandi nativi
- conflitti/duplicati vengono saltati e registrati nel log

Note:

- i comandi personalizzati sono solo voci di menu; non implementano automaticamente il comportamento
- i comandi plugin/skill possono comunque funzionare quando digitati anche se non mostrati nel menu Telegram

Se i comandi nativi sono disabilitati, i comandi integrati vengono rimossi. I comandi personalizzati/plugin possono comunque registrarsi se configurati.

Fallimenti di setup comuni:

- `setMyCommands failed` con `BOT_COMMANDS_TOO_MUCH` significa che il menu Telegram ha ancora troppi comandi dopo il trimming; riduci i comandi plugin/skill/personalizzati o disabilita `channels.telegram.commands.native`.
- `setMyCommands failed` con errori di rete/fetch di solito significa che il DNS/HTTPS in uscita verso `api.telegram.org` e bloccato.

### Comandi di pairing dispositivo (plugin `device-pair`)

Quando il plugin `device-pair` e installato:

1. `/pair` genera il codice di setup
2. incolla il codice nell'app iOS
3. `/pair approve` approva l'ultima richiesta in sospeso

Maggiori dettagli: [Pairing](/docs/channels/pairing#pair-via-telegram-recommended-for-ios).
Bottoni inline
Configura l'ambito della tastiera inline:
{
  channels: {
    telegram: {
      capabilities: {
        inlineButtons: "allowlist",
      },
    },
  },
}
Override per account:
{
  channels: {
    telegram: {
      accounts: {
        main: {
          capabilities: {
            inlineButtons: "allowlist",
          },
        },
      },
    },
  },
}
Ambiti:

- `off`
- `dm`
- `group`
- `all`
- `allowlist` (predefinito)

Il legacy `capabilities: ["inlineButtons"]` mappa a `inlineButtons: "all"`.

Esempio azione messaggio:
{
  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" }],
  ],
}
I clic callback vengono passati all'agent come testo:
`callback_data: <valore>`
Azioni messaggio Telegram per agent e automazione
Le azioni strumento Telegram includono:

- `sendMessage` (`to`, `content`, opzionali `mediaUrl`, `replyToMessageId`, `messageThreadId`)
- `react` (`chatId`, `messageId`, `emoji`)
- `deleteMessage` (`chatId`, `messageId`)
- `editMessage` (`chatId`, `messageId`, `content`)
- `createForumTopic` (`chatId`, `name`, opzionali `iconColor`, `iconCustomEmojiId`)

Le azioni messaggio canale espongono alias ergonomici (`send`, `react`, `delete`, `edit`, `sticker`, `sticker-search`, `topic-create`).

Controlli di gating:

- `channels.telegram.actions.sendMessage`
- `channels.telegram.actions.deleteMessage`
- `channels.telegram.actions.reactions`
- `channels.telegram.actions.sticker` (predefinito: disabilitato)

Nota: `edit` e `topic-create` sono attualmente abilitati per impostazione predefinita e non hanno toggle `channels.telegram.actions.*` separati.
Gli invii runtime usano lo snapshot config/secrets attivo (avvio/ricarica), quindi i percorsi azione non eseguono ri-risoluzione SecretRef ad-hoc per invio.

Semantica rimozione reazione: [/tools/reactions](/docs/tools/reactions)
Tag di threading risposte
Telegram supporta tag di threading espliciti nel testo generato:

- `[[reply_to_current]]` risponde al messaggio trigger
- `[[reply_to:<id>]]` risponde a un ID messaggio Telegram specifico

`channels.telegram.replyToMode` controlla la gestione:

- `off` (predefinito)
- `first`
- `all`

Nota: `off` disabilita il threading implicito delle risposte. I tag espliciti `[[reply_to_*]]` vengono comunque rispettati.
Topic dei forum e comportamento thread
Supergruppi forum:

- le chiavi di sessione dei topic appendono `:topic:<threadId>`
- risposte e typing puntano al thread del topic
- percorso config topic:
  `channels.telegram.groups.<chatId>.topics.<threadId>`

Caso speciale topic generale (`threadId=1`):

- gli invii messaggi omettono `message_thread_id` (Telegram rifiuta `sendMessage(...thread_id=1)`)
- le azioni typing includono comunque `message_thread_id`

Ereditarieta topic: le voci topic ereditano le impostazioni del gruppo a meno che non siano sovrascritte (`requireMention`, `allowFrom`, `skills`, `systemPrompt`, `enabled`, `groupPolicy`).
`agentId` e solo per topic e non eredita dai default del gruppo.

**Routing agent per topic**: ogni topic puo instradare a un agent diverso impostando `agentId` nella config topic. Questo da a ogni topic il proprio workspace, memoria e sessione isolati. Esempio:

```json5
{
  channels: {
    telegram: {
      groups: {
        "-1001234567890": {
          topics: {
            "1": { agentId: "main" },      // Topic generale → agent main
            "3": { agentId: "zu" },        // Topic dev → agent zu
            "5": { agentId: "coder" }      // Code review → agent coder
          }
        }
      }
    }
  }
}
```

Ogni topic ha la propria chiave di sessione: `agent:zu:telegram:group:-1001234567890:topic:3`

**Binding ACP topic persistente**: i topic dei forum possono fissare sessioni harness ACP tramite binding ACP tipizzati top-level:

- `bindings[]` con `type: "acp"` e `match.channel: "telegram"`

Esempio:

```json5
{
  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,
            },
          },
        },
      },
    },
  },
}
```

Questo e attualmente limitato ai topic dei forum in gruppi e supergruppi.

**Spawn ACP thread-bound dalla chat**:

- `/acp spawn <agent> --thread here|auto` puo vincolare il topic Telegram corrente a una nuova sessione ACP.
- I messaggi successivi nel topic instradano direttamente alla sessione ACP vincolata (nessun `/acp steer` necessario).
- OpenClaw fissa il messaggio di conferma spawn nel topic dopo un bind riuscito.
- Richiede `channels.telegram.threadBindings.spawnAcpSessions=true`.

Il contesto template include:

- `MessageThreadId`
- `IsForum`

Comportamento thread DM:

- le chat private con `message_thread_id` mantengono il routing DM ma usano chiavi di sessione/target di risposta thread-aware.
Audio, video e sticker
### Messaggi audio

Telegram distingue le note vocali dai file audio.

- predefinito: comportamento file audio
- tag `[[audio_as_voice]]` nella risposta dell'agent per forzare l'invio come nota vocale

Esempio azione messaggio:
{
  action: "send",
  channel: "telegram",
  to: "123456789",
  media: "https://example.com/voice.ogg",
  asVoice: true,
}
### Messaggi video

Telegram distingue i file video dalle note video.

Esempio azione messaggio:
{
  action: "send",
  channel: "telegram",
  to: "123456789",
  media: "https://example.com/video.mp4",
  asVideoNote: true,
}
Le note video non supportano didascalie; il testo del messaggio fornito viene inviato separatamente.

### Sticker

Gestione sticker in ingresso:

- WEBP statico: scaricato e elaborato (placeholder `<media:sticker>`)
- TGS animato: saltato
- WEBM video: saltato

Campi contesto sticker:

- `Sticker.emoji`
- `Sticker.setName`
- `Sticker.fileId`
- `Sticker.fileUniqueId`
- `Sticker.cachedDescription`

File cache sticker:

- `~/.openclaw/telegram/sticker-cache.json`

Gli sticker vengono descritti una volta (quando possibile) e messi in cache per ridurre le chiamate vision ripetute.

Abilita azioni sticker:
{
  channels: {
    telegram: {
      actions: {
        sticker: true,
      },
    },
  },
}
Azione invio sticker:
{
  action: "sticker",
  channel: "telegram",
  to: "123456789",
  fileId: "CAACAgIAAxkBAAI...",
}
Ricerca sticker in cache:
{
  action: "sticker-search",
  channel: "telegram",
  query: "cat waving",
  limit: 5,
}
Notifiche reazione
Le reazioni Telegram arrivano come aggiornamenti `message_reaction` (separati dai payload messaggi).

Quando abilitato, OpenClaw accoda eventi di sistema come:

- `Telegram reaction added: 👍 by Alice (@alice) on msg 42`

Config:

- `channels.telegram.reactionNotifications`: `off | own | all` (predefinito: `own`)
- `channels.telegram.reactionLevel`: `off | ack | minimal | extensive` (predefinito: `minimal`)

Note:

- `own` significa le reazioni utente solo ai messaggi inviati dal bot (best-effort tramite cache messaggi inviati).
- Gli eventi reazione rispettano comunque i controlli di accesso Telegram (`dmPolicy`, `allowFrom`, `groupPolicy`, `groupAllowFrom`); i mittenti non autorizzati vengono scartati.
- Telegram non fornisce gli ID thread negli aggiornamenti reazione.
  - gruppi non-forum instradano alla sessione chat di gruppo
  - gruppi forum instradano alla sessione topic generale del gruppo (`:topic:1`), non al topic originario esatto

`allowed_updates` per polling/webhook include `message_reaction` automaticamente.
Reazioni di conferma
`ackReaction` invia un emoji di conferma mentre OpenClaw sta elaborando un messaggio in ingresso.

Ordine di risoluzione:

- `channels.telegram.accounts.<accountId>.ackReaction`
- `channels.telegram.ackReaction`
- `messages.ackReaction`
- fallback emoji identita agent (`agents.list[].identity.emoji`, altrimenti "👀")

Note:

- Telegram si aspetta emoji unicode (ad esempio "👀").
- Usa `""` per disabilitare la reazione per un canale o account.
Scritture config da eventi e comandi Telegram
Le scritture config canale sono abilitate per impostazione predefinita (`configWrites !== false`).

Le scritture attivate da Telegram includono:

- eventi di migrazione gruppo (`migrate_to_chat_id`) per aggiornare `channels.telegram.groups`
- `/config set` e `/config unset` (richiede abilitazione comandi)

Disabilita:
{
  channels: {
    telegram: {
      configWrites: false,
    },
  },
}
Long polling vs webhook
Predefinito: long polling.

Modalita webhook:

- imposta `channels.telegram.webhookUrl`
- imposta `channels.telegram.webhookSecret` (necessario quando l'URL webhook e impostato)
- opzionale `channels.telegram.webhookPath` (predefinito `/telegram-webhook`)
- opzionale `channels.telegram.webhookHost` (predefinito `127.0.0.1`)
- opzionale `channels.telegram.webhookPort` (predefinito `8787`)

Il listener locale predefinito per la modalita webhook si associa a `127.0.0.1:8787`.

Se il tuo endpoint pubblico differisce, metti un reverse proxy davanti e punta `webhookUrl` all'URL pubblico.
Imposta `webhookHost` (ad esempio `0.0.0.0`) quando hai intenzionalmente bisogno di ingress esterno.
Limiti, retry e target CLI
- `channels.telegram.textChunkLimit` predefinito e 4000.
- `channels.telegram.chunkMode="newline"` preferisce i confini di paragrafo (righe vuote) prima della divisione per lunghezza.
- `channels.telegram.mediaMaxMb` (predefinito 100) limita i media Telegram in ingresso e in uscita.
- `channels.telegram.timeoutSeconds` sovrascrive il timeout del client API Telegram (se non impostato, si applica il predefinito grammY).
- lo storico contesto di gruppo usa `channels.telegram.historyLimit` o `messages.groupChat.historyLimit` (predefinito 50); `0` disabilita.
- Controlli storico DM:
  - `channels.telegram.dmHistoryLimit`
  - `channels.telegram.dms["<user_id>"].historyLimit`
- la config `channels.telegram.retry` si applica agli helper di invio Telegram (CLI/strumenti/azioni) per errori API in uscita recuperabili.

Il target di invio CLI puo essere un ID chat numerico o username:
openclaw message send --channel telegram --target 123456789 --message "hi"
openclaw message send --channel telegram --target @name --message "hi"
I sondaggi Telegram usano `openclaw message poll` e supportano i topic dei forum:
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
Flag sondaggi solo Telegram:

- `--poll-duration-seconds` (5-600)
- `--poll-anonymous`
- `--poll-public`
- `--thread-id` per topic dei forum (o usa un target `:topic:`)

Gating azioni:

- `channels.telegram.actions.sendMessage=false` disabilita i messaggi Telegram in uscita, inclusi i sondaggi
- `channels.telegram.actions.poll=false` disabilita la creazione sondaggi Telegram mantenendo gli invii regolari abilitati
Approvazioni exec in Telegram
Telegram supporta le approvazioni exec nei DM dell'approvatore e puo opzionalmente pubblicare i prompt di approvazione nella chat o topic originario.

Percorso config:

- `channels.telegram.execApprovals.enabled`
- `channels.telegram.execApprovals.approvers`
- `channels.telegram.execApprovals.target` (`dm` | `channel` | `both`, predefinito: `dm`)
- `agentFilter`, `sessionFilter`

Gli approvatori devono essere ID utente Telegram numerici. Quando `enabled` e false o `approvers` e vuoto, Telegram non agisce come client di approvazione exec. Le richieste di approvazione tornano ad altri percorsi di approvazione configurati o alla policy di fallback delle approvazioni exec.

Regole di consegna:

- `target: "dm"` invia i prompt di approvazione solo ai DM degli approvatori configurati
- `target: "channel"` invia il prompt nella chat/topic Telegram originario
- `target: "both"` invia ai DM degli approvatori e alla chat/topic originario

Solo gli approvatori configurati possono approvare o negare. I non-approvatori non possono usare `/approve` e non possono usare i bottoni di approvazione Telegram.

La consegna nel canale mostra il testo del comando nella chat, quindi abilita `channel` o `both` solo in gruppi/topic fidati. Quando il prompt arriva in un topic del forum, OpenClaw preserva il topic sia per il prompt di approvazione che per il follow-up post-approvazione.

I bottoni di approvazione inline dipendono anche da `channels.telegram.capabilities.inlineButtons` che consenta la superficie target (`dm`, `group`, o `all`).

Documentazione correlata: [Approvazioni exec](/docs/tools/exec-approvals)

Risoluzione problemi

Il bot non risponde ai messaggi di gruppo senza menzione
- Se `requireMention=false`, la modalita privacy Telegram deve consentire visibilita completa.
  - BotFather: `/setprivacy` -> Disable
  - poi rimuovi + ri-aggiungi il bot al gruppo
- `openclaw channels status` avvisa quando il config si aspetta messaggi di gruppo senza menzione.
- `openclaw channels status --probe` puo controllare ID gruppo numerici espliciti; il wildcard `"*"` non puo essere verificato per appartenenza.
- test rapido sessione: `/activation always`.
Il bot non vede affatto i messaggi di gruppo
- quando `channels.telegram.groups` esiste, il gruppo deve essere elencato (o includere `"*"`)
- verifica l'appartenenza del bot al gruppo
- controlla i log: `openclaw logs --follow` per i motivi di skip
I comandi funzionano parzialmente o per niente
- autorizza la tua identita mittente (pairing e/o `allowFrom` numerico)
- l'autorizzazione comandi si applica comunque anche quando la policy di gruppo e `open`
- `setMyCommands failed` con `BOT_COMMANDS_TOO_MUCH` significa che il menu nativo ha troppe voci; riduci i comandi plugin/skill/personalizzati o disabilita i menu nativi
- `setMyCommands failed` con errori di rete/fetch di solito indica problemi di raggiungibilita DNS/HTTPS verso `api.telegram.org`
Instabilita polling o rete
- Node 22+ + fetch/proxy personalizzato possono causare un comportamento di abort immediato se i tipi AbortSignal non corrispondono.
- Alcuni host risolvono `api.telegram.org` prima in IPv6; l'egress IPv6 guasto puo causare fallimenti intermittenti delle API Telegram.
- Se i log includono `TypeError: fetch failed` o `Network request for 'getUpdates' failed!`, OpenClaw ora riprova questi come errori di rete recuperabili.
- Su host VPS con egress diretto/TLS instabile, instrada le chiamate API Telegram attraverso `channels.telegram.proxy`:
channels:
  telegram:
    proxy: socks5://<user>:<password>@proxy-host:1080
- Node 22+ usa per impostazione predefinita `autoSelectFamily=true` (tranne WSL2) e `dnsResultOrder=ipv4first`.
- Se il tuo host e WSL2 o funziona esplicitamente meglio con comportamento solo IPv4, forza la selezione famiglia:
channels:
  telegram:
    network:
      autoSelectFamily: false
- Override di ambiente (temporanei):
  - `OPENCLAW_TELEGRAM_DISABLE_AUTO_SELECT_FAMILY=1`
  - `OPENCLAW_TELEGRAM_ENABLE_AUTO_SELECT_FAMILY=1`
  - `OPENCLAW_TELEGRAM_DNS_RESULT_ORDER=ipv4first`
- Valida le risposte DNS:
dig +short api.telegram.org A
dig +short api.telegram.org AAAA

Ulteriore aiuto: Risoluzione problemi canali.

Riferimento configurazione Telegram

Riferimento primario:

  • channels.telegram.enabled: abilita/disabilita l’avvio del canale.

  • channels.telegram.botToken: token bot (BotFather).

  • channels.telegram.tokenFile: legge il token da un percorso file regolare. I symlink vengono rifiutati.

  • channels.telegram.dmPolicy: pairing | allowlist | open | disabled (predefinito: pairing).

  • channels.telegram.allowFrom: allowlist DM (ID utente Telegram numerici). allowlist richiede almeno un ID mittente. open richiede "*". openclaw doctor --fix puo risolvere le voci legacy @username in ID e puo recuperare voci allowlist dai file pairing-store nei flussi di migrazione allowlist (ad esempio quando dmPolicy: "allowlist" non ha ancora ID espliciti).

  • channels.telegram.actions.poll: abilita o disabilita la creazione sondaggi Telegram (predefinito: abilitato; richiede comunque sendMessage).

  • channels.telegram.defaultTo: target Telegram predefinito usato dalla CLI --deliver quando non viene fornito un --reply-to esplicito.

  • channels.telegram.groupPolicy: open | allowlist | disabled (predefinito: allowlist).

  • channels.telegram.groupAllowFrom: allowlist mittenti gruppi (ID utente Telegram numerici). openclaw doctor --fix puo risolvere le voci legacy @username in ID. Le voci non numeriche vengono ignorate al momento dell’auth. L’auth di gruppo non usa il fallback pairing-store DM (2026.2.25+).

  • Precedenza multi-account:

    • Quando due o piu ID account sono configurati, imposta channels.telegram.defaultAccount (o includi channels.telegram.accounts.default) per rendere esplicito il routing predefinito.
    • Se nessuno dei due e impostato, OpenClaw torna al primo ID account normalizzato e openclaw doctor avvisa.
    • channels.telegram.accounts.default.allowFrom e channels.telegram.accounts.default.groupAllowFrom si applicano solo all’account default.
    • Gli account nominati ereditano channels.telegram.allowFrom e channels.telegram.groupAllowFrom quando i valori a livello account non sono impostati.
    • Gli account nominati non ereditano channels.telegram.accounts.default.allowFrom / groupAllowFrom.
  • channels.telegram.groups: default per gruppo + allowlist (usa "*" per default globali).

    • channels.telegram.groups.<id>.groupPolicy: override per gruppo di groupPolicy (open | allowlist | disabled).
    • channels.telegram.groups.<id>.requireMention: gating menzione predefinito.
    • channels.telegram.groups.<id>.skills: filtro skill (ometti = tutte le skill, vuoto = nessuna).
    • channels.telegram.groups.<id>.allowFrom: override allowlist mittenti per gruppo.
    • channels.telegram.groups.<id>.systemPrompt: prompt di sistema aggiuntivo per il gruppo.
    • channels.telegram.groups.<id>.enabled: disabilita il gruppo quando false.
    • channels.telegram.groups.<id>.topics.<threadId>.*: override per topic (campi gruppo + agentId solo topic).
    • channels.telegram.groups.<id>.topics.<threadId>.agentId: instrada questo topic a un agent specifico (sovrascrive il routing a livello gruppo e binding).
  • channels.telegram.groups.<id>.topics.<threadId>.groupPolicy: override per topic di groupPolicy (open | allowlist | disabled).

  • channels.telegram.groups.<id>.topics.<threadId>.requireMention: override gating menzione per topic.

  • bindings[] top-level con type: "acp" e ID topic canonico chatId:topic:topicId in match.peer.id: campi binding ACP topic persistente (vedi ACP Agents).

  • channels.telegram.direct.<id>.topics.<threadId>.agentId: instrada i topic DM a un agent specifico (stesso comportamento dei topic dei forum).

  • channels.telegram.execApprovals.enabled: abilita Telegram come client di approvazione exec basato su chat per questo account.

  • channels.telegram.execApprovals.approvers: ID utente Telegram autorizzati ad approvare o negare richieste exec. Necessario quando le approvazioni exec sono abilitate.

  • channels.telegram.execApprovals.target: dm | channel | both (predefinito: dm). channel e both preservano il topic Telegram originario quando presente.

  • channels.telegram.execApprovals.agentFilter: filtro ID agent opzionale per i prompt di approvazione inoltrati.

  • channels.telegram.execApprovals.sessionFilter: filtro chiave di sessione opzionale (sottostringa o regex) per i prompt di approvazione inoltrati.

  • channels.telegram.accounts.<account>.execApprovals: override per account del routing approvazione exec Telegram e autorizzazione approvatore.

  • channels.telegram.capabilities.inlineButtons: off | dm | group | all | allowlist (predefinito: allowlist).

  • channels.telegram.accounts.<account>.capabilities.inlineButtons: override per account.

  • channels.telegram.commands.nativeSkills: abilita/disabilita i comandi skill nativi Telegram.

  • channels.telegram.replyToMode: off | first | all (predefinito: off).

  • channels.telegram.textChunkLimit: dimensione segmento in uscita (caratteri).

  • channels.telegram.chunkMode: length (predefinito) o newline per dividere sulle righe vuote (confini paragrafo) prima della segmentazione per lunghezza.

  • channels.telegram.linkPreview: toggle anteprime link per messaggi in uscita (predefinito: true).

  • channels.telegram.streaming: off | partial | block | progress (anteprima live streaming; predefinito: partial; progress mappa a partial; block e compatibilita modalita anteprima legacy). Lo streaming anteprima Telegram usa un singolo messaggio anteprima che viene modificato sul posto.

  • channels.telegram.mediaMaxMb: limite media Telegram in ingresso/uscita (MB, predefinito: 100).

  • channels.telegram.retry: policy di retry per gli helper di invio Telegram (CLI/strumenti/azioni) su errori API in uscita recuperabili (attempts, minDelayMs, maxDelayMs, jitter).

  • channels.telegram.network.autoSelectFamily: override Node autoSelectFamily (true=abilita, false=disabilita). Predefinito abilitato su Node 22+, con WSL2 predefinito disabilitato.

  • channels.telegram.network.dnsResultOrder: override ordine risultati DNS (ipv4first o verbatim). Predefinito ipv4first su Node 22+.

  • channels.telegram.proxy: URL proxy per chiamate Bot API (SOCKS/HTTP).

  • channels.telegram.webhookUrl: abilita modalita webhook (richiede channels.telegram.webhookSecret).

  • channels.telegram.webhookSecret: segreto webhook (necessario quando webhookUrl e impostato).

  • channels.telegram.webhookPath: percorso webhook locale (predefinito /telegram-webhook).

  • channels.telegram.webhookHost: host di bind webhook locale (predefinito 127.0.0.1).

  • channels.telegram.webhookPort: porta di bind webhook locale (predefinito 8787).

  • channels.telegram.actions.reactions: gate reazioni strumento Telegram.

  • channels.telegram.actions.sendMessage: gate invii messaggio strumento Telegram.

  • channels.telegram.actions.deleteMessage: gate cancellazioni messaggio strumento Telegram.

  • channels.telegram.actions.sticker: gate azioni sticker Telegram — invio e ricerca (predefinito: false).

  • channels.telegram.reactionNotifications: off | own | all — controlla quali reazioni attivano eventi di sistema (predefinito: own quando non impostato).

  • channels.telegram.reactionLevel: off | ack | minimal | extensive — controlla la funzionalita reazione dell’agent (predefinito: minimal quando non impostato).

  • Riferimento configurazione - Telegram

Campi Telegram ad alto segnale specifici:

  • avvio/auth: enabled, botToken, tokenFile, accounts.* (tokenFile deve puntare a un file regolare; i symlink vengono rifiutati)
  • controllo accessi: dmPolicy, allowFrom, groupPolicy, groupAllowFrom, groups, groups.*.topics.*, bindings[] top-level (type: "acp")
  • approvazioni exec: execApprovals, accounts.*.execApprovals
  • comandi/menu: commands.native, commands.nativeSkills, customCommands
  • threading/risposte: replyToMode
  • streaming: streaming (anteprima), blockStreaming
  • formattazione/consegna: textChunkLimit, chunkMode, linkPreview, responsePrefix
  • media/rete: mediaMaxMb, timeoutSeconds, retry, network.autoSelectFamily, proxy
  • webhook: webhookUrl, webhookSecret, webhookPath, webhookHost
  • azioni/funzionalita: capabilities.inlineButtons, actions.sendMessage|editMessage|deleteMessage|reactions|sticker
  • reazioni: reactionNotifications, reactionLevel
  • scritture/storico: configWrites, historyLimit, dmHistoryLimit, dms.*.historyLimit

Correlati