Telegram (Bot API)
Статус: готов к продакшну для ЛС и групп через grammY. По умолчанию используется long polling; режим webhook опционален.
- Спаривание — Для Telegram по умолчанию используется режим спаривания в ЛС.
- Устранение неполадок каналов — Кросс-канальная диагностика и процедуры восстановления.
- Конфигурация шлюза — Полные паттерны конфигурации каналов и примеры.
Быстрая настройка
Шаг 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.
- При двух и более account ID задайте
-
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 idchatId: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-специфичные ключевые поля:
- запуск/авторизация:
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