Перейти до основного вмісту

Telegram (Bot API)

Статус: готовий до продакшену для DM бота + груп через grammY. Long polling — режим за замовчуванням; режим Webhook — необов’язковий.

Підключення

Політика DM за замовчуванням для Telegram — підключення.

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

Міжканальна діагностика та інструкції з відновлення.

Конфігурація Gateway

Повні шаблони конфігурації каналу та приклади.

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

1

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

Відкрийте Telegram і почніть чат із @BotFather (переконайтеся, що хендл точно @BotFather).Виконайте /newbot, дотримуйтесь підказок і збережіть токен.
2

Налаштуйте токен і політику DM

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

Запустіть gateway і підтвердьте перший DM

openclaw gateway
openclaw pairing list telegram
openclaw pairing approve telegram <CODE>
Коди підключення спливають через 1 годину.
4

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

Додайте бота до своєї групи, а потім налаштуйте channels.telegram.groups і groupPolicy відповідно до вашої моделі доступу.
Порядок визначення токена враховує обліковий запис. На практиці значення з config мають пріоритет над резервним env-значенням, а TELEGRAM_BOT_TOKEN застосовується лише до облікового запису за замовчуванням.

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

Для ботів Telegram за замовчуванням увімкнено Privacy Mode, який обмежує, які повідомлення в групах вони отримують.Якщо бот має бачити всі повідомлення в групі, зробіть одне з такого:
  • вимкніть режим приватності через /setprivacy, або
  • зробіть бота адміністратором групи.
Після перемикання режиму приватності видаліть і знову додайте бота в кожну групу, щоб Telegram застосував зміну.
Статус адміністратора керується в налаштуваннях групи Telegram.Боти-адміністратори отримують усі повідомлення групи, що корисно для постійно активної поведінки в групі.
  • /setjoingroups щоб дозволити/заборонити додавання до груп
  • /setprivacy для поведінки видимості в групах

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

channels.telegram.dmPolicy керує доступом до прямих повідомлень:
  • pairing (за замовчуванням)
  • allowlist (потрібен принаймні один ID відправника в allowFrom)
  • open (потрібно, щоб allowFrom містив "*")
  • disabled
channels.telegram.allowFrom приймає числові ID користувачів Telegram. Префікси telegram: / tg: приймаються та нормалізуються. dmPolicy: "allowlist" з порожнім allowFrom блокує всі DM і відхиляється валідацією config. Під час налаштування запитуються лише числові ID користувачів. Якщо ви оновилися і ваша config містить записи allowlist у форматі @username, виконайте openclaw doctor --fix, щоб перетворити їх (best-effort; потрібен токен Telegram-бота). Якщо ви раніше покладалися на файли allowlist зі сховища підключень, openclaw doctor --fix може відновити записи в channels.telegram.allowFrom для сценаріїв allowlist (наприклад, коли dmPolicy: "allowlist" ще не має явних ID).Для ботів з одним власником рекомендується dmPolicy: "allowlist" з явними числовими ID у allowFrom, щоб політика доступу стабільно зберігалася в config (замість залежності від попередніх підтверджень підключення).Поширена плутанина: підтвердження підключення для DM не означає, що «цей відправник авторизований усюди». Підключення надає доступ лише до DM. Авторизація відправників у групах, як і раніше, визначається явними allowlist у config. Якщо ви хочете модель «я один раз авторизований, і працюють і DM, і команди в групах», додайте свій числовий ID користувача Telegram до channels.telegram.allowFrom.

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

Безпечніший спосіб (без стороннього бота):
  1. Надішліть DM своєму боту.
  2. Виконайте openclaw logs --follow.
  3. Прочитайте from.id.
Офіційний спосіб через Bot API:
curl "https://api.telegram.org/bot<bot_token>/getUpdates"
Сторонній спосіб (менш приватний): @userinfobot або @getidsbot.

Поведінка runtime

  • Telegram належить процесу gateway.
  • Маршрутизація детермінована: вхідні відповіді Telegram повертаються в Telegram (модель не вибирає канали).
  • Вхідні повідомлення нормалізуються у спільний конверт каналу з метаданими відповіді та заповнювачами для медіа.
  • Групові сесії ізольовані за ID групи. Теми форуму додають :topic:<threadId>, щоб теми залишалися ізольованими.
  • DM-повідомлення можуть містити message_thread_id; OpenClaw маршрутизує їх за thread-aware ключами сесії та зберігає ID треду для відповідей.
  • Long polling використовує runner grammY із послідовністю на рівні чату/треду. Загальна конкурентність sink runner-а використовує agents.defaults.maxConcurrent.
  • Перезапуски watchdog для long polling спрацьовують після 120 секунд без завершеної перевірки живості getUpdates за замовчуванням. Збільшуйте channels.telegram.pollingStallThresholdMs лише якщо у вашому розгортанні все ще трапляються хибні перезапуски через зависання polling під час довготривалої роботи. Значення задається в мілісекундах і може бути від 30000 до 600000; підтримуються перевизначення для окремих облікових записів.
  • Telegram Bot API не підтримує квитанції про прочитання (sendReadReceipts не застосовується).

Довідник можливостей

OpenClaw може транслювати часткові відповіді в реальному часі:
  • прямі чати: повідомлення попереднього перегляду + editMessageText
  • групи/теми: повідомлення попереднього перегляду + editMessageText
Вимога:
  • channels.telegram.streaming має бути off | partial | block | progress (за замовчуванням: partial)
  • progress у Telegram відображається як partial (сумісність із міжканальним найменуванням)
  • streaming.preview.toolProgress керує тим, чи оновлення інструментів/прогресу повторно використовують те саме відредаговане повідомлення попереднього перегляду (за замовчуванням: true). Установіть false, щоб зберігати окремі повідомлення інструментів/прогресу.
  • застарілі channels.telegram.streamMode і булеві значення streaming автоматично відображаються
Для відповідей лише з текстом:
  • DM: OpenClaw зберігає те саме повідомлення попереднього перегляду і виконує фінальне редагування на місці (без другого повідомлення)
  • група/тема: OpenClaw зберігає те саме повідомлення попереднього перегляду і виконує фінальне редагування на місці (без другого повідомлення)
Для складних відповідей (наприклад, медіа-повідомлень) OpenClaw повертається до звичайної фінальної доставки, а потім очищає повідомлення попереднього перегляду.Потокова передача попереднього перегляду відокремлена від block streaming. Коли block streaming для Telegram явно увімкнено, OpenClaw пропускає preview stream, щоб уникнути подвійної потокової передачі.Якщо нативний транспорт чернеток недоступний або відхилений, OpenClaw автоматично повертається до sendMessage + editMessageText.Потік reasoning лише для Telegram:
  • /reasoning stream надсилає reasoning у live preview під час генерації
  • фінальна відповідь надсилається без тексту reasoning
Для вихідного тексту використовується Telegram parse_mode: "HTML".
  • Текст у стилі Markdown рендериться в безпечний для Telegram HTML.
  • Сирий 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: "Створити зображення" },
      ],
    },
  },
}
Правила:
  • назви нормалізуються (прибирається початковий /, переводяться в нижній регістр)
  • допустимий шаблон: a-z, 0-9, _, довжина 1..32
  • користувацькі команди не можуть перевизначати нативні команди
  • конфлікти/дублікати пропускаються та журналюються
Примітки:
  • користувацькі команди — це лише записи меню; вони не реалізують поведінку автоматично
  • команди Plugin/Skills можуть і далі працювати при ручному введенні, навіть якщо вони не показані в меню Telegram
Якщо нативні команди вимкнено, вбудовані команди видаляються. Користувацькі команди/команди Plugin все ще можуть реєструватися, якщо це налаштовано.Поширені збої налаштування:
  • setMyCommands failed з BOT_COMMANDS_TOO_MUCH означає, що меню Telegram усе ще переповнене навіть після скорочення; зменште кількість користувацьких команд/команд Plugin/Skills або вимкніть channels.telegram.commands.native.
  • setMyCommands failed з помилками network/fetch зазвичай означає, що вихідний DNS/HTTPS до api.telegram.org заблокований.

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

Коли встановлено Plugin device-pair:
  1. /pair генерує код налаштування
  2. вставте код у застосунок iOS
  3. /pair pending показує список запитів, що очікують на розгляд (включно з role/scopes)
  4. підтвердьте запит:
    • /pair approve <requestId> для явного підтвердження
    • /pair approve, коли є лише один запит, що очікує на розгляд
    • /pair approve latest для найновішого
Код налаштування містить короткоживучий bootstrap token. Вбудований bootstrap handoff зберігає токен primary node на scopes: []; будь-який переданий operator token залишається обмеженим operator.approvals, operator.read, operator.talk.secrets і operator.write. Перевірки bootstrap scope мають префікс role, тому цей operator allowlist задовольняє лише operator-запити; для не-operator ролей усе ще потрібні scopes під власним префіксом ролі.Якщо пристрій повторює спробу зі зміненими даними auth (наприклад, role/scopes/public key), попередній запит, що очікує на розгляд, заміщується, а новий запит використовує інший requestId. Перед підтвердженням знову виконайте /pair pending.Докладніше: Підключення.
Налаштуйте область дії вбудованої клавіатури:
{
  channels: {
    telegram: {
      capabilities: {
        inlineButtons: "allowlist",
      },
    },
  },
}
Перевизначення для окремого облікового запису:
{
  channels: {
    telegram: {
      accounts: {
        main: {
          capabilities: {
            inlineButtons: "allowlist",
          },
        },
      },
    },
  },
}
Області дії:
  • off
  • dm
  • group
  • all
  • allowlist (за замовчуванням)
Застаріле capabilities: ["inlineButtons"] відображається як inlineButtons: "all".Приклад дії повідомлення:
{
  action: "send",
  channel: "telegram",
  to: "123456789",
  message: "Виберіть варіант:",
  buttons: [
    [
      { text: "Так", callback_data: "yes" },
      { text: "Ні", callback_data: "no" },
    ],
    [{ text: "Скасувати", callback_data: "cancel" }],
  ],
}
Натискання callback передаються агенту як текст: callback_data: <value>
Дії інструментів 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.*. Надсилання в runtime використовує активний snapshot config/secrets (startup/reload), тому шляхи дій не виконують ad-hoc повторне визначення SecretRef для кожного надсилання.Семантика видалення реакцій: /tools/reactions
Telegram підтримує явні теги тредів відповідей у згенерованому виводі:
  • [[reply_to_current]] відповідає на повідомлення, яке ініціювало дію
  • [[reply_to:<id>]] відповідає на конкретний ID повідомлення Telegram
channels.telegram.replyToMode керує обробкою:
  • off (за замовчуванням)
  • first
  • all
Примітка: off вимикає неявний трединг відповідей. Явні теги [[reply_to_*]] усе одно враховуються.
Супергрупи форуму:
  • ключі сесій тем додають :topic:<threadId>
  • відповіді й набір тексту націлюються на тред теми
  • шлях config теми: 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 належить лише темі й не успадковується з налаштувань групи за замовчуванням.Маршрутизація агентів для окремих тем: Кожна тема може маршрутизуватися до іншого агента через agentId у config теми. Це дає кожній темі власний ізольований workspace, пам’ять і сесію. Приклад:
{
  channels: {
    telegram: {
      groups: {
        "-1001234567890": {
          topics: {
            "1": { agentId: "main" },      // Загальна тема → агент main
            "3": { agentId: "zu" },        // Тема розробки → агент zu
            "5": { agentId: "coder" }      // Рев’ю коду → агент coder
          }
        }
      }
    }
  }
}
Тоді кожна тема має власний ключ сесії: agent:zu:telegram:group:-1001234567890:topic:3Постійна прив’язка тем ACP: Теми форуму можуть закріплювати сесії harness ACP через типізовані ACP-прив’язки верхнього рівня:
  • bindings[] з type: "acp" і match.channel: "telegram"
Приклад:
{
  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
Поведінка DM-тредів:
  • приватні чати з message_thread_id зберігають DM-маршрутизацію, але використовують thread-aware ключі сесій/цілі відповідей.

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

Telegram розрізняє голосові повідомлення та аудіофайли.
  • за замовчуванням: поведінка аудіофайлу
  • тег [[audio_as_voice]] у відповіді агента примусово надсилає як голосове повідомлення
Приклад дії повідомлення:
{
  action: "send",
  channel: "telegram",
  to: "123456789",
  media: "https://example.com/voice.ogg",
  asVoice: true,
}

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

Telegram розрізняє відеофайли та video note.Приклад дії повідомлення:
{
  action: "send",
  channel: "telegram",
  to: "123456789",
  media: "https://example.com/video.mp4",
  asVideoNote: true,
}
Video note не підтримують підписи; наданий текст повідомлення надсилається окремо.

Стікери

Обробка вхідних стікерів:
  • статичний WEBP: завантажується та обробляється (заповнювач <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 (окремо від payload повідомлень).Коли цю можливість увімкнено, 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 надсилає emoji-підтвердження, поки OpenClaw обробляє вхідне повідомлення.Порядок визначення:
  • channels.telegram.accounts.<accountId>.ackReaction
  • channels.telegram.ackReaction
  • messages.ackReaction
  • резервне emoji з identity агента (agents.list[].identity.emoji, інакше ”👀”)
Примітки:
  • Telegram очікує emoji Unicode (наприклад, ”👀”).
  • Використовуйте "", щоб вимкнути реакцію для каналу або облікового запису.
Записи config каналу увімкнені за замовчуванням (configWrites !== false).Записи, ініційовані Telegram, включають:
  • події міграції груп (migrate_to_chat_id) для оновлення channels.telegram.groups
  • /config set і /config unset (потрібне ввімкнення команд)
Вимкнення:
{
  channels: {
    telegram: {
      configWrites: false,
    },
  },
}
За замовчуванням: long polling.Режим Webhook:
  • задайте channels.telegram.webhookUrl
  • задайте channels.telegram.webhookSecret (обов’язково, коли задано URL webhook)
  • необов’язково channels.telegram.webhookPath (за замовчуванням /telegram-webhook)
  • необов’язково channels.telegram.webhookHost (за замовчуванням 127.0.0.1)
  • необов’язково channels.telegram.webhookPort (за замовчуванням 8787)
Локальний listener за замовчуванням для режиму webhook прив’язується до 127.0.0.1:8787.Якщо ваша публічна кінцева точка відрізняється, розмістіть перед нею reverse proxy і вкажіть webhookUrl на публічний URL. Установіть webhookHost (наприклад, 0.0.0.0), коли вам свідомо потрібен зовнішній вхідний доступ.
  • channels.telegram.textChunkLimit за замовчуванням має значення 4000.
  • channels.telegram.chunkMode="newline" надає перевагу межам абзаців (порожнім рядкам) перед поділом за довжиною.
  • channels.telegram.mediaMaxMb (за замовчуванням 100) обмежує розмір вхідних і вихідних медіафайлів Telegram.
  • channels.telegram.timeoutSeconds перевизначає тайм-аут клієнта Telegram API (якщо не задано, застосовується значення grammY за замовчуванням).
  • channels.telegram.pollingStallThresholdMs за замовчуванням дорівнює 120000; налаштовуйте в межах 30000600000 лише для хибнопозитивних перезапусків через зависання polling.
  • історія контексту групи використовує channels.telegram.historyLimit або messages.groupChat.historyLimit (за замовчуванням 50); 0 вимикає її.
  • додатковий контекст reply/quote/forward наразі передається як отримано.
  • allowlist Telegram насамперед обмежують, хто може викликати агента, а не є повноцінною межею редагування додаткового контексту.
  • елементи керування історією DM:
    • channels.telegram.dmHistoryLimit
    • channels.telegram.dms["<user_id>"].historyLimit
  • config channels.telegram.retry застосовується до допоміжних функцій надсилання Telegram (CLI/tools/actions) для відновлюваних вихідних помилок API.
Ціллю надсилання в CLI може бути числовий ID чату або ім’я користувача:
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:)
Надсилання в Telegram також підтримує:
  • --buttons для вбудованих клавіатур, коли це дозволяє channels.telegram.capabilities.inlineButtons
  • --force-document, щоб надсилати вихідні зображення та GIF як документи, а не як стиснені фото чи анімовані медіазавантаження
Керування доступом до дій:
  • channels.telegram.actions.sendMessage=false вимикає вихідні повідомлення Telegram, включно з опитуваннями
  • channels.telegram.actions.poll=false вимикає створення опитувань Telegram, залишаючи звичайне надсилання увімкненим
Telegram підтримує підтвердження exec у DM затверджувачів і за потреби може надсилати запити на підтвердження в початковий чат або тему.Шлях config:
  • channels.telegram.execApprovals.enabled
  • channels.telegram.execApprovals.approvers (необов’язково; інакше використовуються числові ID власників, виведені з allowFrom і прямого defaultTo, де це можливо)
  • channels.telegram.execApprovals.target (dm | channel | both, за замовчуванням: dm)
  • agentFilter, sessionFilter
Затверджувачі мають бути числовими ID користувачів Telegram. Telegram автоматично вмикає нативні підтвердження exec, коли enabled не задано або має значення "auto" і можна визначити принаймні одного затверджувача — або з execApprovals.approvers, або з числової config власника облікового запису (allowFrom і defaultTo для прямих повідомлень). Установіть enabled: false, щоб явно вимкнути Telegram як нативний клієнт підтвердження. Інакше запити на підтвердження повертаються до інших налаштованих маршрутів підтвердження або до резервної політики підтвердження exec.Telegram також відображає спільні кнопки підтвердження, які використовують інші чат-канали. Нативний адаптер Telegram переважно додає маршрутизацію DM затверджувачів, fanout у канали/теми та підказки набору тексту перед доставкою. Коли ці кнопки присутні, вони є основним UX підтвердження; OpenClaw має включати ручну команду /approve лише тоді, коли результат інструмента вказує, що підтвердження в чаті недоступні або ручне підтвердження — єдиний шлях.Правила доставки:
  • target: "dm" надсилає запити на підтвердження лише в DM визначених затверджувачів
  • target: "channel" надсилає запит назад у початковий чат/тему Telegram
  • target: "both" надсилає і в DM затверджувачів, і в початковий чат/тему
Лише визначені затверджувачі можуть підтверджувати або відхиляти. Не-затверджувачі не можуть використовувати /approve і не можуть використовувати кнопки підтвердження Telegram.Поведінка визначення підтвердження:
  • ID з префіксом plugin: завжди визначаються через підтвердження plugin.
  • Інші ID спочатку пробують exec.approval.resolve.
  • Якщо Telegram також авторизований для підтверджень plugin і gateway повідомляє, що підтвердження exec невідоме або сплило, Telegram один раз повторює спробу через plugin.approval.resolve.
  • Реальні відмови/помилки підтвердження exec не переходять мовчки до визначення підтвердження plugin.
Доставка в канал показує текст команди в чаті, тому вмикайте channel або both лише в довірених групах/темах. Коли запит потрапляє в тему форуму, OpenClaw зберігає тему і для запиту на підтвердження, і для подальшого повідомлення після підтвердження. За замовчуванням підтвердження exec спливають через 30 хвилин.Вбудовані кнопки підтвердження також залежать від того, чи channels.telegram.capabilities.inlineButtons дозволяє цільову поверхню (dm, group або all).Пов’язана документація: Підтвердження exec

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

Коли агент стикається з помилкою доставки або провайдера, Telegram може або відповісти текстом помилки, або приховати його. Цю поведінку контролюють два ключі config:
KeyValuesDefaultDescription
channels.telegram.errorPolicyreply, silentreplyreply надсилає дружнє повідомлення про помилку в чат. silent повністю пригнічує відповіді про помилки.
channels.telegram.errorCooldownMsnumber (ms)60000Мінімальний час між відповідями про помилки в той самий чат. Запобігає спаму помилками під час збоїв.
Підтримуються перевизначення для окремих облікових записів, груп і тем (та сама схема успадкування, що й для інших ключів config Telegram).
{
  channels: {
    telegram: {
      errorPolicy: "reply",
      errorCooldownMs: 120000,
      groups: {
        "-1001234567890": {
          errorPolicy: "silent", // пригнічувати помилки в цій групі
        },
      },
    },
  },
}

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

  • Якщо requireMention=false, режим приватності Telegram має дозволяти повну видимість.
    • BotFather: /setprivacy -> Disable
    • потім видаліть і знову додайте бота в групу
  • openclaw channels status попереджає, коли config очікує повідомлення групи без згадування.
  • openclaw channels status --probe може перевіряти явні числові ID груп; wildcard "*" не можна перевірити на членство.
  • швидкий тест сесії: /activation always.
  • коли існує channels.telegram.groups, група має бути вказана (або має бути "*")
  • перевірте членство бота в групі
  • перегляньте журнали: openclaw logs --follow для причин пропуску
  • авторизуйте свою ідентичність відправника (підключення та/або числовий allowFrom)
  • авторизація команд усе одно застосовується, навіть коли політика групи open
  • setMyCommands failed з BOT_COMMANDS_TOO_MUCH означає, що нативне меню має забагато записів; зменште кількість користувацьких команд/команд Plugin/Skills або вимкніть нативні меню
  • setMyCommands failed з помилками network/fetch зазвичай вказує на проблеми доступності DNS/HTTPS до api.telegram.org
  • Node 22+ + власний fetch/proxy можуть спричиняти негайне переривання, якщо типи AbortSignal не збігаються.
  • Деякі хости спочатку визначають api.telegram.org в IPv6; несправний вихідний IPv6 може спричиняти переривчасті збої Telegram API.
  • Якщо журнали містять TypeError: fetch failed або Network request for 'getUpdates' failed!, OpenClaw тепер повторює їх як відновлювані помилки мережі.
  • Якщо журнали містять Polling stall detected, OpenClaw перезапускає polling і перебудовує транспорт Telegram після 120 секунд без завершеної перевірки живості long-poll за замовчуванням.
  • Збільшуйте channels.telegram.pollingStallThresholdMs лише тоді, коли довготривалі виклики getUpdates є здоровими, але ваш хост усе одно повідомляє про хибнопозитивні перезапуски через зависання polling. Стійкі зависання зазвичай вказують на проблеми з proxy, DNS, IPv6 або TLS egress між хостом і api.telegram.org.
  • На VPS-хостах із нестабільним прямим egress/TLS маршрутизуйте виклики Telegram API через channels.telegram.proxy:
channels:
  telegram:
    proxy: socks5://<user>:<password>@proxy-host:1080
  • Node 22+ за замовчуванням використовує autoSelectFamily=true (крім WSL2) і dnsResultOrder=ipv4first.
  • Якщо ваш хост — WSL2 або явно краще працює лише з IPv4, примусово задайте вибір family:
channels:
  telegram:
    network:
      autoSelectFamily: false
  • Відповіді в діапазоні benchmark RFC 2544 (198.18.0.0/15) уже дозволені за замовчуванням для завантаження медіа Telegram. Якщо довірений fake-IP або transparent proxy переписує api.telegram.org на якусь іншу приватну/внутрішню/special-use адресу під час завантаження медіа, ви можете явно ввімкнути обхід лише для Telegram:
channels:
  telegram:
    network:
      dangerouslyAllowPrivateNetwork: true
  • Такий самий явний параметр доступний для окремого облікового запису в channels.telegram.accounts.<accountId>.network.dangerouslyAllowPrivateNetwork.
  • Якщо ваш proxy визначає медіахости Telegram у 198.18.x.x, спочатку залиште небезпечний прапорець вимкненим. Медіа Telegram уже дозволяє діапазон benchmark RFC 2544 за замовчуванням.
channels.telegram.network.dangerouslyAllowPrivateNetwork послаблює захист від SSRF для медіа Telegram. Використовуйте його лише в довірених керованих оператором середовищах proxy, таких як fake-IP routing у Clash, Mihomo або Surge, коли вони синтезують приватні або special-use відповіді поза межами benchmark-діапазону RFC 2544. Для звичайного публічного доступу до Telegram через інтернет залишайте його вимкненим.
  • Перевизначення через env (тимчасово):
    • 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
Додаткова допомога: Усунення несправностей каналу.

Вказівники на довідник config Telegram

Основний довідник:
  • channels.telegram.enabled: увімкнути/вимкнути запуск каналу.
  • channels.telegram.botToken: токен бота (BotFather).
  • channels.telegram.tokenFile: читати токен зі шляху до звичайного файлу. Символічні посилання відхиляються.
  • channels.telegram.dmPolicy: pairing | allowlist | open | disabled (за замовчуванням: pairing).
  • channels.telegram.allowFrom: allowlist DM (числові ID користувачів Telegram). allowlist вимагає щонайменше один ID відправника. open вимагає "*". openclaw doctor --fix може перетворювати застарілі записи @username на ID і може відновлювати записи allowlist з файлів pairing-store у сценаріях міграції 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 відправників у групах (числові ID користувачів Telegram). openclaw doctor --fix може перетворювати застарілі записи @username на ID. Нечислові записи ігноруються під час auth. Авторизація груп не використовує резервний варіант через DM pairing-store (2026.2.25+).
  • Пріоритет для кількох облікових записів:
    • Коли налаштовано два або більше ID облікових записів, задайте channels.telegram.defaultAccount (або включіть channels.telegram.accounts.default), щоб явно визначити маршрутизацію за замовчуванням.
    • Якщо не задано жодного з них, OpenClaw використовує перший нормалізований 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: фільтр Skills (пропущено = усі 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: маршрутизувати цю тему до конкретного агента (перевизначає маршрутизацію на рівні групи та bindings).
  • channels.telegram.groups.<id>.topics.<threadId>.groupPolicy: перевизначення groupPolicy для окремої теми (open | allowlist | disabled).
  • channels.telegram.groups.<id>.topics.<threadId>.requireMention: перевизначення обмеження через згадування для окремої теми.
  • верхньорівневий bindings[] з type: "acp" і канонічним ID теми chatId:topic:topicId у match.peer.id: поля постійної ACP-прив’язки теми (див. ACP Agents).
  • channels.telegram.direct.<id>.topics.<threadId>.agentId: маршрутизувати теми DM до конкретного агента (та сама поведінка, що й для тем форуму).
  • channels.telegram.execApprovals.enabled: увімкнути Telegram як чат-клієнт підтверджень exec для цього облікового запису.
  • channels.telegram.execApprovals.approvers: ID користувачів Telegram, яким дозволено підтверджувати або відхиляти запити exec. Необов’язково, коли channels.telegram.allowFrom або прямий channels.telegram.defaultTo уже визначає власника.
  • channels.telegram.execApprovals.target: dm | channel | both (за замовчуванням: dm). channel і both зберігають початкову тему Telegram, якщо вона є.
  • channels.telegram.execApprovals.agentFilter: необов’язковий фільтр 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: увімкнути/вимкнути нативні команди Skills у 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 (попередній перегляд live stream; за замовчуванням: partial; progress відображається як partial; block — сумісність із застарілим режимом preview). Потоковий preview у Telegram використовує одне повідомлення попереднього перегляду, яке редагується на місці.
  • channels.telegram.streaming.preview.toolProgress: повторно використовувати повідомлення live preview для оновлень інструментів/прогресу, коли preview streaming активний (за замовчуванням: true). Установіть false, щоб зберігати окремі повідомлення інструментів/прогресу.
  • channels.telegram.mediaMaxMb: обмеження медіа Telegram для вхідних/вихідних даних (МБ, за замовчуванням: 100).
  • channels.telegram.retry: політика повторних спроб для допоміжних функцій надсилання Telegram (CLI/tools/actions) при відновлюваних вихідних помилках 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.network.dangerouslyAllowPrivateNetwork: небезпечний явний параметр для довірених середовищ fake-IP або transparent-proxy, де завантаження медіа Telegram визначають api.telegram.org у приватні/внутрішні/special-use адреси поза стандартним дозволеним benchmark-діапазоном RFC 2544.
  • channels.telegram.proxy: URL proxy для викликів 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, якщо не задано).
  • channels.telegram.errorPolicy: reply | silent — керує поведінкою відповіді на помилки (за замовчуванням: reply). Підтримуються перевизначення для окремих облікових записів/груп/тем.
  • channels.telegram.errorCooldownMs: мінімальна кількість мс між відповідями про помилки в той самий чат (за замовчуванням: 60000). Запобігає спаму помилками під час збоїв.
  • Довідник конфігурації — Telegram
Специфічні для Telegram високосигнальні поля:
  • startup/auth: 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: streaming (preview), streaming.preview.toolProgress, blockStreaming
  • форматування/доставка: textChunkLimit, chunkMode, linkPreview, responsePrefix
  • медіа/мережа: mediaMaxMb, timeoutSeconds, pollingStallThresholdMs, retry, network.autoSelectFamily, network.dangerouslyAllowPrivateNetwork, proxy
  • webhook: webhookUrl, webhookSecret, webhookPath, webhookHost
  • дії/можливості: capabilities.inlineButtons, actions.sendMessage|editMessage|deleteMessage|reactions|sticker
  • реакції: reactionNotifications, reactionLevel
  • помилки: errorPolicy, errorCooldownMs
  • записи/історія: configWrites, historyLimit, dmHistoryLimit, dms.*.historyLimit

Пов’язане