Telegram 里 @ 一下机器人,所有命令和技能都能搜到:内联选择器绕过 60 个菜单上限

你是不是也有过这种时刻:在 Telegram 里把 Hermes 当主力助手,技能装了一个又一个,结果某天想在群里调某个技能时,打 / 翻半天菜单找不到——不是它不存在,而是菜单装不下了。Telegram 对每个机器人的 / 命令菜单有硬性上限(每个作用域最多 100 条、负载约 4KB,Hermes 默认只占 60 个槽位),技能一多,后面的技能命令根本挤不进去。8 月 30 日合入的新功能把这个上限直接绕开了:在任何聊天里输入 @你的机器人名 + 关键词,就会弹出一个实时搜索的选择器,覆盖全部命令和已安装技能,点一下就把命令发进聊天。这个改动来自 PR #98317,目前在 main 分支上,尚未进入正式发布版本。
为什么 / 菜单会“装不下”
Telegram 的命令菜单(BotCommand menu)有平台级硬限制:每个作用域最多 100 条命令、整个负载约 4KB。Hermes 的默认策略是只注册 60 个槽位,把最常用的命令放进去。问题在于:技能(skills)也是通过斜杠命令调用的,每装一个技能就多一条命令,几十个技能装下来,大部分技能命令永远无法出现在 / 菜单里——不是 Hermes 藏私,是 Telegram 的盒子就这么大。
内联选择器怎么用
不用任何配置(除了下面的一次性开启),在任何 Telegram 聊天里直接输入:
@你的机器人名 关键词
比如你的机器人叫 myagent,想找计划相关的命令:
@myagent plan
机器人会实时弹出一个可搜索的选择器,列出所有匹配的命令和技能——逐字计算、50 条一页翻页,全量目录永远完整,没有任何内容被裁剪。官方测试里,一个装了 72 个技能的会话能搜出 138 个条目(对比 / 菜单只有 60 个槽位),排在最后的冷门技能也能搜到。
点一下结果,命令文本(比如 /plan migrate auth)就会以你的身份发进聊天。因为命令前缀的消息即使在默认隐私模式下也能送达机器人,所以分发走的还是现有命令通道——官方没有为此写一行新的分发代码。
一次性开启:BotFather 的 /setinline
内联模式默认对每个 Telegram 机器人都是关闭的,需要开启一次:
- 找到 @BotFather;
- 发送
/setinline,选中你的机器人; - 设置占位文本(比如
Search commands and skills...)。
开启前 Telegram 根本不会投递内联查询,选择器保持静默——所以官方选择无条件注册处理器,不开启也无副作用。
安全边界:陌生人看到的是空列表
内联查询可以来自任何聊天,包括机器人不在的聊天,所以认证是硬边界:只有通过了网关 allowlist/配对/多 profile 路由校验的用户才能拿到结果,未授权用户得到的是空列表——已安装技能目录不会泄露给陌生人。另外查询结果标记为 is_personal=True,Telegram 不会跨用户缓存翻页内容。
它是菜单上限三部曲的最后一环
这已经是官方处理“菜单装不下”的第三个动作:先是 PR #98272 把 /plan 变成内置命令顶住 Discord 的菜单上限,再是 PR #98280 让置顶技能命令优先占槽,最后是这次的内联选择器——彻底绕开菜单,而不是在菜单里挤。想了解 Hermes 在聊天平台上的更多玩法,可以看看我们之前的 Bot Mode 群聊指南。
什么时候能用上
PR #98317 已于 8 月 30 日合入 main,不在 v0.20.6 里(v0.20.6 是 8 月 27 日打的 tag)。想现在就体验,可以拉最新 main 分支;等不及的话,下一个发布版本就会带上它。安装和升级方式见安装指南。Telegram 用户如果同时用着多个 profile 的路由,也可以参考多 profile 路由配置的思路。
总结一下:Telegram 的菜单盒子只有那么大,但你的技能库不必跟着缩水。@机器人名 + 关键词 的实时搜索选择器,让每个命令和技能都变得可发现——装 100 个技能也不怕找不到。