Telegram (Bot API)

Статус: готов к продакшну для ЛС и групп через grammY. По умолчанию используется long polling; режим webhook опционален.

Быстрая настройка

Шаг 1: Создайте токен бота в BotFather

Откройте Telegram и начните чат с **@BotFather** (убедитесь, что хендл в точности `@BotFather`).

Выполните `/newbot`, следуйте инструкциям и сохраните токен.

Шаг 2: Настройте токен и политику ЛС

{
  channels: {
    telegram: {
      enabled: true,
      botToken: "123:abc",
      dmPolicy: "pairing",
      groups: { "*": { requireMention: true } },
    },
  },
}
Резервная переменная окружения: `TELEGRAM_BOT_TOKEN=...` (только для аккаунта по умолчанию).
Telegram **не** использует `openclaw channels login telegram`; настройте токен в конфигурации/env и запустите шлюз.

Шаг 3: Запустите шлюз и подтвердите первое ЛС

openclaw gateway
openclaw pairing list telegram
openclaw pairing approve telegram <CODE>
Коды спаривания действуют 1 час.

Шаг 4: Добавьте бота в группу

Добавьте бота в группу, затем настройте `channels.telegram.groups` и `groupPolicy` в соответствии с вашей моделью доступа.

Примечание: Порядок разрешения токена учитывает аккаунт. На практике значения из конфигурации имеют приоритет над переменными окружения, и TELEGRAM_BOT_TOKEN применяется только к аккаунту по умолчанию.

Настройки на стороне Telegram

Режим конфиденциальности и видимость в группах
По умолчанию Telegram-боты работают в **режиме конфиденциальности**, который ограничивает получение сообщений в группах.

Если бот должен видеть все сообщения группы, либо:

- отключите режим конфиденциальности через `/setprivacy`, либо
- сделайте бота администратором группы.

При переключении режима конфиденциальности удалите и заново добавьте бота в каждую группу, чтобы Telegram применил изменение.
Разрешения в группах
Статус администратора управляется в настройках группы Telegram.

Боты-администраторы получают все сообщения группы, что полезно для постоянно активного режима.
Полезные переключатели BotFather
- `/setjoingroups` — разрешить/запретить добавление в группы
- `/setprivacy` — поведение видимости в группах

Управление доступом и активация

Политика ЛС

`channels.telegram.dmPolicy` управляет доступом к личным сообщениям:

- `pairing` (по умолчанию)
- `allowlist` (требуется хотя бы один ID отправителя в `allowFrom`)
- `open` (требуется `"*"` в `allowFrom`)
- `disabled`

`channels.telegram.allowFrom` принимает числовые Telegram user ID. Префиксы `telegram:` / `tg:` допускаются и нормализуются.
`dmPolicy: "allowlist"` с пустым `allowFrom` блокирует все ЛС и отклоняется валидацией конфигурации.
Мастер настройки принимает ввод `@username` и разрешает его в числовые ID.
Если при обновлении конфигурация содержит `@username` в allowlist, запустите `openclaw doctor --fix` для разрешения (best-effort; требуется токен Telegram-бота).
Если ранее вы полагались на файлы allowlist из хранилища спаривания, `openclaw doctor --fix` может восстановить записи в `channels.telegram.allowFrom` при миграции allowlist (например, когда `dmPolicy: "allowlist"` без явных ID).

Для ботов с одним владельцем предпочитайте `dmPolicy: "allowlist"` с явными числовыми `allowFrom` ID — это сохраняет политику доступа в конфигурации (а не полагается на предыдущие одобрения спаривания).

### Определение вашего Telegram user ID

Безопасный способ (без сторонних ботов):

1. Напишите боту в ЛС.
2. Запустите `openclaw logs --follow`.
3. Прочитайте `from.id`.

Через Bot API:
curl "https://api.telegram.org/bot<bot_token>/getUpdates"
Сторонний способ (менее приватный): `@userinfobot` или `@getidsbot`.

Политика групп и allowlist

Два механизма работают совместно:

1. **Какие группы разрешены** (`channels.telegram.groups`)
   - нет конфигурации `groups`:
     - при `groupPolicy: "open"`: любая группа проходит проверку group-ID
     - при `groupPolicy: "allowlist"` (по умолчанию): группы блокируются, пока вы не добавите записи в `groups` (или `"*"`)
   - `groups` настроен: работает как allowlist (явные ID или `"*"`)

2. **Какие отправители разрешены в группах** (`channels.telegram.groupPolicy`)
   - `open`
   - `allowlist` (по умолчанию)
   - `disabled`

`groupAllowFrom` используется для фильтрации отправителей в группах. Если не задан, Telegram откатывается к `allowFrom`.
Записи `groupAllowFrom` должны быть числовыми Telegram user ID (префиксы `telegram:` / `tg:` нормализуются).
Не помещайте ID групп или супергрупп Telegram в `groupAllowFrom`. Отрицательные ID чатов относятся к `channels.telegram.groups`.
Нечисловые записи игнорируются при авторизации отправителей.
Граница безопасности (`2026.2.25+`): авторизация отправителей в группах **не** наследует одобрения из хранилища спаривания ЛС.
Спаривание остаётся только для ЛС. Для групп задайте `groupAllowFrom` или `allowFrom` для конкретной группы/темы.
Замечание по рантайму: если `channels.telegram` полностью отсутствует, рантайм откатывается к закрытому `groupPolicy="allowlist"`, если `channels.defaults.groupPolicy` не задан явно.

Пример: разрешить любого участника в конкретной группе:
{
  channels: {
    telegram: {
      groups: {
        "-1001234567890": {
          groupPolicy: "open",
          requireMention: false,
        },
      },
    },
  },
}
Пример: разрешить только определённых пользователей в конкретной группе:
{
  channels: {
    telegram: {
      groups: {
        "-1001234567890": {
          requireMention: true,
          allowFrom: ["8734062810", "745123456"],
        },
      },
    },
  },
}
> **Предупреждение:**

Распространённая ошибка: groupAllowFrom — это не allowlist групп Telegram.

  - Отрицательные ID групп и супергрупп вроде `-1001234567890` помещайте в `channels.telegram.groups`.
  - Telegram user ID вроде `8734062810` помещайте в `groupAllowFrom`, если хотите ограничить, кто из участников разрешённой группы может обращаться к боту.
  - Используйте `groupAllowFrom: ["*"]` только если хотите, чтобы любой участник разрешённой группы мог общаться с ботом.

Поведение упоминаний

Ответы в группах по умолчанию требуют упоминания.

Упоминание может быть:

- нативным `@botusername`, или
- паттерном из:
  - `agents.list[].groupChat.mentionPatterns`
  - `messages.groupChat.mentionPatterns`

Переключатели на уровне сессии:

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

Они обновляют только состояние сессии. Для постоянства используйте конфигурацию.

Пример в конфигурации:
{
  channels: {
    telegram: {
      groups: {
        "*": { requireMention: false },
      },
    },
  },
}
Получение chat ID группы:

- перешлите сообщение из группы в `@userinfobot` / `@getidsbot`
- или прочитайте `chat.id` из `openclaw logs --follow`
- или проверьте Bot API `getUpdates`

Поведение в рантайме

  • Telegram управляется процессом шлюза.
  • Маршрутизация детерминирована: входящие из Telegram возвращаются обратно в Telegram (модель не выбирает каналы).
  • Входящие сообщения нормализуются в общий конверт канала с метаданными ответов и placeholder-ами медиа.
  • Сессии групп изолированы по group ID. Темы форумов добавляют :topic:<threadId> для изоляции тем.
  • ЛС-сообщения могут нести message_thread_id; OpenClaw маршрутизирует их с ключами сессий, учитывающими треды, и сохраняет thread ID для ответов.
  • Long polling использует grammY runner с последовательной обработкой по чату/треду. Общая конкурентность sink определяется agents.defaults.maxConcurrent.
  • Telegram Bot API не поддерживает уведомления о прочтении (sendReadReceipts не применяется).

Справочник функций

Потоковый предпросмотр (редактирование сообщений)
OpenClaw может стримить частичные ответы в реальном времени:

- прямые чаты: превью-сообщение + `editMessageText`
- группы/темы: превью-сообщение + `editMessageText`

Требования:

- `channels.telegram.streaming`: `off | partial | block | progress` (по умолчанию: `partial`)
- `progress` соответствует `partial` в Telegram (для совместимости кросс-канальных названий)
- устаревшие `channels.telegram.streamMode` и булевые значения `streaming` автоматически мигрируются

Для текстовых ответов:

- ЛС: OpenClaw сохраняет то же превью-сообщение и делает финальное редактирование на месте (без второго сообщения)
- группа/тема: OpenClaw сохраняет то же превью-сообщение и делает финальное редактирование на месте (без второго сообщения)

Для сложных ответов (например, медиа) OpenClaw откатывается к стандартной финальной доставке и затем удаляет превью-сообщение.

Потоковый предпросмотр и блочный стриминг — разные вещи. Если блочный стриминг явно включён для Telegram, OpenClaw пропускает предпросмотр, чтобы избежать двойного стриминга.

Если нативный транспорт черновиков недоступен/отклонён, OpenClaw автоматически откатывается к `sendMessage` + `editMessageText`.

Стриминг рассуждений (только Telegram):

- `/reasoning stream` отправляет рассуждения в живой предпросмотр во время генерации
- финальный ответ отправляется без текста рассуждений
Форматирование и HTML-откат
Исходящий текст использует `parse_mode: "HTML"` Telegram.

- Текст в стиле Markdown рендерится в HTML, безопасный для Telegram.
- Сырой HTML модели экранируется для снижения ошибок парсинга Telegram.
- Если Telegram отклоняет HTML, OpenClaw повторяет отправку как обычный текст.

Предпросмотр ссылок включён по умолчанию и может быть отключён через `channels.telegram.linkPreview: false`.
Нативные и пользовательские команды
Регистрация меню команд Telegram обрабатывается при запуске через `setMyCommands`.

Настройки нативных команд по умолчанию:

- `commands.native: "auto"` включает нативные команды для Telegram

Добавление пользовательских пунктов меню:
{
  channels: {
    telegram: {
      customCommands: [
        { command: "backup", description: "Git backup" },
        { command: "generate", description: "Create an image" },
      ],
    },
  },
}
Правила:

- имена нормализуются (удаляется начальный `/`, приводятся к нижнему регистру)
- допустимый паттерн: `a-z`, `0-9`, `_`, длина `1..32`
- пользовательские команды не могут переопределять нативные
- конфликты/дубликаты пропускаются и логируются

Замечания:

- пользовательские команды — это только пункты меню; они не реализуют поведение автоматически
- команды плагинов/навыков могут работать при вводе, даже если не отображаются в меню Telegram

При отключении нативных команд встроенные удаляются. Пользовательские/плагинные команды могут по-прежнему регистрироваться при настройке.

Типичные ошибки настройки:

- `setMyCommands failed` с `BOT_COMMANDS_TOO_MUCH` означает, что меню Telegram переполнилось после обрезки; уменьшите количество плагинных/скилловых/пользовательских команд или отключите `channels.telegram.commands.native`.
- `setMyCommands failed` с ошибками сети обычно означает, что исходящий DNS/HTTPS к `api.telegram.org` заблокирован.

### Команды спаривания устройств (плагин `device-pair`)

При установленном плагине `device-pair`:

1. `/pair` генерирует код настройки
2. вставьте код в iOS-приложение
3. `/pair approve` одобряет последний ожидающий запрос

Подробнее: [Спаривание](/docs/channels/pairing#pair-via-telegram-recommended-for-ios).
Inline-кнопки
Настройка области inline keyboard:
{
  channels: {
    telegram: {
      capabilities: {
        inlineButtons: "allowlist",
      },
    },
  },
}
Переопределение для аккаунта:
{
  channels: {
    telegram: {
      accounts: {
        main: {
          capabilities: {
            inlineButtons: "allowlist",
          },
        },
      },
    },
  },
}
Области:

- `off`
- `dm`
- `group`
- `all`
- `allowlist` (по умолчанию)

Устаревшее `capabilities: ["inlineButtons"]` соответствует `inlineButtons: "all"`.

Пример действия message:
{
  action: "send",
  channel: "telegram",
  to: "123456789",
  message: "Choose an option:",
  buttons: [
    [
      { text: "Yes", callback_data: "yes" },
      { text: "No", callback_data: "no" },
    ],
    [{ text: "Cancel", callback_data: "cancel" }],
  ],
}
Клики по callback передаются агенту как текст:
`callback_data: <value>`
Действия с сообщениями Telegram для агентов и автоматизации
Действия инструмента Telegram включают:

- `sendMessage` (`to`, `content`, опционально `mediaUrl`, `replyToMessageId`, `messageThreadId`)
- `react` (`chatId`, `messageId`, `emoji`)
- `deleteMessage` (`chatId`, `messageId`)
- `editMessage` (`chatId`, `messageId`, `content`)
- `createForumTopic` (`chatId`, `name`, опционально `iconColor`, `iconCustomEmojiId`)

Действия с сообщениями канала предоставляют эргономичные алиасы (`send`, `react`, `delete`, `edit`, `sticker`, `sticker-search`, `topic-create`).

Шлюзы управления:

- `channels.telegram.actions.sendMessage`
- `channels.telegram.actions.deleteMessage`
- `channels.telegram.actions.reactions`
- `channels.telegram.actions.sticker` (по умолчанию: отключено)

> **Примечание:** `edit` и `topic-create` включены по умолчанию и не имеют отдельных переключателей `channels.telegram.actions.*`.
Отправки в рантайме используют активный снимок конфигурации/секретов (при запуске/перезагрузке), поэтому пути действий не выполняют повторное разрешение SecretRef при каждой отправке.

Семантика удаления реакций: [/tools/reactions](/docs/tools/reactions)
Теги тредирования ответов
Telegram поддерживает явные теги тредирования в генерируемом выводе:

- `[[reply_to_current]]` — ответ на вызвавшее сообщение
- `[[reply_to:<id>]]` — ответ на конкретное сообщение Telegram по ID

`channels.telegram.replyToMode` управляет обработкой:

- `off` (по умолчанию)
- `first`
- `all`

> **Примечание:** `off` отключает неявное тредирование ответов. Явные теги `[[reply_to_*]]` по-прежнему обрабатываются.
Темы форумов и поведение тредов
Форумные супергруппы:

- ключи сессий тем добавляют `:topic:<threadId>`
- ответы и индикатор набора текста нацелены на тред темы
- путь конфигурации тем:
  `channels.telegram.groups.<chatId>.topics.<threadId>`

Особый случай General topic (`threadId=1`):

- отправка сообщений опускает `message_thread_id` (Telegram отклоняет `sendMessage(...thread_id=1)`)
- действия typing по-прежнему включают `message_thread_id`

Наследование тем: записи тем наследуют настройки группы, если не переопределены (`requireMention`, `allowFrom`, `skills`, `systemPrompt`, `enabled`, `groupPolicy`).
`agentId` — только для темы и не наследуется от группы.

**Маршрутизация агентов по темам**: Каждая тема может направляться к другому агенту через `agentId` в конфигурации темы. Это даёт каждой теме изолированное рабочее пространство, память и сессию. Пример:

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

Каждая тема получает собственный ключ сессии: `agent:zu:telegram:group:-1001234567890:topic:3`

**Постоянная ACP-привязка темы**: Темы форума могут закреплять ACP harness-сессии через типизированные ACP-привязки верхнего уровня:

- `bindings[]` с `type: "acp"` и `match.channel: "telegram"`

Пример:

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

Пока область привязки ограничена темами форумов в группах и супергруппах.

**Порождение ACP с привязкой к треду из чата**:

- `/acp spawn <agent> --thread here|auto` может привязать текущую тему Telegram к новой ACP-сессии.
- Последующие сообщения в теме маршрутизируются напрямую в привязанную ACP-сессию (без необходимости `/acp steer`).
- OpenClaw закрепляет сообщение подтверждения порождения в теме после успешной привязки.
- Требует `channels.telegram.threadBindings.spawnAcpSessions=true`.

Контекст шаблонов включает:

- `MessageThreadId`
- `IsForum`

Поведение тредов в ЛС:

- приватные чаты с `message_thread_id` сохраняют маршрутизацию ЛС, но используют ключи сессий и адресаты ответов с учётом тредов.
Аудио, видео и стикеры
### Аудиосообщения

Telegram различает голосовые заметки и аудиофайлы.

- по умолчанию: поведение аудиофайла
- тег `[[audio_as_voice]]` в ответе агента для принудительной отправки голосовой заметкой

Пример действия message:
{
  action: "send",
  channel: "telegram",
  to: "123456789",
  media: "https://example.com/voice.ogg",
  asVoice: true,
}
### Видеосообщения

Telegram различает видеофайлы и видеозаметки.

Пример действия message:
{
  action: "send",
  channel: "telegram",
  to: "123456789",
  media: "https://example.com/video.mp4",
  asVideoNote: true,
}
Видеозаметки не поддерживают подписи; текст сообщения отправляется отдельно.

### Стикеры

Обработка входящих стикеров:

- статичные WEBP: загружаются и обрабатываются (placeholder `<media:sticker>`)
- анимированные TGS: пропускаются
- видео WEBM: пропускаются

Контекстные поля стикеров:

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

Файл кэша стикеров:

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

Стикеры описываются один раз (при возможности) и кэшируются для снижения повторных обращений к vision.

Включение действий со стикерами:
{
  channels: {
    telegram: {
      actions: {
        sticker: true,
      },
    },
  },
}
Отправка стикера:
{
  action: "sticker",
  channel: "telegram",
  to: "123456789",
  fileId: "CAACAgIAAxkBAAI...",
}
Поиск кэшированных стикеров:
{
  action: "sticker-search",
  channel: "telegram",
  query: "cat waving",
  limit: 5,
}
Уведомления о реакциях
Реакции Telegram приходят как обновления `message_reaction` (отдельно от полезных нагрузок сообщений).

При включении OpenClaw ставит в очередь системные события:

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

Конфигурация:

- `channels.telegram.reactionNotifications`: `off | own | all` (по умолчанию: `own`)
- `channels.telegram.reactionLevel`: `off | ack | minimal | extensive` (по умолчанию: `minimal`)

Замечания:

- `own` означает только реакции пользователей на сообщения бота (best-effort через кэш отправленных сообщений).
- События реакций по-прежнему подчиняются правилам доступа Telegram (`dmPolicy`, `allowFrom`, `groupPolicy`, `groupAllowFrom`); неавторизованные отправители отбрасываются.
- Telegram не предоставляет ID тредов в обновлениях реакций.
  - не-форумные группы маршрутизируют в сессию группового чата
  - форумные группы маршрутизируют в сессию общей темы группы (`:topic:1`), а не в точную исходную тему

`allowed_updates` для polling/webhook автоматически включают `message_reaction`.
Реакция подтверждения
`ackReaction` отправляет эмодзи подтверждения, пока OpenClaw обрабатывает входящее сообщение.

Порядок разрешения:

- `channels.telegram.accounts.<accountId>.ackReaction`
- `channels.telegram.ackReaction`
- `messages.ackReaction`
- резервный эмодзи из идентичности агента (`agents.list[].identity.emoji`, иначе "👀")

Замечания:

- Telegram ожидает unicode-эмодзи (например "👀").
- Используйте `""` для отключения реакции для канала или аккаунта.
Запись конфигурации из событий и команд Telegram
Запись конфигурации из канала включена по умолчанию (`configWrites !== false`).

Записи, инициируемые Telegram:

- события миграции групп (`migrate_to_chat_id`) для обновления `channels.telegram.groups`
- `/config set` и `/config unset` (требуется включение команд)

Отключение:
{
  channels: {
    telegram: {
      configWrites: false,
    },
  },
}
Long polling vs webhook
По умолчанию: long polling.

Режим webhook:

- установите `channels.telegram.webhookUrl`
- установите `channels.telegram.webhookSecret` (обязательно при установке webhook URL)
- опционально `channels.telegram.webhookPath` (по умолчанию `/telegram-webhook`)
- опционально `channels.telegram.webhookHost` (по умолчанию `127.0.0.1`)
- опционально `channels.telegram.webhookPort` (по умолчанию `8787`)

Локальный слушатель webhook-режима по умолчанию привязывается к `127.0.0.1:8787`.

Если публичный эндпоинт отличается, поставьте обратный прокси перед ним и укажите `webhookUrl` на публичный URL.
Установите `webhookHost` (например `0.0.0.0`) когда вам намеренно нужен внешний ingress.
Лимиты, повторы и CLI-адресаты
- `channels.telegram.textChunkLimit` по умолчанию 4000.
- `channels.telegram.chunkMode="newline"` предпочитает границы абзацев (пустые строки) перед разделением по длине.
- `channels.telegram.mediaMaxMb` (по умолчанию 100) ограничивает входящие и исходящие медиа Telegram.
- `channels.telegram.timeoutSeconds` переопределяет таймаут клиента Telegram API (если не задан, применяется значение grammY по умолчанию).
- контекст истории групп использует `channels.telegram.historyLimit` или `messages.groupChat.historyLimit` (по умолчанию 50); `0` — отключить.
- управление историей ЛС:
  - `channels.telegram.dmHistoryLimit`
  - `channels.telegram.dms["<user_id>"].historyLimit`
- конфигурация `channels.telegram.retry` применяется к хелперам отправки Telegram (CLI/инструменты/действия) при восстановимых ошибках исходящего API.

Адресат отправки CLI может быть числовым chat ID или username:
openclaw message send --channel telegram --target 123456789 --message "hi"
openclaw message send --channel telegram --target @name --message "hi"
Опросы Telegram используют `openclaw message poll` и поддерживают темы форумов:
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-специфичные флаги опросов:

- `--poll-duration-seconds` (5-600)
- `--poll-anonymous`
- `--poll-public`
- `--thread-id` для тем форумов (или используйте адресат `:topic:`)

Шлюзы действий:

- `channels.telegram.actions.sendMessage=false` отключает исходящие сообщения Telegram, включая опросы
- `channels.telegram.actions.poll=false` отключает создание опросов Telegram, оставляя обычную отправку
Одобрения exec в Telegram
Telegram поддерживает одобрения exec в ЛС одобряющих и может опционально отправлять запросы на одобрение в исходный чат или тему.

Путь в конфигурации:

- `channels.telegram.execApprovals.enabled`
- `channels.telegram.execApprovals.approvers`
- `channels.telegram.execApprovals.target` (`dm` | `channel` | `both`, по умолчанию: `dm`)
- `agentFilter`, `sessionFilter`

Одобряющие должны быть числовыми Telegram user ID. При `enabled: false` или пустом `approvers` Telegram не выступает клиентом одобрений exec. Запросы одобрения откатываются к другим настроенным маршрутам или политике по умолчанию.

Правила доставки:

- `target: "dm"` отправляет запросы одобрения только в ЛС настроенных одобряющих
- `target: "channel"` отправляет запрос обратно в исходный чат/тему Telegram
- `target: "both"` отправляет в ЛС одобряющих и в исходный чат/тему

Только настроенные одобряющие могут одобрять или отклонять. Остальные не могут использовать `/approve` и кнопки одобрения Telegram.

При доставке в канал текст команды виден в чате, поэтому включайте `channel` или `both` только в доверенных группах/темах. Если запрос попадает в тему форума, OpenClaw сохраняет тему для запроса одобрения и для последующего сообщения.

Inline-кнопки одобрения также зависят от настройки `channels.telegram.capabilities.inlineButtons`, разрешающей соответствующую поверхность (`dm`, `group` или `all`).

Связанная документация: [Одобрения exec](/docs/tools/exec-approvals)

Устранение неполадок

Бот не отвечает на сообщения в группе без упоминания
- Если `requireMention=false`, режим конфиденциальности Telegram должен обеспечивать полную видимость.
  - BotFather: `/setprivacy` -> Disable
  - затем удалите и заново добавьте бота в группу
- `openclaw channels status` предупреждает, если конфигурация ожидает сообщения без упоминания в группах.
- `openclaw channels status --probe` может проверить явные числовые ID групп; wildcard `"*"` не поддерживает probe.
- быстрый тест сессии: `/activation always`.
Бот вообще не видит сообщения группы
- если `channels.telegram.groups` существует, группа должна быть в списке (или включите `"*"`)
- проверьте членство бота в группе
- просмотрите логи: `openclaw logs --follow` для причин пропуска
Команды работают частично или не работают
- авторизуйте свою идентичность отправителя (спаривание и/или числовые `allowFrom`)
- авторизация команд применяется даже при `groupPolicy: "open"`
- `setMyCommands failed` с `BOT_COMMANDS_TOO_MUCH` означает переполнение нативного меню; уменьшите количество плагинных/скилловых/пользовательских команд или отключите нативные меню
- `setMyCommands failed` с ошибками сети обычно указывает на проблемы доступности DNS/HTTPS к `api.telegram.org`
Нестабильность polling или сети
- Node 22+ + кастомный fetch/proxy может вызвать немедленное прерывание при несовпадении типов AbortSignal.
- Некоторые хосты разрешают `api.telegram.org` сначала в IPv6; неработающий IPv6-выход может вызывать периодические ошибки Telegram API.
- Если в логах `TypeError: fetch failed` или `Network request for 'getUpdates' failed!`, OpenClaw повторяет их как восстановимые сетевые ошибки.
- На VPS-хостах с нестабильным прямым выходом/TLS направляйте вызовы Telegram API через `channels.telegram.proxy`:
channels:
  telegram:
    proxy: socks5://<user>:<password>@proxy-host:1080
- Node 22+ по умолчанию использует `autoSelectFamily=true` (кроме WSL2) и `dnsResultOrder=ipv4first`.
- Если ваш хост — WSL2 или лучше работает только с IPv4, принудительно задайте выбор семейства:
channels:
  telegram:
    network:
      autoSelectFamily: false
- Переопределения через переменные окружения (временные):
  - `OPENCLAW_TELEGRAM_DISABLE_AUTO_SELECT_FAMILY=1`
  - `OPENCLAW_TELEGRAM_ENABLE_AUTO_SELECT_FAMILY=1`
  - `OPENCLAW_TELEGRAM_DNS_RESULT_ORDER=ipv4first`
- Проверка DNS-ответов:
dig +short api.telegram.org A
dig +short api.telegram.org AAAA

Дополнительная помощь: Устранение неполадок каналов.

Справочник конфигурации Telegram

Основной справочник:

  • channels.telegram.enabled: включение/отключение запуска канала.

  • channels.telegram.botToken: токен бота (BotFather).

  • channels.telegram.tokenFile: чтение токена из файла. Символические ссылки отклоняются.

  • channels.telegram.dmPolicy: pairing | allowlist | open | disabled (по умолчанию: pairing).

  • channels.telegram.allowFrom: allowlist ЛС (числовые Telegram user ID). allowlist требует хотя бы один ID. open требует "*". openclaw doctor --fix может разрешить устаревшие записи @username в ID и восстановить записи allowlist из файлов хранилища спаривания при миграции.

  • channels.telegram.actions.poll: включение/отключение создания опросов Telegram (по умолчанию: включено; по-прежнему требует sendMessage).

  • channels.telegram.defaultTo: адресат Telegram по умолчанию для CLI --deliver, когда --reply-to не указан.

  • channels.telegram.groupPolicy: open | allowlist | disabled (по умолчанию: allowlist).

  • channels.telegram.groupAllowFrom: allowlist отправителей в группах (числовые Telegram user ID). openclaw doctor --fix может разрешить устаревшие записи @username в ID. Нечисловые записи игнорируются при авторизации. Авторизация в группах не использует откат к хранилищу спаривания ЛС (2026.2.25+).

  • Приоритет в мультиаккаунтном режиме:

    • При двух и более account ID задайте channels.telegram.defaultAccount (или включите channels.telegram.accounts.default) для явной маршрутизации по умолчанию.
    • Если ни то, ни другое не задано, OpenClaw откатывается к первому нормализованному account ID и openclaw doctor предупреждает.
    • channels.telegram.accounts.default.allowFrom и channels.telegram.accounts.default.groupAllowFrom применяются только к аккаунту default.
    • Именованные аккаунты наследуют channels.telegram.allowFrom и channels.telegram.groupAllowFrom, если значения на уровне аккаунта не заданы.
    • Именованные аккаунты не наследуют channels.telegram.accounts.default.allowFrom / groupAllowFrom.
  • channels.telegram.groups: настройки и allowlist по группам (используйте "*" для глобальных значений).

    • channels.telegram.groups.<id>.groupPolicy: переопределение groupPolicy для группы (open | allowlist | disabled).
    • channels.telegram.groups.<id>.requireMention: значение по умолчанию для требования упоминания.
    • channels.telegram.groups.<id>.skills: фильтр навыков (опущен = все, пустой = ни одного).
    • channels.telegram.groups.<id>.allowFrom: переопределение allowlist отправителей для группы.
    • channels.telegram.groups.<id>.systemPrompt: дополнительный системный промпт для группы.
    • channels.telegram.groups.<id>.enabled: отключение группы при false.
    • channels.telegram.groups.<id>.topics.<threadId>.*: переопределения для темы (поля группы + agentId только для темы).
    • channels.telegram.groups.<id>.topics.<threadId>.agentId: маршрутизация темы к конкретному агенту (переопределяет маршрутизацию на уровне группы и через binding).
  • channels.telegram.groups.<id>.topics.<threadId>.groupPolicy: переопределение groupPolicy для темы (open | allowlist | disabled).

  • channels.telegram.groups.<id>.topics.<threadId>.requireMention: переопределение требования упоминания для темы.

  • верхнеуровневые bindings[] с type: "acp" и каноническим topic id chatId:topic:topicId в match.peer.id: поля постоянной ACP-привязки темы (см. ACP-агенты).

  • channels.telegram.direct.<id>.topics.<threadId>.agentId: маршрутизация тем ЛС к конкретному агенту (аналогично темам форумов).

  • channels.telegram.execApprovals.enabled: включение Telegram как чат-клиента одобрений exec для этого аккаунта.

  • channels.telegram.execApprovals.approvers: Telegram user ID, которым разрешено одобрять или отклонять exec-запросы. Обязательно при включённых одобрениях exec.

  • channels.telegram.execApprovals.target: dm | channel | both (по умолчанию: dm). channel и both сохраняют исходную тему Telegram.

  • channels.telegram.execApprovals.agentFilter: опциональный фильтр по agent ID для перенаправленных запросов одобрения.

  • channels.telegram.execApprovals.sessionFilter: опциональный фильтр по ключу сессии (подстрока или regex) для перенаправленных запросов одобрения.

  • channels.telegram.accounts.<account>.execApprovals: переопределение для аккаунта маршрутизации и авторизации одобрений exec Telegram.

  • channels.telegram.capabilities.inlineButtons: off | dm | group | all | allowlist (по умолчанию: allowlist).

  • channels.telegram.accounts.<account>.capabilities.inlineButtons: переопределение для аккаунта.

  • channels.telegram.commands.nativeSkills: включение/отключение нативных команд навыков Telegram.

  • channels.telegram.replyToMode: off | first | all (по умолчанию: off).

  • channels.telegram.textChunkLimit: размер исходящего чанка (символы).

  • channels.telegram.chunkMode: length (по умолчанию) или newline для разделения по пустым строкам перед разделением по длине.

  • channels.telegram.linkPreview: переключение предпросмотра ссылок для исходящих сообщений (по умолчанию: true).

  • channels.telegram.streaming: off | partial | block | progress (потоковый предпросмотр; по умолчанию: partial; progress соответствует partial; block — совместимость с устаревшим режимом). Потоковый предпросмотр Telegram использует одно превью-сообщение, редактируемое на месте.

  • channels.telegram.mediaMaxMb: лимит входящих/исходящих медиа Telegram (МБ, по умолчанию: 100).

  • channels.telegram.retry: политика повторов для хелперов отправки Telegram (CLI/инструменты/действия) при восстановимых исходящих ошибках API (attempts, minDelayMs, maxDelayMs, jitter).

  • channels.telegram.network.autoSelectFamily: переопределение Node autoSelectFamily (true=включить, false=отключить). По умолчанию включено на Node 22+; на WSL2 по умолчанию отключено.

  • channels.telegram.network.dnsResultOrder: переопределение порядка DNS-результатов (ipv4first или verbatim). По умолчанию ipv4first на Node 22+.

  • channels.telegram.proxy: URL прокси для вызовов Bot API (SOCKS/HTTP).

  • channels.telegram.webhookUrl: включение режима webhook (требуется channels.telegram.webhookSecret).

  • channels.telegram.webhookSecret: секрет webhook (обязателен при установке webhookUrl).

  • channels.telegram.webhookPath: локальный путь webhook (по умолчанию /telegram-webhook).

  • channels.telegram.webhookHost: локальный хост привязки webhook (по умолчанию 127.0.0.1).

  • channels.telegram.webhookPort: локальный порт привязки webhook (по умолчанию 8787).

  • channels.telegram.actions.reactions: шлюз реакций инструмента Telegram.

  • channels.telegram.actions.sendMessage: шлюз отправки сообщений инструмента Telegram.

  • channels.telegram.actions.deleteMessage: шлюз удаления сообщений инструмента Telegram.

  • channels.telegram.actions.sticker: шлюз действий со стикерами Telegram — отправка и поиск (по умолчанию: false).

  • channels.telegram.reactionNotifications: off | own | all — какие реакции вызывают системные события (по умолчанию: own).

  • channels.telegram.reactionLevel: off | ack | minimal | extensive — уровень возможностей реакций агента (по умолчанию: minimal).

  • Справочник конфигурации - Telegram

Telegram-специфичные ключевые поля:

  • запуск/авторизация: enabled, botToken, tokenFile, accounts.* (tokenFile должен указывать на обычный файл; символические ссылки отклоняются)
  • управление доступом: dmPolicy, allowFrom, groupPolicy, groupAllowFrom, groups, groups.*.topics.*, верхнеуровневые bindings[] (type: "acp")
  • одобрения exec: execApprovals, accounts.*.execApprovals
  • команды/меню: commands.native, commands.nativeSkills, customCommands
  • тредирование/ответы: replyToMode
  • стриминг: streaming (предпросмотр), blockStreaming
  • форматирование/доставка: textChunkLimit, chunkMode, linkPreview, responsePrefix
  • медиа/сеть: mediaMaxMb, timeoutSeconds, retry, network.autoSelectFamily, proxy
  • webhook: webhookUrl, webhookSecret, webhookPath, webhookHost
  • действия/возможности: capabilities.inlineButtons, actions.sendMessage|editMessage|deleteMessage|reactions|sticker
  • реакции: reactionNotifications, reactionLevel
  • запись/история: configWrites, historyLimit, dmHistoryLimit, dms.*.historyLimit

Связанные разделы