Prêt pour la production pour les DM et groupes de bot via grammY. Le mode par défaut est le long polling ; le mode webhook est facultatif.Documentation Index
Fetch the complete documentation index at: https://docs.openclaw.ai/llms.txt
Use this file to discover all available pages before exploring further.
Pairing
Channel troubleshooting
Gateway configuration
Configuration rapide
Create the bot token in BotFather
@BotFather).Exécutez /newbot, suivez les invites et enregistrez le token.Configure token and DM policy
TELEGRAM_BOT_TOKEN=... (compte par défaut uniquement).
Telegram n’utilise pas openclaw channels login telegram ; configurez le token dans la configuration/l’environnement, puis démarrez le Gateway.Add the bot to a group
- votre ID utilisateur Telegram, utilisé dans
allowFrom/groupAllowFrom - l’ID de discussion du groupe Telegram, utilisé comme clé sous
channels.telegram.groups
openclaw logs --follow, un bot d’ID transféré ou getUpdates de la Bot API. Une fois le groupe autorisé, /whoami@<bot_username> peut confirmer les ID d’utilisateur et de groupe.Les ID de supergroupes Telegram négatifs qui commencent par -100 sont des ID de discussion de groupe. Placez-les sous channels.telegram.groups, pas sous groupAllowFrom.TELEGRAM_BOT_TOKEN ne s’applique qu’au compte par défaut.Paramètres côté Telegram
Privacy mode and group visibility
Privacy mode and group visibility
- désactiver le mode de confidentialité via
/setprivacy, soit - faire du bot un administrateur du groupe.
Group permissions
Group permissions
Helpful BotFather toggles
Helpful BotFather toggles
/setjoingroupspour autoriser/refuser les ajouts à des groupes/setprivacypour le comportement de visibilité dans les groupes
Contrôle d’accès et activation
- DM policy
- Group policy and allowlists
- Mention behavior
channels.telegram.dmPolicy contrôle l’accès par message direct :pairing(par défaut)allowlist(nécessite au moins un ID d’expéditeur dansallowFrom)open(nécessite queallowFrominclue"*")disabled
dmPolicy: "open" avec allowFrom: ["*"] permet à tout compte Telegram qui trouve ou devine le nom d’utilisateur du bot de commander le bot. Utilisez-le uniquement pour des bots volontairement publics avec des outils strictement restreints ; les bots à propriétaire unique doivent utiliser allowlist avec des ID utilisateur numériques.channels.telegram.allowFrom accepte les ID utilisateur Telegram numériques. Les préfixes telegram: / tg: sont acceptés et normalisés.
Dans les configurations multicomptes, un channels.telegram.allowFrom restrictif de niveau supérieur est traité comme une limite de sécurité : les entrées allowFrom: ["*"] au niveau du compte ne rendent pas ce compte public, sauf si la allowlist effective du compte contient toujours un joker explicite après fusion.
dmPolicy: "allowlist" avec allowFrom vide bloque tous les DM et est rejeté par la validation de configuration.
La configuration demande uniquement des ID utilisateur numériques.
Si vous avez effectué une mise à niveau et que votre configuration contient des entrées de allowlist @username, exécutez openclaw doctor --fix pour les résoudre (au mieux ; nécessite un token de bot Telegram).
Si vous vous appuyiez auparavant sur des fichiers de allowlist du magasin d’appairage, openclaw doctor --fix peut récupérer les entrées dans channels.telegram.allowFrom dans les flux allowlist (par exemple lorsque dmPolicy: "allowlist" n’a pas encore d’ID explicites).Pour les bots à propriétaire unique, préférez dmPolicy: "allowlist" avec des ID numériques allowFrom explicites afin de conserver durablement la politique d’accès dans la configuration (au lieu de dépendre d’approbations d’appairage précédentes).Confusion fréquente : l’approbation d’appairage en DM ne signifie pas « cet expéditeur est autorisé partout ».
L’appairage accorde l’accès aux DM. Si aucun propriétaire de commandes n’existe encore, le premier appairage approuvé définit aussi commands.ownerAllowFrom afin que les commandes réservées au propriétaire et les approbations d’exécution aient un compte opérateur explicite.
L’autorisation de l’expéditeur dans les groupes provient toujours de allowlists de configuration explicites.
Si vous voulez « je suis autorisé une fois, et les DM comme les commandes de groupe fonctionnent », placez votre ID utilisateur Telegram numérique dans channels.telegram.allowFrom ; pour les commandes réservées au propriétaire, assurez-vous que commands.ownerAllowFrom contient telegram:<your user id>.Trouver votre ID utilisateur Telegram
Plus sûr (aucun bot tiers) :- Envoyez un DM à votre bot.
- Exécutez
openclaw logs --follow. - Lisez
from.id.
@userinfobot ou @getidsbot.Comportement à l’exécution
- Telegram appartient au processus Gateway.
- Le routage est déterministe : les messages entrants Telegram répondent vers Telegram (le modèle ne choisit pas les canaux).
- Les messages entrants sont normalisés dans l’enveloppe de canal partagée avec des métadonnées de réponse, des espaces réservés de média et un contexte de chaîne de réponses persistant pour les réponses Telegram que le Gateway a observées.
- Les sessions de groupe sont isolées par ID de groupe. Les sujets de forum ajoutent
:topic:<threadId>pour maintenir les sujets isolés. - Les messages DM peuvent porter
message_thread_id; OpenClaw conserve l’ID de fil pour les réponses mais garde les DM sur la session plate par défaut. Configurezchannels.telegram.dm.threadReplies: "inbound",channels.telegram.direct.<chatId>.threadReplies: "inbound",requireTopic: trueou une configuration de sujet correspondante lorsque vous voulez intentionnellement isoler les sessions de sujet en DM. - Le long polling utilise le runner grammY avec séquencement par discussion/par fil. La concurrence globale du récepteur du runner utilise
agents.defaults.maxConcurrent. - Le long polling est protégé dans chaque processus Gateway afin qu’un seul poller actif puisse utiliser un token de bot à la fois. Si vous voyez encore des conflits
getUpdates409, un autre Gateway OpenClaw, script ou poller externe utilise probablement le même token. - Les redémarrages du watchdog de long polling se déclenchent par défaut après 120 secondes sans vivacité
getUpdatesterminée. Augmentezchannels.telegram.pollingStallThresholdMsuniquement si votre déploiement voit encore de faux redémarrages pour blocage de polling pendant un travail long. La valeur est en millisecondes et est autorisée de30000à600000; les remplacements par compte sont pris en charge. - La Bot API Telegram ne prend pas en charge les accusés de lecture (
sendReadReceiptsne s’applique pas).
Référence des fonctionnalités
Live stream preview (message edits)
Live stream preview (message edits)
- discussions directes : message d’aperçu +
editMessageText - groupes/sujets : message d’aperçu +
editMessageText
channels.telegram.streamingvautoff | partial | block | progress(par défaut :partial)progressconserve un brouillon de statut modifiable pour la progression des outils, l’efface à la fin, puis envoie la réponse finale comme un message normalstreaming.preview.toolProgresscontrôle si les mises à jour d’outil/de progression réutilisent le même message d’aperçu modifié (par défaut :truelorsque le streaming d’aperçu est actif)streaming.preview.commandTextcontrôle le détail des commandes/exécutions dans ces lignes de progression d’outil :raw(par défaut, préserve le comportement publié) oustatus(libellé d’outil uniquement)- les anciens
channels.telegram.streamModeet valeurs booléennesstreamingsont détectés ; exécutezopenclaw doctor --fixpour les migrer verschannels.telegram.streaming.mode
v2026.4.22. Pour conserver l’aperçu modifié pour le texte de réponse tout en masquant les lignes de progression d’outil, définissez :progress lorsque vous voulez une progression d’outil visible sans modifier la réponse finale dans ce même message. Placez la politique de texte de commande sous streaming.progress :streaming.mode: "off" uniquement lorsque vous voulez une livraison finale seule : les modifications d’aperçu Telegram sont désactivées et le bavardage générique d’outil/de progression est supprimé au lieu d’être envoyé comme messages de statut autonomes. Les invites d’approbation, les charges utiles multimédias et les erreurs passent toujours par la livraison finale normale. Utilisez streaming.preview.toolProgress: false lorsque vous voulez seulement conserver les modifications d’aperçu de réponse tout en masquant les lignes de statut de progression d’outil.replyToMode vaut "first", "all" ou "batched" et que le message entrant inclut le texte d’une citation sélectionnée, OpenClaw envoie la réponse finale via le chemin natif de réponse avec citation de Telegram au lieu de modifier l’aperçu de réponse ; streaming.preview.toolProgress ne peut donc pas afficher les courtes lignes de statut pour ce tour. Les réponses au message courant sans texte de citation sélectionnée conservent toujours le streaming d’aperçu. Définissez replyToMode: "off" lorsque la visibilité de la progression d’outil importe davantage que les réponses natives avec citation, ou définissez streaming.preview.toolProgress: false pour accepter le compromis.- aperçus courts en DM/groupe/sujet : OpenClaw conserve le même message d’aperçu et effectue la modification finale sur place
- les finales de texte longues qui se divisent en plusieurs messages Telegram réutilisent l’aperçu existant comme premier bloc final lorsque c’est possible, puis n’envoient que les blocs restants
- les finales en mode progression effacent le brouillon de statut et utilisent la livraison finale normale au lieu de modifier le brouillon pour en faire la réponse
- si la modification finale échoue avant que le texte terminé soit confirmé, OpenClaw utilise la livraison finale normale et nettoie l’aperçu obsolète
/reasoning streamenvoie le raisonnement à l’aperçu en direct pendant la génération- l’aperçu de raisonnement est supprimé après la livraison finale ; utilisez
/reasoning onlorsque le raisonnement doit rester visible - la réponse finale est envoyée sans texte de raisonnement
Mise en forme et repli HTML
Mise en forme et repli HTML
parse_mode: "HTML".- Le texte de type Markdown est rendu en HTML compatible Telegram.
- Les balises HTML prises en charge par Telegram sont préservées ; le HTML non pris en charge est échappé.
- Si Telegram rejette le HTML analysé, OpenClaw réessaie en texte brut.
channels.telegram.linkPreview: false.Commandes natives et commandes personnalisées
Commandes natives et commandes personnalisées
setMyCommands.Valeurs par défaut des commandes natives :commands.native: "auto"active les commandes natives pour Telegram
- les noms sont normalisés (suppression du
/initial, minuscules) - motif valide :
a-z,0-9,_, longueur1..32 - les commandes personnalisées ne peuvent pas remplacer les commandes natives
- les conflits/doublons sont ignorés et journalisés
- les commandes personnalisées sont uniquement des entrées de menu ; elles n’implémentent pas automatiquement un comportement
- les commandes de Plugin/Skills peuvent toujours fonctionner lorsqu’elles sont saisies, même si elles ne s’affichent pas dans le menu Telegram
setMyCommands failedavecBOT_COMMANDS_TOO_MUCHsignifie que le menu Telegram dépassait encore la limite après réduction ; réduisez les commandes de Plugin/Skills/personnalisées ou désactivezchannels.telegram.commands.native.- L’échec de
deleteWebhook,deleteMyCommandsousetMyCommandsavec404: Not Foundalors que les commandes curl directes de l’API Bot fonctionnent peut signifier quechannels.telegram.apiRoota été défini sur le point de terminaison complet/bot<TOKEN>.apiRootdoit être uniquement la racine de l’API Bot, etopenclaw doctor --fixsupprime un suffixe/bot<TOKEN>accidentel. getMe returned 401signifie que Telegram a rejeté le jeton de bot configuré. Mettez à jourbotToken,tokenFileouTELEGRAM_BOT_TOKENavec le jeton BotFather actuel ; OpenClaw s’arrête avant l’interrogation, ce qui évite que cela soit signalé comme un échec de nettoyage de Webhook.setMyCommands failedavec des erreurs réseau/fetch signifie généralement que le DNS/HTTPS sortant versapi.telegram.orgest bloqué.
Commandes d’appairage d’appareil (Plugin device-pair)
Lorsque le Plugin device-pair est installé :/pairgénère un code de configuration- collez le code dans l’application iOS
/pair pendingliste les demandes en attente (y compris rôle/portées)- approuvez la demande :
/pair approve <requestId>pour une approbation explicite/pair approvelorsqu’il n’y a qu’une seule demande en attente/pair approve latestpour la plus récente
scopes: [] ; tout jeton d’opérateur transféré reste limité à operator.approvals, operator.read, operator.talk.secrets et operator.write. Les vérifications de portée d’amorçage sont préfixées par rôle, de sorte que cette liste d’autorisation d’opérateur ne satisfait que les demandes d’opérateur ; les rôles non opérateur ont toujours besoin de portées sous leur propre préfixe de rôle.Si un appareil réessaie avec des détails d’authentification modifiés (par exemple rôle/portées/clé publique), la demande en attente précédente est remplacée et la nouvelle demande utilise un requestId différent. Relancez /pair pending avant d’approuver.Plus de détails : Appairage.Boutons en ligne
Boutons en ligne
offdmgroupallallowlist(par défaut)
capabilities: ["inlineButtons"] est mappé vers inlineButtons: "all".Exemple d’action de message :callback_data: <value>Actions de message Telegram pour les agents et l’automatisation
Actions de message Telegram pour les agents et l’automatisation
sendMessage(to,content, optionnelmediaUrl,replyToMessageId,messageThreadId)react(chatId,messageId,emoji)deleteMessage(chatId,messageId)editMessage(chatId,messageId,content)createForumTopic(chatId,name, optionneliconColor,iconCustomEmojiId)
send, react, delete, edit, sticker, sticker-search, topic-create).Contrôles de restriction :channels.telegram.actions.sendMessagechannels.telegram.actions.deleteMessagechannels.telegram.actions.reactionschannels.telegram.actions.sticker(par défaut : désactivé)
edit et topic-create sont actuellement activés par défaut et n’ont pas de bascules channels.telegram.actions.* distinctes.
Les envois à l’exécution utilisent l’instantané de configuration/secrets actif (démarrage/rechargement), de sorte que les chemins d’action n’effectuent pas de nouvelle résolution SecretRef ponctuelle à chaque envoi.Sémantique de suppression des réactions : /tools/reactionsBalises de fil de réponse
Balises de fil de réponse
[[reply_to_current]]répond au message déclencheur[[reply_to:<id>]]répond à un ID de message Telegram spécifique
channels.telegram.replyToMode contrôle le traitement :off(par défaut)firstall
off désactive le fil de réponse implicite. Les balises explicites [[reply_to_*]] restent honorées.Sujets de forum et comportement des fils
Sujets de forum et comportement des fils
- les clés de session de sujet ajoutent
:topic:<threadId> - les réponses et l’indication de saisie ciblent le fil du sujet
- chemin de configuration du sujet :
channels.telegram.groups.<chatId>.topics.<threadId>
threadId=1) :- les envois de message omettent
message_thread_id(Telegram rejettesendMessage(...thread_id=1)) - les actions de saisie incluent toujours
message_thread_id
requireMention, allowFrom, skills, systemPrompt, enabled, groupPolicy).
agentId est propre au sujet et n’hérite pas des valeurs par défaut du groupe.Routage d’agent par sujet : chaque sujet peut être routé vers un agent différent en définissant agentId dans la configuration du sujet. Cela donne à chaque sujet son propre espace de travail, sa mémoire et sa session isolés. Exemple :agent:zu:telegram:group:-1001234567890:topic:3Liaison persistante de sujet ACP : les sujets de forum peuvent épingler des sessions de harnais ACP via des liaisons ACP typées de premier niveau (bindings[] avec type: "acp" et match.channel: "telegram", peer.kind: "group", et un ID qualifié par sujet comme -1001234567890:topic:42). Actuellement limité aux sujets de forum dans les groupes/supergroupes. Consultez Agents ACP.Création ACP liée au fil depuis le chat : /acp spawn <agent> --thread here|auto lie le sujet actuel à une nouvelle session ACP ; les messages suivants y sont routés directement. OpenClaw épingle la confirmation de création dans le sujet. Nécessite que channels.telegram.threadBindings.spawnSessions reste activé (par défaut : true).Le contexte de modèle expose MessageThreadId et IsForum. Les chats DM avec message_thread_id conservent par défaut le routage DM et les métadonnées de réponse sur des sessions plates ; ils n’utilisent des clés de session tenant compte des fils que lorsqu’ils sont configurés avec threadReplies: "inbound", threadReplies: "always", requireTopic: true ou une configuration de sujet correspondante. Utilisez channels.telegram.dm.threadReplies de premier niveau pour la valeur par défaut du compte, ou direct.<chatId>.threadReplies pour un DM.Audio, vidéo et stickers
Audio, vidéo et stickers
Messages audio
Telegram distingue les notes vocales des fichiers audio.- par défaut : comportement de fichier audio
- balise
[[audio_as_voice]]dans la réponse de l’agent pour forcer l’envoi en note vocale - les transcriptions de notes vocales entrantes sont encadrées comme du texte généré par machine, non fiable, dans le contexte de l’agent ; la détection des mentions utilise toujours la transcription brute afin que les messages vocaux soumis à mention continuent de fonctionner.
Messages vidéo
Telegram distingue les fichiers vidéo des notes vidéo.Exemple d’action de message :Stickers
Gestion des stickers entrants :- WEBP statique : téléchargé et traité (placeholder
<media:sticker>) - TGS animé : ignoré
- WEBM vidéo : ignoré
Sticker.emojiSticker.setNameSticker.fileIdSticker.fileUniqueIdSticker.cachedDescription
~/.openclaw/telegram/sticker-cache.json
Notifications de réaction
Notifications de réaction
message_reaction (distinctes des charges utiles de message).Lorsque cette option est activée, OpenClaw met en file des événements système comme :Telegram reaction added: 👍 by Alice (@alice) on msg 42
channels.telegram.reactionNotifications:off | own | all(par défaut :own)channels.telegram.reactionLevel:off | ack | minimal | extensive(par défaut :minimal)
ownsignifie uniquement les réactions des utilisateurs aux messages envoyés par le bot (au mieux via le cache des messages envoyés).- Les événements de réaction respectent toujours les contrôles d’accès Telegram (
dmPolicy,allowFrom,groupPolicy,groupAllowFrom) ; les expéditeurs non autorisés sont ignorés. - Telegram ne fournit pas d’ID de fil dans les mises à jour de réaction.
- les groupes non-forum sont routés vers la session de chat de groupe
- les groupes de forum sont routés vers la session du sujet général du groupe (
:topic:1), et non vers le sujet d’origine exact
allowed_updates pour polling/Webhook inclut automatiquement message_reaction.Réactions d’accusé de réception
Réactions d’accusé de réception
ackReaction envoie un emoji d’accusé de réception pendant qu’OpenClaw traite un message entrant.Ordre de résolution :channels.telegram.accounts.<accountId>.ackReactionchannels.telegram.ackReactionmessages.ackReaction- repli sur l’emoji d’identité de l’agent (
agents.list[].identity.emoji, sinon ”👀”)
- Telegram attend un emoji Unicode (par exemple ”👀”).
- Utilisez
""pour désactiver la réaction pour un canal ou un compte.
Écritures de configuration depuis les événements et commandes Telegram
Écritures de configuration depuis les événements et commandes Telegram
configWrites !== false).Les écritures déclenchées par Telegram incluent :- les événements de migration de groupe (
migrate_to_chat_id) pour mettre à jourchannels.telegram.groups /config setet/config unset(nécessite l’activation des commandes)
Long polling vs Webhook
Long polling vs Webhook
channels.telegram.webhookUrl et channels.telegram.webhookSecret ; paramètres facultatifs webhookPath, webhookHost, webhookPort (valeurs par défaut /telegram-webhook, 127.0.0.1, 8787).En mode long-polling, OpenClaw ne persiste son filigrane de redémarrage qu’après la distribution réussie d’une mise à jour. Si un gestionnaire échoue, cette mise à jour reste réessayable dans le même processus et n’est pas écrite comme terminée pour la déduplication au redémarrage.L’écouteur local se lie à 127.0.0.1:8787. Pour une entrée publique, placez un proxy inverse devant le port local ou définissez volontairement webhookHost: "0.0.0.0".Le mode Webhook valide les gardes de requête, le jeton secret Telegram et le corps JSON avant de renvoyer 200 à Telegram.
OpenClaw traite ensuite la mise à jour de façon asynchrone via les mêmes files bot par chat/par sujet que celles utilisées par le long polling, afin que les tours d’agent lents ne retiennent pas l’ACK de livraison de Telegram.Limites, nouvelle tentative et cibles CLI
Limites, nouvelle tentative et cibles CLI
- La valeur par défaut de
channels.telegram.textChunkLimitest 4000. channels.telegram.chunkMode="newline"privilégie les limites de paragraphes (lignes vides) avant le découpage par longueur.channels.telegram.mediaMaxMb(par défaut 100) plafonne la taille des médias Telegram entrants et sortants.channels.telegram.mediaGroupFlushMs(par défaut 500) contrôle la durée pendant laquelle les albums/groupes de médias Telegram sont mis en mémoire tampon avant qu’OpenClaw les distribue comme un seul message entrant. Augmentez-la si des parties d’album arrivent tard ; diminuez-la pour réduire la latence de réponse aux albums.channels.telegram.timeoutSecondsremplace le délai d’expiration du client API Telegram (s’il n’est pas défini, la valeur par défaut de grammY s’applique). Les clients bot bornent les valeurs configurées sous le garde de requête de texte/frappe sortant de 60 secondes afin que grammY n’interrompe pas la livraison de réponse visible avant que le garde de transport d’OpenClaw et le repli puissent s’exécuter. Le long polling utilise toujours un garde de requêtegetUpdatesde 45 secondes afin que les polls inactifs ne soient pas abandonnés indéfiniment.channels.telegram.pollingStallThresholdMsvaut par défaut120000; ajustez entre30000et600000uniquement pour les redémarrages sur blocage de polling faussement positifs.- l’historique de contexte de groupe utilise
channels.telegram.historyLimitoumessages.groupChat.historyLimit(par défaut 50) ;0le désactive. - le contexte supplémentaire de réponse/citation/transfert est normalisé dans une seule fenêtre de contexte de conversation sélectionnée lorsque le Gateway a observé les messages parents ; le cache des messages observés est persisté à côté du stockage de session. Telegram n’inclut qu’un seul
reply_to_messagesuperficiel dans les mises à jour, les chaînes plus anciennes que le cache sont donc limitées à la charge utile de mise à jour actuelle de Telegram. - les listes d’autorisation Telegram contrôlent principalement qui peut déclencher l’agent, pas une frontière complète de masquage du contexte supplémentaire.
- Contrôles de l’historique DM :
channels.telegram.dmHistoryLimitchannels.telegram.dms["<user_id>"].historyLimit
- La configuration
channels.telegram.retrys’applique aux helpers d’envoi Telegram (CLI/outils/actions) pour les erreurs d’API sortantes récupérables. La livraison de réponse finale entrante utilise aussi une nouvelle tentative bornée d’envoi sûr pour les échecs de préconnexion Telegram, mais elle ne réessaie pas les enveloppes réseau ambiguës après envoi qui pourraient dupliquer les messages visibles.
openclaw message poll et prennent en charge les sujets de forum :--poll-duration-seconds(5-600)--poll-anonymous--poll-public--thread-idpour les sujets de forum (ou utilisez une cible:topic:)
--presentationavec des blocsbuttonspour les claviers en ligne lorsquechannels.telegram.capabilities.inlineButtonsl’autorise--pinou--delivery '{"pin":true}'pour demander une livraison épinglée lorsque le bot peut épingler dans ce chat--force-documentpour envoyer les images, GIF et vidéos sortants comme documents au lieu d’envois compressés de photo, média animé ou vidéo
channels.telegram.actions.sendMessage=falsedésactive les messages Telegram sortants, y compris les pollschannels.telegram.actions.poll=falsedésactive la création de polls Telegram tout en laissant les envois réguliers activés
Approbations exec dans Telegram
Approbations exec dans Telegram
channels.telegram.execApprovals.enabled(s’active automatiquement lorsqu’au moins un approbateur peut être résolu)channels.telegram.execApprovals.approvers(se replie sur les ID numériques des propriétaires depuiscommands.ownerAllowFrom)channels.telegram.execApprovals.target:dm(par défaut) |channel|bothagentFilter,sessionFilter
channels.telegram.allowFrom, groupAllowFrom et defaultTo contrôlent qui peut parler au bot et où il envoie les réponses normales. Ils ne font pas de quelqu’un un approbateur exec. Le premier appairage DM approuvé amorce commands.ownerAllowFrom lorsqu’aucun propriétaire de commandes n’existe encore, de sorte que la configuration à propriétaire unique fonctionne toujours sans dupliquer les ID sous execApprovals.approvers.La livraison au canal affiche le texte de la commande dans le chat ; n’activez channel ou both que dans des groupes/sujets de confiance. Lorsque l’invite arrive dans un sujet de forum, OpenClaw conserve le sujet pour l’invite d’approbation et le suivi. Les approbations exec expirent par défaut après 30 minutes.Les boutons d’approbation en ligne nécessitent aussi que channels.telegram.capabilities.inlineButtons autorise la surface cible (dm, group ou all). Les ID d’approbation préfixés par plugin: sont résolus via les approbations de Plugin ; les autres sont d’abord résolus via les approbations exec.Consultez Approbations exec.Contrôles des réponses d’erreur
Lorsque l’agent rencontre une erreur de livraison ou de fournisseur, Telegram peut répondre avec le texte de l’erreur ou le supprimer. Deux clés de configuration contrôlent ce comportement :| Clé | Valeurs | Par défaut | Description |
|---|---|---|---|
channels.telegram.errorPolicy | reply, silent | reply | reply envoie un message d’erreur convivial au chat. silent supprime entièrement les réponses d’erreur. |
channels.telegram.errorCooldownMs | nombre (ms) | 60000 | Temps minimal entre les réponses d’erreur au même chat. Évite le spam d’erreurs pendant les pannes. |
Dépannage
Le bot ne répond pas aux messages de groupe sans mention
Le bot ne répond pas aux messages de groupe sans mention
- Si
requireMention=false, le mode de confidentialité Telegram doit autoriser une visibilité complète.- BotFather :
/setprivacy-> Disable - puis supprimez et réajoutez le bot au groupe
- BotFather :
openclaw channels statusavertit lorsque la configuration attend des messages de groupe sans mention.openclaw channels status --probepeut vérifier des ID de groupe numériques explicites ; le caractère générique"*"ne peut pas faire l’objet d’une vérification d’appartenance.- test rapide de session :
/activation always.
Le bot ne voit aucun message de groupe
Le bot ne voit aucun message de groupe
- lorsque
channels.telegram.groupsexiste, le groupe doit être listé (ou inclure"*") - vérifiez l’appartenance du bot au groupe
- consultez les journaux :
openclaw logs --followpour les raisons d’ignorance
Les commandes fonctionnent partiellement ou pas du tout
Les commandes fonctionnent partiellement ou pas du tout
- autorisez l’identité de votre expéditeur (appariement et/ou
allowFromnumérique) - l’autorisation des commandes s’applique toujours même lorsque la stratégie de groupe est
open setMyCommands failedavecBOT_COMMANDS_TOO_MUCHsignifie que le menu natif contient trop d’entrées ; réduisez les commandes de plugins/Skills/personnalisées ou désactivez les menus natifs- les appels de démarrage
deleteMyCommands/setMyCommandset les appels de saisiesendChatActionsont bornés et réessayent une fois via le repli de transport de Telegram en cas d’expiration de la requête. Les erreurs réseau/fetch persistantes indiquent généralement des problèmes d’accessibilité DNS/HTTPS versapi.telegram.org
Le démarrage signale un jeton non autorisé
Le démarrage signale un jeton non autorisé
getMe returned 401est un échec d’authentification Telegram pour le jeton de bot configuré.- Recopiez ou régénérez le jeton du bot dans BotFather, puis mettez à jour
channels.telegram.botToken,channels.telegram.tokenFile,channels.telegram.accounts.<id>.botTokenouTELEGRAM_BOT_TOKENpour le compte par défaut. deleteWebhook 401 Unauthorizedpendant le démarrage est également un échec d’authentification ; le traiter comme « aucun webhook n’existe » ne ferait que reporter le même échec de mauvais jeton à des appels d’API ultérieurs.
Instabilité de l’interrogation ou du réseau
Instabilité de l’interrogation ou du réseau
- Node 22+ avec un fetch/proxy personnalisé peut déclencher un comportement d’abandon immédiat si les types AbortSignal ne correspondent pas.
- Certains hôtes résolvent d’abord
api.telegram.orgen IPv6 ; une sortie IPv6 défectueuse peut provoquer des échecs intermittents de l’API Telegram. - Si les journaux incluent
TypeError: fetch failedouNetwork request for 'getUpdates' failed!, OpenClaw réessaie désormais ces erreurs comme des erreurs réseau récupérables. - Pendant le démarrage de l’interrogation, OpenClaw réutilise la sonde de démarrage
getMeréussie pour grammY afin que l’exécuteur n’ait pas besoin d’un secondgetMeavant le premiergetUpdates. - Si
deleteWebhookéchoue avec une erreur réseau transitoire pendant le démarrage de l’interrogation, OpenClaw passe à l’interrogation longue au lieu d’effectuer un autre appel de plan de contrôle avant interrogation. Un webhook encore actif apparaît comme un conflitgetUpdates; OpenClaw reconstruit alors le transport Telegram et réessaie le nettoyage du webhook. - Si les sockets Telegram sont recyclés selon une cadence fixe courte, vérifiez si
channels.telegram.timeoutSecondsest bas ; les clients de bot bornent les valeurs configurées sous les gardes de requêtes sortantes etgetUpdates, mais les anciennes versions pouvaient abandonner chaque interrogation ou réponse lorsque cette valeur était définie sous ces gardes. - Si les journaux incluent
Polling stall detected, OpenClaw redémarre l’interrogation et reconstruit le transport Telegram après 120 secondes sans activité de l’interrogation longue terminée par défaut. openclaw channels status --probeetopenclaw doctoravertissent lorsqu’un compte d’interrogation en cours d’exécution n’a pas terminégetUpdatesaprès le délai de grâce de démarrage, lorsqu’un compte webhook en cours d’exécution n’a pas terminésetWebhookaprès le délai de grâce de démarrage, ou lorsque la dernière activité réussie du transport d’interrogation est obsolète.- Augmentez
channels.telegram.pollingStallThresholdMsuniquement lorsque les appelsgetUpdatesde longue durée sont sains, mais que votre hôte signale encore à tort des redémarrages pour blocage de l’interrogation. Les blocages persistants indiquent généralement des problèmes de proxy, DNS, IPv6 ou sortie TLS entre l’hôte etapi.telegram.org. - Telegram respecte également les variables d’environnement de proxy du processus pour le transport Bot API, notamment
HTTP_PROXY,HTTPS_PROXY,ALL_PROXYet leurs variantes en minuscules.NO_PROXY/no_proxypeut toujours contournerapi.telegram.org. - Si le proxy géré par OpenClaw est configuré via
OPENCLAW_PROXY_URLpour un environnement de service et qu’aucune variable d’environnement de proxy standard n’est présente, Telegram utilise aussi cette URL pour le transport Bot API. - Sur les hôtes VPS avec une sortie directe/TLS instable, routez les appels API Telegram via
channels.telegram.proxy:
- Node 22+ utilise par défaut
autoSelectFamily=true(sauf WSL2). L’ordre des résultats DNS Telegram respecteOPENCLAW_TELEGRAM_DNS_RESULT_ORDER, puischannels.telegram.network.dnsResultOrder, puis la valeur par défaut du processus commeNODE_OPTIONS=--dns-result-order=ipv4first; si aucune ne s’applique, Node 22+ revient àipv4first. - Si votre hôte est WSL2 ou fonctionne explicitement mieux avec un comportement IPv4 uniquement, forcez la sélection de famille :
- Les réponses de plage de benchmark RFC 2544 (
198.18.0.0/15) sont déjà autorisées pour les téléchargements de médias Telegram par défaut. Si un faux IP de confiance ou un proxy transparent réécritapi.telegram.orgvers une autre adresse privée/interne/à usage spécial pendant les téléchargements de médias, vous pouvez activer le contournement propre à Telegram :
- La même activation est disponible par compte à
channels.telegram.accounts.<accountId>.network.dangerouslyAllowPrivateNetwork. - Si votre proxy résout les hôtes de médias Telegram en
198.18.x.x, laissez d’abord l’indicateur dangereux désactivé. Les médias Telegram autorisent déjà la plage de benchmark RFC 2544 par défaut.
- Remplacements d’environnement (temporaires) :
OPENCLAW_TELEGRAM_DISABLE_AUTO_SELECT_FAMILY=1OPENCLAW_TELEGRAM_ENABLE_AUTO_SELECT_FAMILY=1OPENCLAW_TELEGRAM_DNS_RESULT_ORDER=ipv4first
- Validez les réponses DNS :
Référence de configuration
Référence principale : Référence de configuration - Telegram.Champs Telegram à signal élevé
Champs Telegram à signal élevé
- démarrage/authentification :
enabled,botToken,tokenFile,accounts.*(tokenFiledoit pointer vers un fichier ordinaire ; les liens symboliques sont rejetés) - contrôle d’accès :
dmPolicy,allowFrom,groupPolicy,groupAllowFrom,groups,groups.*.topics.*,bindings[]de premier niveau (type: "acp") - approbations exec :
execApprovals,accounts.*.execApprovals - commande/menu :
commands.native,commands.nativeSkills,customCommands - fils/réponses :
replyToMode,dm.threadReplies,direct.*.threadReplies - streaming :
streaming(aperçu),streaming.preview.toolProgress,blockStreaming - formatage/livraison :
textChunkLimit,chunkMode,linkPreview,responsePrefix - médias/réseau :
mediaMaxMb,mediaGroupFlushMs,timeoutSeconds,pollingStallThresholdMs,retry,network.autoSelectFamily,network.dangerouslyAllowPrivateNetwork,proxy - racine d’API personnalisée :
apiRoot(racine Bot API uniquement ; n’incluez pas/bot<TOKEN>) - webhook :
webhookUrl,webhookSecret,webhookPath,webhookHost - actions/capacités :
capabilities.inlineButtons,actions.sendMessage|editMessage|deleteMessage|reactions|sticker - réactions :
reactionNotifications,reactionLevel - erreurs :
errorPolicy,errorCooldownMs - écritures/historique :
configWrites,historyLimit,dmHistoryLimit,dms.*.historyLimit
channels.telegram.defaultAccount (ou incluez channels.telegram.accounts.default) pour rendre le routage par défaut explicite. Sinon, OpenClaw revient au premier ID de compte normalisé et openclaw doctor avertit. Les comptes nommés héritent de channels.telegram.allowFrom / groupAllowFrom, mais pas des valeurs accounts.default.*.