Mainstream messaging
Telegram
Produktionsreif für Bot-DMs und Gruppen über grammY. Long Polling ist der Standardmodus; der Webhook-Modus ist optional.
Die Standard-DM-Richtlinie für Telegram ist Pairing.
Kanalübergreifende Diagnosen und Reparatur-Playbooks.
Vollständige Kanalkonfigurationsmuster und Beispiele.
Schnelle Einrichtung
Create the bot token in BotFather
Öffnen Sie Telegram und chatten Sie mit @BotFather (prüfen Sie, dass der Handle exakt @BotFather lautet).
Führen Sie /newbot aus, folgen Sie den Anweisungen und speichern Sie das Token.
Configure token and DM policy
{
channels: {
telegram: {
enabled: true,
botToken: "123:abc",
dmPolicy: "pairing",
groups: { "*": { requireMention: true } },
},
},
}
Env-Fallback: TELEGRAM_BOT_TOKEN=... (nur Standardkonto).
Telegram verwendet nicht openclaw channels login telegram; konfigurieren Sie das Token in der Konfiguration/Env und starten Sie dann den Gateway.
Start gateway and approve first DM
openclaw gateway
openclaw pairing list telegram
openclaw pairing approve telegram <CODE>
Pairing-Codes laufen nach 1 Stunde ab.
Add the bot to a group
Fügen Sie den Bot zu Ihrer Gruppe hinzu und setzen Sie dann channels.telegram.groups und groupPolicy passend zu Ihrem Zugriffsmodell.
Einstellungen auf Telegram-Seite
Privacy mode and group visibility
Telegram-Bots verwenden standardmäßig den Privacy Mode, der begrenzt, welche Gruppennachrichten sie empfangen.
Wenn der Bot alle Gruppennachrichten sehen muss, entweder:
- deaktivieren Sie den Privacy Mode über
/setprivacy, oder - machen Sie den Bot zum Gruppenadmin.
Wenn Sie den Privacy Mode umschalten, entfernen Sie den Bot in jeder Gruppe und fügen Sie ihn erneut hinzu, damit Telegram die Änderung anwendet.
Group permissions
Der Admin-Status wird in den Telegram-Gruppeneinstellungen gesteuert.
Admin-Bots empfangen alle Gruppennachrichten, was für dauerhaft aktives Gruppenverhalten nützlich ist.
Helpful BotFather toggles
/setjoingroups, um das Hinzufügen zu Gruppen zu erlauben/zu verweigern/setprivacyfür das Sichtbarkeitsverhalten in Gruppen
Zugriffskontrolle und Aktivierung
DM policy
channels.telegram.dmPolicy steuert den Zugriff auf Direktnachrichten:
pairing(Standard)allowlist(erfordert mindestens eine Absender-ID inallowFrom)open(erfordert, dassallowFrom"*"enthält)disabled
dmPolicy: "open" mit allowFrom: ["*"] erlaubt jedem Telegram-Konto, das den Bot-Benutzernamen findet oder errät, dem Bot Befehle zu geben. Verwenden Sie dies nur für absichtlich öffentliche Bots mit stark eingeschränkten Tools; Bots mit einem Owner sollten allowlist mit numerischen Benutzer-IDs verwenden.
channels.telegram.allowFrom akzeptiert numerische Telegram-Benutzer-IDs. Präfixe telegram: / tg: werden akzeptiert und normalisiert.
In Mehrkontokonfigurationen wird ein restriktives channels.telegram.allowFrom auf oberster Ebene als Sicherheitsgrenze behandelt: Kontoebenen-Einträge allowFrom: ["*"] machen dieses Konto nicht öffentlich, es sei denn, die effektive Allowlist des Kontos enthält nach dem Zusammenführen weiterhin einen expliziten Platzhalter.
dmPolicy: "allowlist" mit leerem allowFrom blockiert alle DMs und wird von der Konfigurationsvalidierung abgelehnt.
Die Einrichtung fragt nur nach numerischen Benutzer-IDs.
Wenn Sie ein Upgrade durchgeführt haben und Ihre Konfiguration @username-Allowlist-Einträge enthält, führen Sie openclaw doctor --fix aus, um sie aufzulösen (Best-Effort; erfordert ein Telegram-Bot-Token).
Wenn Sie sich zuvor auf Pairing-Store-Allowlist-Dateien verlassen haben, kann openclaw doctor --fix Einträge in Allowlist-Flows nach channels.telegram.allowFrom wiederherstellen (zum Beispiel, wenn dmPolicy: "allowlist" noch keine expliziten IDs hat).
Für Bots mit einem Owner bevorzugen Sie dmPolicy: "allowlist" mit expliziten numerischen allowFrom-IDs, damit die Zugriffsrichtlinie dauerhaft in der Konfiguration liegt (statt von früheren Pairing-Genehmigungen abzuhängen).
Häufige Verwechslung: DM-Pairing-Genehmigung bedeutet nicht „dieser Absender ist überall autorisiert“.
Pairing gewährt DM-Zugriff. Wenn noch kein Befehls-Owner existiert, setzt das erste genehmigte Pairing auch commands.ownerAllowFrom, sodass nur für Owner bestimmte Befehle und Exec-Genehmigungen ein explizites Operator-Konto haben.
Die Absenderautorisierung in Gruppen kommt weiterhin aus expliziten Konfigurations-Allowlists.
Wenn Sie möchten: „Ich bin einmal autorisiert und sowohl DMs als auch Gruppenbefehle funktionieren“, tragen Sie Ihre numerische Telegram-Benutzer-ID in channels.telegram.allowFrom ein; stellen Sie für nur für Owner bestimmte Befehle sicher, dass commands.ownerAllowFrom telegram:<your user id> enthält.
Ihre Telegram-Benutzer-ID finden
Sicherer (kein Drittanbieter-Bot):
- Senden Sie Ihrem Bot eine DM.
- Führen Sie
openclaw logs --followaus. - Lesen Sie
from.id.
Offizielle Bot-API-Methode:
curl "https://api.telegram.org/bot<bot_token>/getUpdates"
Drittanbieter-Methode (weniger privat): @userinfobot oder @getidsbot.
Group policy and allowlists
Zwei Steuerelemente gelten zusammen:
-
Welche Gruppen erlaubt sind (
channels.telegram.groups)- keine
groups-Konfiguration:- mit
groupPolicy: "open": Jede Gruppe kann Gruppen-ID-Prüfungen bestehen - mit
groupPolicy: "allowlist"(Standard): Gruppen werden blockiert, bis Siegroups-Einträge (oder"*") hinzufügen
- mit
groupskonfiguriert: wirkt als Allowlist (explizite IDs oder"*")
- keine
-
Welche Absender in Gruppen erlaubt sind (
channels.telegram.groupPolicy)openallowlist(Standard)disabled
groupAllowFrom wird für das Filtern von Gruppenabsendern verwendet. Wenn nicht gesetzt, fällt Telegram auf allowFrom zurück.
groupAllowFrom-Einträge sollten numerische Telegram-Benutzer-IDs sein (Präfixe telegram: / tg: werden normalisiert).
Legen Sie keine Telegram-Gruppen- oder Supergruppen-Chat-IDs in groupAllowFrom ab. Negative Chat-IDs gehören unter channels.telegram.groups.
Nicht numerische Einträge werden für die Absenderautorisierung ignoriert.
Sicherheitsgrenze (2026.2.25+): Gruppenabsender-Auth erbt keine Genehmigungen aus dem DM-Pairing-Store.
Pairing bleibt DM-only. Setzen Sie für Gruppen groupAllowFrom oder pro Gruppe/pro Thema allowFrom.
Wenn groupAllowFrom nicht gesetzt ist, fällt Telegram auf die Konfiguration allowFrom zurück, nicht auf den Pairing-Store.
Praktisches Muster für Bots mit einem Owner: Setzen Sie Ihre Benutzer-ID in channels.telegram.allowFrom, lassen Sie groupAllowFrom ungesetzt und erlauben Sie die Zielgruppen unter channels.telegram.groups.
Laufzeithinweis: Wenn channels.telegram vollständig fehlt, verwendet die Laufzeit standardmäßig fail-closed groupPolicy="allowlist", es sei denn, channels.defaults.groupPolicy ist explizit gesetzt.
Beispiel: beliebige Mitglieder in einer bestimmten Gruppe erlauben:
{
channels: {
telegram: {
groups: {
"-1001234567890": {
groupPolicy: "open",
requireMention: false,
},
},
},
},
}
Beispiel: nur bestimmte Benutzer innerhalb einer bestimmten Gruppe erlauben:
{
channels: {
telegram: {
groups: {
"-1001234567890": {
requireMention: true,
allowFrom: ["8734062810", "745123456"],
},
},
},
},
}
Mention behavior
Gruppenantworten erfordern standardmäßig eine Erwähnung.
Die Erwähnung kann kommen von:
- nativer
@botusername-Erwähnung, oder - Erwähnungsmustern in:
agents.list[].groupChat.mentionPatternsmessages.groupChat.mentionPatterns
Befehlsumschalter auf Sitzungsebene:
/activation always/activation mention
Diese aktualisieren nur den Sitzungsstatus. Verwenden Sie die Konfiguration für Persistenz.
Beispiel für persistente Konfiguration:
{
channels: {
telegram: {
groups: {
"*": { requireMention: false },
},
},
},
}
Die Gruppen-Chat-ID erhalten:
- Leiten Sie eine Gruppennachricht an
@userinfobot/@getidsbotweiter - oder lesen Sie
chat.idausopenclaw logs --follow - oder prüfen Sie Bot API
getUpdates
Laufzeitverhalten
- Telegram gehört zum Gateway-Prozess.
- Das Routing ist deterministisch: Telegram-Eingänge antworten zurück an Telegram (das Modell wählt keine Kanäle aus).
- Eingehende Nachrichten werden in den gemeinsamen Kanal-Umschlag mit Antwortmetadaten und Medienplatzhaltern normalisiert.
- Gruppensitzungen werden nach Gruppen-ID isoliert. Forum-Themen hängen
:topic:<threadId>an, damit Themen isoliert bleiben. - DM-Nachrichten können
message_thread_identhalten; OpenClaw behält die Thread-ID für Antworten bei, hält DMs aber standardmäßig auf der flachen Sitzung. Konfigurieren Siechannels.telegram.dm.threadReplies: "inbound",channels.telegram.direct.<chatId>.threadReplies: "inbound",requireTopic: trueoder eine passende Themenkonfiguration, wenn Sie absichtlich DM-Themensitzungsisolation möchten. - Long Polling verwendet grammY runner mit Sequenzierung pro Chat/pro Thread. Die gesamte runner-sink-Parallelität verwendet
agents.defaults.maxConcurrent. - Long Polling ist innerhalb jedes Gateway-Prozesses geschützt, sodass jeweils nur ein aktiver Poller ein Bot-Token verwenden kann. Wenn Sie weiterhin
getUpdates-409-Konflikte sehen, verwendet wahrscheinlich ein anderer OpenClaw-Gateway, ein Skript oder ein externer Poller dasselbe Token. - Neustarts des Long-Polling-Watchdogs werden standardmäßig nach 120 Sekunden ohne abgeschlossene
getUpdates-Liveness ausgelöst. Erhöhen Siechannels.telegram.pollingStallThresholdMsnur, wenn Ihre Bereitstellung während lang laufender Arbeit weiterhin falsche Polling-Stall-Neustarts sieht. Der Wert ist in Millisekunden angegeben und von30000bis600000erlaubt; Überschreibungen pro Konto werden unterstützt. - Die Telegram Bot API unterstützt keine Lesebestätigungen (
sendReadReceiptsgilt nicht).
Funktionsreferenz
Live stream preview (message edits)
OpenClaw kann Teilantworten in Echtzeit streamen:
- direkte Chats: Vorschaunachricht +
editMessageText - Gruppen/Themen: Vorschaunachricht +
editMessageText
Voraussetzung:
channels.telegram.streamingistoff | partial | block | progress(Standard:partial)progresshält einen bearbeitbaren Statusentwurf für Tool-Fortschritt, löscht ihn beim Abschluss und sendet die finale Antwort als normale Nachrichtstreaming.preview.toolProgresssteuert, ob Tool-/Fortschrittsupdates dieselbe bearbeitete Vorschaunachricht wiederverwenden (Standard:true, wenn Vorschau-Streaming aktiv ist)streaming.preview.commandTextsteuert Befehls-/Exec-Details innerhalb dieser Tool-Fortschrittszeilen:raw(Standard, bewahrt veröffentlichtes Verhalten) oderstatus(nur Tool-Label)- Legacy-
channels.telegram.streamModeund booleschestreaming-Werte werden erkannt; führen Sieopenclaw doctor --fixaus, um sie nachchannels.telegram.streaming.modezu migrieren
Tool-Fortschrittsvorschau-Updates sind die kurzen Statuszeilen, die angezeigt werden, während Tools laufen, zum Beispiel Befehlsausführung, Dateilesevorgänge, Planungsupdates oder Patch-Zusammenfassungen. Telegram lässt diese standardmäßig aktiviert, um dem veröffentlichten OpenClaw-Verhalten ab v2026.4.22 und später zu entsprechen. Um die bearbeitete Vorschau für Antworttext beizubehalten, aber Tool-Fortschrittszeilen auszublenden, setzen Sie:
{
"channels": {
"telegram": {
"streaming": {
"mode": "partial",
"preview": {
"toolProgress": false
}
}
}
}
}
Um Tool-Fortschritt sichtbar zu halten, aber Befehls-/Exec-Text auszublenden, setzen Sie:
{
"channels": {
"telegram": {
"streaming": {
"mode": "partial",
"preview": {
"commandText": "status"
}
}
}
}
}
Verwenden Sie den Modus progress, wenn sichtbarer Tool-Fortschritt angezeigt werden soll, ohne die finale Antwort in dieselbe Nachricht hineinzubearbeiten. Legen Sie die Richtlinie für Befehlstext unter streaming.progress ab:
{
"channels": {
"telegram": {
"streaming": {
"mode": "progress",
"progress": {
"toolProgress": true,
"commandText": "status"
}
}
}
}
}
Verwenden Sie streaming.mode: "off" nur, wenn Sie ausschließlich finale Zustellung wünschen: Telegram-Vorschauänderungen sind deaktiviert, und generisches Tool-/Fortschrittsgeplauder wird unterdrückt, statt als eigenständige Statusmeldungen gesendet zu werden. Genehmigungsaufforderungen, Medien-Payloads und Fehler werden weiterhin über die normale finale Zustellung geleitet. Verwenden Sie streaming.preview.toolProgress: false, wenn Sie nur Antwortvorschau-Änderungen beibehalten möchten, während die Tool-Fortschrittsstatuszeilen ausgeblendet werden.
Für reine Textantworten:
- kurze Vorschauen in DMs/Gruppen/Themen: OpenClaw behält dieselbe Vorschaunachricht bei und führt die finale Bearbeitung direkt daran aus
- lange finale Textantworten, die in mehrere Telegram-Nachrichten aufgeteilt werden, verwenden die vorhandene Vorschau nach Möglichkeit als ersten finalen Chunk wieder und senden danach nur die verbleibenden Chunks
- Finale Antworten im Fortschrittsmodus löschen den Statusentwurf und verwenden die normale finale Zustellung, statt den Entwurf in die Antwort umzuwandeln
- wenn die finale Bearbeitung fehlschlägt, bevor der vollständige Text bestätigt wurde, verwendet OpenClaw die normale finale Zustellung und bereinigt die veraltete Vorschau
Bei komplexen Antworten (zum Beispiel Medien-Payloads) fällt OpenClaw auf die normale finale Zustellung zurück und bereinigt anschließend die Vorschaunachricht.
Vorschau-Streaming ist von Block-Streaming getrennt. Wenn Block-Streaming für Telegram ausdrücklich aktiviert ist, überspringt OpenClaw den Vorschau-Stream, um doppeltes Streaming zu vermeiden.
Reiner Telegram-Reasoning-Stream:
/reasoning streamsendet Reasoning während der Generierung an die Live-Vorschau- die Reasoning-Vorschau wird nach der finalen Zustellung gelöscht; verwenden Sie
/reasoning on, wenn Reasoning sichtbar bleiben soll - die finale Antwort wird ohne Reasoning-Text gesendet
Formatting and HTML fallback
Ausgehender Text verwendet Telegram parse_mode: "HTML".
- Markdown-ähnlicher Text wird in Telegram-sicheres HTML gerendert.
- Rohes Modell-HTML wird escaped, um Telegram-Parse-Fehler zu reduzieren.
- Wenn Telegram geparstes HTML ablehnt, versucht OpenClaw es erneut als Klartext.
Linkvorschauen sind standardmäßig aktiviert und können mit channels.telegram.linkPreview: false deaktiviert werden.
Native commands and custom commands
Die Registrierung des Telegram-Befehlsmenüs wird beim Start mit setMyCommands verarbeitet.
Standardwerte für native Befehle:
commands.native: "auto"aktiviert native Befehle für Telegram
Benutzerdefinierte Befehlsmenüeinträge hinzufügen:
{
channels: {
telegram: {
customCommands: [
{ command: "backup", description: "Git backup" },
{ command: "generate", description: "Create an image" },
],
},
},
}
Regeln:
- Namen werden normalisiert (führendes
/entfernen, Kleinbuchstaben) - gültiges Muster:
a-z,0-9,_, Länge1..32 - benutzerdefinierte Befehle können native Befehle nicht überschreiben
- Konflikte/Duplikate werden übersprungen und protokolliert
Hinweise:
- benutzerdefinierte Befehle sind nur Menüeinträge; sie implementieren kein Verhalten automatisch
- Plugin-/Skill-Befehle können weiterhin funktionieren, wenn sie eingegeben werden, auch wenn sie im Telegram-Menü nicht angezeigt werden
Wenn native Befehle deaktiviert sind, werden integrierte Befehle entfernt. Benutzerdefinierte/Plugin-Befehle können sich weiterhin registrieren, wenn sie konfiguriert sind.
Häufige Einrichtungsfehler:
setMyCommands failedmitBOT_COMMANDS_TOO_MUCHbedeutet, dass das Telegram-Menü auch nach dem Kürzen noch übergelaufen ist; reduzieren Sie Plugin-/Skill-/benutzerdefinierte Befehle oder deaktivieren Siechannels.telegram.commands.native.- Wenn
deleteWebhook,deleteMyCommandsodersetMyCommandsmit404: Not Foundfehlschlagen, während direkte Bot-API-curl-Befehle funktionieren, kann das bedeuten, dasschannels.telegram.apiRootauf den vollständigen/bot<TOKEN>-Endpunkt gesetzt wurde.apiRootdarf nur die Bot-API-Wurzel sein, undopenclaw doctor --fixentfernt ein versehentliches abschließendes/bot<TOKEN>. getMe returned 401bedeutet, dass Telegram das konfigurierte Bot-Token abgelehnt hat. Aktualisieren SiebotToken,tokenFileoderTELEGRAM_BOT_TOKENmit dem aktuellen BotFather-Token; OpenClaw stoppt vor dem Polling, daher wird dies nicht als Webhook-Bereinigungsfehler gemeldet.setMyCommands failedmit Netzwerk-/Fetch-Fehlern bedeutet in der Regel, dass ausgehendes DNS/HTTPS zuapi.telegram.orgblockiert ist.
Gerätekopplungsbefehle (device-pair-Plugin)
Wenn das device-pair-Plugin installiert ist:
/pairerzeugt Einrichtungscode- Code in der iOS-App einfügen
/pair pendinglistet ausstehende Anfragen auf (einschließlich Rolle/Scopes)- die Anfrage genehmigen:
/pair approve <requestId>für explizite Genehmigung/pair approve, wenn nur eine ausstehende Anfrage vorhanden ist/pair approve latestfür die neueste
Der Einrichtungscode enthält ein kurzlebiges Bootstrap-Token. Die integrierte Bootstrap-Übergabe hält das primäre Node-Token bei scopes: []; jedes übergebene Operator-Token bleibt auf operator.approvals, operator.read, operator.talk.secrets und operator.write begrenzt. Bootstrap-Scope-Prüfungen sind rollenpräfigiert, daher erfüllt diese Operator-Allowlist nur Operator-Anfragen; Nicht-Operator-Rollen benötigen weiterhin Scopes unter ihrem eigenen Rollenpräfix.
Wenn ein Gerät es mit geänderten Authentifizierungsdetails erneut versucht (zum Beispiel Rolle/Scopes/öffentlicher Schlüssel), wird die vorherige ausstehende Anfrage ersetzt, und die neue Anfrage verwendet eine andere requestId. Führen Sie /pair pending erneut aus, bevor Sie genehmigen.
Weitere Details: Kopplung.
Inline buttons
Inline-Keyboard-Scope konfigurieren:
{
channels: {
telegram: {
capabilities: {
inlineButtons: "allowlist",
},
},
},
}
Überschreibung pro Konto:
{
channels: {
telegram: {
accounts: {
main: {
capabilities: {
inlineButtons: "allowlist",
},
},
},
},
},
}
Scopes:
offdmgroupallallowlist(Standard)
Veraltetes capabilities: ["inlineButtons"] wird auf inlineButtons: "all" abgebildet.
Beispiel für Nachrichtenaktion:
{
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" }],
],
}
Callback-Klicks werden als Text an den Agenten übergeben:
callback_data: <value>
Telegram message actions for agents and automation
Telegram-Tool-Aktionen umfassen:
sendMessage(to,content, optionalmediaUrl,replyToMessageId,messageThreadId)react(chatId,messageId,emoji)deleteMessage(chatId,messageId)editMessage(chatId,messageId,content)createForumTopic(chatId,name, optionaliconColor,iconCustomEmojiId)
Kanalnachrichtenaktionen stellen ergonomische Aliasse bereit (send, react, delete, edit, sticker, sticker-search, topic-create).
Steuerungen für Gates:
channels.telegram.actions.sendMessagechannels.telegram.actions.deleteMessagechannels.telegram.actions.reactionschannels.telegram.actions.sticker(Standard: deaktiviert)
Hinweis: edit und topic-create sind derzeit standardmäßig aktiviert und haben keine separaten channels.telegram.actions.*-Schalter.
Laufzeitsendungen verwenden den aktiven Konfigurations-/Secrets-Snapshot (Start/Reload), daher führen Aktionspfade keine Ad-hoc-SecretRef-Neuauflösung pro Sendung aus.
Semantik zum Entfernen von Reaktionen: /tools/reactions
Reply threading tags
Telegram unterstützt explizite Reply-Threading-Tags in generierter Ausgabe:
[[reply_to_current]]antwortet auf die auslösende Nachricht[[reply_to:<id>]]antwortet auf eine bestimmte Telegram-Nachrichten-ID
channels.telegram.replyToMode steuert die Verarbeitung:
off(Standard)firstall
Wenn Reply-Threading aktiviert ist und der ursprüngliche Telegram-Text oder die Bildunterschrift verfügbar ist, fügt OpenClaw automatisch einen nativen Telegram-Zitatauszug ein. Telegram begrenzt nativen Zitattext auf 1024 UTF-16-Codeeinheiten, daher werden längere Nachrichten vom Anfang an zitiert und fallen auf eine einfache Antwort zurück, wenn Telegram das Zitat ablehnt.
Hinweis: off deaktiviert implizites Reply-Threading. Explizite [[reply_to_*]]-Tags werden weiterhin berücksichtigt.
Forum topics and thread behavior
Forum-Supergruppen:
- Themen-Sitzungsschlüssel hängen
:topic:<threadId>an - Antworten und Tippanzeigen zielen auf den Themen-Thread
- Themenkonfigurationspfad:
channels.telegram.groups.<chatId>.topics.<threadId>
Sonderfall Allgemeines Thema (threadId=1):
- Nachrichtensendungen lassen
message_thread_idweg (Telegram lehntsendMessage(...thread_id=1)ab) - Tippaktionen enthalten weiterhin
message_thread_id
Themenvererbung: Themeneinträge erben Gruppeneinstellungen, sofern sie nicht überschrieben werden (requireMention, allowFrom, skills, systemPrompt, enabled, groupPolicy).
agentId ist nur themenspezifisch und wird nicht aus Gruppenvorgaben geerbt.
Agent-Routing pro Thema: Jedes Thema kann an einen anderen Agenten weiterleiten, indem agentId in der Themenkonfiguration gesetzt wird. Dadurch erhält jedes Thema seinen eigenen isolierten Arbeitsbereich, Speicher und seine eigene Sitzung. Beispiel:
{
channels: {
telegram: {
groups: {
"-1001234567890": {
topics: {
"1": { agentId: "main" }, // General topic → main agent
"3": { agentId: "zu" }, // Dev topic → zu agent
"5": { agentId: "coder" } // Code review → coder agent
}
}
}
}
}
}
Jedes Thema hat dann seinen eigenen Sitzungsschlüssel: agent:zu:telegram:group:-1001234567890:topic:3
Persistente ACP-Themenbindung: Forumsthemen können ACP-Harness-Sitzungen über typisierte ACP-Bindungen auf oberster Ebene anheften (bindings[] mit type: "acp" und match.channel: "telegram", peer.kind: "group" sowie einer themenqualifizierten ID wie -1001234567890:topic:42). Derzeit auf Forumsthemen in Gruppen/Supergruppen beschränkt. Siehe ACP Agents.
Thread-gebundener ACP-Spawn aus dem Chat: /acp spawn <agent> --thread here|auto bindet das aktuelle Thema an eine neue ACP-Sitzung; Folgeanfragen werden direkt dorthin geleitet. OpenClaw pinnt die Spawn-Bestätigung im Thema an. Erfordert, dass channels.telegram.threadBindings.spawnSessions aktiviert bleibt (Standard: true).
Der Template-Kontext stellt MessageThreadId und IsForum bereit. DM-Chats mit message_thread_id behalten standardmäßig DM-Routing und Antwortmetadaten in flachen Sessions bei; thread-bewusste Session-Schlüssel werden nur verwendet, wenn threadReplies: "inbound", threadReplies: "always", requireTopic: true oder eine passende Topic-Konfiguration konfiguriert ist. Verwenden Sie channels.telegram.dm.threadReplies auf oberster Ebene für die Konto-Standardeinstellung oder direct.<chatId>.threadReplies für eine DM.
Audio, Video und Sticker
Audionachrichten
Telegram unterscheidet Sprachnotizen von Audiodateien.
- Standard: Verhalten wie Audiodatei
- Tag
[[audio_as_voice]]in der Agent-Antwort, um das Senden als Sprachnotiz zu erzwingen - Eingehende Transkripte von Sprachnotizen werden im Agent-Kontext als maschinell generierter, nicht vertrauenswürdiger Text gerahmt; die Erwähnungserkennung verwendet weiterhin das rohe Transkript, sodass durch Erwähnungen gesteuerte Sprachnachrichten weiter funktionieren.
Beispiel für eine Nachrichtenaktion:
{
action: "send",
channel: "telegram",
to: "123456789",
media: "https://example.com/voice.ogg",
asVoice: true,
}
Videonachrichten
Telegram unterscheidet Videodateien von Videonotizen.
Beispiel für eine Nachrichtenaktion:
{
action: "send",
channel: "telegram",
to: "123456789",
media: "https://example.com/video.mp4",
asVideoNote: true,
}
Videonotizen unterstützen keine Bildunterschriften; bereitgestellter Nachrichtentext wird separat gesendet.
Sticker
Verarbeitung eingehender Sticker:
- statisches WEBP: heruntergeladen und verarbeitet (Platzhalter
<media:sticker>) - animiertes TGS: übersprungen
- Video-WEBM: übersprungen
Sticker-Kontextfelder:
Sticker.emojiSticker.setNameSticker.fileIdSticker.fileUniqueIdSticker.cachedDescription
Sticker-Cache-Datei:
~/.openclaw/telegram/sticker-cache.json
Sticker werden einmal beschrieben (wenn möglich) und zwischengespeichert, um wiederholte Vision-Aufrufe zu reduzieren.
Sticker-Aktionen aktivieren:
{
channels: {
telegram: {
actions: {
sticker: true,
},
},
},
}
Sticker-Aktion senden:
{
action: "sticker",
channel: "telegram",
to: "123456789",
fileId: "CAACAgIAAxkBAAI...",
}
Zwischengespeicherte Sticker suchen:
{
action: "sticker-search",
channel: "telegram",
query: "cat waving",
limit: 5,
}
Reaktionsbenachrichtigungen
Telegram-Reaktionen kommen als message_reaction-Updates an (getrennt von Nachrichten-Payloads).
Wenn aktiviert, stellt OpenClaw Systemereignisse wie diese in die Warteschlange:
Telegram reaction added: 👍 by Alice (@alice) on msg 42
Konfiguration:
channels.telegram.reactionNotifications:off | own | all(Standard:own)channels.telegram.reactionLevel:off | ack | minimal | extensive(Standard:minimal)
Hinweise:
ownbedeutet nur Benutzerreaktionen auf vom Bot gesendete Nachrichten (Best Effort über Cache gesendeter Nachrichten).- Reaktionsereignisse respektieren weiterhin Telegram-Zugriffskontrollen (
dmPolicy,allowFrom,groupPolicy,groupAllowFrom); nicht autorisierte Absender werden verworfen. - Telegram stellt in Reaktions-Updates keine Thread-IDs bereit.
- Nicht-Forum-Gruppen werden zur Gruppenchat-Session geroutet
- Forum-Gruppen werden zur allgemeinen Topic-Session der Gruppe (
:topic:1) geroutet, nicht zum genauen ursprünglichen Topic
allowed_updates für Polling/Webhook enthält automatisch message_reaction.
Ack-Reaktionen
ackReaction sendet ein Bestätigungs-Emoji, während OpenClaw eine eingehende Nachricht verarbeitet.
Auflösungsreihenfolge:
channels.telegram.accounts.<accountId>.ackReactionchannels.telegram.ackReactionmessages.ackReaction- Agent-Identitäts-Emoji als Fallback (
agents.list[].identity.emoji, andernfalls "👀")
Hinweise:
- Telegram erwartet Unicode-Emoji (zum Beispiel "👀").
- Verwenden Sie
"", um die Reaktion für einen Channel oder ein Konto zu deaktivieren.
Konfigurationsschreibvorgänge aus Telegram-Ereignissen und -Befehlen
Channel-Konfigurationsschreibvorgänge sind standardmäßig aktiviert (configWrites !== false).
Durch Telegram ausgelöste Schreibvorgänge umfassen:
- Gruppenmigrationsereignisse (
migrate_to_chat_id) zum Aktualisieren vonchannels.telegram.groups /config setund/config unset(erfordert Aktivierung des Befehls)
Deaktivieren:
{
channels: {
telegram: {
configWrites: false,
},
},
}
Long Polling vs. Webhook
Standard ist Long Polling. Setzen Sie für den Webhook-Modus channels.telegram.webhookUrl und channels.telegram.webhookSecret; optional webhookPath, webhookHost, webhookPort (Standardwerte /telegram-webhook, 127.0.0.1, 8787).
Im Long-Polling-Modus persistiert OpenClaw seine Neustart-Wasserlinie erst, nachdem ein Update erfolgreich dispatcht wurde. Wenn ein Handler fehlschlägt, bleibt dieses Update im selben Prozess erneut versuchbar und wird für die Neustart-Deduplizierung nicht als abgeschlossen geschrieben.
Der lokale Listener bindet an 127.0.0.1:8787. Für öffentlichen Ingress setzen Sie entweder einen Reverse Proxy vor den lokalen Port oder setzen webhookHost: "0.0.0.0" bewusst.
Der Webhook-Modus validiert Request-Guards, das geheime Telegram-Token und den JSON-Body, bevor 200 an Telegram zurückgegeben wird.
OpenClaw verarbeitet das Update dann asynchron über dieselben Bot-Lanes pro Chat/pro Topic, die auch Long Polling verwendet, sodass langsame Agent-Durchläufe den Zustellungs-ACK von Telegram nicht blockieren.
Limits, Wiederholung und CLI-Ziele
channels.telegram.textChunkLimitist standardmäßig 4000.channels.telegram.chunkMode="newline"bevorzugt Absatzgrenzen (Leerzeilen), bevor nach Länge aufgeteilt wird.channels.telegram.mediaMaxMb(Standard 100) begrenzt die Größe eingehender und ausgehender Telegram-Medien.channels.telegram.mediaGroupFlushMs(Standard 500) steuert, wie lange Telegram-Alben/Mediengruppen gepuffert werden, bevor OpenClaw sie als eine eingehende Nachricht dispatcht. Erhöhen Sie den Wert, wenn Albenteile verspätet eintreffen; verringern Sie ihn, um die Antwortlatenz für Alben zu reduzieren.channels.telegram.timeoutSecondsüberschreibt das Timeout des Telegram-API-Clients (falls nicht gesetzt, gilt der grammY-Standard). Bot-Clients begrenzen konfigurierte Werte unterhalb des 60-sekündigen Request-Guards für ausgehende Text-/Typing-Anfragen, damit grammY die sichtbare Antwortzustellung nicht abbricht, bevor OpenClaws Transport-Guard und Fallback laufen können. Long Polling verwendet weiterhin einen 45-sekündigengetUpdates-Request-Guard, damit inaktive Polls nicht unbegrenzt aufgegeben werden.channels.telegram.pollingStallThresholdMsist standardmäßig120000; passen Sie den Wert nur bei falsch-positiven Neustarts wegen Polling-Stalls zwischen30000und600000an.- Gruppen-Kontextverlauf verwendet
channels.telegram.historyLimitodermessages.groupChat.historyLimit(Standard 50);0deaktiviert ihn. - Ergänzender Kontext für Antworten/Zitate/Weiterleitungen wird derzeit unverändert weitergegeben.
- Telegram-Allowlists steuern primär, wer den Agent auslösen kann, und sind keine vollständige Redaktionsgrenze für ergänzenden Kontext.
- DM-Verlaufssteuerung:
channels.telegram.dmHistoryLimitchannels.telegram.dms["<user_id>"].historyLimit
- Die Konfiguration
channels.telegram.retrygilt für Telegram-Sendehelfer (CLI/Tools/Aktionen) bei behebbaren ausgehenden API-Fehlern. Die Zustellung der finalen eingehenden Antwort verwendet ebenfalls eine begrenzte Safe-Send-Wiederholung für Telegram-Pre-Connect-Fehler, wiederholt jedoch keine mehrdeutigen Netzwerkumschläge nach dem Senden, die sichtbare Nachrichten duplizieren könnten.
CLI- und Message-Tool-Sendeziele können numerische Chat-ID, Benutzername oder ein Forum-Topic-Ziel sein:
openclaw message send --channel telegram --target 123456789 --message "hi"
openclaw message send --channel telegram --target @name --message "hi"
openclaw message send --channel telegram --target -1001234567890:topic:42 --message "hi topic"
Telegram-Polls verwenden openclaw message poll und unterstützen Forum-Topics:
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
Nur für Telegram geltende Poll-Flags:
--poll-duration-seconds(5-600)--poll-anonymous--poll-public--thread-idfür Forum-Topics (oder verwenden Sie ein:topic:-Ziel)
Telegram-Senden unterstützt außerdem:
--presentationmitbuttons-Blöcken für Inline-Keyboards, wennchannels.telegram.capabilities.inlineButtonses erlaubt--pinoder--delivery '{"pin":true}', um angeheftete Zustellung anzufordern, wenn der Bot in diesem Chat anheften kann--force-document, um ausgehende Bilder und GIFs als Dokumente statt als komprimierte Foto- oder Animated-Media-Uploads zu senden
Aktions-Gating:
channels.telegram.actions.sendMessage=falsedeaktiviert ausgehende Telegram-Nachrichten, einschließlich Pollschannels.telegram.actions.poll=falsedeaktiviert die Erstellung von Telegram-Polls, während reguläres Senden aktiviert bleibt
Exec-Genehmigungen in Telegram
Telegram unterstützt Exec-Genehmigungen in Genehmiger-DMs und kann Prompts optional im ursprünglichen Chat oder Topic posten. Genehmiger müssen numerische Telegram-Benutzer-IDs sein.
Konfigurationspfad:
channels.telegram.execApprovals.enabled(aktiviert sich automatisch, wenn mindestens ein Genehmiger auflösbar ist)channels.telegram.execApprovals.approvers(fällt auf numerische Besitzer-IDs auscommands.ownerAllowFromzurück)channels.telegram.execApprovals.target:dm(Standard) |channel|bothagentFilter,sessionFilter
channels.telegram.allowFrom, groupAllowFrom und defaultTo steuern, wer mit dem Bot sprechen kann und wohin er normale Antworten sendet. Sie machen niemanden zu einem Exec-Genehmiger. Die erste genehmigte DM-Kopplung bootstrapped commands.ownerAllowFrom, wenn noch kein Befehlsbesitzer existiert, sodass die Einrichtung mit einem Besitzer weiterhin funktioniert, ohne IDs unter execApprovals.approvers zu duplizieren.
Channel-Zustellung zeigt den Befehlstext im Chat an; aktivieren Sie channel oder both nur in vertrauenswürdigen Gruppen/Topics. Wenn der Prompt in einem Forum-Topic landet, bewahrt OpenClaw das Topic für den Genehmigungs-Prompt und die Folgeantwort. Exec-Genehmigungen laufen standardmäßig nach 30 Minuten ab.
Inline-Genehmigungsbuttons erfordern außerdem, dass channels.telegram.capabilities.inlineButtons die Zieloberfläche (dm, group oder all) erlaubt. Genehmigungs-IDs mit dem Präfix plugin: werden über Plugin-Genehmigungen aufgelöst; andere werden zuerst über Exec-Genehmigungen aufgelöst.
Siehe Exec-Genehmigungen.
Steuerung von Fehlerantworten
Wenn der Agent auf einen Zustellungs- oder Provider-Fehler stößt, kann Telegram entweder mit dem Fehlertext antworten oder ihn unterdrücken. Zwei Konfigurationsschlüssel steuern dieses Verhalten:
| Schlüssel | Werte | Standard | Beschreibung |
|---|---|---|---|
channels.telegram.errorPolicy |
reply, silent |
reply |
reply sendet eine freundliche Fehlermeldung an den Chat. silent unterdrückt Fehlerantworten ganz. |
channels.telegram.errorCooldownMs |
Zahl (ms) | 60000 |
Mindestzeit zwischen Fehlerantworten an denselben Chat. Verhindert Fehler-Spam bei Ausfällen. |
Überschreibungen pro Konto, pro Gruppe und pro Topic werden unterstützt (dieselbe Vererbung wie bei anderen Telegram-Konfigurationsschlüsseln).
{
channels: {
telegram: {
errorPolicy: "reply",
errorCooldownMs: 120000,
groups: {
"-1001234567890": {
errorPolicy: "silent", // suppress errors in this group
},
},
},
},
}
Fehlerbehebung
Bot reagiert nicht auf Gruppennachrichten ohne Erwähnung
- Wenn
requireMention=falseist, muss der Telegram-Privatsphäremodus vollständige Sichtbarkeit erlauben.- BotFather:
/setprivacy-> Deaktivieren - Entfernen Sie den Bot anschließend aus der Gruppe und fügen Sie ihn erneut hinzu.
- BotFather:
openclaw channels statuswarnt, wenn die Konfiguration nicht erwähnte Gruppennachrichten erwartet.openclaw channels status --probekann explizite numerische Gruppen-IDs prüfen; die Wildcard"*"kann nicht per Mitgliedschaftsprobe geprüft werden.- schneller Sitzungstest:
/activation always.
Bot sieht überhaupt keine Gruppennachrichten
- Wenn
channels.telegram.groupsvorhanden ist, muss die Gruppe aufgeführt sein (oder"*"enthalten). - Prüfen Sie die Bot-Mitgliedschaft in der Gruppe.
- Prüfen Sie die Protokolle:
openclaw logs --followfür Gründe für das Überspringen.
Befehle funktionieren teilweise oder gar nicht
- Autorisieren Sie Ihre Senderidentität (Pairing und/oder numerisches
allowFrom). - Befehlsautorisierung gilt weiterhin, auch wenn die Gruppenrichtlinie
openist. setMyCommands failedmitBOT_COMMANDS_TOO_MUCHbedeutet, dass das native Menü zu viele Einträge hat; reduzieren Sie Plugin-/Skill-/benutzerdefinierte Befehle oder deaktivieren Sie native Menüs.deleteMyCommands- /setMyCommands-Startaufrufe undsendChatAction-Tippaufrufe sind begrenzt und werden bei Anfrage-Timeout einmal über Telegrams Transport-Fallback wiederholt. Dauerhafte Netzwerk-/Fetch-Fehler deuten normalerweise auf DNS-/HTTPS-Erreichbarkeitsprobleme zuapi.telegram.orghin.
Start meldet nicht autorisiertes Token
getMe returned 401ist ein Telegram-Authentifizierungsfehler für das konfigurierte Bot-Token.- Kopieren oder regenerieren Sie das Bot-Token in BotFather erneut, und aktualisieren Sie dann
channels.telegram.botToken,channels.telegram.tokenFile,channels.telegram.accounts.<id>.botTokenoderTELEGRAM_BOT_TOKENfür das Standardkonto. deleteWebhook 401 Unauthorizedwährend des Starts ist ebenfalls ein Authentifizierungsfehler; es als „kein Webhook vorhanden“ zu behandeln, würde denselben Fehler durch ein ungültiges Token nur auf spätere API-Aufrufe verschieben.
Polling- oder Netzwerk-Instabilität
- Node 22+ und benutzerdefiniertes Fetch/Proxy können sofortiges Abbruchverhalten auslösen, wenn AbortSignal-Typen nicht übereinstimmen.
- Einige Hosts lösen
api.telegram.orgzuerst zu IPv6 auf; defekter IPv6-Egress kann sporadische Telegram-API-Fehler verursachen. - Wenn Protokolle
TypeError: fetch failedoderNetwork request for 'getUpdates' failed!enthalten, wiederholt OpenClaw diese jetzt als wiederherstellbare Netzwerkfehler. - Während des Polling-Starts verwendet OpenClaw die erfolgreiche
getMe-Startprobe für grammY wieder, sodass der Runner kein zweitesgetMevor dem erstengetUpdatesbenötigt. - Wenn
deleteWebhookwährend des Polling-Starts mit einem vorübergehenden Netzwerkfehler fehlschlägt, fährt OpenClaw mit Long Polling fort, statt einen weiteren Control-Plane-Aufruf vor dem Polling auszuführen. Ein weiterhin aktiver Webhook erscheint alsgetUpdates-Konflikt; OpenClaw baut dann den Telegram-Transport neu auf und wiederholt die Webhook-Bereinigung. - Wenn Telegram-Sockets in einem kurzen festen Intervall recycelt werden, prüfen Sie auf ein niedriges
channels.telegram.timeoutSeconds; Bot-Clients begrenzen konfigurierte Werte unterhalb der ausgehenden undgetUpdates-Request-Guards, aber ältere Versionen konnten jeden Poll oder jede Antwort abbrechen, wenn dies unterhalb dieser Guards gesetzt war. - Wenn Protokolle
Polling stall detectedenthalten, startet OpenClaw das Polling neu und baut den Telegram-Transport standardmäßig nach 120 Sekunden ohne abgeschlossene Long-Poll-Liveness neu auf. openclaw channels status --probeundopenclaw doctorwarnen, wenn ein laufendes Polling-Konto nach der Start-GnadenfristgetUpdatesnicht abgeschlossen hat, wenn ein laufendes Webhook-Konto nach der Start-GnadenfristsetWebhooknicht abgeschlossen hat oder wenn die letzte erfolgreiche Polling-Transportaktivität veraltet ist.- Erhöhen Sie
channels.telegram.pollingStallThresholdMsnur, wenn lang laufendegetUpdates-Aufrufe gesund sind, Ihr Host aber weiterhin fälschliche Polling-Stall-Neustarts meldet. Dauerhafte Stalls deuten normalerweise auf Proxy-, DNS-, IPv6- oder TLS-Egress-Probleme zwischen Host undapi.telegram.orghin. - Telegram berücksichtigt außerdem Prozess-Proxy-Env für den Bot-API-Transport, einschließlich
HTTP_PROXY,HTTPS_PROXY,ALL_PROXYund ihrer kleingeschriebenen Varianten.NO_PROXY/no_proxykannapi.telegram.orgweiterhin umgehen. - Wenn der von OpenClaw verwaltete Proxy über
OPENCLAW_PROXY_URLfür eine Service-Umgebung konfiguriert ist und keine Standard-Proxy-Env vorhanden ist, verwendet Telegram diese URL ebenfalls für den Bot-API-Transport. - Leiten Sie Telegram-API-Aufrufe auf VPS-Hosts mit instabilem direktem Egress/TLS über
channels.telegram.proxy:
channels:
telegram:
proxy: socks5://<user>:<password>@proxy-host:1080
- Node 22+ verwendet standardmäßig
autoSelectFamily=true(außer WSL2). Die Ergebnisreihenfolge von Telegram-DNS berücksichtigtOPENCLAW_TELEGRAM_DNS_RESULT_ORDER, dannchannels.telegram.network.dnsResultOrder, dann den Prozessstandard wieNODE_OPTIONS=--dns-result-order=ipv4first; wenn nichts davon gilt, fällt Node 22+ aufipv4firstzurück. - Wenn Ihr Host WSL2 ist oder ausdrücklich besser mit reinem IPv4-Verhalten funktioniert, erzwingen Sie die Family-Auswahl:
channels:
telegram:
network:
autoSelectFamily: false
- Antworten aus dem RFC-2544-Benchmark-Bereich (
198.18.0.0/15) sind standardmäßig bereits für Telegram-Mediendownloads erlaubt. Wenn ein vertrauenswürdiger Fake-IP- oder transparenter Proxyapi.telegram.orgwährend Mediendownloads auf eine andere private/interne/Special-Use-Adresse umschreibt, können Sie sich für die nur für Telegram geltende Umgehung entscheiden:
channels:
telegram:
network:
dangerouslyAllowPrivateNetwork: true
- Dieselbe Opt-in-Option ist pro Konto unter
channels.telegram.accounts.<accountId>.network.dangerouslyAllowPrivateNetworkverfügbar. - Wenn Ihr Proxy Telegram-Medienhosts in
198.18.x.xauflöst, lassen Sie das gefährliche Flag zunächst deaktiviert. Telegram-Medien erlauben den RFC-2544-Benchmark-Bereich bereits standardmäßig.
- Umgebungsüberschreibungen (temporär):
OPENCLAW_TELEGRAM_DISABLE_AUTO_SELECT_FAMILY=1OPENCLAW_TELEGRAM_ENABLE_AUTO_SELECT_FAMILY=1OPENCLAW_TELEGRAM_DNS_RESULT_ORDER=ipv4first
- DNS-Antworten validieren:
dig +short api.telegram.org A
dig +short api.telegram.org AAAA
Weitere Hilfe: Channel-Fehlerbehebung.
Konfigurationsreferenz
Primäre Referenz: Konfigurationsreferenz - Telegram.
Aussagekräftige Telegram-Felder
- Start/Auth:
enabled,botToken,tokenFile,accounts.*(tokenFilemuss auf eine reguläre Datei zeigen; Symlinks werden abgelehnt) - Zugriffskontrolle:
dmPolicy,allowFrom,groupPolicy,groupAllowFrom,groups,groups.*.topics.*,bindings[]auf oberster Ebene (type: "acp") - Ausführungsgenehmigungen:
execApprovals,accounts.*.execApprovals - Befehl/Menü:
commands.native,commands.nativeSkills,customCommands - Threads/Antworten:
replyToMode,dm.threadReplies,direct.*.threadReplies - Streaming:
streaming(Vorschau),streaming.preview.toolProgress,blockStreaming - Formatierung/Zustellung:
textChunkLimit,chunkMode,linkPreview,responsePrefix - Medien/Netzwerk:
mediaMaxMb,mediaGroupFlushMs,timeoutSeconds,pollingStallThresholdMs,retry,network.autoSelectFamily,network.dangerouslyAllowPrivateNetwork,proxy - benutzerdefinierter API-Root:
apiRoot(nur Bot-API-Root;/bot<TOKEN>nicht einschließen) - Webhook:
webhookUrl,webhookSecret,webhookPath,webhookHost - Aktionen/Fähigkeiten:
capabilities.inlineButtons,actions.sendMessage|editMessage|deleteMessage|reactions|sticker - Reaktionen:
reactionNotifications,reactionLevel - Fehler:
errorPolicy,errorCooldownMs - Schreibvorgänge/Verlauf:
configWrites,historyLimit,dmHistoryLimit,dms.*.historyLimit
Verwandt
Koppeln Sie einen Telegram-Benutzer mit dem Gateway.
Verhalten der Allowlist für Gruppen und Themen.
Eingehende Nachrichten an Agenten weiterleiten.
Bedrohungsmodell und Härtung.
Gruppen und Themen Agenten zuordnen.
Channel-übergreifende Diagnostik.