Telegram (API Bot)

Statut : pret pour la production pour les DMs + groupes de bot via grammY. Le long polling est le mode par defaut ; le mode webhook est optionnel.

Configuration rapide

Etape 1 : creer le token du bot dans BotFather

Ouvrez Telegram et discutez avec **@BotFather** (confirmez que l'identifiant est bien `@BotFather`).

Executez `/newbot`, suivez les instructions et enregistrez le token.

Etape 2 : configurer le token et la politique DM

{
  channels: {
    telegram: {
      enabled: true,
      botToken: "123:abc",
      dmPolicy: "pairing",
      groups: { "*": { requireMention: true } },
    },
  },
}
Variable d'environnement de secours : `TELEGRAM_BOT_TOKEN=...` (compte par defaut uniquement).
Telegram n'utilise **pas** `openclaw channels login telegram` ; configurez le token dans la configuration/env, puis demarrez la gateway.

Etape 3 : demarrer la gateway et approuver le premier DM

openclaw gateway
openclaw pairing list telegram
openclaw pairing approve telegram <CODE>
Les codes d'appairage expirent apres 1 heure.

Etape 4 : ajouter le bot a un groupe

Ajoutez le bot a votre groupe, puis definissez `channels.telegram.groups` et `groupPolicy` pour correspondre a votre modele d'acces.

Remarque : L’ordre de resolution du token tient compte des comptes. En pratique, les valeurs de configuration ont priorite sur la variable d’environnement de secours, et TELEGRAM_BOT_TOKEN ne s’applique qu’au compte par defaut.

Parametres cote Telegram

Mode confidentialite et visibilite de groupe
Les bots Telegram sont en **Privacy Mode** par defaut, ce qui limite les messages de groupe qu'ils recoivent.

Si le bot doit voir tous les messages de groupe, vous pouvez soit :

- desactiver le mode confidentialite via `/setprivacy`, soit
- rendre le bot administrateur du groupe.

Lorsque vous basculez le mode confidentialite, retirez + re-ajoutez le bot dans chaque groupe pour que Telegram applique le changement.
Permissions de groupe
Le statut administrateur est controle dans les parametres du groupe Telegram.

Les bots administrateurs recoivent tous les messages de groupe, ce qui est utile pour un comportement de groupe permanent.
Options utiles de BotFather
- `/setjoingroups` pour autoriser/interdire l'ajout aux groupes
- `/setprivacy` pour le comportement de visibilite de groupe

Controle d’acces et activation

Politique DM

`channels.telegram.dmPolicy` controle l'acces aux messages directs :

- `pairing` (par defaut)
- `allowlist` (necessite au moins un identifiant d'expediteur dans `allowFrom`)
- `open` (necessite que `allowFrom` contienne `"*"`)
- `disabled`

`channels.telegram.allowFrom` accepte les identifiants utilisateur Telegram numeriques. Les prefixes `telegram:` / `tg:` sont acceptes et normalises.
`dmPolicy: "allowlist"` avec un `allowFrom` vide bloque tous les DMs et est rejete par la validation de configuration.
L'assistant d'onboarding accepte les saisies `@username` et les resout en identifiants numeriques.
Si vous avez mis a jour et que votre configuration contient des entrees `@username` dans la liste d'autorisation, executez `openclaw doctor --fix` pour les resoudre (best-effort ; necessite un token de bot Telegram).
Si vous vous appuyiez precedemment sur des fichiers de liste d'autorisation du magasin d'appairage, `openclaw doctor --fix` peut recuperer les entrees dans `channels.telegram.allowFrom` dans les flux de liste d'autorisation (par exemple lorsque `dmPolicy: "allowlist"` n'a pas encore d'identifiants explicites).

Pour les bots mono-proprietaire, preferez `dmPolicy: "allowlist"` avec des identifiants numeriques explicites dans `allowFrom` pour garder la politique d'acces durable en configuration (au lieu de dependre des approbations d'appairage precedentes).

### Trouver votre identifiant utilisateur Telegram

Plus sur (sans bot tiers) :

1. Envoyez un DM a votre bot.
2. Executez `openclaw logs --follow`.
3. Lisez `from.id`.

Methode officielle Bot API :
curl "https://api.telegram.org/bot<bot_token>/getUpdates"
Methode tierce (moins privee) : `@userinfobot` ou `@getidsbot`.

Politique de groupe et listes d’autorisation

Deux controles s'appliquent conjointement :

1. **Quels groupes sont autorises** (`channels.telegram.groups`)
   - pas de configuration `groups` :
     - avec `groupPolicy: "open"` : tout groupe peut passer les verifications d'identifiant de groupe
     - avec `groupPolicy: "allowlist"` (par defaut) : les groupes sont bloques tant que vous n'ajoutez pas d'entrees `groups` (ou `"*"`)
   - `groups` configure : agit comme liste d'autorisation (identifiants explicites ou `"*"`)

2. **Quels expediteurs sont autorises dans les groupes** (`channels.telegram.groupPolicy`)
   - `open`
   - `allowlist` (par defaut)
   - `disabled`

`groupAllowFrom` est utilise pour le filtrage des expediteurs de groupe. S'il n'est pas defini, Telegram se replie sur `allowFrom`.
Les entrees `groupAllowFrom` doivent etre des identifiants utilisateur Telegram numeriques (les prefixes `telegram:` / `tg:` sont normalises).
Ne mettez pas les identifiants de chat de groupe ou supergroupe Telegram dans `groupAllowFrom`. Les identifiants de chat negatifs appartiennent a `channels.telegram.groups`.
Les entrees non numeriques sont ignorees pour l'autorisation des expediteurs.
Frontiere de securite (`2026.2.25+`) : l'authentification des expediteurs de groupe n'herite **pas** des approbations du magasin d'appairage DM.
L'appairage reste reserve aux DMs. Pour les groupes, definissez `groupAllowFrom` ou un `allowFrom` par groupe/sujet.
Note d'execution : si `channels.telegram` est completement absent, l'execution utilise par defaut `groupPolicy="allowlist"` de maniere fermee, sauf si `channels.defaults.groupPolicy` est explicitement defini.

Exemple : autoriser tout membre dans un groupe specifique :
{
  channels: {
    telegram: {
      groups: {
        "-1001234567890": {
          groupPolicy: "open",
          requireMention: false,
        },
      },
    },
  },
}
Exemple : n'autoriser que des utilisateurs specifiques dans un groupe specifique :
{
  channels: {
    telegram: {
      groups: {
        "-1001234567890": {
          requireMention: true,
          allowFrom: ["8734062810", "745123456"],
        },
      },
    },
  },
}
> **Avertissement :**

Erreur courante : groupAllowFrom n’est pas une liste d’autorisation de groupes Telegram.

  - Mettez les identifiants de chat de groupe ou supergroupe Telegram negatifs comme `-1001234567890` sous `channels.telegram.groups`.
  - Mettez les identifiants utilisateur Telegram comme `8734062810` sous `groupAllowFrom` pour limiter quelles personnes dans un groupe autorise peuvent declencher le bot.
  - Utilisez `groupAllowFrom: ["*"]` uniquement lorsque vous souhaitez que tout membre d'un groupe autorise puisse parler au bot.

Comportement de mention

Les reponses de groupe necessitent une mention par defaut.

La mention peut provenir de :

- la mention native `@botusername`, ou
- les motifs de mention dans :
  - `agents.list[].groupChat.mentionPatterns`
  - `messages.groupChat.mentionPatterns`

Bascules de commande au niveau session :

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

Celles-ci mettent a jour l'etat de session uniquement. Utilisez la configuration pour la persistance.

Exemple de configuration persistante :
{
  channels: {
    telegram: {
      groups: {
        "*": { requireMention: false },
      },
    },
  },
}
Obtenir l'identifiant de chat du groupe :

- transferez un message du groupe a `@userinfobot` / `@getidsbot`
- ou lisez `chat.id` depuis `openclaw logs --follow`
- ou inspectez `getUpdates` de l'API Bot

Comportement a l’execution

  • Telegram est gere par le processus gateway.
  • Le routage est deterministe : les messages entrants Telegram repondent vers Telegram (le modele ne choisit pas les canaux).
  • Les messages entrants sont normalises dans l’enveloppe de canal partagee avec les metadonnees de reponse et les placeholders media.
  • Les sessions de groupe sont isolees par identifiant de groupe. Les sujets de forum ajoutent :topic:<threadId> pour garder les sujets isoles.
  • Les messages DM peuvent porter un message_thread_id ; OpenClaw les route avec des cles de session tenant compte du fil et preserve l’identifiant de fil pour les reponses.
  • Le long polling utilise grammY runner avec un sequencage par chat/fil. La concurrence globale du sink du runner utilise agents.defaults.maxConcurrent.
  • L’API Bot Telegram ne prend pas en charge les accuses de lecture (sendReadReceipts ne s’applique pas).

Reference des fonctionnalites

Apercu en streaming en direct (modifications de message)
OpenClaw peut diffuser les reponses partielles en temps reel :

- chats directs : message d'apercu + `editMessageText`
- groupes/sujets : message d'apercu + `editMessageText`

Prerequis :

- `channels.telegram.streaming` est `off | partial | block | progress` (par defaut : `partial`)
- `progress` correspond a `partial` sur Telegram (compatibilite inter-canaux)
- les valeurs anciennes `channels.telegram.streamMode` et booleennes `streaming` sont migrees automatiquement

Pour les reponses en texte seul :

- DM : OpenClaw conserve le meme message d'apercu et effectue une modification finale en place (pas de second message)
- groupe/sujet : OpenClaw conserve le meme message d'apercu et effectue une modification finale en place (pas de second message)

Pour les reponses complexes (par exemple payloads media), OpenClaw se replie sur la livraison finale normale et nettoie ensuite le message d'apercu.

Le streaming d'apercu est distinct du streaming par blocs. Lorsque le streaming par blocs est explicitement active pour Telegram, OpenClaw saute le flux d'apercu pour eviter un double streaming.

Si le transport de brouillon natif est indisponible/rejete, OpenClaw se replie automatiquement sur `sendMessage` + `editMessageText`.

Flux de raisonnement specifique a Telegram :

- `/reasoning stream` envoie le raisonnement dans l'apercu en direct pendant la generation
- la reponse finale est envoyee sans le texte de raisonnement
Mise en forme et repli HTML
Le texte sortant utilise `parse_mode: "HTML"` de Telegram.

- Le texte de style Markdown est rendu en HTML compatible Telegram.
- Le HTML brut du modele est echappe pour reduire les echecs d'analyse Telegram.
- Si Telegram rejette le HTML analyse, OpenClaw reessaie en texte brut.

Les apercu de liens sont actives par defaut et peuvent etre desactives avec `channels.telegram.linkPreview: false`.
Commandes natives et commandes personnalisees
L'enregistrement du menu de commandes Telegram est gere au demarrage avec `setMyCommands`.

Valeurs par defaut des commandes natives :

- `commands.native: "auto"` active les commandes natives pour Telegram

Ajouter des entrees de menu de commandes personnalisees :
{
  channels: {
    telegram: {
      customCommands: [
        { command: "backup", description: "Git backup" },
        { command: "generate", description: "Create an image" },
      ],
    },
  },
}
Regles :

- les noms sont normalises (suppression du `/` initial, minuscules)
- motif valide : `a-z`, `0-9`, `_`, longueur `1..32`
- les commandes personnalisees ne peuvent pas remplacer les commandes natives
- les conflits/doublons sont ignores et journalises

Remarques :

- les commandes personnalisees sont des entrees de menu uniquement ; elles n'implementent pas automatiquement de comportement
- les commandes de plugin/competence peuvent toujours fonctionner lorsqu'elles sont tapees meme si elles n'apparaissent pas dans le menu Telegram

Si les commandes natives sont desactivees, les commandes integrees sont supprimees. Les commandes personnalisees/plugin peuvent toujours s'enregistrer si elles sont configurees.

Echecs de configuration courants :

- `setMyCommands failed` avec `BOT_COMMANDS_TOO_MUCH` signifie que le menu Telegram a toujours deborde apres nettoyage ; reduisez les commandes plugin/competence/personnalisees ou desactivez `channels.telegram.commands.native`.
- `setMyCommands failed` avec des erreurs reseau/fetch signifie generalement que le DNS/HTTPS sortant vers `api.telegram.org` est bloque.

### Commandes d'appairage d'appareil (plugin `device-pair`)

Lorsque le plugin `device-pair` est installe :

1. `/pair` genere un code de configuration
2. collez le code dans l'application iOS
3. `/pair approve` approuve la derniere requete en attente

Plus de details : [Appairage](/docs/channels/pairing#pair-via-telegram-recommended-for-ios).
Boutons inline
Configurez le perimetre du clavier inline :
{
  channels: {
    telegram: {
      capabilities: {
        inlineButtons: "allowlist",
      },
    },
  },
}
Remplacement par compte :
{
  channels: {
    telegram: {
      accounts: {
        main: {
          capabilities: {
            inlineButtons: "allowlist",
          },
        },
      },
    },
  },
}
Perimetres :

- `off`
- `dm`
- `group`
- `all`
- `allowlist` (par defaut)

L'ancien `capabilities: ["inlineButtons"]` correspond a `inlineButtons: "all"`.

Exemple d'action de message :
{
  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" }],
  ],
}
Les clics de callback sont transmis a l'agent sous forme de texte :
`callback_data: <value>`
Actions de message Telegram pour agents et automatisation
Les actions d'outil Telegram incluent :

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

Les actions de message de canal exposent des alias ergonomiques (`send`, `react`, `delete`, `edit`, `sticker`, `sticker-search`, `topic-create`).

Controles :

- `channels.telegram.actions.sendMessage`
- `channels.telegram.actions.deleteMessage`
- `channels.telegram.actions.reactions`
- `channels.telegram.actions.sticker` (par defaut : desactive)

> **Remarque :** `edit` et `topic-create` sont actuellement actives par defaut et n'ont pas de bascules `channels.telegram.actions.*` separees.
Les envois a l'execution utilisent l'instantane actif de configuration/secrets (demarrage/rechargement), donc les chemins d'action n'effectuent pas de re-resolution SecretRef ad-hoc par envoi.

Semantique de suppression de reaction : [/tools/reactions](/docs/tools/reactions)
Tags de fil de reponse
Telegram prend en charge les tags de fil de reponse explicites dans la sortie generee :

- `[[reply_to_current]]` repond au message declencheur
- `[[reply_to:<id>]]` repond a un identifiant de message Telegram specifique

`channels.telegram.replyToMode` controle le comportement :

- `off` (par defaut)
- `first`
- `all`

> **Remarque :** `off` desactive le fil de reponse implicite. Les tags explicites `[[reply_to_*]]` sont toujours honores.
Sujets de forum et comportement des fils
Supergroupes forum :

- les cles de session de sujet ajoutent `:topic:<threadId>`
- les reponses et la saisie ciblent le fil du sujet
- chemin de configuration du sujet :
  `channels.telegram.groups.<chatId>.topics.<threadId>`

Cas special du sujet general (`threadId=1`) :

- les envois de messages omettent `message_thread_id` (Telegram rejette `sendMessage(...thread_id=1)`)
- les actions de saisie incluent toujours `message_thread_id`

Heritage de sujet : les entrees de sujet heritent des parametres du groupe sauf s'ils sont remplaces (`requireMention`, `allowFrom`, `skills`, `systemPrompt`, `enabled`, `groupPolicy`).
`agentId` est specifique au sujet et n'herite pas des valeurs par defaut du groupe.

**Routage d'agent par sujet** : chaque sujet peut router vers un agent different en definissant `agentId` dans la configuration du sujet. Cela donne a chaque sujet son propre espace de travail, memoire et session isoles. Exemple :

```json5
{
  channels: {
    telegram: {
      groups: {
        "-1001234567890": {
          topics: {
            "1": { agentId: "main" },      // Sujet general → agent main
            "3": { agentId: "zu" },        // Sujet Dev → agent zu
            "5": { agentId: "coder" }      // Revue de code → agent coder
          }
        }
      }
    }
  }
}
```

Chaque sujet a alors sa propre cle de session : `agent:zu:telegram:group:-1001234567890:topic:3`

**Liaison ACP persistante par sujet** : les sujets de forum peuvent epingler des sessions de harnais ACP via des liaisons ACP typees au niveau racine :

- `bindings[]` avec `type: "acp"` et `match.channel: "telegram"`

Exemple :

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

Ce perimetre est actuellement limite aux sujets de forum dans les groupes et supergroupes.

**Spawn ACP lie au fil depuis le chat** :

- `/acp spawn <agent> --thread here|auto` peut lier le sujet Telegram actuel a une nouvelle session ACP.
- Les messages suivants dans le sujet sont routes directement vers la session ACP liee (pas de `/acp steer` requis).
- OpenClaw epingle le message de confirmation du spawn dans le sujet apres une liaison reussie.
- Necessite `channels.telegram.threadBindings.spawnAcpSessions=true`.

Le contexte de template inclut :

- `MessageThreadId`
- `IsForum`

Comportement des fils DM :

- les chats prives avec `message_thread_id` conservent le routage DM mais utilisent des cles de session/cibles de reponse tenant compte du fil.
Audio, video et stickers
### Messages audio

Telegram distingue les notes vocales des fichiers audio.

- par defaut : comportement de fichier audio
- tag `[[audio_as_voice]]` dans la reponse de l'agent pour forcer l'envoi en note vocale

Exemple d'action de message :
{
  action: "send",
  channel: "telegram",
  to: "123456789",
  media: "https://example.com/voice.ogg",
  asVoice: true,
}
### Messages video

Telegram distingue les fichiers video des notes video.

Exemple d'action de message :
{
  action: "send",
  channel: "telegram",
  to: "123456789",
  media: "https://example.com/video.mp4",
  asVideoNote: true,
}
Les notes video ne supportent pas les legendes ; le texte du message fourni est envoye separement.

### Stickers

Gestion des stickers entrants :

- WEBP statique : telecharge et traite (placeholder `<media:sticker>`)
- TGS anime : ignore
- WEBM video : ignore

Champs de contexte des stickers :

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

Fichier cache des stickers :

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

Les stickers sont decrits une fois (quand c'est possible) et mis en cache pour reduire les appels de vision repetes.

Activer les actions sticker :
{
  channels: {
    telegram: {
      actions: {
        sticker: true,
      },
    },
  },
}
Envoyer un sticker :
{
  action: "sticker",
  channel: "telegram",
  to: "123456789",
  fileId: "CAACAgIAAxkBAAI...",
}
Rechercher dans les stickers en cache :
{
  action: "sticker-search",
  channel: "telegram",
  query: "cat waving",
  limit: 5,
}
Notifications de reactions
Les reactions Telegram arrivent sous forme de mises a jour `message_reaction` (separees des payloads de message).

Lorsqu'elles sont activees, OpenClaw met en file d'attente des evenements systeme comme :

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

Configuration :

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

Remarques :

- `own` signifie uniquement les reactions des utilisateurs aux messages envoyes par le bot (best-effort via le cache de messages envoyes).
- Les evenements de reaction respectent toujours les controles d'acces Telegram (`dmPolicy`, `allowFrom`, `groupPolicy`, `groupAllowFrom`) ; les expediteurs non autorises sont supprimes.
- Telegram ne fournit pas d'identifiants de fil dans les mises a jour de reaction.
  - les groupes non-forum sont routes vers la session de chat de groupe
  - les groupes forum sont routes vers la session du sujet general du groupe (`:topic:1`), pas le sujet d'origine exact

`allowed_updates` pour le polling/webhook inclut `message_reaction` automatiquement.
Reactions d'accuse de reception
`ackReaction` envoie un emoji d'accuse de reception pendant qu'OpenClaw traite un message entrant.

Ordre de resolution :

- `channels.telegram.accounts.<accountId>.ackReaction`
- `channels.telegram.ackReaction`
- `messages.ackReaction`
- emoji de secours de l'identite de l'agent (`agents.list[].identity.emoji`, sinon "eyes")

Remarques :

- Telegram attend des emojis unicode (par exemple "eyes").
- Utilisez `""` pour desactiver la reaction pour un canal ou un compte.
Ecritures de configuration depuis les evenements et commandes Telegram
Les ecritures de configuration du canal sont activees par defaut (`configWrites !== false`).

Les ecritures declenchees par Telegram incluent :

- les evenements de migration de groupe (`migrate_to_chat_id`) pour mettre a jour `channels.telegram.groups`
- `/config set` et `/config unset` (necessite l'activation des commandes)

Desactivation :
{
  channels: {
    telegram: {
      configWrites: false,
    },
  },
}
Long polling vs webhook
Par defaut : long polling.

Mode webhook :

- definissez `channels.telegram.webhookUrl`
- definissez `channels.telegram.webhookSecret` (requis lorsque l'URL webhook est definie)
- optionnel `channels.telegram.webhookPath` (par defaut `/telegram-webhook`)
- optionnel `channels.telegram.webhookHost` (par defaut `127.0.0.1`)
- optionnel `channels.telegram.webhookPort` (par defaut `8787`)

L'ecouteur local par defaut pour le mode webhook se lie a `127.0.0.1:8787`.

Si votre point de terminaison public differe, placez un reverse proxy devant et pointez `webhookUrl` vers l'URL publique.
Definissez `webhookHost` (par exemple `0.0.0.0`) lorsque vous avez intentionnellement besoin d'un acces externe.
Limites, reessai et cibles CLI
- `channels.telegram.textChunkLimit` par defaut est 4000.
- `channels.telegram.chunkMode="newline"` prefere les limites de paragraphes (lignes vides) avant le decoupage par longueur.
- `channels.telegram.mediaMaxMb` (par defaut 100) plafonne les medias entrants et sortants Telegram.
- `channels.telegram.timeoutSeconds` remplace le timeout du client API Telegram (si non defini, le defaut de grammY s'applique).
- le contexte d'historique de groupe utilise `channels.telegram.historyLimit` ou `messages.groupChat.historyLimit` (par defaut 50) ; `0` desactive.
- controles d'historique DM :
  - `channels.telegram.dmHistoryLimit`
  - `channels.telegram.dms["<user_id>"].historyLimit`
- la configuration `channels.telegram.retry` s'applique aux helpers d'envoi Telegram (CLI/outils/actions) pour les erreurs API sortantes recuperables.

La cible d'envoi CLI peut etre un identifiant de chat numerique ou un nom d'utilisateur :
openclaw message send --channel telegram --target 123456789 --message "hi"
openclaw message send --channel telegram --target @name --message "hi"
Les sondages Telegram utilisent `openclaw message poll` et prennent en charge les sujets de 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
Options de sondage specifiques a Telegram :

- `--poll-duration-seconds` (5-600)
- `--poll-anonymous`
- `--poll-public`
- `--thread-id` pour les sujets de forum (ou utilisez une cible `:topic:`)

Controle des actions :

- `channels.telegram.actions.sendMessage=false` desactive les messages Telegram sortants, y compris les sondages
- `channels.telegram.actions.poll=false` desactive la creation de sondages Telegram tout en laissant les envois normaux actives
Approbations d'execution dans Telegram
Telegram prend en charge les approbations d'execution dans les DMs de l'approbateur et peut optionnellement publier les invites d'approbation dans le chat ou sujet d'origine.

Chemin de configuration :

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

Les approbateurs doivent etre des identifiants utilisateur Telegram numeriques. Lorsque `enabled` est false ou `approvers` est vide, Telegram n'agit pas comme client d'approbation d'execution. Les requetes d'approbation se replient sur d'autres routes d'approbation configurees ou la politique de secours d'approbation d'execution.

Regles de livraison :

- `target: "dm"` envoie les invites d'approbation uniquement aux DMs des approbateurs configures
- `target: "channel"` envoie l'invite vers le chat/sujet Telegram d'origine
- `target: "both"` envoie aux DMs des approbateurs et au chat/sujet d'origine

Seuls les approbateurs configures peuvent approuver ou refuser. Les non-approbateurs ne peuvent pas utiliser `/approve` ni les boutons d'approbation Telegram.

La livraison par salon montre le texte de la commande dans le chat, donc n'activez `channel` ou `both` que dans des groupes/sujets de confiance. Lorsque l'invite arrive dans un sujet de forum, OpenClaw preserve le sujet pour l'invite d'approbation et le suivi post-approbation.

Les boutons d'approbation inline dependent egalement de `channels.telegram.capabilities.inlineButtons` autorisant la surface cible (`dm`, `group`, ou `all`).

Documentation associee : [Approbations d'execution](/docs/tools/exec-approvals)

Depannage

Le bot ne repond pas aux messages de groupe sans mention
- Si `requireMention=false`, le mode confidentialite Telegram doit permettre une visibilite complete.
  - BotFather : `/setprivacy` -> Disable
  - puis retirez + re-ajoutez le bot au groupe
- `openclaw channels status` avertit lorsque la configuration attend des messages de groupe sans mention.
- `openclaw channels status --probe` peut verifier des identifiants de groupe numeriques explicites ; le joker `"*"` ne peut pas etre sonde en termes d'appartenance.
- test rapide de session : `/activation always`.
Le bot ne voit aucun message de groupe
- lorsque `channels.telegram.groups` existe, le groupe doit etre liste (ou inclure `"*"`)
- verifiez l'appartenance du bot au groupe
- consultez les logs : `openclaw logs --follow` pour les raisons de saut
Les commandes fonctionnent partiellement ou pas du tout
- autorisez l'identite de votre expediteur (appairage et/ou `allowFrom` numerique)
- l'autorisation des commandes s'applique toujours meme lorsque la politique de groupe est `open`
- `setMyCommands failed` avec `BOT_COMMANDS_TOO_MUCH` signifie que le menu natif a trop d'entrees ; reduisez les commandes plugin/competence/personnalisees ou desactivez les menus natifs
- `setMyCommands failed` avec des erreurs reseau/fetch indique generalement des problemes d'accessibilite DNS/HTTPS vers `api.telegram.org`
Instabilite du polling ou du reseau
- Node 22+ + fetch/proxy personnalise peut declencher un comportement d'abandon immediat si les types AbortSignal ne correspondent pas.
- Certains hotes resolvent `api.telegram.org` en IPv6 d'abord ; une sortie IPv6 defaillante peut provoquer des echecs intermittents de l'API Telegram.
- Si les logs incluent `TypeError: fetch failed` ou `Network request for 'getUpdates' failed!`, OpenClaw reessaie desormais ces erreurs comme des erreurs reseau recuperables.
- Sur les hotes VPS avec une sortie directe/TLS instable, routez les appels API Telegram via `channels.telegram.proxy` :
channels:
  telegram:
    proxy: socks5://<user>:<password>@proxy-host:1080
- Node 22+ utilise par defaut `autoSelectFamily=true` (sauf WSL2) et `dnsResultOrder=ipv4first`.
- Si votre hote est WSL2 ou fonctionne mieux avec un comportement IPv4 uniquement, forcez la selection de famille :
channels:
  telegram:
    network:
      autoSelectFamily: false
- Variables d'environnement de remplacement (temporaires) :
  - `OPENCLAW_TELEGRAM_DISABLE_AUTO_SELECT_FAMILY=1`
  - `OPENCLAW_TELEGRAM_ENABLE_AUTO_SELECT_FAMILY=1`
  - `OPENCLAW_TELEGRAM_DNS_RESULT_ORDER=ipv4first`
- Validez les reponses DNS :
dig +short api.telegram.org A
dig +short api.telegram.org AAAA

Plus d’aide : Depannage des canaux.

Pointeurs vers la reference de configuration Telegram

Reference principale :

  • channels.telegram.enabled : activer/desactiver le demarrage du canal.

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

  • channels.telegram.tokenFile : lire le token depuis un chemin de fichier regulier. Les liens symboliques sont rejetes.

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

  • channels.telegram.allowFrom : liste d’autorisation DM (identifiants utilisateur Telegram numeriques). allowlist necessite au moins un identifiant d’expediteur. open necessite "*". openclaw doctor --fix peut resoudre les entrees @username anciennes en identifiants et peut recuperer les entrees de liste d’autorisation depuis les fichiers du magasin d’appairage dans les flux de migration de liste d’autorisation.

  • channels.telegram.actions.poll : activer ou desactiver la creation de sondages Telegram (par defaut : active ; necessite toujours sendMessage).

  • channels.telegram.defaultTo : cible Telegram par defaut utilisee par le CLI --deliver lorsqu’aucun --reply-to explicite n’est fourni.

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

  • channels.telegram.groupAllowFrom : liste d’autorisation des expediteurs de groupe (identifiants utilisateur Telegram numeriques). openclaw doctor --fix peut resoudre les entrees @username anciennes en identifiants. Les entrees non numeriques sont ignorees a l’authentification. L’authentification de groupe n’utilise pas le repli du magasin d’appairage DM (2026.2.25+).

  • Priorite multi-comptes :

    • Lorsque deux comptes ou plus sont configures, definissez channels.telegram.defaultAccount (ou incluez channels.telegram.accounts.default) pour rendre le routage par defaut explicite.
    • Si ni l’un ni l’autre n’est defini, OpenClaw se replie sur le premier identifiant de compte normalise et openclaw doctor avertit.
    • channels.telegram.accounts.default.allowFrom et channels.telegram.accounts.default.groupAllowFrom s’appliquent uniquement au compte default.
    • Les comptes nommes heritent de channels.telegram.allowFrom et channels.telegram.groupAllowFrom lorsque les valeurs au niveau du compte ne sont pas definies.
    • Les comptes nommes n’heritent pas de channels.telegram.accounts.default.allowFrom / groupAllowFrom.
  • channels.telegram.groups : valeurs par defaut par groupe + liste d’autorisation (utilisez "*" pour les valeurs par defaut globales).

    • channels.telegram.groups.<id>.groupPolicy : remplacement par groupe pour groupPolicy (open | allowlist | disabled).
    • channels.telegram.groups.<id>.requireMention : valeur par defaut du filtrage par mention.
    • channels.telegram.groups.<id>.skills : filtre de competences (omettre = toutes, vide = aucune).
    • channels.telegram.groups.<id>.allowFrom : remplacement de la liste d’autorisation par expediteur par groupe.
    • channels.telegram.groups.<id>.systemPrompt : prompt systeme supplementaire pour le groupe.
    • channels.telegram.groups.<id>.enabled : desactiver le groupe lorsque false.
    • channels.telegram.groups.<id>.topics.<threadId>.* : remplacements par sujet (champs de groupe + agentId specifique au sujet).
    • channels.telegram.groups.<id>.topics.<threadId>.agentId : router ce sujet vers un agent specifique (remplace le routage au niveau du groupe et des bindings).
  • channels.telegram.groups.<id>.topics.<threadId>.groupPolicy : remplacement par sujet pour groupPolicy (open | allowlist | disabled).

  • channels.telegram.groups.<id>.topics.<threadId>.requireMention : remplacement par sujet du filtrage par mention.

  • bindings[] au niveau racine avec type: "acp" et identifiant de sujet canonique chatId:topic:topicId dans match.peer.id : champs de liaison ACP persistante par sujet (voir Agents ACP).

  • channels.telegram.direct.<id>.topics.<threadId>.agentId : router les sujets DM vers un agent specifique (meme comportement que les sujets de forum).

  • channels.telegram.execApprovals.enabled : activer Telegram comme client d’approbation d’execution par chat pour ce compte.

  • channels.telegram.execApprovals.approvers : identifiants utilisateur Telegram autorises a approuver ou refuser les requetes d’execution. Requis lorsque les approbations d’execution sont activees.

  • channels.telegram.execApprovals.target : dm | channel | both (par defaut : dm). channel et both preservent le sujet Telegram d’origine lorsqu’il est present.

  • channels.telegram.execApprovals.agentFilter : filtre optionnel d’identifiant d’agent pour les invites d’approbation transmises.

  • channels.telegram.execApprovals.sessionFilter : filtre optionnel de cle de session (sous-chaine ou regex) pour les invites d’approbation transmises.

  • channels.telegram.accounts.<account>.execApprovals : remplacement par compte pour le routage et l’autorisation des approbations d’execution Telegram.

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

  • channels.telegram.accounts.<account>.capabilities.inlineButtons : remplacement par compte.

  • channels.telegram.commands.nativeSkills : activer/desactiver les commandes natives de competences Telegram.

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

  • channels.telegram.textChunkLimit : taille des morceaux sortants (caracteres).

  • channels.telegram.chunkMode : length (par defaut) ou newline pour decouper aux lignes vides (limites de paragraphes) avant le decoupage par longueur.

  • channels.telegram.linkPreview : basculer les apercu de liens pour les messages sortants (par defaut : true).

  • channels.telegram.streaming : off | partial | block | progress (apercu en streaming en direct ; par defaut : partial ; progress correspond a partial ; block est le mode de compatibilite d’apercu ancien). Le streaming d’apercu Telegram utilise un seul message d’apercu modifie en place.

  • channels.telegram.mediaMaxMb : plafond media entrant/sortant Telegram (Mo, par defaut : 100).

  • channels.telegram.retry : politique de reessai pour les helpers d’envoi Telegram (CLI/outils/actions) sur les erreurs API sortantes recuperables (attempts, minDelayMs, maxDelayMs, jitter).

  • channels.telegram.network.autoSelectFamily : remplacer Node autoSelectFamily (true=activer, false=desactiver). Active par defaut sur Node 22+, avec WSL2 desactive par defaut.

  • channels.telegram.network.dnsResultOrder : remplacer l’ordre des resultats DNS (ipv4first ou verbatim). Par defaut ipv4first sur Node 22+.

  • channels.telegram.proxy : URL de proxy pour les appels API Bot (SOCKS/HTTP).

  • channels.telegram.webhookUrl : activer le mode webhook (necessite channels.telegram.webhookSecret).

  • channels.telegram.webhookSecret : secret webhook (requis lorsque webhookUrl est defini).

  • channels.telegram.webhookPath : chemin local du webhook (par defaut /telegram-webhook).

  • channels.telegram.webhookHost : hote de liaison local du webhook (par defaut 127.0.0.1).

  • channels.telegram.webhookPort : port de liaison local du webhook (par defaut 8787).

  • channels.telegram.actions.reactions : controle des reactions d’outil Telegram.

  • channels.telegram.actions.sendMessage : controle des envois de messages d’outil Telegram.

  • channels.telegram.actions.deleteMessage : controle des suppressions de messages d’outil Telegram.

  • channels.telegram.actions.sticker : controle des actions sticker Telegram — envoi et recherche (par defaut : false).

  • channels.telegram.reactionNotifications : off | own | all — controle quelles reactions declenchent des evenements systeme (par defaut : own si non defini).

  • channels.telegram.reactionLevel : off | ack | minimal | extensive — controle la capacite de reaction de l’agent (par defaut : minimal si non defini).

  • Reference de configuration - Telegram

Champs Telegram a fort impact :

  • demarrage/auth : enabled, botToken, tokenFile, accounts.* (tokenFile doit pointer vers un fichier regulier ; les liens symboliques sont rejetes)
  • controle d’acces : dmPolicy, allowFrom, groupPolicy, groupAllowFrom, groups, groups.*.topics.*, bindings[] au niveau racine (type: "acp")
  • approbations d’execution : execApprovals, accounts.*.execApprovals
  • commande/menu : commands.native, commands.nativeSkills, customCommands
  • fils/reponses : replyToMode
  • streaming : streaming (apercu), blockStreaming
  • mise en forme/livraison : textChunkLimit, chunkMode, linkPreview, responsePrefix
  • media/reseau : mediaMaxMb, timeoutSeconds, retry, network.autoSelectFamily, proxy
  • webhook : webhookUrl, webhookSecret, webhookPath, webhookHost
  • actions/capacites : capabilities.inlineButtons, actions.sendMessage|editMessage|deleteMessage|reactions|sticker
  • reactions : reactionNotifications, reactionLevel
  • ecritures/historique : configWrites, historyLimit, dmHistoryLimit, dms.*.historyLimit

Liens associes