Skip to content

Telegram (Bot API)

状态:通过 grammY 实现生产就绪的机器人私聊 + 群组功能。默认使用长轮询;可选 webhook 模式。

快速设置(新手)

  1. 使用 @BotFather 创建一个机器人并复制令牌。
  2. 设置令牌:
    • 环境变量:TELEGRAM_BOT_TOKEN=...
    • 或配置:channels.telegram.botToken: "..."
    • 如果两者都设置,配置优先(环境变量回退仅适用于默认账户)。
  3. 启动网关。
  4. 私聊访问默认需要配对;首次联系时批准配对码。

最小配置:

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

这是什么

  • 由网关拥有的 Telegram Bot API 通道。
  • 确定性路由:回复返回 Telegram;模型从不选择通道。
  • 私聊共享代理的主会话;群组保持隔离(agent:<agentId>:telegram:group:<chatId>)。

设置(快速路径)

1) 创建机器人令牌(BotFather)

  1. 打开 Telegram 并与 @BotFather 聊天。
  2. 运行 /newbot,然后按照提示操作(名称 + 以 bot 结尾的用户名)。
  3. 复制令牌并安全存储。

可选的 BotFather 设置:

  • /setjoingroups — 允许/拒绝将机器人添加到群组。
  • /setprivacy — 控制机器人是否看到所有群组消息。

2) 配置令牌(环境变量或配置)

示例:

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

环境变量选项:TELEGRAM_BOT_TOKEN=...(适用于默认账户)。 如果同时设置了环境变量和配置,配置优先。

多账户支持:使用 channels.telegram.accounts 配置每个账户的令牌和可选的 name。参见 gateway/configuration 了解共享模式。

  1. 启动网关。当令牌解析时 Telegram 启动(配置优先,环境变量回退)。
  2. 私聊访问默认需要配对。机器人首次被联系时批准配对码。
  3. 对于群组:添加机器人,决定隐私/管理员行为(见下文),然后设置 channels.telegram.groups 来控制提及门控 + 允许列表。

令牌 + 隐私 + 权限(Telegram 端)

令牌创建(BotFather)

  • /newbot 创建机器人并返回令牌(保持机密)。
  • 如果令牌泄露,通过 @BotFather 撤销/重新生成并更新配置。

群组消息可见性(隐私模式)

Telegram 机器人默认启用隐私模式,这会限制它们接收哪些群组消息。 如果你的机器人必须看到所有群组消息,你有两个选项:

  • 使用 /setprivacy 禁用隐私模式
  • 将机器人添加为群组管理员(管理员机器人接收所有消息)。

注意: 当你切换隐私模式时,Telegram 要求移除 + 重新添加机器人到每个群组才能使更改生效。

群组权限(管理员权限)

管理员状态在群组内设置(Telegram UI)。管理员机器人始终接收所有群组消息,因此如果需要完全可见性,请使用管理员。

工作原理(行为)

  • 入站消息被规范化为共享通道信封,包含回复上下文和媒体占位符。
  • 群组回复默认需要提及(原生 @提及 或 agents.list[].groupChat.mentionPatterns / messages.groupChat.mentionPatterns)。
  • 多代理覆盖:在 agents.list[].groupChat.mentionPatterns 上设置每个代理的模式。
  • 回复始终路由回相同的 Telegram 聊天。
  • 长轮询使用 grammY runner 进行每个聊天的序列化;整体并发性受 agents.defaults.maxConcurrent 限制。
  • Telegram Bot API 不支持已读回执;没有 sendReadReceipts 选项。

格式化(Telegram HTML)

  • 出站 Telegram 文本使用 parse_mode: "HTML"(Telegram 支持的标签子集)。
  • Markdown 风格的输入被渲染为Telegram 安全的 HTML(粗体/斜体/删除线/代码/链接);块元素被扁平化为带换行符/项目符号的文本。
  • 来自模型的原始 HTML 被转义以避免 Telegram 解析错误。
  • 如果 Telegram 拒绝 HTML 负载,openclaw 将相同的消息重试为纯文本。

命令(原生 + 自定义)

openclaw 在启动时向 Telegram 的机器人菜单注册原生命令(如 /status/reset/model)。 你可以通过配置添加自定义命令到菜单:

json5
{
  channels: {
    telegram: {
      customCommands: [
        { command: "backup", description: "Git 备份" },
        { command: "generate", description: "创建图片" }
      ]
    }
  }
}

故障排除

  • 日志中的 setMyCommands failed 通常意味着出站 HTTPS/DNS 被阻止访问 api.telegram.org
  • 如果看到 sendMessagesendChatAction 失败,请检查 IPv6 路由和 DNS。

更多帮助:通道故障排除

注意事项:

  • 自定义命令仅菜单条目;除非你在其他地方处理,否则 openclaw 不实现它们。
  • 命令名称被规范化(去除前导 /,小写),必须匹配 a-z0-9_(1-32 个字符)。
  • 自定义命令不能覆盖原生命令。冲突被忽略并记录。
  • 如果 commands.native 被禁用,只注册自定义命令(如果没有则清除)。

限制

  • 出站文本被分块到 channels.telegram.textChunkLimit(默认 4000)。
  • 可选换行分块:设置 channels.telegram.chunkMode="newline" 在长度分块前按空行(段落边界)分割。
  • 媒体下载/上传受 channels.telegram.mediaMaxMb 限制(默认 5)。
  • Telegram Bot API 请求在 channels.telegram.timeoutSeconds 后超时(默认 500 通过 grammY)。设置更低以避免长时间挂起。
  • 群组历史上下文使用 channels.telegram.historyLimit(或 channels.telegram.accounts.*.historyLimit),回退到 messages.groupChat.historyLimit。设置 0 禁用(默认 50)。
  • 私聊历史可以通过 channels.telegram.dmHistoryLimit 限制(用户轮次)。每个用户覆盖:channels.telegram.dms["<user_id>"].historyLimit

群组激活模式

默认情况下,机器人只在群组中被提及时响应(@botnameagents.list[].groupChat.mentionPatterns 中的模式)。要改变此行为:

通过配置(推荐)

json5
{
  channels: {
    telegram: {
      groups: {
        "-1001234567890": { requireMention: false }  // 始终在此群组中响应
      }
    }
  }
}

重要: 设置 channels.telegram.groups 创建允许列表 - 只有列出的群组(或 "*")会被接受。 论坛主题继承其父群组配置(allowFrom、requireMention、skills、prompts),除非你在 channels.telegram.groups.<groupId>.topics.<topicId> 下添加每个主题的覆盖。

要允许所有群组并始终响应:

json5
{
  channels: {
    telegram: {
      groups: {
        "*": { requireMention: false }  // 所有群组,始终响应
      }
    }
  }
}

要保持所有群组仅提及响应(默认行为):

json5
{
  channels: {
    telegram: {
      groups: {
        "*": { requireMention: true }  // 或完全省略 groups
      }
    }
  }
}

通过命令(会话级别)

在群组中发送:

  • /activation always - 响应所有消息
  • /activation mention - 需要提及(默认)

注意: 命令仅更新会话状态。要在重启后保持持久行为,请使用配置。

获取群组聊天 ID

将群组中的任何消息转发到 Telegram 上的 @userinfobot@getidsbot 以查看聊天 ID(负数如 -1001234567890)。

提示: 对于你自己的用户 ID,私聊机器人,它会回复你的用户 ID(配对消息),或者一旦命令启用,使用 /whoami

隐私注意: @userinfobot 是第三方机器人。如果你愿意,将机器人添加到群组,发送消息,并使用 openclaw logs --follow 读取 chat.id,或使用 Bot API getUpdates

配置写入

默认情况下,Telegram 允许写入由通道事件或 /config set|unset 触发的配置更新。

这发生在以下情况:

  • 群组升级为超级群组且 Telegram 发出 migrate_to_chat_id(聊天 ID 更改)。openclaw 可以自动迁移 channels.telegram.groups
  • 你在 Telegram 聊天中运行 /config set/config unset(需要 commands.config: true)。

禁用:

json5
{
  channels: { telegram: { configWrites: false } }
}

主题(论坛超级群组)

Telegram 论坛主题为每条消息包含一个 message_thread_id。openclaw:

  • :topic:<threadId> 附加到 Telegram 群组会话键,使每个主题隔离。
  • 发送打字指示器和带有 message_thread_id 的回复,使响应保持在主题内。
  • 常规主题(线程 ID 1)特殊:消息发送省略 message_thread_id(Telegram 拒绝它),但打字指示器仍包含它。
  • 在模板上下文中暴露 MessageThreadId + IsForum 用于路由/模板化。
  • 特定主题配置可在 channels.telegram.groups.<chatId>.topics.<threadId> 下使用(skills、allowlists、auto-reply、system prompts、disable)。
  • 主题配置继承群组设置(requireMention、allowlists、skills、prompts、enabled),除非每个主题覆盖。

私聊在某些边缘情况下可能包含 message_thread_id。openclaw 保持私聊会话键不变,但当存在时仍使用线程 ID 进行回复/草稿流式传输。

内联按钮

Telegram 支持带有回调按钮的内联键盘。

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

对于每个账户配置:

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

范围:

  • off — 内联按钮禁用
  • dm — 仅私聊(群组目标阻止)
  • group — 仅群组(私聊目标阻止)
  • all — 私聊 + 群组
  • allowlist — 私聊 + 群组,但仅允许 allowFrom/groupAllowFrom 中的发送者(与控制命令相同规则)

默认:allowlist。 旧版:capabilities: ["inlineButtons"] = inlineButtons: "all"

发送按钮

使用带有 buttons 参数的消息工具:

json5
{
  "action": "send",
  "channel": "telegram",
  "to": "123456789",
  "message": "选择一个选项:",
  "buttons": [
    [
      {"text": "是", "callback_data": "yes"},
      {"text": "否", "callback_data": "no"}
    ],
    [
      {"text": "取消", "callback_data": "cancel"}
    ]
  ]
}

当用户点击按钮时,回调数据作为消息发送回代理,格式为: callback_data: value

配置选项

Telegram 功能可以在两个级别配置(上面显示的对象形式;旧版字符串数组仍支持):

  • channels.telegram.capabilities:应用于所有 Telegram 账户的全局默认功能配置,除非被覆盖。
  • channels.telegram.accounts.<account>.capabilities:每个账户的功能,覆盖该特定账户的全局默认值。

当所有 Telegram 机器人/账户应表现相同时使用全局设置。当不同机器人需要不同行为时使用每个账户配置(例如,一个账户仅处理私聊,而另一个允许在群组中)。

访问控制(私聊 + 群组)

私聊访问

  • 默认:channels.telegram.dmPolicy = "pairing"。未知发送者会收到配对码;消息在被批准前会被忽略(配对码在1小时后过期)。
  • 通过以下方式批准:
    • openclaw pairing list telegram
    • openclaw pairing approve telegram <CODE>
  • 配对是 Telegram 私聊使用的默认令牌交换方式。详情:配对
  • channels.telegram.allowFrom 接受数字用户 ID(推荐)或 @username 条目。这不是机器人用户名;请使用人类发送者的 ID。向导接受 @username 并在可能时解析为数字 ID。

查找你的 Telegram 用户 ID

更安全(无需第三方机器人):

  1. 启动网关并向你的机器人发送私聊。
  2. 运行 openclaw logs --follow 并查找 from.id

替代方法(官方 Bot API):

  1. 向你的机器人发送私聊。
  2. 使用你的机器人令牌获取更新并读取 message.from.id
    bash
    curl "https://api.telegram.org/bot<bot_token>/getUpdates"

第三方(隐私性较差):

  • 私聊 @userinfobot@getidsbot 并使用返回的用户 ID。

群组访问

两个独立的控制:

1. 允许哪些群组(通过 channels.telegram.groups 的群组白名单):

  • groups 配置 = 允许所有群组
  • groups 配置 = 仅允许列出的群组或 "*"
  • 示例:"groups": { "-1001234567890": {}, "*": {} } 允许所有群组

2. 允许哪些发送者(通过 channels.telegram.groupPolicy 的发送者过滤):

  • "open" = 允许群组中的所有发送者发送消息
  • "allowlist" = 仅允许 channels.telegram.groupAllowFrom 中的发送者发送消息
  • "disabled" = 完全不接受群组消息 默认是 groupPolicy: "allowlist"(除非你添加 groupAllowFrom,否则会被阻止)。

大多数用户需要:groupPolicy: "allowlist" + groupAllowFrom + channels.telegram.groups 中列出的特定群组

长轮询 vs Webhook

  • 默认:长轮询(无需公共 URL)。
  • Webhook 模式:设置 channels.telegram.webhookUrl(可选 channels.telegram.webhookSecret + channels.telegram.webhookPath)。
    • 本地监听器默认绑定到 0.0.0.0:8787 并提供 POST /telegram-webhook
    • 如果你的公共 URL 不同,请使用反向代理并将 channels.telegram.webhookUrl 指向公共端点。

回复线程

Telegram 通过标签支持可选的线程回复:

  • [[reply_to_current]] -- 回复触发消息。
  • [[reply_to:<id>]] -- 回复特定消息 ID。

channels.telegram.replyToMode 控制:

  • first(默认),alloff

音频消息(语音 vs 文件)

Telegram 区分语音消息(圆形气泡)和音频文件(元数据卡片)。 openclaw 默认为音频文件以保持向后兼容性。

要在代理回复中强制使用语音消息气泡,请在回复中的任何位置包含此标签:

  • [[audio_as_voice]] — 将音频作为语音消息而不是文件发送。

该标签会从传递的文本中移除。其他通道忽略此标签。

对于消息工具发送,使用与语音兼容的音频 media URL 设置 asVoice: true (当存在媒体时,message 是可选的):

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

贴纸

openclaw 支持接收和发送 Telegram 贴纸,并具有智能缓存功能。

接收贴纸

当用户发送贴纸时,openclaw 根据贴纸类型进行处理:

  • 静态贴纸 (WEBP): 下载并通过视觉处理。贴纸在消息内容中显示为 <media:sticker> 占位符。
  • 动画贴纸 (TGS): 跳过(不支持 Lottie 格式处理)。
  • 视频贴纸 (WEBM): 跳过(不支持视频格式处理)。

接收贴纸时可用的模板上下文字段:

  • Sticker — 包含以下属性的对象:
    • emoji — 与贴纸关联的表情符号
    • setName — 贴纸集的名称
    • fileId — Telegram 文件 ID(用于发送相同的贴纸)
    • fileUniqueId — 用于缓存查找的稳定 ID
    • cachedDescription — 可用的缓存视觉描述

贴纸缓存

贴纸通过 AI 的视觉能力进行处理以生成描述。由于相同的贴纸经常被重复发送,openclaw 会缓存这些描述以避免冗余的 API 调用。

工作原理:

  1. 首次遇到: 贴纸图像被发送给 AI 进行视觉分析。AI 生成描述(例如,"一只卡通猫热情地挥手")。
  2. 缓存存储: 描述与贴纸的文件 ID、表情符号和集合名称一起保存。
  3. 后续遇到: 当再次看到相同的贴纸时,直接使用缓存的描述。图像不会发送给 AI。

缓存位置: ~/.clawdbot/telegram/sticker-cache.json

缓存条目格式:

json
{
  "fileId": "CAACAgIAAxkBAAI...",
  "fileUniqueId": "AgADBAADb6cxG2Y",
  "emoji": "👋",
  "setName": "CoolCats",
  "description": "一只卡通猫热情地挥手",
  "cachedAt": "2026-01-15T10:30:00.000Z"
}

好处:

  • 通过避免对相同贴纸的重复视觉调用来减少 API 成本
  • 对缓存的贴纸响应更快(无视觉处理延迟)
  • 基于缓存描述启用贴纸搜索功能

缓存会在接收贴纸时自动填充。无需手动缓存管理。

发送贴纸

代理可以使用 stickersticker-search 动作发送和搜索贴纸。这些默认是禁用的,必须在配置中启用:

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

发送贴纸:

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

参数:

  • fileId(必需)— 贴纸的 Telegram 文件 ID。从接收贴纸时的 Sticker.fileIdsticker-search 结果中获取。
  • replyTo(可选)— 要回复的消息 ID。
  • threadId(可选)— 论坛主题的消息线程 ID。

搜索贴纸:

代理可以通过描述、表情符号或集合名称搜索缓存的贴纸:

json5
{
  "action": "sticker-search",
  "channel": "telegram",
  "query": "cat waving",
  "limit": 5
}

从缓存中返回匹配的贴纸:

json5
{
  "ok": true,
  "count": 2,
  "stickers": [
    {
      "fileId": "CAACAgIAAxkBAAI...",
      "emoji": "👋",
      "description": "一只卡通猫热情地挥手",
      "setName": "CoolCats"
    }
  ]
}

搜索在描述文本、表情符号字符和集合名称上使用模糊匹配。

带线程的示例:

json5
{
  "action": "sticker",
  "channel": "telegram",
  "to": "-1001234567890",
  "fileId": "CAACAgIAAxkBAAI...",
  "replyTo": 42,
  "threadId": 123
}

流式传输(草稿)

Telegram 可以在代理生成响应时流式传输草稿气泡。 openclaw 使用 Bot API 的 sendMessageDraft(不是真实消息),然后将最终回复作为普通消息发送。

要求(Telegram Bot API 9.3+):

  • 启用主题的私聊(机器人的论坛主题模式)。
  • 传入消息必须包含 message_thread_id(私聊主题线程)。
  • 流式传输对群组/超级群组/频道被忽略。

配置:

  • channels.telegram.streamMode: "off" | "partial" | "block"(默认:partial
    • partial:使用最新的流式文本更新草稿气泡。
    • block:在更大的块中更新草稿气泡(分块)。
    • off:禁用草稿流式传输。
  • 可选(仅适用于 streamMode: "block"):
    • channels.telegram.draftChunk: { minChars?, maxChars?, breakPreference? }
      • 默认值:minChars: 200, maxChars: 800, breakPreference: "paragraph"(受限于 channels.telegram.textChunkLimit)。

注意:草稿流式传输与块流式传输(通道消息)是分开的。 块流式传输默认关闭,如果你想要早期的 Telegram 消息而不是草稿更新,需要 channels.telegram.blockStreaming: true

推理流(仅限 Telegram):

  • /reasoning stream 在回复生成时将推理流式传输到草稿气泡中,然后发送最终答案而不包含推理。
  • 如果 channels.telegram.streamModeoff,则推理流被禁用。 更多上下文:流式传输 + 分块

重试策略

出站 Telegram API 调用在临时网络/429 错误时使用指数退避和抖动进行重试。通过 channels.telegram.retry 配置。参见重试策略

代理工具(消息 + 反应)

  • 工具:telegram 带有 sendMessage 动作(to, content, 可选 mediaUrl, replyToMessageId, messageThreadId)。
  • 工具:telegram 带有 react 动作(chatId, messageId, emoji)。
  • 工具:telegram 带有 deleteMessage 动作(chatId, messageId)。
  • 反应移除语义:参见/tools/reactions
  • 工具门控:channels.telegram.actions.reactions, channels.telegram.actions.sendMessage, channels.telegram.actions.deleteMessage(默认:启用),和 channels.telegram.actions.sticker(默认:禁用)。

反应通知

反应如何工作: Telegram 反应作为单独的 message_reaction 事件到达,而不是作为消息负载中的属性。当用户添加反应时,openclaw:

  1. 从 Telegram API 接收 message_reaction 更新
  2. 将其转换为系统事件,格式为:"Telegram reaction added: {emoji} by {user} on msg {id}"
  3. 使用与常规消息相同的会话键将系统事件加入队列
  4. 当下一条消息到达该对话时,系统事件被排出并前置到代理的上下文中

代理将反应视为对话历史中的系统通知,而不是消息元数据。

配置:

  • channels.telegram.reactionNotifications:控制哪些反应触发通知

    • "off" — 忽略所有反应
    • "own" — 当用户对机器人消息做出反应时通知(尽力而为;内存中)(默认)
    • "all" — 对所有反应通知
  • channels.telegram.reactionLevel:控制代理的反应能力

    • "off" — 代理不能对消息做出反应
    • "ack" — 机器人发送确认反应(👀 处理时)(默认)
    • "minimal" — 代理可以谨慎地做出反应(指导原则:每 5-10 次交流 1 次)
    • "extensive" — 代理可以在适当时自由地做出反应

论坛群组: 论坛群组中的反应包括 message_thread_id 并使用类似 agent:main:telegram:group:{chatId}:topic:{threadId} 的会话键。这确保同一主题中的反应和消息保持在一起。

示例配置:

json5
{
  channels: {
    telegram: {
      reactionNotifications: "all",  // 查看所有反应
      reactionLevel: "minimal"        // 代理可以谨慎地做出反应
    }
  }
}

要求:

  • Telegram 机器人必须在 allowed_updates 中明确请求 message_reaction(由 openclaw 自动配置)
  • 对于 webhook 模式,反应包含在 webhook 的 allowed_updates
  • 对于轮询模式,反应包含在 getUpdatesallowed_updates

发送目标(CLI/cron)

  • 使用聊天 ID(123456789)或用户名(@name)作为目标。
  • 示例:openclaw message send --channel telegram --target 123456789 --message "hi"

故障排除

机器人在群组中不响应非提及消息:

  • 如果你设置了 channels.telegram.groups.*.requireMention=false,必须禁用 Telegram 的 Bot API 隐私模式
    • BotFather: /setprivacy禁用(然后移除并重新添加机器人到群组)
  • 当配置期望非提及的群组消息时,openclaw channels status 会显示警告。
  • openclaw channels status --probe 可以额外检查显式数字群组 ID 的成员资格(它无法审计通配符 "*" 规则)。
  • 快速测试:/activation always(仅会话级别;使用配置实现持久化)

机器人完全看不到群组消息:

  • 如果设置了 channels.telegram.groups,群组必须被列出或使用 "*"
  • 检查 @BotFather 中的隐私设置 → "群组隐私" 应为 关闭
  • 验证机器人确实是成员(不仅仅是无读取权限的管理员)
  • 检查网关日志:openclaw logs --follow(查找 "skipping group message")

机器人响应提及但不响应 /activation always

  • /activation 命令更新会话状态但不持久化到配置
  • 要实现持久化行为,将群组添加到 channels.telegram.groups 并设置 requireMention: false

/status 这样的命令不工作:

  • 确保你的 Telegram 用户 ID 已授权(通过配对或 channels.telegram.allowFrom
  • 即使在 groupPolicy: "open" 的群组中,命令也需要授权

在 Node 22+ 上长轮询立即中止(通常与代理/自定义 fetch 有关):

  • Node 22+ 对 AbortSignal 实例更严格;外部信号可能立即中止 fetch 调用。
  • 升级到标准化中止信号的 openclaw 版本,或者在可以升级前在 Node 20 上运行网关。

机器人启动后静默停止响应(或记录 HttpError: Network request ... failed):

  • 某些主机首先将 api.telegram.org 解析为 IPv6。如果你的服务器没有可用的 IPv6 出口,grammY 可能会卡在仅 IPv6 的请求上。
  • 通过启用 IPv6 出口 强制 api.telegram.org 使用 IPv4 解析来修复(例如,使用 IPv4 A 记录添加 /etc/hosts 条目,或在操作系统 DNS 堆栈中优先使用 IPv4),然后重启网关。
  • 快速检查:dig +short api.telegram.org Adig +short api.telegram.org AAAA 以确认 DNS 返回的内容。

配置参考(Telegram)

完整配置:配置

提供者选项:

  • channels.telegram.enabled:启用/禁用通道启动。
  • channels.telegram.botToken:机器人令牌(BotFather)。
  • channels.telegram.tokenFile:从文件路径读取令牌。
  • channels.telegram.dmPolicypairing | allowlist | open | disabled(默认:pairing)。
  • channels.telegram.allowFrom:私聊白名单(ID/用户名)。open 需要 "*"
  • channels.telegram.groupPolicyopen | allowlist | disabled(默认:allowlist)。
  • channels.telegram.groupAllowFrom:群组发送者白名单(ID/用户名)。
  • channels.telegram.groups:每个群组的默认值 + 白名单(使用 "*" 作为全局默认值)。
    • channels.telegram.groups.<id>.requireMention:提及门控默认值。
    • channels.telegram.groups.<id>.skills:技能过滤器(省略 = 所有技能,空 = 无)。
    • channels.telegram.groups.<id>.allowFrom:每个群组的发送者白名单覆盖。
    • channels.telegram.groups.<id>.systemPrompt:群组的额外系统提示。
    • channels.telegram.groups.<id>.enabled:当 false 时禁用群组。
    • channels.telegram.groups.<id>.topics.<threadId>.*:每个主题的覆盖(与群组相同的字段)。
    • channels.telegram.groups.<id>.topics.<threadId>.requireMention:每个主题的提及门控覆盖。
  • channels.telegram.capabilities.inlineButtonsoff | dm | group | all | allowlist(默认:allowlist)。
  • channels.telegram.accounts.<account>.capabilities.inlineButtons:每个账户的覆盖。
  • channels.telegram.replyToModeoff | first | all(默认:first)。
  • channels.telegram.textChunkLimit:出站分块大小(字符)。
  • channels.telegram.chunkModelength(默认)或 newline 在长度分块前按空行(段落边界)分割。
  • channels.telegram.linkPreview:切换出站消息的链接预览(默认:true)。
  • channels.telegram.streamModeoff | partial | block(草稿流式传输)。
  • channels.telegram.mediaMaxMb:入站/出站媒体上限(MB)。
  • channels.telegram.retry:出站 Telegram API 调用的重试策略(尝试次数、最小延迟毫秒、最大延迟毫秒、抖动)。
  • channels.telegram.network.autoSelectFamily:覆盖 Node autoSelectFamily(true=启用,false=禁用)。在 Node 22 上默认为禁用以避免 Happy Eyeballs 超时。
  • channels.telegram.proxy:Bot API 调用的代理 URL(SOCKS/HTTP)。
  • channels.telegram.webhookUrl:启用 webhook 模式。
  • channels.telegram.webhookSecret:webhook 密钥(可选)。
  • channels.telegram.webhookPath:本地 webhook 路径(默认 /telegram-webhook)。
  • channels.telegram.actions.reactions:门控 Telegram 工具反应。
  • channels.telegram.actions.sendMessage:门控 Telegram 工具消息发送。
  • channels.telegram.actions.deleteMessage:门控 Telegram 工具消息删除。
  • channels.telegram.actions.sticker:门控 Telegram 贴纸动作 — 发送和搜索(默认:false)。
  • channels.telegram.reactionNotificationsoff | own | all — 控制哪些反应触发系统事件(未设置时默认:own)。
  • channels.telegram.reactionLeveloff | ack | minimal | extensive — 控制代理的反应能力(未设置时默认:minimal)。

相关全局选项:

  • agents.list[].groupChat.mentionPatterns(提及门控模式)。
  • messages.groupChat.mentionPatterns(全局回退)。
  • commands.native(默认为 "auto" → Telegram/Discord 启用,Slack 禁用),commands.textcommands.useAccessGroups(命令行为)。使用 channels.telegram.commands.native 覆盖。
  • messages.responsePrefixmessages.ackReactionmessages.ackReactionScopemessages.removeAckAfterReply