Telegram (Bot API)

Status: Produktionsreif fĂŒr Bot-DMs und Gruppen via grammY. Long Polling ist der Standardmodus; Webhook-Modus ist optional.

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_TOKEN gilt 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: groupAllowFrom ist 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_id tragen; 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 (sendReadReceipts greift 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). allowlist erfordert mindestens eine Absender-ID. open erfordert "*". openclaw doctor --fix kann 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 weiterhin sendMessage).

  • channels.telegram.defaultTo: Standard-Telegram-Ziel fĂŒr CLI --deliver, wenn kein explizites --reply-to angegeben ist.

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

  • channels.telegram.groupAllowFrom: Gruppen-Absender-Allowlist (numerische Telegram-User-IDs). openclaw doctor --fix kann 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ĂŒge channels.telegram.accounts.default ein), um das Standard-Routing explizit zu machen.
    • Ist keines gesetzt, fĂ€llt OpenClaw auf die erste normalisierte Account-ID zurĂŒck und openclaw doctor warnt.
    • channels.telegram.accounts.default.allowFrom und channels.telegram.accounts.default.groupAllowFrom gelten nur fĂŒr das default-Konto.
    • Benannte Konten erben channels.telegram.allowFrom und channels.telegram.groupAllowFrom, wenn keine eigenen Werte gesetzt sind.
    • Benannte Konten erben nicht channels.telegram.accounts.default.allowFrom/groupAllowFrom.
  • 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 wenn false.
    • channels.telegram.groups.<id>.topics.<threadId>.*: Per-Topic-Overrides (Gruppenfelder + topic-exklusives agentId).
    • 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[] mit type: "acp" und kanonischer Topic-ID chatId:topic:topicId in match.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). channel und both bewahren 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) oder newline zum 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; progress wird auf partial gemappt; block ist 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 (ipv4first oder verbatim). Standard: ipv4first auf Node 22+.

  • channels.telegram.proxy: Proxy-URL fĂŒr Bot-API-Aufrufe (SOCKS/HTTP).

  • channels.telegram.webhookUrl: Webhook-Modus aktivieren (erfordert channels.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 (Standard 127.0.0.1).

  • channels.telegram.webhookPort: lokaler Webhook-Bind-Port (Standard 8787).

  • 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: own wenn nicht gesetzt).

  • channels.telegram.reactionLevel: off | ack | minimal | extensive — steuert die ReaktionsfĂ€higkeit des Agenten (Standard: minimal wenn nicht gesetzt).

  • Konfigurationsreferenz - Telegram

Telegram-spezifische wichtige Felder:

  • Startup/Auth: enabled, botToken, tokenFile, accounts.* (tokenFile muss auf eine regulĂ€re Datei zeigen; Symlinks werden abgelehnt)
  • Zugriffskontrolle: dmPolicy, allowFrom, groupPolicy, groupAllowFrom, groups, groups.*.topics.*, Top-Level bindings[] (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

Verwandte Seiten