Rich-форматы
Интеграция
С SDK достаточно трёх действий: укажите форматы в inject(). Для эфемерных сообщений в группах используйте инструкцию по отправке через HTTP.
bot.ts
// Use in place of the ordinary handler; bot and sk are initialized.bot.use(sk.callbacks({onError: () => console.error("Ad interaction failed"),}));bot.on("message:text", async (ctx) => {if (ctx.chat.type !== "private") return;const reply = await getLlmResponse(ctx.message.text); // Return plain text.const result = await sk.inject({userId: ctx.from.id,message: reply,languageCode: ctx.from.language_code || "en",acceptFormats: ["text", "response", "card", "consent", "quiz"],capabilities: {richMessages: true,callbacks: true,customEmoji: false,},});if (result.send) {await ctx.reply(reply);// If rich delivery fails, send only the ad as text.const adOnly = {...result,message: "Ad\n" + (result.ad?.text ?? ""),};const raw = ctx.api.raw as unknown as Record<string, (params: Record<string, unknown>) => Promise<unknown>>;const delivered = await sk.send((method, params) => raw[method](params),ctx.chat.id,adOnly,);if (delivered === null) {console.error("Ad delivery failed");}} else {await ctx.reply(result.message, {reply_markup: result.keyboard ?? undefined,});}});
Требования к клиентам
- •Rich-блоки отображаются в клиентах Telegram, выпущенных 25.08.2026 или позже. В старых клиентах часть блоков может не отображаться, но текст и обычная кнопка
reply_markup(сервер всегда дублирует её) остаются видны. - •Логотипы брендов в виде пользовательских эмодзи отображаются, только если у владельца бота есть Telegram Premium. Указывайте
capabilities.custom_emojiс учётом этого. Иначе вместо логотипа будет название бренда жирным шрифтом. - •Группы: интерактивные сцены после нажатия видны только нажавшему пользователю. Первая сцена отправляется так же, только если бот — администратор чата (
bot_is_admin: true); иначе отправляется обычное сообщение. Telegram разрешает отправку ephemeral-сообщений без предварительного действия пользователя только ботам-администраторам.