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.
- Pairing — La policy DM predefinita per Telegram e pairing.
- Risoluzione problemi canali — Diagnostica cross-canale e playbook di riparazione.
- Configurazione gateway — Pattern ed esempi completi di configurazione canale.
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_TOKENsi 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:
groupAllowFromnon 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 (
sendReadReceiptsnon 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).allowlistrichiede almeno un ID mittente.openrichiede"*".openclaw doctor --fixpuo risolvere le voci legacy@usernamein ID e puo recuperare voci allowlist dai file pairing-store nei flussi di migrazione allowlist (ad esempio quandodmPolicy: "allowlist"non ha ancora ID espliciti). -
channels.telegram.actions.poll: abilita o disabilita la creazione sondaggi Telegram (predefinito: abilitato; richiede comunquesendMessage). -
channels.telegram.defaultTo: target Telegram predefinito usato dalla CLI--deliverquando non viene fornito un--reply-toesplicito. -
channels.telegram.groupPolicy:open | allowlist | disabled(predefinito: allowlist). -
channels.telegram.groupAllowFrom: allowlist mittenti gruppi (ID utente Telegram numerici).openclaw doctor --fixpuo risolvere le voci legacy@usernamein 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 includichannels.telegram.accounts.default) per rendere esplicito il routing predefinito. - Se nessuno dei due e impostato, OpenClaw torna al primo ID account normalizzato e
openclaw doctoravvisa. channels.telegram.accounts.default.allowFromechannels.telegram.accounts.default.groupAllowFromsi applicano solo all’accountdefault.- Gli account nominati ereditano
channels.telegram.allowFromechannels.telegram.groupAllowFromquando i valori a livello account non sono impostati. - Gli account nominati non ereditano
channels.telegram.accounts.default.allowFrom/groupAllowFrom.
- Quando due o piu ID account sono configurati, imposta
-
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 quandofalse.channels.telegram.groups.<id>.topics.<threadId>.*: override per topic (campi gruppo +agentIdsolo 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 contype: "acp"e ID topic canonicochatId:topic:topicIdinmatch.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).channelebothpreservano 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) onewlineper 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;progressmappa apartial;blocke 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 (ipv4firstoverbatim). Predefinitoipv4firstsu Node 22+. -
channels.telegram.proxy: URL proxy per chiamate Bot API (SOCKS/HTTP). -
channels.telegram.webhookUrl: abilita modalita webhook (richiedechannels.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 (predefinito127.0.0.1). -
channels.telegram.webhookPort: porta di bind webhook locale (predefinito8787). -
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:ownquando non impostato). -
channels.telegram.reactionLevel:off | ack | minimal | extensive— controlla la funzionalita reazione dell’agent (predefinito:minimalquando non impostato).
Campi Telegram ad alto segnale specifici:
- avvio/auth:
enabled,botToken,tokenFile,accounts.*(tokenFiledeve 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