Mainstream messaging

Telegram

Готово до промислового використання для приватних повідомлень із ботом і груп через grammY. Типовим транспортом є тривале опитування; режим webhook необов’язковий.

Швидке налаштування

  • Створіть токен бота в BotFather

    Обидва способи зрештою нададуть токен, який потрібно вставити в OpenClaw, — виберіть один:

    • Через чат: відкрийте Telegram, почніть чат із @BotFather (переконайтеся, що ім’я користувача — саме @BotFather), виконайте /newbot, дотримуйтеся підказок і збережіть токен.
    • Через вебінтерфейс: відкрийте вебзастосунок BotFather — він працює в кожному клієнті Telegram, зокрема web.telegram.org, — створіть бота в інтерфейсі та скопіюйте його токен.
  • Налаштуйте токен і політику приватних повідомлень

    json5
    {channels: {telegram: {  enabled: true,  botToken: "123:abc",  dmPolicy: "pairing",  groups: { "*": { requireMention: true } },},},}

    Резервне значення зі змінної середовища: TELEGRAM_BOT_TOKEN (лише для типового облікового запису; іменовані облікові записи мають використовувати botToken або tokenFile). Telegram не використовує openclaw channels login telegram; задайте токен у конфігурації або змінній середовища, а потім запустіть Gateway.

  • Запустіть Gateway і схваліть перше приватне повідомлення

    bash
    openclaw gatewayopenclaw pairing list telegramopenclaw pairing approve telegram <CODE>

    Термін дії кодів сполучення спливає через 1 годину.

  • Додайте бота до групи

    Додайте бота до своєї групи, а потім отримайте два ідентифікатори, потрібні для доступу до групи:

    • ваш ідентифікатор користувача Telegram для allowFrom / groupAllowFrom
    • ідентифікатор групового чату Telegram як ключ у channels.telegram.groups

    Отримайте ідентифікатор групового чату за допомогою openclaw logs --follow, бота для визначення ідентифікатора з пересланого повідомлення або getUpdates у Bot API. Після дозволу групи /whoami@<bot_username> підтвердить ідентифікатори користувача та групи.

    Від’ємні ідентифікатори супергруп, що починаються з -100, є ідентифікаторами групових чатів. Їх потрібно вказувати в channels.telegram.groups, а не в groupAllowFrom.

  • Налаштування на стороні Telegram

    Режим конфіденційності та видимість у групах

    Для ботів Telegram типовим є Privacy Mode, який обмежує перелік отримуваних ними групових повідомлень.

    Щоб бачити всі групові повідомлення:

    • вимкніть режим конфіденційності через /setprivacy або
    • призначте бота адміністратором групи.

    Після перемикання режиму конфіденційності видаліть і повторно додайте бота до кожної групи, щоб Telegram застосував зміну.

    Дозволи групи

    Статус адміністратора контролюється в налаштуваннях групи Telegram. Боти-адміністратори отримують усі групові повідомлення, що корисно для постійно активної поведінки в групі.

    Корисні перемикачі BotFather
    • /setjoingroups — дозволити або заборонити додавання до груп
    • /setprivacy — поведінка видимості в групах

    Ці самі налаштування доступні у вебзастосунку BotFather, якщо інтерфейс зручніший за команди чату.

    Міні-застосунок панелі керування

    Виконайте /dashboard у приватному чаті з ботом, щоб відкрити панель керування OpenClaw у Telegram.

    Вимоги:

    • gateway.tailscale.mode: "serve" або "funnel" для опублікованої HTTPS-адреси міні-застосунку.
    • Ваш числовий ідентифікатор користувача Telegram має бути в ефективному allowFrom вибраного облікового запису або в commands.ownerAllowFrom.
    • Використовуйте приватний чат. У групах /dashboard відповідає open this in a DM with the bot і не надсилає кнопку.
    • Установлення Docker: режими Serve/Funnel вимагають, щоб Gateway був прив’язаний до loopback поруч із tailscaled, чого неможливо досягти за допомогою мостової мережі з опублікованими портами. Запустіть контейнер Gateway з network_mode: host і змонтуйте в контейнер сокет tailscaled хоста (/var/run/tailscale), а також CLI tailscale.

    Міні-застосунок є шляхом v1 лише для Tailscale і не підтримує iframe Telegram Web.

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

    Ідентичність бота в групі

    У групах і темах форумів явна згадка налаштованого імені користувача бота (наприклад, @my_bot) адресує повідомлення вибраному агенту OpenClaw, навіть якщо ім’я персоналізації агента відрізняється від імені користувача Telegram. Політика мовчання в групі й далі застосовується до стороннього трафіку, але ім’я користувача самого бота ніколи не вважається «кимось іншим».

    Політика приватних повідомлень

    channels.telegram.dmPolicy керує доступом до приватних повідомлень:

    • pairing (типове значення)
    • allowlist (потрібен принаймні один ідентифікатор відправника в allowFrom)
    • open (вимагає, щоб allowFrom містив "*")
    • disabled

    dmPolicy: "open" разом із allowFrom: ["*"] дає змогу будь-якому обліковому запису Telegram, який знайде або вгадає ім’я користувача бота, керувати ним командами. Використовуйте це лише для навмисно загальнодоступних ботів із суворо обмеженими інструментами; для ботів з одним власником слід використовувати allowlist із числовими ідентифікаторами користувачів.

    channels.telegram.allowFrom приймає числові ідентифікатори користувачів Telegram. Префікси telegram: / tg: приймаються та нормалізуються. У конфігураціях із кількома обліковими записами обмежувальний channels.telegram.allowFrom верхнього рівня є межею безпеки: allowFrom: ["*"] на рівні облікового запису не робить цей обліковий запис загальнодоступним, якщо об’єднаний ефективний список дозволів усе ще не містить явного символу-замінника. dmPolicy: "allowlist" із порожнім allowFrom блокує всі приватні повідомлення та відхиляється під час перевірки конфігурації. Під час налаштування запитуються лише числові ідентифікатори користувачів. Якщо конфігурація містить записи списку дозволів @username зі старішого налаштування, виконайте openclaw doctor --fix, щоб перетворити їх на числові ідентифікатори (за можливості; потрібен токен бота Telegram). Якщо раніше ви покладалися на файли списку дозволів сховища сполучень, openclaw doctor --fix може відновити записи в channels.telegram.allowFrom для потоків зі списком дозволів (наприклад, коли dmPolicy: "allowlist" ще не містить явних ідентифікаторів).

    Для ботів з одним власником віддавайте перевагу dmPolicy: "allowlist" із явними числовими ідентифікаторами allowFrom, а не попереднім схваленням сполучення.

    Поширене непорозуміння: схвалення сполучення для приватних повідомлень не означає, що «цей відправник авторизований усюди». Сполучення надає доступ лише до приватних повідомлень. Якщо власника команд ще немає, перше схвалене сполучення також установлює commands.ownerAllowFrom, надаючи командам лише для власника та схваленням виконання явний обліковий запис оператора. Авторизація відправника в групі й надалі визначається явними списками дозволів у конфігурації. Щоб одна ідентичність була авторизована і для приватних повідомлень, і для групових команд: додайте свій числовий ідентифікатор користувача Telegram до channels.telegram.allowFrom, а для команд лише для власника переконайтеся, що commands.ownerAllowFrom містить telegram:<your user id>.

    Як знайти свій ідентифікатор користувача Telegram

    Безпечніше (без стороннього бота): надішліть приватне повідомлення своєму боту, виконайте openclaw logs --follow і прочитайте from.id.

    Офіційний спосіб через Bot API:

    bash
    curl "https://api.telegram.org/bot<bot_token>/getUpdates"

    Сторонні сервіси (менша конфіденційність): @userinfobot або @getidsbot.

    Політика груп і списки дозволів

    Два механізми керування застосовуються разом:

    1. Які групи дозволені (channels.telegram.groups)

      • конфігурації groups немає, groupPolicy: "open": будь-яка група проходить перевірки ідентифікатора групи
      • конфігурації groups немає, groupPolicy: "allowlist" (типове значення): усі групи заблоковано, доки не буде додано записи groups (або "*")
      • groups налаштовано: діє як список дозволів (явні ідентифікатори або "*")
    2. Які відправники дозволені в групах (channels.telegram.groupPolicy)

      • open / allowlist (типове значення) / disabled

    groupAllowFrom фільтрує відправників у групах; якщо його не задано, Telegram використовує резервне значення allowFrom (не сховище сполучень — авторизація відправників у групах ніколи не успадковує схвалення зі сховища сполучень приватних повідомлень; це межа безпеки від 2026.2.25). Записи groupAllowFrom мають бути числовими ідентифікаторами користувачів Telegram (префікси telegram: / tg: нормалізуються); нечислові записи ігноруються. Не додавайте сюди ідентифікатори групових чатів або супергруп — від’ємні ідентифікатори чатів належать до channels.telegram.groups. Практичний шаблон для ботів з одним власником: задайте свій ідентифікатор користувача в channels.telegram.allowFrom, не задавайте groupAllowFrom і дозвольте цільові групи в channels.telegram.groups. Якщо channels.telegram повністю відсутній у конфігурації, середовище виконання типово використовує закрите в разі помилки значення groupPolicy="allowlist", якщо channels.defaults.groupPolicy не задано явно.

    Налаштування групи лише для власника:

    json5
    {channels: {telegram: {  enabled: true,  dmPolicy: "pairing",  allowFrom: ["&lt;YOUR_TELEGRAM_USER_ID&gt;"],  groupPolicy: "allowlist",  groups: {    "&lt;GROUP_CHAT_ID&gt;": {      requireMention: true,    },  },},},}

    Перевірте з групи за допомогою @<bot_username> ping. Звичайні групові повідомлення не активують бота, доки requireMention: true.

    Дозволити будь-якого учасника в одній певній групі:

    json5
    {channels: {telegram: {  groups: {    "-1001234567890": {      groupPolicy: "open",      requireMention: false,    },  },},},}

    Дозволити лише певних користувачів в одній певній групі:

    json5
    {channels: {telegram: {  groups: {    "-1001234567890": {      requireMention: true,      allowFrom: ["8734062810", "745123456"],    },  },},},}

    Поведінка згадок

    Для відповідей у групах типово потрібна згадка. Згадкою може бути:

    • вбудована згадка @botusername або
    • шаблон згадки в agents.list[].groupChat.mentionPatterns чи messages.groupChat.mentionPatterns

    Перемикачі на рівні сеансу (лише стан, без збереження): /activation always, /activation mention. Для постійного збереження використовуйте конфігурацію:

    json5
    {channels: {telegram: {  groups: {    "*": { requireMention: false },  },},},}

    Контекст історії групи завжди ввімкнено й обмежено значенням historyLimit. Установіть channels.telegram.historyLimit: 0, щоб вимкнути вікно історії групи. openclaw doctor --fix видаляє застарілий ключ includeGroupHistoryContext.

    Отримання ідентифікатора групового чату: перешліть групове повідомлення до @userinfobot / @getidsbot, прочитайте chat.id у openclaw logs --follow, перевірте getUpdates у Bot API або (після дозволу групи) виконайте /whoami@<bot_username>.

    Поведінка середовища виконання

    • Telegram працює всередині процесу Gateway.
    • Маршрутизація детермінована: відповіді на вхідні повідомлення Telegram надсилаються назад у Telegram (модель не вибирає канали).
    • Вхідні повідомлення нормалізуються до спільної оболонки каналу з метаданими відповіді, заповнювачами медіа та збереженим контекстом ланцюжка відповідей для відповідей, які спостерігав Gateway.
    • Групові сеанси ізольовано за ідентифікатором групи. До тем форуму додається :topic:<threadId>.
    • Повідомлення в особистих чатах можуть містити message_thread_id; OpenClaw зберігає його для відповідей. Сеанси тем в особистих чатах розділяються, лише коли Telegram getMe повідомляє has_topics_enabled: true для бота; інакше особисті чати залишаються у плоскому сеансі.
    • Тривале опитування використовує виконавець grammY із послідовним обробленням для кожного чату й потоку. Паралельність приймача виконавця використовує agents.defaults.maxConcurrent.
    • Запуск із кількома обліковими записами обмежує кількість одночасних перевірок getMe, щоб великі набори ботів не запускали перевірки всіх облікових записів одночасно.
    • Кожен процес Gateway захищає тривале опитування, щоб токен бота одночасно міг використовувати лише один активний опитувач. Постійні конфлікти getUpdates 409 указують на інший Gateway OpenClaw, скрипт або зовнішній опитувач, що використовує той самий токен.
    • За замовчуванням сторожовий механізм опитування перезапускається через 120 секунд без завершеної перевірки працездатності getUpdates. Збільшуйте channels.telegram.pollingStallThresholdMs (30000-600000, підтримуються перевизначення для окремих облікових записів), лише якщо у вашому розгортанні під час тривалих операцій виникають хибні перезапуски через зависання опитування.
    • Telegram Bot API не підтримує сповіщення про прочитання (sendReadReceipts не застосовується).

    Довідник функцій

    Попередній перегляд потоку наживо (редагування повідомлень)

    OpenClaw транслює часткові відповіді в реальному часі в особистих чатах, групах і темах: надсилає повідомлення попереднього перегляду, потім багаторазово виконує editMessageText, завершуючи його на місці.

    • channels.telegram.streaming має значення off | partial | block | progress (за замовчуванням: partial)
    • короткі початкові попередні перегляди відповіді обробляються із затримкою, а потім створюються після обмеженого часу очікування, якщо виконання все ще активне
    • progress зберігає одну редаговану чернетку стану для перебігу роботи інструментів, показує стабільну мітку стану, коли активність відповіді з’являється раніше за перебіг роботи інструментів, очищає її після завершення та надсилає остаточну відповідь як звичайне повідомлення
    • streaming.preview.toolProgress визначає, чи оновлення інструментів і перебігу роботи повторно використовують те саме редаговане повідомлення попереднього перегляду (за замовчуванням: true, коли потоковий попередній перегляд активний)
    • streaming.preview.commandText визначає деталізацію команд і виконання в цих рядках: raw (за замовчуванням) або status (лише мітка інструмента)
    • streaming.progress.commentary (за замовчуванням: false) вмикає текст коментарів і вступу асистента в тимчасовій чернетці перебігу роботи
    • застарілі channels.telegram.streamMode, логічні значення streaming і вилучені ключі нативного попереднього перегляду чернетки виявляються; виконайте openclaw doctor --fix, щоб перенести їх

    Рядки перебігу роботи інструментів — це короткі оновлення стану, які відображаються під час роботи інструментів (виконання команд, читання файлів, оновлення планування, підсумки виправлень, вступи й коментарі Codex у режимі сервера застосунку). У Telegram вони за замовчуванням увімкнені (відповідає поведінці випусків починаючи з v2026.4.22+).

    Зберегти редагування попереднього перегляду відповіді, але приховати рядки перебігу роботи інструментів:

    json
    {  "channels": {    "telegram": {      "streaming": {        "mode": "partial",        "preview": { "toolProgress": false }      }    }  }}

    Зберегти видимим перебіг роботи інструментів, але приховати текст команд і виконання:

    json
    {  "channels": {    "telegram": {      "streaming": {        "mode": "partial",        "preview": { "commandText": "status" }      }    }  }}

    Режим progress показує перебіг роботи інструментів без редагування остаточної відповіді в цьому повідомленні. Розмістіть політику тексту команд у streaming.progress:

    json
    {  "channels": {    "telegram": {      "streaming": {        "mode": "progress",        "progress": {          "toolProgress": true,          "commandText": "status"        }      }    }  }}

    streaming.mode: "off" вимикає редагування попереднього перегляду та пригнічує загальні повідомлення про роботу інструментів і перебіг процесу замість надсилання їх як окремих повідомлень стану; запити на схвалення, медіа та помилки й надалі передаються через звичайне остаточне доставлення. streaming.preview.toolProgress: false зберігає лише редагування попереднього перегляду відповіді.

    Для лише текстових відповідей: короткі попередні перегляди остаточно редагуються на місці; для довгих остаточних відповідей, які розділяються на кілька повідомлень, попередній перегляд повторно використовується як перша частина, після чого надсилається лише решта; остаточні відповіді в режимі перебігу роботи очищають чернетку стану й використовують звичайне остаточне доставлення; якщо остаточне редагування завершується помилкою до підтвердження завершення, OpenClaw переходить до звичайного остаточного доставлення та очищає застарілий попередній перегляд. Для складних відповідей (корисних навантажень із медіа) OpenClaw завжди переходить до звичайного остаточного доставлення та очищає попередній перегляд.

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

    Міркування: /reasoning stream передає міркування в попередній перегляд наживо під час генерування, а потім видаляє попередній перегляд міркувань після остаточного доставлення (використовуйте /reasoning on, щоб залишити його видимим). Остаточна відповідь надсилається без тексту міркувань.

    Розширене форматування повідомлень

    За замовчуванням вихідний текст використовує стандартні HTML-повідомлення Telegram, читабельні в актуальних клієнтах: напівжирний текст, курсив, посилання, код, спойлери, цитати — без розширених блоків, доступних лише в Bot API 10.2 (нативних таблиць, подробиць, розширених медіа, формул).

    Увімкнення розширених повідомлень Bot API 10.2:

    json5
    {channels: {telegram: {  richMessages: true,},},}

    Коли ввімкнено: агент отримує інформацію, що для цього бота або облікового запису доступні розширені повідомлення (з підтримуваним контрактом створення Markdown та HTML-острівців); текст Markdown відтворюється через Markdown IR OpenClaw як типізовані розширені блоки Bot API 10.2 (заголовки, таблиці, подробиці, контрольні списки, розширені медіа, формули, мапи, колажі); підписи до медіа й надалі використовують HTML-підписи Telegram (розширені повідомлення не замінюють підписи, а довжина підпису обмежена 1024 символами).

    Завдяки цьому текст моделі не містить сигілів розширеного Markdown Telegram, тому позначення валют на кшталт $400-600K не розбираються як математичні вирази. Довгий розширений текст автоматично розділяється відповідно до обмежень Telegram. Таблиці, що перевищують обмеження у 20 стовпців, замінюються блоком коду.

    За замовчуванням: вимкнено задля сумісності з клієнтами — деякі актуальні клієнти для комп’ютерів, вебу, Android і сторонні клієнти відображають прийняті розширені повідомлення як непідтримувані. Не вмикайте цю функцію, якщо не всі клієнти, що використовуються з ботом, можуть їх відтворювати. /status показує, чи ввімкнено розширені повідомлення в поточному сеансі.

    Попередні перегляди посилань увімкнено за замовчуванням. channels.telegram.linkPreview: false вимикає автоматичне виявлення сутностей у розширеному тексті.

    Нативні та власні команди

    Меню команд Telegram реєструється під час запуску за допомогою setMyCommands. commands.native: "auto" вмикає нативні команди для Telegram.

    Додавання власних пунктів меню команд:

    json5
    {channels: {telegram: {  customCommands: [    { command: "backup", description: "Резервне копіювання Git" },    { command: "generate", description: "Створити зображення" },  ],},},}

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

    Власні команди є лише пунктами меню — вони не реалізують поведінку автоматично. Команди Plugin/Skills можуть і далі працювати після введення, навіть якщо їх немає в меню Telegram. Якщо нативні команди вимкнено, вбудовані команди видаляються; власні команди й команди Plugin можуть усе одно реєструватися, якщо їх налаштовано.

    Поширені помилки налаштування:

    • setMyCommands failed з BOT_COMMANDS_TOO_MUCH після повторної спроби зі скороченням означає, що меню все ще переповнене; зменште кількість команд Plugin/Skills/власних команд або вимкніть channels.telegram.commands.native.
    • Якщо deleteWebhook, deleteMyCommands або setMyCommands завершується помилкою 404: Not Found, тоді як прямі команди curl Bot API працюють, це зазвичай означає, що для channels.telegram.apiRoot указано повну кінцеву точку /bot&lt;TOKEN&gt;. apiRoot має містити лише кореневу адресу Bot API; openclaw doctor --fix видаляє випадковий кінцевий /bot&lt;TOKEN&gt;.
    • getMe returned 401 означає, що Telegram відхилив налаштований токен бота. Оновіть botToken, tokenFile або TELEGRAM_BOT_TOKEN (обліковий запис за замовчуванням), указавши поточний токен BotFather; OpenClaw зупиняється до початку опитування, тому це не повідомляється як помилка очищення Webhook.
    • setMyCommands failed з помилками мережі або отримання даних зазвичай означає, що вихідний доступ DNS/HTTPS до api.telegram.org заблоковано.

    Команди сполучення пристроїв (Plugin device-pair)

    Після встановлення:

    1. /pair створює код налаштування
    2. вставте код у застосунку iOS
    3. /pair pending показує список запитів, що очікують на розгляд (зокрема роль і області доступу)
    4. схвалення: /pair approve <requestId>, /pair approve (єдиний запит, що очікує на розгляд) або /pair approve latest

    Якщо пристрій повторює спробу зі зміненими даними автентифікації (роллю, областями доступу, відкритим ключем), попередній запит, що очікує на розгляд, замінюється новим requestId; перед схваленням повторно виконайте /pair pending.

    Докладніше: Сполучення.

    Вбудовані кнопки

    Налаштування області дії вбудованої клавіатури:

    json5
    {channels: {telegram: {  capabilities: {    inlineButtons: "allowlist",  },},},}

    Перевизначення для окремого облікового запису:

    json5
    {channels: {telegram: {  accounts: {    main: {      capabilities: {        inlineButtons: "allowlist",      },    },  },},},}

    Області дії: off, dm, group, all, allowlist (за замовчуванням). Застарілий capabilities: ["inlineButtons"] зіставляється з "all".

    Приклад дії з повідомленням:

    json5
    {action: "send",channel: "telegram",to: "123456789",message: "Виберіть варіант:",buttons: [[  { text: "Так", callback_data: "yes" },  { text: "Ні", callback_data: "no" },],[{ text: "Скасувати", callback_data: "cancel" }],],}

    Приклад кнопки Mini App:

    json5
    {action: "send",channel: "telegram",to: "123456789",message: "Відкрити застосунок:",presentation: {blocks: [  {    type: "buttons",    buttons: [{ label: "Запустити", web_app: { url: "https://example.com/app" } }],  },],},}

    Кнопки web_app працюють лише в приватних чатах між користувачем і ботом.

    Клацання зворотних викликів, які не обробив зареєстрований інтерактивний обробник плагіна, передаються агенту як текст: callback_data: <value>.

    Дії з повідомленнями Telegram для агентів і автоматизації

    Дії:

    • sendMessage (to, content, необов’язково mediaUrl, replyToMessageId, messageThreadId)
    • react (chatId, messageId, emoji)
    • deleteMessage (chatId, messageId)
    • editMessage (chatId, messageId, content або caption, необов’язкові вбудовані кнопки presentation; редагування лише кнопок оновлює розмітку відповіді)
    • createForumTopic (chatId, name, необов’язково iconColor, iconCustomEmojiId)

    Зручні псевдоніми: send, react, delete, edit, sticker, sticker-search, topic-create.

    Обмеження доступу: channels.telegram.actions.sendMessage, deleteMessage, reactions, sticker (типово: вимкнено). edit, createForumTopic і editForumTopic типово ввімкнені без окремого перемикача. Під час виконання для надсилання використовується активний знімок конфігурації та секретів із моменту запуску або перезавантаження, тому шляхи дій не визначають значення SecretRef повторно для кожного надсилання.

    Семантика видалення реакцій: /tools/reactions.

    Теги гілок відповідей

    Явні теги гілок відповідей у згенерованому виводі:

    • [[reply_to_current]] — відповідь на повідомлення, яке спричинило дію
    • [[reply_to:<id>]] — відповідь на повідомлення з певним ідентифікатором

    channels.telegram.replyToMode: off (типово), first, all.

    Коли гілки відповідей увімкнено й доступний початковий текст або підпис, OpenClaw автоматично додає вбудований фрагмент цитати. Telegram обмежує текст вбудованої цитати до 1024 кодових одиниць UTF-16; довші повідомлення цитуються від початку, а якщо Telegram відхиляє цитату, використовується звичайна відповідь.

    off вимикає лише неявні гілки відповідей; явні теги [[reply_to_*]] і надалі враховуються.

    Теми форуму та поведінка гілок

    Супергрупи-форуми: до ключів сеансів тем додається :topic:<threadId>; відповіді й індикатор набору тексту спрямовуються до гілки теми; шлях конфігурації теми — channels.telegram.groups.<chatId>.topics.<threadId>.

    Загальна тема (threadId=1) є особливим випадком: під час надсилання повідомлень message_thread_id не вказується (Telegram відхиляє sendMessage(...thread_id=1) з повідомленням "гілку не знайдено"), але дії набору тексту все одно містять message_thread_id (емпірично це необхідно для появи індикатора набору тексту).

    Записи тем успадковують налаштування групи, якщо їх не перевизначено (requireMention, allowFrom, skills, systemPrompt, enabled, groupPolicy). agentId застосовується лише до теми й не успадковується з типових налаштувань групи. topics."*" задає типові значення для кожної теми в цій групі; точні ідентифікатори тем усе одно мають перевагу над "*".

    Маршрутизація агента для кожної теми: кожну тему можна спрямувати до іншого агента через agentId у конфігурації теми, надавши їй власний робочий простір, пам’ять і сеанс:

    json5
    {  channels: {    telegram: {      groups: {        "-1001234567890": {          topics: {            "1": { agentId: "main" },      // Загальна тема -> головний агент            "3": { agentId: "zu" },        // Тема розробки -> агент zu            "5": { agentId: "coder" }      // Перевірка коду -> агент coder          }        }      }    }  }}

    Після цього кожна тема має власний ключ сеансу, наприклад agent:zu:telegram:group:-1001234567890:topic:3.

    Постійне прив’язування теми ACP: теми форуму можуть закріплювати сеанси середовища ACP за допомогою типізованих прив’язок верхнього рівня (bindings[] з type: "acp", match.channel: "telegram", peer.kind: "group" та ідентифікатором із кваліфікатором теми, наприклад -1001234567890:topic:42). Наразі область дії обмежена темами форумів у групах і супергрупах. Див. Агенти ACP.

    Запуск ACP із чату з прив’язуванням до гілки: /acp spawn <agent> --thread here|auto прив’язує поточну тему до нового сеансу ACP; подальші повідомлення спрямовуються безпосередньо туди, а OpenClaw закріплює підтвердження запуску в темі. Потрібен channels.telegram.threadBindings.spawnSessions (типово: true).

    Контекст шаблону надає MessageThreadId і IsForum. Особисті чати з message_thread_id зберігають метадані відповіді, але використовують ключі сеансів з урахуванням гілок лише тоді, коли Telegram getMe повідомляє has_topics_enabled: true. Застарілі перевизначення dm.threadReplies і direct.*.threadReplies видалено; режим гілок BotFather є єдиним джерелом істини. Виконайте openclaw doctor --fix, щоб видалити застарілі ключі конфігурації.

    Аудіо, відео та наліпки

    Аудіоповідомлення

    Telegram розрізняє голосові повідомлення й аудіофайли. Типово використовується поведінка аудіофайлу; додайте тег [[audio_as_voice]] у відповідь агента, щоб примусово надіслати голосове повідомлення. Транскрипції вхідних голосових повідомлень у контексті агента позначаються як машинно згенерований ненадійний текст, але для виявлення згадок і надалі використовується необроблена транскрипція, тому голосові повідомлення з обов’язковою згадкою продовжують працювати.

    json5
    {action: "send",channel: "telegram",to: "123456789",media: "https://example.com/voice.ogg",asVoice: true,}

    Відеоповідомлення

    Telegram розрізняє відеофайли й відеоповідомлення. Відеоповідомлення не підтримують підписи; наданий текст повідомлення надсилається окремо.

    json5
    {action: "send",channel: "telegram",to: "123456789",media: "https://example.com/video.mp4",asVideoNote: true,}

    Місця та заклади

    Використовуйте наявну дію send з одним окремим об’єктом location. Координати надсилають вбудовану позначку; додавання одночасно name і address надсилає вбудовану картку закладу. Надсилання місця не можна поєднувати з текстом повідомлення або медіафайлом.

    json5
    {action: "send",channel: "telegram",to: "123456789",location: {latitude: 48.858844,longitude: 2.294351,accuracy: 12,name: "Ейфелева вежа",address: "Марсове поле, Париж",},}

    Наліпки

    Вхідні дані: статичний WEBP завантажується й обробляється (заповнювач <media:sticker>); анімовані TGS і відео WEBM пропускаються.

    Поля контексту наліпки: Sticker.emoji, Sticker.setName, Sticker.fileId, Sticker.fileUniqueId, Sticker.cachedDescription. Описи кешуються у стані плагіна OpenClaw у SQLite, щоб зменшити кількість повторних викликів розпізнавання зображень.

    Увімкнення дій із наліпками:

    json5
    {channels: {telegram: {  actions: {    sticker: true,  },},},}

    Надсилання:

    json5
    {action: "sticker",channel: "telegram",to: "123456789",fileId: "CAACAgIAAxkBAAI...",}

    Пошук кешованих наліпок:

    json5
    {action: "sticker-search",channel: "telegram",query: "кіт махає лапою",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 означає лише реакції користувачів на повідомлення, надіслані ботом (у міру можливості за допомогою кешу надісланих повідомлень). Події реакцій і надалі враховують засоби контролю доступу Telegram (dmPolicy, allowFrom, groupPolicy, groupAllowFrom); дані від неавторизованих відправників відкидаються.

    Telegram не надає ідентифікатори гілок в оновленнях реакцій: групи без форуму спрямовуються до сеансу групового чату; групи-форуми — до сеансу загальної теми (:topic:1), а не до конкретної початкової теми.

    allowed_updates для опитування/Webhook автоматично містять message_reaction.

    Реакції-підтвердження

    ackReaction надсилає емодзі-підтвердження, поки OpenClaw обробляє вхідне повідомлення. messages.ackReactionScope визначає, коли його буде надіслано.

    Порядок визначення емодзі:

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

    Telegram очікує емодзі Unicode (наприклад, "👀"); використовуйте "", щоб вимкнути реакцію для каналу або облікового запису.

    Область дії (messages.ackReactionScope, типово "group-mentions"; наразі без перевизначення для облікового запису або каналу Telegram):

    all (особисті чати + групи, включно з фоновими подіями кімнати), direct (лише особисті чати), group-all (кожне групове повідомлення, крім фонових подій кімнати, без особистих чатів), group-mentions (групи, коли згадано бота; без особистих чатів — типове значення), off / none (вимкнено).

    Запис конфігурації з подій і команд Telegram

    Запис конфігурації каналу типово ввімкнено (configWrites !== false). Записи, ініційовані Telegram, включають події міграції груп (migrate_to_chat_id, оновлює channels.telegram.groups) і /config set / /config unset (потрібно ввімкнути команди).

    Вимкнення:

    json5
    {channels: {telegram: {  configWrites: false,},},}
    Тривале опитування та Webhook

    Типово використовується тривале опитування. Для режиму Webhook задайте channels.telegram.webhookUrl і channels.telegram.webhookSecret; необов’язково webhookPath (типово /telegram-webhook), webhookHost (типово 127.0.0.1), webhookPort (типово 8787), webhookCertPath (PEM самопідписаного сертифіката для конфігурацій із прямою IP-адресою або без домену).

    У режимі тривалого опитування OpenClaw зберігає позначку перезапуску лише після успішної диспетчеризації оновлення; якщо обробник завершується помилкою, оновлення можна повторити в тому самому процесі, а не позначати завершеним.

    Локальний слухач типово прив’язується до 127.0.0.1:8787. Для публічного вхідного трафіку розмістіть зворотний проксі перед локальним портом або навмисно задайте webhookHost: "0.0.0.0".

    Режим Webhook перевіряє захист запиту, секретний токен Telegram і тіло JSON, а потім фіксує оновлення у своїй стійкій черзі вхідних даних, перш ніж повернути порожню відповідь 200. Успішне стійке прийняття містить x-openclaw-delivery-accepted: durable; відповіді перевірки справності, маршрутизації, автентифікації, валідації та помилок сховища не містять цього заголовка. Зворотні проксі й контролери хостів можуть вимагати цей заголовок, щоб відрізняти прийняття OpenClaw від загальної порожньої відповіді 200, не визначаючи прийняття за часом відповіді.

    Потім OpenClaw асинхронно обробляє оновлення через ті самі смуги бота для кожного чату й кожної теми, що використовуються для тривалого опитування, тому повільні цикли агента не затримують підтвердження доставки Telegram.

    Обмеження, повторні спроби та цілі CLI
    • channels.telegram.textChunkLimit за замовчуванням має значення 4000; streaming.chunkMode="newline" надає перевагу межам абзаців (порожнім рядкам) перед поділом за довжиною.
    • channels.telegram.mediaMaxMb (за замовчуванням 100) обмежує розмір вхідних і вихідних медіафайлів.
    • channels.telegram.mediaGroupFlushMs (за замовчуванням 500, діапазон 10-60000) визначає, як довго альбоми/групи медіафайлів буферизуються, перш ніж OpenClaw передасть їх як одне вхідне повідомлення. Збільште значення, якщо частини альбому надходять із запізненням; зменште його, щоб скоротити затримку відповіді на альбом.
    • channels.telegram.timeoutSeconds перевизначає час очікування клієнта API (якщо значення не задано, застосовується стандартне значення grammY). Клієнти ботів обмежують налаштовані значення, нижчі за 60-секундний захисний інтервал для вихідних запитів тексту/індикації набору, щоб grammY не переривав доставлення видимої відповіді до того, як зможуть спрацювати транспортний захисний механізм і резервний варіант OpenClaw. Тривале опитування і далі використовує 45-секундний захисний інтервал запиту getUpdates, щоб неактивні опитування не залишалися покинутими безстроково.
    • channels.telegram.pollingStallThresholdMs за замовчуванням має значення 120000; налаштовуйте його в межах від 30000 до 600000 лише в разі хибнопозитивних перезапусків через зависання опитування.
    • історія контексту групи використовує channels.telegram.historyLimit або messages.groupChat.historyLimit (за замовчуванням 50); 0 вимикає її.
    • додатковий контекст відповіді/цитати/пересилання нормалізується в одне вибране вікно контексту розмови, якщо Gateway спостерігав батьківські повідомлення; кеш спостережених повідомлень зберігається у стані Plugin SQLite OpenClaw, а openclaw doctor --fix імпортує застарілі бічні файли. Telegram додає лише один неглибокий reply_to_message до кожного оновлення, тому ланцюжки, старші за кеш, обмежені цим корисним навантаженням.
    • списки дозволених користувачів Telegram передусім визначають, хто може запускати агента, а не слугують повною межею редагування додаткового контексту.
    • історія приватних повідомлень: channels.telegram.dmHistoryLimit, channels.telegram.dms["<user_id>"].historyLimit.
    • channels.telegram.retry застосовується до допоміжних засобів надсилання Telegram (CLI/інструменти/дії) для відновлюваних помилок вихідного API. Для доставлення остаточної вхідної відповіді використовується обмежена безпечна повторна спроба в разі помилок до встановлення з’єднання, але повторні спроби не виконуються для неоднозначних мережевих конвертів після надсилання, які можуть дублювати видимі повідомлення.

    Цілі надсилання CLI та інструмента повідомлень приймають числовий ідентифікатор чату, ім’я користувача або ціль теми форуму:

    bash
    openclaw message send --channel telegram --target 123456789 --message "hi"openclaw message send --channel telegram --target @name --message "hi"openclaw message send --channel telegram --target -1001234567890:topic:42 --message "hi topic"

    Опитування використовують openclaw message poll і підтримують теми форуму:

    bash
    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:). --poll-option повторюється 2-12 разів (обмеження Telegram на кількість варіантів).

    Надсилання Telegram також підтримує --presentation із блоками buttons для вбудованих клавіатур (якщо це дозволяє channels.telegram.capabilities.inlineButtons), --pin або --delivery '{"pin":true}' для запиту закріпленого доставлення, коли бот може закріплювати повідомлення в цьому чаті, а також --force-document для надсилання вихідних зображень, GIF-файлів і відео як документів замість стиснених зображень, анімацій або відео.

    Керування доступністю дій: channels.telegram.actions.sendMessage=false вимикає всі вихідні повідомлення, зокрема опитування; channels.telegram.actions.poll=false вимикає створення опитувань, залишаючи звичайне надсилання ввімкненим.

    Схвалення виконання в Telegram

    Telegram підтримує схвалення виконання у приватних повідомленнях осіб, які схвалюють, і за бажанням може публікувати запити у вихідному чаті або темі. Особи, які схвалюють, мають бути вказані числовими ідентифікаторами користувачів Telegram.

    • channels.telegram.execApprovals.enabled ("auto" вмикає функцію, якщо можна визначити принаймні одну особу, яка схвалює)
    • channels.telegram.execApprovals.approvers (резервно використовує числові ідентифікатори власників із commands.ownerAllowFrom)
    • channels.telegram.execApprovals.target: dm (за замовчуванням) | channel | both
    • agentFilter, sessionFilter

    channels.telegram.allowFrom, groupAllowFrom і defaultTo визначають, хто може спілкуватися з ботом і куди він надсилає звичайні відповіді — вони не надають нікому права схвалювати виконання. Перше схвалене сполучення через приватні повідомлення ініціалізує commands.ownerAllowFrom, якщо власника команд ще немає, тому конфігурації з одним власником працюють без дублювання ідентифікаторів у execApprovals.approvers.

    Під час доставлення в канал текст команди відображається в чаті; вмикайте channel або both лише в довірених групах/темах. Коли запит надходить у тему форуму, OpenClaw зберігає тему для запиту схвалення та подальшого повідомлення. За замовчуванням строк дії схвалень виконання завершується через 30 хвилин.

    Вбудовані кнопки схвалення також потребують, щоб channels.telegram.capabilities.inlineButtons дозволяв цільову поверхню (dm, group або all). Ідентифікатори схвалення з префіксом plugin: визначаються через схвалення Plugin; решта спочатку визначається через схвалення виконання.

    Див. Схвалення виконання.

    Керування відповідями про помилки

    Коли агент стикається з помилкою доставлення або постачальника, політика помилок визначає, чи надходитимуть повідомлення про помилки до чату Telegram:

    Ключ Значення За замовчуванням Опис
    channels.telegram.errorPolicy always, once, silent always always надсилає до чату кожне повідомлення про помилку. once надсилає кожне унікальне повідомлення про помилку один раз за період очікування (пригнічує повторювані однакові помилки). silent ніколи не надсилає повідомлення про помилки до чату.
    channels.telegram.errorCooldownMs число (мс) 14400000 (4 год) Період очікування для політики once. Після надсилання помилки те саме повідомлення пригнічується, доки не мине цей інтервал. Запобігає спаму помилками під час збоїв.

    Підтримуються перевизначення для окремого облікового запису, групи та теми (таке саме успадкування, як для інших ключів конфігурації Telegram).

    json5
    {  channels: {    telegram: {      errorPolicy: "always",      errorCooldownMs: 120000,      groups: {        "-1001234567890": {          errorPolicy: "silent", // пригнічувати помилки в цій групі        },      },    },  },}

    Усунення несправностей

    Бот не відповідає на групові повідомлення без згадки
    • Якщо requireMention=false, режим приватності Telegram має дозволяти повну видимість: BotFather /setprivacy -> Disable, потім видаліть бота з групи й додайте його знову.
    • openclaw channels status попереджає, коли конфігурація передбачає групові повідомлення без згадки.
    • openclaw channels status --probe перевіряє явні числові ідентифікатори груп; належність до групи за шаблоном "*" перевірити неможливо.
    • Швидка перевірка сеансу: /activation always.
    Бот узагалі не бачить групових повідомлень
    • Якщо існує channels.telegram.groups, група має бути вказана в списку (або список має містити "*").
    • Перевірте членство бота в групі.
    • Перегляньте openclaw logs --follow, щоб дізнатися причини пропуску.
    Команди працюють частково або не працюють зовсім
    • Авторизуйте особу відправника (сполучення та/або числовий allowFrom); авторизація команд застосовується, навіть якщо політика групи має значення open.
    • setMyCommands failed з BOT_COMMANDS_TOO_MUCH означає, що нативне меню містить забагато пунктів; скоротіть кількість команд Plugin/Skills/власних команд або вимкніть нативні меню.
    • Виклики запуску deleteMyCommands / setMyCommands і виклики індикації набору sendChatAction обмежені в часі та в разі завершення часу очікування запиту повторюються один раз через резервний транспорт Telegram. Постійні помилки мережі/отримання зазвичай означають, що DNS/HTTPS-з’єднання з api.telegram.org недоступне.
    Під час запуску повідомляється про неавторизований токен
    • getMe returned 401 — це помилка автентифікації Telegram для налаштованого токена бота. Знову скопіюйте або згенеруйте токен у BotFather, а потім оновіть channels.telegram.botToken, tokenFile, accounts.<id>.botToken або TELEGRAM_BOT_TOKEN (обліковий запис за замовчуванням).
    • deleteWebhook 401 Unauthorized під час запуску також є помилкою автентифікації; трактування її як «Webhook не існує» лише відкладе ту саму помилку неправильного токена до наступного виклику API.
    Нестабільність опитування або мережі
    • Node 22+ із власним fetch/проксі може спричинити негайне переривання, якщо типи AbortSignal не збігаються.
    • Деякі хости спочатку визначають для api.telegram.org адресу IPv6; несправний вихідний IPv6-зв’язок спричиняє періодичні збої API.
    • Записи журналу з TypeError: fetch failed або Network request for 'getUpdates' failed! повторюються як відновлювані мережеві помилки.
    • Під час запуску опитування OpenClaw повторно використовує успішну початкову перевірку getMe для grammY, тому засобу виконання не потрібен другий getMe перед першим getUpdates.
    • Якщо deleteWebhook завершується транзитною мережевою помилкою під час запуску опитування, OpenClaw переходить до тривалого опитування замість ще одного виклику площини керування перед опитуванням. Якщо Webhook усе ще активний, це проявляється як конфлікт getUpdates; OpenClaw перебудовує транспорт і повторює очищення Webhook.
    • Якщо сокети Telegram повторно створюються через короткі фіксовані проміжки часу, перевірте, чи не задано низьке значення channels.telegram.timeoutSeconds — клієнти ботів обмежують налаштовані значення, нижчі за захисні інтервали вихідних запитів і запитів getUpdates, але старіші випуски могли переривати кожне опитування або відповідь, якщо значення було нижчим за ці інтервали.
    • Polling stall detected у журналах означає, що OpenClaw перезапускає опитування та перебудовує транспорт після 120 секунд без завершеного підтвердження працездатності тривалого опитування за замовчуванням.
    • openclaw channels status --probe і openclaw doctor попереджають, коли активний обліковий запис опитування не завершив getUpdates після пільгового періоду запуску, активний обліковий запис Webhook не завершив setWebhook після пільгового періоду запуску або остання успішна активність транспорту опитування застаріла.
    • Збільшуйте channels.telegram.pollingStallThresholdMs лише тоді, коли тривалі виклики getUpdates працюють справно, але хост усе одно повідомляє про хибні перезапуски через зависання опитування. Постійні зависання зазвичай указують на проблеми проксі, DNS, IPv6 або вихідного TLS-з’єднання з api.telegram.org.
    • Telegram враховує змінні середовища проксі процесу для транспорту Bot API: HTTP_PROXY, HTTPS_PROXY, ALL_PROXY і варіанти в нижньому регістрі. NO_PROXY / no_proxy усе ще можуть обходити api.telegram.org.
    • Якщо для середовища служби задано OPENCLAW_PROXY_URL, а стандартних змінних середовища проксі немає, Telegram також використовує цю URL-адресу для транспорту Bot API.
    • На VPS-хостах із нестабільним прямим вихідним з’єднанням/TLS спрямовуйте виклики API Telegram через проксі:
    yaml
    channels:telegram:proxy: socks5://<user>:<password>@proxy-host:1080
    • Node 22+ за замовчуванням використовує autoSelectFamily=true (крім WSL2). Порядок результатів DNS для Telegram враховує OPENCLAW_TELEGRAM_DNS_RESULT_ORDER, потім channels.telegram.network.dnsResultOrder, а потім стандартне значення процесу (наприклад, NODE_OPTIONS=--dns-result-order=ipv4first); якщо жодне з них не застосовується, у Node 22+ використовується резервне значення ipv4first.
    • У WSL2 або коли краще працює режим лише IPv4, примусово задайте вибір сімейства:
    yaml
    channels:telegram:network:  autoSelectFamily: false
    • Відповіді з діапазону еталонного тестування RFC 2544 (198.18.0.0/15) уже за замовчуванням дозволені для завантаження медіафайлів Telegram. Якщо довірений проксі із підробленими IP-адресами або прозорий проксі під час завантаження медіафайлів перетворює api.telegram.org на іншу приватну, внутрішню адресу чи адресу спеціального призначення, увімкніть обхід лише для Telegram:
    yaml
    channels:telegram:network:  dangerouslyAllowPrivateNetwork: true
    • Таке саме явне ввімкнення доступне для кожного облікового запису в channels.telegram.accounts.<accountId>.network.dangerouslyAllowPrivateNetwork.
    • Якщо ваш проксі перетворює адреси хостів медіафайлів Telegram на 198.18.x.x, спочатку не вмикайте небезпечний прапорець — цей діапазон уже дозволено за замовчуванням.
    • Тимчасові перевизначення через змінні середовища: OPENCLAW_TELEGRAM_DISABLE_AUTO_SELECT_FAMILY=1, OPENCLAW_TELEGRAM_ENABLE_AUTO_SELECT_FAMILY=1, OPENCLAW_TELEGRAM_DNS_RESULT_ORDER=ipv4first.
    • Перевірте відповіді DNS:
    bash
    dig +short api.telegram.org Adig +short api.telegram.org AAAA

    Докладніше: Усунення несправностей каналів.

    Довідник із конфігурації

    Основний довідник: Довідник із конфігурації — Telegram.

    Найважливіші поля Telegram
    • запуск/автентифікація: enabled, botToken, tokenFile (має бути звичайним файлом; символічні посилання відхиляються), accounts.*
    • керування доступом: dmPolicy, allowFrom, groupPolicy, groupAllowFrom, groups, groups.*.topics.*, верхньорівневий bindings[] (type: "acp")
    • стандартні налаштування тем: groups.<chatId>.topics."*" застосовується до тем форуму без збігів; точні ідентифікатори тем мають вищий пріоритет
    • схвалення виконання: execApprovals, accounts.*.execApprovals
    • команди/меню: commands.native, commands.nativeSkills, customCommands
    • гілки/відповіді: replyToMode, threadBindings
    • потокове передавання: streaming (режими off | partial | block | progress), streaming.preview.toolProgress
    • форматування/доставлення: textChunkLimit, streaming.chunkMode, richMessages, markdown.tables (off | bullets | code | block), linkPreview, responsePrefix
    • медіафайли/мережа: mediaMaxMb, mediaGroupFlushMs, timeoutSeconds, pollingStallThresholdMs, retry, network.autoSelectFamily, network.dangerouslyAllowPrivateNetwork, proxy
    • власна коренева адреса API: apiRoot (лише коренева адреса Bot API; не додавайте /bot&lt;TOKEN&gt;), trustedLocalFileRoots (абсолютні кореневі адреси file_path для самостійно розміщеного Bot API)
    • Webhook: webhookUrl, webhookSecret, webhookPath, webhookHost, webhookPort, webhookCertPath
    • дії/можливості: capabilities.inlineButtons, actions.sendMessage|editMessage|deleteMessage|reactions|sticker|createForumTopic|editForumTopic
    • реакції: reactionNotifications, reactionLevel
    • помилки: errorPolicy, errorCooldownMs, silentErrorReplies
    • записи/історія: configWrites, historyLimit, dmHistoryLimit, dms.*.historyLimit

    Пов’язані матеріали

    Was this useful?
    On this page

    On this page