Telegram (Bot API)
Status: production-ready for bot DMs + groups via grammY. Long polling is the default mode; webhook mode is optional.Pairing
Channel troubleshooting
Gateway configuration
Quick setup
Create the bot token in BotFather
@BotFather).Run /newbot, follow prompts, and save the token.Configure token and DM policy
TELEGRAM_BOT_TOKEN=... (default account only).
Telegram does not use openclaw channels login telegram; configure token in config/env, then start gateway.Start gateway and approve first DM
Add the bot to a group
channels.telegram.groups and groupPolicy to match your access model.TELEGRAM_BOT_TOKEN only applies to the default account.Telegram side settings
Privacy mode and group visibility
Privacy mode and group visibility
- disable privacy mode via
/setprivacy, or - make the bot a group admin.
Group permissions
Group permissions
Helpful BotFather toggles
Helpful BotFather toggles
/setjoingroupsto allow/deny group adds/setprivacyfor group visibility behavior
Access control and activation
- DM policy
- Group policy and allowlists
- Mention behavior
channels.telegram.dmPolicy controls direct message access:pairing(default)allowlist(requires at least one sender ID inallowFrom)open(requiresallowFromto include"*")disabled
channels.telegram.allowFrom accepts numeric Telegram user IDs. telegram: / tg: prefixes are accepted and normalized.
dmPolicy: "allowlist" with empty allowFrom blocks all DMs and is rejected by config validation.
The onboarding wizard accepts @username input and resolves it to numeric IDs.
If you upgraded and your config contains @username allowlist entries, run openclaw doctor --fix to resolve them (best-effort; requires a Telegram bot token).
If you previously relied on pairing-store allowlist files, openclaw doctor --fix can recover entries into channels.telegram.allowFrom in allowlist flows (for example when dmPolicy: "allowlist" has no explicit IDs yet).Finding your Telegram user ID
Safer (no third-party bot):- DM your bot.
- Run
openclaw logs --follow. - Read
from.id.
@userinfobot or @getidsbot.Runtime behavior
- Telegram is owned by the gateway process.
- Routing is deterministic: Telegram inbound replies back to Telegram (the model does not pick channels).
- Inbound messages normalize into the shared channel envelope with reply metadata and media placeholders.
- Group sessions are isolated by group ID. Forum topics append
:topic:<threadId>to keep topics isolated. - DM messages can carry
message_thread_id; OpenClaw routes them with thread-aware session keys and preserves thread ID for replies. - Long polling uses grammY runner with per-chat/per-thread sequencing. Overall runner sink concurrency uses
agents.defaults.maxConcurrent. - Telegram Bot API has no read-receipt support (
sendReadReceiptsdoes not apply).
If Telegram replies stop or repeat network errors
For users, the visible symptom is simple: Telegram messages stop getting replies, or replies arrive only after a delay. Ask an operator to run the checks below; no Telegram app setting usually needs to change. For operators, repeated gateway logs like this usually mean long polling cannot keep a stablegetUpdates request alive:
channels.telegram.timeoutSeconds controls only the Telegram long-poll request window. Leave it
unset unless you have a network-specific reason to override it. When unset, WednesdayAI applies the
safe 30 second polling window. Values below 30 seconds are unsafe because they can create short,
bursty reconnect loops; values above 50 seconds can exceed the gatewayβs safe request window. The
gateway clamps unsafe values at runtime, startup health reports the configured and applied value,
and wednesdayai doctor --fix repairs the config:
- below 30 seconds: remove the override so the 30 second default applies;
- above 50 seconds: rewrite the override to 50 seconds.
Multi-bot fleet
One gateway instance can run a fleet of Telegram bot accounts. Define shared defaults underchannels.telegram, then add named bot accounts under channels.telegram.accounts.
channels.telegram.groups: in
multi-account fleets, top-level groups is not inherited by named accounts because each bot may be
present in different Telegram groups. Repeat group allowlists, mention settings, and topic settings
under each account that should serve those groups. Single-account configs keep the legacy
top-level groups fallback. Named accounts can also fall back to top-level botToken or
tokenFile for backward-compatible single-bot configs. TELEGRAM_BOT_TOKEN is only a fallback for
the default account. In multi-bot fleets, set account-level botToken or tokenFile for each named
account so two enabled accounts do not accidentally resolve to the same bot token and enter a
duplicate-owner conflict.
Account IDs are operator labels, not Telegram identifiers. Use stable names such as alerts,
support, or ops, and keep bot tokens in config secrets or token files.
Polling, webhook, and ownership
Each account runs in one of these modes:polling: default long-polling mode usinggetUpdates.webhook: enabled when the account haswebhookUrl.disabled: account is configured but not started.
conflicted and the first owner remains authoritative.
Polling startup performs non-destructive webhook cleanup before getUpdates: it calls Telegram
with drop_pending_updates: false. WednesdayAI does not implicitly discard pending Telegram
updates. Treat any manual use of drop_pending_updates outside WednesdayAI as a deliberate data
loss operation.
Long-polling uses a safe Telegram API timeout window. channels.telegram.timeoutSeconds (default
30 seconds) controls the getUpdates long-poll window. The botβs underlying HTTP client abort
timeout is derived automatically as the poll window plus a 10-second buffer β for example,
a 30-second poll window gives the HTTP client 40 seconds before it aborts β so an empty poll that
completes right at the window boundary is never misidentified as a network error. Explicit values
below 30 seconds are treated as unsafe and clamped to 30 seconds; values above 50 seconds are
clamped to 50 seconds. Account-level
channels.telegram.accounts.<id>.timeoutSeconds wins over the channel-level value for that account.
Standalone outbound send helpers keep their existing timeout behavior because they use a separate
send client path. Startup health and wednesdayai doctor report the config path, configured value,
and applied safe value when a timeout override is unsafe.
wednesdayai doctor --fix writes the durable version of that runtime policy back to config:
below-minimum overrides are removed when the applied safe value is the default, and above-maximum
overrides are rewritten to 50 seconds.
Conflict states usually mean one of:
- another local account in the same gateway resolved the same bot token;
- another gateway process is polling the same bot;
- Telegram still has a webhook owner while this account is trying to poll;
- the webhook endpoint is reachable but rejecting or timing out.
wednesdayai doctor reads the
running gateway channel-status snapshot for live duplicate-poller warnings.
Channels UI health
The Channels UI shows per-account Telegram fleet state fromapplication.telegram.
High-signal fields:
mode,state,reason, andpreviousStateshow the account lifecycle.configured,running,gatewayInstanceId,owner, andownerStartedAtshow ownership.retryAtmarks recoverable backoff or flood-wait recovery windows.poll.lastPollAt,poll.lastConflictAt, andpoll.lastOffsetdescribe long-polling health.webhook.configured,webhook.urlHash,webhook.path,webhook.secretPresent,webhook.pendingUpdateCount, and webhook request counters describe webhook health without showing the raw URL secret or request body.delivery.queueDepth,delivery.lastDeliveryStatus,delivery.retryAfterMs,delivery.nextRetryAt, anddelivery.lastDestinationHashdescribe outbound send health.lastApiRequests,lastUpdates, andlastDeliveriesretain recent events with hashed Telegram identifiers only.
OTel and Langfuse export
When diagnostics OTel export is enabled, Telegram lifecycle, polling, webhook, update, and delivery events are exported as spans, counters, and histograms. Telegram-correlated run, model, tool, and model-usage spans inherit the same hashed actor/session identity so Langfuse can group activity without receiving raw Telegram identifiers. Representative exported attributes:openclaw.channel = "telegram"telegram.account.hashtelegram.bot.hashtelegram.chat.hashtelegram.user.hashtelegram.thread.hashtelegram.update.idtelegram.modetelegram.account.statetelegram.api.methodtelegram.retry_after_mslangfuse.session.idlangfuse.user.id
- Bot tokens, raw chat IDs, raw user IDs, raw thread IDs, raw message IDs, webhook secrets, raw webhook URLs, and message content are not exported.
- Telegram tool input/output capture is replaced with a fixed redaction marker on Telegram-correlated spans.
- Telegram-shaped OTLP log records redact the body and drop aggregate argument fields when they contain Telegram IDs or message content.
Feature reference
Live stream preview (native drafts + message edits)
Live stream preview (native drafts + message edits)
- direct chats: Telegram native draft streaming via
sendMessageDraft - groups/topics: preview message +
editMessageText
channels.telegram.streamingisoff | partial | block | progress(default:partial)progressmaps topartialon Telegram (compat with cross-channel naming)- legacy
channels.telegram.streamModeand booleanstreamingvalues are auto-mapped - the global
streamingvalue is inherited by all accounts β per-account config does not need its ownstreamingkey to pick it up. Setstreamingonce at the channel level to apply it to all bots.
sendMessageDraft for all bots in Bot API 9.5 (March 1, 2026).For text-only replies:- DM: OpenClaw updates the draft in place (no extra preview message)
- group/topic: OpenClaw keeps the same preview message and performs a final edit in place (no second message)
sendMessage + editMessageText.Telegram-only reasoning stream:/reasoning streamsends reasoning to the live preview while generating- final answer is sent without reasoning text
Formatting and HTML fallback
Formatting and HTML fallback
parse_mode: "HTML".- Markdown-ish text is rendered to Telegram-safe HTML.
- Raw model HTML is escaped to reduce Telegram parse failures.
- If Telegram rejects parsed HTML, OpenClaw retries as plain text.
channels.telegram.linkPreview: false.Native commands and custom commands
Native commands and custom commands
setMyCommands.Native command defaults:commands.native: "auto"enables native commands for Telegram
- names are normalized (strip leading
/, lowercase) - valid pattern:
a-z,0-9,_, length1..32 - custom commands cannot override native commands
- conflicts/duplicates are skipped and logged
- custom commands are menu entries only; they do not auto-implement behavior
- plugin/skill commands can still work when typed even if not shown in Telegram menu
setMyCommands failedusually means outbound DNS/HTTPS toapi.telegram.orgis blocked.
Device pairing commands (device-pair plugin)
When the device-pair plugin is installed:/pairgenerates setup code- paste code in iOS app
/pair approveapproves latest pending request
Telegram message actions for agents and automation
Telegram message actions for agents and automation
sendMessage(to,content, optionalmediaUrl,replyToMessageId,messageThreadId)react(chatId,messageId,emoji)deleteMessage(chatId,messageId)editMessage(chatId,messageId,content)createForumTopic(chatId,name, optionaliconColor,iconCustomEmojiId)
send, react, delete, edit, sticker, sticker-search, topic-create).Gating controls:channels.telegram.actions.sendMessagechannels.telegram.actions.deleteMessagechannels.telegram.actions.editMessagechannels.telegram.actions.reactionschannels.telegram.actions.sticker(default: disabled)channels.telegram.actions.createForumTopic(default: enabled)
Forum topics and thread behavior
Forum topics and thread behavior
- topic session keys append
:topic:<threadId> - replies and typing target the topic thread
- topic config path:
channels.telegram.groups.<chatId>.topics.<threadId>
threadId=1) special-case:- message sends omit
message_thread_id(Telegram rejectssendMessage(...thread_id=1)) - typing actions still include
message_thread_id
requireMention, allowFrom, skills, systemPrompt, enabled, groupPolicy).Template context includes:MessageThreadIdIsForum
- private chats with
message_thread_idkeep DM routing but use thread-aware session keys/reply targets.
Audio, video, and stickers
Audio, video, and stickers
Audio messages
Telegram distinguishes voice notes vs audio files.- default: audio file behavior
- tag
[[audio_as_voice]]in agent reply to force voice-note send
Video messages
Telegram distinguishes video files vs video notes.Message action example:Stickers
Inbound sticker handling:- static WEBP: downloaded and processed (placeholder
<media:sticker>) - animated TGS: skipped
- video WEBM: skipped
Sticker.emojiSticker.setNameSticker.fileIdSticker.fileUniqueIdSticker.cachedDescription
~/.openclaw/telegram/sticker-cache.json
Reaction notifications
Reaction notifications
message_reaction updates (separate from message payloads).When enabled, OpenClaw enqueues system events like:Telegram reaction added: π by Alice (@alice) on msg 42
channels.telegram.reactionNotifications:off | own | all(default:own)channels.telegram.reactionLevel:off | ack | minimal | extensive(default:minimal)
ownmeans user reactions to bot-sent messages only (best-effort via sent-message cache).- Reaction events still respect Telegram access controls (
dmPolicy,allowFrom,groupPolicy,groupAllowFrom); unauthorized senders are dropped. - Telegram does not provide thread IDs in reaction updates.
- non-forum groups route to group chat session
- forum groups route to the group general-topic session (
:topic:1), not the exact originating topic
allowed_updates for polling/webhook include message_reaction automatically.Ack reactions
Ack reactions
ackReaction sends an acknowledgement emoji while OpenClaw is processing an inbound message.Resolution order:channels.telegram.accounts.<accountId>.ackReactionchannels.telegram.ackReactionmessages.ackReaction- agent identity emoji fallback (
agents.list[].identity.emoji, else βπβ)
- Telegram expects unicode emoji (for example βπβ).
- Use
""to disable the reaction for a channel or account.
Config writes from Telegram events and commands
Config writes from Telegram events and commands
configWrites !== false).Telegram-triggered writes include:- group migration events (
migrate_to_chat_id) to updatechannels.telegram.groups /config setand/config unset(requires command enablement)
Long polling vs webhook
Long polling vs webhook
- set
channels.telegram.webhookUrl - set
channels.telegram.webhookSecret(required when webhook URL is set) - optional
channels.telegram.webhookPath(default/telegram-webhook) - optional
channels.telegram.webhookHost(default127.0.0.1) - optional
channels.telegram.webhookPort(default8787)
127.0.0.1:8787.If your public endpoint differs, place a reverse proxy in front and point webhookUrl at the public URL.
Set webhookHost (for example 0.0.0.0) when you intentionally need external ingress.Limits, retry, and CLI targets
Limits, retry, and CLI targets
channels.telegram.textChunkLimitdefault is 4000.channels.telegram.chunkMode="newline"prefers paragraph/block boundaries and packs as many complete paragraphs as fit into each message up totextChunkLimit, falling back to length-based splitting only when a single block exceeds the limit. Fenced code blocks and tables are kept intact.channels.telegram.chunkNewlinePacking(defaulttrue): set tofalseto restore one message per paragraph (the pre-packing behaviour).channels.telegram.mediaMaxMb(default 5) caps inbound Telegram media download/processing size.channels.telegram.timeoutSecondscontrols the Telegram long-poll (getUpdates) window. Safe values are 30-50 seconds; unset uses 30 seconds. The botβs HTTP client abort timeout is derived as this value plus 10 seconds (for example, 30s poll window β 40s HTTP abort), ensuring an empty poll that completes at the window boundary is never aborted. Account-levelchannels.telegram.accounts.<id>.timeoutSecondsoverrides the channel-level value.- group context history uses
channels.telegram.historyLimitormessages.groupChat.historyLimit(default 50);0disables. - DM history controls:
channels.telegram.dmHistoryLimitchannels.telegram.dms["<user_id>"].historyLimit
channels.telegram.retryconfig applies to Telegram send helpers (CLI/tools/actions) for recoverable outbound API errors.
Troubleshooting
Bot does not respond to non mention group messages
Bot does not respond to non mention group messages
- If
requireMention=false, Telegram privacy mode must allow full visibility.- BotFather:
/setprivacy-> Disable - then remove + re-add bot to group
- BotFather:
openclaw channels statuswarns when config expects unmentioned group messages.openclaw channels status --probecan check explicit numeric group IDs; wildcard"*"cannot be membership-probed.- quick session test:
/activation always.
Bot not seeing group messages at all
Bot not seeing group messages at all
- when
channels.telegram.groupsexists, group must be listed (or include"*") - verify bot membership in group
- review logs:
openclaw logs --followfor skip reasons
Commands work partially or not at all
Commands work partially or not at all
- authorize your sender identity (pairing and/or numeric
allowFrom) - command authorization still applies even when group policy is
open setMyCommands failedusually indicates DNS/HTTPS reachability issues toapi.telegram.org
Polling or network instability
Polling or network instability
- Node 22+ + custom fetch/proxy can trigger immediate abort behavior if AbortSignal types mismatch.
- Some hosts resolve
api.telegram.orgto IPv6 first; broken IPv6 egress can cause intermittent Telegram API failures. - If logs include
TypeError: fetch failedorNetwork request for 'getUpdates' failed!, WednesdayAI treats these as recoverable long-polling network errors for read-only API calls (getUpdates,getFile, and otherget*methods). The IPv4-fallback retry fires once on these methods. Mutation methods (sendMessage,editMessageText,deleteMessage, etc.) are not retried onTypeError: fetch failedβ a lost-in-transit HTTP response for a mutation could cause duplicate delivery, so the error propagates without retry. On a recoverable read error, WednesdayAI stops the active runner and bot, refreshes polling transport state, backs off, and creates a fresh bot before the nextgetUpdatescycle. - Repeated
getUpdatesfailures usually indicate unsafe lowchannels.telegram.timeoutSeconds, unstable DNS/TLS egress toapi.telegram.org, a stale proxy connection, or duplicate pollers for one bot token. Runwednesdayai doctorto see timeout and duplicate-poller warnings, andwednesdayai doctor --fixto repair unsafe timeout overrides. - On VPS hosts with unstable direct egress/TLS, route Telegram API calls through
channels.telegram.proxy:
- Node 22+ defaults to
autoSelectFamily=true(except WSL2) anddnsResultOrder=ipv4first. - If your host is WSL2 or explicitly works better with IPv4-only behavior, force family selection:
- Environment overrides (temporary):
OPENCLAW_TELEGRAM_DISABLE_AUTO_SELECT_FAMILY=1OPENCLAW_TELEGRAM_ENABLE_AUTO_SELECT_FAMILY=1OPENCLAW_TELEGRAM_DNS_RESULT_ORDER=ipv4first
- Validate DNS answers:
Messages lost on bot restart or gateway shutdown
Messages lost on bot restart or gateway shutdown
- Media group buffer: multi-photo messages grouped within the same
media_group_idare collected with a short timer before processing. On shutdown, buffered groups are flushed immediately through the normal media processing pipeline. - Text fragment buffer: messages split across the 4096-character Telegram limit are collected and re-assembled. On shutdown, buffered fragments are flushed and dispatched before the bot stops.
- whether the process receives a clean SIGTERM (not SIGKILL) β only SIGTERM allows the abort-signal drain to run
journalctl --user -u openclaw-gateway -n 50fordrainlog entries confirming flush occurred
Telegram config reference pointers
Primary reference:-
channels.telegram.enabled: enable/disable channel startup. -
channels.telegram.botToken: bot token (BotFather). -
channels.telegram.tokenFile: read token from file path. -
channels.telegram.dmPolicy:pairing | allowlist | open | disabled(default: pairing). -
channels.telegram.allowFrom: DM allowlist (numeric Telegram user IDs).allowlistrequires at least one sender ID.openrequires"*".openclaw doctor --fixcan resolve legacy@usernameentries to IDs and can recover allowlist entries from pairing-store files in allowlist migration flows. -
channels.telegram.defaultTo: default Telegram target used by CLI--deliverwhen no explicit--reply-tois provided. -
channels.telegram.groupPolicy:open | allowlist | disabled(default: allowlist). -
channels.telegram.groupAllowFrom: group sender allowlist (numeric Telegram user IDs).openclaw doctor --fixcan resolve legacy@usernameentries to IDs. Non-numeric entries are ignored at auth time. Group auth does not use DM pairing-store fallback (2026.2.25+). -
Multi-account precedence:
channels.telegram.accounts.default.allowFromandchannels.telegram.accounts.default.groupAllowFromapply only to thedefaultaccount.- Named accounts inherit
channels.telegram.allowFromandchannels.telegram.groupAllowFromwhen account-level values are unset. - Named accounts do not inherit
channels.telegram.accounts.default.allowFrom/groupAllowFrom.
-
channels.telegram.groups: per-group defaults + allowlist (use"*"for global defaults).channels.telegram.groups.<id>.groupPolicy: per-group override for groupPolicy (open | allowlist | disabled).channels.telegram.groups.<id>.requireMention: mention gating default.channels.telegram.groups.<id>.skills: skill filter (omit = all skills, empty = none).channels.telegram.groups.<id>.allowFrom: per-group sender allowlist override.channels.telegram.groups.<id>.systemPrompt: extra system prompt for the group.channels.telegram.groups.<id>.enabled: disable the group whenfalse.channels.telegram.groups.<id>.disableAudioPreflight: skip automatic voice-note transcription for mention detection in this group.channels.telegram.groups.<id>.topics.<threadId>.*: per-topic overrides (same fields as group).channels.telegram.groups.<id>.topics.<threadId>.groupPolicy: per-topic override for groupPolicy (open | allowlist | disabled).channels.telegram.groups.<id>.topics.<threadId>.requireMention: per-topic mention gating override.channels.telegram.groups.<id>.topics.<threadId>.disableAudioPreflight: per-topic voice-note transcription skip.
-
channels.telegram.direct: per-DM configuration keyed by chat ID.channels.telegram.direct.<chatId>.dmPolicy: per-DM override (open | disabled | allowlist).channels.telegram.direct.<chatId>.tools: per-DM tool policy overrides.channels.telegram.direct.<chatId>.skills: per-DM skill filter.channels.telegram.direct.<chatId>.allowFrom: per-DM sender allowlist override.channels.telegram.direct.<chatId>.systemPrompt: extra system prompt for the DM.channels.telegram.direct.<chatId>.enabled: disable the DM whenfalse.channels.telegram.direct.<chatId>.requireTopic: require messages to be from a topic when topics are enabled.channels.telegram.direct.<chatId>.topics.<threadId>.*: per-DM topic overrides (same fields as group topics).
-
channels.telegram.capabilities.inlineButtons:off | dm | group | all | allowlist(default: allowlist). -
channels.telegram.accounts.<account>.capabilities.inlineButtons: per-account override. -
channels.telegram.commands.nativeSkills: enable/disable Telegram native skills commands. -
channels.telegram.replyToMode:off | first | all(default:off). -
channels.telegram.textChunkLimit: outbound chunk size (chars). -
channels.telegram.chunkMode:length(default) ornewlineto pack paragraph blocks up totextChunkLimitper message; oversized blocks fall back to length splitting. -
channels.telegram.chunkNewlinePacking: packing mode fornewlinechunking (default:true). Set tofalseto restore one message per paragraph. -
channels.telegram.linkPreview: toggle link previews for outbound messages (default: true). -
channels.telegram.streaming:off | partial | block | progress(live stream preview; default:partial;progressmaps topartial;blockis legacy preview mode compatibility). In DMs,partialuses nativesendMessageDraftwhen available. Per-account configs inherit this value β set it once at the channel level to apply to all bots. To override for a single account, setchannels.telegram.accounts.<id>.streaming. -
channels.telegram.mediaMaxMb: inbound Telegram media download/processing cap (MB). -
channels.telegram.retry: retry policy for Telegram send helpers (CLI/tools/actions) on recoverable outbound API errors (attempts, minDelayMs, maxDelayMs, jitter). -
channels.telegram.timeoutSeconds: Telegram long-poll (getUpdates) window in seconds. Safe range is 30-50; unset applies 30. The botβs HTTP client abort timeout is derived as this value plus 10 seconds. Per-account values underchannels.telegram.accounts.<id>.timeoutSecondstake precedence. -
channels.telegram.network.autoSelectFamily: override Node autoSelectFamily (true=enable, false=disable). Defaults to enabled on Node 22+, with WSL2 defaulting to disabled. -
channels.telegram.network.dnsResultOrder: override DNS result order (ipv4firstorverbatim). Defaults toipv4firston Node 22+. -
channels.telegram.proxy: proxy URL for Bot API calls (SOCKS/HTTP). -
channels.telegram.webhookUrl: enable webhook mode (requireschannels.telegram.webhookSecret). -
channels.telegram.webhookSecret: webhook secret (required when webhookUrl is set). -
channels.telegram.webhookPath: local webhook path (default/telegram-webhook). -
channels.telegram.webhookHost: local webhook bind host (default127.0.0.1). -
channels.telegram.webhookPort: local webhook bind port (default8787). -
channels.telegram.actions.reactions: gate Telegram tool reactions. -
channels.telegram.actions.sendMessage: gate Telegram tool message sends. -
channels.telegram.actions.deleteMessage: gate Telegram tool message deletes. -
channels.telegram.actions.editMessage: gate Telegram tool message edits (default: true). -
channels.telegram.actions.sticker: gate Telegram sticker actions β send and search (default: false). -
channels.telegram.actions.createForumTopic: gate Telegram forum topic creation (default: true). -
channels.telegram.reactionNotifications:off | own | allβ control which reactions trigger system events (default:ownwhen not set). -
channels.telegram.reactionLevel:off | ack | minimal | extensiveβ control agentβs reaction capability (default:minimalwhen not set). -
channels.telegram.configWrites: allow channel-initiated config writes from Telegram events/commands (default: true). -
channels.telegram.ackReaction: per-channel ack reaction emoji override (unicode emoji, e.g. βπβ). Use""to disable. -
channels.telegram.responsePrefix: per-channel outbound response prefix override. Use"auto"to derive[{identity.name}]from the routed agent. -
channels.telegram.heartbeat: per-channel heartbeat visibility settings. -
channels.telegram.markdown: markdown formatting overrides (tables). -
channels.telegram.defaultAccount: default account id when multiple accounts are configured. -
channels.telegram.groups.<id>.tools: per-group tool policy overrides. -
channels.telegram.groups.<id>.toolsBySender: per-group tool policy by sender. - Configuration reference - Telegram
- startup/auth:
enabled,botToken,tokenFile,accounts.* - access control:
dmPolicy,allowFrom,groupPolicy,groupAllowFrom,groups,groups.*.topics.*,direct - delivery target:
defaultTo - command/menu:
commands.native,commands.nativeSkills,customCommands - threading/replies:
replyToMode - streaming:
streaming(preview),blockStreaming - formatting/delivery:
textChunkLimit,chunkMode,linkPreview,responsePrefix - media/network:
mediaMaxMb,timeoutSeconds,retry,network.autoSelectFamily,proxy - webhook:
webhookUrl,webhookSecret,webhookPath,webhookHost - actions/capabilities:
capabilities.inlineButtons,actions.sendMessage|editMessage|deleteMessage|reactions|sticker - reactions:
reactionNotifications,reactionLevel - writes/history:
configWrites,historyLimit,dmHistoryLimit,dms.*.historyLimit