Telegram (Bot API)
Status: Produktionsreif fĂŒr Bot-DMs und Gruppen via grammY. Long Polling ist der Standardmodus; Webhook-Modus ist optional.
- Pairing â Standard-DM-Richtlinie fĂŒr Telegram ist Pairing.
- Kanal-Fehlerbehebung â KanalĂŒbergreifende Diagnose und Reparatur-Playbooks.
- Gateway-Konfiguration â VollstĂ€ndige Kanal-Config-Muster und Beispiele.
Schnelleinrichtung
Schritt 1: Bot-Token beim BotFather erstellen
Ăffne Telegram und chatte mit **@BotFather** (stelle sicher, dass der Handle genau `@BotFather` lautet).
FĂŒhre `/newbot` aus, folge den Anweisungen und speichere das Token.
Schritt 2: Token und DM-Richtlinie konfigurieren
{
channels: {
telegram: {
enabled: true,
botToken: "123:abc",
dmPolicy: "pairing",
groups: { "*": { requireMention: true } },
},
},
}
Env-Fallback: `TELEGRAM_BOT_TOKEN=...` (nur Standard-Konto).
Telegram nutzt **nicht** `openclaw channels login telegram`; konfiguriere das Token in Config/Env und starte dann das Gateway.
Schritt 3: Gateway starten und erste DM genehmigen
openclaw gateway
openclaw pairing list telegram
openclaw pairing approve telegram <CODE>
Pairing-Codes laufen nach 1 Stunde ab.
Schritt 4: Bot zu einer Gruppe hinzufĂŒgen
FĂŒge den Bot zu deiner Gruppe hinzu und setze dann `channels.telegram.groups` und `groupPolicy` passend zu deinem Zugriffsmodell.
Hinweis: Die Token-Auflösungsreihenfolge ist kontenabhÀngig. In der Praxis haben Config-Werte Vorrang vor dem Env-Fallback, und
TELEGRAM_BOT_TOKENgilt nur fĂŒr das Standard-Konto.
Telegram-seitige Einstellungen
Privacy-Modus und Gruppen-Sichtbarkeit
Telegram-Bots nutzen standardmĂ€Ăig den **Privacy-Modus**, der einschrĂ€nkt, welche Gruppennachrichten sie empfangen.
Soll der Bot alle Gruppennachrichten sehen, gibt es zwei Möglichkeiten:
- Privacy-Modus ĂŒber `/setprivacy` deaktivieren, oder
- den Bot zum Gruppenadmin machen.
Nach dem Umschalten des Privacy-Modus musst du den Bot in jeder Gruppe entfernen und neu hinzufĂŒgen, damit Telegram die Ănderung ĂŒbernimmt.
Gruppenberechtigungen
Der Admin-Status wird in den Telegram-Gruppeneinstellungen verwaltet.
Admin-Bots empfangen alle Gruppennachrichten, was fĂŒr Always-on-Gruppenverhalten nĂŒtzlich ist.
Hilfreiche BotFather-Einstellungen
- `/setjoingroups` um Gruppen-Einladungen zu erlauben/verweigern
- `/setprivacy` fĂŒr das Gruppen-Sichtbarkeitsverhalten
Zugriffskontrolle und Aktivierung
DM-Richtlinie
`channels.telegram.dmPolicy` steuert den Direktnachrichten-Zugriff:
- `pairing` (Standard)
- `allowlist` (erfordert mindestens eine Absender-ID in `allowFrom`)
- `open` (erfordert `allowFrom` mit `"*"`)
- `disabled`
`channels.telegram.allowFrom` akzeptiert numerische Telegram-User-IDs. `telegram:`/`tg:`-PrÀfixe werden akzeptiert und normalisiert.
`dmPolicy: "allowlist"` mit leerem `allowFrom` blockiert alle DMs und wird von der Config-Validierung abgelehnt.
Der Onboarding-Wizard akzeptiert `@username`-Eingaben und löst sie zu numerischen IDs auf.
EnthĂ€lt deine Config nach einem Upgrade `@username`-Allowlist-EintrĂ€ge, fĂŒhre `openclaw doctor --fix` aus, um sie aufzulösen (Best-Effort; erfordert ein Telegram-Bot-Token).
Wenn du zuvor auf Pairing-Store-Allowlist-Dateien gesetzt hast, kann `openclaw doctor --fix` EintrÀge in `channels.telegram.allowFrom` bei Allowlist-Migrationen wiederherstellen (z. B. wenn `dmPolicy: "allowlist"` noch keine expliziten IDs hat).
FĂŒr Bots mit einem einzigen Besitzer bevorzuge `dmPolicy: "allowlist"` mit expliziten numerischen `allowFrom`-IDs, damit die Zugriffsrichtlinie dauerhaft in der Config verankert ist (statt von frĂŒheren Pairing-Genehmigungen abhĂ€ngig zu sein).
### Telegram-User-ID herausfinden
Sicherer Weg (ohne Drittanbieter-Bot):
1. Sende deinem Bot eine DM.
2. FĂŒhre `openclaw logs --follow` aus.
3. Lies `from.id` ab.
Offizielle Bot-API-Methode:
curl "https://api.telegram.org/bot<bot_token>/getUpdates"
Drittanbieter-Methode (weniger privat): `@userinfobot` oder `@getidsbot`.
Gruppenrichtlinie und Allowlists
Zwei Steuerungen greifen zusammen:
1. **Welche Gruppen erlaubt sind** (`channels.telegram.groups`)
- Keine `groups`-Config:
- mit `groupPolicy: "open"`: jede Gruppe besteht die Gruppen-ID-PrĂŒfung
- mit `groupPolicy: "allowlist"` (Standard): Gruppen sind blockiert, bis du `groups`-EintrĂ€ge hinzufĂŒgst (oder `"*"`)
- `groups` konfiguriert: wirkt als Allowlist (explizite IDs oder `"*"`)
2. **Welche Absender in Gruppen erlaubt sind** (`channels.telegram.groupPolicy`)
- `open`
- `allowlist` (Standard)
- `disabled`
`groupAllowFrom` wird fĂŒr die Gruppen-Absenderfilterung verwendet. Ist es nicht gesetzt, fĂ€llt Telegram auf `allowFrom` zurĂŒck.
`groupAllowFrom`-EintrÀge sollten numerische Telegram-User-IDs sein (`telegram:`/`tg:`-PrÀfixe werden normalisiert).
Telegram-Gruppen- oder Supergruppen-Chat-IDs gehören nicht in `groupAllowFrom`. Negative Chat-IDs gehören unter `channels.telegram.groups`.
Nicht-numerische EintrÀge werden bei der Absender-Autorisierung ignoriert.
Sicherheitsgrenze (`2026.2.25+`): Die Gruppen-Absenderautorisierung erbt **keine** DM-Pairing-Store-Genehmigungen.
Pairing bleibt DM-exklusiv. FĂŒr Gruppen setze `groupAllowFrom` oder pro Gruppe/Topic `allowFrom`.
Laufzeithinweis: Fehlt `channels.telegram` komplett, fĂ€llt die Laufzeit auf ein abgesichertes `groupPolicy="allowlist"` zurĂŒck, sofern `channels.defaults.groupPolicy` nicht explizit gesetzt ist.
Beispiel: Jedes Mitglied in einer bestimmten Gruppe erlauben:
{
channels: {
telegram: {
groups: {
"-1001234567890": {
groupPolicy: "open",
requireMention: false,
},
},
},
},
}
Beispiel: Nur bestimmte Benutzer innerhalb einer Gruppe erlauben:
{
channels: {
telegram: {
groups: {
"-1001234567890": {
requireMention: true,
allowFrom: ["8734062810", "745123456"],
},
},
},
},
}
> **Warnung:**
HĂ€ufiger Fehler:
groupAllowFromist keine Telegram-Gruppen-Allowlist.- Negative Telegram-Gruppen- oder Supergruppen-Chat-IDs wie `-1001234567890` gehören unter `channels.telegram.groups`. - Telegram-User-IDs wie `8734062810` gehören in `groupAllowFrom`, wenn du einschrÀnken willst, welche Personen innerhalb einer erlaubten Gruppe den Bot auslösen können. - Verwende `groupAllowFrom: ["*"]` nur, wenn jedes Mitglied einer erlaubten Gruppe mit dem Bot sprechen darf.
Mention-Verhalten
Gruppenantworten erfordern standardmĂ€Ăig eine ErwĂ€hnung.
Die ErwÀhnung kann kommen von:
- nativer `@botusername`-ErwÀhnung, oder
- Mention-Patterns in:
- `agents.list[].groupChat.mentionPatterns`
- `messages.groupChat.mentionPatterns`
Session-Level-Befehle zum Umschalten:
- `/activation always`
- `/activation mention`
Diese aktualisieren nur den Session-Zustand. FĂŒr Persistenz verwende die Config.
Persistentes Config-Beispiel:
{
channels: {
telegram: {
groups: {
"*": { requireMention: false },
},
},
},
}
Gruppen-Chat-ID herausfinden:
- Leite eine Gruppennachricht an `@userinfobot`/`@getidsbot` weiter
- oder lies `chat.id` aus `openclaw logs --follow` ab
- oder prĂŒfe Bot-API `getUpdates`
Laufzeitverhalten
- Telegram wird vom Gateway-Prozess verwaltet.
- Routing ist deterministisch: Telegram-Eingang antwortet an Telegram zurĂŒck (das Modell wĂ€hlt keine KanĂ€le).
- Eingehende Nachrichten werden in den gemeinsamen Kanal-Envelope mit Reply-Metadaten und Medien-Platzhaltern normalisiert.
- Gruppen-Sitzungen sind nach Gruppen-ID isoliert. Forum-Topics hÀngen
:topic:<threadId>an, um Topics isoliert zu halten. - DM-Nachrichten können
message_thread_idtragen; OpenClaw routet sie mit thread-aware Session-Keys und bewahrt die Thread-ID fĂŒr Antworten. - Long Polling nutzt den grammY-Runner mit Per-Chat-/Per-Thread-Sequenzierung. Die Gesamt-Runner-Sink-Concurrency nutzt
agents.defaults.maxConcurrent. - Die Telegram Bot API unterstĂŒtzt keine LesebestĂ€tigungen (
sendReadReceiptsgreift nicht).
Feature-Referenz
Live-Stream-Vorschau (Nachrichtenbearbeitung)
OpenClaw kann Teilantworten in Echtzeit streamen:
- Direkt-Chats: Vorschaunachricht + `editMessageText`
- Gruppen/Topics: Vorschaunachricht + `editMessageText`
Voraussetzung:
- `channels.telegram.streaming` ist `off | partial | block | progress` (Standard: `partial`)
- `progress` wird auf Telegram auf `partial` abgebildet (KompatibilitĂ€t mit kanalĂŒbergreifender Benennung)
- Legacy `channels.telegram.streamMode` und boolesche `streaming`-Werte werden automatisch gemappt
FĂŒr reine Textantworten:
- DM: OpenClaw behĂ€lt dieselbe Vorschaunachricht bei und fĂŒhrt am Ende eine finale Bearbeitung durch (keine zweite Nachricht)
- Gruppe/Topic: OpenClaw behĂ€lt dieselbe Vorschaunachricht bei und fĂŒhrt am Ende eine finale Bearbeitung durch (keine zweite Nachricht)
Bei komplexen Antworten (z. B. Medien-Payloads) fĂ€llt OpenClaw auf normale finale Zustellung zurĂŒck und rĂ€umt dann die Vorschaunachricht auf.
Vorschau-Streaming ist getrennt von Block-Streaming. Wenn Block-Streaming fĂŒr Telegram explizit aktiviert ist, ĂŒberspringt OpenClaw den Vorschau-Stream, um Doppel-Streaming zu vermeiden.
Ist der native Draft-Transport nicht verfĂŒgbar/abgelehnt, fĂ€llt OpenClaw automatisch auf `sendMessage` + `editMessageText` zurĂŒck.
Telegram-exklusiver Reasoning-Stream:
- `/reasoning stream` sendet Reasoning-Ausgabe in die Live-Vorschau wÀhrend der Generierung
- Die finale Antwort wird ohne Reasoning-Text gesendet
Formatierung und HTML-Fallback
Ausgehender Text nutzt Telegram `parse_mode: "HTML"`.
- Markdown-artiger Text wird zu Telegram-sicherem HTML gerendert.
- Rohes Modell-HTML wird escaped, um Telegram-Parse-Fehler zu reduzieren.
- Lehnt Telegram das geparste HTML ab, versucht OpenClaw es als Plaintext erneut.
Link-Vorschauen sind standardmĂ€Ăig aktiviert und können mit `channels.telegram.linkPreview: false` deaktiviert werden.
Native Befehle und benutzerdefinierte Befehle
Telegram-BefehlsmenĂŒ-Registrierung erfolgt beim Start ĂŒber `setMyCommands`.
Native Befehlsstandards:
- `commands.native: "auto"` aktiviert native Befehle fĂŒr Telegram
Benutzerdefinierte MenĂŒeintrĂ€ge hinzufĂŒgen:
{
channels: {
telegram: {
customCommands: [
{ command: "backup", description: "Git backup" },
{ command: "generate", description: "Create an image" },
],
},
},
}
Regeln:
- Namen werden normalisiert (fĂŒhrendes `/` wird entfernt, Kleinschreibung)
- GĂŒltiges Muster: `a-z`, `0-9`, `_`, LĂ€nge `1..32`
- Benutzerdefinierte Befehle können native Befehle nicht ĂŒberschreiben
- Konflikte/Duplikate werden ĂŒbersprungen und geloggt
Hinweise:
- Benutzerdefinierte Befehle sind nur MenĂŒeintrĂ€ge; sie implementieren kein automatisches Verhalten
- Plugin-/Skill-Befehle können weiterhin funktionieren, wenn eingetippt, auch wenn sie nicht im Telegram-MenĂŒ erscheinen
Werden native Befehle deaktiviert, werden Built-ins entfernt. Benutzerdefinierte/Plugin-Befehle können sich trotzdem registrieren, wenn konfiguriert.
HĂ€ufige Einrichtungsfehler:
- `setMyCommands failed` mit `BOT_COMMANDS_TOO_MUCH` bedeutet, das Telegram-MenĂŒ ist nach dem Trimmen immer noch ĂŒberlaufen; reduziere Plugin-/Skill-/benutzerdefinierte Befehle oder deaktiviere `channels.telegram.commands.native`.
- `setMyCommands failed` mit Netzwerk-/Fetch-Fehlern bedeutet meist, dass ausgehende DNS/HTTPS-Verbindungen zu `api.telegram.org` blockiert sind.
### Device-Pairing-Befehle (`device-pair`-Plugin)
Wenn das `device-pair`-Plugin installiert ist:
1. `/pair` generiert einen Setup-Code
2. Code in der iOS-App einfĂŒgen
3. `/pair approve` genehmigt die letzte ausstehende Anfrage
Weitere Details: [Pairing](/docs/channels/pairing#pair-via-telegram-recommended-for-ios).
Inline-Buttons
Inline-Keyboard-Scope konfigurieren:
{
channels: {
telegram: {
capabilities: {
inlineButtons: "allowlist",
},
},
},
}
Ăberschreibung pro Konto:
{
channels: {
telegram: {
accounts: {
main: {
capabilities: {
inlineButtons: "allowlist",
},
},
},
},
},
}
Scopes:
- `off`
- `dm`
- `group`
- `all`
- `allowlist` (Standard)
Legacy `capabilities: ["inlineButtons"]` wird auf `inlineButtons: "all"` gemappt.
Nachrichtenaktion-Beispiel:
{
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 weitergegeben:
`callback_data: <value>`
Telegram-Nachrichtenaktionen fĂŒr Agenten und Automatisierung
Telegram-Tool-Aktionen umfassen:
- `sendMessage` (`to`, `content`, optional `mediaUrl`, `replyToMessageId`, `messageThreadId`)
- `react` (`chatId`, `messageId`, `emoji`)
- `deleteMessage` (`chatId`, `messageId`)
- `editMessage` (`chatId`, `messageId`, `content`)
- `createForumTopic` (`chatId`, `name`, optional `iconColor`, `iconCustomEmojiId`)
Kanal-Nachrichtenaktionen bieten ergonomische Aliase (`send`, `react`, `delete`, `edit`, `sticker`, `sticker-search`, `topic-create`).
Gating-Steuerungen:
- `channels.telegram.actions.sendMessage`
- `channels.telegram.actions.deleteMessage`
- `channels.telegram.actions.reactions`
- `channels.telegram.actions.sticker` (Standard: deaktiviert)
Hinweis: `edit` und `topic-create` sind derzeit standardmĂ€Ăig aktiviert und haben keine separaten `channels.telegram.actions.*`-Schalter.
Laufzeit-Sends nutzen den aktiven Config-/Secrets-Snapshot (Startup/Reload), sodass Action-Pfade keine Ad-hoc-SecretRef-Neuauflösung pro Send durchfĂŒhren.
Semantik zum Entfernen von Reaktionen: [/tools/reactions](/docs/tools/reactions)
Reply-Threading-Tags
Telegram unterstĂŒtzt explizite Reply-Threading-Tags in der generierten 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)
- `first`
- `all`
Hinweis: `off` deaktiviert implizites Reply-Threading. Explizite `[[reply_to_*]]`-Tags werden weiterhin berĂŒcksichtigt.
Forum-Topics und Thread-Verhalten
Forum-Supergruppen:
- Topic-Session-Keys hÀngen `:topic:<threadId>` an
- Antworten und Typing-Indikatoren zielen auf den Topic-Thread
- Topic-Config-Pfad:
`channels.telegram.groups.<chatId>.topics.<threadId>`
General-Topic (`threadId=1`) Sonderfall:
- Nachrichten-Sends lassen `message_thread_id` weg (Telegram lehnt `sendMessage(...thread_id=1)` ab)
- Typing-Actions enthalten weiterhin `message_thread_id`
Topic-Vererbung: Topic-EintrĂ€ge erben Gruppeneinstellungen, sofern nicht ĂŒberschrieben (`requireMention`, `allowFrom`, `skills`, `systemPrompt`, `enabled`, `groupPolicy`).
`agentId` ist topic-spezifisch und erbt nicht von Gruppen-Defaults.
**Per-Topic-Agent-Routing**: Jedes Topic kann ĂŒber `agentId` in der Topic-Config an einen anderen Agenten geroutet werden. So bekommt jedes Topic seinen eigenen isolierten Workspace, Speicher und Sitzung. Beispiel:
```json5
{
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 Topic hat dann seinen eigenen Session-Key: `agent:zu:telegram:group:-1001234567890:topic:3`
**Persistente ACP-Topic-Bindung**: Forum-Topics können ACP-Harness-Sitzungen ĂŒber Top-Level-ACP-Bindings mit Typ pinnen:
- `bindings[]` mit `type: "acp"` und `match.channel: "telegram"`
Beispiel:
```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,
},
},
},
},
},
},
}
```
Das ist derzeit auf Forum-Topics in Gruppen und Supergruppen beschrÀnkt.
**Thread-gebundener ACP-Spawn aus dem Chat**:
- `/acp spawn <agent> --thread here|auto` kann das aktuelle Telegram-Topic an eine neue ACP-Sitzung binden.
- Folgenachrichten im Topic werden direkt an die gebundene ACP-Sitzung geroutet (kein `/acp steer` nötig).
- OpenClaw pinnt die Spawn-BestÀtigungsnachricht im Topic nach einer erfolgreichen Bindung.
- Erfordert `channels.telegram.threadBindings.spawnAcpSessions=true`.
Template-Kontext enthÀlt:
- `MessageThreadId`
- `IsForum`
DM-Thread-Verhalten:
- Private Chats mit `message_thread_id` behalten DM-Routing bei, verwenden aber thread-aware Session-Keys/Reply-Targets.
Audio, Video und Sticker
### Audionachrichten
Telegram unterscheidet zwischen Sprachnotizen und Audiodateien.
- Standard: Audiodatei-Verhalten
- Tag `[[audio_as_voice]]` in der Agent-Antwort, um den Versand als Sprachnotiz zu erzwingen
Nachrichtenaktion-Beispiel:
{
action: "send",
channel: "telegram",
to: "123456789",
media: "https://example.com/voice.ogg",
asVoice: true,
}
### Videonachrichten
Telegram unterscheidet zwischen Videodateien und Videonotizen.
Nachrichtenaktion-Beispiel:
{
action: "send",
channel: "telegram",
to: "123456789",
media: "https://example.com/video.mp4",
asVideoNote: true,
}
Videonotizen unterstĂŒtzen keine Untertitel; mitgegebener Nachrichtentext wird separat gesendet.
### Sticker
Eingehende Sticker-Verarbeitung:
- Statisch WEBP: wird heruntergeladen und verarbeitet (Platzhalter `<media:sticker>`)
- Animiert TGS: wird ĂŒbersprungen
- Video WEBM: wird ĂŒbersprungen
Sticker-Kontextfelder:
- `Sticker.emoji`
- `Sticker.setName`
- `Sticker.fileId`
- `Sticker.fileUniqueId`
- `Sticker.cachedDescription`
Sticker-Cache-Datei:
- `~/.openclaw/telegram/sticker-cache.json`
Sticker werden einmal beschrieben (wenn möglich) und gecacht, um wiederholte Vision-Aufrufe zu reduzieren.
Sticker-Aktionen aktivieren:
{
channels: {
telegram: {
actions: {
sticker: true,
},
},
},
}
Sticker senden:
{
action: "sticker",
channel: "telegram",
to: "123456789",
fileId: "CAACAgIAAxkBAAI...",
}
Gecachte Sticker durchsuchen:
{
action: "sticker-search",
channel: "telegram",
query: "cat waving",
limit: 5,
}
Reaktions-Benachrichtigungen
Telegram-Reaktionen kommen als `message_reaction`-Updates (getrennt von Nachrichten-Payloads).
Wenn aktiviert, reiht OpenClaw System-Events ein wie:
- `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:
- `own` bedeutet Benutzerreaktionen nur auf vom Bot gesendete Nachrichten (Best-Effort via Sent-Message-Cache).
- Reaktions-Events respektieren weiterhin die Telegram-Zugriffskontrolle (`dmPolicy`, `allowFrom`, `groupPolicy`, `groupAllowFrom`); nicht autorisierte Absender werden verworfen.
- Telegram liefert keine Thread-IDs in Reaktions-Updates.
- Nicht-Forum-Gruppen routen zur Gruppen-Chat-Sitzung
- Forum-Gruppen routen zur General-Topic-Sitzung (`:topic:1`), nicht zum exakten Ursprungs-Topic
`allowed_updates` fĂŒr Polling/Webhook enthĂ€lt automatisch `message_reaction`.
BestÀtigungsreaktionen
`ackReaction` sendet ein BestÀtigungs-Emoji, wÀhrend OpenClaw eine eingehende Nachricht verarbeitet.
Auflösungsreihenfolge:
- `channels.telegram.accounts.<accountId>.ackReaction`
- `channels.telegram.ackReaction`
- `messages.ackReaction`
- Agent-Identity-Emoji-Fallback (`agents.list[].identity.emoji`, sonst "đ")
Hinweise:
- Telegram erwartet Unicode-Emoji (z. B. "đ").
- Verwende `""`, um die Reaktion fĂŒr einen Kanal oder ein Konto zu deaktivieren.
Config-SchreibvorgĂ€nge ĂŒber Telegram-Events und -Befehle
Kanal-Config-SchreibvorgĂ€nge sind standardmĂ€Ăig aktiviert (`configWrites !== false`).
Von Telegram ausgelöste SchreibvorgÀnge umfassen:
- Gruppen-Migrationsereignisse (`migrate_to_chat_id`) zum Aktualisieren von `channels.telegram.groups`
- `/config set` und `/config unset` (erfordert Befehlsaktivierung)
Deaktivieren:
{
channels: {
telegram: {
configWrites: false,
},
},
}
Long Polling vs. Webhook
Standard: Long Polling.
Webhook-Modus:
- setze `channels.telegram.webhookUrl`
- setze `channels.telegram.webhookSecret` (erforderlich wenn Webhook-URL gesetzt)
- optional `channels.telegram.webhookPath` (Standard `/telegram-webhook`)
- optional `channels.telegram.webhookHost` (Standard `127.0.0.1`)
- optional `channels.telegram.webhookPort` (Standard `8787`)
Der Standard-lokale Listener fĂŒr den Webhook-Modus bindet an `127.0.0.1:8787`.
Weicht dein öffentlicher Endpunkt ab, stelle einen Reverse-Proxy davor und richte `webhookUrl` auf die öffentliche URL.
Setze `webhookHost` (z. B. `0.0.0.0`), wenn du bewusst externen Zugriff brauchst.
Limits, Retry und CLI-Ziele
- `channels.telegram.textChunkLimit` Standard ist 4000.
- `channels.telegram.chunkMode="newline"` bevorzugt Absatzgrenzen (Leerzeilen) vor der LĂ€ngenteilung.
- `channels.telegram.mediaMaxMb` (Standard 100) begrenzt ein-/ausgehende Telegram-MediengröĂen.
- `channels.telegram.timeoutSeconds` ĂŒberschreibt das Telegram-API-Client-Timeout (nicht gesetzt: grammY-Standard).
- Gruppenkontextverlauf nutzt `channels.telegram.historyLimit` oder `messages.groupChat.historyLimit` (Standard 50); `0` deaktiviert.
- DM-Verlaufssteuerung:
- `channels.telegram.dmHistoryLimit`
- `channels.telegram.dms["<user_id>"].historyLimit`
- `channels.telegram.retry`-Config gilt fĂŒr Telegram-Send-Helfer (CLI/Tools/Aktionen) bei behebbaren ausgehenden API-Fehlern.
CLI-Sendeziel kann numerische Chat-ID oder Username sein:
openclaw message send --channel telegram --target 123456789 --message "hi"
openclaw message send --channel telegram --target @name --message "hi"
Telegram-Umfragen nutzen `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
Telegram-spezifische Poll-Flags:
- `--poll-duration-seconds` (5-600)
- `--poll-anonymous`
- `--poll-public`
- `--thread-id` fĂŒr Forum-Topics (oder verwende ein `:topic:`-Ziel)
Action-Gating:
- `channels.telegram.actions.sendMessage=false` deaktiviert ausgehende Telegram-Nachrichten, einschlieĂlich Polls
- `channels.telegram.actions.poll=false` deaktiviert die Telegram-Poll-Erstellung, lÀsst aber regulÀre Sends aktiviert
Exec-Genehmigungen in Telegram
Telegram unterstĂŒtzt Exec-Genehmigungen in den DMs der Genehmiger und kann optional Genehmigungsaufforderungen im Ursprungs-Chat oder -Topic anzeigen.
Config-Pfad:
- `channels.telegram.execApprovals.enabled`
- `channels.telegram.execApprovals.approvers`
- `channels.telegram.execApprovals.target` (`dm` | `channel` | `both`, Standard: `dm`)
- `agentFilter`, `sessionFilter`
Genehmiger mĂŒssen numerische Telegram-User-IDs sein. Ist `enabled` false oder `approvers` leer, agiert Telegram nicht als Exec-Approval-Client. Genehmigungsanfragen fallen auf andere konfigurierte Genehmigungswege oder die Exec-Approval-Fallback-Richtlinie zurĂŒck.
Zustellungsregeln:
- `target: "dm"` sendet Genehmigungsaufforderungen nur an konfigurierte Genehmiger-DMs
- `target: "channel"` sendet die Aufforderung zurĂŒck in den Ursprungs-Chat/das Ursprungs-Topic
- `target: "both"` sendet an Genehmiger-DMs und den Ursprungs-Chat/das Ursprungs-Topic
Nur konfigurierte Genehmiger können genehmigen oder ablehnen. Nicht-Genehmiger können `/approve` nicht nutzen und auch keine Telegram-Genehmigungsbuttons verwenden.
Kanal-Zustellung zeigt den Befehlstext im Chat, aktiviere `channel` oder `both` daher nur in vertrauenswĂŒrdigen Gruppen/Topics. Landet die Aufforderung in einem Forum-Topic, bewahrt OpenClaw das Topic sowohl fĂŒr die Genehmigungsaufforderung als auch das Follow-up nach Genehmigung.
Inline-Genehmigungsbuttons hÀngen zudem von `channels.telegram.capabilities.inlineButtons` ab, das die ZieloberflÀche erlauben muss (`dm`, `group` oder `all`).
Verwandte Docs: [Exec-Genehmigungen](/docs/tools/exec-approvals)
Fehlerbehebung
Bot antwortet nicht auf Gruppennachrichten ohne Mention
- Wenn `requireMention=false`, muss der Telegram-Privacy-Modus volle Sichtbarkeit erlauben.
- BotFather: `/setprivacy` -> Disable
- dann Bot aus der Gruppe entfernen und neu hinzufĂŒgen
- `openclaw channels status` warnt, wenn die Config unerwÀhnte Gruppennachrichten erwartet.
- `openclaw channels status --probe` kann explizite numerische Gruppen-IDs prĂŒfen; Wildcard `"*"` kann nicht per Mitgliedschaft geprobt werden.
- Schneller Sitzungstest: `/activation always`.
Bot sieht Gruppennachrichten ĂŒberhaupt nicht
- Wenn `channels.telegram.groups` existiert, muss die Gruppe aufgelistet sein (oder `"*"` enthalten)
- PrĂŒfe die Bot-Mitgliedschaft in der Gruppe
- PrĂŒfe Logs: `openclaw logs --follow` fĂŒr Skip-GrĂŒnde
Befehle funktionieren teilweise oder gar nicht
- Autorisiere deine AbsenderidentitÀt (Pairing und/oder numerische `allowFrom`)
- Befehlsautorisierung greift auch bei `groupPolicy: "open"`
- `setMyCommands failed` mit `BOT_COMMANDS_TOO_MUCH` bedeutet, das native MenĂŒ hat zu viele EintrĂ€ge; reduziere Plugin-/Skill-/benutzerdefinierte Befehle oder deaktiviere native MenĂŒs
- `setMyCommands failed` mit Netzwerk-/Fetch-Fehlern deutet meist auf DNS-/HTTPS-Erreichbarkeitsprobleme zu `api.telegram.org` hin
Polling- oder NetzwerkinstabilitÀt
- Node 22+ + custom fetch/proxy kann bei AbortSignal-Typ-Diskrepanzen sofortiges Abbruchverhalten auslösen.
- Manche Hosts lösen `api.telegram.org` zuerst auf IPv6 auf; defekter IPv6-Egress kann zu intermittierenden Telegram-API-Fehlern fĂŒhren.
- Enthalten die Logs `TypeError: fetch failed` oder `Network request for 'getUpdates' failed!`, behandelt OpenClaw diese jetzt als behebbare Netzwerkfehler mit Retry.
- Auf VPS-Hosts mit instabilem direktem Egress/TLS leite Telegram-API-Aufrufe ĂŒber `channels.telegram.proxy`:
channels:
telegram:
proxy: socks5://<user>:<password>@proxy-host:1080
- Node 22+ setzt standardmĂ€Ăig `autoSelectFamily=true` (auĂer WSL2) und `dnsResultOrder=ipv4first`.
- Funktioniert dein Host mit WSL2 oder explizit besser mit IPv4-only, erzwinge die Familienauswahl:
channels:
telegram:
network:
autoSelectFamily: false
- Umgebungs-Overrides (temporÀr):
- `OPENCLAW_TELEGRAM_DISABLE_AUTO_SELECT_FAMILY=1`
- `OPENCLAW_TELEGRAM_ENABLE_AUTO_SELECT_FAMILY=1`
- `OPENCLAW_TELEGRAM_DNS_RESULT_ORDER=ipv4first`
- DNS-Antworten prĂŒfen:
dig +short api.telegram.org A
dig +short api.telegram.org AAAA
Weitere Hilfe: Kanal-Fehlerbehebung.
Telegram-Konfigurationsreferenz-Verweise
PrimÀre Referenz:
-
channels.telegram.enabled: Kanal-Start aktivieren/deaktivieren. -
channels.telegram.botToken: Bot-Token (BotFather). -
channels.telegram.tokenFile: Token aus einer regulÀren Datei lesen. Symlinks werden abgelehnt. -
channels.telegram.dmPolicy:pairing | allowlist | open | disabled(Standard: pairing). -
channels.telegram.allowFrom: DM-Allowlist (numerische Telegram-User-IDs).allowlisterfordert mindestens eine Absender-ID.openerfordert"*".openclaw doctor --fixkann Legacy-@username-EintrÀge zu IDs auflösen und Allowlist-EintrÀge aus Pairing-Store-Dateien bei Allowlist-Migrationen wiederherstellen. -
channels.telegram.actions.poll: Telegram-Poll-Erstellung aktivieren oder deaktivieren (Standard: aktiviert; erfordert weiterhinsendMessage). -
channels.telegram.defaultTo: Standard-Telegram-Ziel fĂŒr CLI--deliver, wenn kein explizites--reply-toangegeben ist. -
channels.telegram.groupPolicy:open | allowlist | disabled(Standard: allowlist). -
channels.telegram.groupAllowFrom: Gruppen-Absender-Allowlist (numerische Telegram-User-IDs).openclaw doctor --fixkann Legacy-@username-EintrÀge zu IDs auflösen. Nicht-numerische EintrÀge werden bei der Auth ignoriert. Gruppen-Auth nutzt keinen DM-Pairing-Store-Fallback (2026.2.25+). -
Multi-Account-Rangfolge:
- Bei zwei oder mehr konfigurierten Account-IDs setze
channels.telegram.defaultAccount(oder fĂŒgechannels.telegram.accounts.defaultein), um das Standard-Routing explizit zu machen. - Ist keines gesetzt, fĂ€llt OpenClaw auf die erste normalisierte Account-ID zurĂŒck und
openclaw doctorwarnt. channels.telegram.accounts.default.allowFromundchannels.telegram.accounts.default.groupAllowFromgelten nur fĂŒr dasdefault-Konto.- Benannte Konten erben
channels.telegram.allowFromundchannels.telegram.groupAllowFrom, wenn keine eigenen Werte gesetzt sind. - Benannte Konten erben nicht
channels.telegram.accounts.default.allowFrom/groupAllowFrom.
- Bei zwei oder mehr konfigurierten Account-IDs setze
-
channels.telegram.groups: Per-Group-Defaults + Allowlist (verwende"*"fĂŒr globale Defaults).channels.telegram.groups.<id>.groupPolicy: Per-Group-Override fĂŒr groupPolicy (open | allowlist | disabled).channels.telegram.groups.<id>.requireMention: Mention-Gating-Standard.channels.telegram.groups.<id>.skills: Skill-Filter (weglassen = alle Skills, leer = keine).channels.telegram.groups.<id>.allowFrom: Per-Group-Absender-Allowlist-Override.channels.telegram.groups.<id>.systemPrompt: zusĂ€tzlicher System-Prompt fĂŒr die Gruppe.channels.telegram.groups.<id>.enabled: Gruppe deaktivieren wennfalse.channels.telegram.groups.<id>.topics.<threadId>.*: Per-Topic-Overrides (Gruppenfelder + topic-exklusivesagentId).channels.telegram.groups.<id>.topics.<threadId>.agentId: dieses Topic an einen bestimmten Agenten routen (ĂŒberschreibt Group-Level- und Binding-Routing).
-
channels.telegram.groups.<id>.topics.<threadId>.groupPolicy: Per-Topic-Override fĂŒr groupPolicy (open | allowlist | disabled). -
channels.telegram.groups.<id>.topics.<threadId>.requireMention: Per-Topic-Mention-Gating-Override. -
Top-Level
bindings[]mittype: "acp"und kanonischer Topic-IDchatId:topic:topicIdinmatch.peer.id: persistente ACP-Topic-Bindungsfelder (siehe ACP Agents). -
channels.telegram.direct.<id>.topics.<threadId>.agentId: DM-Topics an einen bestimmten Agenten routen (gleiches Verhalten wie Forum-Topics). -
channels.telegram.execApprovals.enabled: Telegram als chat-basierten Exec-Approval-Client fĂŒr dieses Konto aktivieren. -
channels.telegram.execApprovals.approvers: Telegram-User-IDs, die Exec-Anfragen genehmigen oder ablehnen dĂŒrfen. Erforderlich wenn Exec-Approvals aktiviert sind. -
channels.telegram.execApprovals.target:dm | channel | both(Standard:dm).channelundbothbewahren das Ursprungs-Telegram-Topic wenn vorhanden. -
channels.telegram.execApprovals.agentFilter: optionaler Agent-ID-Filter fĂŒr weitergeleitete Genehmigungsaufforderungen. -
channels.telegram.execApprovals.sessionFilter: optionaler Session-Key-Filter (Substring oder Regex) fĂŒr weitergeleitete Genehmigungsaufforderungen. -
channels.telegram.accounts.<account>.execApprovals: Per-Account-Override fĂŒr Telegram-Exec-Approval-Routing und Genehmiger-Autorisierung. -
channels.telegram.capabilities.inlineButtons:off | dm | group | all | allowlist(Standard: allowlist). -
channels.telegram.accounts.<account>.capabilities.inlineButtons: Per-Account-Override. -
channels.telegram.commands.nativeSkills: native Skill-Befehle fĂŒr Telegram aktivieren/deaktivieren. -
channels.telegram.replyToMode:off | first | all(Standard:off). -
channels.telegram.textChunkLimit: ausgehende Chunk-GröĂe (Zeichen). -
channels.telegram.chunkMode:length(Standard) odernewlinezum Teilen an Leerzeilen (Absatzgrenzen) vor dem LĂ€ngen-Chunking. -
channels.telegram.linkPreview: Link-Vorschauen fĂŒr ausgehende Nachrichten umschalten (Standard: true). -
channels.telegram.streaming:off | partial | block | progress(Live-Stream-Vorschau; Standard:partial;progresswird aufpartialgemappt;blockist Legacy-Vorschaumodus-KompatibilitÀt). Telegram-Vorschau-Streaming nutzt eine einzelne Vorschaunachricht, die direkt bearbeitet wird. -
channels.telegram.mediaMaxMb: ein-/ausgehende Telegram-Medienbegrenzung (MB, Standard: 100). -
channels.telegram.retry: Retry-Policy fĂŒr Telegram-Send-Helfer (CLI/Tools/Aktionen) bei behebbaren ausgehenden API-Fehlern (attempts, minDelayMs, maxDelayMs, jitter). -
channels.telegram.network.autoSelectFamily: Override fĂŒr Node autoSelectFamily (true=aktivieren, false=deaktivieren). Standard: aktiviert auf Node 22+, WSL2 standardmĂ€Ăig deaktiviert. -
channels.telegram.network.dnsResultOrder: Override fĂŒr DNS-Ergebnisreihenfolge (ipv4firstoderverbatim). Standard:ipv4firstauf Node 22+. -
channels.telegram.proxy: Proxy-URL fĂŒr Bot-API-Aufrufe (SOCKS/HTTP). -
channels.telegram.webhookUrl: Webhook-Modus aktivieren (erfordertchannels.telegram.webhookSecret). -
channels.telegram.webhookSecret: Webhook-Secret (erforderlich wenn webhookUrl gesetzt). -
channels.telegram.webhookPath: lokaler Webhook-Pfad (Standard/telegram-webhook). -
channels.telegram.webhookHost: lokaler Webhook-Bind-Host (Standard127.0.0.1). -
channels.telegram.webhookPort: lokaler Webhook-Bind-Port (Standard8787). -
channels.telegram.actions.reactions: Gate fĂŒr Telegram-Tool-Reaktionen. -
channels.telegram.actions.sendMessage: Gate fĂŒr Telegram-Tool-Nachrichtenversand. -
channels.telegram.actions.deleteMessage: Gate fĂŒr Telegram-Tool-Nachrichtenlöschung. -
channels.telegram.actions.sticker: Gate fĂŒr Telegram-Sticker-Aktionen â Senden und Suchen (Standard: false). -
channels.telegram.reactionNotifications:off | own | allâ steuert, welche Reaktionen System-Events auslösen (Standard:ownwenn nicht gesetzt). -
channels.telegram.reactionLevel:off | ack | minimal | extensiveâ steuert die ReaktionsfĂ€higkeit des Agenten (Standard:minimalwenn nicht gesetzt).
Telegram-spezifische wichtige Felder:
- Startup/Auth:
enabled,botToken,tokenFile,accounts.*(tokenFilemuss auf eine regulÀre Datei zeigen; Symlinks werden abgelehnt) - Zugriffskontrolle:
dmPolicy,allowFrom,groupPolicy,groupAllowFrom,groups,groups.*.topics.*, Top-Levelbindings[](type: "acp") - Exec-Genehmigungen:
execApprovals,accounts.*.execApprovals - Befehl/MenĂŒ:
commands.native,commands.nativeSkills,customCommands - Threading/Antworten:
replyToMode - Streaming:
streaming(Vorschau),blockStreaming - Formatierung/Zustellung:
textChunkLimit,chunkMode,linkPreview,responsePrefix - Medien/Netzwerk:
mediaMaxMb,timeoutSeconds,retry,network.autoSelectFamily,proxy - Webhook:
webhookUrl,webhookSecret,webhookPath,webhookHost - Aktionen/Capabilities:
capabilities.inlineButtons,actions.sendMessage|editMessage|deleteMessage|reactions|sticker - Reaktionen:
reactionNotifications,reactionLevel - SchreibvorgÀnge/Verlauf:
configWrites,historyLimit,dmHistoryLimit,dms.*.historyLimit